Skip to content

ogar-loco: data-first vocabulary tables + statement boundaries (rulings R4/R5) - #241

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

ogar-loco: data-first vocabulary tables + statement boundaries (rulings R4/R5)#241
AdaWorldAPI merged 1 commit into
mainfrom
claude/rust-scratch-abi-soa-gsamge

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

Implements the lockable subset of the ratified design rulings R1–R9 (now recorded in docs/BLOCK-EDITOR-PLAN.md), grounded per the grain-of-salt directive: no breaking change to the day-old trait — ogar-blockly compiles untouched as the non-breakage proof.

R4 — canonical const data, validated into CheckedVocabulary

  • FnSpec (stack_arity / body_refs / min_shape / pushes_result) + VocabularyTable::compose() — the composed 256-slot table, with the shared half stamped from the core, never from the vocabulary: a sibling cannot even express a divergent shared-core opinion in the table consumers read. Strictly stronger than catching drift.
  • CheckedVocabulary now stores the composed table and answers every semantic query from it — never by delegation — closing the pathological gap (a vocabulary whose methods answer differently across calls) the delegation form left open. table() exposes the data form for compilers/renderers/fuzzers/oracle schemas.
  • New pushes_result column: shared core covered (expressions push; control and BREAK/CONTINUE do not; uncovered stays None); the domain hook defaults to None = undeclared, so nothing guesses. The new column is a new drift channel and is guarded like the other two (can-fire: ADD claiming not to push is caught by name).

R5 — StepMask addresses statements, not calls

statements::statement_bounds — the derived metadata a mask dispatcher consumes (statement ordinal → [first_call, call_count]). A statement closes where stack depth returns to zero after a non-pushing call; a trailing value closes a final expression statement. Refuses uncovered calls, underflow, and dangling operands — masking a raw call out of a stack program desynchronizes every later consumer, so the maskable unit is the whole statement. This dissolves the 64-mask vs 180-call capacity mismatch. Two-sided partial-coverage test: an arity-covered-but-pushes-undeclared domain verb refuses segmentation; declaring the column makes the same body segment.

The ledger

docs/BLOCK-EDITOR-PLAN.md gains: R1–R9 as the arc's canon; the R6 proposed structured-control mints (PARALLEL/JOIN/TRY/CATCH/FINALLY — candidate bytes in the free control range, ids the operator's, none assumed); the grain-of-salt grounding for why R4's trait break was NOT taken (zero real domain authors yet — the const-table authoring surface waits for the first one); the projection-engine reframe with one precision correction (the DTO is 30 × classid(4)+payload(12) lanes carved into ≤180 calls — 256 is codebook cardinality, not array length); and the 144-atom unification staying operator-gated.

Gates

fmt / clippy -D warnings / tests (45 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

…gs R4/R5)

Implements the lockable subset of the ratified design rulings R1-R9
(recorded in docs/BLOCK-EDITOR-PLAN.md), grounded per the operator's
grain-of-salt directive: NO breaking change to the day-old trait -- the
soundness lands additively, and ogar-blockly compiles untouched as the
non-breakage proof.

R4 (canonical const data, validated into CheckedVocabulary):
- FnSpec { stack_arity, body_refs, min_shape, pushes_result } -- one
  slot's semantics as data.
- VocabularyTable::compose() -- the composed 256-slot table. The shared
  half is stamped FROM THE CORE, never from the vocabulary: a sibling
  cannot even express a divergent shared-core opinion in the table
  consumers read (strictly stronger than catching drift).
- CheckedVocabulary now STORES the composed table and answers every
  semantic query from it -- never by delegation -- closing the
  non-deterministic-vocabulary gap the delegation form left open.
- New pushes_result column: shared core covered (expressions push,
  control and BREAK/CONTINUE do not, uncovered stays None); domain hook
  defaults to None = undeclared, so nothing guesses. The new column is
  a new drift channel and is guarded like the other two (can-fire test:
  ADD claiming not to push is caught by name).

R5 (StepMask addresses statements, not calls):
- statements::statement_bounds: walk the calls simulating stack depth;
  a statement closes where depth returns to zero after a non-pushing
  call; a trailing value closes a final expression statement. Refuses
  uncovered calls, stack underflow, and dangling operands -- masking a
  raw call out of a stack program desynchronizes every later consumer,
  so the maskable unit is the statement (operand run + consumer, one
  piece). Dissolves the 64-mask/180-call capacity mismatch.
- The honest partial-coverage state is tested two-sided: an
  arity-covered-but-pushes-undeclared domain verb refuses segmentation;
  declaring the column makes the same body segment.

Also records rulings R1-R9, the R6 proposed structured-control mints
(operator's ids, none assumed), and the projection-engine reframe (with
one precision correction on the DTO layout) in the plan ledger.

Gates: fmt, clippy -D warnings, tests (45 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_49c21ab3-0546-4875-887b-dca33bea00f0)

@AdaWorldAPI
AdaWorldAPI marked this pull request as ready for review August 5, 2026 13:37
@AdaWorldAPI
AdaWorldAPI merged commit 0d39025 into main Aug 5, 2026
2 checks passed
AdaWorldAPI pushed a commit that referenced this pull request Aug 5, 2026
…atements

Recorded from the external review of #241: a future action vocabulary may
carry calls that push a result AND are complete statements with that
result discarded (connector invocations). pushes_result cannot express
that; today's refusal path protects correctness, so nothing changes now.
The candidate shapes (ResultBehavior enum / statement_terminal column)
and the silent-default trap to avoid are recorded so the pressure point
is met deliberately when the Power-Automate vocabulary arrives.
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