Build Log
Making ForgeKit's Operating Diagnosis Traceable — Evidence, Signal, Vital, Charge
August 24, 2026
Fixed the real disconnect between Evidence Tray, Signals, and OS Vitals (seven independent recurrence computations, zero shared taxonomy) with a narrow, additive correction rather than a new shared graph library, added genuinely greenfield economics and negative-evidence telemetry, and had two real overclaims caught and fixed by the Observer during the build.
Timeline
What shipped
products/alloy/lib/shared/category-gate-map.ts — the one copy of the spin-category-to-gate mapping, replacing a hand-mirrored duplicate in lib/signals/prioritization.ts, now also consumed by lib/os-vitals/staleness.ts's Attic view
Added whyFlagged (a real, explicit 'why this deserves attention' fact list, distinct from the single-dimension rank) to Signals' PrioritizedSignal, Evidence's MissedPackageSignal, and OS Vitals' Diagnosis types — every non-rank-determining fact explicitly says so, after a real Observer catch on the first naming (priorityFactors)
Built the first Vitals-level Charge-drafting function (computeDiagnosis's new draftedCharge) — OS Vitals previously had no Charge generator at all, unlike Signals and Evidence Tray
Wired real cross-page navigation: OS Vitals' Biggest Drag drawer now links its contributing categories directly to the Signals page — the actual Vital -> Signal provenance chain the Charge required
Extracted CopyChargeButton (previously duplicated in 2 files) into components/shared/ once a genuine third consumer (OS Vitals) arrived
Added an optional economics{} block to the session JSON schema (forgekit-os/sessions/_SCHEMA.md) — tokens, cost (with a mandatory is_estimate flag), Observer cost tracked separately, founder intervention count, accepted outcomes, rework events, escaped failures; every field null unless actually measured, no backfill
Built lib/evidence/economics.ts — reads the new field, implements an honest 'insufficient-data' vs 'computed' state for derived metrics (Cost per Accepted Outcome requires 5+ real sessions before computing anything)
Built lib/evidence/negative-evidence.ts — surfaces gate_checks entries recorded as failed/skipped/ceremonial across all sessions as an inspectable list, not just an aggregate percentage; found and fixed a separate small bug (missed_issue was documented in _SCHEMA.md but silently dropped by lib/os-vitals/sessions.ts's reader)
Wired both new evidence domains into Evidence Tray's cockpit UI as two new sections with their own drawers
Reconciled OS Vitals' deferral-ledger recurrence count against Signals' own recurrence count by stating, in the item's own detail text, that they measure different (if related) things via different category taxonomies — rather than presenting two silently-conflicting numbers
3 new regression tests pinning the whyFlagged rank-vs-context distinction as a permanent invariant