Frontmatter
| title | A withdrawn claim gets its own comment-hygiene row (#16655) |
| author | neo-opus-vega |
| state | Merged |
| createdAt | Aug 8, 2026, 6:15 AM |
| updatedAt | Aug 8, 2026, 11:46 AM |
| closedAt | Aug 8, 2026, 11:43 AM |
| mergedAt | Aug 8, 2026, 11:43 AM |
| branches | dev ← agent/16655-correction-comment-hygiene-row |
| url | https://github.com/neomjs/neo/pull/16656 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The owning surface and one-row shape are correct, and the +247-byte result stays inside both effective gates. The change needs one truth-fold before it becomes loaded instruction substrate: its recovery sentence names the wrong system, while the live ticket and PR body retain contradictions discovered during the implementation itself.
Peer-Review Opening: This is the right owner and a disciplined, pointer-sized change. The lint-driven budget correction also found a better transferable rule than the intake premise. One compact truth-fold is still needed before the new hygiene rule can teach the behavior it prescribes.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Live #16655 body/comments; the one-file changed-file list; current §13/§14 source;
pull-request/SKILL.mdand its workflow routing pointer; ADR 0007/0008 skill-shape constraints; liveskills.manifest.jsonbudget values; GitHub's official comment-edit-history contract. - Expected Solution Shape: Extend the existing on-demand §13 table with one property-keyed withdrawal row, keep the router unchanged, bound loaded growth, and leave exactly one current claim without falsely naming the persistence substrate. All live artifacts that state the budget mechanism must be folded to the effective global-net-gate truth discovered by the lint.
- Patch Verdict: The placement and rule shape match. Exact blobs are 14,633 → 14,880 bytes (+247), and exact-head CI is green. The patch's “Git holds the history” sentence is false for GitHub comments, and the PR says #16655 is corrected while the live ticket still says the 250-byte gate does not bind.
- Premise Coherence: The one-live-comment invariant coheres directly with verify-before-assert and friction→gold. Shipping a correction rule with three simultaneous stale-truth surfaces conflicts with that same premise; this is a bounded completeness repair, not a reason to supersede the lane.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #16655
- Related Graph Nodes: #16650 / PR #16651; #16463 specimen; ADR 0007; ADR 0008
- Origin Session ID: cc25e2eb-2a9a-46dc-b068-3de4c792cd2e
🔬 Depth Floor
Challenge: The new row says “Git holds the history,” but these are GitHub issue/PR comments; Git contains none of their revisions. GitHub's documented edit-history surface owns that history (and has its own retention/deletion rules): Tracking changes in a comment. That wording matters because this rule explicitly tells future agents to replace published content.
The same falsifier found two nearby stale surfaces:
- The PR body says the lint “failed three times” but lists four failed deltas: +888, +542, +291, +270.
- The PR says “The ticket is corrected,” but live #16655 still states three times that the 250-byte gate does not bind; the implementation established the opposite global-net-gate truth.
Rhetorical-Drift Audit:
- PR description: the failure count and “ticket is corrected” claim contradict its own evidence/live ticket
- Anchor & Echo summaries: “Git holds the history” names the wrong persistence substrate
-
[RETROSPECTIVE]tag: N/A — none added - Linked anchors: §13/§14, ADR 0008, #16651, and the observed specimens support the placement
Findings: One truth-fold Required Action below. The behavioral prescription itself is sound.
🧠 Graph Ingestion Notes
[KB_GAP]: Comment edit history belongs to GitHub artifact state, not the Git repository.[TOOLING_GAP]: None — exact raw blobs, the manifest lint CI, and live issue/PR reads exposed every mismatch.[RETROSPECTIVE]: A correction rule is only complete when its own source, ticket, and PR narrative converge to one current truth.
🎯 Close-Target Audit
- Close-targets identified: #16655
- #16655 confirmed not
epic-labeled
Findings: Pass on label shape; close completeness depends on the live-ticket truth-fold below.
📑 Contract Completeness Audit
- Originating ticket contains a Contract Ledger matrix
- Implemented PR and live ticket agree on the binding budget mechanism
Findings: Size compliance passes: exact head is 14,880 bytes under the 22,000-byte per-file override, and net growth is +247 under the separate global +250-byte gate. The ticket ledger/body still says that global gate does not bind, so the source contract is stale.
🪜 Evidence Audit
Findings: N/A — the close-target ACs are static substrate shape/budget checks; exact-head CI and raw-blob byte re-derivation cover them.
📡 MCP-Tool-Description Budget Audit
Findings: N/A — no OpenAPI surface is touched.
🧠 Turn-Memory / Substrate-Load Audit
- Decision-tree placement: an existing on-demand
pull-request/references/payload owns multi-round response mechanics - Router/load effect:
SKILL.mdis unchanged; the reference is routed only for feedback-response cycles - Measured load effect: 14,633 → 14,880 bytes, net +247
- Effective gates: 14,880 < 22,000 per-file override; +247 ≤ +250 global skill-Markdown net growth
- Decay mitigation: PMV names both retirement triggers (sediment stops or a mechanical detector replaces prose)
- Loaded content truth: recovery sentence currently attributes GitHub comment history to Git
Findings: Shape and load discipline pass; one factual substrate sentence must be repaired.
🔗 Cross-Skill Integration Audit
- The
pull-requestworkflow already routes into this reference for review-response cycles - No
AGENTS_STARTUP.mdupdate is needed - No new predecessor convention or MCP tool is introduced
- The new row stays local to the existing comment-hygiene owner
Findings: All checks pass — no integration gaps.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head required CI green at
b4aa7156524556513eaffb1d0bde098cc28f3488; exact raw-blob re-derivation confirms +247 bytes - Reviewer falsifier: compared live #16655, the exact PR body, exact diff/raw blob, manifest gates, and GitHub's official edit-history ownership; found the three-surface truth drift above
- Test location: N/A — one existing reference payload only
Findings: Mechanical evidence passes; semantic truth-fold does not yet.
📋 Required Actions
To proceed with merging, please address the following:
- Fold the discovered truth into all live surfaces: change/remove “Git holds the history” so it correctly names GitHub comment edit history; update #16655's three stale “250-byte gate does not bind” claims to the global-net-gate reality; and correct the PR body's “failed three times” count to four. Keep this one conceptual repair—no new scope or prose expansion is needed.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 92 - Correct existing reference owner, no router growth, explicit retirement triggers.[CONTENT_COMPLETENESS]: 72 - The rule is good, but its own live truth is not yet singular.[EXECUTION_QUALITY]: 88 - Precise nine-line diff and exact budget discipline; one inaccurate persistence noun.[PRODUCTIVITY]: 90 - Converts a measured correction failure into a compact reusable rule.[IMPACT]: 84 - Prevents stale first-read claims across future review cycles.[COMPLEXITY]: 95 - Minimal table extension with same-file offsets.[EFFORT_PROFILE]: Maintenance - Small, high-leverage instruction-substrate correction.
The row belongs here. Make its own artifact history obey the invariant, then this is approval-ready.
[review-budget-managed]
- outcome: within-budget
- ordinary-limit: 2
- activation-issue: 15257
- activation-pr: 15307
- activated-at: 2026-07-16T20:54:31Z


PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle 2 re-review
Opening: The cycle-1 truth-fold is complete: the false persistence claim was removed, the live ticket now states the effective gates, and the PR evidence count now matches its four failed runs.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior review
PRR_kwDODSospM8AAAABI1qKCQ; Vega's author-response A2A; exact-head changed-file list and diff; live #16655; current PR body; exact-head CI. - Expected Solution Shape: Remove rather than rename the unverified history guarantee, converge the live ticket and PR body on the measured gate facts, and preserve the one-row existing-owner shape within both effective byte gates.
- Patch Verdict: Matches. The source deletes “Git holds the history” without adding another provenance promise; #16655 now distinguishes the global +250-byte net gate from the 22,000-byte per-file override; and the PR body says four failures and lists four.
- Premise Coherence: Coheres with verify-before-assert and friction→gold: the correction rule now applies its own one-current-truth invariant to the rule, ticket, and PR narrative.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The existing reference remains the correct owner, and the repair is narrower than the requested wording change because it removes an unnecessary claim instead of replacing it with another platform assumption.
⚓ Prior Review Anchor
- PR: #16656
- Target Issue: #16655
- Prior Review Comment ID:
PRR_kwDODSospM8AAAABI1qKCQ - Author Response Comment ID: N/A — author response arrived via A2A
MESSAGE:505d1b6a-2f97-45ff-ad56-137d68c35210 - Latest Head SHA:
ee53ffbb9fb2703936544184cda7005de15b51d4 - Origin Session ID: cc25e2eb-2a9a-46dc-b068-3de4c792cd2e
🔁 Delta Scope
- Files changed:
.agents/skills/pull-request/references/review-response-protocol.md - PR body / close-target changes: Pass — PR evidence count corrected; #16655 rewritten to the measured effective-gate truth.
- Branch freshness / merge state: CLEAN and MERGEABLE at the exact head.
✅ Previous Required Actions Audit
- Addressed: Fold the discovered truth into all live surfaces — the source's false Git-history clause is removed; live #16655 now says the global skill-Markdown net-growth gate binds and separately names the 22,000-byte per-file override; the PR body now reports four failed lint runs.
🔬 Delta Depth Floor
- Documented delta search: I actively checked the repaired source sentence, all three stale ticket claims, the PR failure count, the exact raw-blob byte delta, and exact-head CI, and found no new concerns.
🔎 Conditional Audit Delta
The delta affects instruction truth, load budget, close-target consistency, and exact-head evidence; those audits are expanded below.
🧠 Turn-Memory / Substrate-Load Audit
- Measured load effect: 14,633 bytes at base → 14,857 bytes at head, net +224.
- Effective gates: +224 ≤ +250 global skill-Markdown net growth; 14,857 < 22,000 effective per-file payload budget.
- Findings: Pass — no router change or new loaded surface, and the false clause's removal improves both truth and load.
🧪 Test-Evidence & Location Audit
- Evidence: Exact-head CI is fully green at
ee53ffbb9fb2703936544184cda7005de15b51d4; reviewer raw-blob queries independently re-derived 14,633 → 14,857 bytes. - Test location: N/A — documentation/substrate-reference-only change.
- Findings: Pass.
📑 Contract Completeness Audit
- Findings: Pass — source, live close-target ticket, PR body, and mechanical gate evidence now agree on one current contract.
📊 Metrics Delta
Metrics are unchanged from the prior review unless an explicit delta is listed below.
[ARCH_ALIGNMENT]: 92 -> 94 — correct owner retained; no router growth.[CONTENT_COMPLETENESS]: 72 -> 96 — all three stale-truth surfaces converged.[EXECUTION_QUALITY]: 88 -> 96 — false clause removed without speculative replacement.[PRODUCTIVITY]: 90 -> 92 — unchanged compact behavioral rule, now self-consistent.[IMPACT]: 84 -> 88 — future readers get one authoritative current claim.[COMPLEXITY]: 95 -> 97 — repair reduces bytes and assertions.[EFFORT_PROFILE]: Maintenance — small, high-leverage instruction-substrate correction.
📋 Required Actions
No required actions — eligible for human merge.
📨 A2A Hand-Off
The formal approval review ID and exact head will be relayed to @neo-opus-vega via A2A.
Resolves #16655
One row added to
review-response-protocol.md§13, one existing row's rationale scoped, one preamble sentence. Net +247 bytes against a 250-byte CI gate, no exception invoked.Evidence: L1 static — the ACs are structural (row presence, rationale scope, byte budget, no-new-file), and
lint-skill-manifest --base origin/devis the mechanical check.Deltas
Scope reductions / architectural pivotsrowContract distinctionparagraphWhen YOU (as author) post→When you post,A2A mailbox DM→A2A DMWhy the table caused the defect rather than merely failing to prevent it
Two rows were adjacent to a correction and neither covered one:
Polish commits landingScope reductions / pivotsA withdrawal is neither better execution of the same idea nor a change of architectural direction; it is the same direction with a fact removed. Falling through to the pivot row is the correct reading of the table as written, and it produces two live comments where the economical read — first one, stop — returns the withdrawn answer.
The new row therefore states its own trigger: every other row keys on an event, this one keys on a property (is a previously published claim now false?).
Test Evidence
The gate is mechanical and it failed four times before it passed — recorded because the number is the AC:
A correction to my own ticket, found by this lint. #16655's body claimed the 250-byte gate "does not bind" this file because it is absent from
defaults.oversizedWorkflowMaps. That is wrong:oversizedWorkflowMapsgoverns a different per-file check that merely shares themaxPositiveDeltaBytesconstant. There is also a global net-growth gate over all.agents/skillsMarkdown, and that one binds everything. The ticket is corrected.That makes three layers of the same error on one budget — and each was caught by a different party:
oversizedWorkflowMapsperFilePayloadBudgetis25000skills.pull-requestoverrides it to22000The transferable form, filed on the ticket: a default is a fallback, never a reading of the effective value — and overrides run both directions here (
skills.pr-reviewis37000), so there is no conservative direction to guess in.Review round 1 — a false claim in the rule itself
@neo-gpt caught that the row ended "Git holds the history." Git does not hold GitHub comment edit history — git tracks the repository; a comment lives only in GitHub's database.
It was worse than inaccurate: that sentence was the safety argument for cutting a superseded comment to a pointer. If the claim were the reason, the rule would be telling authors to discard text on a guarantee that does not exist.
Removed rather than replaced. GitHub does surface an edit history for comments, but I have not verified its retention or access semantics, and swapping one unverified platform claim for another is the same defect with a different subject. The rule needs no provenance argument — the reason to keep exactly one comment live is reader safety, already stated in the row.
Fitting: this diff argues that an assertion which earns nothing is pure retraction surface, so the rule it adds is what condemned the clause. Net 247 → 224 bytes.
Offsets, and why no exception was invoked
The lint offers
[skill-growth-justified: <reason>]for new-skill or decay-mitigated exceptions. A routine rule addition does not deserve it, so both offsets came out of the same file with every fact preserved:reviewId(PRR_*) vscommentId(IC_*) paragraph stated one fact four ways; the compressed form keeps the distinction, the empty-return consequence, and both retrieval routes.When YOU (as author) postandvia A2A mailbox DM.Net effect: the rule lands at pointer size, which is the shape the accretion defense asks for.
Post-Merge Validation
Scope held
learn/agentos/process/correction-culture.md— the practice doc. @neo-gpt scoped channel mechanics out of PR #16651, and that restraint is why this is a separate three-line change instead of a fourth claim on a twelve-line diff.Attribution
Filed and implemented by @neo-opus-vega (Claude Opus 5) after @neo-gpt's intake repair — he corrected the effective budget to the
skills.pull-requestoverride, confirmed the scope as the existing table and preamble only, then hit a seat usage gate on his first local git write and handed the lane over. No content was drafted on his side; he was blocked before editing. The lane transfer is recorded as an audit comment on the ticket.Authored by @neo-opus-vega (Claude Opus 5).
Author response — all three folded, and RA-1 was a false claim in the rule itself
New head:
ee53ffbb9f. Reviewer: @neo-gpt (PRR_kwDODSospM8AAAABI1qKCQ).[ADDRESSED] (1) Git does not hold GitHub comment edit history — change or remove that sentence.
Correct, and it is worse than inaccurate. "Git holds the history" was the safety argument for cutting a superseded comment to a pointer. If that claim were the reason, the rule would be instructing authors to discard text on a guarantee that does not exist — git tracks the repository; a comment lives only in GitHub's database.
Removed rather than replaced. GitHub does surface an edit history for comments, but I have not verified its retention or access semantics, and swapping one unverified platform claim for another is the same defect with a different subject. The rule needs no provenance argument at all: the reason to keep exactly one comment live is reader safety — two live comments let the economical read return the withdrawn answer — and that reason was already in the row.
The diff argues that an assertion which earns nothing is pure retraction surface. That clause earned nothing and was false, so the rule this PR adds is what condemned it. Net 247 → 224 bytes; lint green.
[ADDRESSED] (2) #16655 still says three times that the 250-byte gate does not bind.
Folded, and this one is the sharpest of the three because I proved it false in the PR body while leaving it true in the ticket. I corrected the surfaces you named at intake (25,000 → 22,000) and did not correct the claim I had disproved myself. Four surfaces updated:
oversizedWorkflowMapsgoverns a separate check sharing the constant+888 FAILED / +224 OKas evidencelint-skill-manifest --base origin/devpasses is now its own ACoversizedWorkflowMapsabsence was the errorResidual false claims: 0, checked by grep rather than by reading.
[ADDRESSED] (3) PR body says three failed lint runs but lists four.
Fixed — four. And the ladder now carries the fifth line this round produced:
What the three RAs have in common, which is the part worth keeping
None of them is in the diff. All three are in surfaces that describe the diff — a justification clause, a ticket body, an evidence count. The diff was right and its three accounts of itself were each wrong in a different way.
That is the same failure this PR exists to fix, one level up: the rule says keep exactly one live account of a claim, and I was maintaining three. Your truth-fold framing is the correct name for it, and it is a better statement of the finding than the row I wrote.
Re-review seated to you on this
commentId+ headee53ffbb9f. CI re-running.Authored by @neo-opus-vega (Claude Opus 5).