Restores two CI gates the 2026-05-29 evolve session left broken/flaky.
## Fix 1 — claude-review hang (the gate you flagged)
`claude-code-review.yml` (required merge gate) + `claude.yml`
(`@claude`) ran `anthropics/claude-code-action@v1` with **no
`timeout-minutes`**. A hung LLM call ran to GitHub's **6h default** →
required check stuck `pending` forever → merge blocked → forced 3×
`--admin` bypass this session (#591 stuck ~17min).
- `claude-code-review.yml`: `timeout-minutes: 20` (hung review → **fast
fail**, re-runnable, not stuck) + `concurrency` (`cancel-in-progress`)
to supersede lingering runs.
- `claude.yml`: `timeout-minutes: 30` (same hang class).
A timed-out required check still blocks merge but is now *actionable*.
Changing required-ness / the 6h default is out of scope
(branch-protection policy).
## Fix 2 — executable-spec-link-integrity RED on main (regression from
#591)
#591 (ag-8ok) added directive **D15** with `**Scenarios:**
s-2026-05-24-015` but never created the scenario file. The lint gate
(`ao goals scenarios --lint`) was **path-filter-skipped** on #591's CI,
so the phantom reference merged and left **main red** (this also blocks
#593's own copy of the gate). Fix: add
`spec/scenarios/s-2026-05-24-015.json` (mirrors -013/-014), properly
linking D15. Lint now: *"No executable-spec link defects found."*
## Note on this PR's own claude-review
`claude-code-action` requires the workflow file to be byte-identical to
main's (anti-tamper). Because this PR *modifies*
`claude-code-review.yml`, its own `claude-review` check fails by design
(the action's error says this is "normal"). This PR must be admin-merged
— the **last** bypass before the timeout protects future PRs. All
deterministic gates (Validate, 65 jobs) are the merge signal.
Closes-scenario: ag-1kcr#claude-review-timeout
Bounded-context: BC5-Runtime
Cycle 1 of the CI gate rebuild (epic ag-5ck) — directive: rebuild the
gates from first principles, no strangler.
**Thesis:** the 59 check scripts are the safety logic (keep); the
**67-job orchestration** of `validate.yml` (1,978 lines) is accretion
slop. Collapse to **~10 purpose-grouped jobs**, each running its family
of scripts. Same coverage, ~85% fewer jobs.
**Safety (the no-strangler net):** coverage-proof — every script invoked
by old `validate.yml` must be invoked by new (`comm -23` must be empty);
the rebuild PR runs the new file against itself, so main stays protected
until green.
**Flagged danger:** branch-protection required-checks cutover (rename 64
required checks → 10) is admin-gated, repo-wide blast radius —
operator-coordinated, not autonomous.
This PR lands the design only. Build (new `validate.yml`) + cutover
follow.
Closes-scenario: ag-877#gate-rebuild-design
Bounded-context: BC2-Validation
Evidence: spec/teardown-2026-05-28/gate-rebuild-first-principles.md
## Wave 1 — AgentOps teardown (epic ag-097)
Deletes two genuinely-dead Go packages: `cli/internal/plans` +
`cli/internal/worker` (verified 0 importers, no blank imports, no non-Go
refs). Build + vet + full test suite green (EXIT=0, 0 failures).
### Scope discipline (why 2, not 6)
Discovery + execution narrowed the candidate list:
- **`internal/domain` excluded** — `domain/packet` has 4 live importers
(ports/storage, adapters/storage_fs, rpi/artifacts). Not dead.
- **`safety`, `wikiworker`, `feedbackcompiler` split to ag-jqx** —
they're 0-import but **contract-entangled**: `safety` is the only
production anchor for the `.agents/swarm-role` agents-write-surfaces
entry; `wikiworker` for `.agents/quarantine` (a live surface —
agentworker has 26 active quarantine tests); `feedbackcompiler` is the
documented forge F5.4 capability. Deleting them naively fails
`TestAgentsWriteSurfaces_EachAllowlistEntryHasProductionReference`. They
need owner decisions, not a naive rm.
### Evidence
- spec/teardown-2026-05-28/{spine,slop-map,strangler-plan}.md (added in
this PR)
- .agents/research/2026-05-28-teardown-discovery.md (local)
Closes-scenario: ag-nxm#dead-pkgs
Bounded-context: BC5-Runtime
Evidence: spec/teardown-2026-05-28/