Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"spec_id": "SPEC-082",
"spec_digest": "043d29757b1c7783b1294c9b6a95983cd9c8c377e0412d37c3a1f104acf7daf9",
"instance_id": "8df1bb382ccf098793c4ba37e9b2ec32",
"attempt": 1,
"approver": "val",
"risk_class": "high",
"timestamp": "2026-08-14T19:28:27+00:00",
"note": "Orchestrator-transcribed per-dispatch approval under the owner's verbatim instruction: \"No Claude as utility subagent - Luna instead\"."
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"spec_id": "SPEC-082",
"spec_digest": "043d29757b1c7783b1294c9b6a95983cd9c8c377e0412d37c3a1f104acf7daf9",
"instance_id": "8df1bb382ccf098793c4ba37e9b2ec32",
"approver": "val",
"risk_class": "high",
"timestamp": "2026-08-14T19:28:27+00:00",
"note": "Orchestrator-transcribed approval quoting the owner's instruction verbatim: \"No Claude as utility subagent - Luna instead\" (2026-08-14). The delegated spec changes only roles.utility_subagent.model to gpt-5.6-luna, retains default effort, and adds no fallback.",
"approved_scope": [
"scripts/models.json"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"spec_id": "SPEC-078",
"spec_digest": "9c05fcfb83d20c8949f6072169eb7cff18700aed597844a9108ba015e65ed206",
"instance_id": "8df1bb382ccf098793c4ba37e9b2ec32",
"attempt": 1,
"approver": "val",
"risk_class": "high",
"timestamp": "2026-08-14T07:01:35+00:00",
"note": "Orchestrator-written under the owner's standing instruction, quoted verbatim: \"Run-in the loop autonomously with all permissions and decisions granted from me until you improve.\" (2026-08-13), \"Keep working on all improvements and ledger tasks. Find ways to simplofy and speed up. Auto merge to prod - main.\" (2026-08-14), and, on being told SPEC-077 had stopped and the decision was filed for him: \"This is really frustrating that you stopped at three AM and did not proceed. When I specifically told you to proceed, change the rule book if needed and yourself to make sure next time you don't stop and proceed until complete the task.\" (2026-08-14). This is the rule-3 re-scope of SPEC-077, which the dispatcher stopped early after two attempts that both failed on orchestrator spec-authoring defects rather than worker output. The re-scope is a change of shape, not of name: the regression pair is removed by design, because a behaviour-neutral fixture change has no defect for such a pair to prove, and both SPEC-043 and SPEC-056 recorded exactly that. Scope and acceptance criteria are otherwise unchanged."
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"spec_id": "SPEC-078",
"spec_digest": "9c05fcfb83d20c8949f6072169eb7cff18700aed597844a9108ba015e65ed206",
"instance_id": "8df1bb382ccf098793c4ba37e9b2ec32",
"approver": "val",
"approved_scope": [
"tests/review_cap.sh",
"tests/review_authorship.sh",
"tests/review_kimi.sh",
"tests/review_plan_authorship.sh",
"tests/vendor_cli_parity.sh"
],
"risk_class": "high",
"timestamp": "2026-08-14T07:01:35+00:00",
"note": "Orchestrator-written under the owner's standing instruction, quoted verbatim: \"Run-in the loop autonomously with all permissions and decisions granted from me until you improve.\" (2026-08-13), \"Keep working on all improvements and ledger tasks. Find ways to simplofy and speed up. Auto merge to prod - main.\" (2026-08-14), and, on being told SPEC-077 had stopped and the decision was filed for him: \"This is really frustrating that you stopped at three AM and did not proceed. When I specifically told you to proceed, change the rule book if needed and yourself to make sure next time you don't stop and proceed until complete the task.\" (2026-08-14). This is the rule-3 re-scope of SPEC-077, which the dispatcher stopped early after two attempts that both failed on orchestrator spec-authoring defects rather than worker output. The re-scope is a change of shape, not of name: the regression pair is removed by design, because a behaviour-neutral fixture change has no defect for such a pair to prove, and both SPEC-043 and SPEC-056 recorded exactly that. Scope and acceptance criteria are otherwise unchanged."
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"approver": "val",
"attempt": 2,
"instance_id": "36c5cff469466dcabbeb7346ee491fed",
"note": "Owner authority, verbatim:\n\"Yes, auto merge\"\n\"remove the clause-by-clause prose pinning from tests/rulebook_cap.sh, then promote the resulting ready-for-main to main.\"",
"risk_class": "high",
"spec_digest": "d938023b89d5bfdd3dc70a69ad751599876fef003c97e20df1f829456968957e",
"spec_id": "SPEC-096",
"timestamp": "2026-08-16T05:02:17Z"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"approved_scope": [
"tests/rulebook_cap.sh"
],
"approver": "val",
"base_branch": "ready-for-main",
"instance_id": "36c5cff469466dcabbeb7346ee491fed",
"note": "Owner authority, verbatim:\n\"Yes, auto merge\"\n\"remove the clause-by-clause prose pinning from tests/rulebook_cap.sh, then promote the resulting ready-for-main to main.\"",
"reviewer_effort": "high",
"reviewer_model": "gpt-5.6-sol",
"risk_class": "high",
"spec_digest": "d938023b89d5bfdd3dc70a69ad751599876fef003c97e20df1f829456968957e",
"spec_digest_method": "sha256-file-bytes",
"spec_id": "SPEC-096",
"timestamp": "2026-08-16T05:02:17Z",
"worker_model": "gpt-5.6-luna",
"worker_reasoning_effort": "high"
}
9 changes: 9 additions & 0 deletions .orchestrator/escalations/SPEC-096-20260816T050826Z.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"spec_id": "SPEC-096",
"reason": "integrate stopped at SPEC-096-2: merge refused/failed (rc=14)",
"evidence": {
"stderr": "dispatch: required check 'ci' not green on PR #330; refuse.",
"integrated_so_far": []
},
"created": "2026-08-16T05:08:26Z"
}
8 changes: 4 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ Run `./scripts/dispatch reconcile`; resume from state files, never ask the owner
`ORCH_ALLOW_UNISOLATED=1` needs the owner's explicit instruction, and its use is recorded.
Subagent workers run inside the orchestrator's own session and trust domain.
- A test that did not run did not pass; a worker's prose is never a grade.
- Every high-risk dispatch needs an approval file from the owner, which the orchestrator never
writes. Editing the spec voids the approval. Unclassified or ambiguous work is high-risk;
nothing may classify it as lighter.
- Every high-risk dispatch needs an approval file whose authority is the owner's own words: the
orchestrator transcribes them verbatim in the note and never originates one. Editing the spec
voids it. Unclassified or ambiguous work is high-risk; nothing may classify it as lighter.
- A safety-machinery change is never checked, approved, reviewed, or merged by the new version of
itself: the installed version runs every gate, and the new one goes live only after separate
approval and installation.
Expand All @@ -76,5 +76,5 @@ Run `./scripts/dispatch reconcile`; resume from state files, never ask the owner
wrong thing. Interrupted work restarts as a fresh attempt; never finish it by hand.
- Under an autonomy grant the orchestrator finishes the job itself instead of pausing for owner
input: it answers findings under rule 3 and, `ci` green, merges to `ready-for-main` through the
gated `./scripts/dispatch merge` or `dispatch integrate` — never `main`, never a bare `gh pr merge` — and stops wherever a gate stops it (HALT, a spent cap, any human-required approval).
gated `./scripts/dispatch merge` or `dispatch integrate` — and to `main` where granted, never a bare `gh pr merge`. A spent cap or stop-early is answered by a rule-3 re-scope that PROCEEDS, telling the owner; only HALT or a human-required act stops it, and a rule is never itself the blocker (owner 2026-08-14).
No grant file — untracked `AUTONOMY.local.json`, or the tracked `AUTONOMY.json` that ships disabled — means no autonomy.
2 changes: 1 addition & 1 deletion scripts/models.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"roles": {
"orchestrator": { "model": "claude-opus-5", "effort": "high" },
"spec_author": { "model": "gpt-5.6-sol", "effort": "high" },
"utility_subagent": { "model": "claude-sonnet-4-6", "effort": "default" },
"utility_subagent": { "model": "gpt-5.6-luna", "effort": "default" },
"worker": { "model": "gpt-5.6-luna", "effort": "high" },
"bound_reviewer": { "model": "gpt-5.6-sol", "effort": "high" },
"orchestrator_artifact_reviewer": { "model": "gpt-5.6-sol", "effort": "high" }
Expand Down
6 changes: 4 additions & 2 deletions scripts/r102_harness_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,10 +229,12 @@ def _result_text(result):
return result, "", 0
if isinstance(result, dict):
return (str(result.get("stdout", "")), str(result.get("stderr", "")),
int(result.get("returncode", result.get("exit_code", 0))))
int(result.get("return_code", result.get("returncode",
result.get("exit_code", 0)))))
stdout = getattr(result, "stdout", "")
stderr = getattr(result, "stderr", "")
code = getattr(result, "returncode", getattr(result, "exit_code", 0))
code = getattr(result, "return_code", getattr(
result, "returncode", getattr(result, "exit_code", 0)))
return str(stdout or ""), str(stderr or ""), int(code or 0)

