ForgeKitFORGEKIT

Build Log

Signals Product Analysis, an RSC Deterministic Trap, and the Observer's Own Transport Redesign

August 24, 2026

A product-analysis charge on Alloy's Signals page found and fixed two real correctness gaps, a live production regression during the fix became a deterministic RSC-boundary guard, and the observer itself drafted and shipped the first slice of its own transport redesign — then got corrected for an epistemic overclaim inside the very manifest built to catch epistemic overclaims.

AlloySignalsResearchExperiment 0OS Guardrail
4
commits landed
2
real correctness gaps fixed on Signals
1
live production regression, found and fixed same session
87%
character reduction on the oversized observer window

Timeline

Start
Signals Page Product Analysis Charge received
Explicit instruction: understand the page's job before touching anything, implementation only if analysis justifies it
~1h
Deep Dive taxonomy mismatch found and fixed
Cockpit used canonical categories, Deep Dive one click below still used the raw fragmented field
~2h
easeScore inference challenged by the observer, then verified stronger than suspected
Observer: failure for one purpose doesn't prove failure for another. Direct verification found known-fix unreachable against all 16 real categories
~2.5h
Live production regression during the fix
SignalsTable.tsx (Client Component) pulled prioritization.ts's fs/path/crypto chain into the browser bundle — caught by the user, not by tsc/eslint/dev-server
~3h
User review: easeScore fix was only half-right
Cockpit badge replaced one non-discriminating claim with another; property name never updated to match its new meaning; test coverage claim didn't match what was tested
~3.5h
Deterministic RSC-boundary guard built and verified
Two real false-positive classes found and fixed (Server Actions, two different type-only import tags) by testing against the real 55-file codebase, then verified by reintroducing the original bug
~4h
Observer drafts its own transport-redesign Charge
User's proposal (Observer Packet + provenance-on-demand) handed directly to the observer persona, which pushed back on real points rather than agreeing
~4.5h
Observer Packet Level 0+1 built and verified against the exact real 1.34MB window that broke the original transport
1,350,618 chars -> 175,631 chars, zero unclassified events, both images correctly marked
End
Direct review: stop building, fix the vocabulary, freeze the transport
unclassified:[] does not prove no silent loss — corrected the manifest's own overclaim, then stopped per instruction

What shipped

Fixed Alloy Signals page: Deep Dive (SignalsTable.tsx) now uses the same canonical categorizeSpin() taxonomy the Cockpit already used, instead of the raw fragmented spin.category field

Removed the non-discriminating fix-history cockpit badge (previously 'Partial fix' on every card, then 'Fix on record' on every card — neither discriminated between the 5 ranked categories); renamed easeScore to fixHistoryStatus and extracted a pure classifyFixHistory() function with direct tests

Split categorizeSpin() into a new client-safe lib/signals/categorize-spin.ts after a real RSC-boundary production build break, fixing the live regression

Built products/alloy/scripts/check-rsc-boundary.mjs — a deterministic guard, wired into check:boundaries/predeploy, that walks dependency-cruiser's own JSON graph from every 'use client' file and fails if any transitively reaches a Node core module (fs/path/crypto/etc.), correctly stopping at 'use server' boundaries and excluding type-only imports

Had the observer (Witness) draft its own Charge for a transport redesign, then built the first slice: forgekit-os/scripts/experiments/observer-packet.mjs (deterministic Level 0 filtering + loss-aware event projection) and observer-provenance.mjs (minimal raw-event/window drill-down)

Wired --packet as an opt-in flag into observer-probe.mjs, with a separate packet-aware system prompt, verified end-to-end with a real observer call

Corrected a real epistemic overclaim in the packet manifest itself (unclassified:[] does not prove no silent loss) — split into unclassifiedCount (proven) vs. knownOmissionsCount (accounted for, not proven harmless), renamed the module from claiming 'Level 1' to the accurate 'loss-aware event projection'