The agentic WFM cycle, end to end
Synthetic, code-named material through real code: the intake (wfm-cycle f848412), the daily forecast cycle (plumb 312f16f) and the Staffing Outlook shape tool (wfm-shape-tools d51f3c3). One command, bun run demo, built this in 188 s at 2026-10-05T10:50Z. Two steps are scripted where a person would act: triage and the owner's signature.
Watch it flow
An animated map of one day: play the day, or follow one piece of information from the moment someone mentions it to the moment the floor is staffed for it: a client onboarding · a rumor · an executive's question.
Read the method
The WFM Labs wiki explains what this demo does and why, in the series Agentic WFM Protocol. This demo has its own page there: The Agentic WFM Cycle: a Worked Demo.
- Work intake: steps 1 to 3
- Source grades on intake signals: step 4
- The short-term forecasting loop: step 5
- Human gates and the guarded publish: the signature
- The shape file bridge: step 6 and the runner
- Forecast value added: step 8
Then: the daily brief
What a leader reads each morning: five headline lines, every decision the cycle needs from a person with an owner and a due date, the risks ahead, and three trends. It is built from the run's own outputs and decides nothing itself.
Also as data: the decision list as CSV (for a tracker) and brief.json.
1Material arrives as the files people send
12 items: emails (one with a wave-plan spreadsheet), a client-review deck, Word notes, a PDF ops note, a stand-up transcript and chat exports. Some carry forecast signals, two explain past days, one is a rumor, three are chatter, and one is an executive's request for a view.
The inbox as it arrived (open the folders: .eml, .pptx, .docx, .pdf, .vtt, .xlsx, .txt).
2Intake: every item becomes an ask
Each file is read by the multi-format extractor (tables to CSV), scrubbed against the code-name key, and written as an intake packet with a suggested route. Nothing is routed automatically.
The intake register · the one-ask intake form · the weekly register tool (both single-file, offline)
3Triage: which decision does this change?
Every ask gets a bucket, a workflow (FIRE · BAU · STRAT · BUILD), an urgency and the decision it informs. An ask that changes no decision is closed, not worked.
Scripted here. A person triages in the real flow; the demo applies a fixed table so it runs unattended.
| Ask | Arrived as | What it is | Route | Lifecycle | What it became | Status |
|---|---|---|---|---|---|---|
| ASK-001 | Final migration wave locked for 1 Feb (90% of the legacy book moved); wave plan attached | BAU · U3 | forecast | V migration → in-plan | handed-off | |
| ASK-002 | deck | Client review deck: new division onboarding on A-S08 from 9 Nov, about +15% | BAU · U2 | forecast | E client → applied | handed-off |
| ASK-003 | chat | Chat confirming the A-S08 onboarding and the 15% (second source) | BAU · U2 | forecast | E client → corroborating | handed-off |
| ASK-004 | Forwarded note with no author: a possible volume change | BAU · U4 | forecast | U client → rumor | handed-off | |
| ASK-005 | Ops note: an absence on A-S02 in mid-September | BAU · U4 | forecast | E absence → explanation | handed-off | |
| ASK-006 | chat | Real-time analyst explains an early-January day | BAU · U4 | forecast | E weather → explanation | handed-off |
| ASK-007 | transcript | Stand-up transcript: forecast changes raised by the room | BAU · U2 | forecast | I platform → proposed | handed-off |
| ASK-008 | Scheduling lead: a holiday on product D | BAU · U3 | forecast | V calendar → applied | handed-off | |
| ASK-009 | Facilities note about parking | BAU · U4 | — | no decision | closed | |
| ASK-010 | chat | Team-lead chat with no planning content | BAU · U4 | — | no decision | closed |
| ASK-011 | notes | Vendor 2 monthly review notes | BAU · U4 | — | no decision | closed |
| ASK-012 | One page: staffing vs requirement for every product through the wave plan, then weekly | FIRE · U1 | report | Staffing Outlook | handed-off |
4Bridge: forecast asks become the cycle's intake
8 asks cross; chatter does not. The bridge takes each packet's scrubbed text and the author's role recorded at triage.
Check: signals extracted from the files via intake = 8; from the raw text directly = 8: identical. bridged-items.json
5The daily forecast cycle · Day 1, as of 2026-10-04
History arrives as an IEX-style export, is mapped onto the contracts and validated, then the cycle runs: prior-day performance, graded signals, the reforecast, the weekly 26-week refresh, the monthly lock for 2026-11, and learning. 4 gates moved; 8 signals, 2 overlays.
- Daily brief · as of 2026-10-04
- Prior-day performance · 2026-10-03
- Intake and signals
- Daily reforecast · as of 2026-10-04
- Weekly outlook refresh · as of 2026-10-04
- Monthly lock · 2026-11
- Learning · as of 2026-10-04
- Owner review screen (interactive; the packet is embedded)
Published 2026-10-04@2026-10-04T08:15: 60 gates approved and signed by a scripted reviewer. A forecast owner does this in the review screen; publish refuses an unsigned, incomplete or stale review. record.csv (23,114 rows) · WFM export · inputs as they arrive at work
6The view regenerates with no hands
The executive's FIRE ask is answered from the signed record: requirement from the record, supply from the supply plan plus the monthly lock's 47 hiring asks, which become 6 mobilization waves. 25 weeks, 4 products.
Open the Staffing Outlook (interactive, pre-loaded; edit a wave and watch supply move) · the update note (the slide notes, written) · the shape file
| Product | Worst week | Required FTE | Supply FTE | Gap |
|---|---|---|---|---|
| Product A | week 18 | 421.3 | 396.5 | -5.9% |
| Product C | week 18 | 186.9 | 175.6 | -6.0% |
| Product D | week 18 | 275.5 | 255.6 | -7.2% |
| Product E | week 13 | 176.6 | 167.6 | -5.1% |
Contract check: 0 notes, 0 fails
7Handoffs close the loop on every ask
Each forecast ask records what the cycle did with its signals (applied, proposed for review, held as a rumor, or used to explain a flagged day); the FIRE ask records the view it received.
The register after the day: 9 handed off, 3 closed, 0 open.
8Nine weeks later · Day 63, as of 2026-12-06
The cycle runs on nine more weeks of exports. Its learning phase scores the published Day-1 record against what happened, layer by layer: did the migration overlay, the signals and the human help or hurt?
| Layer of the Day-1 record | Volume WAPE | Bias |
|---|---|---|
| record | 10.75 | -2.36 |
| + learned level | 10.75 | -2.35 |
| + migration ratio | 10.69 | -2.13 |
| + applied signals | 10.5 | -2.13 |
| + human edits (published) | 10.5 | -2.13 |
9Guard: nothing real in the demo
Every text file and every path in this folder was scanned against the machine-local code-name key (32 entries; the key itself never enters a repo).
110 text files and 115 paths scanned: 0 hits.
2 framework strings were allowlisted inside the bundled tools: a modifier-key name in the browser's keyboard map that is also a key term. Nothing else is excepted.
Run it at work
The one-file runner runs the daily cycle on real exports in the browser (nothing installed, nothing uploaded). The runbook · the contracts.