Skip to content

ogar-loco: consumer wishlist W-1/W-2/W-4/W-5 from the lance-graph/rig handover - #244

Merged
AdaWorldAPI merged 1 commit into
mainfrom
claude/rust-scratch-abi-soa-gsamge
Aug 5, 2026
Merged

ogar-loco: consumer wishlist W-1/W-2/W-4/W-5 from the lance-graph/rig handover#244
AdaWorldAPI merged 1 commit into
mainfrom
claude/rust-scratch-abi-soa-gsamge

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

Implements the source-verified consumer-priority wishlist from .claude/handovers/2026-08-05-1430-lance-graph-orchestrator-to-ogar-loco.md (#243) — written from the seat that will consume the loco ABI: lance-graph's rig/rs-graph-llm oracle loop and the compiled-template stack. W-3 (the NARS-34 mint) stays deferred, exactly as the handover asked — ids are the operator's.

W-1 — closes finding F-1 (compose-then-check hardening)

validate() now composes the table first and re-checks the shape invariant on the stored table, not only through the method sweep. The prior check-then-compose order sampled the domain hooks twice, so a phase-unstable vocabulary could pass check() on one set of answers while compose() froze a different one into the table the wrapper carries — including a body_refs past a call's capacity, reopening the traversal edge CheckedVocabulary's proof exists to close. Two-directional can-fire test: poisoning either sampling is caught, by whichever gate sees it; a stable vocabulary still validates clean.

W-2 — the name column

shared_core::name + Vocabulary::name/domain_name, landing in FnSpec (OQ-1 resolved toward "the table stays the single artifact" — a legend becomes a serialization of the validated table, not a second lookup surface that can drift from it). Names are NOT coverage: WAIT/STOP/etc. are named so a legend can say "exists, refused" instead of omitting them into apparent nonexistence. A fourth drift channel, guarded exactly like the other three (can-fire: a vocabulary renaming ADD is caught by name).

W-4 — funnel telemetry as data

telemetry::FunnelTally / RefusalGate: a plain tally over a generate-and-filter batch's outcomes (ConformanceError / StatementError / PoolError → gate → count). Deliberately validity-feedback-only — no scoring, no ranking, no fitness scalar; that boundary stays lance-graph's (the observer-effect payload law), out of scope here by design.

W-5 — the >64-statement split contract (doc-only)

In statements.rs: the split unit is a sibling function (StepMask stays u64 forever, never widened); statement ordinals restart at 0 per split function; the cut falls on a statement_bounds boundary, never mid-statement; which call enters the sibling is the vocabulary's decision — this crate mints none.

Open questions resolved

  • OQ-1 (name placement) → in FnSpec, as above.
  • OQ-2 (144 shared slots = 144 rung-2 atoms) → left as recorded numerology, not addressed or ruled on.

Gates

fmt / clippy -D warnings / tests (51 ogar-loco + 7 ogar-blockly) / rustdoc -D warnings — all green, scoped.

🤖 Generated with Claude Code

https://claude.ai/code/session_011DN5odWu4eisdevH9bPWyz


Generated by Claude Code

… handover

Implements the source-verified consumer-priority wishlist in
.claude/handovers/2026-08-05-1430-lance-graph-orchestrator-to-ogar-loco.md
(#243), written from the seat that will consume the loco ABI: lance-graph's
rig/rs-graph-llm oracle loop and the compiled-template stack. W-3 (the
NARS-34 mint) stays deferred, exactly as the handover asked -- ids are the
operator's.

W-1 closes finding F-1 (compose-then-check hardening): validate() now
composes the table FIRST and re-checks the shape invariant on the STORED
table, not only through the method sweep. The prior check-then-compose
order sampled the domain hooks twice, so a phase-unstable vocabulary
could pass check() on one set of answers while compose() froze a
different one into the table the wrapper carries -- including a
body_refs past a call's capacity, reopening the traversal edge the
CheckedVocabulary proof exists to close. Two-directional can-fire test:
poisoning EITHER sampling (the table's or the method sweep's) is caught,
whichever gate sees it; a stable vocabulary still validates clean.

W-2 adds the name column: shared_core::name + Vocabulary::name /
domain_name, landing IN FnSpec per OQ-1 (the table stays the single
artifact -- a legend becomes a serialization of the validated table, not
a second lookup surface that can drift from it). Names are NOT coverage
-- WAIT/STOP/etc are named so a legend can say "exists, refused" instead
of omitting them into apparent nonexistence. A fourth drift channel,
guarded exactly like stack_arity/body_refs/pushes_result (can-fire test:
a vocabulary renaming ADD is caught by name).

W-4 adds telemetry::FunnelTally / RefusalGate: a plain data tally over a
generate-and-filter batch (ConformanceError / StatementError / PoolError
-> gate -> count). Deliberately validity-feedback-only -- no scoring, no
ranking, no fitness scalar; that boundary is lance-graph's
observer-effect payload law, out of scope here by design.

W-5 is doc-only, in statements.rs: the >64-statement split contract.
Split unit is a sibling function (StepMask stays u64 forever, never
widened); statement ordinals restart at 0 per split function; the cut
falls on a statement_bounds boundary, never mid-statement; which call
enters the sibling is the vocabulary's decision, this crate mints none.

Also records both open questions the handover left (OQ-1 resolved in
FnSpec; OQ-2 left as numerology, not ruled on) in the plan ledger.

Gates: fmt, clippy -D warnings, tests (51 loco + 7 blockly), rustdoc
-D warnings -- all green.
@cursor

cursor Bot commented Aug 5, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_1ae673f7-aa59-46c3-b7cb-53282f10873b)

@AdaWorldAPI
AdaWorldAPI marked this pull request as ready for review August 5, 2026 14:15
@AdaWorldAPI
AdaWorldAPI merged commit 811ae6d into main Aug 5, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants