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
37 changes: 37 additions & 0 deletions .claude/board/EPIPHANIES.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,43 @@
> `**Status:**`/`**Confidence:**` line. A correction gets its own new,
> dated entry that references the one it corrects — the storno rule.

## 2026-08-27 — E-BINDING-A-REAL-PROVIDER-MEASURES-THE-FIXTURE-1

**Status:** FINDING — measured, pinned by a test rather than asserted.
**Confidence:** High. Both halves are numbers, and the disable-run is
red-then-green on five tests.

Binding the real `ClassView` provider (`OgarClassView`) behind
`--features ogar-classview` did not make the hop *better*. It made the hop
*empty* — and that emptiness is the most useful thing the wiring produced.

The provider itself is correct and discriminating: 98 registered classes,
**12 distinct** participation masks where the fixture answered one. But the
generated row store's classid domain is `0..16`
(`ROWSTORE_CLASS_CARDINALITY`) while every vocabulary classid is `>= 0x0100`
— **disjoint**. So a generated store under a real provider traverses nothing,
for every classid in its own domain.

**The generalizable part.** A fixture with a plausible answer for every input
(`FieldMask::FULL`) is indistinguishable from a bound provider until you bind
one. `FULL` is the answer that never disagrees, which is exactly why it
cannot be falsified in place. The measurement that mattered was not "does
the provider work" — it was **binding it and reading what the rest of the
system then failed to do**. The seam was declared closed-enough for two
waves because nothing in the suite could tell the two providers apart.

**Consequence, stated rather than fixed here:** the remaining fixture is the
row CONTENT, not the layout or the kernels. Replacing `RowStore::generate`
with Lance-loaded SoA rows is what makes the bound provider observable
end-to-end; until then the feature is a correct provider over rows it has no
classes for.

**Discipline note.** Two fixture-semantics tests had to be gated OFF under
the feature. Neither was deleted: each got a paired ON twin asserting the
CONTRASTING fact on the same inputs (all-32 vs none; 19/29 vs empty), so the
gate reads as evidence of a changed answer rather than as a suppressed
failure.

## 2026-08-26 — E-ONE-SUBSTRATE-FIVE-GLOVES-GHIDRA-IS-THE-GLOVE-NOT-THE-MODEL-1

**Status:** DOCTRINE — [OPERATOR-FRAMED]. The "what is it FOR" that the
Expand Down
33 changes: 33 additions & 0 deletions .claude/board/LATEST_STATE.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,36 @@
## 2026-08-27 — the REAL ClassView provider is bound, and it measures the fixture's reach

The `ClassView` provider seam (§4-NG3, "a real ontology/cache provider is a
NAMED SEAM") is no longer only named. `ogar_class_view::OgarClassView` — the
ontology-backed provider over `ogar_vocab` — is bound behind a new
`ogar-classview` feature on `native/lgj-abi`, and `edge_participation` derives
from each class's real field basis instead of the fixture's constant.

- **The provider discriminates, measured.** `examples/classview_census.rs`:
**98 registered classes, 12 distinct participation masks** (field counts
0–13), against the fixture's single `0xFFFF_FFFF` for all 98. An
unregistered classid participates in **nothing** — an unknown class is not
a licence to traverse every facet.
- **The `[patch]` was load-bearing, not cosmetic.** `ogar-class-view` pulls
`lance-graph-contract` by git branch; this crate pulls it by path, and
cargo does not unify a git SourceId with a path SourceId — without the
patch the build carries two `lance-graph-contract` crates and therefore
two incompatible `ClassView` traits. Verified: `cargo tree` shows one.
- **What binding it EXPOSED, and this is the finding.** The generated row
store draws classids from `0..16` (`ROWSTORE_CLASS_CARDINALITY`); every
vocabulary classid is `>= 0x0100`. The two domains are **disjoint**, so a
generated store under the real provider hops nothing. The remaining
fixture is the row CONTENT — Lance-loaded SoA rows are what make the bound
provider observable end-to-end. Pinned by
`hop_under_the_real_provider_narrows_by_class`, not left in prose.
- **Default is unchanged and proven so.** Feature OFF: 134/134 rust, 447/447
Java (304 core + 143 consumer) — the same numbers as before. Feature ON:
136/136. Two fixture-semantics tests are gated OFF under the feature and
each has a paired ON twin asserting the CONTRASTING fact, so nothing was
merely disabled. Five tests red-then-green under the disable
(`edge_participation`'s ogar arm returns `FULL`). G11 fence green:
`class_view`, `canonical_node`, `ontology`, `facet` only.

## 2026-08-25 — the Ghidra end of the R2IL arc: seam verified, vocabulary measured

Working the `r2il-machine-semantic-contract-v1` plan (lance-graph, PR #1027,
Expand Down
13 changes: 13 additions & 0 deletions native/lgj-abi/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions native/lgj-abi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ ndarray = { path = "../../../ndarray", default-features = false, features = ["st
# this crate consumes, and the crate compiles fine without them.
lance-graph-contract = { path = "../../../lance-graph/crates/lance-graph-contract", default-features = false }

# The REAL ClassView provider (OGAR Core). `FixtureClassView` answers the same
# 32 facets for every classid; `OgarClassView` walks `ogar_vocab`'s promoted
# classes and gives a genuine per-class field basis -- attributes AND
# associations -- which is what makes `edge_participation` discriminate.
ogar-class-view = { path = "../../../OGAR/crates/ogar-class-view", optional = true }

[profile.release]
opt-level = 3
lto = "thin"
Expand All @@ -55,3 +61,18 @@ codegen-units = 1

[profile.dev]
# Same rule as release: no panic = "abort".

[features]
# Bind the real OGAR ClassView instead of the fixture. OFF by default: the
# generated row store's classid domain (0..16) is disjoint from the
# vocabulary's (>= 0x0100), so binding it changes what every hop answers --
# see `class_view_provider`'s module docs.
ogar-classview = ["dep:ogar-class-view"]

# ogar-class-view pulls `lance-graph-contract` by git branch; this crate pulls
# it by path. Cargo does NOT unify a git source with a path source, so without
# this patch the build carries TWO `lance-graph-contract` crates and therefore
# two incompatible `ClassView` traits -- the same SourceId trap recorded in
# tesseract-rs for `ogar-doc-ir`. The patch collapses both onto the local path.
[patch."https://github.com/AdaWorldAPI/lance-graph"]
lance-graph-contract = { path = "../../../lance-graph/crates/lance-graph-contract" }
34 changes: 34 additions & 0 deletions native/lgj-abi/examples/classview_census.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//! What the REAL ClassView provider answers, versus the fixture's constant.
//!
//! `cargo run --features ogar-classview --example classview_census`
fn main() {
#[cfg(not(feature = "ogar-classview"))]
println!("build with --features ogar-classview");

#[cfg(feature = "ogar-classview")]
{
use lance_graph_contract::class_view::ClassView;
use ogar_class_view::OgarClassView;
use std::collections::BTreeMap;

let view = OgarClassView::new();
let ids: Vec<u16> = view.known_class_ids().collect();
let mut hist: BTreeMap<usize, usize> = BTreeMap::new();
for c in &ids {
*hist.entry(view.fields(*c).len().min(32)).or_default() += 1;
}
println!("registered classes : {}", ids.len());
println!(
"distinct field counts (= distinct participation masks): {}",
hist.len()
);
println!("\n fields classes");
for (k, n) in &hist {
println!(" {k:>6} {n:>7}");
}
println!(
"\nfixture would answer 0xFFFFFFFF (32 facets) for ALL {} classes.",
ids.len()
);
}
}
Loading