Skip to content

knowledge: AST-as-(part_of:is_a)-address design doc#616

Merged
AdaWorldAPI merged 2 commits into
mainfrom
claude/medcare-bridge-lance-graph-wmx76z
Jun 26, 2026
Merged

knowledge: AST-as-(part_of:is_a)-address design doc#616
AdaWorldAPI merged 2 commits into
mainfrom
claude/medcare-bridge-lance-graph-wmx76z

Conversation

@AdaWorldAPI

@AdaWorldAPI AdaWorldAPI commented Jun 26, 2026

Copy link
Copy Markdown
Owner

What

Adds .claude/knowledge/ast-as-partof-isa-address.md — the consolidated design for storing a transcode source's structural AST as the (part_of:is_a) GUID address itself in the lance-graph SoA, instead of as SurrealQL AST/DDL or a raw syntax tree.

This closes the loop from the ruff_*_spo harvest family (Python/Odoo, Ruby/Rails, C++/Tesseract, and the new C#/Roslyn ruff_csharp_spo) to the OGAR Core, and makes ruff-lsp the natural read/serve surface.

The claim (all CONJECTURE — not built, not measured)

  • An AST has exactly two structural relations, and they ARE the two per-tier tile axes. is_a (taxonomy/typing) = the TISSUE/what byte; part_of (mereology/membership) = the PLACE/where byte. The harvest's inherits_from/rdf:type and has_field/has_function map straight onto them.
  • SurrealQL is an adapter, not the spine (per OGAR SURREAL-AST-AS-ADAPTER.md). The (part_of:is_a) GUID + lance SoA is the spine.
  • Class wrapper = OGAR ClassView / ruff_spo_triplet::Model IR. Sink the rails-shaped declarative class body (a bag of typed declarations, each a part_of/is_a edge), never a raw CSharpSyntaxTree.
  • The one missing brick is a deterministic part_of/is_a rank-minter: exact, roundtrip-lossless on a finite known AST (not learned PQ centroids). Iron-rule clean per I-VSA-IDENTITIES — it encodes identity positions, never bundles content.
  • Boundary: skeleton (THINK arm) in the address; behavior (DO arm — method bodies, control flow) in CausalEdge64/ActionDef, keyed by the GUID, never encoded in it.
  • ruff-lsp is the language-agnostic serve surfacetypeHierarchy = walk is_a; documentSymbol = the part_of tree; definition = address lookup.

Open gate (flagged in the doc, NOT decided here)

Whether part_of:is_a is path-only (3 pairs / 6 bytes over HEEL/HIP/TWIG, per guid-canon-and-prefix-routing.md's path = CAM-PQ 6×256 = 3 tiers) or full-key (6 pairs / 12 slots over the whole GUID, per the operator's "6× part_of:is_a (6 × 2 = 12 slots)" framing). This must be ratified against the V3 mint canon (PR #615 lineage) before any packer is written — building against the wrong allocation is the I-LEGACY-API-FEATURE-GATED / Frankenstein risk.

Next bricks (ordered, each gated on the prior)

  1. Lock the slot allocation (decision, not code — epiphany-council).
  2. Build the deterministic rank-minter (ruff_spo_address, pure std).
  3. Probe on MedCare: ruff_csharp_spo harvest → mint → lance SoA → typeHierarchy/definition query, with MedCareV2 as the parity oracle.

Scope

Documentation only — one new knowledge doc, Status: CONJECTURE, with READ BY: header (integration-lead, truth-architect, core-first-architect, family-codec-smith, baton-handoff-auditor). No code, no contract surface touched.

🤖 Generated with Claude Code


Generated by Claude Code

Summary by CodeRabbit

  • Documentation
    • Added a design note outlining a new approach for representing structural source information as address-based graph relationships.
    • Describes a language-agnostic navigation model and how structural and behavioral information are separated.
    • Lists the next implementation steps and open questions for the proposed address layout.

Consolidates the session's co-developed architecture for sinking
compiled semantics into the canonical GUID instead of SurrealQL AST DDL:
the structural AST of a transcode source (C#/Python/C++/Ruby) stored AS
the (part_of:is_a) GUID address in the lance-graph SoA, with behavior in
CausalEdge64 edges keyed by the GUID.

Key claims (all CONJECTURE, not built/measured):
- An AST has exactly two structural relations (is_a / part_of) and they
  ARE the two per-tier tile axes (is_a = TISSUE/what byte, part_of =
  PLACE/where byte).
- The class wrapper = OGAR ClassView / ruff_spo_triplet::Model IR; sink
  the rails-shaped declarative class-body, never a raw CSharpSyntaxTree.
- The one missing brick is a deterministic part_of/is_a rank-minter
  (exact, roundtrip-lossless on a finite known AST — not learned PQ).
- ruff-lsp is the natural language-agnostic serve surface (LSP ops ARE
  part_of/is_a queries).

OPEN GATE (flagged, not decided): whether part_of:is_a is path-only
(3 pairs / 6 bytes over HEEL/HIP/TWIG, per guid-canon-and-prefix-routing.md)
or full-key (6 pairs / 12 slots over the whole GUID, per operator framing).
Must be ratified against the V3 mint canon (PR #615 lineage) before any
packer is written.

Status: CONJECTURE. READ BY: integration-lead, truth-architect,
core-first-architect, family-codec-smith, baton-handoff-auditor.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYvNjD8M8LMNYbRy3gq2FP
@coderabbitai

coderabbitai Bot commented Jun 26, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@AdaWorldAPI, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 13 minutes and 49 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 620f14e8-a990-489e-b311-37e9955115e0

📥 Commits

Reviewing files that changed from the base of the PR and between ee88a6c and acc3721.

📒 Files selected for processing (1)
  • .claude/knowledge/ast-as-partof-isa-address.md
📝 Walkthrough

Walkthrough

A design document is added describing structural AST identity in (part_of:is_a) GUID addresses, a deterministic rank-minter for packing ranks, separation of structural and behavioral data, ruff-lsp graph queries, and the next implementation steps.

Changes

AST address design note

Layer / File(s) Summary
Header and core claim
.claude/knowledge/ast-as-partof-isa-address.md
Adds document metadata and states that structural AST identity can be stored in a (part_of:is_a) GUID address, with behavior held separately.
Two-relation AST model
.claude/knowledge/ast-as-partof-isa-address.md
Defines AST structure as is_a and part_of, and describes SurrealQL as an adapter or projection rather than the structural carrier.
ClassView sink shape
.claude/knowledge/ast-as-partof-isa-address.md
Describes the ClassView and ruff_spo_triplet::Model sink shape and contrasts it with storing raw syntax trees.
GUID packing and rank-minter
.claude/knowledge/ast-as-partof-isa-address.md
Maps (part_of:is_a) pairs onto GUID regions, calls out the path-only versus full-key decision, and introduces the deterministic (po_rank, ia_rank) rank-minter.
Behavior boundary and LSP surface
.claude/knowledge/ast-as-partof-isa-address.md
States that structural addresses carry resolution only, puts method bodies in CausalEdge64 edges, and maps ruff-lsp requests to is_a and part_of graph queries.
Implementation order
.claude/knowledge/ast-as-partof-isa-address.md
Lists the lock-slot allocation decision, the rank-minter build, and the MedCare/C# harvesting validation sequence.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~2 minutes

Possibly related PRs

Poem

(_/)
( •_•) I hopped through the graph today,
/ >🍃 where part_of and is_a play.
The rank-minter packed each tidy trace,
And ruff-lsp found its friendly place.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the new design document about AST-as-(part_of:is_a) addressing.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
.claude/knowledge/ast-as-partof-isa-address.md (2)

20-28: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Add text language specifier to the fenced diagram block.

The ASCII art diagram at line 20 lacks a language tag, triggering markdownlint's MD040. Use text to silence the warning without affecting rendering.

📝 Proposed fix
-```
+```text
 source (C#/…) ──ruff_*_spo harvest──► SPO triples ──► AR-shaped Model / ClassView
                                                             │  rank-mint (NEW brick)
                                                             ▼
                                               (part_of:is_a) GUID  ──► lance-graph SoA
                                                             │  serve
                                                             ▼
                                                         ruff-lsp ──► editor
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.claude/knowledge/ast-as-partof-isa-address.md around lines 20 - 28, The
fenced ASCII diagram block in ast-as-partof-isa-address.md is missing a language
tag, causing markdownlint MD040. Update the diagram fence to use the text
specifier so the block remains visually unchanged while satisfying lint rules;
this is the fenced block containing the source (C#/…) to ruff-lsp flow.


</details>

<!-- cr-comment:v1:75a973de51225bb6c044faeb -->

---

`73-73`: _📐 Maintainability & Code Quality_ | _🔵 Trivial_ | _⚡ Quick win_

**Escape or restructure the inline code containing `|` in the table.**

The inline code `` `family = (po_rank3<<8)|ia_rank3` `` on line 73 contains a raw `|` that markdownlint's table parser misreads as a column delimiter (MD056). Replace with `<code>` tags or rephrase to avoid the pipe inside table cells.





<details>
<summary>📝 Proposed fix</summary>

```diff
-| `basin·leaf` + `identity` (6B) | basin `po_rank` : `ia_rank` (OGAR `family = (po_rank3<<8)|ia_rank3`) |
+| `basin·leaf` + `identity` (6B) | basin `po_rank` : `ia_rank` (OGAR <code>family = (po_rank3&lt;&lt;8)\|ia_rank3</code>) |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.claude/knowledge/ast-as-partof-isa-address.md at line 73, The markdown
table cell in ast-as-partof-isa-address.md contains inline code with a raw pipe
character, which markdownlint reads as a column separator. Update the affected
table entry by restructuring the text or wrapping the OGAR expression in a form
that avoids a literal pipe inside the cell, using the surrounding table row
content to keep the meaning clear. Locate the entry by the `basin leaf` /
`po_rank : ia_rank` row and adjust only that cell so the table parses correctly.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In @.claude/knowledge/ast-as-partof-isa-address.md:
- Around line 20-28: The fenced ASCII diagram block in
ast-as-partof-isa-address.md is missing a language tag, causing markdownlint
MD040. Update the diagram fence to use the text specifier so the block remains
visually unchanged while satisfying lint rules; this is the fenced block
containing the source (C#/…) to ruff-lsp flow.
- Line 73: The markdown table cell in ast-as-partof-isa-address.md contains
inline code with a raw pipe character, which markdownlint reads as a column
separator. Update the affected table entry by restructuring the text or wrapping
the OGAR expression in a form that avoids a literal pipe inside the cell, using
the surrounding table row content to keep the meaning clear. Locate the entry by
the `basin leaf` / `po_rank : ia_rank` row and adjust only that cell so the
table parses correctly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d41d6abf-f90f-477b-bc55-3023fa72645a

📥 Commits

Reviewing files that changed from the base of the PR and between 26abde5 and ee88a6c.

📒 Files selected for processing (1)
  • .claude/knowledge/ast-as-partof-isa-address.md

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ee88a6c026

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

CAM-PQ 6×256`, i.e. **3 tiers × 256×256 tile = 3 (part_of:is_a) pairs over
HEEL/HIP/TWIG**. The 12-slot reading extends part_of:is_a to the *full* GUID
(classid + cascade + basin), not just the path. Whether part_of:is_a is
**path-only (3 pairs / 6 bytes)** or **full-key (6 pairs / 12 bytes)** is the

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Correct the full-key slot count before implementation

If the rank-minter is implemented from this gate, the full-key alternative is internally inconsistent: the canonical key layout is 16 bytes (CLAUDE.md:1288-1295), and this table accounts for classid 4B + HEEL/HIP/TWIG 6B + trailing family/identity 6B, but this line defines full-key as only 6 pairs / 12 bytes. Choosing that branch would either leave 4 bytes unmapped or force classid into a different slot width, so the pair/slot units need to be reconciled before this becomes the packer contract.

Useful? React with 👍 / 👎.

…bstrate

The doc was authored without awareness that V3 shipped (#613/#614 FacetCascade,
#615 mint_for). Three alignments; the AST-as-(part_of:is_a) idea is preserved:

- Slot-count "open gate" CLOSED: facet.rs FacetCascade = facet_classid(4) |
  6x(8:8) = 6 tiers (HEEL.HIP.TWIG.LEAF.family.identity), const_-asserted = the
  full-key 6-pair/12-slot answer; the key carries the 4-tier routing prefix
  (NiblePath::from_guid_prefix_v3), the complete address is the FacetCascade
  value facet. Nothing left to ratify.
- Carrier NOT missing: FacetCascade is content-blind and already lists
  (part_of:is_a) as a consumer projection (hi_chain=part_of, lo_chain=is_a).
  Only the deterministic rank-minter is genuinely new; it writes into existing
  tiers (no new type/layout).
- classid row is 0x1000_0700-shaped (shipped CLASSID_OSINT_V3: marker hi u16,
  domain on lo u16); its (part_of:is_a) ordering flagged OPEN pending the
  operator's Canon:Custom correction.

Doc-only, CONJECTURE status retained.

Claude-Session: https://claude.ai/code/session_01TANd15SECEb1Gm4cpaRVD9

Copy link
Copy Markdown
Owner Author

V3 substrate alignment + brick 2 is now built

Two updates relevant to this doc's Open gate and Next bricks:

1. The slot-allocation gate is settled by what shipped. The open question — path-only (3 pairs / 6 B) vs full-key (6 pairs / 12 slots) — is resolved by the V3 substrate that landed in #613/#614/#615: the carrier is contract::facet::FacetCascade = facet_classid(4) | 6×(8:8) = 16 B, i.e. 6 pairs (full-key), tiers HEEL·HIP·TWIG·LEAF·family·identity, hi = part_of (hi_chain), lo = is_a (lo_chain). The 3-tier "path-only" framing is subsumed as the key-side routing prefix: hhtl::NiblePath::from_guid_prefix_v3 folds the 4 HHTL tiers HEEL·HIP·TWIG·LEAF for routing; the full 6-tier address lives in the facet. So a packer no longer builds against an unratified allocation — it targets a shipped, locked carrier. (This PR's head acc37217 already aligns the doc text to this.)

2. Brick 2 (the deterministic rank-minter) is built. lance_graph_contract::facet_mint — commit 360fc720 on claude/serene-mayer-1a09he:

  • mint_facets(&[NodeDecl], facet_classid) -> Result<Vec<FacetCascade>, MintError> — walks root→node in each hierarchy, packs the coarse→fine sibling-ranks into the 6 tiers. Exact + roundtrip-lossless via deterministic sibling ranking (sorted id), not learned PQ centroids. Order-independent.
  • NodeDecl { id, part_of_parent, is_a_parent } is producer-agnostic — the ruff C++ SPO harvest and the new ruff_csharp_spo (Roslyn) populate the same shape; the minter doesn't care which front-end emitted the graph.
  • Exact-or-error, never silent aliasing: MintError::{DepthOverflow(>6 tiers), FanoutOverflow(>256 siblings), UnknownParent, DuplicateId, Cycle}.
  • I-VSA-IDENTITIES clean (encodes identity positions, never bundles content). No new type/layout, no value-slab offset (the LOCKED 480 B node layout is untouched).
  • 8 tests green; clippy -D warnings + fmt clean. (Verified in isolation — the whole-workspace compile is currently blocked by the proxy 403 on ndarray's burn submodule fetch, unrelated to this additive zero-dep change.)

Still open, deliberately not prejudged: the facet_classid (row 0) is a parameter to the minter — the classid (part_of:is_a) half-order (the operator's Canon:Custom correction) stays orthogonal, so brick 2 doesn't bake in a decision that's still pending.

Net: brick 1 (formal slot-allocation ratification, epiphany-council) becomes a confirm-the-shipped-reality step rather than an open design fork, and brick 3 (the MedCare ruff_csharp_spo → mint → SoA → typeHierarchy/definition probe, with MedCareV2 as parity oracle) is the next end-to-end.


Generated by Claude Code

@AdaWorldAPI AdaWorldAPI merged commit b7eb02c into main Jun 26, 2026
1 check passed
AdaWorldAPI pushed a commit that referenced this pull request Jun 26, 2026
Follow-up to #616. The merged doc stated the *what* (AST as the
(part_of:is_a) GUID address); this adds the *why*, grounded in shipped
contract code verified this session:

- Layer 1 — rails-shaped semantic AST at assembler cost: the four
  facet.rs SIMD lanes ARE the LSP ops (definition=vpcmpeqd,
  typeHierarchy=vpxor+tzcnt, ...). Declarative shape is the precondition.
- Layer 2 — static OGAR / dynamic ClassView / askama: the class_view.rs
  XML/XSD/ClassView/XSLT ladder + C2 (presence-never-semantics) and N3
  (append-only positions) = how a row view evolves 17 years (Redmine)
  without breaking persisted rows. View AND conditional classaction are
  the two projections of ONE ClassView over the N×6×(part_of:is_a) SoA.
- Layer 3 — OGAR as importable ERP-primitive stdlib + lance as compiler:
  ogar_codebook canonical_concept_id (import) + render_classid_for_concept
  (customize); cost collapses to O(consumer deltas).

DO arm is ALSO wireable: ActionDef/ActionInvocation/KausalSpec
(OGAR-AST-CONTRACT) is the behavioral IR; the arago/HIRO ActionHandler
model (OGIT = almato/arago ontology) transcodes into it. Behavior is
conditionalized at the cost of one ClassView classaction dispatch.

Three honest boundaries kept explicit: (1) mechanism shipped, stdlib
mostly empty; (2) DO wireable but KausalSpec-membrane-governed, and an
ActionDef's internal compute is still its content; (3) cheapness requires
pull-don't-reconstruct (the consumer-preflight iron rule).

Status stays CONJECTURE. Verified this session: facet_mint 8/8 tests
green in the zero-dep contract crate; facet.rs/class_view.rs/
ogar_codebook.rs surfaces cited exist on main.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYvNjD8M8LMNYbRy3gq2FP
AdaWorldAPI pushed a commit that referenced this pull request Jun 26, 2026
…ayoff

Integrate the now-merged AST-as-(part_of:is_a)-address arc (#616 "what" +
V3 alignment, #617 "why") and the facet_mint rank-minter brick into the V3
value-tenant migration plan (soa-value-tenant-migration-v2.md), as first-class
roadmap rather than a side thread.

§0–§6 stay operator-locked and untouched. New §7 records the *application* the
two-phase sequencing exists to serve:

- The why beneath §0's what: once identity is V3 (Phase 1) and the value tenants
  are the V3-shaped contained facet (Phase 2), a transcode source's structural
  AST IS its address — so minting an ERP in any consumer collapses to importing
  pre-minted OGIT class primitives + wiring classaction pointers; the low-code
  platform self-programs at assembler cost instead of re-transcoding ~500K LOC
  per consumer.
- The arc IS this plan's (part_of:is_a) structure axis made literal — the shipped
  FacetCascade read as hi_chain=part_of / lo_chain=is_a is the "shadow the V3 key
  casts" §1 already names; downstream of BOTH phases.
- The brick chain mapped onto the phases + gates: brick 1 (slot allocation) LOCKED
  by the shipped FacetCascade; brick 2 (facet_mint rank-minter) BUILT (360fc72);
  brick 3 (MedCare ruff_csharp_spo -> mint -> SoA -> typeHierarchy probe, MedCareV2
  oracle) PENDING = the single CONJECTURE->FINDING gate.
- Canon:Custom is ONE lock shared with §2.2: the minter's facet_classid is a
  parameter, so resolving canon(hi):custom(lo) settles both the Phase-1 classid
  entries and the minter's row-0 ordering in one decision.

Arc stays [S]->[H] CONJECTURE; gate F-code via brick 3. Header pointer added;
cross-refs extended (ast doc, facet_mint, ruff #29). Board: LATEST_STATE note
prepended (2026-06-26).

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TANd15SECEb1Gm4cpaRVD9
AdaWorldAPI pushed a commit that referenced this pull request Jun 26, 2026
Session handover for the next session: what shipped (#616 merged, #617
merged, ruff #29 open), the three-layer thesis, the V3 state (OSINT/FMA/
CPIC all wired as of #618 — none by this session), the built-but-unmerged
minter (facet_mint @ serene-mayer 360fc72, 8 tests green), and the
brick-3 MedCare probe as the single CONJECTURE→FINDING gate. Includes the
burn/owl corrections and the sync-first discipline.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYvNjD8M8LMNYbRy3gq2FP
AdaWorldAPI pushed a commit that referenced this pull request Jun 26, 2026
Cross-links the parallel V3-identity/genome session (614/615/618, q2/cpic
NARS prototype, CYP2D6 falsifier) as the companion half of the arc. Three
corrections their handover surfaced:
- mint OGIT->codebook is a CROSS-REPO arc (ogar-vocab + contract CODEBOOK
  + lance-graph-ogar parity together), per ISS-OGAR-GENETICS-MIRROR-PENDING
  / E-CODEBOOK-MINT-IS-A-CROSS-REPO-ARC — not a local wire.
- Canon:Custom flip must be atomic over the COMPLETE V3 set (OSINT+FMA+
  CPIC), now unblocked by #618 (I-LEGACY-API-FEATURE-GATED).
- Board-hygiene debt logged: #616/#617 shipped without same-commit
  EPIPHANIES/PR_ARC/LATEST_STATE updates; fold into the next PR alongside
  the companion's outstanding 614/615/618 rows.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYvNjD8M8LMNYbRy3gq2FP
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants