Skip to content

docs(plan): record Phase 5 equivalence + sweep evidence - #287

Merged
kyle-sexton merged 3 commits into
mainfrom
docs/claude-lane-phase5-equivalence-evidence
Jul 29, 2026
Merged

docs(plan): record Phase 5 equivalence + sweep evidence#287
kyle-sexton merged 3 commits into
mainfrom
docs/claude-lane-phase5-equivalence-evidence

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Summary

Records Phase 5 close-out evidence in docs/topics/claude-review-lanes/PLAN.md. One file, additive only — no plan requirement is restated, reinterpreted, or amended, and the phase tag stays [TODO] because three of the five bullets are not fully closed.

Of Phase 5's five bullets: two are fully closed with evidence (trailer note, do-not-break sweep), one is half-closed (equivalence — the medley half done, the blob-hash half blocked), and two remain outstanding (README/CLAUDE.md, and "tags advanced", which cannot close while the others are open).

The medley REVIEW.md equivalence result inverts the bullet's own framing, which is the substantive finding here. medley's REVIEW.md is not a drifted copy of the managed source — it is an independently authored 188-line document with its own slice taxonomy, first added in 4a1d61a6, never synced from standards. So the absent lane-scope headings are not the finding. The restructure's mutual-exclusion rule is conditional on a named file (standards REVIEW.md:66-73): it suppresses security findings only on a repository that runs the security lane, and otherwise directs "report security findings under this lane too". medley has no claude-security-review.yml and no caller routing to that reusable, so it sits in the else branch — folding security in is correct, and adopting the mutual-exclusion text would have produced the 2f-addendum failure mode of no lane reporting security findings.

The real drift is the one always-check that is not security-gated: multi-location atomicity (standards REVIEW.md:82-86) has no universal-checklist line in medley, and its nearest coverage self-scopes to "EF Core persistence in the modular monolith" while medley is polyglot. Filed as melodic-software/medley#1671. medley's file was not edited — review-instructions is locally-owned for medley, which is the customization seam working as intended.

The standards repo-local caller blob-hash equivalence is recorded as NOT DONE and blocked on standards#286 rather than quietly omitted — a sanity block that hides an unrun check is worse than one that names it.

Test plan

No executable surface changes; this is a documentation-only diff to a planning artifact. Verification was of the claims recorded, not of code:

Verification honesty note. Three fresh-context verifier rounds ran; all three returned REJECT, and each caught a defect introduced while fixing the previous one:

All are corrected in place with the error named rather than edited away. This is recorded because the pattern — each fix round introducing a new error — is the substantive risk in this work, not an incidental detail.

Related

No linked issue — Phase 5 is tracked as a phase of the claude-review-lanes Brief in docs/topics/claude-review-lanes/PLAN.md, not as a ci-workflows issue.

Referenced, not closed by this PR:

Closes three of Phase 5's five bullets with evidence and names the two that
remain, so the phase tag stays [TODO] rather than advancing past what the
evidence supports.

The medley equivalence result inverts the bullet's own framing. The absent
lane-scope headings are not the finding: the restructure's mutual-exclusion
rule is conditional on a claude-security-review.yml workflow medley does not
have, so medley folding security into its code-review lane is correct, and
adopting the managed text would have produced the 2f-addendum failure mode of
no lane reporting security findings. The real drift is the one always-check
that is not security-gated -- multi-location atomicity -- filed as medley#1671
without editing medley's locally-owned file.

The blob-hash equivalence is recorded as NOT DONE and blocked on standards#286
rather than omitted, so the sanity block does not hide an unrun check.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013pLW2dybov9xvTFtx48Ueb
@claude

claude Bot commented Jul 29, 2026

Copy link
Copy Markdown

Claude encountered an error after 0s —— View job


I'll analyze this and get back to you.

@github-actions

Copy link
Copy Markdown

Warning

Automated review did not complete — this is an infrastructure failure, not a review verdict.

Treat any Claude comment on this PR (including a placeholder like "I'll analyze this and get back to you") as incomplete, not "no findings."

Re-run the job to retry the review. A new push does not re-trigger this lane.
An automatic retry may already have run — it is skipped when a partial review could duplicate comments, or when the failure class needs an operator (auth).

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0229194b59

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/topics/claude-review-lanes/PLAN.md Outdated
kyle-sexton and others added 2 commits July 29, 2026 00:29
Four corrections, all caught by an independent verifier:

- security-lane always-checks are FOUR, not five; abeccc6's own commit message
  says four. The audit-log check cited as a fifth is a code-review-lane
  observability check that REVIEW.md:79-81 explicitly assigns away from the
  security lane.
- the :65/:66 -> security.md citation mapping was inverted; :66 is
  object-level authorization (security.md:18) and :65 is secrets/injection
  (security.md:7, :11).
- bullet arithmetic overstated completion: two of five bullets are fully
  closed, one is half-closed, two remain.
- the final bullet ("tags advanced") was in neither the closed set nor the
  remaining list; it cannot close while the other two are open.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013pLW2dybov9xvTFtx48Ueb
The block claimed two verifier rounds and stated the round-2 remediations had
not been independently re-verified. Both were false: round 3 re-verified them
and returned REJECT, and there have now been four rounds. PLAN.md is the
artifact that ships, so the durable record understated the review while the
PR body confessed in full -- the direction that flatters.

Now records all four rounds, each round's findings including the two defects
in this block itself, and the recurring failure mode: compression, not
research. Round 4's two non-blocking findings are recorded as named gaps
rather than remediated, to stop the fix-and-reverify cycle.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013pLW2dybov9xvTFtx48Ueb
@kyle-sexton

Copy link
Copy Markdown
Contributor Author

No description provided.

