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.

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.

  1. 1Files arrive
  2. 2Intake
  3. 3Triage
  4. 4Bridge
  5. 5Daily cycle
  6. 6View regenerates
  7. 7Handoffs
  8. 8Nine weeks later
  9. 9Guard

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.

AskArrived asWhat it isRouteLifecycleWhat it becameStatus
ASK-001emailFinal migration wave locked for 1 Feb (90% of the legacy book moved); wave plan attachedBAU · U3forecast V migration → in-planhanded-off
ASK-002deckClient review deck: new division onboarding on A-S08 from 9 Nov, about +15%BAU · U2forecast E client → appliedhanded-off
ASK-003chatChat confirming the A-S08 onboarding and the 15% (second source)BAU · U2forecast E client → corroboratinghanded-off
ASK-004emailForwarded note with no author: a possible volume changeBAU · U4forecast U client → rumorhanded-off
ASK-005PDFOps note: an absence on A-S02 in mid-SeptemberBAU · U4forecast E absence → explanationhanded-off
ASK-006chatReal-time analyst explains an early-January dayBAU · U4forecast E weather → explanationhanded-off
ASK-007transcriptStand-up transcript: forecast changes raised by the roomBAU · U2forecast I platform → proposedhanded-off
ASK-008emailScheduling lead: a holiday on product DBAU · U3forecast V calendar → appliedhanded-off
ASK-009emailFacilities note about parkingBAU · U4— no decisionclosed
ASK-010chatTeam-lead chat with no planning contentBAU · U4— no decisionclosed
ASK-011notesVendor 2 monthly review notesBAU · U4— no decisionclosed
ASK-012emailOne page: staffing vs requirement for every product through the wave plan, then weeklyFIRE · U1report Staffing Outlookhanded-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.

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

ProductWorst weekRequired FTESupply FTEGap
Product Aweek 18421.3396.5-5.9%
Product Cweek 18186.9175.6-6.0%
Product Dweek 18275.5255.6-7.2%
Product Eweek 13176.6167.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 recordVolume WAPEBias
    record10.75-2.36
    + learned level10.75-2.35
    + migration ratio10.69-2.13
    + applied signals10.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.