Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions cockpit/src/BodyV3.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ import * as THREE from 'three';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

const PAGE_BG = 0x0a0e17;
const FMA_V3_CLASSID = 0x10000a01;
// Post-flip form (canon 0x0A01 HIGH, V3 marker 0x1000 LOW — 2026-07-02).
const FMA_V3_CLASSID = 0x0a011000;
// Pre-flip stored form — the body.soa GitHub-Release asset
// (fma-body-soa-v3-v1) still carries it until re-baked + re-released.
const FMA_V3_CLASSID_LEGACY = 0x10000a01;

const LAYERS: { id: number; name: string; color: string }[] = [
{ id: 1, name: 'skin', color: '#dba88a' },
Expand Down Expand Up @@ -433,7 +437,7 @@ export function BodyV3() {
{d && (
<div style={{ opacity: 0.6, marginTop: 2 }}>
{d.nConcepts.toLocaleString()} concepts ·{' '}
{d.classid === FMA_V3_CLASSID
{(d.classid === FMA_V3_CLASSID || d.classid === FMA_V3_CLASSID_LEGACY)
? <span style={{ color: '#7fdca0' }}>classid 0x{d.classid.toString(16)} ✓ V3 (part_of:is_a)</span>
: <span style={{ color: '#ff8095' }}>classid 0x{d.classid.toString(16)}</span>}
</div>
Expand Down
41 changes: 27 additions & 14 deletions cpic/docs/INGEST.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,19 +40,32 @@ Both hierarchies are *already in the CPIC columns* — nothing is invented:
partonomy is the `part_of` axis, and ATC drug codes are a second ready-made `is_a`
cascade.

## classid — pharmacogenomics domain `0x0C`

`classid` prefix-routes the entity kind (the OGAR `ClassView` dispatch). We use domain
`0x0C` (anatomy was `0x0A`):
## classid — pharmacogenomics, Genetics domain `0x0E01` (re-minted 2026-07-02)

> **Note (2026-07-02):** `SAMPLE_GUIDS.tsv` was regenerated from a fresh
> `cargo run --release --bin ingest -- data out 4000` run against this
> re-mint — every row's tail (HEEL/HIP/TWIG/family/identity) is byte-identical
> to the pre-flip sample; only the classid prefix changed.

`classid` prefix-routes the entity kind (the OGAR `ClassView` dispatch). The
original local scheme used domain `0x0C`, which collides with the Automation
domain (`lance-graph-contract::ogar_codebook::ConceptDomain::Automation`) and
predates the operator's Genetics ruling. Re-minted as INTERIM canon-high
Genetics:q2 ids, matching the `lance-graph-contract` classid half-order flip
(canon HIGH / custom LOW): canon `0x0E01` = Genetics domain (`0x0E`) + appid
`0x01` (q2); the LOW half is this crate's local kind slot. This crate is
dep-free and does not pull the real `lance-graph-contract` ClassView
catalogue — the full contract-pull re-mint that dissolves this local scheme
entirely is the tracked follow-up.

| classid | entity | part_of (high) | is_a (low) |
|---|---|---|---|
| `0x000C0001` | gene | `pharmacogenome / CYP / CYP2 / CYP2C / CYP2C19` | `entity / gene` |
| `0x000C0002` | allele (`*2`) | gene partonomy ++ allele | `allele / no_function` |
| `0x000C0003` | diplotype (`*2/*2`) | gene ++ `diplotypes` ++ dip | `diplotype / homozygous` |
| `0x000C0004` | phenotype | gene ++ `phenotypes` ++ result | `phenotype / poor_metabolizer` |
| `0x000C0005` | drug | `pharmacogenome / drugs / name` | `drug / N / N06 / N06A / N06AA` |
| `0x000C0006` | recommendation | `recommendations / g{id} / drug` | `recommendation / strong` |
| `0x0E010001` | gene | `pharmacogenome / CYP / CYP2 / CYP2C / CYP2C19` | `entity / gene` |
| `0x0E010002` | allele (`*2`) | gene partonomy ++ allele | `allele / no_function` |
| `0x0E010003` | diplotype (`*2/*2`) | gene ++ `diplotypes` ++ dip | `diplotype / homozygous` |
| `0x0E010004` | phenotype | gene ++ `phenotypes` ++ result | `phenotype / poor_metabolizer` |
| `0x0E010005` | drug | `pharmacogenome / drugs / name` | `drug / N / N06 / N06A / N06AA` |
| `0x0E010006` | recommendation | `recommendations / g{id} / drug` | `recommendation / strong` |

- **family (u24)** = the basin: the gene symbol (gene/allele/diplotype/phenotype), the
ATC root letter (drug), or `rec:g{id}` (recommendation). Groups all of a gene's
Expand All @@ -66,10 +79,10 @@ cascade.

```text
allele guid HEEL HIP TWIG family
CYP2C19 *2 000c0002-c358-ec6f-f76f-d69bfe558274 c358 ec6f f76f d69bfe (No function)
CYP2C9 *2 000c0002-c358-ecd8-f7d8-fbd6cbd5c622 c358 ecd8 f7d8 fbd6cb (Decreased function)
CYP2C19 *1 000c0002-c358-ec07-f707-d69bfe3c1176 c358 ec07 f707 d69bfe (Normal function)
CYP2D6 *4 000c0002-c358-ec6f-f76f-1066f96f7ace c358 ec6f f76f 1066f9 (No function)
CYP2C19 *2 0e010002-c358-ec6f-f76f-d69bfe558274 c358 ec6f f76f d69bfe (No function)
CYP2C9 *2 0e010002-c358-ecd8-f7d8-fbd6cbd5c622 c358 ecd8 f7d8 fbd6cb (Decreased function)
CYP2C19 *1 0e010002-c358-ec07-f707-d69bfe3c1176 c358 ec07 f707 d69bfe (Normal function)
CYP2D6 *4 0e010002-c358-ec6f-f76f-1066f96f7ace c358 ec6f f76f 1066f9 (No function)
```

- **part_of HIGH bytes** `c3 / ec / f7` = `pharmacogenome → CYP → CYP2`, shared by all
Expand Down
50 changes: 25 additions & 25 deletions cpic/docs/SAMPLE_GUIDS.tsv
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
guid kind label part_of is_a
000c0001-c3fa-ec2a-f72a-fbd6cb3779b9 gene CYP2C9 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C9 entity / gene
000c0001-c3fa-ec2a-f72a-1066f93779b9 gene CYP2D6 pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 entity / gene
000c0001-c3fa-1b2a-982a-61ef4f3779b9 gene HLA-B pharmacogenome / HLA / HLA-B entity / gene
000c0001-c3fa-ec2a-f72a-d69bfe3779b9 gene CYP2C19 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C19 entity / gene
000c0001-c3fa-f92a-8f2a-ec80083779b9 gene TPMT pharmacogenome / TPMT / TPMT entity / gene
000c0002-c358-ec6f-f76f-d69bfe4cda56 allele CYP2C19 *4 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C19 / 4 allele / no_function
000c0002-c358-ec6f-f76f-1066f96f7ace allele CYP2D6 *4 pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 / 4 allele / no_function
000c0002-c358-1bd5-98d5-61ef4f6ef372 allele HLA-B *57:01 pharmacogenome / HLA / HLA-B / 57_01 allele / uncertain_function
000c0002-c358-ec6f-f76f-d69bfe558274 allele CYP2C19 *2 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C19 / 2 allele / no_function
000c0002-c358-ecd8-f7d8-fbd6cbd5c622 allele CYP2C9 *2 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C9 / 2 allele / decreased_function
000c0002-c358-ec07-f707-d69bfe3c1176 allele CYP2C19 *1 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C19 / 1 allele / normal_function
000c0002-c358-ec6f-f76f-fbd6cb6b6a6d allele CYP2C9 *3 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C9 / 3 allele / no_function
000c0002-c358-ec07-f707-1066f9fd85b3 allele CYP2D6 *1 pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 / 1 allele / normal_function
000c0004-c347-ecb1-f7b1-1066f93779b9 phenotype CYP2D6 Ultrarapid Metabolizer pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 / phenotypes / ultrarapid_metabolizer phenotype / ultrarapid_metabolizer
000c0004-c347-ecb1-f7b1-1066f96ef372 phenotype CYP2D6 Ultrarapid Metabolizer pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 / phenotypes / ultrarapid_metabolizer phenotype / ultrarapid_metabolizer
000c0004-c347-ec7a-f77a-1066f9a66d2b phenotype CYP2D6 Normal Metabolizer pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 / phenotypes / normal_metabolizer phenotype / normal_metabolizer
000c0004-c347-f9a8-8fa8-ec80083779b9 phenotype TPMT Intermediate Metabolizer pharmacogenome / TPMT / TPMT / phenotypes / intermediate_metabolizer phenotype / intermediate_metabolizer
000c0004-c347-f9e9-8fe9-ec80086ef372 phenotype TPMT Poor Metabolizer pharmacogenome / TPMT / TPMT / phenotypes / poor_metabolizer phenotype / poor_metabolizer
000c0004-c347-f9db-8fdb-ec8008a66d2b phenotype TPMT Indeterminate pharmacogenome / TPMT / TPMT / phenotypes / indeterminate phenotype / indeterminate
000c0005-c3af-cb3e-233c-1c839f6ef372 drug abacavir pharmacogenome / drugs / abacavir drug / J / J05 / J05A / J05AF / abacavir
000c0005-c3af-cb0a-630d-1c7cd36ef372 drug amitriptyline pharmacogenome / drugs / amitriptyline drug / N / N06 / N06A / N06AA / amitriptyline
000c0005-c3af-cba6-3010-1c9137a66d2b drug warfarin pharmacogenome / drugs / warfarin drug / B / B01 / B01A / B01AA / warfarin
000c0005-c3af-cba6-b610-1c9137bbcdc8 drug clopidogrel pharmacogenome / drugs / clopidogrel drug / B / B01 / B01A / B01AC / clopidogrel
000c0006-c7ee-454c-db4c-a2917a3779b9 recommendation g100421 RxNorm:190521 [HLA-B:*57:01 negative] -> Strong recommendations / g100421 / rxnorm_190521 recommendation / strong
000c0006-c7ee-454c-db4c-a2917a6ef372 recommendation g100421 RxNorm:190521 [HLA-B:*57:01 positive] -> Strong recommendations / g100421 / rxnorm_190521 recommendation / strong
0e010001-c3fa-ec2a-f72a-fbd6cb3779b9 gene CYP2C9 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C9 entity / gene
0e010001-c3fa-ec2a-f72a-1066f93779b9 gene CYP2D6 pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 entity / gene
0e010001-c3fa-1b2a-982a-61ef4f3779b9 gene HLA-B pharmacogenome / HLA / HLA-B entity / gene
0e010001-c3fa-ec2a-f72a-d69bfe3779b9 gene CYP2C19 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C19 entity / gene
0e010001-c3fa-f92a-8f2a-ec80083779b9 gene TPMT pharmacogenome / TPMT / TPMT entity / gene
0e010002-c358-ec6f-f76f-d69bfe4cda56 allele CYP2C19 *4 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C19 / 4 allele / no_function
0e010002-c358-ec6f-f76f-1066f96f7ace allele CYP2D6 *4 pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 / 4 allele / no_function
0e010002-c358-1bd5-98d5-61ef4f6ef372 allele HLA-B *57:01 pharmacogenome / HLA / HLA-B / 57_01 allele / uncertain_function
0e010002-c358-ec6f-f76f-d69bfe558274 allele CYP2C19 *2 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C19 / 2 allele / no_function
0e010002-c358-ecd8-f7d8-fbd6cbd5c622 allele CYP2C9 *2 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C9 / 2 allele / decreased_function
0e010002-c358-ec07-f707-d69bfe3c1176 allele CYP2C19 *1 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C19 / 1 allele / normal_function
0e010002-c358-ec6f-f76f-fbd6cb6b6a6d allele CYP2C9 *3 pharmacogenome / CYP / CYP2 / CYP2C / CYP2C9 / 3 allele / no_function
0e010002-c358-ec07-f707-1066f9fd85b3 allele CYP2D6 *1 pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 / 1 allele / normal_function
0e010004-c347-ecb1-f7b1-1066f93779b9 phenotype CYP2D6 Ultrarapid Metabolizer pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 / phenotypes / ultrarapid_metabolizer phenotype / ultrarapid_metabolizer
0e010004-c347-ecb1-f7b1-1066f96ef372 phenotype CYP2D6 Ultrarapid Metabolizer pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 / phenotypes / ultrarapid_metabolizer phenotype / ultrarapid_metabolizer
0e010004-c347-ec7a-f77a-1066f9a66d2b phenotype CYP2D6 Normal Metabolizer pharmacogenome / CYP / CYP2 / CYP2D / CYP2D6 / phenotypes / normal_metabolizer phenotype / normal_metabolizer
0e010004-c347-f9a8-8fa8-ec80083779b9 phenotype TPMT Intermediate Metabolizer pharmacogenome / TPMT / TPMT / phenotypes / intermediate_metabolizer phenotype / intermediate_metabolizer
0e010004-c347-f9e9-8fe9-ec80086ef372 phenotype TPMT Poor Metabolizer pharmacogenome / TPMT / TPMT / phenotypes / poor_metabolizer phenotype / poor_metabolizer
0e010004-c347-f9db-8fdb-ec8008a66d2b phenotype TPMT Indeterminate pharmacogenome / TPMT / TPMT / phenotypes / indeterminate phenotype / indeterminate
0e010005-c3af-cb3e-233c-1c839f6ef372 drug abacavir pharmacogenome / drugs / abacavir drug / J / J05 / J05A / J05AF / abacavir
0e010005-c3af-cb0a-630d-1c7cd36ef372 drug amitriptyline pharmacogenome / drugs / amitriptyline drug / N / N06 / N06A / N06AA / amitriptyline
0e010005-c3af-cba6-3010-1c9137a66d2b drug warfarin pharmacogenome / drugs / warfarin drug / B / B01 / B01A / B01AA / warfarin
0e010005-c3af-cba6-b610-1c9137bbcdc8 drug clopidogrel pharmacogenome / drugs / clopidogrel drug / B / B01 / B01A / B01AC / clopidogrel
0e010006-c7ee-454c-db4c-a2917a3779b9 recommendation g100421 RxNorm:190521 [HLA-B:*57:01 negative] -> Strong recommendations / g100421 / rxnorm_190521 recommendation / strong
0e010006-c7ee-454c-db4c-a2917a6ef372 recommendation g100421 RxNorm:190521 [HLA-B:*57:01 positive] -> Strong recommendations / g100421 / rxnorm_190521 recommendation / strong
24 changes: 17 additions & 7 deletions cpic/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,23 @@
//!
//! POC over published CPIC rules — NOT clinical decision support.

// ── classid: pharmacogenomics domain 0x0C (cf. anatomy 0x0A used by fma/converge) ──
pub const CID_GENE: u32 = 0x000C_0001;
pub const CID_ALLELE: u32 = 0x000C_0002;
pub const CID_DIPLOTYPE: u32 = 0x000C_0003;
pub const CID_PHENOTYPE: u32 = 0x000C_0004;
pub const CID_DRUG: u32 = 0x000C_0005;
pub const CID_REC: u32 = 0x000C_0006;
// ── classid: pharmacogenomics — re-minted 2026-07-02. The original local scheme
// (`0x000C_000N`) predated the operator's Genetics ruling and collided with the
// Automation domain (0x0C is Automation, not Genetics — see
// `lance-graph-contract::ogar_codebook::ConceptDomain::Automation`). Re-minted as
// INTERIM canon-high Genetics:q2 ids, matching the `lance-graph-contract` classid
// half-order flip (canon in the HIGH half, custom in the LOW half): canon `0x0E01`
// = Genetics domain (`0x0E`) + appid `0x01` (q2); the LOW half is this crate's
// local kind slot (GENE=1, ALLELE=2, DIPLOTYPE=3, PHENOTYPE=4, DRUG=5, REC=6).
// This is dep-free and does NOT pull the real `lance-graph-contract` ClassView
// catalogue — the full contract-pull re-mint that dissolves this local scheme
// entirely is the tracked follow-up (see `docs/INGEST.md`).
pub const CID_GENE: u32 = 0x0E01_0001;
pub const CID_ALLELE: u32 = 0x0E01_0002;
pub const CID_DIPLOTYPE: u32 = 0x0E01_0003;
pub const CID_PHENOTYPE: u32 = 0x0E01_0004;
pub const CID_DRUG: u32 = 0x0E01_0005;
pub const CID_REC: u32 = 0x0E01_0006;

// ── FNV-1a (the same prefix-cascade generator the fma converge bin uses) ──
const FNV_OFFSET: u64 = 0xcbf2_9ce4_8422_2325;
Expand Down
8 changes: 7 additions & 1 deletion crates/aiwar-ingest/tests/fixtures/codebook_normalize.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
into ONE codebook-based, non-serialized Gotham/neo4j test fixture.

CANON model (lance-graph contract::aiwar + E-FAMILY-ADAPTER + OGAR codebook):
- classid OSINT = 0x0700 (NodeGuid::CLASSID_OSINT, >>8 == 0x07)
- classid OSINT = 0x0700 (NodeGuid::CLASSID_OSINT, >>8 == 0x07) — this is the
bare u16 canon id, the HIGH half of the composed u32 classid since the
2026-07-02 half-order flip (NodeGuid::CLASSID_OSINT == 0x0700_0000); this
fixture never composes the full u32, so no functional change from the flip.
- a node is its HEAD only: classid | family(mixin) | identity(u16) | edge-adapters
- mixin: an entity inherits its category by REFERENCE (family-node id), never a copy
- identity = 4 nibbles (u16)
Expand All @@ -13,6 +16,9 @@
import json, re, sys, glob, os

ROOT = os.environ.get("AIWAR_HARVEST", "/home/user/aiwar-neo4j-harvest")
# u16 canon id — the HIGH half of the composed u32 classid since the
# 2026-07-02 flip (NodeGuid::CLASSID_OSINT == 0x0700_0000). This script only
# ever emits the bare u16 (see @meta below), never the composed u32.
OSINT_CLASSID = 0x0700

# JSON N_<group> -> canonical family label (matches the cypher node labels)
Expand Down
3 changes: 2 additions & 1 deletion crates/cockpit-server/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,8 @@ async fn main() {
// CPIC pharmacogenomics for the /cpic cockpit (cpic::reason over the baked CPIC tables)
.route("/api/cpic/reason", post(pgx::cpic_reason_handler))
.route("/api/cpic/catalog", get(pgx::cpic_catalog_handler))
// OSINT domain (classid 0x0700): the harvest as a CANON family-basin graph
// OSINT domain (canon classid 0x0700 — HIGH half since the 2026-07-02
// flip): the harvest as a CANON family-basin graph
// (round→anchor basins, GUID-v2 tail), displayed via the OGAR ClassView.
.route("/api/graph/osint", get(osint_gotham::osint_graph_handler))
// Pre-baked enriched OSINT SoA bytes — the 3D view (/osint3d) fetches
Expand Down
28 changes: 23 additions & 5 deletions crates/cockpit-server/src/osint_gotham.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
//! OSINT / Palantir-Gotham domain (classid `0x0700`) — the aiwar harvest as a
//! CANON family-basin graph, rendered through the OGAR Active-Record `ClassView`.
//! `0x0700` is the canon concept id: since the 2026-07-02 half-order flip it is
//! the HIGH u16 of the composed `u32` classid (`0x0700_0000`, `NodeGuid::CLASSID_OSINT`);
//! the pre-flip stored form `0x0000_0700` still resolves via `CLASSID_OSINT_LEGACY`.
//! Bare `0x0700` below always means the canon value, not the full composed classid.
//!
//! The corrected model (operator-locked this session):
//!
Expand Down Expand Up @@ -500,9 +504,12 @@ pub fn osint_graph() -> &'static Arc<RwLock<GraphSnapshot>> {
OSINT_GRAPH.get_or_init(|| Arc::new(RwLock::new(GraphSnapshot::empty())))
}

/// The ClassView ClassId for the OSINT domain (low u16 of `CLASSID_OSINT`).
/// The ClassView ClassId for the OSINT domain — the concept id, i.e. the CANON
/// half of `CLASSID_OSINT` (the HIGH u16 since the 2026-07-02 half-order flip;
/// `classid & 0xFFFF` would now read the CUSTOM half and silently return the
/// wrong value).
fn osint_class_id() -> u16 {
(NodeGuid::CLASSID_OSINT & 0xFFFF) as u16
lance_graph_contract::classid_concept(NodeGuid::CLASSID_OSINT)
}

// ─────────────────────────────────────────────────────────────────────────────
Expand Down Expand Up @@ -826,7 +833,13 @@ pub fn build_osint_gotham(graph: &AiWarGraph, rounds: &[EncounterRound]) -> Grap
let class_label = label_of_order(order);
let mut props: HashMap<String, Value> = src.properties.clone();
props.insert("guid".to_string(), Value::String(r.key.to_hex_v2()));
props.insert("classid".to_string(), Value::String("00000700".to_string()));
// Compose dynamically rather than hardcoding the stored form — the
// 2026-07-02 half-order flip moved canon 0x0700 into the HIGH half,
// so this now yields "07000000" (was "00000700" pre-flip).
props.insert(
"classid".to_string(),
Value::String(format!("{:08x}", NodeGuid::CLASSID_OSINT)),
);
props.insert("class_order".to_string(), Value::from(order));
props.insert("class".to_string(), Value::String(class_label.to_string()));
props.insert("basin".to_string(), Value::String(format!("{basin:02x}")));
Expand Down Expand Up @@ -1249,9 +1262,14 @@ mod tests {
let rows = osint_node_rows(&g, &plan);
assert_eq!(rows.len(), g.node_count(), "one OSINT row per entity");
for (i, row) in rows.iter().enumerate() {
// classid 0x0700 (the OSINT domain byte is 0x07)
// classid 0x0700_0000 (canon 0x0700 sits in the HIGH half since
// the 2026-07-02 flip; route through the contract helper rather
// than deriving the domain byte via a raw shift).
assert_eq!(row.key.classid(), NodeGuid::CLASSID_OSINT);
assert_eq!(row.key.classid() >> 8, 0x07);
assert_eq!(
lance_graph_contract::ogar_codebook::classid_canon(row.key.classid()) >> 8,
0x07
);
// GUID-v2 tail: identity == index, family == basin byte (high byte 0)
assert_eq!(row.key.identity_v2(), i as u16);
assert_eq!(row.key.family_v2() >> 8, 0, "basin is an 8-bit byte");
Expand Down
3 changes: 2 additions & 1 deletion crates/osint-bake/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ path = "src/main.rs"
[dependencies]
aiwar-ingest = { path = "../aiwar-ingest" }
# osint-bake is the ONLY crate that mints on the V3 cascade tail (the FMA bake:
# CLASSID_FMA_V3 0x1000_0A01 → ReadMode::FMA_V3, the part_of:is_a reading of the
# CLASSID_FMA_V3 0x0A01_1000 (canon 0x0A01 HIGH, V3 marker 0x1000 LOW — 2026-07-02
# half-order flip) → ReadMode::FMA_V3, the part_of:is_a reading of the
# SAME leaf·family·identity bytes). guid-v3-tail is requested here, NOT workspace-
# wide, so it doesn't force the feature onto cockpit-server's Railway build.
lance-graph-contract = { workspace = true, features = ["guid-v3-tail"] }
Expand Down
Loading