@kyle-sexton
kyle-sexton merged commit 9f5458d into main Jul 29, 2026
36 of 38 checks passed
@kyle-sexton
kyle-sexton deleted the docs/claude-lane-phase5-equivalence-evidence branch July 29, 2026 13:21
kyle-sexton added a commit that referenced this pull request Jul 29, 2026
## Summary

Two factual corrections to `docs/topics/claude-review-lanes/PLAN.md`,
the
approved specification. Corrections only — no requirement is added,
removed,
or re-scoped beyond the two named defects, and no phase tag moves (tag
inventory verified byte-identical against `origin/main` for `[DOING]`,
`[DONE]`, `[TODO]`, `[GATE]`, `[USER-RESERVED]`, `[USER-APPROVAL GATE]`,
`[FALLBACK …]`, `[EXEC-SHAPE]`).

**Defect A — Phase 3c's security-gate check was under-scoped.** It asked
only
that the claude-code-plugins ruleset string `security-review /
security-review`
be intact. But claude-code-plugins carries **zero** repo-local rulesets
(`gh api repos/…/rulesets?includes_parents=false` → `[]`); the gate is
org
ruleset `19388547`, whose `repository_property` condition scopes it to
repos
where the custom property `requires-security-review` is `"true"`. That
property
is `org_actors`-editable and defaults `"false"`, and is currently `true`
on
exactly one of fourteen repos. So flipping the property on a repo — or
inverting the condition's own `property_values` — arms or disarms the
required
check with the context string byte-identical. The old check would have
passed
cleanly against a disarmed gate, and Phase 3d, which distributes the
security
caller fleet-wide, is exactly when that drifts. The check is now a
multi-part
invariant.

**Defect A′ — Phase 3c's queue-overflow criterion was unobservable as
written.**
It asked for an "overflowed-cancelled caller conclusion observed". A run
cancelled while pending appears to leave no check **run** at all, so
overflow
would present as check *absence*, not a `cancelled` conclusion. The
criterion
now probes that discriminator directly, with pass = the required check
reporting a documented-pass status (`success`, `skipped`, `neutral`) and
absence treated as a failure mode of equal weight. The supporting
observation
is recorded with both of its limits: it is **one** data point, and it
came from
pending eviction under `cancel-in-progress: false` with no `queue:` key,
which
is *adjacent* to `queue: max` overflow rather than the same mechanism.

**Defect B — Phase 3d's ordering instruction was wrong and would have
caused
the outage it prevents.** It said App access extends "BEFORE the
manifest PR
merges". Exposure is symmetric: the operative gate is a **cardinality**
check in
`standards-sync.yml`'s `attest` job, which aborts before the
`missing`/`excess`
set-diff is ever reached. Granting first fails
`installation reports 10 repositories; expected 8`; merging first fails
the
inverse. `attest` is a `needs:` of `sync`, so the whole matrix is
skipped —
fail-closed and self-clearing, nothing mutates, no target corrupted. The
mitigation is a tight window, not an ordering.

The 3d **mechanism** is corrected too: repository *selection* is
REST-addressable (`PUT
/user/installations/{installation_id}/repositories/{repository_id}`),
so the extension is an API call sequenceable to seconds rather than a
hand-timed UI click. Selection is **not** the same surface as
installation
*permissions*; 3a0's `workflows: write` grant stays the org-owner action
it is
documented as. Three consequential one-liners repeating the wrong
"BEFORE"
ordering are corrected in step: approval-record item 5, the `[GATE]`
line, and
the user-approval-gate line.

Volatile line-number citations are deliberately **not** reintroduced
(the old
text cited `standards-sync.yml:309-355`); the new text cites
`standards-sync.yml, attest` and the error-message fragment instead, so
it
stays correct across the pending sync-engine re-pin.

## Test plan

Documentation-only change; no runtime behavior. Verified mechanically:

- `markdownlint-cli2` on the file — 0 errors.
- Encoding: zero U+FFFD; em-dashes preserved as U+2014 — counted against
the
current base, `origin/main` = 128 and this branch = 143, net +15, all of
them
in added lines; U+2013 unchanged at 7 both sides; file remains UTF-8
with LF
endings. (An earlier figure in this description was measured before the
rebase
onto `origin/main`; the net delta was the same, the absolute counts were
not.)
- Wrap: added lines are ≤ 81 chars (three at 81), inside the file's own
existing
81–89 distribution for body prose; markdownlint MD013 is disabled here,
so the
  ~80 wrap is convention rather than an enforced rule.
- Scope: five hunks at exactly the five intended sites; phase-tag
inventory
  byte-identical to `origin/main`.
- The 3d bullet is re-wrapped as a whole to hold the wrap convention;
the text
after "Wave 1:" is **proven word-identical** to `origin/main` by a
token-level
  comparison, so the reflow changed wrapping only.
- Merge cleanliness: `git merge-tree --write-tree` against `origin/main`
before
and after #287 landed — clean auto-merge both times. Branch is now
rebased
  onto `origin/main` at `9416a0d`.

Every factual claim in the new text was re-derived from live state by
command
before being written (org ruleset `19388547` detail, the custom-property
schema
and its regenerated true-set, run `30172462100` and the check runs/suite
at
`d26dac6`, the `attest` job source, the manifest-derived expected
cardinality
of 8, installation `144867070`'s `repository_selection`, both new-target
repository ids, and the two quoted sentences against the current GitHub
OpenAPI description). An independent fresh-context verifier re-derived
both
corrections with the rationale withheld; its findings are incorporated —
the
three it raised as blocking (a cross-reference to a finding not present
in
PLAN.md, an actor claim that outran what the docs support, and the
queue-overflow mechanism mismatch) are each fixed in the text above.

## Related

No linked issue — this corrects the specification document for the
in-flight
claude-review-lanes effort.

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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