diff --git a/.claude/board/ISSUES.md b/.claude/board/ISSUES.md index e47db1ee9..c10737cb7 100644 --- a/.claude/board/ISSUES.md +++ b/.claude/board/ISSUES.md @@ -1,3 +1,12 @@ +## ISS-SUPERVISOR-RESPAWN-BACKOFF-NOT-APPLIED — a crashed consumer actor is respawned at once and the respawn is rescheduled forever (2026-10-13) + +**Status:** OPEN. **Basis:** VERIFIED-IN-CODE (`crates/lance-graph-supervisor/src/supervisor.rs`, `RespawnG` arm); found by the codex review of #1536. + +- On `ActorTerminated` the supervisor casts `RespawnG { crash_count: n }`. The arm computes the backoff delay, spawns a task that sleeps that delay and casts `RespawnG { crash_count: 0 }`, and then calls `spawn_consumer_actor` right away (the comment says the delayed cast is a retry "if we need to"). +- The delayed `RespawnG` runs the same arm: another immediate spawn, another delayed cast. So the backoff never delays the first respawn, the crash count is reset to 0 on every round, and each round schedules the next one 100 ms later, whether or not the child is alive. +- The `>10` escalation guard cannot trip, because the count it reads is reset. +- What closes it: the delayed cast becomes the only respawn path (no immediate spawn), the count is carried rather than reset, and the arm does nothing when the slot is already alive. Needs a test that crashes a child twice and checks one spawn per crash after the delay. + ## ISS-CLASSID-READ-MODE-IS-A-SECOND-RESOLUTION-PATH — the `0x1000` V3 marker still selects the reading (2026-10-10) **Status:** OPEN. **Basis:** VERIFIED-IN-CODE; DECISION by operator 2026-10-10 (the V3 marker is a fossil; only `hotplug.rs` and the slab metadata envelope decide whether a slab is `Facet96` (32 + 96) or `Register128` (128, classid via SPOG/plug)). Record: `entries/2026-10-10-classid-layout-ruling.md`, plan `cross-glove-business-parity-v1.md` §C.9.3. diff --git a/.claude/board/LATEST_STATE.md b/.claude/board/LATEST_STATE.md index f9d365c53..663eac6f5 100644 --- a/.claude/board/LATEST_STATE.md +++ b/.claude/board/LATEST_STATE.md @@ -1,4 +1,4 @@ -## 2026-10-13 — main after #1505, #1506, #1507–#1509, #1514, #1516, #1518, #1520, #1523, #1524, #1525, #1526, #1529, #1530, #1531, #1534 (merged) +## 2026-10-13 — main after #1505, #1506, #1507–#1509, #1514, #1516, #1518, #1520, #1523, #1524, #1525, #1526, #1529, #1530, #1531, #1534, #1536, #1537 (merged) - **On `main`, live:** `.cargo/config.toml` defaults to `-Ctarget-cpu=native` with `config-v3.toml` as the portable baseline and `debug = 0` everywhere (#1505); `compute_dag_kahn` checks all 256 field positions (#1506); R2IL `MIN`/`MAX` lowering onto mask-risc (#1518, the part outside glove-parity). - **Merged then withdrawn by #1524 (D-CMR-RESET):** the class-method layer of `lance-graph-glove-parity` (`method`, `call`, `decl`, `gremlin`, `awareness`; #1507, #1508, #1509, #1514, #1516, #1518, #1520). Prior state: `backup/session-011BMJ-2026-10-12`. Inventory: entry `2026-10-12-session-reset-inventory.md`. @@ -7,6 +7,8 @@ - **On `main` (#1529, merged `2d33bb0`):** D-PROD-V4. `Dockerfile.avx512` builds `sapphirerapids`, `Dockerfile` builds `native`, the other images and the wheel build `x86-64-v4`; `linux-build-v4` compiles both tiers in CI without running them. - **On `main` (#1530 `c864721`, #1531 `86e3174`):** the thinking-engine, cognitive-stack and symbiont images build on `rust:1.99.0-bookworm` against ndarray `master`; the thinking-engine images build v4 with `--target `. - **On `main` (#1534, merged `0a6708b`):** `lance-graph-r2il` is a workspace member; r2il, `lance-graph-nal` and `r2il-mask-abi-probe` take OGAR by git `main`, so the graph holds one `ogar-loco` and one `lance-graph-contract` (D-FOLD-CORE-a). +- **On `main` (#1537, merged `befbf1d`):** core `lance-graph` depends on mask-risc, Quack and R2IL by default and exposes them as `lance_graph::fold` (D-FOLD-CORE-b). NAL stays in `crates/lance-graph-nal` (D-FOLD-CORE-c dropped). +- **Docs only (#1536, merged `2b28a19`):** outer-membrane graph lab, epoch-indexed temporal graph agenda, and the ONA → NAL/R2IL fold-method program (W3–W9). Proposals; nothing in them is built by that PR. The supervisor's restart backoff is not applied (`ISS-SUPERVISOR-RESPAWN-BACKOFF-NOT-APPLIED`). - **CI (#1526, merged `abc0a1f`):** the native default plus `rust-cache` reused AVX-512 artifacts on runners without them (SIGILL in `dir-sim log in Lance`). `native` is now written out as each runner's exact feature list, and the cache is keyed to it. - **Rules carried from this session (operator):** classid-dependent methods go through the existing `hotplug.rs` plug-and-play; NAL/NARS operations are global core methods (no classid check, no plug, no `BeliefClass`); internal pins are forbidden (the v3 pins in the Dockerfiles and wheel build were replaced in #1529). diff --git a/.claude/board/PR_ARC_INVENTORY.md b/.claude/board/PR_ARC_INVENTORY.md index 96767d82b..e39f41785 100644 --- a/.claude/board/PR_ARC_INVENTORY.md +++ b/.claude/board/PR_ARC_INVENTORY.md @@ -1,3 +1,17 @@ +## 2026-10-13 — lance-graph PR #1536 (merged `2b28a19`, branch `docs/outer-membrane-graph-lab-20261013`, head `93b0993`, 5 commits) — docs: outer membrane graph lab, epoch-indexed temporal graph agenda, ONA → NAL/R2IL fold-method program + +- **Added:** three proposal documents under `docs/architecture/`: `OUTER_MEMBRANE_GRAPH_LAB_VERTICAL_SLICE.md` (ownership rule, callcenter/supervisor evidence table, a falsifiable two-node one-edge vertical slice), `EPOCH_TEMPORAL_GRAPH_RESEARCH_AGENDA.md` (E01–E20 exploration questions, three time axes, T0–T6 sequence), `ONA_NAL_R2IL_FOLD_METHOD_ASSIMILATION.md` (ONA source map, W3–W9 coding waves, falsifiers). No code. +- **Locked:** ONA is a pinned oracle and a source of pure laws to reimplement, not a runtime; NAL stays its own crate over R2IL/mask-risc; decision methods stay inert until authorised. The ONA assimilation brief behind these documents is what superseded D-FOLD-CORE-c (NAL as a core module); the documents themselves only describe the crate as the starting contract (recorded under the D-FOLD-CORE decision in `STATUS_BOARD.md`). +- **Deferred / open:** written by another agent and merged with two open codex P2s; taken over and corrected in the follow-up PR: ONA links pinned to `dc4efd0` instead of `master`, and the supervisor row no longer claims restart backoff (`ISS-SUPERVISOR-RESPAWN-BACKOFF-NOT-APPLIED`). +- **Confidence:** medium; proposals grounded in code reads, two factual errors found after merge. + +## 2026-10-13 — lance-graph PR #1537 (merged `befbf1d`, branch `ccr-9f3b8075-74u47l-core-fold`, head `8091f98`, 2 commits) — D-FOLD-CORE-b: core depends on mask-risc, Quack and R2IL; `lance_graph::fold` + +- **Added:** `crates/lance-graph` depends on `lance-graph-mask-risc`, `lance-graph-quack` and `lance-graph-r2il` by default and re-exports them as `lance_graph::fold::{mask_risc, quack, r2il}`. `tests/fold_path.rs` runs a Quack query (two row ranges intersected, a value residual) and an R2IL count through core, each against a row loop. +- **Locked:** `Cmp::Range` is a row range on the ordered axis, not a value range; a condition on another column is a residual over the extent. +- **Deferred / open:** D-FOLD-CORE-c (NAL as a core module) dropped: the ONA brief keeps `lance-graph-nal` as the authoritative NAL crate. +- **Confidence:** high; disable run (dropping one row range) turns the Quack test red. + ## 2026-10-13 — lance-graph PR #1534 (merged `0a6708b`, branch `ccr-9f3b8075-74u47l-r2il-member`, head `196eb2e`, 1 commit) — D-FOLD-CORE-a: `lance-graph-r2il` joins the workspace; OGAR by git `main` - **Added:** `crates/lance-graph-r2il` moves from `exclude` to `members` and loses its own `[workspace]` and `[patch]` sections. It, `crates/lance-graph-nal` and `crates/r2il-mask-abi-probe` take `ogar-loco` / `ogar-r2il` from `https://github.com/AdaWorldAPI/OGAR` `main` instead of `../../../OGAR` paths. The root `Cargo.toml` patches `https://github.com/AdaWorldAPI/lance-graph` `lance-graph-contract` to the in-tree crate. diff --git a/.claude/board/STATUS_BOARD.md b/.claude/board/STATUS_BOARD.md index 43bf9f653..6e8c439c0 100644 --- a/.claude/board/STATUS_BOARD.md +++ b/.claude/board/STATUS_BOARD.md @@ -67,11 +67,13 @@ Plan: `.claude/plans/gremlin-composable-algebra-v1.md`. Decision (operator, 2026-10-13): the contract's only dependency becomes mask-risc and through it ndarray (the other session's step); `lance-graph` core depends on mask-risc, quack and R2IL by default; NAL moves into core as a module and keeps lowering through R2IL. The contract never depends on OGAR (`ogar-loco` depends on the contract). +> ⊘ **Superseded in part, 2026-10-13.** DECISION: the ONA assimilation brief given in the same session (2026-10-13) directs that "NAL stays the authoritative `lance-graph-nal` crate", so NAL does not move into core; it keeps lowering through R2IL as its own crate. SCOPE: the NAL half of the decision above only; mask-risc / quack / R2IL in core (D-FOLD-CORE-a/b) stand. BASIS: that brief, not the #1536 doc, which only describes the crate as the starting contract. REVISIT WHEN: a later decision moves NAL into core again. + | D-id | scope | status | gate / falsifier | |---|---|---|---| | **D-FOLD-CORE-a** | `lance-graph-r2il` becomes a workspace member; it, `lance-graph-nal` and `r2il-mask-abi-probe` take OGAR by git `main` (the `lance-graph-ogar` coordinate) instead of `../../../OGAR` paths; the root patches the contract's git URL to the member | Shipped #1534 `0a6708b` | `cargo metadata`: one `lance-graph-contract`, one `ogar-loco`, one `ogar-r2il`; tests: r2il 19, nal 8, probe 40, all green | -| **D-FOLD-CORE-b** | `crates/lance-graph` depends on mask-risc, quack and R2IL by default | In PR | core builds and tests green with the three in the default graph; `tests/fold_path.rs` runs a Quack query and an R2IL count through `lance_graph::fold` against row loops (disable run: dropping one row range turns it red, 303 vs 201) | -| **D-FOLD-CORE-c** | NAL as a module of `crates/lance-graph`; `crates/lance-graph-nal` removed; W2 tests moved unchanged | Queued | the 8 W2 tests pass unchanged in core | +| **D-FOLD-CORE-b** | `crates/lance-graph` depends on mask-risc, quack and R2IL by default | Shipped #1537 `befbf1d` | core builds and tests green with the three in the default graph; `tests/fold_path.rs` runs a Quack query and an R2IL count through `lance_graph::fold` against row loops (disable run: dropping one row range turns it red, 303 vs 201) | +| **D-FOLD-CORE-c** | NAL as a module of `crates/lance-graph`; `crates/lance-graph-nal` removed; W2 tests moved unchanged | Dropped 2026-10-13: superseded by the ONA assimilation brief's direction to keep `lance-graph-nal` as the authoritative NAL crate (see the ⊘ note under the decision above) | the 8 W2 tests pass unchanged in core | ## D-PROD-V4 — production build tiers (2026-10-13) diff --git a/docs/architecture/ONA_NAL_R2IL_FOLD_METHOD_ASSIMILATION.md b/docs/architecture/ONA_NAL_R2IL_FOLD_METHOD_ASSIMILATION.md index 182af1c23..b127f3b9d 100644 --- a/docs/architecture/ONA_NAL_R2IL_FOLD_METHOD_ASSIMILATION.md +++ b/docs/architecture/ONA_NAL_R2IL_FOLD_METHOD_ASSIMILATION.md @@ -34,19 +34,19 @@ The existing [`NalOp`](../../crates/lance-graph-nal/src/nal.rs) and R2IL procedu ## 2. ONA source mapping (what to assimilate) -**Primary upstream:** [opennars/OpenNARS-for-Applications](https://github.com/opennars/OpenNARS-for-Applications), in C under MIT license. Review and independently reimplement with source attribution; do not copy C generated dispatch tables into Rust by default. +**Primary upstream:** [opennars/OpenNARS-for-Applications](https://github.com/opennars/OpenNARS-for-Applications), in C under MIT license. Every source link below is pinned to the audited commit `dc4efd0`; `master` can change these functions. Review and independently reimplement with source attribution; do not copy C generated dispatch tables into Rust by default. | ONA authority | Relevant C functions / behaviors | Target NAL method and fold shape | Hard semantic gate | |---|---|---|---| -| [`src/Truth.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/Truth.c) | `Truth_w2c`, `c2w`, `Revision`, `Expectation` | `TruthWeight`, `Revision`: grouped evidence moment fold / typed truth result | Independent original observation roots; right evidence horizon and rounding | +| [`src/Truth.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/Truth.c) | `Truth_w2c`, `c2w`, `Revision`, `Expectation` | `TruthWeight`, `Revision`: grouped evidence moment fold / typed truth result | Independent original observation roots; right evidence horizon and rounding | | Same | `Deduction`, `Induction`, `Abduction`, `Analogy`, `Comparison`, `Resemblance`, `Conversion`, `Negation`, intersections/unions | Pure typed truth-map methods over aligned lanes or scalar oracle | Exactly named law variant and input premise orientation | | Same | `Truth_Projection`, `Eternalize`, time decay | `TemporalProjection`: typed clock-aware value-map, not a new clock | Compare source occurrence time / target time / eternal sentinel / decay parameter | -| [`src/Stamp.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/Stamp.c) | `Stamp_make`, `Stamp_checkOverlap`, `Stamp_hasDuplicate` | `IndependentEvidence` mask / `UnionRoots` witness constructor | Never revise as independent if roots overlap or cannot be proven disjoint | -| [`src/Inference.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/Inference.c) | Belief induction/intersection, event/implication revision, implication/goal deduction, revision-and-choice | `Inference::InduceTemporal` / `Derive` / `Revise`; pairing + mask + truth law + witnessed conclusion | Source and target node identities, temporality, separate witness roots, no recursive self-support | -| [`src/NAL.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/NAL.c) | `NAL_GenerateRuleTable`, premise unification, conclusion substitution/reduction | Compile declarative rule templates into **typed bound NAL methods** over existing R2IL/Quack join primitives | Grammar coverage, variable capture, term identity, multiplicity, rule applicability; refuse unknown shape | -| [`src/Cycle.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/Cycle.c) | Temporal belief event selection and inference, goal-event decomposition | Pure event selection / ranking / temporal candidate predicates; produce bounded candidate handles | No second event loop, no speculative inference promoted to observation | -| [`src/Decision.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/Decision.c) | Goal/implication desirability, best candidate, anticipation, negative confirmation, `^op` execution | `GoalCandidateScore`, `BestCandidate`, `AnticipationProbe` → **inert proposed action** | Actual effects only via existing Rubicon, RBAC, capability, freshness, receipt and feedback checks | -| [`src/Memory.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/Memory.c) and priority queue | Concept activation, forgetting, selection pressure | Prioritization/budget as planner method over canonical SoA and existing masks | No second memory database, hidden non-deterministic reordering or copied retention mechanism | +| [`src/Stamp.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/Stamp.c) | `Stamp_make`, `Stamp_checkOverlap`, `Stamp_hasDuplicate` | `IndependentEvidence` mask / `UnionRoots` witness constructor | Never revise as independent if roots overlap or cannot be proven disjoint | +| [`src/Inference.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/Inference.c) | Belief induction/intersection, event/implication revision, implication/goal deduction, revision-and-choice | `Inference::InduceTemporal` / `Derive` / `Revise`; pairing + mask + truth law + witnessed conclusion | Source and target node identities, temporality, separate witness roots, no recursive self-support | +| [`src/NAL.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/NAL.c) | `NAL_GenerateRuleTable`, premise unification, conclusion substitution/reduction | Compile declarative rule templates into **typed bound NAL methods** over existing R2IL/Quack join primitives | Grammar coverage, variable capture, term identity, multiplicity, rule applicability; refuse unknown shape | +| [`src/Cycle.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/Cycle.c) | Temporal belief event selection and inference, goal-event decomposition | Pure event selection / ranking / temporal candidate predicates; produce bounded candidate handles | No second event loop, no speculative inference promoted to observation | +| [`src/Decision.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/Decision.c) | Goal/implication desirability, best candidate, anticipation, negative confirmation, `^op` execution | `GoalCandidateScore`, `BestCandidate`, `AnticipationProbe` → **inert proposed action** | Actual effects only via existing Rubicon, RBAC, capability, freshness, receipt and feedback checks | +| [`src/Memory.c`](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/Memory.c) and priority queue | Concept activation, forgetting, selection pressure | Prioritization/budget as planner method over canonical SoA and existing masks | No second memory database, hidden non-deterministic reordering or copied retention mechanism | **Known oracle caveats, not corner-case footnotes:** @@ -143,7 +143,7 @@ Each row is a **separate coding PR** with raw engine fixtures pinned and indepen ## 7. References and decisions to preserve -- [ONA repository](https://github.com/opennars/OpenNARS-for-Applications) and [ONA truth laws](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/Truth.c), [inference](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/Inference.c), [rule generation](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/NAL.c), [decision machinery](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/Decision.c), [evidence stamps](https://github.com/opennars/OpenNARS-for-Applications/blob/master/src/Stamp.c). +- [ONA repository](https://github.com/opennars/OpenNARS-for-Applications) and [ONA truth laws](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/Truth.c), [inference](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/Inference.c), [rule generation](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/NAL.c), [decision machinery](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/Decision.c), [evidence stamps](https://github.com/opennars/OpenNARS-for-Applications/blob/dc4efd0abd520cdb79bf53bfa3c285ebb24f2e8a/src/Stamp.c). - [Existing D-NALP plan](../../.claude/plans/nal-polyfill-v1.md), [NAL implementation](../../crates/lance-graph-nal/src/nal.rs), [R2IL implementation](../../crates/lance-graph-r2il/src/lib.rs), [R2IL procedures](../../crates/lance-graph-r2il/src/procs.rs). - [Prior independent ONA/OpenNARS oracle outputs](../../.claude/knowledge/nal-recipe-audit/oracles.md); [NAL capability audit](../../.claude/knowledge/nal-recipe-audit/README.md). - [SAG method alignment](../../.claude/plans/sag-capstone-alignment-v1.md), [ONA/Hyperon wisdom frontier](../../.claude/plans/sag-wisdom-frontier-ona-hyperon-v1.md): `ProposedMethod` is inert and must not bypass canonical authorization. diff --git a/docs/architecture/OUTER_MEMBRANE_GRAPH_LAB_VERTICAL_SLICE.md b/docs/architecture/OUTER_MEMBRANE_GRAPH_LAB_VERTICAL_SLICE.md index 72bca3fd7..0c5819ad4 100644 --- a/docs/architecture/OUTER_MEMBRANE_GRAPH_LAB_VERTICAL_SLICE.md +++ b/docs/architecture/OUTER_MEMBRANE_GRAPH_LAB_VERTICAL_SLICE.md @@ -59,7 +59,8 @@ The existing [`ExternalMembrane`](../../crates/lance-graph-callcenter/src/lance_ | Capability | Current evidence | Confidence / gap | |---|---|---| -| Per-consumer actor slots, health, restart/backoff | `supervisor.rs` | Implemented skeleton; confirm runtime integration before claiming production behavior | +| Per-consumer actor slots, health | `supervisor.rs` | Implemented skeleton; confirm runtime integration before claiming production behavior | +| Restart backoff | `RespawnG` arm in `supervisor.rs` | **Not applied.** The arm schedules a delayed `RespawnG` with `crash_count: 0` and then calls `spawn_consumer_actor` immediately; the delayed message repeats both, so respawns start without waiting and keep being rescheduled every 100 ms (`ISS-SUPERVISOR-RESPAWN-BACKOFF-NOT-APPLIED`) | | Default mailbox target `1024` / per-module override | `DEFAULT_MAILBOX_CAPACITY`, `ModuleEntry.mailbox_capacity` | **Declared**, but `spawn_consumer_actor` currently calls `Actor::spawn_linked` without applying that capacity | | Normal `DispatchToG` forwarding | `supervisor.rs::handle` | **Not implemented** for non-`Health` envelopes: returns `DispatchNotImplemented` | | Inbound `DrainTask` queue | `callcenter/src/drain.rs` | **Unbounded** Tokio mpsc in realtime build, even though child mailbox backpressure is a design goal |