Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go |
| Date | Not specified in source |
| Repository | Janady13/missionmatch |
| Revision | 720d47fae476b0d38477ae4401697d372b1ea2bc |
| Branch | feature/opportunity-to-outcome |
| Path or archive member | internal/modules/commandcenter/service_assignment.go |
| Original SHA-256 | c40caeba4176c77b7f0e2238a8874e81f29d70238991f603823a4de6eb654eb2 |
| Git blob SHA | 0caec426198976bb9ef31df9adaaee9c15d580d1 |
| Reading-copy SHA-256 | c40caeba4176c77b7f0e2238a8874e81f29d70238991f603823a4de6eb654eb2 |
Every recorded occurrence
These 35 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/commandcenter/service_assignment.go | feature/opportunity-to-outcome | 720d47fae476b0d38477ae4401697d372b1ea2bc | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | per-tenant-routing | 9bde0f9a74b89d01980fa658e5253acda7528d0c | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | collision-deconfliction | 4ee5a09972608ed89f8377c6665542d5f450f0a6 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | ws6-retrieval | 6c56e29231ec05735927fa265c97d517499dfeaf | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | workstream-a-shared-core | e0de03ac3a1ec826bd15d0e048e3b02baa23eeff | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | m5-price-to-win | 41000ad30fff4129fdaf5ec84e15ba14c27d4890 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | workstream-c-slatematch | 5cd60c918301b46ecd6ed3e03e20c395da0062e2 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | ws1-ontology-sync | b596f449a32a1016fbd403c36505cc00a1ac9ee6 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | master | 1e9249840a4302ec82e123b9c9cb6f75badea3e4 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | ws8-teaching-loop | c823f0fb6bb2aba0f39001eb6de96f4000d9321f | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | w3-ai-staffing-recommendations | 43d56387270ef4da4cabd794d97ca6a49909bc7d | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | mag-substrate | b82c7100a492dec67dfd1eda6b3f53def859be35 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | ws3-clearance | 4b8e7ce594c068621867f9c9deed0ec64ae6c553 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | workstream-d-command-center | 255e7d1d420abf5e277d0cd8c9b14f6f72b6acb9 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | phase2-eval-fairness | d361af254701975fe239927656ababb56374655e | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | workstream-e-dataflow-deploy | 433815a042f9741411e60fa553fe72143e9b10db | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | ruthless-debug-sweep | b7d742f8f032984be3817efffa3eb8b13b651c1f | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | time-to-fill-survival | b66e1e505863d4f17741a4b9ede73509e45bd6c6 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | ai-intelligence-layer | 5d5ddff70393a197c5f54a45280bb5dd42b24755 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | graphrag-foundation | b0ddeb9f633fd138d09309d1a17b7d13bc3a67f7 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | workstream-a-opportunity-intelligence | 1675031db74316e100782d063e9eda1a597fe3a1 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | deploy-and-ops | bdacd9d0b4d5998d25fc74bf4007f4c3ec538c7a | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | ws9-bench-ingestion | f585a9ef32fa554663ce1fba9a414a54b6e49cf0 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | ws2-alias-relationship | e4dada4601c6eb101830f9d223a9655dfa120616 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | presentation-readiness | eb574acaa29d71ce4d0f852572e87c275c79fdb7 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | vendor-intelligence | fe9796a19c261951d3f2565206c0c1b5ac294465 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | workstream-b-screenmatch | 09015496d565a172bcaa15cfe9a8e4b072b13df0 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | ws7-federal-signal | 6a9f6ce9cfb13345ffb47770d4960e7c2d9c17c2 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | workstream-e-commercial-stubs | 4437da660539284a400ee380b9b427a300c369ee | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | ai-brain-live | aac32fc49c878cc5bca099459307611562d0bac1 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | workstream-d-missionmatch | 3be46ba89edb737182075a2b320509b42dc916f8 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | phase2-connectors | e038d4c687aec16f8bd9bc4d907eea14d91f8704 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | workstream-b-sam-contract-awards | d5101cceb98e70000cebb31d3e7ac73d747d3a6d | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | feature/aioe-upgrade | 2178e7298d0e5d9af83afa12402fd587f0ba6ed8 | Open original |
| Janady13/missionmatch / internal/modules/commandcenter/service_assignment.go | capture-readiness | bae6af7cb2997e819174a9e9cfff5e16067a1975 | Open original |
Recovered source transcript
Download complete source text ↓451 lines · 14.7 KB
package commandcenter
import (
"context"
"fmt"
"sort"
"time"
"github.com/jackc/pgx/v5"
"github.com/shopspring/decimal"
)
// ReqCoverage is one requirement's staffing coverage from the greedy assignment (the slate coverage
// logic). Unmet positions are Quantity minus Assigned.
type ReqCoverage struct {
Quantity int
Assigned int
Qualified int
LaborCategory string
KeyPersonnel bool
}
// Coverage builds the per-requirement staffing coverage for the caller's org, reusing the exact same
// greedy assignment the Command Center uses (each available candidate consumed at most once). It also
// returns the eligibility edges (requirement id to the set of candidate ids that pass the hard gates:
// clearance, years, and all mandatory skills), so Win Impact gates on the SAME eligibility the
// assignment uses, not a softer band heuristic. The caller supplies an open tenant transaction
// (RLS-scoped). This is the single source of coverage truth shared by the dashboard and the candidate
// intelligence Win Impact.
func Coverage(ctx context.Context, tx pgx.Tx, asOf time.Time) (map[string]ReqCoverage, map[string]map[string]bool, error) {
if err := buildTemps(ctx, tx, asOf.Format("2006-01-02")); err != nil {
return nil, nil, err
}
assigned, qualified, reqs, edges, err := fetchAssignment(ctx, tx)
if err != nil {
return nil, nil, err
}
out := make(map[string]ReqCoverage, len(reqs))
for _, r := range reqs {
out[r.id] = ReqCoverage{
Quantity: r.quantity, Assigned: assigned[r.id], Qualified: qualified[r.id],
LaborCategory: r.lcat, KeyPersonnel: r.keyPersonnel,
}
}
eligible := make(map[string]map[string]bool, len(edges))
for rid, cids := range edges {
m := make(map[string]bool, len(cids))
for _, cid := range cids {
m[cid] = true
}
eligible[rid] = m
}
return out, eligible, nil
}
// reqMeta is one active requirement's metadata for the assignment.
type reqMeta struct {
id, oppID, lcat, level string
quantity int
keyPersonnel bool
}
// fetchAssignment computes a TRUE staffing assignment: each available candidate is consumed AT MOST
// ONCE across all active requirements (greedy, scarcest-requirement-first). This replaces the prior
// per-requirement qualification count that double-counted a candidate across every requirement they
// fit [review COV-1/COV-2]. Returns the per-requirement assigned headcount, the per-requirement
// qualified-pool size (distinct eligible candidates), and the requirement metadata.
func fetchAssignment(ctx context.Context, tx pgx.Tx) (assigned, qualified map[string]int, reqs []reqMeta, edges map[string][]string, err error) {
mrows, err := tx.Query(ctx, `
SELECT id::text, COALESCE(opportunity_id::text,''),
COALESCE(NULLIF(trim(labor_category),''),'Uncategorized'), quantity, key_personnel, required_level
FROM cc_active_req ORDER BY id`)
if err != nil {
return nil, nil, nil, nil, fmt.Errorf("req meta: %w", err)
}
for mrows.Next() {
var r reqMeta
var q int32
if err := mrows.Scan(&r.id, &r.oppID, &r.lcat, &q, &r.keyPersonnel, &r.level); err != nil {
mrows.Close()
return nil, nil, nil, nil, err
}
r.quantity = int(q)
reqs = append(reqs, r)
}
mrows.Close()
if err := mrows.Err(); err != nil {
return nil, nil, nil, nil, err
}
// eligibility edges: which available candidate qualifies for which active req (clearance + years +
// ALL mandatory skills). Ordered for deterministic greedy selection.
erows, err := tx.Query(ctx, `
SELECT ar.id::text, c.id::text
FROM cc_active_req ar
JOIN cc_cand c ON c.available
AND (ar.rlvl < 2 OR (c.effective AND c.lvl >= ar.rlvl AND c.poly >= ar.rpoly))
AND c.years_experience >= ar.required_years
AND NOT EXISTS (
SELECT 1 FROM unnest(COALESCE((SELECT array_agg(skill_id) FROM required_skills rs WHERE rs.requirement_id=ar.id AND rs.mandatory),'{}'::uuid[])) AS rsk
WHERE NOT EXISTS (SELECT 1 FROM candidate_skills cs WHERE cs.candidate_id=c.id AND cs.skill_id=rsk)
)
ORDER BY ar.id, c.id`)
if err != nil {
return nil, nil, nil, nil, fmt.Errorf("eligibility edges: %w", err)
}
edges = map[string][]string{}
for erows.Next() {
var rid, cid string
if err := erows.Scan(&rid, &cid); err != nil {
erows.Close()
return nil, nil, nil, nil, err
}
edges[rid] = append(edges[rid], cid)
}
erows.Close()
if err := erows.Err(); err != nil {
return nil, nil, nil, nil, err
}
qualified = make(map[string]int, len(reqs))
for _, r := range reqs {
qualified[r.id] = len(edges[r.id])
}
// greedy: fill the scarcest (fewest-eligible) requirements first; each candidate used at most once.
order := make([]reqMeta, len(reqs))
copy(order, reqs)
sort.Slice(order, func(i, j int) bool {
qi, qj := qualified[order[i].id], qualified[order[j].id]
if qi != qj {
return qi < qj
}
if order[i].quantity != order[j].quantity {
return order[i].quantity > order[j].quantity
}
return order[i].id < order[j].id
})
assigned = make(map[string]int, len(reqs))
used := make(map[string]bool)
for _, r := range order {
for _, cid := range edges[r.id] {
if assigned[r.id] >= r.quantity {
break
}
if !used[cid] {
used[cid] = true
assigned[r.id]++
}
}
}
return assigned, qualified, reqs, edges, nil
}
func oppSortVal(v *string) decimal.Decimal {
if v == nil {
return decimal.NewFromInt(-1)
}
d, err := decimal.NewFromString(*v)
if err != nil {
return decimal.NewFromInt(-1)
}
return d
}
// opportunitiesFromAssignment rolls the per-requirement assignment up to each open opportunity.
func opportunitiesFromAssignment(reqs []reqMeta, assigned map[string]int, opp map[string]oppInfo) ([]Opportunity, int) {
byOpp := map[string][]reqMeta{}
for _, r := range reqs {
if r.oppID != "" {
byOpp[r.oppID] = append(byOpp[r.oppID], r)
}
}
out := make([]Opportunity, 0, len(byOpp))
high := 0
for oppID, rs := range byOpp {
info := opp[oppID]
total := len(rs)
covered, hcNeed, hcCov, kpOpen := 0, 0, 0, 0
kpOK := true
for _, r := range rs {
a := assigned[r.id]
hcNeed += r.quantity
hcCov += a
if a >= r.quantity {
covered++
}
if r.keyPersonnel && a < r.quantity {
kpOpen++
kpOK = false
}
}
ratio := pct(int64(covered), int64(total))
o := Opportunity{
OpportunityID: oppID, Name: info.name, CustomerAgency: info.customer,
SolicitationNumber: info.solicitation, DueDate: info.dueDate,
ReadinessScore: ratio.StringFixed(2), TotalRequirements: total, CoveredRequirements: covered,
HeadcountNeeded: hcNeed, HeadcountCovered: hcCov, KeyPersonnelOpen: kpOpen,
}
if info.value != nil {
vs := info.value.StringFixed(2)
o.Value = &vs
}
switch {
case !kpOK || ratio.LessThan(decimal.NewFromInt(50)):
o.StaffingRisk, o.StaffingRiskCode = "High", "high"
high++
case ratio.LessThan(decimal.NewFromInt(85)):
o.StaffingRisk, o.StaffingRiskCode = "Medium", "medium"
default:
o.StaffingRisk, o.StaffingRiskCode = "Low", "low"
}
out = append(out, o)
}
sort.Slice(out, func(i, j int) bool {
vi, vj := oppSortVal(out[i].Value), oppSortVal(out[j].Value)
if !vi.Equal(vj) {
return vi.GreaterThan(vj)
}
return out[i].OpportunityID < out[j].OpportunityID
})
return out, high
}
// gapsFromAssignment derives true unmet positions (quantity minus ASSIGNED) grouped by labor category
// + required level. Banner staffing_gaps == sum of these (incl Uncategorized) so they reconcile [COV-3].
func gapsFromAssignment(reqs []reqMeta, assigned map[string]int, opp map[string]oppInfo) ([]Gap, *string, int) {
type key struct{ lcat, level string }
type acc struct {
unmet int
blocksKP bool
oppIDs map[string]bool
}
groups := map[key]*acc{}
keyOrder := []key{}
totalGaps := 0
var suggestReq *string
maxUnmet := -1
// demandedTotal is the total headcount demanded across every active requirement. Filling one gap
// raises filled headcount by exactly that gap's unmet, so pct(unmet, demandedTotal) is the points of
// overall labor category coverage that closing the gap adds, the modeled Mission Readiness Impact.
var demandedTotal int64
for _, r := range reqs {
demandedTotal += int64(r.quantity)
unmet := r.quantity - assigned[r.id]
if unmet < 0 {
unmet = 0
}
totalGaps += unmet
if unmet == 0 {
continue
}
if unmet > maxUnmet { // reqs are in id order => stable lowest-id pick on ties
maxUnmet = unmet
id := r.id
suggestReq = &id
}
k := key{r.lcat, r.level}
g := groups[k]
if g == nil {
g = &acc{oppIDs: map[string]bool{}}
groups[k] = g
keyOrder = append(keyOrder, k)
}
g.unmet += unmet
if r.keyPersonnel {
g.blocksKP = true
}
if r.oppID != "" {
g.oppIDs[r.oppID] = true
}
}
out := make([]Gap, 0, len(groups))
for _, k := range keyOrder {
g := groups[k]
ids := make([]string, 0, len(g.oppIDs))
for id := range g.oppIDs {
ids = append(ids, id)
}
sort.Strings(ids)
names := []string{}
var risk decimal.Decimal
priced, unpriced := 0, 0
allReal := true // true only when every PRICED opportunity is a cached federal value
for _, id := range ids {
info := opp[id]
if info.name != "" {
names = append(names, info.name)
}
if info.value != nil {
risk = risk.Add(*info.value)
priced++
if !isRealValueSource(info.valueSource) {
allReal = false
}
} else {
unpriced++
}
}
sort.Strings(names)
total := priced + unpriced
var riskStr *string
if priced > 0 { // only emit a dollar when at least one opportunity is priced
vs := risk.StringFixed(2)
riskStr = &vs
}
// Representative unless every counted dollar is a cached federal figure: a single synthetic dollar
// in the sum taints the headline, so the conservative, honest answer is representative.
representative := priced == 0 || !allReal
impact := pct(int64(g.unmet), demandedTotal)
impactStr := impact.StringFixed(2)
impactLabel := fmt.Sprintf(
"Modeled coverage delta, filling this gap adds %s points to overall labor category coverage, not a guarantee of award.",
impactStr)
out = append(out, Gap{
LaborCategory: k.lcat, RequiredLevel: k.level, RequiredLevelLabel: levelLabel(k.level),
Unmet: g.unmet, BlocksKeyPersonnel: g.blocksKP, ImpactedOpportunities: names, ValueAtRisk: riskStr,
PricedOpportunities: priced, UnpricedOpportunities: unpriced, TotalOpportunities: total,
ValueRepresentative: representative, ValueBasis: valueBasisLine(priced, unpriced, total, representative),
ImpactModeledPct: impactStr, ImpactModeledLabel: impactLabel,
Headline: fmt.Sprintf("NEED %d %s (%s)", g.unmet, pluralize(k.lcat, int64(g.unmet)), levelLabel(k.level)),
Recommendation: fmt.Sprintf("Recruit %d %s %s%s.", g.unmet, levelLabel(k.level), pluralize(k.lcat, int64(g.unmet)), kpClause(g.blocksKP)),
})
}
sort.SliceStable(out, func(i, j int) bool {
if out[i].Unmet != out[j].Unmet {
return out[i].Unmet > out[j].Unmet
}
if out[i].LaborCategory != out[j].LaborCategory {
return out[i].LaborCategory < out[j].LaborCategory
}
return out[i].RequiredLevel < out[j].RequiredLevel
})
return out, suggestReq, totalGaps
}
// valueBasisLine states how a gap's dollar was derived so the figure is auditable, never a bare sum. It
// names the counted (priced) and excluded (unpriced) opportunity counts and whether the figure is
// representative demo data or modeled from cached federal values. It never invents a number.
func valueBasisLine(priced, unpriced, total int, representative bool) string {
if total == 0 {
return "No priced opportunities tied to this gap."
}
if priced == 0 {
return fmt.Sprintf("No published value, %d of %d opportunities excluded as unpriced.", unpriced, total)
}
source := "modeled exposure from cached federal values"
if representative {
source = "representative demo exposure"
}
word := "opportunities"
if priced == 1 {
word = "opportunity"
}
if unpriced == 0 {
return fmt.Sprintf("Summed across %d priced %s, %s.", priced, word, source)
}
return fmt.Sprintf("Summed across %d of %d priced %s, %d excluded as unpriced, %s.", priced, total, word, unpriced, source)
}
// lcatCoverageFromAssignment is the true fill rate per labor category (assigned / demanded).
func lcatCoverageFromAssignment(reqs []reqMeta, assigned map[string]int) []LcatCoverage {
type acc struct{ filled, demanded int }
m := map[string]*acc{}
order := []string{}
for _, r := range reqs {
a := m[r.lcat]
if a == nil {
a = &acc{}
m[r.lcat] = a
order = append(order, r.lcat)
}
a.filled += assigned[r.id]
a.demanded += r.quantity
}
out := make([]LcatCoverage, 0, len(m))
for _, lcat := range order {
a := m[lcat]
cov := pct(int64(a.filled), int64(a.demanded))
out = append(out, LcatCoverage{lcat, a.filled, a.demanded, cov.StringFixed(2), colorFor(cov)})
}
sort.SliceStable(out, func(i, j int) bool { // ascending coverage via cross-multiply (exact)
li := int64(out[i].Filled) * int64(out[j].Demanded)
lj := int64(out[j].Filled) * int64(out[i].Demanded)
if li != lj {
return li < lj
}
return out[i].LaborCategory < out[j].LaborCategory
})
return out
}
// proposalFromAssignment buckets each open opportunity (KP-missing > LCAT-missing > at-risk > ready)
// and returns the proposal-readiness driver % (opportunities fully ASSIGNABLE / open opportunities).
func proposalFromAssignment(reqs []reqMeta, assigned, qualified map[string]int, opp map[string]oppInfo) (ProposalReadiness, decimal.Decimal) {
byOpp := map[string][]reqMeta{}
for _, r := range reqs {
if r.oppID != "" {
byOpp[r.oppID] = append(byOpp[r.oppID], r)
}
}
pr := ProposalReadiness{
ReadyOpportunities: []OppRef{}, AtRiskOpportunities: []OppRef{},
KeyPersonnelMissingOpportunities: []OppRef{}, LaborCategoriesMissingOpportunities: []OppRef{},
}
oppIDs := make([]string, 0, len(byOpp))
for id := range byOpp {
oppIDs = append(oppIDs, id)
}
sort.Slice(oppIDs, func(i, j int) bool {
ni, nj := opp[oppIDs[i]].name, opp[oppIDs[j]].name
if ni != nj {
return ni < nj
}
return oppIDs[i] < oppIDs[j]
})
ready := 0
for _, oppID := range oppIDs {
kpMissing, lcatMissing, fully := false, false, true
for _, r := range byOpp[oppID] {
if qualified[r.id] == 0 {
if r.keyPersonnel {
kpMissing = true
} else {
lcatMissing = true
}
}
if assigned[r.id] < r.quantity {
fully = false
}
}
ref := OppRef{OpportunityID: oppID, Name: opp[oppID].name}
switch {
case kpMissing:
pr.KeyPersonnelMissing++
pr.KeyPersonnelMissingOpportunities = append(pr.KeyPersonnelMissingOpportunities, ref)
case lcatMissing:
pr.LaborCategoriesMissing++
pr.LaborCategoriesMissingOpportunities = append(pr.LaborCategoriesMissingOpportunities, ref)
case !fully:
pr.AtRisk++
pr.AtRiskOpportunities = append(pr.AtRiskOpportunities, ref)
default:
pr.Ready++
pr.ReadyOpportunities = append(pr.ReadyOpportunities, ref)
ready++
}
}
return pr, pct(int64(ready), int64(len(oppIDs)))
}