Skip to content

Promote: R127 minimal-path gate, R128 instance-level review, R102 opus-5 slots, README - #316

Merged
iselur merged 22 commits into
mainfrom
ready-for-main
Aug 11, 2026
Merged

Promote: R127 minimal-path gate, R128 instance-level review, R102 opus-5 slots, README#316
iselur merged 22 commits into
mainfrom
ready-for-main

Conversation

@iselur

@iselur iselur commented Aug 11, 2026

Copy link
Copy Markdown
Owner

Promote ready-for-main to main: three shipped slices plus the README rewrite.

Every slice in this union already carried its own green ci and its own passing review. This is
one round on the union, per the promotion invariant, not a fresh ladder.

Tracked markdown: 538/540 lines, 42,578/60,000 bytes.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Qf23KhWPPDWVQZq8rAiGK5

iselur and others added 22 commits August 9, 2026 11:57
R122 burned ~24 worker attempts building fidelity machinery for a goal the
installed benchmark path already served. Rule 5's "smallest end-to-end run"
clause was present in that program's plan and the plan reviewer passed it
anyway, because nothing about it was checkable.

Two changes make the question structural instead of advisory:

- rule 8 now runs the deletion test BEFORE a spec exists — name what the
  definition of done needs that installed code cannot do; nothing means no
  spec. Every phrase of the old rule is preserved verbatim ("at least as
  simply", "at brief and diff review", "existing external contracts"); the
  pre-spec checkpoint is the only addition, and the rulebook stays at 80/80.
- `## Minimal existing path` becomes a required brief section, so codex-plan
  refuses a brief without it. It demands the run's own evidence — exact argv,
  installed commit, input digests, exit status, complete output — because an
  author who must paste what the command printed cannot cheaply assert that it
  was insufficient. The review framing makes its absence a plan-review FAIL.

The new test asserts the prompt demands each piece of that evidence, not just
that the heading exists; it caught a line-wrapped "exit status" in the first
draft of the prompt, which a heading-only check would have shipped.

Deferred to the backlog with their evidence: a launch-time fence against
concurrent HEAD moves, and reviewer-driven scope growth (~6 of the burned
attempts), whose first step is reading those reviews against the REVISE bar
rather than building machinery on a guess.

Plan: PLAN.md (untracked working file), ledger row R127. Tracked markdown is
now exactly at its 540-line cap.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A5zsPfDCp4naXCnEcnVWrb
The first commit added the section to the brief PROMPT and to the test's
heading list, but never to the parser's required-heading list — so a brief
could omit "## Minimal existing path" entirely and still be accepted. The gate
was advice wearing a gate's clothes, and CI passed because no test asserted the
promise, only the heading.

- add the section to the parser's required list, which is what refuses a brief
- test that omitting it is refused, and that an empty one is refused. Verified
  by mutation: removing the parser entry makes the new test fail with exactly
  "a brief with no 'Minimal existing path' section was accepted", and the file
  digest is restored identical afterwards
- the prompt must also demand the COMPLETE output, now asserted with the rest
- --help's anatomy list named eleven sections; it names twelve now
- the review framing said "no pasted argv, commit, digests, exit status and
  complete output", which reads as requiring all five to be missing. Any one
  missing is now explicitly a FAIL
- drop the concurrent-HEAD backlog entry: unrelated to this diff (rule 8 keeps
  diffs surgical), it goes in with the slice that addresses it

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A5zsPfDCp4naXCnEcnVWrb
Scope discipline, not disagreement: rule 8 keeps diffs surgical and these two
entries belong to the slices that address them, not to the plan-time gate. The
knowledge is not lost — both live in PLAN.md and in this PR's description, and
they go in with their own slice.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A5zsPfDCp4naXCnEcnVWrb
loops: minimal-path gate at plan time (R127 slice 1)
Owner, 2026-08-09 (verbatim): "'nothing reviews its own work' - means that
same instance is not doing that, not that the same model cannot do it" and
"Yes do the change relaxation, I think it's better sol reviewing sol over
Luna reviewing sol". Rule 7 has said instance-level since 2026-08-06; the
script was deliberately stricter, and the backlog carried the relaxation.

- scripts/review: drop the recorded-model-equality refusal. Every invocation
  spawns a fresh reviewer instance, so a recorded author model proves the
  review is never the author's own context — even on the same model. The
  vendor-wide refusal stays where NO author model is on record: there the
  asserted --author is the only word we have, and fail-closed beats guessing.
- models.json: orchestrator_artifact_reviewer luna -> sol (owner's pick).
- Tests: the same-model fixtures flip from expect-refusal to expect-run
  (review_authorship 3, review_plan_authorship 3 and 16b, review_kimi c);
  review_cap case 2 becomes a vendor-only fixture (worker-worktree path, no
  recorded model) so the surviving arm keeps a direct test. Full suite: 48
  PASS, environment SKIPs only.
- AGENTS.md / SECURITY.md gap 8: describe the instance-level rule; gap 8's
  residual holes are now classification-only (path-classified worktrees,
  unstamped fallback), both still closing with a dispatch-written receipt.

First natural comparison for the owner's reviewer question: plan-001 round 1
was reviewed by Luna before the flip; round 2 runs under Sol on the same
artifact.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A5zsPfDCp4naXCnEcnVWrb
The installed reviewer confirmed the condition and tests, then caught the
prose still claiming the old rule. Fixed:
- SECURITY.md tested-guarantee row: says the surviving promise (vendor-wide
  refusal only where no author model is recorded; a recorded model runs) and
  points at gap 8 for the stamp being unauthenticated.
- Gap 8: states plainly that rule 7 is held by construction (fresh instance
  per invocation), never proven per artifact; that any known author_model
  stamp suppresses the vendor refusal entirely; and that an unstamped
  artifact asserting another vendor routes unrefused. No more "classification,
  not pairing" softening.
- scripts/review header: same correction at the top, where readers start.

Kept over the reviewer's cleanup note (nonblocking, rule 3): the backlog line
on the reviewer-pairing experiment — the owner asked for it by name.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A5zsPfDCp4naXCnEcnVWrb
The owner ruled any opus-4-8 pin wrong ('use everything with Opus 5'); the
benchmark row config was the only place still carrying it. Production
models.json never bound 4.8 to a role.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qf23KhWPPDWVQZq8rAiGK5
The orchestrator-evidence assertion pinned the old model literal; the row
config is the source of truth it was checking against.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qf23KhWPPDWVQZq8rAiGK5
review: instance-level self-review rule (rule 7); artifact reviewer -> Sol (R128)
chore: R102 Claude slots move to claude-opus-5
The old README described the system in category terms — a reusable oversight
approach, structured roles — which says what Relay is filed under rather than
what happens to a change. This says what actually happens, what the reader has
to do, and moves the scope limits into their own honest section instead of a
closing aside.

Tracked markdown stays inside the caps: README 58/100, total 538/540.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qf23KhWPPDWVQZq8rAiGK5
docs: rewrite the README in plain language
Round-1 review of the promotion union found two material overclaims in the
first rewrite, and the owner's objection was the opposite of subtle: it read
as a dumbed-down summary of a system that is mostly machinery.

Both are fixed by the same rewrite. It now names the two loops explicitly,
and then says what actually holds them up - bound specs and approval files,
worktree isolation with the external-CLI-versus-subagent distinction stated
rather than glossed, installed-test restoration at grading time, schema-validated
verdicts that bind only the diff they saw, instance-level self-review refusal,
capped attempts and capped review rounds, replayable per-attempt evidence, the
autonomy grant file, and the prose cap itself.

The two review findings, specifically:
  - isolation is no longer promised uniformly; the subagent worker sharing the
    orchestrator trust domain is stated in the same sentence as the guarantee.
  - promotion to main is no longer promised as an owner-only human stop; the
    gated orchestrator path and its two gates are stated.

tests/prose_cap.sh: total cap 540 -> 580, deliberately and under review, which
is the sanctioned way that test says to grow. Per-file caps are untouched, so
the room is not general. README 88/100, total 568/580.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qf23KhWPPDWVQZq8rAiGK5
docs: README describes the machinery; prose cap 540 -> 580 under review
Round 3 of the promotion review found three places where the README
promised more than the code holds. All three are corrected here.

  - approval files: the orchestrator is FORBIDDEN to write one, which is a
    rule with an audit trail, not a thing the filesystem prevents.
    SECURITY.md records that owner-context software can create them.
  - schema-validated verdicts: true of the bound worker-diff review, which
    checks against verdict.schema.json. NOT true of plan/artefact/promotion
    reviews, which are prose and gate nothing. Scoped accordingly - and the
    gap is real, since round 2 of this very topic passed on a bare token.
  - vendor separation: the harness guarantees a fresh instance and refuses an
    artefact its own model authored. Different VENDOR is an owner
    configuration choice in models.json, and models.json currently pairs
    same-vendor roles. Said plainly instead of promised.

README 94/100, total 574/580.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qf23KhWPPDWVQZq8rAiGK5
docs: README stops overclaiming three guarantees (promotion review round 3)
Two more overclaims, both introduced by the round-3 revision.

  - "plan and artefact reviews gate nothing" is false for a promotion:
    CLAUDE.md requires a binding PASS on the exact promotion diff, and a
    plan does not leave plan mode until its review is answered. The true
    statement is narrower - those reviews gate, they just are not schema
    validated - and that is now what it says.
  - "the tool refuses any artefact its own model authored" is the behaviour
    R128 deliberately replaced. scripts/review refuses same-vendor
    provenance with NO author model on record, because that is the case
    where instance separation cannot be shown; a recorded same-model author
    runs, since every invocation is a fresh instance. Described as built.

README 96/100, total 576/580.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qf23KhWPPDWVQZq8rAiGK5
Found by checking the remaining README claims against the code rather
than waiting for a sixth review finding. Three rounds of overclaims is
the signal, not the tenth.

The isolation sentence said an external-CLI worker "cannot reach the
owner's home directory or credentials". The first half is exactly what
tests/worker_isolation.sh asserts. The second half is broader than the
truth: SECURITY.md records that one vendor's setup stages a COPY of an
OAuth login inside the worker's own home, and says in terms that
"workers get no credentials" is not yet true and is not claimed. The
README now says the same thing.

Everything else in the file was re-checked and holds: spec schema
validation (Draft202012Validator against specs/spec.schema.json, dies on
invalid), digest-bound approvals (sha256 spec_digest in the approval
schema), per-worker worktrees (git worktree add --detach), installed-test
restoration and drift refusal, capped attempts and capped review rounds,
and every linked file exists.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qf23KhWPPDWVQZq8rAiGK5
docs: README gets the review rules right (promotion review round 4)
Blocking finding, and it was right: "the review that bound it" claimed
every attempt has a binding review on disk. Worker, scope, integrity,
test and regression failures terminate before review() is called, so
many recorded failed attempts have none. The replacement text here is
the reviewer's own, verbatim, at zero line growth - I did not write a
sixth version of a sentence that has now generated findings in three
consecutive rounds.

Nonblocking finding, also right: three comments still described the
same-model self-review refusal that R128 replaced with the instance-level
rule. The code and the assertions were already correct; only the comments
lied. Updated in place, no behaviour change.

review_cap.sh and review_authorship.sh pass. prose 579/580.

Round 5 was the last of this cap. Recorded in the handoff: the only
blocking finding was documentation, its fix is text the reviewer
dictated, and the behavioural slices in this union carried no blocking
finding in rounds 3, 4 or 5.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qf23KhWPPDWVQZq8rAiGK5
docs: answer promotion review round 5
@iselur
iselur merged commit fdb87b6 into main Aug 11, 2026
2 checks passed
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