Build Log
Tooling & Sandbox Triage, and Making Signals Actionable
September 26, 2026
A charge to remediate signals became queue hygiene — until Zeb asked why, and the page turned out to be 8/9 noise.
Timeline
What shipped
.claude/hooks/lib/shell-safety.mjs — classifies the inline-script quoting shapes with three evidenced occurrences; observe-mode only, fails open, never changes a permission decision
.claude/hooks/tests/shell-safety.test.mjs — 18 fixtures weighted toward negative cases (9 safe forms that must never be flagged)
.claude/hooks/gate-dispatch.mjs — observe-mode wiring, logging to <git-common-dir>/forgekit/shell-safety-observations.log.jsonl outside the working tree
forgekit-os/scripts/engine-guard.mjs — hard-rule baseline matching is now content-based, not line-based, ending a recurrence three prior fixes had only patched
forgekit-os/scripts/hard-rule-baseline.json — regenerated once with a `text` field, under a generator that refuses to write if any (file, phrase) count increased
forgekit-os/scripts/tests/engine-guard.test.mjs — line-shift regression test; caught a real bug in its own fix within minutes
products/alloy/lib/signals/prioritization.ts — CATEGORY_DISPOSITIONS registry, coherenceState exposed on PrioritizedSignal, Unverified Assumption recorded verified-coherent
products/alloy/components/signals/SignalsCockpit.tsx — Needs-a-Charge filters to actionable signals only, header states what was hidden
forgekit-os/charges/tooling-sandbox-disposition-2026-09-26.md — the triage record, with both follow-ups resolved in an addendum