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
4 changes: 4 additions & 0 deletions .claude/board/LATEST_STATE.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 2026-10-10 — HIRO app prefix mirror on branch `claude/hiro-app-prefix` (unmerged; pairs with OGAR #333)

- Contract delta (additive): `ogar_codebook::AppPrefix::Hiro` = `0x000C`, matching OGAR's new `HiroPort`, which maps HIRO's `ogit/_type` wire names onto the nine `0x0CXX` automation concepts. No codebook row changes, so `lance-graph-ogar` codebook parity is unaffected; no cross-repo test pairs the two prefixes, so merge order does not matter. `0x0006` stays unallocated and the next free prefix is `0x000D`. `app_prefixes_match_ogar_allocation_table` pins the value; mapping `Hiro` to `0x000D` turns it red.

## 2026-10-10 — CRM codebook mirror on branch `ccr-1d749cc5-q8s5qs` (unmerged; pairs with OGAR #330)

- Contract delta (additive): `ogar_codebook::ConceptDomain::Crm` (high byte `0x05`), 15 `CODEBOOK` rows `crm_contact 0x0501` … `crm_custom_record 0x050F`; `AppPrefix::{Osm 0x0008, WeatherNext 0x0009, Spear 0x000A, HubSpo 0x000B}` (the prefixes OGAR already allocated, now reachable without `ogar-vocab`). `0x0500` re-pinned `Unassigned` → `Crm`; `0x0006` stays unallocated. Parity (`lance-graph-ogar`, 84 + 21 tests) green against the OGAR branch. Order: OGAR #330 first, this straight after. This branch's parity check against OGAR `main` is red until #330 merges, and `main`'s is red from that merge until this one lands.
Expand Down
16 changes: 14 additions & 2 deletions crates/lance-graph-contract/src/ogar_codebook.rs
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,9 @@ pub enum AppPrefix {
Spear,
/// `0x000B` — HubSPO (CRM render lens).
HubSpo,
/// `0x000C` — HIRO (IT-automation render lens; HIRO's `ogit/_type` wire
/// names onto the `0x0CXX` automation concepts).
Hiro,
}

impl AppPrefix {
Expand All @@ -345,11 +348,12 @@ impl AppPrefix {
AppPrefix::WeatherNext => 0x0009,
AppPrefix::Spear => 0x000A,
AppPrefix::HubSpo => 0x000B,
AppPrefix::Hiro => 0x000C,
}
}

/// Resolve an app-prefix value back to its [`AppPrefix`]. `None` for an
/// unallocated value (`0x0006`, `0x000C`+ — reserved, costs nothing until
/// unallocated value (`0x0006`, `0x000D`+ — reserved, costs nothing until
/// an app mints its first private class).
#[inline]
#[must_use]
Expand All @@ -366,6 +370,7 @@ impl AppPrefix {
0x0009 => Some(AppPrefix::WeatherNext),
0x000A => Some(AppPrefix::Spear),
0x000B => Some(AppPrefix::HubSpo),
0x000C => Some(AppPrefix::Hiro),
_ => None,
}
}
Expand Down Expand Up @@ -1061,6 +1066,7 @@ mod tests {
assert_eq!(AppPrefix::WeatherNext.prefix(), 0x0009);
assert_eq!(AppPrefix::Spear.prefix(), 0x000A);
assert_eq!(AppPrefix::HubSpo.prefix(), 0x000B);
assert_eq!(AppPrefix::Hiro.prefix(), 0x000C);
for app in [
AppPrefix::Core,
AppPrefix::OpenProject,
Expand All @@ -1073,11 +1079,17 @@ mod tests {
AppPrefix::WeatherNext,
AppPrefix::Spear,
AppPrefix::HubSpo,
AppPrefix::Hiro,
] {
assert_eq!(AppPrefix::from_prefix(app.prefix()), Some(app));
}
assert_eq!(AppPrefix::from_prefix(0x0006), None);
assert_eq!(AppPrefix::from_prefix(0x000C), None);
assert_eq!(AppPrefix::from_prefix(0x000D), None);
// A HIRO machine renders with the automation concept in the canon half.
assert_eq!(
render_classid_for_concept(AppPrefix::Hiro, "mars_machine"),
Some(0x0C04_000C)
);
}

#[test]
Expand Down
Loading