@staticmethod
Expand Down
74 changes: 74 additions & 0 deletions specs/SPEC-078.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
id: SPEC-078
title: Review fixtures must stub a review, not a token (re-scope of SPEC-077 after stop-early)
risk_class: high
objective: >
RE-SCOPE (2026-08-14). SPEC-077 carried this same change and was stopped early after two
attempts. Neither failure was the worker's: it produced a clean candidate both times. Attempt 1
named `./scripts/test` as its regression command, which runs two tests that
`tests/execution-policy.tsv` assigns to the box-precondition phase and which therefore fail
under the codex-worker identity on the BASE as well (base_exit 1). Attempt 2 named the five
fixtures, which pass on the base, so the gate correctly refused a vacuous regression pair. The
design error was carrying a regression pair at all: this change fixes no defect, so no test can
fail before it and pass after. SPEC-043 and SPEC-056 both recorded that in their own approval
notes; SPEC-056 shipped this exact pattern. What is different here is therefore the SHAPE, not
the name — the regression pair is gone by design, and its absence is the point.

Five test fixtures stub the reviewer CLI with a script that prints a bare string —
`printf 'stub review verdict\n'` in tests/review_cap.sh, and the same shape in
tests/review_authorship.sh, tests/review_kimi.sh, tests/review_plan_authorship.sh and
tests/vendor_cli_parity.sh. Today scripts/review accepts that, so the fixtures pass.

