Build Log · August 24, 2026

Making ForgeKit's Operating Diagnosis Traceable — Evidence, Signal, Vital, Charge

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.

  • Alloy
  • Evidence Tray
  • Signals
  • OS Vitals
  • Experiment 0
  • Autonomous Session
independent recurrence computations found, none reconciled
7

independent recurrence computations found, none reconciled

real Observer catches, both fixed
2

real Observer catches, both fixed

real negative-evidence occurrences surfaced for the first time
83

real negative-evidence occurrences surfaced for the first time

new evidence domains added (why-flagged factors, economics, negative evidence)
3

new evidence domains added (why-flagged factors, economics, negative evidence)

Timeline

  1. Start

    Charge received: make Evidence -> Signal -> Vital -> Charge traceable

    Autonomous-execution experiment — Claude resolves architecture, escalates only on ambiguous product-meaning decisions

  2. ~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

  3. ~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

  4. ~1.5h

    Shared category-gate-map extracted, priorityFactors added to Signals/Evidence, Vitals Charge-drafting built

    First coherent build cycle — tsc clean

  5. ~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

  6. ~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

  7. ~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

  8. 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