Skip to content

Unpin CI default back to opus (opus-4-7) — #186#125

Merged
clkao merged 8 commits into
mainfrom
spacedock-ensign/green-opus-4-7-full-suite
Apr 18, 2026
Merged

Unpin CI default back to opus (opus-4-7) — #186#125
clkao merged 8 commits into
mainfrom
spacedock-ensign/green-opus-4-7-full-suite

Conversation

@clkao

@clkao clkao commented Apr 18, 2026

Copy link
Copy Markdown
Collaborator

Unpin the CI default from claude-opus-4-6 back to opus (opus-4-7). The underlying opus-4-7 ensign regression that prompted #181's pin no longer reproduces on current main — the cumulative landings of #183 (BashOutput polling discipline), #185 (three-signal data-flow predicates + bare-mode haiku xfail), and #172 (lazy standing-teammate spawn) together closed the gap. 5/5 local test_feedback_keepalive runs on opus-4-7 --effort low pass cleanly, with zero task_id errors and validation dispatch within 240s in every run.

What changed

  • .github/workflows/runtime-live-e2e.yml — both EFFECTIVE_MODEL and MODEL_FLAG default blocks revert from claude-opus-4-6 to opus; inline pin comments removed. $MODEL_OVERRIDE plumbing preserved
  • MakefileOPUS_MODEL ?= claude-opus-4-6 reverts to OPUS_MODEL ?= opus; inline pin comment removed. $(OPUS_MODEL) override preserved
  • docs/plans/_evidence/green-opus-4-7-full-suite/ — five fo-log.jsonl + five pytest run-logs preserved as audit trail for AC-3/AC-4
  • docs/plans/green-opus-4-7-full-suite.md — cycle-3 scope + Stage Report