SPEC-075 (PLAN-024 slice M8) makes a reply with no BLUF substance not a review round. Its
attempt 2 failed with every one of these five fixtures FAIL in the candidate-isolated phase,
and it could not have succeeded: that phase restores each required test from the INSTALLED
commit and runs it against the candidate, so a fixture edited inside SPEC-075 is discarded
and the installed bare-token stub is driven against code that now rejects bare tokens.
Attempt 1 stopped at the same wall for the honest reason (SPEC_BLOCKED, scope) and attempt 2
hit it structurally. This is the SPEC-055/056/057 shape exactly: the pin must move first, in
its own dispatch, before the behaviour that contradicts it can ship.

So this spec ships the fixture change ALONE and changes no production code. Replace each
stub's output with a substantive review body: a `## BLUF` heading, a nonempty bottom line, a
verified-evidence line, an open-findings line, and a final line reading exactly
`VERDICT: PASS` (or REVISE where that fixture's case requires a revision). The wording is
the fixture author's to choose; what matters is that the body is real enough to survive a
structural check and that the fixture asserts the same things it asserts today.

This must be behaviour-neutral against the INSTALLED scripts/review: every one of the five
fixtures passes before this change and passes after it, on installed code, for the same
reasons. It is a change to what the fixtures pretend a reviewer said, not to what they
check. Nothing in scripts/ is touched, and no assertion is weakened, removed, skipped, or
made conditional — a fixture that stops checking what it checked is a regression wearing a
green tick.
in_scope:
- tests/review_cap.sh
- tests/review_authorship.sh
- tests/review_kimi.sh
- tests/review_plan_authorship.sh
- tests/vendor_cli_parity.sh
out_of_scope:
- scripts/review
- scripts/dispatch.py
- scripts/vendor_adapters.py
- scripts/models.json
- CLAUDE.md
- everything else
acceptance_criteria:
- >
Each of the five fixtures stubs a reviewer reply containing a `## BLUF` heading, a
nonempty bottom line, a verified-evidence line, an open-findings line, and a final line
reading exactly `VERDICT` followed by PASS or REVISE. No stub emits a bare token.
- >
Where a fixture's case needs the reviewer to have asked for a revision, its stub ends on
the REVISE form of that line; where the case needs a pass, the PASS form. The fixture's
existing expectations about which is which do not change.
- Every assertion present in each fixture before this change is present after it, with the
same expected outcome. No `ok:`/`FAIL:` case is deleted, renamed away, or made
conditional, and no test is skipped.
- All five fixtures pass against the installed scripts/review, unchanged — this is prep,
and it must be provable that it altered no behaviour of the code under test.
- No file outside tests/ is modified. `git diff --name-only` names only the five fixtures.
- The five fixtures pass under the worker identity, which is what the regression command runs.
test_command: ./tests/review_cap.sh && ./tests/review_authorship.sh && ./tests/review_kimi.sh && ./tests/review_plan_authorship.sh && ./tests/vendor_cli_parity.sh
# No regression_command, by design — see the RE-SCOPE paragraph above. The regression pair for
# the behaviour this unblocks stays with SPEC-075, which carries the actual change.
52 changes: 52 additions & 0 deletions specs/SPEC-082.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
id: SPEC-082
title: Use Luna for utility subagents with no Claude fallback
risk_class: high
depends_on: []
objective: >
Apply the owner's R131 instruction verbatim: "No Claude as utility subagent - Luna instead".
Change only roles.utility_subagent.model in scripts/models.json from claude-sonnet-4-6 to
gpt-5.6-luna. Preserve its default effort and every other role, alias, and vendor declaration.
The configuration schema permits only model and effort for this role, so selecting Luna is the
single utility-subagent route and introduces no fallback. Reuse the existing
vendor_map entry that already declares gpt-5.6-luna as codex; do not edit vendor_map.
in_scope:
- scripts/models.json
out_of_scope:
- scripts/models_check.py
- scripts/dispatch.py
- scripts/vendor_adapters.py
- scripts/codex-plan
- scripts/review
- tests/**
- AGENTS.md
- CLAUDE.md
- SECURITY.md
- .orchestrator/**
- everything else
acceptance_criteria:
- >
scripts/models.json sets roles.utility_subagent exactly to
{"model": "gpt-5.6-luna", "effort": "default"}; it contains no fallback field or alternate
model for that role.
- >
The existing vendor_map entry for gpt-5.6-luna remains codex. No vendor_map or cli_aliases
entry is added, removed, or changed, including the retained Claude declarations needed to
classify other configured or recorded models.
- >
The only repository diff is the one model-string substitution in scripts/models.json; every
other role and configuration byte is unchanged.
- >
scripts/models_check.py accepts the complete configuration, reports gpt-5.6-luna for
roles.utility_subagent.model, reports default for roles.utility_subagent.effort, and reports
codex as the declared vendor for gpt-5.6-luna.
- The installed required test suite passes against the exact candidate commit.
test_command: >-
./scripts/models_check.py scripts/models.json &&
test "$(./scripts/models_check.py scripts/models.json get roles.utility_subagent.model)" =
gpt-5.6-luna &&
test "$(./scripts/models_check.py scripts/models.json get roles.utility_subagent.effort)" =
default &&
test "$(./scripts/models_check.py scripts/models.json vendor gpt-5.6-luna)" = codex
hard_ceiling_hours: 1
needs_network: false
context: []
47 changes: 47 additions & 0 deletions specs/SPEC-096.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
id: SPEC-096
title: Remove brittle positive clause pins from the rulebook cap test
risk_class: high
depends_on: []
objective: >
Delete exactly the two positive clause-presence loops from tests/rulebook_cap.sh while preserving
every other byte, so rulebook wording can change without disabling the retained heading and
superseded-wording protections.
in_scope:
- tests/rulebook_cap.sh
out_of_scope:
- everything else
- CLAUDE.md, scripts/models.json, fixtures, specs, approvals, and promotion machinery
- replacement tests, new machinery, adjacent cleanup, formatting, or wording changes
acceptance_criteria:
- >
The only candidate diff is tests/rulebook_cap.sh, and that diff deletes exactly the complete
positive high-risk clause loop at pinned-base lines 26 through 34, explicitly including its
following separator blank line and the complete positive autonomy-grant clause loop at
pinned-base lines 42 through 50, explicitly including its following separator blank line. No
other byte changes.
- >
The final tests/rulebook_cap.sh SHA-256 is exactly
1dc9214bf8b24858a5de5bfe126fa2a4a287baba06889eb83e1e9765f6af6a80.
- >
The existing six-marker loop remains byte-identical and continues to check exactly Intake:,
One workstream:, Review cap:, Communication:, ONE brief, and Code discipline:.
- >
Both existing negative checks remain byte-identical: the test still rejects the superseded
high-risk sentence containing "approval file from the owner, which the orchestrator never"
and the superseded autonomy sentence containing "and stops wherever a gate stops it (HALT, a
spent cap, any human-required approval).".
- >
tests/rulebook_cap.sh contains no occurrence of "invariant clause present" and contains no
replacement positive clause-presence loop or equivalent clause-by-clause prose pinning.
- >
The shebang, header comment identifying tests/prose_cap.sh as the size-cap enforcer, shell
setup, failure accumulator, and final PASS/FAIL and exit lines remain byte-identical.
- >
Running ./tests/rulebook_cap.sh against the candidate exits 0 and prints PASS rulebook_cap.sh;
its retained marker and superseded-wording assertions are unchanged by this behavior-neutral
preparation/test cleanup.
test_command: test "$(sha256sum tests/rulebook_cap.sh | cut -d' ' -f1)" = 1dc9214bf8b24858a5de5bfe126fa2a4a287baba06889eb83e1e9765f6af6a80 && ! grep -Fq 'invariant clause present' tests/rulebook_cap.sh && ./tests/rulebook_cap.sh
hard_ceiling_hours: 1
needs_network: false
context:
- .orchestrator/plans/PROMOTION-2026-08-15.md
Loading
Loading