Phase 23 — contract terms + staffer identity + competence-weighted retrieval
Matrix-index the "who handled this" dimension so top staffers become
the training signal and juniors inherit their playbooks automatically
via the boost pipeline. Auto-discovered indicators emerge from
comparing trajectories across staffers on similar contracts — that was
always the architectural point; this wires the last piece.
ContractTerms:
- deadline, budget_total_usd, budget_per_hour_max, local_bonus_per_hour,
local_bonus_radius_mi, fill_requirement ("paramount" | "preferred")
- Attached to ScenarioSpec, propagated into T3 checkpoint + cloud
rescue prompts so cloud reasons about trade-offs (pivot within bonus
radius first; respect per-hour cap; split across cities when
fill_requirement=paramount).
Staffer:
- {id, name, tenure_months, role: senior|mid|junior|trainee}
- On ScenarioSpec; logged at scenario start; attached to KB outcome
- Recomputed StafferStats written to data/_kb/staffers.jsonl after
every run: total_runs, fill_rate, avg_turns, avg_citations,
rescue_rate, competence_score.
- Competence formula: 0.45*fill_rate + 0.20*turn_efficiency +
0.20*citation_density + 0.15*rescue_rate. Normalized to 0..1.
findNeighbors now returns weighted_score = cosine × best_staffer_competence
(floored at 0.3 so high-similarity low-competence neighbors still
surface). pathway_recommender prompt shows the top staffer's identity
so cloud knows WHOSE playbook it's synthesizing from.
Demo infrastructure:
- tests/multi-agent/gen_staffer_demo.ts: 4 personas (Maria senior,
James mid, Sam junior, Alex trainee) × 3 contracts (Nashville Welder,
Joliet Warehouse, Indianapolis Assembly). 12 scenarios total.
- scripts/run_staffer_demo.sh: runs the 12 sequentially with
LH_OVERVIEW_CLOUD=1. Post-run calls kb_staffer_report.py.
- scripts/kb_staffer_report.py: leaderboard + cross-staffer worker
overlap (names endorsed by ≥2 staffers → auto-discovered high-value
workers). Top vs bottom differential.
gen_scenarios.ts (Phase 22 generator) also now emits contract terms
on 70% of generated specs — future KB batches populate with realistic
constraint patterns instead of bare role+city+count.
Stress scenario from item A intentionally NOT the production test.
Real staffing has constraints; Nashville contract + staffer demo is
the honest test of whether the architecture produces measurable
differential between coordinator skill levels.
Demo batch launched — 12 runs × ~3min each ≈ 40min unattended. Report
emitted after batch.
This commit is contained in:
@@ -147,7 +147,30 @@ function genSpec(rng: () => number, id: number): any {
|
||||
if (events.length > 0) e.replaces_event = events[0].at;
|
||||
events.push(e);
|
||||
}
|
||||
return { client, date, events };
|
||||
|
||||
// Contract terms — most real staffing contracts have these. 70% of
|
||||
// generated specs carry them so KB + T3 learn to reason about budget
|
||||
// and radius trade-offs, not just geography. Distributions are
|
||||
// deliberately varied: 2 week to 45 day deadlines, $22-$38/hr caps,
|
||||
// 25-150mi local radii.
|
||||
const contract = rng() > 0.3 ? (() => {
|
||||
const deadlineDays = 10 + Math.floor(rng() * 35);
|
||||
const deadlineDate = new Date(today.getTime() + (id + deadlineDays) * 86400000)
|
||||
.toISOString().split("T")[0];
|
||||
const budgetPerHour = 22 + Math.floor(rng() * 17);
|
||||
const bonusRadius = 25 + Math.floor(rng() * 125);
|
||||
const bonusPerHour = 2 + Math.floor(rng() * 5);
|
||||
const fill: "paramount" | "preferred" = rng() > 0.4 ? "paramount" : "preferred";
|
||||
return {
|
||||
deadline: deadlineDate,
|
||||
budget_per_hour_max: budgetPerHour,
|
||||
local_bonus_per_hour: bonusPerHour,
|
||||
local_bonus_radius_mi: bonusRadius,
|
||||
fill_requirement: fill,
|
||||
};
|
||||
})() : undefined;
|
||||
|
||||
return { client, date, events, ...(contract ? { contract } : {}) };
|
||||
}
|
||||
|
||||
async function main() {
|
||||
|
||||
Reference in New Issue
Block a user