No production code changes. Scope fence against skills/first-officer/references/* held — no prose mitigations.

Evidence

  • AC-3 diagnosis (opus-4-7): 3/3 PASS (131s, 118s, 175s). Validation Agent tool_use observed within 240s in every run; test predicate _agent_targets_stage accepts the shape in all three.
  • AC-4 5× verify (opus-4-7): 5/5 PASS (adds 119s, 121s). Zero task_id errors. Zero timeouts.
  • Post-unpin regression (opus-4-6): PASS in 99.7s — cycle-2's three-signal OR-gates still work on opus-4-6.
  • Static suite: 435 passed (≥ 426 threshold).
  • Budget: ~$8.50 of $80 ceiling.

Review guidance

The ensign's honest finding: the opus-4-7 symptom did not reproduce on a branch base that already included #183 + #185 + #172. No new mechanism fix was needed. The effective fix was already in main; this PR flips the default to let CI exercise it.

If post-merge CI surfaces a regression, the unpin commit is a 6-line revert. The CI run 24590771304's task_id tool_use_error is attributable to Claude Code SDK's TaskUpdate/TodoWrite primitive — out of spacedock scope.

Deferred


#186

clkao and others added 8 commits April 18, 2026 09:27
…tatus: done)

AC-1 re-verified, AC-2 dependency map written at implementation kickoff.
AC-3 live diagnosis SKIPPED per dispatch step 3 (#183 is status: validation,
PR #122 not yet merged — running AC-3 now would produce fo-logs whose
timing is dominated by Category-B ensign blocking-sleep, defeating the
symptom-(i)/(ii)/(iii)/(iv) distinction per the entity body's evidence-
integrity rationale).

Recorded AC-3 prep scaffolding (test invocation, artifact-capture snippet,
per-event summary template, task_id emitter-attribution plan) so the next
implementation pass can start AC-3 immediately after #183 merges.

AC-4/AC-5/AC-6 SKIPPED as downstream of AC-3. AC-7 N/A in this blocked
cycle (zero workflow diffs). No production-code edits.
…acts

Five sequential runs of test_feedback_keepalive on opus-4-7 --effort low
with KEEP_TEST_DIR=1 captured under docs/plans/_evidence/green-opus-4-7-full-suite/.
Every run PASSED. Wallclocks 131s, 118s, 175s, 119s, 121s — all well
under the 240s validation-dispatch deadline. Zero `task_id` errors in
any fo-log. Run 5 shows a single benign tool_use_error (Exit code 128
from git adding an embedded worktree) unrelated to the C1 symptom class.

The merges of #183 (BashOutput polling), #185 (three-signal OR-gates in
test_feedback_keepalive + test_standing_teammate_spawn), and #172 (lazy
standing-teammate-spawn) — all landed on main between #186's cycle-1
dispatch and this cycle-3 re-dispatch — together constitute the de-facto
mechanism fix: no additional production change is needed to meet AC-4
at 5/5 on opus-4-7.
AC-7 per cycle-3 dispatch: once mechanism-fix verification hits 5/5 on
opus-4-7 locally, flip the CI default back. All five AC-4 verify runs of
tests/test_feedback_keepalive.py on opus-4-7 --effort low PASSED cleanly
(see prior commit's evidence under docs/plans/_evidence/). Zero `task_id`
errors, validation dispatch observed within 240s in every run.

This reverts #181's pin in:
  - Makefile: `OPUS_MODEL ?= claude-opus-4-6` -> `OPUS_MODEL ?= opus`
  - .github/workflows/runtime-live-e2e.yml: both `EFFECTIVE_MODEL` and
    `MODEL_FLAG` defaults revert to `opus`
and removes the inline `# Pinned to ...` comments.

The $(OPUS_MODEL) plumbing and `--model "$MODEL_FLAG"` override path
from #181 are preserved — they remain useful as an override knob.
…C-7 unpin DONE

- AC-3: 3/3 PASS on opus-4-7 local; per-run fo-log line-number + tool_use_id
  citations recorded. None of symptoms (i)/(ii)/(iii)/(iv) reproduce —
  effective mechanism fix = #183 + #185 + #172 combined landing on main.
- AC-4: 5/5 PASS on opus-4-7 --effort low (wallclocks 131/118/175/119/121s).
- AC-7: unpin committed in 4f736d1d (Makefile + runtime-live-e2e.yml only;
  HARD scope fence against skills/first-officer/references/* respected).
- Post-unpin opus-4-6 regression PASS (99.7s); static suite 435 passed.
- AC-5 / AC-6 deferred to validation stage per dispatch step 11.
- Budget ~$8.50 vs $80 ceiling.
…on opus-4-7 local

Single `make test-live-claude-opus OPUS_MODEL=opus` run on branch tip
a9c78e8 (with unpin commit a730858 in place). Exit 0.

Serial tier: 1 passed, 3 skipped, 1 xpassed, exit 0 (161s)
Parallel tier: 3 passed, 3 skipped, 8 xfailed, 2 xpassed, exit 0 (914s)
Combined wallclock: ~18 min.

All four non-XFAIL/non-SKIP tests PASSED on opus-4-7:
- test_gate_guardrail (serial)
- test_feedback_keepalive (parallel/gw3)
- test_merge_hook_guardrail (parallel/gw3)
- test_standing_teammate_spawn (parallel/gw1)

Cycle-3 CI failures (test_standing_teammate_spawn StepTimeout;
test_gate_guardrail Phase-3 checks) did not reproduce locally. Unpin
gate satisfied per captain's cycle-4 scope reframe (1x full-suite =
unpin gate; CI handles reliability after merge). Unpin commit
a730858 retained.

Evidence: docs/plans/_evidence/green-opus-4-7-full-suite/cycle4-fullsuite-run1.log
…ocally on opus-4-7; gate-guardrail evidence vacuous (test ignores --model)

Four isolation runs at opus-4-7 low-effort with KEEP_TEST_DIR=1:

- test_standing_teammate_spawn: 0/2 FAIL. Reproduces reliably in isolation.
  Root cause is the watcher predicate for "SendMessage to echo-agent"
  matching the FO's own shutdown_request during teardown (Category A,
  pre-existing #185 surface). Ensign's ping->ECHO roundtrip happens
  inside the subagent transcript, invisible to the parent fo-log.
  Archive body lacks "ECHO: ping" in both runs; run 2 shows the FO
  tearing down cleanly at $1.52/95s before the ensign completes
  (Category C3 signal; explicitly out-of-scope for #186).

- test_gate_guardrail: 2/2 PASS but evidence is vacuous. Test source
  at tests/test_gate_guardrail.py:48-52 passes no --model to extra_args
  and the test signature doesn't accept the model fixture, so the
  --model claude-opus-4-7 CLI flag is silently ignored. Both runs ran
  on claude-sonnet-4-6. Fixing this requires plumbing the model fixture
  through extra_args similar to test_feedback_keepalive.

Recommendation: BOUNCE for investigation. Do NOT merge the unpin.
standing_teammate needs a Category-A predicate fix and a C3 scope
decision; gate_guardrail needs model-fixture plumbing before any
future cycle can claim opus-4-7 coverage.

Budget spend: ~$4.4 of ~$10 allotted.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…e cycle 1-5 reports

Three changes bundled per captain dispatch:

1. tests/test_gate_guardrail.py — plumb `model` + `effort` fixtures through
   to `extra_args`. Cycle 5 proved the test was silently running on haiku/sonnet
   even under `--model opus-4-7`, making all prior "gate_guardrail green on
   opus-4-7" claims vacuous.

2. .github/workflows/runtime-live-e2e.yml — check out the merged head
   (`refs/pull/<N>/merge`) instead of the bare PR head SHA across all five
   jobs. Testing the post-merge tree catches base-drift: #128/#129 hit flakes
   this session that would not have shown up against post-#188 main. Security
   model unchanged (env-approval gate stays the trust boundary); comment +
   `tests/README.md` + `test_runtime_live_e2e_workflow.py` updated to match.
   Per-job provenance now prints the PR head SHA ("diff under review") AND
   the resolved merge SHA recorded post-checkout, so audit links remain
   meaningful.

3. docs/plans/green-opus-4-7-full-suite.md — condense stage reports for
   ideation cycles 1-2 + implementation cycles 1/3/4/5 into summary lines
   retaining all factual outcomes, commit SHAs, and evidence-file paths.
   513 → 201 lines before appending cycle 6's report.
… parallel tier)

Cycle-6 one-shot `make test-live-claude-opus OPUS_MODEL=opus` hit exit 1
after 5m03s: serial-tier `test_gate_guardrail` PASSED on real opus-4-7 (first
non-vacuous pass — cycle-6 fixture-plumbing fix worked), but parallel tier's
three non-XFAIL tests (keepalive, merge_hook, standing_teammate) all FAILED
with `api_error_status: 429` and `<synthetic>` "You're out of extra usage"
responses. Account quota hit ~5 min into the parallel tier; reset at 3am PT.

Triage: failures are NOT base-drift (merge-ref migration can't cause an
account-side quota), NOT the #194 FO ECHO: ping flake (no ECHO: ping watchers
fired — quota hit before first ensign dispatch), NOT an opus-4-7 mechanism
regression (cycle 3's 5/5 + cycle 4's 1/1 proved the runtime-under-budget
works; cycle 6's serial-tier gate_guardrail PASS on real opus-4-7 confirms).

Per dispatch spec verdict tree: "any failure NOT attributable to #194 →
flag for captain triage". Recommendation: HOLD branch, re-run
`make test-live-claude-opus` after 3am PT quota reset; do NOT revert unpin
preemptively; do NOT merge until a clean full-suite run lands.

Evidence: docs/plans/_evidence/green-opus-4-7-full-suite/cycle6/
          cycle6-fullsuite-run1.log (501 lines — preserves all three
          StepFailure traces with the embedded 429 / synthetic records).
@clkao clkao force-pushed the spacedock-ensign/green-opus-4-7-full-suite branch from a9c78e8 to 3c0c521 Compare April 18, 2026 16:27
clkao added a commit that referenced this pull request Apr 18, 2026
@clkao clkao merged commit 438ba5a into main Apr 18, 2026
4 of 5 checks passed
@clkao clkao deleted the spacedock-ensign/green-opus-4-7-full-suite branch April 18, 2026 16:55
clkao added a commit that referenced this pull request Apr 18, 2026
…npin validated, only red was bare-mode test_feedback_keepalive brittle watcher tracked by #190)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant