ForgeKitFORGEKIT

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.

AlloyEvidence TraySignalsOS VitalsExperiment 0Autonomous Session
7
independent recurrence computations found, none reconciled
2
real Observer catches, both fixed
83
real negative-evidence occurrences surfaced for the first time
3
new evidence domains added (why-flagged factors, economics, negative evidence)

Timeline

Start
Charge received: make Evidence -> Signal -> Vital -> Charge traceable
Autonomous-execution experiment — Claude resolves architecture, escalates only on ambiguous product-meaning decisions
~30m
Full architecture map via research agent
Found 7 independent recurrence computations, 6 overlapping summary surfaces, 2 existing Charge-drafters (Signals, Evidence) but none for Vitals, zero cost/token schema anywhere
~45m
Scope decision: narrow additive fix, not a new shared graph library
Per the Charge's own explicit warning against overbuilding; confirmed with Zeb after the Observer returned a bare CONTINUE on the open design question
~1.5h
Shared category-gate-map extracted, priorityFactors added to Signals/Evidence, Vitals Charge-drafting built
First coherent build cycle — tsc clean
~2h
Observer CHALLENGE: priorityFactors implied all listed facts drove rank when only cost did
Real catch — renamed to whyFlagged across all 3 modules, explicit rank-vs-context framing added in both code and UI text, 3 regression tests added
~3h
Economics schema + negative-evidence domain built
New optional session-JSON economics block, honest insufficient-data handling verified against real (currently zero) data; negative evidence surfaced 83 real gate_checks failures never visible before
~3.5h
Observer CHALLENGE: negative evidence risked implying live unresolved gaps
Real catch — several sample entries were incidents that themselves produced the fix; reframed as historical occurrences throughout, with no fabricated resolved/unresolved inference
End
Full test suite + real-data acceptance chains verified, staged for commit
498/500 tests pass (2 pre-existing, confirmed via git-stash baseline check); all 3 acceptance chains run live against real production data

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