From 5bac32a07a0045e20cad2ca049cb929768e0c520 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:14:48 +0000 Subject: [PATCH 01/13] docs: drop rev-pin template (internal pins forbidden), withdraw TD-POPCNT runtime-detect option, clarify baseline AVX2 arm CARGO-COMPUTE-SUBSTRATE and the cargo-substrate-architect card showed rev = "" as the canonical coordinate; internal pins are forbidden, so the template now names branch = "master". TD-NDARRAY-SIMD-POPCNT-NATIVE item (b) proposed runtime detection inside kernels, which the startup-only cpu_guard rule excludes; its status line records the withdrawal. The .cargo/config.toml SIGILL note was correct and gains one line saying the AVX and x86-64-v2 arms apply only when requested. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .cargo/config.toml | 4 +++- .claude/agents/cargo-substrate-architect.md | 3 ++- .claude/board/TECH_DEBT.md | 2 +- .claude/knowledge/CARGO-COMPUTE-SUBSTRATE.md | 4 ++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 8f2e83535..b84d7fb44 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -53,7 +53,9 @@ # python/ sets RUSTFLAGS only on an x86_64 host. Note that the per-target # variable is JOINED with this file's entry, with `native` last (measured), so # it cannot pin a build that sees this file. Anything below v3 still SIGILLs on the -# `simd_avx2` intrinsics, so never build with no target-cpu at all. +# `simd_avx2` intrinsics, so never build with no target-cpu at all. (ndarray's +# AVX-without-AVX2 and x86-64-v2 arms apply only when their own config is +# requested; a plain baseline build still takes the AVX2 arm.) # # The two crypto cfgs ndarray's config also carries (`curve25519_dalek_backend`, # `poly1305_force_soft`) are deliberately NOT repeated: neither crate is in diff --git a/.claude/agents/cargo-substrate-architect.md b/.claude/agents/cargo-substrate-architect.md index 8c9d2b8ec..a3e069aec 100644 --- a/.claude/agents/cargo-substrate-architect.md +++ b/.claude/agents/cargo-substrate-architect.md @@ -79,7 +79,8 @@ Per workspace root: ```toml [workspace.dependencies] -ndarray = { git = "", rev = "", default-features = false, features = ["std"] } +ndarray = { git = "", branch = "master", default-features = false, features = ["std"] } +# never `rev = …`: a pin on an internal crate is forbidden; master is the go-to branch ``` Members become `ndarray = { workspace = true, features = [...] }`. diff --git a/.claude/board/TECH_DEBT.md b/.claude/board/TECH_DEBT.md index 30ea73572..fba44ee4e 100644 --- a/.claude/board/TECH_DEBT.md +++ b/.claude/board/TECH_DEBT.md @@ -1860,7 +1860,7 @@ not necessarily a logic bug. NOTE: `lance-graph-arm-discovery/Cargo.toml` *recom U64x8 popcount kernel + the AMX re-exports), (b) decide whether ndarray's `U64x8` should runtime-detect VPOPCNTDQ/AMX rather than trust compile-time `target_feature`, and (c) correct the Cargo.toml comment to warn that `native` can SIGILL on virtualized hosts lacking the detected AVX-512 subset. Until then: -run the `ndarray-simd` probes on the default path. **Status: Open.** +run the `ndarray-simd` probes on the default path. **Status: Open; item (b) withdrawn 2026-10-16 — runtime detection in kernels is forbidden (dispatch is compile time, the only CPU check is ndarray's startup `cpu_guard`); (a) and (c) remain.** ### TD-CI-COVERAGE-MOLD-1 — `test-with-coverage` job lacks the mold linker the `test` job has (2026-06-12) diff --git a/.claude/knowledge/CARGO-COMPUTE-SUBSTRATE.md b/.claude/knowledge/CARGO-COMPUTE-SUBSTRATE.md index cccd113fa..7cf3d92cf 100644 --- a/.claude/knowledge/CARGO-COMPUTE-SUBSTRATE.md +++ b/.claude/knowledge/CARGO-COMPUTE-SUBSTRATE.md @@ -215,7 +215,7 @@ But this: every repo: ndarray = { workspace = true } workspace root: [workspace.dependencies] - ndarray = { git = "", rev = "" , ... } + ndarray = { git = "", branch = "master" , ... } # never a rev pin: internal pins are forbidden local supercheckout only: [patch.""] @@ -225,7 +225,7 @@ local supercheckout only: Which gives: ```text -CI / standalone clone -> pinned git ndarray +CI / standalone clone -> git ndarray, branch master local development -> same dep, transparently patched to ../ndarray release binary -> exactly ONE resolved ndarray package ``` From 23b9666d6f23fba0d4d923b9a3544d56daefb4e3 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:15:48 +0000 Subject: [PATCH 02/13] docs: the no-target-cpu AVX2 arm is the validation oracle only; native via the ndarray polyfill is the goal Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .cargo/config.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index b84d7fb44..5739cd25b 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -53,9 +53,10 @@ # python/ sets RUSTFLAGS only on an x86_64 host. Note that the per-target # variable is JOINED with this file's entry, with `native` last (measured), so # it cannot pin a build that sees this file. Anything below v3 still SIGILLs on the -# `simd_avx2` intrinsics, so never build with no target-cpu at all. (ndarray's -# AVX-without-AVX2 and x86-64-v2 arms apply only when their own config is -# requested; a plain baseline build still takes the AVX2 arm.) +# `simd_avx2` intrinsics, so never build with no target-cpu at all. A build with +# no target-cpu takes ndarray's AVX2 arm, and that arm is kept only as the +# validation oracle; the goal for every real build is `native` through the +# ndarray polyfill, once its arms are validated against that oracle. # # The two crypto cfgs ndarray's config also carries (`curve25519_dalek_backend`, # `poly1305_force_soft`) are deliberately NOT repeated: neither crate is in From f38778ff73c8ef333c449cb76b108a1a4c951220 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:18:59 +0000 Subject: [PATCH 03/13] board: record #1579 merge Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .claude/board/LATEST_STATE.md | 5 +++++ .claude/board/PR_ARC_INVENTORY.md | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/.claude/board/LATEST_STATE.md b/.claude/board/LATEST_STATE.md index 3758bb621..9445ca3e7 100644 --- a/.claude/board/LATEST_STATE.md +++ b/.claude/board/LATEST_STATE.md @@ -1,3 +1,8 @@ +## 2026-10-16 — main after #1579 (merged `7302f58c`); synergy map on main + +- **On `main` (#1579):** the synergy map entry and the status sweep; the open decisions it names are listed in the arc entry. +- **In PR:** #1582 (doc fixes: rev-pin template, TD-POPCNT runtime-detect option withdrawn, the no-target-cpu AVX2 arm is the validation oracle only). + ## 2026-10-16 — main after #1576 (merged `9a657bd3`); catch-up for #1560, #1570, #1571, #1574, #1575, #1576 - **On main, not recorded here before:** #1560 (O22 `CounterfactualVerdict` producer, R1 test, ledger correction), #1570 (Haspelmath harness, frozen operand dictionary), #1571 (D-QPROF-0 `qualia_profile`, merged; the "in PR" section below is now on main), #1574 (59..60 one field, two vocabularies; mapping inventory; D-ASM-0), #1575 (D-HOLO H14d measured), #1576 (D-ASM-1..4 spec ratified, nothing authorized). diff --git a/.claude/board/PR_ARC_INVENTORY.md b/.claude/board/PR_ARC_INVENTORY.md index d4fb40598..9f9cc6785 100644 --- a/.claude/board/PR_ARC_INVENTORY.md +++ b/.claude/board/PR_ARC_INVENTORY.md @@ -1,3 +1,10 @@ +## 2026-10-16 — lance-graph PR #1579 (merged `7302f58c`, branch `ccr-9f3b8075-74u47l-synergy-map`, head `97b744ec`, 3 commits) — board: synergy map since 2026-10-11, status sweep, #1575 record + +- **Added:** entry `2026-10-16-synergy-map-since-1011.md` (the 2026-10-11 fleet listing revised against 123 merges: closed ends, dots D1–D8, fruits, Haiku ledger, §8 reconciliation with the recovery ledger, §9 label codebook sizes); ten STATUS rows moved from "In PR" to Shipped; arc entry for #1575. +- **Locked:** measured codebook sizes — ONA `ATOMS_MAX 255`; MeTTa stdlib 266 symbols, the 26 golden scripts 282 together (at most 26 per script outside the stdlib); cog vocabulary 214. No two corpora fit one 256-entry codebook, so codebooks are scoped per classid and space. D7 (two ndarray packages) closed: the root and relalg `[patch]` sections already resolve one package (Codex review). +- **Deferred / open:** D-RA-2, codebook scope, #1544 closure (decisions); the cross-repo doc fixes; the wasm `mul_add` test; the lgj `check_build_cpu` handshake. +- **Confidence:** n/a (board); counts by token regex over `.metta` files, not the Hyperon parser. + ## 2026-10-16 — lance-graph PR #1576 (merged `9a657bd3`, branch `ccr-c09987ed-cuk6r5`, 8 commits) — council: metta-datalog-assimilation W1–W3 spec ratified (D-ASM-1..4) - **Added:** `.claude/plans/metta-datalog-assimilation-v1-council-v3.md` (executable spec, gates G1–G9); ⊘ notes on the plan's decisions A–E, G and §6; `metta-polyfill-v1.md` §5 amended; STATUS D-ASM-1..5, D-MTP-2, D-RA-3; 3 TECH_DEBT rows; entry `2026-10-16-metta-datalog-assimilation-council-v3.md`. From ae3b395b386eb4887ab55926fab179bb650aed63 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:21:36 +0000 Subject: [PATCH 04/13] board: OpenCog is a temporary validation oracle; lance-graph-cog only if validation earns it Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .../2026-10-16-opencog-oracle-scope.md | 23 +++++++++++++++++++ .claude/board/entries/README.md | 3 ++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 .claude/board/entries/2026-10-16-opencog-oracle-scope.md diff --git a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md new file mode 100644 index 000000000..510fc6866 --- /dev/null +++ b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md @@ -0,0 +1,23 @@ +# 2026-10-16 — OpenCog is a temporary validation oracle, not a dependency + +**Status:** DECISION (docs only; nothing built, nothing linked). + +DECISION: OpenCog (Classic AtomSpace, PLN, ECAN, the pattern miner) is used only +as a temporary oracle, to validate that our MeTTa reading agrees with OpenCog's +on the same inputs. It is harvested for that check and not wired into any +lance-graph crate. + +SCOPE: `lance-graph-metta` stays the MeTTa front end and `Space` adapter +(D-MTP-0, `2026-10-14-metta-polyfill-map.md`). Oracle harnesses that run OpenCog +code live outside the workspace, like `datalog-oracle-probe` and `hyperon-probe`. + +BASIS: Classic AtomSpace is AGPL, so its code cannot enter an Apache/MIT crate, +and its value here is only as a reference answer. + +REVISIT WHEN: the validation is done. Then one of two outcomes is recorded: +OpenCog is redundant (MeTTa via Hyperon/PeTTa already covers it) and the harvest +is dropped, or it earns a separate `lance-graph-cog` crate under its own licence, +possibly in its own repository. + +OPEN: which OpenCog pieces the validation needs (PLN rules, ECAN, AtomSpace +queries); none is pinned yet. diff --git a/.claude/board/entries/README.md b/.claude/board/entries/README.md index d25b5b610..1811b27ab 100644 --- a/.claude/board/entries/README.md +++ b/.claude/board/entries/README.md @@ -25,11 +25,12 @@ index row, (3) no duplicate entry id. Checks 1 and 2 are deliberately opposite directions; the stranding this convention prevents shows up in exactly one of them, never both. -352 entries, 2026-08-06 .. 2026-10-16. +353 entries, 2026-08-06 .. 2026-10-16. | date | entry id | finding | file | |---|---|---|---| | 2026-10-16 | `synergy-map-since-1011` | | [2026-10-16-synergy-map-since-1011.md](2026-10-16-synergy-map-since-1011.md) | +| 2026-10-16 | `opencog-oracle-scope` | | [2026-10-16-opencog-oracle-scope.md](2026-10-16-opencog-oracle-scope.md) | | 2026-10-16 | `D-ASM-1` | | [2026-10-16-metta-datalog-assimilation-council-v3.md](2026-10-16-metta-datalog-assimilation-council-v3.md) | | 2026-10-16 | `ledger-revision-after-1576` | | [2026-10-16-ledger-revision-after-1576.md](2026-10-16-ledger-revision-after-1576.md) | | 2026-10-16 | `D-HOLO-H14d` | | [2026-10-16-d-holo-h14d-logic-mask-read.md](2026-10-16-d-holo-h14d-logic-mask-read.md) | From 29f426b88b64922db50890e817410a809c6eb3af Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:22:34 +0000 Subject: [PATCH 05/13] =?UTF-8?q?board:=20OpenCog=20licence=20check=20?= =?UTF-8?q?=E2=80=94=20linking=20exception=20covers=20an=20adapter;=20port?= =?UTF-8?q?ing=20code=20is=20the=20risk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .../2026-10-16-opencog-oracle-scope.md | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md index 510fc6866..943c08658 100644 --- a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md +++ b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md @@ -21,3 +21,35 @@ possibly in its own repository. OPEN: which OpenCog pieces the validation needs (PLN rules, ECAN, AtomSpace queries); none is pinned yet. + +## Licence check: does an adapter to OpenCog code poison ours? (read 2026-10-16) + +Read: `opencog/atomspace` `LICENSE` at `master` (693 lines), the header and the +"Linking Exception" at lines 672-693; `opencog/cogserver` `LICENSE` has the same +header. Not read: PLN, attention (ECAN), the miner, and per-file headers, which +the licence says can override it ("Unless indicated otherwise (a license +reference in file headers, or a LICENSE file in a directory)"). + +The AtomSpace is AGPL v3 **with a linking exception** of the GPL-classpath kind: +"permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent modules", where +"An independent module is a module which is not derived from or based on this +library." + +| shape | effect on our licence | +|---|---| +| separate process (CogServer, socket, pipe) | none; no linking happens | +| our adapter linking the unmodified library, written against its API | none under the exception; the AtomSpace part stays AGPL and its source must be offered when we distribute it | +| we patch the AtomSpace (e.g. for speed) | our code stays ours; the patched library is AGPL and the exception is optional on it; AGPL §13 applies if users reach it over a network | +| we port or transcode AtomSpace code into Rust | **this is the risk**: a port is "derived from or based on this library", so it is AGPL, and so is any crate it lands in | + +So linking an adapter does not poison the licence; copying the code does. A +harvest for validation must keep OpenCog code and our code apart: OpenCog runs as +the oracle, and our side is written from its documented behaviour, never from its +source. This is not legal advice; check with counsel before distributing anything +that links OpenCog. + +OPEN: where a 200× speedup would come from has not been identified or measured. +The MeTTa-side engines measured so far are Hyperon (MIT) and PeTTa (MIT); the +local MORK checkout (`ed57c67`) has no licence file and no licence field, so its +licence is unknown. From 217da7b81fea9d7b7536ba1c1d1fa48fc7e883a7 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:28:07 +0000 Subject: [PATCH 06/13] =?UTF-8?q?board:=20OpenCog=20oracle=20and=20calibra?= =?UTF-8?q?tion=20use=20=E2=80=94=20fetch=20fixtures,=20never=20copy=20sou?= =?UTF-8?q?rce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .../entries/2026-10-16-opencog-oracle-scope.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md index 943c08658..ad3ae4f7e 100644 --- a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md +++ b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md @@ -53,3 +53,18 @@ OPEN: where a 200× speedup would come from has not been identified or measured. The MeTTa-side engines measured so far are Hyperon (MIT) and PeTTa (MIT); the local MORK checkout (`ed57c67`) has no licence file and no licence field, so its licence is unknown. + +### Oracle and calibration use (same reading) + +Running unmodified AGPL software and comparing its answers with ours does not +license our code under AGPL; the AGPL grants running it without conditions. Two +things still need care: + +- **Fixtures:** OpenCog's own input files (rule libraries, test scripts) stay + AGPL wherever they are copied. Fetch them at a pinned commit outside the repo + (the `bench/fetch.sh` pattern in tesseract-rs) instead of committing them. Our + own generated inputs and the recorded answers (truth values, binding sets, + counts) are results, not OpenCog code, and can be committed. +- **Calibration:** matching our constants or truth formulas to OpenCog's answers + is fine. Taking a formula from the PLN papers or documentation is fine. + Transcribing it from their source code is the porting case above. From d06b0cf90a65e81fcb951878951779a3c390c6f5 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:30:47 +0000 Subject: [PATCH 07/13] =?UTF-8?q?board:=20OpenCog=20fork=20importing=20our?= =?UTF-8?q?=20crates=20=E2=80=94=20our=20licences=20hold,=20glue=20in=20th?= =?UTF-8?q?e=20fork=20is=20AGPL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .../2026-10-16-opencog-oracle-scope.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md index ad3ae4f7e..0c54e042b 100644 --- a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md +++ b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md @@ -68,3 +68,27 @@ things still need care: - **Calibration:** matching our constants or truth formulas to OpenCog's answers is fine. Taking a formula from the PLN papers or documentation is fine. Transcribing it from their source code is the porting case above. + +### An OpenCog fork in its own repository that imports our crates + +Case: fork OpenCog (AtomSpace) in a separate repository and change it to use +ndarray, Datalog over folds, or a storage adapter backed by `lance-graph-quack`. + +- **Our crates keep their licences.** Dependencies flow OpenCog → ndarray / + quack, never back. ndarray is MIT or Apache-2.0, lance-graph is Apache-2.0 + (repository `LICENSE`; quack and mask-risc carry no own field), relalg is + MIT OR Apache-2.0. Both are compatible with AGPL v3, so a combined AGPL binary + may include them without changing them. +- **The fork is AGPL**, including every line we write inside it (the storage + backend, glue, patches), because that code is based on OpenCog. If the fork is + distributed, or modified and offered to users over a network (§13), its source + must be published; a public fork satisfies that. +- **The trap is reuse in the other direction.** Glue written in the fork cannot + later move into lance-graph without bringing AGPL with it. So general logic is + written in our repositories first, under our licence, and the fork only calls + it; the fork keeps the thinnest possible adapter. +- The combined binary is distributed under AGPL terms; our crates inside it are + still usable on their own under their own licences. + +OPEN: whether glue we author ourselves could be dual-licensed is a copyright +question for counsel, not settled here. From fb212bbfc6d56d0295e58638b0ef994ebb1bf0b5 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:33:23 +0000 Subject: [PATCH 08/13] board: lance-graph-cog is our Apache-2.0 API that an AGPL OpenCog fork calls Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .../entries/2026-10-16-opencog-oracle-scope.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md index 0c54e042b..758cea15f 100644 --- a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md +++ b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md @@ -92,3 +92,20 @@ ndarray, Datalog over folds, or a storage adapter backed by `lance-graph-quack`. OPEN: whether glue we author ourselves could be dual-licensed is a copyright question for counsel, not settled here. + +### DECISION (same day): `lance-graph-cog` is our API for OpenCog to call + +DECISION: improving OpenCog for its community is welcome. `lance-graph-cog` is the +crate OpenCog would use: a lance-graph crate under lance-graph's own licence +(Apache-2.0) that exposes the storage, fold-execution and codebook API. The +AGPL side is a separate OpenCog fork that depends on it and keeps only the thin +adapter (for example an AtomSpace storage backend). + +SCOPE: `lance-graph-cog` contains no OpenCog code. It is written from OpenCog's +documented API and observed behaviour, never from its source, so it stays +reusable by any caller. This refines the D-MTP-0 naming note +(`2026-10-14-metta-polyfill-map.md`): "cog" there meant pulling OpenCog itself +into the crate, which stays ruled out; here it names the API OpenCog consumes. + +REVISIT WHEN: the oracle validation shows which surface OpenCog actually needs; +until then the crate is not created. From 1df0af17c64056202c3da80cc775359299b8eeda Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:34:52 +0000 Subject: [PATCH 09/13] board: lance-graph-ontology is the precedent for lance-graph-cog Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .claude/board/entries/2026-10-16-opencog-oracle-scope.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md index 758cea15f..b71a93c35 100644 --- a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md +++ b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md @@ -109,3 +109,12 @@ into the crate, which stays ruled out; here it names the API OpenCog consumes. REVISIT WHEN: the oracle validation shows which surface OpenCog actually needs; until then the crate is not created. + +**Precedent:** `lance-graph-ontology` (Apache-2.0) already has this shape. It +hydrates other people's formats into our registry and Lance cache without +containing their code: OGIT TTL (`oxttl`), OWL and FIBO RDF/XML (`oxrdfxml`), XSD +schemas (`quick-xml`), plus a Wikidata path, with `soa_bake` and `lance_cache` +as the fast side. Tenants then reach it through thin `NamespaceBridge` views. +`lance-graph-cog` would do the same for OpenCog: read AtomSpace content (Atomese +atoms) as input data, and give the AGPL fork's adapter the same bake-and-cache +surface. From bdfb8640e1aa7d9080baae75af280ea1e02984ab Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:36:34 +0000 Subject: [PATCH 10/13] board: mark the ontology registry's hash lookups for review against BindSpace DTO + quack Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .claude/board/TECH_DEBT.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.claude/board/TECH_DEBT.md b/.claude/board/TECH_DEBT.md index fba44ee4e..bcc1a0008 100644 --- a/.claude/board/TECH_DEBT.md +++ b/.claude/board/TECH_DEBT.md @@ -4618,3 +4618,15 @@ as CAM search modes ("exact CAM search", "wide CAM scan", "DN-tree traversal") w (`causal_edge::isa::truth::code`, D-NALP-4) with the argument-order split recorded in `.claude/research/2026-10-15-nars-metta-ce64-mapping-inventory.md` §6. Doc-only; close by one PR that rewrites the five doc comments to the truth-function meaning and names the OpenNARS/ONA order convention. + +## TD-ONTOLOGY-REGISTRY-HASH-LOOKUP-REVIEW-1 (2026-10-16) — OPEN, review only + +`lance-graph-ontology`'s `OntologyRegistry` resolves names through string-keyed hash maps +(`registry.rs:56-73`: `by_bridge_name: HashMap<(String, String), u32>`, `by_uri: HashMap`, +`by_namespace`, `bundles`, `path_by_type` / `type_by_path`) and persists append-only to Lance +(`lance_cache.rs`). This predates the BindSpace DTO and the quack fold path. Review whether the hot +lookups can become label-codebook ids resolved once plus coordinate ranges and masks over baked SoA +lanes (`soa_bake`, quack `Binder::code`), leaving the string maps only at hydration. Not measured: +no lookup timing exists for this registry, so there is no claim it is slow yet. Also the precedent for +`lance-graph-cog` (`entries/2026-10-16-opencog-oracle-scope.md`), so a finding here carries over. Close +by: a measured comparison on one OGIT tenant (string-map resolve vs codebook + mask), recorded as an entry. From bae6d9fca7425546bafd40310d8c50896d438ff4 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:40:53 +0000 Subject: [PATCH 11/13] board: atomspace forks and the atomspace-lance landing space; StorageNode API and Rocks key map Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .../2026-10-16-opencog-oracle-scope.md | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md index b71a93c35..dce6d3bef 100644 --- a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md +++ b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md @@ -118,3 +118,33 @@ as the fast side. Tenants then reach it through thin `NamespaceBridge` views. `lance-graph-cog` would do the same for OpenCog: read AtomSpace content (Atomese atoms) as input data, and give the AGPL fork's adapter the same bake-and-cache surface. + +### Repositories (added 2026-10-16) + +AdaWorldAPI now has forks of `opencog/atomspace`, `atomspace-cog`, `atomspace-rocks`, +`cogserver`, `lg-atomese` and `learn`, plus an empty `AdaWorldAPI/atomspace-lance`, the +landing space for the AGPL-side adapter. Read: the atomspace-rocks fork at `6577a5b` +(`RocksStorage.h`, the key-schema comment in `RocksIO.cc:78-148`); same licence header and +linking exception as the AtomSpace; per-file headers `AGPL-3.0-or-later`. + +`atomspace-lance` is the analogue of `RocksStorageNode`: a `StorageNode` subclass (AGPL, it +is based on OpenCog) whose calls go down into `lance-graph-cog` (Apache-2.0). The StorageNode +API it must implement (`RocksStorage.h:142-171`): open/close, `getAtom`, `getLink`, +`fetchIncomingSet` / `fetchIncomingByType`, `storeAtom`, `removeAtom`, `storeValue` / +`updateValue` / `loadValue`, `loadType`, `loadAtomSpace` / `storeAtomSpace`, +`loadFrameDAG` / `storeFrameDAG` / `deleteFrame`, `barrier`. + +How Rocks lays out the data, and the candidate mapping on our side (not built, not measured): + +| Rocks key | meaning | our side | +|---|---|---| +| `n@satom`, `l@satom` → sid; `a@sid` → satom | atom s-expression ↔ 64-bit id | content → NodeGuid; names via the label codebook | +| `h@shash` → sid list | hash → ids | not needed if the address is content-derived | +| `i@sid:stype-sid` | incoming set (by type) | a hop: preimage over coordinate ranges | +| `k@sid:kid` → sval | values (truth value etc.) per key | lanes on the row | +| `d@`/`f@`/`o@` frames, `z` heights | Kripke frames (layered AtomSpaces), link heights | hypothesis layers / Lance versions | +| prefix scans (`n@(Concept`) | load all atoms of a type | class range over the classid prefix | + +OPEN: the atom identity mapping (content → NodeGuid) is the first design item; RocksIO's +s-expression text is the identity Rocks uses, which we would replace with a deterministic +address. From f25aef12d1531d75594cbb0d72f35a84ba368f48 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:49:40 +0000 Subject: [PATCH 12/13] board: positional tables + zipper merge on read work over any ordered KV, Rocks included Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .../2026-10-16-opencog-oracle-scope.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md index dce6d3bef..7c6ae61fc 100644 --- a/.claude/board/entries/2026-10-16-opencog-oracle-scope.md +++ b/.claude/board/entries/2026-10-16-opencog-oracle-scope.md @@ -148,3 +148,24 @@ How Rocks lays out the data, and the candidate mapping on our side (not built, n OPEN: the atom identity mapping (content → NodeGuid) is the first design item; RocksIO's s-expression text is the identity Rocks uses, which we would replace with a deterministic address. + +### Positional tables and zipper merge on read work over any KV store + +The layout we use — `tableA[index]`, `tableB[index]`: parallel tables addressed by the same +row index, written sparsely, joined by a zipper merge on read — does not need Lance. It +needs only that each table can be read in index order. A KV store with ordered keys +(RocksDB iterates keys lexically) provides that, so the same layout runs on Rocks: one +key prefix per table, keys ending in the row index, and a read that walks the prefixes in +step and merges them in one pass instead of one `Get` per atom per key. + +Why this matters here: +- `atomspace-lance` and an improved `atomspace-rocks` can share one layout; Lance is one + backend for it, not a precondition (the 2026-10-05 storage-portability decision: + Quack owns the semantics, the backend supplies capabilities). +- Rocks already sorts by prefix (`k@sid:`, `i@sid:`); what changes is that `sid` becomes a + row index and the per-atom string keys stop being the join. +- It is the same pattern as the alpha layers (sparse dirty writes, merge on read). + +Not built, not measured: no timing exists for Rocks with this layout or for the current +`RocksStorageNode`. A first probe would load one AtomSpace both ways and compare reads +per element. From 0deb37bee4123d818c45452ce187445415002479 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 10:51:24 +0000 Subject: [PATCH 13/13] docs: production builds keep their declared tier; record #1582's full scope on the board Codex review: native is for local and host-bound builds, shipped artifacts stay on x86-64-v4 / sapphirerapids. LATEST_STATE now names the OpenCog decisions and the ontology review item this PR also carries. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011BMJnDBAfzcuQh5HeT39Rh --- .cargo/config.toml | 6 ++++-- .claude/board/LATEST_STATE.md | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 5739cd25b..878fb7eba 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -55,8 +55,10 @@ # it cannot pin a build that sees this file. Anything below v3 still SIGILLs on the # `simd_avx2` intrinsics, so never build with no target-cpu at all. A build with # no target-cpu takes ndarray's AVX2 arm, and that arm is kept only as the -# validation oracle; the goal for every real build is `native` through the -# ndarray polyfill, once its arms are validated against that oracle. +# validation oracle. Real builds go through the ndarray polyfill at a declared +# tier once its arms are validated against that oracle: `native` for local and +# host-bound builds, the explicit x86-64-v4 / `sapphirerapids` tier above for +# shipped artifacts. # # The two crypto cfgs ndarray's config also carries (`curve25519_dalek_backend`, # `poly1305_force_soft`) are deliberately NOT repeated: neither crate is in diff --git a/.claude/board/LATEST_STATE.md b/.claude/board/LATEST_STATE.md index e03a2880e..f9cf4be20 100644 --- a/.claude/board/LATEST_STATE.md +++ b/.claude/board/LATEST_STATE.md @@ -1,3 +1,7 @@ +## 2026-10-16 — main after #1581; in PR #1582 + +- **In PR #1582:** doc fixes (rev-pin template withdrawn, TD-POPCNT runtime-detect option withdrawn, the no-target-cpu AVX2 arm is the validation oracle only); the #1579 arc entry; and the OpenCog decisions in `entries/2026-10-16-opencog-oracle-scope.md` — OpenCog as a temporary validation oracle, the licence reading, `lance-graph-cog` as the Apache-2.0 API an AGPL OpenCog fork (`atomspace-lance`) would call, positional tables over any ordered KV; plus `TD-ONTOLOGY-REGISTRY-HASH-LOOKUP-REVIEW-1`. Nothing built. + ## 2026-10-16 — main after #1578 (merged `1f5322fe`) and #1579 (merged `7302f58c`); ledger update in PR #1581 - **On main:** #1578 (ledger revision after #1576, arc catch-up), #1579 (synergy map since 2026-10-11, ten STATUS rows set to Shipped, label codebook sizes measured), #1580 (hydrate: `zip` 2 → 9).