Skip to content

refactor(capco): PR 4b-F — retire &PageContext residue parameters + close PR-4 tasks bookkeeping#542

Merged
bashandbone merged 9 commits into
stagingfrom
refactor-006-pr-4b-f-residue-cleanup
May 18, 2026
Merged

refactor(capco): PR 4b-F — retire &PageContext residue parameters + close PR-4 tasks bookkeeping#542
bashandbone merged 9 commits into
stagingfrom
refactor-006-pr-4b-f-residue-cleanup

Conversation

@bashandbone
Copy link
Copy Markdown
Collaborator

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 &PageContext parameters whose bodies no longer read them. PR 4b-F retires the dead parameters and consolidates the pipeline to a single &[CanonicalAttrs] → CanonicalAttrs shape 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):

Engine::project_page_marking(&PageContext)
  └─ CapcoScheme::project_from_page_context(&PageContext)
       └─ project_attrs_pipeline_with_context(&[CanonicalAttrs], &PageContext)  ← page_ctx unused
            └─ join_via_lattice_with_context(&[CanonicalAttrs], &PageContext)   ← page_ctx debug-assert only
                 └─ join_via_lattice_body(&[CanonicalAttrs], &PageContext)      ← _tmp_ctx dead

After:

Engine::project_page_marking(&PageContext)        ← engine API stable (OQ-1 Option A)
  └─ CapcoScheme::project_from_page_context(&PageContext)
       └─ project_attrs_pipeline(&[CanonicalAttrs])
            └─ join_via_lattice(&[CanonicalAttrs])
                 └─ join_via_lattice_body(&[CanonicalAttrs])

Commit sequence

Commit Description
1 (9af3b925) Retire _tmp_ctx from join_via_lattice_body
2 (8358e4d7) Retire page_ctx from project_attrs_pipeline (renamed from _with_context)
3 (c8b0c9ed) Inline project_from_attrs_slice into trait body
4 (28fceac7) Collapse join_via_lattice_with_context (sole _with_context survivor)
6 (5ad6e886) tasks.md bookkeeping + doc-comment sweep
Merge (fee63ffb) Absorbed chore(deps): update claude and gemini action versions (#staging)
7 (b8969d21) Reviewer-feedback fix-up: §E.1 citation revert + 3 review reports

Commit 5 (engine call-site cleanup + workspace _tmp_ctx audit) folded into Commit 6 — workspace audit surfaced no functional cleanup; PM decision OQ-1 (keep &PageContext on engine project_page_marking) meant zero engine-crate edits required.

PM decisions (resolved 2026-05-18)

  • OQ-1: Keep &PageContext on engine project_page_marking (Option A). Zero marque-engine source edits.
  • OQ-2: Workspace _tmp_ctx audit → no third site surfaced.
  • OQ-3: Defer T069 (full PageContext struct retirement) — properly belongs to PR 6c per task text. PageContext shim stays.
  • OQ-4: Both citation forms (PR 4b-X / #YYY) in tasks.md resolution notes.
  • OQ-5: Constitution VII §IV authorization confirmed — within-006 precedent satisfied.

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 in marque-ism), PR 4b-D.2 / .3 (Engine hot-path flip across marque-engine / marque-ism / marque-capco), PR 4b-E (PageContext expected_* surface deletion in marque-ism). PR 4b-F touches no marque-ism source (only marque-capco doc-comments + signatures); the precedent envelope strictly accommodates this scope. No new scheme adopted; PageRewrite catalog unchanged; closure rules unchanged.

Tasks closed

Task Closed in Resolution
T111 PR 4a / #422 Vocabulary<S>::is_fdr_dissem trait method shipped
T112 PR 4b-A / #426 + PR 4b-B / #437 Per-category Lattice impls (extended by 4b-E DisplayOnlyBlock / NonIcDissemSet)
T113 PR 4b-C / #468 capco/non-fdr-control-evicts-fouo PageRewrite
T114 PR 4b-C / #468 capco/classification-evicts-fouo PageRewrite
T115 PR 4b-D.2 / #527 + completed in PR 4b-F Trait impl removed in 4b-D.2 Commit 11; signature residue removed in PR 4b-F

T069 (full PageContext struct retirement) stays unchecked per OQ-3 — deferred to PR 6c.

Reviewer attestation

Independently reviewed by three agents:

  • rust-review (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).
  • code-review (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 merge fee63ffb; M-2: §E.1 — same as rust F-1, fixed in Commit 7).
  • lattice-review (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 — clean
  • cargo +stable clippy --workspace --all-targets -- -D warnings — clean per commit
  • cargo test --workspace — clean
  • ✅ Parity gate crates/capco/tests/lattice_vs_scheme_parity.rs — 74/74 pass
  • ✅ All 7 commits GPG-signed
  • ✅ Workspace grep _tmp_ctx / _page_context / _page_ctx in crates/*/src/: 1 match (historical doc-note in marking.rs, not a residual code use)
  • ✅ Workspace grep expected_dissem_us / expected_aea_markings / expected_classification / render_expected_banner: 3 matches, all in crates/ism/src/{page_context,projected}.rs deletion-record doc-comments (out of scope per Constitution VII §IV; will be swept with T069 / PR 6c)
  • ✅ Constitution VIII: every §-citation in rewritten doc-comments re-verified against crates/capco/docs/CAPCO-2016.md via CAPCO-2016_citation_index.yml
  • ✅ G13 panic discipline: counts-only sentinels preserved; zero new panic message bodies
  • ✅ Bench lint_10kb 973µs (signature-only PR; within documented baseline-staleness band)

Plan + reports

  • Architect plan: docs/plans/2026-05-18-pr4b-F-residue-cleanup-plan.md
  • Rust preflight: docs/plans/2026-05-18-pr4b-F-rust-preflight.md
  • Implementation report: docs/plans/2026-05-18-pr4b-F-implementation-report.md
  • Rust review: docs/plans/2026-05-18-pr4b-F-rust-review.md
  • Code review: docs/plans/2026-05-18-pr4b-F-code-review.md
  • Lattice review: docs/plans/2026-05-18-pr4b-F-lattice-review.md

Test plan

  • cargo check --workspace clean per commit
  • cargo +stable clippy --workspace --all-targets -- -D warnings clean per commit
  • cargo test --workspace clean
  • Parity gate 74/74 pass
  • Send + Sync compile-time assertion preserved
  • CI: full check + clippy + test matrix green
  • CI: bench within ±5% of staging baseline (signature-only PR; expected delta ≤1µs)

bashandbone and others added 7 commits May 18, 2026 14:38
…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>
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
@bashandbone bashandbone requested a review from a team as a code owner May 18, 2026 19:23
Copilot AI review requested due to automatic review settings May 18, 2026 19:23

This comment was marked as resolved.

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.
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

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_lattice entry points", but join_via_lattice_with_context has 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-17 usage (render_dissem.rs): §A.6 pp 15-17 includes an extra space and uses a different page-range style. Consider normalizing to the repo’s standard §A.6 p15-17 / §A.6 pp15-17 format (and similarly add a page number for the trailing §E.1 reference if you adopt the §X.Y pNN convention).
//! **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.
@bashandbone bashandbone added EPIC-Lattice Addressed by Epic for lattice refactor (5-2-26 plan) rust touches rust code refactor issue/pr related to refactoring lattice issues and PRs related to the lattice architecture and mathematical correctness labels May 18, 2026
@bashandbone bashandbone merged commit ed879a1 into staging May 18, 2026
23 of 24 checks passed
@bashandbone bashandbone deleted the refactor-006-pr-4b-f-residue-cleanup branch May 18, 2026 19:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

EPIC-Lattice Addressed by Epic for lattice refactor (5-2-26 plan) lattice issues and PRs related to the lattice architecture and mathematical correctness refactor issue/pr related to refactoring rust touches rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants