You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Membrane consumers (woa-rs / medcare-rs / smb-office-rs, BBB-barrier:
contract/ontology/callcenter only) can now pull BOTH halves of a render
classid from lance_graph_contract::ogar_codebook — no hand-stamped 0x000N.
The #591 consumer spellbook surfaced the gap: contract::ogar_codebook
mirrored the lo-u16 concept pull (canonical_concept_id) but not OGAR#97's
PortSpec::APP_PREFIX / render_classid_for (the hi-u16 render composition).
This closes it, following the OGAR#98 canonical_concept_name precedent.
NEW (wire-compat mirror of OGAR ogar_vocab::app, no ogar-vocab dependency):
- AppPrefix enum = the OGAR#95 §2 allocation table as typed data
(Core 0x0000 / OpenProject 0x0001 / Odoo 0x0002 / WoA 0x0003 /
SMB 0x0004 / Healthcare 0x0005 / Redmine 0x0007), with
prefix() / from_prefix() / render(concept).
- render_classid(prefix, concept) (mirror of app::render_classid)
- render_classid_for_concept(AppPrefix, &str) (one-call membrane helper)
- classid_app_prefix(classid) (mirror of app::app_of)
- classid_concept(classid) (mirror of app::concept_of)
Parity tests pin the wire:
- app_prefixes_match_ogar_allocation_table — the 6 prefixes vs OGAR
PortSpec::APP_PREFIX (drift guard).
- render_classid_composes_decomposes_and_preserves_the_concept_half —
the 0x0005_0901 MedCare-patient worked example, and that the render
lens never perturbs the lo-u16 concept RBAC keys on.
Board-hygiene (same commit): ISSUES.md ISS-CONTRACT-APP-PREFIX-MIRROR
-> RESOLVED; LATEST_STATE.md Contract Inventory entry; the consumer
spellbook Core-gap section -> CLOSED + remediation step 3 cites the
new helper.
Incidental: the crate-wide cargo fmt pass also corrected pre-existing
struct-literal/line-width drift in content_store.rs (same crate, no
behavior change).
Verify: cargo test -p lance-graph-contract green (8 ogar_codebook unit
tests + render_classid_for_concept doctest); clippy -p lance-graph-contract
--all-targets -D warnings clean (default + guid-v2-tail); fmt --check clean.
**Resolution:**`contract::ogar_codebook` now mirrors the hi-u16 APP-prefix layer — `AppPrefix` (the OGAR#95 §2 allocation table as typed data: `0x0001` OpenProject / `0x0002` Odoo / `0x0003` WoA / `0x0004` SMB / `0x0005` Healthcare / `0x0007` Redmine), `render_classid` + `render_classid_for_concept` (compose), `classid_app_prefix` + `classid_concept` (decompose). A membrane consumer (BBB-safe) now pulls BOTH halves from one source — no hand-stamped `0x000N`. Wire-compat parity test `app_prefixes_match_ogar_allocation_table` pins the prefixes against OGAR `PortSpec::APP_PREFIX`; `render_classid_composes_decomposes_and_preserves_the_concept_half` pins the `0x0005_0901` MedCare-patient worked example. Mirrors OGAR#97 (`ogar_vocab::app`), following the OGAR#98`canonical_concept_name` precedent.
6
8
7
9
`contract::ogar_codebook` mirrors `canonical_concept_id` / `canonical_concept_name` (the lo-u16 concept pull, BBB-safe for membrane consumers woa-rs / medcare-rs / smb-office-rs) but does NOT mirror OGAR#97's `PortSpec::APP_PREFIX` + `render_classid_for` (the hi-u16 render composition: `render_classid = APP << 16 | concept`, OGAR#95 §2). A membrane consumer (BBB-barrier: contract/ontology/callcenter only — `lance_graph_ogar` forbidden) can therefore pull the shared concept but must re-derive the app prefix from the OGAR#95 allocation table by hand. Per Core-First the consumer MUST NOT hard-code `0x000N`. **Fix:** mirror the app-prefix table + a `render_classid` helper into `contract::ogar_codebook` (the `canonical_concept_name` reverse-map mirror, OGAR#98, is the precedent) so the membrane stamps from one source. Interim: the spellbook's Q5 says "stamp from the allocation table." Cross-ref: `.claude/knowledge/ogar-consumer-preflight.md` § "A Core gap this spellbook surfaces"; OGAR#95/#97/#98.
0 commit comments