refactor(capco): PR 4b-F — retire &PageContext residue parameters + close PR-4 tasks bookkeeping#542
Merged
Conversation
…tice_body The lattice fold body has not read its `_tmp_ctx: &PageContext` parameter since PR 4b-E migrated the residue-axis accessors to free helpers in `crates/capco/src/lattice.rs`. The underscore-prefixed parameter was a precautionary fiction — kept at the function boundary "for signature stability." With PR 4b-F it goes away entirely; the pipeline shape is now `portions → per-axis lattice composition → out`. `join_via_lattice_with_context` continues to own the same-slice contract (debug-assert on `portions == page_ctx.portions()`) and delegates to the new single-argument body. Public + crate-internal signatures (`pub fn join_via_lattice`, `pub(crate) fn join_via_lattice_with_context`) unchanged. Module-level doc and `join_via_lattice_body`'s doc-comment updated to reflect the simplified pipeline shape. The `#[allow(clippy::too_many_lines)]` attribute is preserved — the ~420-LOC body needs it regardless of the one-line parameter drop. Reviewer attestation: - Constitution VII §IV: within-006 precedent (PR 4b-B/C/D.2/D.3/E established marque-capco-only scope discipline). No engine touches. - Constitution V G13: no panic-message edits; the surviving `join_via_lattice_with_context` same-slice debug-assert keeps its counts-only message verbatim. - Constitution VIII: no §-citations rewritten in this commit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…s_pipeline The inner pipeline body — formerly `project_attrs_pipeline_with_context(raw, page_ctx)` — no longer needs its `&PageContext` parameter. Commit 1 retired the residue read inside `join_via_lattice_body`, leaving the parameter at this layer existing only to forward to `join_via_lattice_with_context` for the same-slice debug-assert. With `join_via_lattice_body` consuming only `&[CanonicalAttrs]`, the same-slice contract becomes vacuous at this layer: there is no second slice for an inner body to drift from. Net change: - Rename `project_attrs_pipeline_with_context` → `project_attrs_pipeline`. New signature: `(&self, raw: &[CanonicalAttrs]) -> CanonicalAttrs`. - Body calls `CapcoMarking::join_via_lattice(raw)` directly (the `_with_context` round-trip retires in Commit 4). - `project_from_attrs_slice` shrinks from an 11-line tmp_ctx build + delegate to a one-line forward to `project_attrs_pipeline`. - `project_from_page_context` calls `self.project_attrs_pipeline(page_context.portions())` — the same-slice property becomes structural at the boundary, documented in the doc-comment. The `raw_snapshot` debug-assert sentinel that guards the closure operator's read-only-attrs invariant (`docs/plans/2026-05-01-lattice-design.md` §3 (e.1); D23) is PRESERVED verbatim — it's load-bearing for the closure-mutates-input-slice detection, unrelated to PageContext. G13 counts-only panic-message preserved. One stale cross-file reference fixed opportunistically: `crates/engine/src/engine.rs:4540-4574` → `crates/engine/src/engine.rs` (symbolic name `check_portions_unchanged` already named inline; the file:line anchor was already wrong — the function is at engine.rs:4559 per `feedback_avoid_line_number_anchoring`). `closure.rs:318` doc-comment updated to name the renamed function. Reviewer attestation: - Constitution VII §IV: marque-capco only. - Constitution V G13: counts-only panic preserved; no content format placeholders introduced. - Constitution VIII: no §-citations rewritten; one stale file:line anchor retired per project convention. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…nto trait body
Post-Commit-2, `project_from_attrs_slice` was a 2-line wrapper
around `self.project_attrs_pipeline(portions)` with one in-crate
caller (the trait `MarkingScheme::project` body). Inline it and
delete the standalone function.
The trait body's `Scope::Page | Scope::Document | Scope::Diff` arm
now calls `self.project_attrs_pipeline(&raw)` directly — one fewer
indirection on the trait path. The engine fast-path's
`project_from_page_context` is the symmetric counterpart; both
delegate to the same shared pipeline body via two genuinely-
different shapes:
- Trait path: `Vec<CapcoMarking>` → per-portion `.0.clone()` →
`project_attrs_pipeline`.
- Engine path: `&PageContext` → `page_context.portions()` →
`project_attrs_pipeline`.
No third entry point survives — only the two shapes the codebase
needs. `project_from_page_context`'s doc-comment rewritten to
reflect this, including the same-slice-property paragraph (the
property is now structural: derivation flows from one site, so
there is nothing for the inner pipeline to drift from).
Reviewer attestation:
- Constitution VII §IV: marque-capco only.
- Constitution V G13: no panic-message edits.
- Constitution VIII: no §-citations rewritten.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ntext Post-Commit-3, the `_with_context` fast-path variant of `CapcoMarking::join_via_lattice` has no production callers. The trait-path entry (`MarkingScheme::project`) and the engine fast-path entry (`CapcoScheme::project_from_page_context`) both delegate through `CapcoScheme::project_attrs_pipeline`, which calls `CapcoMarking::join_via_lattice(raw)` directly. The `_with_context` variant existed solely for the same-slice debug-assert; with no parallel slice derivation path remaining, the assert was already vacuous. Net change: - `pub fn join_via_lattice(portions)` now calls `Self::join_via_lattice_body(portions)` directly. The one-shot tmp_ctx build is gone. - `pub(crate) fn join_via_lattice_with_context` deleted. - The same-slice contract becomes a structural property of how `project_from_page_context` derives `raw` from `page_context.portions()` once at the boundary — documented in that method's doc-comment, not runtime-checked. The G13 panic site in the deleted `_with_context` body retires with it; the surviving G13 sentinel is the closure-mutates-input check in `project_attrs_pipeline`, unchanged. Three doc-comment sites updated to reflect the collapse: - Module-level doc on `marking.rs`. - The status-note block on the dropped `JoinSemilattice` impl history. - `scheme/actions/mod.rs`'s historical reference to the retired helper consumer. The `join_via_lattice` method's doc-comment rewritten to drop the stale "two paths + six divergences" PR 4b-B framing — the current parity gate at `lattice_vs_scheme_parity.rs` is a TWO-path comparison (per-axis lattice vs full scheme pipeline) with 74 fixtures. Reviewer attestation: - Constitution VII §IV: marque-capco only. - Constitution V G13: the retiring `_with_context` debug-assert was counts-only; no panic message survives that could leak content. The surviving `project_attrs_pipeline` closure-sentinel keeps its counts-only message. - Constitution VIII: no §-citations rewritten; one doc-comment reference to `crates/scheme/src/scheme.rs:46` retired to symbolic form per `feedback_avoid_line_number_anchoring`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…t sweep Closes the PR 4b-F structural-residue cleanup arc with three deliverables: 1. **tasks.md (specs/006-engine-rule-refactor/tasks.md)**: tick T111–T115 with one-line resolution notes naming both the marque-internal PR series and the GitHub PR number per OQ-4. T069 stays unchecked with a resolution note recording the PR 4b-F architect's investigation per OQ-3 (full PageContext retirement requires marque-rules + marque-engine ripple; properly belongs to PR 6c). T111 was closed in PR 4a / #422 (not Phase 5 PR-2 / #146 as the architect plan §1 Commit 6 table originally cited); `git log --grep="is_fdr_dissem"` against staging found the `Vocabulary::is_fdr_dissem` trait method landed in commit fc91852, 2026-05-15. 2. **Doc-comment sweep**: scrubbed stale references to retired `PageContext::expected_*` accessor names in `marque-capco` source. Every §-citation in rewritten doc-comments re-verified against `crates/capco/docs/CAPCO-2016.md` using the `CAPCO-2016_citation_index.yml` finder (Constitution VIII). Sites edited: - `crates/capco/src/lattice.rs`: DissemSet overlay set + the post-PR-4b-E divergence inventory rewritten to name the surviving lattice-vs-scheme comparison structure. `to_vec` doc + the cross-axis NOFORN injection example doc-comment rewritten to drop retired-API references. §-citations verified: §H.8 p134 / p136 / p140 / p145 / p150-151 / p155-156 / p178 / p185, §H.6 p104 / p116 / p118, §D.2 Table 3 rows 1-2. - `crates/capco/src/scheme/marking.rs`: G-9 Conflict-axis comment + G-4 + G-4b + G-4c FGI-axis comments + the non-solely-non-US FGI branch comment rewritten to drop PageContext-side references. §H.7 p122 + p123 + p124 + p128 verified. - `crates/capco/src/scheme/actions/fgi.rs`: `extract_foreign_sources` doc-comment re-anchored from `page_context.rs:911-912 / 914-921` (dead file:line refs) to symbolic CAPCO citations: §H.7 p123 (NATO reciprocity surfacing onto FGI axis) and §H.3 p56 (USA implicit on JOINT producer list). - `crates/capco/src/scheme/constraints/categories.rs`: AEA and FGI `Custom` aggregation comments scrubbed. - `crates/capco/src/scheme/rewrites/pattern_c.rs`: UCNI promote-before-strip comment re-anchored to the regression test name `pattern_c_dod_ucni_classified_strip_promotes_noforn`. - `crates/capco/src/scheme/rewrites/noforn_clears.rs`: cleared references to `expected_dissem_us Step 6` / `page_context_to_attrs` — both retired surfaces. The PageRewrite mirrors the policy enforced by `DissemSet::with_noforn_injected` on the lattice path. - `crates/capco/src/render/render_aea.rs`, `render_declassify.rs`, `render_dissem.rs`: render-precedent doc-comments re-anchored to CAPCO §E.1 / §E.3 / §H.6 p104 / §H.8 p150-151 / §A.6 p15-17. - `crates/wasm/src/lib.rs`: `compute_banner_native` doc-comment scrubbed. 3. **Workspace audit attestation (Commit 5 fold-in)**: the architect plan's Commit 5 prescribed a separate audit-and-cleanup commit; with no third `_tmp_ctx` / `_page_context` / `_page_ctx` site surfacing and OQ-1 keeping `&PageContext` on the engine's `project_page_marking` helper, there was no functional change to land. The audit attestation lives in this commit and the implementation report at `docs/plans/2026-05-18-pr4b-F-implementation-report.md`. Final grep results (full results in the implementation report): - `_tmp_ctx` / `_page_context` / `_page_ctx`: 1 hit, in the doc-comment in PR 4b-F itself that explicitly records the retirement of the parameter. - `page_context.rs:NNN` file:line refs: zero matches in `crates/*/src/`. - `expected_dissem_us` / `expected_aea_markings` / `expected_classification` / `render_expected_banner`: three residual matches, all in `crates/ism/src/page_context.rs` and `crates/ism/src/projected.rs` deletion-record doc-comments. Marque-ism source edits out of PR 4b-F scope per Constitution VII §IV + plan-§1 hard constraint "PageContext shim stays UNTOUCHED." T069 / PR 6c will sweep these alongside the full PageContext retirement. Also lands the architect plan + rust-preflight + implementation report as `docs/plans/` artifacts. Reviewer attestation: - Constitution VII §IV: marque-capco + marque-wasm + bookkeeping. Zero edits to marque-engine, marque-ism, marque-scheme, marque-rules, marque-core. Within-006 precedent verbatim (PR 4b-B Commit 2 / 4b-C Commit 5 / 4b-D.2 / 4b-D.3 / 4b-E). - Constitution V G13: no panic-message edits in this commit. - Constitution VIII: every §-citation re-verified per the authoring discipline; verification table in the implementation report's §7. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…-f-residue-cleanup
Reverts §E.1 citation drift in render_declassify.rs module-doc
(Constitution VIII MEDIUM, flagged independently by both rust-review
F-1 and code-review M-2): the Commit 6 doc-comment sweep restructured
the "Per CAPCO-2016 §E.1, the banner line is..." sentence so §E.1
(Original Classification Authority p31) now appeared to govern the
banner-line format. Banner format authority is §A.6 pp 15-17 Figure 2;
§E.1 governs CAB placement on a separate block of the page. Restored
§A.6 as the banner-format citation and kept §E.1 as the parenthetical
for the CAB-placement claim.
Also adds the three reviewer reports at
docs/plans/2026-05-18-pr4b-F-{rust,code,lattice}-review.md.
Reviewer attestation:
- Constitution VIII: §E.1 + §A.6 re-verified against
crates/capco/docs/CAPCO-2016.md via CAPCO-2016_citation_index.yml.
§E.1 "Original Classification Authority" starts p31; §A.6 Formatting
pp 15-17 Figure 2 per CAPCO-CONTEXT.md §1.
- Constitution VII §IV: zero engine-crate edits; touch limited to
crates/capco/src/render/render_declassify.rs (4 doc-comment lines)
plus 3 review-report .md files.
- Constitution V G13: no panic-message edits.
- Verification: cargo +stable clippy --workspace --all-targets -- -D warnings
clean; cargo test --test lattice_vs_scheme_parity -p marque-capco
74/74 pass.
Refs:
- rust review F-1 / docs/plans/2026-05-18-pr4b-F-rust-review.md
- code review M-2 / docs/plans/2026-05-18-pr4b-F-code-review.md
- lattice review APPROVED / docs/plans/2026-05-18-pr4b-F-lattice-review.md
Addresses two on-target inline comments from Copilot's R1 review pass: **C-1 (render_declassify.rs:27)** — the "(typically the bottom of the cover page)" editorial gloss was attributed to §E.1 by sentence position, but §E.1 specifies CAB must appear on the face of the document without prescribing a specific page location. Dropped the unsupported page-location detail; kept the "lives on its own block on the face of the document per §E.1" claim which §E.1 supports directly. **C-2 (tasks.md:335)** — the T111 resolution note referenced a non-in-repo memory artifact (`project_is_fdr_dissem_vs_is_fdr_dominator`), making the cross-reference unverifiable for outside readers. Replaced with in-repo references: the trait-method doc-comment at `crates/scheme/src/vocabulary.rs::Vocabulary::is_fdr_dissem` (explaining the `is_fdr_dissem` / `is_fdr_dominator` distinction) + the `FDR_DOMINATORS` slice maintenance contract at `crates/capco/src/scheme/closure.rs`. Reviewer attestation: - Constitution VIII: §E.1 + §A.6 citations preserved verbatim; removed an unsupported claim that was syntactically anchored to §E.1 without being supported by it. - Constitution VII §IV: zero engine-crate edits; only doc-comment + tasks.md prose edits. - Constitution V G13: no panic-message edits. - Verification: cargo +stable clippy --workspace --all-targets -- -D warnings clean; parity gate 74/74 pass.
Contributor
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 20 out of 20 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (2)
crates/capco/src/scheme/marking.rs:173
- Doc comment still says "Shared body for the two
join_via_latticeentry points", butjoin_via_lattice_with_contexthas been deleted and there is now only one entry point. Update this sentence to avoid implying a second API surface exists.
/// Shared body for the two `join_via_lattice` entry points.
///
crates/capco/src/render/render_declassify.rs:27
- Citation formatting here is inconsistent with nearby
§A.6 p15-17usage (render_dissem.rs):§A.6 pp 15-17includes an extra space and uses a different page-range style. Consider normalizing to the repo’s standard§A.6 p15-17/§A.6 pp15-17format (and similarly add a page number for the trailing§E.1reference if you adopt the§X.Y pNNconvention).
//! **The CAB is not rendered inline with the banner / portion line.**
//! The banner line is `CLASSIFICATION//SCI//SAR//AEA//FGI//DISSEM//NON-IC`
//! per CAPCO-2016 §A.6 pp 15-17 Figure 2; the CAB ("Classified By",
//! "Derived From", "Declassify On") lives on its own block on the
//! face of the document per §E.1.
| - [ ] T113 [US6] Wire FOUO `SupersessionSet` over the dissem axis through `is_fdr_dissem` so FOUO is evicted by any non-FD&R dissem token (FR-009, FR-010; PR-4) | ||
| - [ ] T114 [US6] Wire cross-axis FOUO eviction by classification > U through the `Constraint` evaluator (FR-009; PR-4) | ||
| - [ ] T115 [US6] Delete `CapcoMarking::join`'s `PageContext` delegation; clean break, no equivalence shim (FR-014; PR-4) | ||
| - [x] T111 [US6] Extend `Vocabulary<S>` with `is_fdr_dissem(token: TokenId) -> bool` per FR-010; bake from `crates/capco/docs/CAPCO-2016.md` §H.8 at build time (Phase 5 metadata-surface mechanism); returns false for non-dissem categories (FR-010; PR-4) — closed in PR 4a / #422. `Vocabulary::is_fdr_dissem` and `is_fdr_dominator` live on `CapcoScheme`; the two semantics are distinct (broad FD&R membership vs ConflictsWithFamily dominator set) — see the trait-method doc-comment at `crates/scheme/src/vocabulary.rs` (`Vocabulary::is_fdr_dissem`) and the `FDR_DOMINATORS` slice maintenance contract at `crates/capco/src/scheme/closure.rs`. |
Comment on lines
9
to
+15
| //! - CAPCO-2016 §E.1 (Original Classification Authority) — the | ||
| //! Classification Authority Block (CAB) line "Declassify On". The | ||
| //! CAB is a separate block from the banner line and portion mark; | ||
| //! it carries the declassification date / event / exemption. | ||
| //! - CAPCO-2016 §E.3 (Multiple Sources and the Declassify On Line | ||
| //! Hierarchy) — only one value per CAB. When multiple sources | ||
| //! contribute, use the longest-duration value (the existing | ||
| //! `PageContext::expected_declassify_on` returns the `MaxDate` | ||
| //! projection per `Category::aggregation = AggregationOp::MaxDate` | ||
| //! in `CapcoScheme::build_categories`). | ||
| //! contribute, use the longest-duration value. The lattice form |
…ments Both Copilot R2 inline comments arrived flagged "suppressed due to low confidence" — per project memory, those are reliably on-target. **S-1 (marking.rs:172)** — doc-comment "Shared body for the two `join_via_lattice` entry points" was correct pre-PR-4b-F (when `join_via_lattice` and `join_via_lattice_with_context` both forwarded into `_body`), but Commit 4 retired `_with_context`, leaving only one entry point. Dropped "the two" → "the". **S-2 (render_declassify.rs:27)** — citation-style normalization against the codebase's dominant forms (verified via grep across crates/capco/src/): - `§A.6 pp 15-17` → `§A.6 p15-17` (single-p, no-space form matches the codebase's prevailing multi-page citation style; `pp 15-17` was a non-standard variant). - `§E.1` → `§E.1 p31` (page-number-required per memory `feedback_citations_use_page_numbers` and the §X.Y pNN convention). §E.1 "Original Classification Authority" starts p31 per crates/capco/docs/CAPCO-2016_citation_index.yml. Reviewer attestation: - Constitution VIII: both citation forms re-verified against crates/capco/docs/CAPCO-2016.md via CAPCO-2016_citation_index.yml. - Constitution VII §IV: zero engine-crate edits. - Constitution V G13: no panic-message edits. - Verification: cargo +stable clippy --workspace --all-targets -- -D warnings clean; parity gate 74/74 pass.
Merged
8 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
PR 4b-F closes the trailing boundary residue left after PR 4b-E retired the
PageContext::expected_*accessor surface. After 4b-E, three nested layers of the lattice + projection pipeline carried&PageContextparameters whose bodies no longer read them. PR 4b-F retires the dead parameters and consolidates the pipeline to a single&[CanonicalAttrs] → CanonicalAttrsshape end-to-end.Also closes PR-4 task bookkeeping (T111–T115) that lagged across 4b-A through 4b-E.
Pipeline shape
Before (post-4b-E):
After:
Commit sequence
9af3b925)_tmp_ctxfromjoin_via_lattice_body8358e4d7)page_ctxfromproject_attrs_pipeline(renamed from_with_context)c8b0c9ed)project_from_attrs_sliceinto trait body28fceac7)join_via_lattice_with_context(sole_with_contextsurvivor)5ad6e886)tasks.mdbookkeeping + doc-comment sweepfee63ffb)chore(deps): update claude and gemini action versions(#staging)b8969d21)Commit 5 (engine call-site cleanup + workspace
_tmp_ctxaudit) folded into Commit 6 — workspace audit surfaced no functional cleanup; PM decision OQ-1 (keep&PageContexton engineproject_page_marking) meant zero engine-crate edits required.PM decisions (resolved 2026-05-18)
&PageContexton engineproject_page_marking(Option A). Zeromarque-enginesource edits._tmp_ctxaudit → no third site surfaced.PageContextstruct retirement) — properly belongs to PR 6c per task text. PageContext shim stays.PR 4b-X / #YYY) in tasks.md resolution notes.Constitution VII §IV authorization
PR 4b-F is the engine refactor's structural close — its final signature-cleanup commit, not a scheme adoption. Within-006 precedent for engine-adjacent edits: PR 4b-B Commit 2 (PageContext bugfixes in
marque-ism), PR 4b-C Commit 5 (PageContext branch retirements inmarque-ism), PR 4b-D.2 / .3 (Engine hot-path flip acrossmarque-engine/marque-ism/marque-capco), PR 4b-E (PageContextexpected_*surface deletion inmarque-ism). PR 4b-F touches nomarque-ismsource (onlymarque-capcodoc-comments + signatures); the precedent envelope strictly accommodates this scope. No new scheme adopted; PageRewrite catalog unchanged; closure rules unchanged.Tasks closed
Vocabulary<S>::is_fdr_dissemtrait method shippedDisplayOnlyBlock/NonIcDissemSet)capco/non-fdr-control-evicts-fouoPageRewritecapco/classification-evicts-fouoPageRewriteT069 (full
PageContextstruct retirement) stays unchecked per OQ-3 — deferred to PR 6c.Reviewer attestation
Independently reviewed by three agents:
docs/plans/2026-05-18-pr4b-F-rust-review.md) — APPROVED-WITH-CONCERNS, 0 CRITICAL / 0 HIGH / 1 MEDIUM (F-1: §E.1 citation — fixed in Commit 7).docs/plans/2026-05-18-pr4b-F-code-review.md) — APPROVED-WITH-CONCERNS, 0 CRITICAL / 0 HIGH / 2 MEDIUM (M-1: action SHA downgrade — fixed by mergefee63ffb; M-2: §E.1 — same as rust F-1, fixed in Commit 7).docs/plans/2026-05-18-pr4b-F-lattice-review.md) — APPROVED, 0 CRITICAL / 0 HIGH.Both MEDIUM findings resolved in Commit 7.
Pre-merge verification
cargo check --workspace— cleancargo +stable clippy --workspace --all-targets -- -D warnings— clean per commitcargo test --workspace— cleancrates/capco/tests/lattice_vs_scheme_parity.rs— 74/74 pass_tmp_ctx/_page_context/_page_ctxincrates/*/src/: 1 match (historical doc-note inmarking.rs, not a residual code use)expected_dissem_us/expected_aea_markings/expected_classification/render_expected_banner: 3 matches, all incrates/ism/src/{page_context,projected}.rsdeletion-record doc-comments (out of scope per Constitution VII §IV; will be swept with T069 / PR 6c)crates/capco/docs/CAPCO-2016.mdviaCAPCO-2016_citation_index.ymllint_10kb973µs (signature-only PR; within documented baseline-staleness band)Plan + reports
docs/plans/2026-05-18-pr4b-F-residue-cleanup-plan.mddocs/plans/2026-05-18-pr4b-F-rust-preflight.mddocs/plans/2026-05-18-pr4b-F-implementation-report.mddocs/plans/2026-05-18-pr4b-F-rust-review.mddocs/plans/2026-05-18-pr4b-F-code-review.mddocs/plans/2026-05-18-pr4b-F-lattice-review.mdTest plan
cargo check --workspaceclean per commitcargo +stable clippy --workspace --all-targets -- -D warningsclean per commitcargo test --workspaceclean