* feat(#3545): widen no-source-grep with one-hop path-fold and hooks dir
Resolve a readFileSync() path argument that is a bare Identifier one hop
back to its VariableDeclarator initializer before classification, and
recognize `hooks` as a source directory alongside bin/lib/gsd-core/src.
Measured (epic #3464 phase 7): fold+hooks together newly flag 76
unsuppressed sites across 18 files that were previously invisible to
identifier-indirected or hooks/-rooted source reads. Neither widening
alone is sufficient — hooks-only surfaces 0 new sites, confirming #3520's
prior finding that the identifier-indirection gap must close first.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* test(#3545): migrate 76 sites newly flagged by the fold+hooks widening
Per-site classification: rewrite behaviorally (require() the real module,
assert on its actual exported behavior) wherever the read was a proxy for
code behavior; add a site-scoped `// allow-test-rule: <reason> (#3545)`
marker only where the raw source text genuinely is the product under test
(codex-config.test.cjs's adapter-header-contract checks, install.js
structural-wiring guards with no exported symbol, AST-parse fixture
inputs, etc.) — each marker cites an existing repo-sanctioned category
from CONTRIBUTING.md's allow-test-rule exception table.
Also converts two try/finally test bodies (introduced during this same
migration) to the required t.after() cleanup pattern per CONTRIBUTING.md.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* chore(#3545): re-baseline effective-exemption ceiling to 81
The fold+hooks widening's own newly-detected sites are now suppressed by
site-scoped markers, moving them from invisible into the tightly-ratcheted
effective-exemption count. Ceiling rises from 10 to 81 (the exact measured
high-water mark, grace unchanged at 2) — a deliberate, measured re-baseline
per the widening working as intended, not an ordinary ceiling bump.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* fix(#3545): use canonical allow-test-rule category tokens
4 markers added during migration cited an issue ref correctly but didn't
use one of CONTRIBUTING.md's seven recognized category tokens, unlike
every other marker in this change. Cosmetic only — same suppression
lines, same effective/live counts (81/81, 0 live).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* fix(#3545): correct stale phase-artifact path in test comment
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
---------
Co-authored-by: sim <sim@local>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* fix(#3795): read the interrupted agent id before clearing the stale marker (#4006)
* test(#3795): the interrupted-agent read must precede the stale-id clear
* fix(#3795): read the interrupted agent id before clearing the stale marker
execute-plan's init_agent_tracking step ran `rm -f
.planning/current-agent-id.txt` BEFORE the existence check that read it,
so the interrupted-agent branch and the Task resume prompt it exists to
offer were unreachable (#3795) — a kill -9 mid-executor left the file,
and the next run deleted it before looking. The read now precedes the
clear; fresh-run semantics (no stale id leaking into the new spawn) are
preserved. A structural guard pins the order.
Emitted-Drift-Ack-Growth: execute-plan.md — #3795: +bytes from reordering the interrupted-agent read before the rm plus the explaining comment
* chore(#3795): changeset fragment (pr number backfilled after PR creation)
* chore(#3795): backfill changeset PR number (4006)
---------
Co-authored-by: sim <sim@local>
* fix(#3799): scope legacy cleanup to the install's resolved config dir and add --no-legacy-cleanup
* chore(#3799): changeset fragment (pr number backfilled after PR creation)
* chore(#3799): backfill changeset PR number (4013)
* test(#3799): mark the legacy-name fixtures with gsd-allow-legacy-name
---------
Co-authored-by: sim <sim@local>