diff --git a/.claude/board/LATEST_STATE.md b/.claude/board/LATEST_STATE.md index ec98438a..464ec803 100644 --- a/.claude/board/LATEST_STATE.md +++ b/.claude/board/LATEST_STATE.md @@ -10,6 +10,14 @@ --- +## 2026-07-06 — MERGED #651 (merge `16c9e0c`) — `contract::class_view::WideFieldMask`: backward-compatible >64-field masks (canonical form, repr-independent Eq/Hash) + +(Post-merge inventory entry, L-1 of the criticals wave — operator ruling (c), 2026-07-06. Also records: the `claude/classview-unified-render` work in the entry below MERGED as **PR #650**, merge `598f872` — its "not yet a PR" line is superseded.) + +### Current Contract Inventory — new entry + +- **`class_view::WideFieldMask`** (NEW, additive sibling type; **`FieldMask` is byte-for-byte untouched** — `Copy`/const-fn/u64 semantics intact; the enum-repr-inside-`FieldMask` alternative was evaluated and REJECTED because `ClassProjection::next`/`from_positions` rely on `FieldMask: Copy`). Widens the field-mask ceiling past 64 **without touching the existing type**: `Repr::Small(u64)` (bit-identical to `FieldMask`, allocation-free) promotes once to `Repr::Wide(Box<[u64]>)` at position ≥ 64; bit N = the same logical N3 field across both reprs; lossless `From`, deliberately NO lossy reverse (a fallible `TryFrom` for the ≤64 case is the named follow-up for RBAC `PermissionSpec::projection`). **Canonical form (V-L P0, found + fixed pre-merge):** `intersect`/`union` trim trailing zero chunks and demote to `Small` when they fit; `PartialEq`/`Eq`/`Hash` are hand-written over a trimmed chunk view, so **semantically equal masks are equal and hash identically regardless of representation** (the adversarial review reproduced `a.intersect(&b) != from_positions(same set)` before merge; regression test pins it). No version split needed (`0x1000→0x1001` reserved as last resort, unused); zero-dep promise held (std only). **Unblocks X7/F14** — `account.move` has 109 declared fields; everything past bit 63 previously dropped silently. Doctrine guard: `FIELD_MASK_CAP = MAX_SIBLINGS_PER_TIER` (256) still caps meaningful masks — a ≥256-field class is an `OGAR-SOC` split signal, NOT a mask-widening use case; `WideFieldMask::full_for(field_count)` is the class-conditioned shape the OGAR bitmask doc always named as the eventual expansion. Verification: contract 829 green (+7 tests: u64-pin, >64 representable, no-alloc small path, cross-tier intersect/union, full_for, lossless promote, canonical-form regression); clippy `-D warnings` clean; consumers (`lance-graph-rbac`, `lance-graph-ontology`, arm-discovery) green with ZERO source changes. Cross-repo: OGAR interim loud-fail guard in `ogar-render-askama` (>64 fields + partial `FieldMask` → `Err` instead of silent drop) ships separately in the criticals wave; OGAR `WideFieldMask` adoption follows as O-2-adjacent work. + ## 2026-07-06 — branch `claude/classview-unified-render` — `contract::class_view` unified ClassView render: facet value rows + is_a-walk resolution (Per APPEND-ONLY rule: new top-of-inventory entry. Branch work, not yet a PR — records the contract types so a new session does not re-derive them. Operator-ratified this session: any app calls the SAME unified projection — resolve (is_a rail) → carve (FieldMask) → emit — with routes as thin per-app skins.)