Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/missionmatch / internal/modules/staffing/proactive.go |
| Date | Not specified in source |
| Repository | Janady13/missionmatch |
| Revision | 1e9249840a4302ec82e123b9c9cb6f75badea3e4 |
| Branch | master |
| Path or archive member | internal/modules/staffing/proactive.go |
| Original SHA-256 | 450fa754edff880bb27ef19471daa41b5d650126ac7375dbb990f03c70f00d7b |
| Git blob SHA | 42c4e3207ccc8bc7fd9fb7745a8be9e3b718fbb5 |
| Reading-copy SHA-256 | 450fa754edff880bb27ef19471daa41b5d650126ac7375dbb990f03c70f00d7b |
Every recorded occurrence
These 43 records contain identical original source bytes. Their paths and revisions remain part of the archive.
| Original record | Branch or archive | Revision / identifier | Original location |
|---|---|---|---|
| Janady13/missionmatch / internal/modules/staffing/proactive.go | master | 1e9249840a4302ec82e123b9c9cb6f75badea3e4 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | m5-price-to-win | 41000ad30fff4129fdaf5ec84e15ba14c27d4890 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | w3-ai-staffing-recommendations | 43d56387270ef4da4cabd794d97ca6a49909bc7d | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws3-clearance | 4b8e7ce594c068621867f9c9deed0ec64ae6c553 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | collision-deconfliction | 4ee5a09972608ed89f8377c6665542d5f450f0a6 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws7-federal-signal | 6a9f6ce9cfb13345ffb47770d4960e7c2d9c17c2 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws6-retrieval | 6c56e29231ec05735927fa265c97d517499dfeaf | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | per-tenant-routing | 9bde0f9a74b89d01980fa658e5253acda7528d0c | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ai-brain-live | aac32fc49c878cc5bca099459307611562d0bac1 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | graphrag-foundation | b0ddeb9f633fd138d09309d1a17b7d13bc3a67f7 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws1-ontology-sync | b596f449a32a1016fbd403c36505cc00a1ac9ee6 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | time-to-fill-survival | b66e1e505863d4f17741a4b9ede73509e45bd6c6 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | mag-substrate | b82c7100a492dec67dfd1eda6b3f53def859be35 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | capture-readiness | bae6af7cb2997e819174a9e9cfff5e16067a1975 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | deploy-and-ops | bdacd9d0b4d5998d25fc74bf4007f4c3ec538c7a | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws8-teaching-loop | c823f0fb6bb2aba0f39001eb6de96f4000d9321f | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | phase2-eval-fairness | d361af254701975fe239927656ababb56374655e | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | phase2-connectors | e038d4c687aec16f8bd9bc4d907eea14d91f8704 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws2-alias-relationship | e4dada4601c6eb101830f9d223a9655dfa120616 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | presentation-readiness | eb574acaa29d71ce4d0f852572e87c275c79fdb7 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws9-bench-ingestion | f585a9ef32fa554663ce1fba9a414a54b6e49cf0 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | vendor-intelligence | fe9796a19c261951d3f2565206c0c1b5ac294465 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | per-tenant-routing | 9bde0f9a74b89d01980fa658e5253acda7528d0c | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | collision-deconfliction | 4ee5a09972608ed89f8377c6665542d5f450f0a6 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws6-retrieval | 6c56e29231ec05735927fa265c97d517499dfeaf | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | m5-price-to-win | 41000ad30fff4129fdaf5ec84e15ba14c27d4890 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws1-ontology-sync | b596f449a32a1016fbd403c36505cc00a1ac9ee6 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | master | 1e9249840a4302ec82e123b9c9cb6f75badea3e4 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws8-teaching-loop | c823f0fb6bb2aba0f39001eb6de96f4000d9321f | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | w3-ai-staffing-recommendations | 43d56387270ef4da4cabd794d97ca6a49909bc7d | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | mag-substrate | b82c7100a492dec67dfd1eda6b3f53def859be35 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws3-clearance | 4b8e7ce594c068621867f9c9deed0ec64ae6c553 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | phase2-eval-fairness | d361af254701975fe239927656ababb56374655e | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | time-to-fill-survival | b66e1e505863d4f17741a4b9ede73509e45bd6c6 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | graphrag-foundation | b0ddeb9f633fd138d09309d1a17b7d13bc3a67f7 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | deploy-and-ops | bdacd9d0b4d5998d25fc74bf4007f4c3ec538c7a | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws9-bench-ingestion | f585a9ef32fa554663ce1fba9a414a54b6e49cf0 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws2-alias-relationship | e4dada4601c6eb101830f9d223a9655dfa120616 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | presentation-readiness | eb574acaa29d71ce4d0f852572e87c275c79fdb7 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ws7-federal-signal | 6a9f6ce9cfb13345ffb47770d4960e7c2d9c17c2 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | ai-brain-live | aac32fc49c878cc5bca099459307611562d0bac1 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | phase2-connectors | e038d4c687aec16f8bd9bc4d907eea14d91f8704 | Open original |
| Janady13/missionmatch / internal/modules/staffing/proactive.go | capture-readiness | bae6af7cb2997e819174a9e9cfff5e16067a1975 | Open original |
Recovered source transcript
Download complete source text ↓172 lines · 5.4 KB
package staffing
import (
"context"
"sort"
"strings"
"time"
"github.com/google/uuid"
"github.com/jackc/pgx/v5"
"github.com/missionworkforce/missionmatch/internal/modules/matching"
"github.com/missionworkforce/missionmatch/internal/modules/matching/engine"
"github.com/missionworkforce/missionmatch/internal/platform/database/dbgen"
)
// RecomputeProactive refreshes the proactive bench watch. For each available candidate it scores the open
// requirements, keeps the best fits at or above the staffing floor, and writes a fresh proactive run for
// that candidate, superseding their prior pending proactive rows. It is the scheduled job behind the host
// timer (the same pattern as mm-opp-sync), idempotent, and it writes deterministic rationales (no model
// call in the batch, so the job is fast and never floods the inference plane). It returns the number of
// candidates that produced at least one fit.
//
// The freshness of the watch depends on the ingestion timers: a newly posted opportunity only unlocks a
// fit once the opportunity and requirement rows exist. The build report notes this dependency.
func (s *Service) RecomputeProactive(ctx context.Context) (int, error) {
if s.db == nil {
return 0, ErrNoDatabase
}
orgID, err := s.orgID(ctx)
if err != nil {
return 0, err
}
cfg := s.cfg
asOf := s.clock()
type job struct {
candID uuid.UUID
recs []Recommendation
resByPair map[string]engine.MatchResult
}
var jobs []job
var valueSource string
err = s.db.RunInTenantTx(ctx, func(ctx context.Context, tx pgx.Tx) error {
q := dbgen.New(tx)
openRows, e := q.ListOpenRequirementsWithValue(ctx, dbgen.ListOpenRequirementsWithValueParams{Limit: openRequirementCap, Offset: 0})
if e != nil {
return e
}
_, valueSource = buildPriorities(cfg, openRows) // proactive does not weight by dollars, but record the source
type reqE struct {
id string
er engine.Requirement
}
reqs := make([]reqE, 0, len(openRows))
for _, rr := range openRows {
er, e := matching.LoadEngineRequirement(ctx, q, rr.ID)
if e != nil {
return e
}
reqs = append(reqs, reqE{id: rr.ID.String(), er: er})
}
cands, e := q.ListCandidates(ctx, dbgen.ListCandidatesParams{Limit: benchScanLimit, Offset: 0})
if e != nil {
return e
}
for _, c := range cands {
if !c.Available {
continue // the bench watch is for candidates available to staff
}
ec, e := matching.LoadEngineCandidate(ctx, q, c, asOf)
if e != nil {
return e
}
if !ec.Available {
continue
}
type fit struct {
reqID string
res engine.MatchResult
}
var fits []fit
for _, r := range reqs {
res := engine.ScoreCandidate(ctx, ec, r.er, s.matcher)
if res.Total.GreaterThanOrEqual(cfg.StaffingFloor) {
fits = append(fits, fit{reqID: r.id, res: res})
}
}
if len(fits) == 0 {
continue
}
sort.SliceStable(fits, func(i, j int) bool {
if d := fits[i].res.Total.Cmp(fits[j].res.Total); d != 0 {
return d > 0
}
return fits[i].reqID < fits[j].reqID
})
if len(fits) > cfg.ProactiveBestFitLimit {
fits = fits[:cfg.ProactiveBestFitLimit]
}
cid := c.ID.String()
prov := c.ClearanceProvenance
comp := completeness(ec)
recs := make([]Recommendation, 0, len(fits))
rbp := make(map[string]engine.MatchResult, len(fits))
for i, f := range fits {
conf := Confidence(cfg, ScoredCandidate{Total: f.res.Total, Provenance: prov, Completeness: comp})
recs = append(recs, Recommendation{
RequirementID: f.reqID,
CandidateID: cid,
Action: ActionAssign,
Rank: i + 1,
Confidence: conf,
Evidence: Evidence{
EngineTotal: f.res.Total.StringFixed(2),
Band: f.res.Band.Code(),
Trigger: &TriggerChange{Kind: "recompute", DetectedAt: asOf.Format(time.RFC3339)},
},
})
rbp[pairKey(cid, f.reqID)] = f.res
}
jobs = append(jobs, job{candID: c.ID, recs: recs, resByPair: rbp})
}
return nil
})
if err != nil {
return 0, err
}
processed := 0
for _, j := range jobs {
enriched := enrichDeterministic(j.recs)
scope := j.candID
candLock := j.candID
e := s.db.RunInTenantTx(ctx, func(ctx context.Context, tx pgx.Tx) error {
// Serialize the proactive recompute for THIS candidate so overlapping cron invocations cannot
// leave two live pending sets for one candidate.
if le := acquireAdvisoryLock(ctx, tx, advisoryKey(ViewProactive, orgID, candLock.String())); le != nil {
return le
}
_, _, perr := s.persistRun(ctx, tx, orgID, ViewProactive, &scope, runParams(cfg, valueSource), "staffing.proactive", enriched, j.resByPair,
func(ctx context.Context, q *dbgen.Queries) error {
cp := candLock
return q.SupersedePendingProactive(ctx, &cp)
})
return perr
})
if e != nil {
return processed, e
}
processed++
}
return processed, nil
}
// enrichDeterministic narrates each recommendation with the deterministic template only, no model call.
func enrichDeterministic(recs []Recommendation) []enrichedRec {
out := make([]enrichedRec, 0, len(recs))
for _, r := range recs {
rationale := strings.Join(evidenceStatements(r.Action, r.Evidence), " ")
if rationale == "" {
rationale = "Recommended by the deterministic engine."
}
r.Evidence.FaithFallbackReason = "proactive_batch"
out = append(out, enrichedRec{rec: r, rationale: rationale, source: RationaleDeterministic})
}
return out
}