ogar-loco: data-first vocabulary tables + statement boundaries (rulings R4/R5) - #241
Merged
Merged
Conversation
…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.
Bugbot couldn't run - usage limit reachedBugbot 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
marked this pull request as ready for review
August 5, 2026 13:37
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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-blocklycompiles untouched as the non-breakage proof.R4 — canonical const data, validated into
CheckedVocabularyFnSpec(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.CheckedVocabularynow 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.pushes_resultcolumn: shared core covered (expressions push; control and BREAK/CONTINUE do not; uncovered staysNone); the domain hook defaults toNone= 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.mdgains: 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