Repository navigation
docs(architecture): rewrite citations as links, delete arch-doc checker - #582
Conversation
|
Depends on #579 for the |
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Generated inventories and the coverage floor are stale, and several concrete file citations remain unlinked.
Review effort: Balanced
Findings: 2
Open (3)
What changed in this PR
Replaces the custom architecture citation checker with explicit Markdown links intended for validation by #579’s lychee CI job.
Changes:
- Converts architecture paths to relative links and updates contributor guidance.
- Deletes the xtask checker and related CI/pre-push wiring.
- Removes the checker’s
pulldown-cmarkdependency.
| File | Description |
|---|---|
docs/architecture.md |
Rewrites path references as links. |
CONTRIBUTING.md |
Documents lychee-based validation. |
xtask/src/architecture_doc.rs |
Deletes the custom checker and tests. |
xtask/src/main.rs |
Removes the checker command. |
xtask/Cargo.toml |
Removes the parser dependency. |
Cargo.toml |
Removes the workspace dependency. |
Cargo.lock |
Removes the resolved package. |
.pre-commit-config.yaml |
Removes the local checker hook. |
.github/workflows/ci.yml |
Removes the old CI job. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
a8e59c6 to
dd905ca
Compare
dd905ca to
0a0e7ca
Compare
rominf
left a comment
There was a problem hiding this comment.
🔴 Automated review · pr-review-watcher · 0a0e7ca
This automation never files a GitHub approval, so no approving review will
appear here whatever the outcome — the merge decision stays with a human
reviewer.
Review — needs work
Full review of the whole change.
Implements steps 1 and 4 of #578 (open): links instead of citations, and the checker deleted. It skips optional step 3 (a lint against bare citations), and the description says so. Step 2 (lychee in CI) arrived separately in #579.
Blocking
-
(new) The PR is unmergeable as based, and its stated premise for not rebasing is false —
.github/workflows/ci.yml:1316,CONTRIBUTING.md:80
The description says the branch is "based onmaindirectly, since #579 is additive and touches none of the files this PR touches". That is not so: #579 (58c03df) changesci.yml,CONTRIBUTING.mdand.pre-commit-config.yaml.- The PR forks at
b863f77, before #579 merged.gh api …/pulls/582reportsmergeable: false, mergeable_state: dirty. git merge-tree --write-tree prw-base HEADgivesCONFLICT (content)inci.yml. The newdocs-linksjob sits directly after thearchitecture-docjob this PR deletes.- None of this PR's green checks ran the
docs-links/lychee gate. The links the doc now relies on have never been checked in CI on this branch. - The rebase also has to settle the following (required consequences):
docs-linksjob comment. It says "for the same reason as architecture-doc above". After this PR that job is gone.lychee.tomlheader. It says the xtask checker "stays in place, running alongside this gate, until a follow-up PR … removes it". This PR is that follow-up.CONTRIBUTING.mdoverlap. It auto-merges into two overlapping paragraphs about the same gate: this PR's line 80 and #579's line 82. Keep one.
Confidence 100 · architectural · Fix: rebase onto current main, resolve the
ci.ymlconflict, update the two stale comments, dedupeCONTRIBUTING.md, and letdocs-linksrun on the result. - The PR forks at
-
(new) The description claims a drive-by edit that is not in the diff, and its rationale is wrong —
docs/architecture.md:34
The description (and commitb5cf5eb) says the PR "drops a stale 'arg/' from theapps/rocmdcommon.rsentry —parse_gpu_indices_arg/optional_argmoved back tolib.rs". The edit is not there:- Base and head both read "small arg/healthcheck/endpoint-key utilities".
- The wording is still correct.
optional_arglives atapps/rocmd/src/common.rs:264, and onlyparse_gpu_indices_argis inlib.rs:1656.
Confidence 100 · mechanical · Fix: remove the claim from the description (and from the squash message). The doc wording should stay as it is.
Non-blocking
-
(new) The doc's new guarantee is broader than what the PR delivers —
docs/architecture.md:11
The doc says: "Every file this doc cites is a relative markdown link rather than a bare filename". Bare file citations remain in the same doc:lychee.toml(line 11)providers.rsin the parenthetical (line 17)- workspace
Cargo.toml(line 20) - "the old agent.rs"
report.json- every directory heading (
apps/rocm,crates/rocm-core, …), which the old checker verified as bare directory names
The description scopes the guarantee to "the Module map's per-crate inventories" and names the agent.rs/report.json exceptions. The doc carries neither, and the doc is what a reader trusts. The code governs here: these citations really are unlinked, so the sentence is what is wrong.
Confidence 85 · mechanical · Fix: narrow the sentence to the scope the description states, naming the exceptions. Or link
lychee.toml,providers.rs,Cargo.tomland the directory headings, which lychee resolves as directories. -
(new) Commit messages carry stale or incorrect references — commits
16b8385,0a0e7ca16b8385says inventories failed "after 5041d33 dropped pulldown-cmark". That SHA does not exist in this history; the commit is173245d.0a0e7cacalls agent.rs/report.json "the two documented exceptions". They are not documented in the doc.- The repo squash-merges, so these matter only if they end up in the squash message.
Confidence 85 · mechanical · Fix: correct them in the squash message.
Decisions for the author
- Dropping enforcement against bare citations — tradeoff
- Against: the old checker failed on any bare citation that did not resolve, including directories. With it gone, a new bare backtick citation is unchecked by anything, and so is a born-wrong citation that names the wrong crate. The doc's "every file is a link" claim is a convention, not an invariant.
- For: about 1,500 lines of heuristic parser and a dependency are deleted. The description argues a regex lint would need the same inference again, and that a bare citation is a reviewable literal in the diff. #578 accepted the born-wrong loss explicitly.
- Confirm the loss of directory-heading checking is also intended. Neither the description nor #578 mentions it.
Positive signals
- Every one of the roughly 100 relative links resolves at HEAD. Each bare
lib.rs/main.rsrepeat points at the correct crate's file (rocmd, rocm-core, e2e-report, vllm, lemonade), which is exactly the ambiguity the old parser existed to resolve. - The removal is complete: job, prek hook, clap variant, dispatch arm, module, workspace dependency, lockfile, and both license inventories. There are zero leftover references in the tree.
- The coverage floor was deliberately not re-blessed, rather than folding unrelated drift into this PR. CI's coverage check passed.
Deployment notes
- After this lands, the only citation guard is
docs-links. Neither it nor the oldarchitecture-docjob is in main's required status checks (queried live), so a broken link turns CI red but does not block a merge. This is no regression, but the doc's "fails CI immediately" is advisory until an admin adds the check as required.
What this covered
All files in b863f77…0a0e7ca8 (merge-base…head), read in full. Also read: prw-base (58c03df) versions of lychee.toml, ci.yml's docs-links job, CONTRIBUTING.md, and the deleted architecture_doc.rs.
Checks run:
git merge-treeagainstprw-base.cargo build -p xtaskandcargo clippy -p xtask --all-targets -D warnings: clean.cargo xtask manifest --check: passes.- Local resolution of every link target.
- Live PR
mergeable_state, the CI rollup (all green, on the pre-#579 base), and the branch-protection required checks.
Did not run:
- lychee itself (not installed here).
cargo xtask tpn --check(cargo-about not installed).cargo xtask coverage(relied on CI's passing coverage check instead).
How the work was split: fan-out into four workers covering docs/links, checker removal, design questions, and the four source-reading passes. The source-reading passes (instruction adherence, history, prior changes, comments) ran together in one worker rather than independently. One worker's claim that the old check was "presumably required" was refuted by the live query and dropped.
Not reconciled against any PR discussion here.
08fa60e to
e8d18f6
Compare
|
Addressing the automated review from @rominf (review id 5442339841, taken at Blocking — unmergeable, false "no rebase needed" claim: Fixed. Rebased onto current Blocking — false drive-by claim about Non-blocking — guarantee broader than delivered: Fixed. Narrowed Non-blocking — stale commit message refs: Fixed. Reworded both: the inventory-regeneration commit no longer cites a SHA that doesn't exist in this history (rephrased to not depend on a specific hash, since this branch has been rebased several times since); the citation-link commit's "documented exceptions" phrase is now literally true, since the exceptions are documented inline in the doc as of the guarantee-narrowing fix above. Decision — directory-heading checking loss: Confirmed intended, not an oversight. Documented in the Scope section: a directory doesn't go stale the way a file citation does, so this migration doesn't replicate that part of the old checker's coverage. Deployment note — |
docs/architecture.md's backtick-quoted path citations (e.g. `main.rs`) are now explicit relative markdown links, checked by the lychee gate added in ROCm#579 instead of xtask/src/architecture_doc.rs's hand-rolled parser. That parser existed to disambiguate a bare citation against the repo's 17 files named main.rs/lib.rs; a link carries its own full path, so there's nothing left to disambiguate. Deletes the ~1,500-line parser along with the heuristics it kept growing (possessive-owner chains, sentence-boundary detection, an abbreviation list, a prose-slash-word list) and its CI job/prek hook — the root cause behind ROCm#492, ROCm#440, and ROCm#524. Signed-off-by: Jussi Elo <jussi.elo@amd.com>
architecture_doc.rs was its only consumer; no .rs file in the workspace references it anymore. Cargo.lock updated accordingly. Signed-off-by: Jussi Elo <jussi.elo@amd.com>
cargo xtask manifest --check and cargo xtask tpn --check both failed after the prior commit dropped pulldown-cmark without regenerating the two inventories that still listed it. Signed-off-by: Jussi Elo <jussi.elo@amd.com>
Several files already introduced with a link were repeated afterward as bare backtick spans (agent/mod.rs, app/mod.rs and siblings, parse.rs, main.rs, common.rs/lib.rs, the vLLM/lemonade per-file breakdowns). A rename only breaks the first, linked mention; lychee would stay green while the bare repeats quietly went stale. Also links app/chat.rs, app/slash.rs, and app/summary.rs, named but never linked at all. Scope stays inside the Module map's per-crate inventories, where the guarantee in the intro paragraph applies; the Module organization convention section's illustrative `main.rs`/`lib.rs` mentions remain bare, same as the two documented exceptions (agent.rs, report.json). Signed-off-by: Jussi Elo <jussi.elo@amd.com>
The intro paragraph's guarantee claimed every citation in the doc was linked, but directory headings, the Module organization convention section's illustrative main.rs/lib.rs mentions, and this paragraph's own lychee.toml/Cargo.toml references never were. Scope it to the Module map's per-crate inventories and name the two exceptions inline instead of only in the PR description. CONTRIBUTING.md picked up two adjacent paragraphs describing the same docs-links/lychee gate once ROCm#579 merged: this PR's architecture.md- specific one and ROCm#579's general one. Folded the specific detail into the module-organization pointer and kept ROCm#579's general paragraph. lychee.toml's header still described this PR as a not-yet-landed follow-up; updated now that it's the current state. Signed-off-by: Jussi Elo <jussi.elo@amd.com>
e8d18f6 to
f31068b
Compare
Signed-off-by: Jussi Elo <jussi.elo@amd.com>
rominf
left a comment
There was a problem hiding this comment.
🔴 Automated review · pr-review-watcher · ebac5f3
This automation never files a GitHub approval, so no approving review will
appear here whatever the outcome — the merge decision stays with a human
reviewer.
Review — no blocking findings
Full review of the whole change.
Implements steps 1 and 4 of #578 (citations rewritten as links, checker and its CI job deleted). Step 2, the lychee job, landed earlier in #579. It does not do the optional step 3 (a lint against new bare citations), and the description says so. The description does not claim to close #578.
Blocking
None
Non-blocking
None
Decisions for the author
- (new) Directory citations are no longer enforced — answered-by-intent
- The old
citation_existschecked bare directory names and slash paths. Its own testbare_crate_directory_name_matches_a_path_component(atprw-base:xtask/src/architecture_doc.rs:998) shows this. - Now nothing checks these citations:
crates/rocm-engine-protocol(docs/architecture.md:44),rocm-dash-core/rocm-dash-collectors/rocm-dash-daemon(:40) andtests/e2e-cucumber(:24). None of them has a linked file underneath, so renaming one would now pass CI. - Otherwise this would be a non-blocking coverage regression. The description answers it: "the
apps/rocm-style section headings that name a directory rather than a file (the old checker validated these too … a check this migration doesn't replicate, since a directory doesn't go stale the way a file citation does)". - That passage covers the headings.
tests/e2e-cucumberon line 24 is running prose rather than a heading, so confirm it falls under the same reasoning.
- The old
- (new) Enforcement now depends on authors writing links — tradeoff
- What changes: the old gate caught any new backtick citation, linked or not. Lychee sees only links, so a new bare
`foo.rs`passes silently. - For the change: a large heuristic engine and its bug history go away, and #578 explicitly accepts leaving that kind of citation to code review.
- Against: the guarantee in the doc's header (
docs/architecture.md:11) now holds only by reviewer discipline, and step 3 of #578 is deferred. - The description argues this deliberately, so this item only confirms the choice.
- What changes: the old gate caught any new backtick citation, linked or not. Lychee sees only links, so a new bare
- (new) No local pre-push check replaces the removed hook — tradeoff
- The
architecture-dochook in.pre-commit-config.yamlcaught stale citations before push. No lychee hook replaces it, so the first signal is now the CI job. - Neither the old
architecture-docjob norMarkdown links resolve (lychee)is inmain's required status checks (I queried them live). So the merge gate itself is unchanged, and removing the job leaves no required check stranded.
- The
Positive signals
- Every repeated mention of a file is linked, not just its first one. Without that, a later bare repeat would sit unchecked next to a linked first mention. A scripted check confirmed all 100+ link targets exist and that each label's basename matches its target. Every bare
lib.rs/main.rs/install.rs/state.rspoints into the crate of the section it sits in. - The description is unusually exact about scope: which citations stay bare and why, the directory check it gives up, and the coverage floor it chose not to re-bless.
Deployment notes
None
What this covered
- What was read: every file in the change, completely,
24993519…ebac5f32. That includes the deletedxtask/src/architecture_doc.rs, read fromprw-baseto establish what it enforced. - Run by workers:
cargo clippy -p xtask --all-targets --locked -- -D warnings: clean.cargo test -p xtask --locked: 223 passed.cargo tree -i pulldown-cmark: the package is absent.cargo xtask manifest --check: passes.- Tree-wide
git grepfor leftover references: only the intentional historical note atlychee.toml:4.
- CI at the reviewed head: every check passed except
E2E tests (MI300X), which was still queued. Those includeMarkdown links resolve (lychee)and the coverage gateCoverage (rocm-dash crates, ratcheted). The coverage pass settles whether xtask's floor survives the deletion. The issue's local lychee trial already showed lychee failing on a renamed file. - Did not run:
- Lychee locally, because it is not installed. So I did no local break-a-link mutation; the CI run stands in for it.
- THIRD_PARTY_NOTICES regeneration via cargo-about. That file was checked by reading only, alongside the green
Third-party notices currentcheck. - The prior-changes pass (review comments on earlier PRs touching these files), deliberately: this run reads no review discussion.
- Not independent: the design questions in Step 7 were answered by the driver from the workers' results, not by separate workers.
- Not reconciled against any PR discussion here.
Standing objections from the change request at 0a0e7ca
Both blockers of the earlier change request (review 5442339841, since dismissed by the author) were standing objections, not re-found blind this round. Each was settled by putting its wording and the author's reply to the reviewer after this report was frozen (anchored evidence), and both point the same way as the blind review's silence:
- Unmergeable as based / false no-rebase premise — no longer holds. #579 is now in the branch's history,
git merge-treeagainst currentmainis clean, thedocs-linkscomment,lychee.tomlheader andCONTRIBUTING.mdduplication are fixed, the lychee check passed atebac5f32, and the description no longer claims no rebase was needed. The fork point trails currentmain, so re-check conflicts ifmainmoves before merge. - Description claimed an "arg/" drive-by edit not in the diff — no longer holds. Neither the description nor any commit in the range makes the claim, and the doc wording is unchanged and correct.
No blocking objection remains, so this round files no change request.
…ile, citations Closes the reviewer's open confirmation: the Module map's scoping paragraph bare-names xtask and tests/e2e-cucumber as workspace directories, not file citations, so the per-crate-inventory link guarantee in the intro doesn't apply to them — same reasoning as the per-crate section headings. Signed-off-by: Jussi Elo <jussi.elo@amd.com>
|
Confirmed: Named it explicitly in 2906f8f so the doc states this itself rather than leaving |
rominf
left a comment
There was a problem hiding this comment.
🔴 Automated review · pr-review-watcher · 2906f8f
This automation never files a GitHub approval, so no approving review will
appear here whatever the outcome — the merge decision stays with a human
reviewer.
Review — no blocking findings
Review of changes since the review at ebac5f3, plus the files they touch (docs/architecture.md).
The PR names no ticket. Its description refers to #579, #578, #492, #440 and #524 only as background, and none is a ticket this change claims to close.
Blocking
None
Non-blocking
- (new) The description doesn't list the newly documented exemption — PR description, Scope section;
docs/architecture.md:24
The Scope section lists the citations that are "Also intentionally bare, and now said so in the doc itself": the convention-sectionmain.rs/lib.rsillustrations, theapps/rocm-style section headings, and the intro'slychee.toml/Cargo.toml. Commit 2906f8f adds a fourth case that the doc now states: the Module map scope paragraph's barextaskandtests/e2e-cucumber. It is the same category as the section headings (a directory, not a file), so no reader is misled about anything substantive. Still, the description's list is no longer complete.
Confidence 70 · mechanical · Fix: add the scope paragraph'sxtask/tests/e2e-cucumberto the Scope list, or reword that list as "directory names, e.g. the section headings and the scope paragraph".
Decisions for the author
- (new) Should the new clause stay at all? — non-blocking-improvement
The line-11 guarantee covers only "the Module map's per-crate inventories below". Line 24 is the Module map's scope paragraph, which comes before any###inventory, so it was never inside the guarantee. The new clause therefore explains an exemption that wasn't needed. The clause is accurate.
It is also uneven. The same sentence bare-namescrates/e2e-report, a third directory, but "both" covers onlyxtaskandtests/e2e-cucumber. You can either keep the clause and make it cover every directory name in that paragraph, or drop it. Since the paragraph sits outside "per-crate inventories", it is out of scope by the guarantee's own wording.
Positive signals
None
Deployment notes
None
What this covered
I read git diff ebac5f32..HEAD (2906f8f, one line in docs/architecture.md) and all 58 lines of docs/architecture.md. I checked every bare (unlinked) filename in the Module map inventories against the line-11 exception list. Only agent.rs (line 42, twice) and report.json (line 54) are unlinked, which matches the exceptions. I checked lychee.toml and the docs-links job in .github/workflows/ci.yml against the doc's claims, and they match. I also read the PR description and commit messages for ebac5f3 and 2906f8f. I ran the AGENTS.md leak scan by eye over the changed line, and it is clean. CI rollup at 2906f8f is all green, including Markdown links resolve (lychee), Commit signatures + sign-off, E2E tests and Coverage. Read against prw-base…2906f8f4b1c61407c9c7f67182c660529a9b1154.
I ran it as a single pass, since the change is one line. One independent worker reviewed the file and diff blind. I ran history myself: git log, and I checked the line-11 guarantee against the prw-base version. The agent-instruction pass was also mine.
Did not run:
- Prior-changes pass: it would require reading earlier review discussion, which this run excludes.
- Builds and tests: none needed for a prose-only change.
Not reconciled against any discussion here.
Reviewer flagged the clause added in 2906f8f as unnecessary: the Module map's scope paragraph sits before any per-crate inventory, so it was never covered by the link-everywhere guarantee the clause was defending against. It was also uneven, since the same sentence bare-names a third directory (crates/e2e-report) the clause didn't mention. Reverting to the prior wording. Signed-off-by: Jussi Elo <jussi.elo@amd.com>
|
Addressing the review at `2906f8f4` (review id 5455664569): Non-blocking — description doesn't list the new exemption: moot now, see below. Decision — should the new clause stay at all: Dropped it in e6c121b. Agreed with the review's reasoning: the Module map's scope paragraph (line 24) sits before any per-crate `###` inventory, so it was never covered by the link-everywhere guarantee ("per-crate inventories below") to begin with — the clause was defending against something that was never in question. It was also uneven, since the same sentence bare-names a third directory, `crates/e2e-report`, that the clause didn't cover. Reverted to the pre-2906f8f4 wording rather than extending it to cover all three, since the paragraph doesn't need the carve-out at all. Since the clause is gone, there's nothing new in the doc for the PR description to list either — the first finding is resolved as a side effect. |
rominf
left a comment
There was a problem hiding this comment.
Approving — links all resolve to the right files and CI was green at the previous head; e6c121b only drops the line-24 exemption clause. One non-blocking nit: lychee.toml:2-4 and CONTRIBUTING.md:76 still describe all of architecture.md's path citations as links, but the section headings and directory names (:20, :24, :26-56) stay bare and unchecked. docs/architecture.md:11 has the accurate scope; worth matching those two to "the per-crate inventories' file citations".


Summary
xtask/src/architecture_doc.rsvalidateddocs/architecture.md's backtick-quoted pathcitations (e.g.
`main.rs`) against the tracked tree, and had grown to ~1,500 lines ofprose-inference heuristics to disambiguate which crate a bare citation belongs to (the
repo has 17 files literally named
main.rs/lib.rs) — possessive-owner chains,sentence-boundary detection, an abbreviation list, a prose-slash-word list. #492, #440,
and the test-isolation bug in #524 all trace back to that complexity.
This rewrites every citation in
docs/architecture.mdas an explicit relative markdownlink and deletes the checker outright: a link carries its own full path, so there's
nothing left to disambiguate. That includes every repeated mention of an already-linked
file, not just its first appearance — a bare repeat would stay unchecked by lychee even
after the file moved. #579 added the
docs-linksCI job (lychee) this relies on; thisbranch is now rebased onto
mainpast that merge, so the job runs for real on this PR(confirmed green) instead of only being promised.
Also removes
pulldown-cmarkfromxtask/Cargo.tomland the workspace's[workspace.dependencies]:architecture_doc.rswas its only consumer anywhere in thetree.
MANIFEST.mdandTHIRD_PARTY_NOTICES.txtare regenerated to match.Scope
Two citations are deliberately not links: "the old agent.rs" in the
rocm-dash-tuientry (historical prose about a file that no longer exists — linking it would be a dead
link to something that was never meant to resolve), and
report.jsonin thecrates/e2e-reportentry (cucumber's generated output, not a tracked source file — apre-existing blind spot the old checker never validated either). Both exceptions are now
named inline in the doc's own intro paragraph, not just here.
The link-everywhere guarantee covers the Module map's per-crate inventories. Also
intentionally bare, and now said so in the doc itself: the Module organization convention
section's generic
`main.rs`/`lib.rs`-style illustrations (e.g. "they should notgrow inside
main.rs/lib.rs", which names no specific file — same category the oldchecker's abbreviation-list reasoning existed to separate from a real citation); the
apps/rocm-style section headings that name a directory rather than a file (the oldchecker validated these too, as bare directory names — a check this migration doesn't
replicate, since a directory doesn't go stale the way a file citation does); and this
intro paragraph's own
lychee.toml/Cargo.tomltool references.Not included: a lint guarding against a new bare citation reintroducing the unchecked
form. A regex that reliably tells a real citation apart from this doc's generic pattern
references ends up needing the same kind of inference this migration removes. A new bare
citation is a literal, reviewable string in the diff — the same reasoning #578's proposal
already applies to a citation that resolves to the wrong file.
Test plan
docs-links(lychee) CI job: green on this branch's current head — the real gate addedby ci: add lychee link-check gate for markdown #579, not a local approximation.
cargo test -p xtask: 223 passed (was 271 before this PR; removesarchitecture_doc's46 tests plus 2 others no longer applicable).
cargo clippy -p xtask --all-targets -- -D warnings,cargo fmt --check: clean.cargo check -p xtask --all-targetsafter removingpulldown-cmark: clean,Cargo.lockupdated (12 lines removed, no other crate referenced it).
cargo xtask manifest --check/cargo xtask tpn --check(cargo-about 0.9.1, pinned):both pass —
MANIFEST.md/THIRD_PARTY_NOTICES.txtregenerated,pulldown-cmarkgonefrom both.
architecture_doc/check-architecture-docanywherein the tree (docs, CI, prek config, xtask source).
Not committed:
cargo xtask coverage --bless. Removing ~1,500 lines and 46 testschanges the
xtaskcrate's measured floor incoverage-floors.toml. I did run the fullcargo llvm-cov --workspacemeasurement this needs, butcoverage-floors.tomlhasn'tbeen re-blessed since it was introduced in #482, so the result moved all 13 crates' numbers
— most by margins this PR's diff doesn't touch (e.g. rocm-core's measured line count alone
shifted by +4177 lines from unrelated merged work). Committing that wholesale would fold
unrelated accumulated drift into this PR under this PR's name. Keeping the original plan
instead: CI's
Coverage (rocm-dash crates, ratcheted)job (its name is stale — it coversevery workspace crate, including
xtask) reports the real number against the now-stalefloor; if it fails, a follow-up commit re-blesses it against that measurement.