chore: make content-guidelines canonical for evidence-versus-claim rule - #28594
Conversation
…nd doc-check Agent-authored docs kept leaking implementation detail (status enums, column names, internal subsystem names) into user-facing pages, called out by reviewers on recent Coder Agents docs PRs. Encode the rule: code evidence justifies a claim but does not belong in the claim, except on pages where identifiers are the interface.
|
/coder-agents-review |
|
Chat: Review posted | View chat Review history
deep-review v0.9.0 | Round 9 | Last posted: Round 9, 46 findings (1 P1, 17 P2, 15 P3, 2 P4, 9 Nit, 2 Note), COMMENT. Review Finding inventoryFinding inventory - PR #28594Findings
Round logRound 9 updateBLOCKED (churn guard). No commit since round 8 (head unchanged at 7495cc6). Author posted a top-level comment pausing the loop pending a human policy decision on the disclosure venue (CRF-39), proposing to sanction a collapsed "verification evidence" details block in the PR description + amend PR_STYLE_GUIDE, then fix CRF-39 to CRF-46 in one final round, or merge over them. Churn guard: 1 contested (CRF-39, legitimate human/policy decision), 7 silent (CRF-40 to CRF-46: no fix, bundled into a ticketless "final round" promise). CRF-40 to CRF-46 do not depend on the venue decision. No panel, no Netero. Review blocked pending a human decision on CRF-39 and either fixes or tickets for CRF-40 to CRF-46. Reviewed against 7495cc6 (unchanged). Contested and acknowledgedCRF-39 (P2, content-guidelines.md:127) - stripped-identifier disclosure venue
Round 8 (panel re-review)Churn guard PROCEED (all 10 round-6 findings addressed in 7495cc6). Panel re-review (always-on 5 + Razor + Chopper wildcard + Netero). Verified CRF-30/31-factual/26/20/36/37/38 fixed. But the round-6 fixes again introduced new defects, and the disclosure mechanism (CRF-19 lineage) is now non-functional end to end: CRF-39 (P2, 6 reviewers, Mafu-san P1): the commit-message venue is destroyed at squash-merge (verified: origin/main is single-parent (#N) commits, PR description is the body) and write-docs forbids the PR description, the surviving venue; CRF-40 (P2): doc-check is told to confirm the pointer in commit messages/review comments its workflow never fetches, and the check does not fire on added pages. Plus CRF-41 (P2 example page/claim mismatch), CRF-42 (P2 rung-2 root cause still unscoped), CRF-43 (P3 paraphrase drops interrupting), CRF-44 (P3 "see" instance-not-class, third recurrence), CRF-45/46 (Nit). No P0/P1 by orchestrator rating (Mafu-san rated CRF-39 P1), so COMMENT. Verified squash-merge, doc-check inputs, rung-2 text, and the chats.sql exclusion myself. Reviewed against ac5fac0..7495cc6. Round 8 (churn guard)Churn guard PROCEED. Commit 7495cc6 (+28 -25) addressed all 10 round-6 findings (CRF-30 to CRF-38 + the CRF-9 body re-raise), 0 silent, 0 deferred new. Panel re-review to verify the wording fixes (which have introduced regressions in prior rounds): always-on 5 + Razor + Chopper (wildcard) + Netero advisory. Deferred-with-ticket findings unchanged (CRF-4/5, CRF-10/24, CRF-21). Reviewed against ac5fac0..7495cc6. Round 7 updateBLOCKED (churn guard). No commit since round 6 (head unchanged at ac5fac0); the only new activity is a Round 6 (panel re-review)Churn guard PROCEED (CRF-13, CRF-19 addressed). Panel re-review (always-on 5 + Razor + Zoro wildcard + Netero). Verified CRF-13/19/23/26 fixed. But the two round-5 fixes introduced new wording defects. CRF-30 (P2, 6 reviewers): the word-choice back-link opens "same boundary applies" under a keep-out list and sits above a sentence naming the PR description, routing stripped identifiers where the canonical rule and PR_STYLE_GUIDE forbid, and framing rung-1-required values as keep-out. CRF-31 (P2): the rung-2 example over-generalizes from the sidebar; verified interrupting renders as visible text in AssistantOutput.tsx:24. Plus CRF-32/33/34/35 (P3: unenforced disclosure, checklist qualifier drop, re-verifier overclaim, related-rules destination divergence) and CRF-36/37/38 (Nit). Re-raised CRF-9 in the body (description still says "three citations", omits word-choice.md). No P0/P1, so COMMENT. Verified interrupting visible-text render and the word-choice wording myself. Reviewed against 15af9dc..ac5fac0. Round 6 (churn guard + panel)Churn guard PROCEED. Commit ac5fac0 addressed the two round-5 blockers: word-choice.md now back-links the canonical rule (CRF-13), and the reviewer pointer is unconditional with the write-docs checklist requiring stripped identifiers be named (CRF-19). Author confirmed the round-5 silence was the resolved-thread tooling gap. 5 findings deferred with tickets (CRF-4/5/24/10/21), 0 silent. Panel re-review (small +12 -4 fix): always-on 5 + Razor + Zoro (wildcard), plus Netero advisory. Reviewed against 15af9dc..ac5fac0. Round 5 updateBLOCKED (churn guard). New commit 15af9dc addressed 7 findings (CRF-9, CRF-23, CRF-25, CRF-26, CRF-27, CRF-28, CRF-29) and left CRF-24 deferred (DOCS-729). But CRF-13 (P2) and CRF-19 (P3) are silent: no code change and no author reply. No panel, no Netero. Likely contributing factor: the round-4 re-raises posted as replies but the thread-unresolve failed on bot permissions, so both threads still show [Resolved] and were probably missed. Review blocked until the author responds or pushes fixes for CRF-13 and CRF-19. Reviewed against 99531a2..15af9dc. Round 4 (panel re-review)Churn guard PROCEED. Panel re-review of the restructure (10 reviewers + Netero, wildcard Meruem). The round-3 fixes are close but introduced new defects and left one class incomplete. Nine reviewers independently traced the rung-2 worked example to aria-label-only rendering (CRF-23, verified: statusConfig.ts labels are aria-label on an icon in ChatTreeNode.tsx:225 / ChatSearchResults.tsx:293, no visible text). New: CRF-23 (P2 aria-label example), CRF-24 (P2 link integrity unenforced), CRF-25 (P2 rung-3 vs voice-and-tone), CRF-26 (P2 DOCS_STYLE_GUIDE Permission Actions/Key Principles unqualified; third instance-not-class fix, Mafu-san rated P1), CRF-27 (P3 highest-rung), CRF-28/29 (Nit). Re-raised CRF-9, CRF-13, CRF-19. Verified aria-label, Permission Actions gap, voice-and-tone conflict, and AGENTS.md @-imports DOCS_STYLE_GUIDE.md (not content-guidelines.md). No P0/P1, so COMMENT. Reviewed against acaee4d..99531a2. Round 4 (churn guard)PROCEED. 11 addressed in 99531a2 (CRF-11 to CRF-20, CRF-22), 1 deferred with ticket (CRF-21 -> DOCS-730), 0 silent. Author restructured the reader test into a three-rung ladder, qualified DOCS_STYLE_GUIDE.md, cut both skills to citation-only, rewrote the example to use UI labels, and fixed the broken link. Panel re-review this round to verify the restructure. Reviewed against acaee4d..99531a2. Round 3 (panel)Panel's first review (rounds 1-2 were Netero-only gates). 10 reviewers: Bisky, Hisoka, Mafu-san, Mafuuu, Pariston, Gon, Leorio, Razor, Pen Botter (trigger-matched) + Kite (wildcard). Strong convergence: reader-test predicate is decidable both ways on its own example (6 reviewers), the exact-values rule is still unqualified in the always-loaded DOCS_STYLE_GUIDE.md (5 reviewers), the skills restate and already drifted from the canonical copy (4 reviewers). 5 P2, 4 P3, 2 P4, 1 Nit new (CRF-11 to CRF-22). Verified requires_action semantics (ARCHITECTURE.md:75, waiting on user tool-results) and the DOCS_STYLE_GUIDE duplication myself. No P0/P1, so COMMENT. Reviewed against fea48b2..acaee4d. Round 3 (churn guard + panel)PROCEED. 4 addressed (CRF-6/7/8/9 fixed in acaee4d; CRF-8 fixed in code with no thread), 3 deferred with ticket (CRF-4/5 in DOCS-722 / #28570, CRF-10 in DOCS-729), 0 silent. CRF-6 title fix verified analytically: current PR title is scopeless chore:, which passes contrib.yaml's title check; the failing run (97942789806) is stale relative to the title edit and needs a re-run to clear (gh 401 blocks direct confirmation). Panel now mandatory (2 consecutive Netero-only rounds hit the cap); Netero (3a) skipped per the cap rule. Reviewed against fea48b2..acaee4d. Round 2 (churn guard)PROCEED. 3 addressed (CRF-1/2/3 fixed in fea48b2), 2 deferred with ticket (CRF-4/5 tracked in DOCS-722 / #28570), 0 silent. Author pushed the canonical statement into docs/.style/content-guidelines.md and made both skills cite it. Churn guard could not confirm #28570's state (gh 401 in worktree). Reviewed against e035627..fea48b2. Round 2 (Netero)Still pre-panel, so still Netero-only per the decision gate: Netero found a P1 (title check merge blocker) and a P2. Verified CRF-1/2/3 genuinely fixed. New: 1 P1, 1 P2, 1 P3, 1 Nit, 1 Note (CRF-6 to CRF-10). Second consecutive Netero-only round (cap is 2); round 3 forces the panel. Reviewed against ce59a86..fea48b2. Round 1Netero-only first-pass gate. Docs-only skill change (+38 -0, 2 files). No Law (effective additions 38, far below 1000). Netero found 1 P2, so per the Netero decision gate the panel is deferred to the next round. 1 P2, 3 P3, 1 Note. Reviewed against ce59a86..e035627. About deep-reviewCRF = Coder Review Finding (P0-P4, Nit, Note)
|
There was a problem hiding this comment.
First-pass review only. These are mechanical findings from Netero; the full review panel has not yet reviewed this PR. The panel will review after these findings are addressed, so more findings may follow.
The change does something worth doing: it turns a repeated review correction into a written rule, with a concrete before/after example, an explicit reference-docs exception, an anti-pattern bullet, and a pre-handoff checklist item. The reader test ("does the reader type or receive the identifier?") is a sharp, checkable formulation.
Severity count: 1 P2, 3 P3, 1 Note.
The throughline of the findings is that the PR codifies the rule but does not finish codifying it. The rule lives in two skill copies rather than in the canonical docs/.style/content-guidelines.md the skills defer to, and write-docs' own "Feeding lessons back" section says to "add it there in the same change set." One canonical statement plus two links would resolve CRF-1, CRF-2, and the drift risk in one move. Separately, the write-docs section states two different tests (a category list and a reader test) that disagree on how-to pages that quote an API field. And the page that motivated the rule still violates it in the live tree, which the no-follow-up assumption makes permanent unless fixed here or ticketed.
As Netero put it: identifiers published where the reader never receives them are "unverifiable by the reader and rot unnoticed" - and the motivating page proves it, listing pending and paused, neither of which is in the actual status enum.
🤖 This review was automatically generated with Coder Agents.
…-claim Round 1 review: the rule belongs in docs/.style per the skills' own precedence and feedback-loop rules. One canonical statement in content-guidelines.md; both skills now cite it, and the reader test (does the reader type or receive the identifier) is the rule, with page categories demoted to examples.
|
/coder-agents-review |
There was a problem hiding this comment.
First-pass round 2, still Netero-only: the panel has not yet reviewed this PR and will review next round, once the merge blocker below is cleared. More findings may follow from the panel.
Good progress. Netero verified that round 1's CRF-1, CRF-2, and CRF-3 are genuinely fixed: the canonical statement now lives in docs/.style/content-guidelines.md, both skills cite it instead of restating it, and the reader test is the rule with the category list demoted to examples ("The test decides, not the page category"). CRF-4 and CRF-5 are deferred to PR #28570 / Linear DOCS-722; that is a legitimate deferral with a ticket, though I could not confirm #28570's state from the review environment (gh returns 401 here), so that verification is on the author.
The blocker: the fix moved the rule into docs/.style/content-guidelines.md, but the PR title scope is still .claude/skills, which does not contain that file. The title CI check fails deterministically (CI shows the title job as the only failure), so the PR cannot merge until the title is corrected. Dropping the scope fixes it, e.g. chore: make content-guidelines the canonical home for the evidence-versus-claim rule.
Severity count (new this round): 1 P1, 1 P2, 1 P3, 1 Nit, 1 Note.
The P2 is worth attention: promoting the rule into the canonical guidelines also promoted a disposal target that no project rule defines. As Netero put it, "an agent cannot satisfy both, and a reviewer applying the PR style guide will flag exactly the block the docs skill told the author to add."
docs/.style/content-guidelines.md:87
P3 [CRF-8] The new reader test qualifies "Verify against the code; document exact values", but that section carries no forward pointer and still reads as unconditional. (Netero)
The link is one-way. The new section points back to "Verify against the code" for the yes branch, but the "Verify against the code" section still reads unconditionally ("Docs claims should be checked against the actual implementation"), with an RBAC action name as its lead example, which the PR description names as one of the leaks this rule exists to stop. An agent that greps only that section (as doc-check reads section by section) gets guidance the very next section overrides. Fix: one clause at the end of the section, e.g. "subject to the reader test in the next section." Severity kept low because the sections are adjacent and a top-down reader resolves the order correctly.
🤖
🤖 This review was automatically generated with Coder Agents.
…the exact-values rule Round 2: PR_STYLE_GUIDE.md forbids implementation detail in PR descriptions, so the rule no longer invents an evidence section; and the verify-exact-values section now points forward to the reader test.
|
/coder-agents-review |
There was a problem hiding this comment.
Full panel review (rounds 1-2 were mechanical first-pass gates; this is the panel's first pass). Ten reviewers. The core idea is right and worth shipping: verifying a behavior against the source and publishing the source's vocabulary are different acts, and Pariston confirmed no existing rule stated that. The mechanical layer is clean (Vale, markdownlint, emdash, all anchors resolve), the example's enum values are real, and prior fixes hold: CRF-7 (the invented "evidence section" is gone; routing to a PR comment does not touch anything PR_STYLE_GUIDE.md forbids) and the CRF-6 title fix (the title is now scopeless, which passes contrib.yaml; the still-red title run is stale and needs a re-run to clear).
Where the panel converged, three findings undermine the PR's own goal and should be resolved before merge:
-
The reader test is decidable both ways on its own worked example (6 reviewers). "Does the reader type or receive it?" is unscoped, and chat statuses are both public API response fields and rendered UI labels, so an author can answer "yes" and keep exactly the identifiers the example says to strip. Scope it to the task the page describes, and pick one predicate: the test says "type or receive", the justification says "sees", and the pre-existing principle at line 67 says "sees, types, and gets back".
-
The exact-values rule still stands unqualified in the always-loaded agent file (5 reviewers). CRF-8 added the forward pointer to content-guidelines.md, but
.claude/docs/DOCS_STYLE_GUIDE.md"Accuracy Standards" repeats "document exact values / exact RBAC action names from code" with no reader test and no link, and AGENTS.md routes agents there for docs work. The failure this PR exists to prevent is exactly what that file instructs. -
The skills cite the canonical rule and then restate its substance, and the copies already drifted inside this one PR (4 reviewers): doc-check dropped "database" from the identifier list, write-docs dropped "or types a flag" and added "when asked". write-docs' own rule two sections down says "Do not reproduce the catalog here, so it cannot drift from the source."
Severity count (new this round): 5 P2, 4 P3, 2 P4, 1 Nit. No P0/P1. CRF-4/5 (DOCS-722 / #28570) and CRF-10 (DOCS-729) remain deferred with tickets; I still cannot confirm those ticket states from the review environment.
Smaller notes not filed as separate comments: the new heading names a metaphor while every sibling heading names an action (Leorio); the bullet and the Why: state the same rationale twice, against this file's one-fact-one-place habit (Gon, Leorio); "workflow step 1" is a positional reference where the file otherwise links by name, and the new checklist item sits between two PR-mechanics items instead of beside the content item it qualifies (Gon); the forward pointer CRF-8 added is placed inside the Why: block rather than above it (Gon); and all three commit subjects plus the PR title exceed the 72-char cap in CONTRIBUTING.md (Leorio).
A verified aside from Kite worth keeping: the example's enum values check out against the migration, so "a rule about verifying against the code that shipped a fabricated example would have been the obvious own goal; it did not happen."
.claude/docs/DOCS_STYLE_GUIDE.md:253
P2 [CRF-11] The exact-values rule still stands unqualified in the always-loaded agent file; the CRF-8 fix covered one copy, not the class. (Hisoka P2, Mafu-san P2, Mafuuu P2, Razor P2, Kite P2)
.claude/docs/DOCS_STYLE_GUIDE.md "Accuracy Standards" says "Document exact values from code", "Use exact RBAC action names from code (e.g., view_insights ...)", with no reader test and no link to the new canonical section. This is not a stale sibling: AGENTS.md routes "Docs structure and research" to this file, and write-docs/SKILL.md cites it as the agent-facing companion, so an agent doing docs work loads the unqualified rule directly into context. As Kite put it, the "content guidelines govern on conflict" banner does not rescue it, because "there is no conflict to resolve: 'document exact values' and 'only where the reader types or receives them' read as compatible until you know the second rule exists." The RBAC-names leak in the first revision of #28482 is exactly what this file instructs.
Fix: match the citation pattern this same file already uses twice ("Documentation lands with the change", troubleshooting) - add one sentence under "Accuracy Standards" linking #evidence-justifies-a-claim-it-does-not-belong-in-the-claim, keeping the concrete examples inline.
🤖
docs/.style/content-guidelines.md:165
P4 [CRF-20] Broken relative link to the feature-stages page. (Razor)
[Feature stages](../../install/releases/feature-stages.md) resolves from docs/.style/ to <repo>/install/releases/feature-stages.md, which does not exist; the file is at docs/install/releases/feature-stages.md, so the link needs one fewer ../. Introduced in an ancestor of this PR's base, so not this PR's regression, but this PR edits the file and the fix is one character.
🤖
🤖 This review was automatically generated with Coder Agents.
…onical rule Round 3: the test is now scoped to the task the page documents with an exact-value / product-label / reader's-terms ladder; skills cite the canonical rule without restating it; doc-check flags only pages the change touches; DOCS_STYLE_GUIDE's exact-values section gains the same qualifier; and a pre-existing feature-stages link is repaired.
|
/coder-agents-review |
There was a problem hiding this comment.
Panel re-review of the restructure. Real progress: the three-rung ladder is a better shape than the flat predicate, and it decides the motivating case cleanly (Pen Botter applied it to all three identifiers on chat-auto-archive.md and each landed on a rung without ambiguity). I verified the round-3 fixes landed: the skills are genuinely citation-only, the broken feature-stages link is fixed, rung 1's API claim is true, and the DOCS_STYLE_GUIDE.md exact-values section now carries a qualifier. CRF-21 is now ticketed (DOCS-730). Nice work turning six rounds of findings into a coherent rule.
But this round the fixes introduced new defects, and one class is still open. The headline: the CRF-14 fix replaced the vague paraphrase with three UI labels, and nine reviewers independently opened the render path and found those labels are aria-label values on an icon, never visible text. I confirmed it: statusConfig.ts sets label: "Working" etc., and both consumers pass it to aria-label on a role="img" icon (ChatTreeNode.tsx:225, ChatSearchResults.tsx:293) with no tooltip or text node. A sighted admin sees a spinner, a pause glyph, a triangle. So the canonical rule's one worked example, in a rule about not publishing strings the reader never receives, publishes three strings the reader never sees, and calls them screen-verifiable. As Bisky put it: "the last three rounds of this PR are a demonstration of what happens to unwatched claims."
The other new issues: rung 3 tells writers to name the reader by role in body prose, which voice-and-tone.md forbids in favor of second person (and content-guidelines governs on conflict); the citation-only design left the rule reachable only through cross-file links that no CI check validates (linkspector excludes docs/.style and .claude), so the next heading rename makes the rule disappear rather than degrade; and "pick the highest rung" reads backwards on a list numbered 1 to 3.
One process note worth surfacing: the DOCS_STYLE_GUIDE.md qualifier landed on the "Specific Numbers Matter" subsection only, leaving "Permission Actions" (exact RBAC names, the #28482 leak class) and "Key Principles" item 2 unqualified in the file AGENTS.md auto-loads. This is the third round a class-level finding (CRF-8, CRF-11, now this) got an instance-level fix; Mafu-san rated it P1 on that pattern. Moving the qualifier up under ## Accuracy Standards, and making it citation-only, closes the class in one move.
Severity count (new this round): 4 P2, 1 P3, 2 Nit. Re-raised CRF-9, CRF-13, CRF-19. No P0/P1. The rule is one honest example and one config line away from done.
🤖 This review was automatically generated with Coder Agents.
Round 4: the chat sidebar strings are accessibility labels, not visible text, so the worked example now walks rungs 1 and 3 and rung 2 warns about aria-only labels; the rung order reads first-match; rung 3 defers to voice-and-tone instead of prescribing role naming; the exact-values qualifier covers all of Accuracy Standards and Key Principles; anchors added to the related-rule links; duplicate application note removed.
|
/coder-agents-review |
There was a problem hiding this comment.
Review is blocked this round. Commit 15af9dc resolved most of round 4 cleanly: the rung-2 example no longer claims aria-label strings are visible (CRF-23), the DOCS_STYLE_GUIDE qualifier moved up to govern Permission Actions and Key Principles and dropped the lossy restatement (CRF-26), rung 3 now defers to the second-person voice rules (CRF-25), "first rung that applies" replaced "highest rung" (CRF-27), the cross-link anchors and the redundant application note are fixed (CRF-28, CRF-29), and the PR description now describes the ladder and all four files (CRF-9). CRF-24 (link-integrity CI coverage) is deferred to DOCS-729. That is good work.
Two findings from round 4 are unaddressed, with no code change and no reply, so the panel will not re-run until they are resolved:
-
CRF-13 (P2): the prose-edit path never reaches the rule. AGENTS.md routes prose-only edits to existing docs pages at the prose style guide, and word-choice.md's "Keep internal-only references out of published docs" still has no back-link to the new canonical rule. A writer fixing a paragraph on an existing admin page reaches word-choice, not the content guidelines, and can add an identifier the rule forbids. Fix: add a cross-reference from word-choice.md back to the canonical rule (the content-guidelines side already links out to word-choice).
-
CRF-19 (P3): the reviewer pointer is reactive. "When the reviewer needs the pointer, give it in the PR discussion" fires only if a reviewer asks, and nothing in the write-docs checklist requires the author to record which file and symbol a stripped identifier came from. Re-verifying a rung-2/3 paraphrase later means re-deriving the source. Fix: make the write-docs checklist item require naming the stripped identifiers and their symbols in the PR discussion, so the pointer is produced unprompted.
Probable reason these were missed: I re-raised both in round 4 as replies, but the bot cannot unresolve GitHub threads (the API returns "Resource not accessible by integration"), so both threads still display as resolved and the replies are collapsed. Please look at the CRF-13 thread on content-guidelines.md and the CRF-19 thread, or address the two fixes above and re-request review.
Either fix the two, or reply explaining why each should not be fixed (a bare "won't fix" is not a resolution; the justification is evaluated against the finding). Once either happens, the next round proceeds to the full panel.
🤖 This review was automatically generated with Coder Agents.
…identifier pointers proactive
|
/coder-agents-review |
1 similar comment
|
/coder-agents-review |
There was a problem hiding this comment.
The two round-5 blockers are resolved: word-choice.md now back-links the canonical rule (CRF-13) and the stripped-identifier pointer is unconditional with the write-docs checklist requiring it (CRF-19). Thanks for confirming the round-5 silence was the resolved-thread tooling gap; that matched our read. I also re-verified the earlier fixes hold: the rung-2 aria-label correction (CRF-23), the exact-values qualifier now governing the whole Accuracy Standards section (CRF-26), rung 1 against the API reference, and rung 3 against the live auto-archive query. The link plumbing all resolves.
The recurring pattern is back, though: both round-5 fixes introduced a new wording defect, which is the same thing that happened to the worked example in rounds 3 and 4. Two are P2:
-
CRF-30: the word-choice back-link (the CRF-13 fix) opens "The same boundary applies to implementation identifiers such as enum values, database column names, and internal symbols" and sits inside the "Keep these out of published pages" list, directly above the sentence "A pull request description ... is the right place to cite an internal issue ID or a private link." A prose-editor on the exact path CRF-13 was fixed to serve reads enum values as a keep-out item and routes the pointer to the PR description, which the canonical rule and PR_STYLE_GUIDE.md deliberately exclude. As Razor put it, that distinction "was CRF-7. This paragraph's placement gives it back." Fix: lead with the difference (a related, conditional boundary), drop "the same," and move the paragraph below the list's closing sentence.
-
CRF-31: the rung-2 worked example reasons from a single surface. It concludes the chat-status enum "offers nothing to quote" because the sidebar shows only icons, but I confirmed
interruptingrenders as visible text in the conversation view (AssistantOutput.tsx:24,{interrupting ? "Interrupting" : "Thinking"}, asserted bygetByText("Interrupting")). The example is correct for the auto-archive admin page, whose reader works in the sidebar, but the reasoning clause generalizes past that surface, and a writer who copies it onto a conversation-view page strips a label the reader can see, reproducing exactly CRF-14. Scope rung 2 and the example to the reader's surface.
Four P3s follow from the same two fixes: the disclosure CRF-19 made mandatory has no reviewer-side check (doc-check only flags identifiers that are present), the write-docs checklist item drops the "comment or review thread" qualifier, the "whoever re-verifies later" claim overreaches (a PR thread is not reachable from the page), and the Related-rules list still skips the two in-file homes, one of which routes implementation detail to Engineering docs rather than the PR discussion.
Process note, re-raising CRF-9: the description still says "one canonical rule with three citations" and does not list word-choice.md, now a fourth citing home and the file carrying CRF-30. Update the count and add the bullet.
Severity count (new this round): 2 P2, 4 P3, 3 Nit. No P0/P1. Deferred with tickets: CRF-4/5 (DOCS-722), CRF-10/24 (DOCS-729), CRF-21 (DOCS-730).
🤖 This review was automatically generated with Coder Agents.
Relocate and recondition the word-choice back-link, scope the rung-2 example claim to the sidebar surface, route stripped-identifier pointers to the commit message or a review comment with a reviewer-side doc-check confirmation, link the routing table as a related rule, and apply refer-to and list-grammar fixes.
|
/coder-agents-review |
There was a problem hiding this comment.
Review is blocked. No commit has been pushed since round 6 (head is still ac5fac0), and none of the nine round-6 findings has a code change or a reply, so there is nothing new to review. The /coder-agents-review trigger re-runs the review; it does not resolve findings.
Unaddressed from round 6, still open:
- CRF-30 (P2): the word-choice back-link opens "The same boundary applies" inside the "keep these out of published pages" list and sits above the sentence naming the PR description, so a prose-editor strips exact values rung 1 requires and routes the pointer where the canonical rule and PR_STYLE_GUIDE forbid.
- CRF-31 (P2): the rung-2 worked example concludes chat status "offers nothing to quote" from the sidebar alone, but
interruptingrenders as visible text in the conversation view (AssistantOutput.tsx:24); scope rung 2 and the example to the reader's surface. - CRF-32 (P3): the CRF-19 disclosure has no reviewer-side check; doc-check flags only identifiers that are present.
- CRF-33 (P3): the write-docs checklist item drops the "(a comment or review thread)" qualifier and restates canonical wording.
- CRF-34 (P3): "whoever re-verifies the paraphrase later" overclaims; a PR review thread is not reachable from the page.
- CRF-35 (P3): the Related-rules list omits the two in-file homes; the routing table still sends implementation detail to Engineering docs, not the PR discussion.
- CRF-36, CRF-37, CRF-38 (Nit): the hard-wrapped word-choice paragraph, the navigational "see," and the Key Principles comma.
The deferred-with-ticket findings (CRF-4/5 in DOCS-722, CRF-10/24 in DOCS-729, CRF-21 in DOCS-730) are fine and are not blocking.
To unblock: push fixes for the round-6 findings, or reply on each thread explaining why it should not be fixed (a bare "won't fix" is not a resolution; the justification is evaluated against the finding). Once either happens, the next round runs the full panel. At minimum, CRF-30 and CRF-31 (both P2) need to be resolved before this is ready to merge.
🤖 This review was automatically generated with Coder Agents.
|
Round 7 raced the push: commit 7495cc6 (round-6 fixes for CRF-30 to CRF-38) and the nine thread replies were live before the trigger, but the review evaluated the previous head ac5fac0. Re-requesting against the current head. Generated by Coder Agents on behalf of @nickvigilante. |
|
/coder-agents-review |
|
Round 7 raced the push: commit 7495cc6 (round-6 fixes for CRF-30 to CRF-38) and the nine thread replies were live before the trigger, but the review evaluated the previous head ac5fac0. Re-requesting against the current head. Generated by Coder Agents on behalf of @nickvigilante. |
|
/coder-agents-review |
|
Round 7 raced the push: commit 7495cc6 (round-6 fixes for CRF-30 to CRF-38) and the nine thread replies were live before the trigger, but the review evaluated the previous head ac5fac0. Re-requesting against the current head. Generated by Coder Agents on behalf of @nickvigilante. |
|
/coder-agents-review |
|
Round 7 raced the push: commit 7495cc6 (round-6 fixes for CRF-30 to CRF-38) and the nine thread replies were live before the trigger, but the review evaluated the previous head ac5fac0. Re-requesting against the current head. Generated by Coder Agents on behalf of @nickvigilante. |
|
/coder-agents-review |
There was a problem hiding this comment.
Genuine progress: the round-6 findings are all addressed, and for the first time the worked example's factual claims check out against the code, which Chopper flagged as "the first round where the worked example's factual claims check out." CRF-30 (word-choice), CRF-26 (qualifier scope), CRF-36/37/38 (formatting), CRF-20 (link), and the factual half of CRF-31 (rung 2/3 wording matches the aria-label vs visible-text split) are verified fixed. The ladder itself is sound.
The recommendation this round is to stop rewording the stripped-identifier disclosure and rethink it, because it is now non-functional end to end, and it has been reworded in four rounds without checking how this repo actually works:
- CRF-39 (P2): the rule routes the pointer to "the commit message" and justifies it with "one
git blameaway," and write-docs hardens it to "not the PR description." But coder/coder squash-merges: I confirmed the last commits on origin/main are single-parent(#NNNNN)commits whose body is the PR description. A branch commit message never reaches main, sogit blamelands on a squash commit that, by this rule, must not carry the pointer. The rule sends the disclosure to the venue that is deleted and forbids the one that survives. Mafu-san rated this P1 on the pattern. - CRF-40 (P2): the reviewer-side check added for CRF-32 says "confirm the stripped identifier is named in the commit message or a review comment." doc-check's workflow fetches only
gh pr diff/git diff, which carry neither. The check either no-ops or false-flags. It also fires only "when the diff strips an identifier," so on a newly authored page, the case the PR was written for, nothing triggers it.
Taken together, the disclosure control does not work in any path: the venue is discarded at merge, the checker cannot read it, and it does not fire on new pages. Either drop the durability and enforcement claims and make it best-effort, or design it as a unit (a PR-description trailer that survives squash-merge plus a doc-check input that can read it).
Separately, the CRF-31 rewrite fixed the over-generalization but introduced a page/claim mismatch:
- CRF-41 (P2): the example now says "a page describing sidebar behavior falls to rung 3 and says chats ... are never selected." "Never selected" is auto-archive selection, not sidebar behavior, and "selected" has no antecedent. The fix swapped the page out from under the sentence. Restore the two-actor form (the auto-archive page, whose reader sees status in the sidebar).
- CRF-42 (P2): the deeper cause is that rung 2 in the rule text is still not surface-scoped; only the example is. Run literally on the enum,
interrupting(visible text in AssistantOutput.tsx) hits rung 2 while the others hit rung 3, so one enum resolves at two rungs. Scope rung 2 to the page's surface and say a set resolves at the lowest rung any member reaches.
P3s: the rung-3 paraphrase drops interrupting and reuses "waiting" for the archived waiting/Idle status (CRF-43); and CRF-37's "see" fix was again instance-not-class, leaving five navigational "see" in the same file (CRF-44), the third instance-not-class fix in this PR (CRF-11, CRF-20, now CRF-37). Two Nits round it out.
Severity count (new this round): 4 P2, 2 P3, 2 Nit. No P0/P1 by my rating. Deferred with tickets and not blocking: CRF-4/5 (DOCS-722), CRF-10/24 (DOCS-729), CRF-21 (DOCS-730).
docs/.style/content-guidelines.md:29
P3 [CRF-44] The CRF-37 "see" fix was instance-not-class; five navigational "see" remain in this file, and this is the third instance-not-class fix in the PR. (Mafu-san)
word-choice.md bans "see" as a navigational verb. The CRF-37 fix changed the two lines it was pointed at (96 and the CRF-20-adjacent 183) and left five siblings: lines 29, 154, 301, 401, 435 (line 70 is the legitimate observational sense). The author already crossed into pre-existing prose to fix 183, so this was not a scope decision. Same shape as CRF-11 (one file qualified, class missed) and CRF-20 (link fixed, sibling "see" missed). No tool catches these (Coder.SeeAlternatives is planned), and this is the style guide agents read, so the violations read as permission. Fix the five, or file a ticket naming them; a vague "sweep later" is a drop.
🤖
docs/.style/content-guidelines.md:410
Nit [CRF-45] The exclusion catalog's "Deep internals of how the code works" entry has no back-link to the new rule, and write-docs calls that catalog canonical. (Hisoka P3; Netero, Mafu-san, Mafuuu, Razor Note; Bisky)
CRF-35's fix added the forward link to the routing table with a scope-distinguishing clause, which resolved the divergence. The reverse path is still open: write-docs/SKILL.md names the catalog ("What does not belong in the docs") as the canonical catalog to check before adding a page, and its "Deep internals" entry, the nearest whole-topic sibling, does not point at the single-identifier ladder. An agent entering through the catalog never reaches the rule. One sentence in that entry closes it; low value on its own, worth folding into DOCS-730 if that sweep touches the file.
🤖
🤖 This review was automatically generated with Coder Agents.
|
Round 7 raced the push: commit 7495cc6 (round-6 fixes for CRF-30 to CRF-38) and the nine thread replies were live before the trigger, but the review evaluated the previous head ac5fac0. Re-requesting against the current head. Generated by Coder Agents on behalf of @nickvigilante. |
|
/coder-agents-review |
|
Pausing the automated review loop after round 8 pending a human policy decision. The rule itself has been stable since round 4. Rounds 5-8 have iterated on one unresolved question: where does a stripped identifier's pointer live? Each candidate venue has now been rejected by a review round: a PR evidence section (round 2: PR_STYLE_GUIDE forbids implementation detail in descriptions), the PR discussion on request (round 5: reactive), the commit message or a review comment (round 8, CRF-39: squash-merge destroys commit messages and review comments collapse as outdated). No venue satisfies every constraint simultaneously, so this is a policy decision for the docs owner, not something further wording iterations can settle. Note the de facto team practice is a collapsible details section in the PR description (this repo's recent docs PRs, including #28482, use exactly that), which would require sanctioning that pattern in PR_STYLE_GUIDE. @nickvigilante: proposed resolution is to sanction a collapsed "verification evidence" details block in the PR description for stripped identifiers and amend PR_STYLE_GUIDE accordingly, then I address CRF-39 to CRF-46 in one final round. Alternatively, review and merge over the remaining findings. Your call. Generated by Coder Agents on behalf of @nickvigilante. |
There was a problem hiding this comment.
Review is blocked: no commit since round 8, so the eight round-8 findings are unaddressed in code.
On the disclosure venue (CRF-39): the escalation is correct, and the analysis holds. This is a genuine policy decision for the docs owner, not something more wording rounds can settle. Every candidate venue has been rejected for a real reason (PR evidence section in round 2, on-request PR discussion in round 5, commit message or review comment in round 8), and I verified the round-8 blocker myself: coder/coder squash-merges, so a branch commit message does not reach main and git blame lands on a squash commit whose body is the PR description, which the rule currently forbids. The proposed resolution, sanctioning a collapsed "verification evidence" details block in the PR description and amending PR_STYLE_GUIDE, is sound and matches both the de facto repo practice and Chopper's round-8 suggestion (a Stripped identifiers: trailer). Deciding between that, keeping the pointer best-effort with no durability claim, and merging over it is the docs owner's call. I can't dispose it from the panel.
The rest, though, is not gated on that decision and is still silent with no ticket. CRF-40 to CRF-46 are independent of where the pointer lives:
- CRF-40 (P2): doc-check is told to confirm the pointer in a commit message or review comment its workflow never fetches, and the check does not fire on newly authored pages. This is a defect regardless of the venue chosen.
- CRF-41 (P2): the worked example pins an auto-archive claim ("never selected") to "a page describing sidebar behavior," with a dangling verb. Pure wording.
- CRF-42 (P2): rung 2's rule text is still not surface-scoped, so the enum resolves at two rungs. Pure wording.
- CRF-43 (P3): the rung-3 paraphrase drops
interruptingand reuses "waiting" for the archived waiting/Idle status. - CRF-44 (P3): five navigational "see" remain in content-guidelines.md.
- CRF-45, CRF-46 (Nit): catalog back-link, and the "Everything in this section" overclaim.
Bundling these into "CRF-39 to CRF-46 in one final round" defers fixable, non-policy findings without a ticket. To unblock without waiting on the venue decision: fix CRF-40 to CRF-46 (or CRF-41/42/43/44 at minimum, which are one commit of wording), or file a tracking ticket for them as you did for DOCS-729/730. The venue decision (CRF-39) can proceed in parallel.
On the merge-over option: CRF-40 to CRF-46 are concrete defects, not policy tradeoffs, so merging over them ships known wording/enforcement bugs in the canonical rule. That is a human decision to make explicitly, not a default. The deferred-with-ticket findings (CRF-4/5 in DOCS-722, CRF-10/24 in DOCS-729, CRF-21 in DOCS-730) remain fine and are not blocking.
No panel ran this round. The next round runs the full panel once there is a commit addressing CRF-40 to CRF-46, or a ticket for them plus a recorded decision on CRF-39.
🤖 This review was automatically generated with Coder Agents.
Round 7 (CRF-39, 40, 41, 42, 43, 46): - content-guidelines.md: scope rung 2 to a surface the page's task involves; resolve an identifier set at the lowest rung any member reaches; rewrite the worked example to a two-actor form (auto-archive page, sidebar surface) naming all three excluded statuses; make the stripped-identifier pointer best-effort and drop the false git-blame durability claim, since coder/coder squash-merges. - doc-check/SKILL.md: scope the check to identifiers the diff adds or touches, and stop policing a disclosure doc-check cannot see. - write-docs/SKILL.md: defer the checklist disclosure to the canonical rule instead of restating a venue. - DOCS_STYLE_GUIDE.md: scope the Accuracy Standards qualifier to the exact-value instructions.
…code-evidence-vs-claim-abstraction-rule-in-write-docs-and # Conflicts: # docs/.style/content-guidelines.md
Agent-authored docs PRs kept leaking implementation detail into user-facing pages: chat status enum values and
root_chat_idon the auto-archive page (#28570, flagged by reviewers), and RBAC resource names and response fields in the first revision of #28482. The correction pattern was the same each time: state the behavior in the reader's terms.This encodes that pattern as one canonical rule with citations in every file that carries the exact-values instruction:
docs/.style/content-guidelines.md: new guiding principle "Evidence justifies a claim; it does not belong in the claim". The test is scoped to the task the page documents, with a first-match ladder: exact value where the reader types or receives it, visible product wording where the screen shows it, plain reader's-terms prose otherwise. An identifier set described as a set resolves at the lowest rung any member reaches. Stripped identifiers are named (file and symbol) in the PR discussion as a best-effort pointer for the reviewer. Cross-linked with verify-exact-values, describe-current-version, the routing table, and word-choice. Also repairs a pre-existing broken feature-stages link.docs/.style/style-guide/word-choice.md: the internal-references section notes that implementation identifiers follow the (conditional) canonical rule, covering the prose-edit route that AGENTS.md sends to the prose style guide..claude/docs/DOCS_STYLE_GUIDE.md: the Accuracy Standards section head and Key Principles item 2 carry the same qualifier, since this always-loaded file is where agents get the unqualified exact-values instruction..claude/skills/write-docs/SKILL.md: workflow step 1 marks copied identifiers as verification inputs with a forward link; citation-only "Evidence versus claim" section; matching anti-pattern bullet and a checklist item that defers the stripped-identifier disclosure to the canonical rule..claude/skills/doc-check/SKILL.md: "Evidence versus claim" check scoped to identifiers the change adds or touches, working from the diff (doc-check does not police the disclosure, which it cannot see); pre-existing violations on untouched pages are informational only.The motivating page (
chat-auto-archive.md) was fixed separately in #28570 (DOCS-722, merged). Corpus sweep for other violations: DOCS-730. Lint and link coverage for the.claudeanddocs/.styletrees: DOCS-729.Linear: DOCS-728 https://linear.app/codercom/issue/DOCS-728
CI note (docs-only PR)
This PR changes only Markdown under
docs/.style/and.claude/(nosite/srcor other product code).ciworkflow's docs-relevant jobs pass on the head commit:changes,gen,lint,lint-docs,fmt,offlinedocs,required. Heavy build/test jobs are correctly skipped for a docs-only change. (Run: https://github.com/coder/coder/actions/runs/32986743037)Pixel / Review(frontend visual snapshots) is unrelated to the changed paths and is treated as an unrelated flake.