Build Log · September 26, 2026

Tooling & Sandbox Triage, and Making Signals Actionable

A charge to remediate signals became queue hygiene — until Zeb asked why, and the page turned out to be 8/9 noise.

  • os
  • signals
  • gates
  • alloy
  • shell-safety
entries in Needs a Charge
9 → 1

entries in Needs a Charge

real commands with 0 false positives
374

real commands with 0 false positives

prior fixes that patched a symptom
3

prior fixes that patched a symptom

times I committed the shape I was fixing
2

times I committed the shape I was fixing

Timeline

  1. Start

    A red pulse verdict and a top-5 list

    Zeb: triage Tooling & Sandbox, then the top 5, and execute

  2. Early

    Two OS tools gave opposite instructions

    Both correct — same word '3', different denominators, neither naming its unit

  3. Mid

    Built the one shape whose trigger had fired

    Shell-quoting: prose since 09-11, failed three times, twice more in this session

  4. Turn

    Zeb: 'why did you not do that?'

    I had converted a remediation charge into queue hygiene and not noticed

  5. End

    The page was 8/9 unactionable

    Six verified grab-bags; the one real signal was labelled as the unread one

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