Skip to content

ogar-vocab: reserve 0x17XX as ConceptDomain::Blocks - #234

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

ogar-vocab: reserve 0x17XX as ConceptDomain::Blocks#234
AdaWorldAPI merged 1 commit into
mainfrom
claude/rust-scratch-abi-soa-gsamge

Conversation

@AdaWorldAPI

@AdaWorldAPI AdaWorldAPI commented Aug 4, 2026

Copy link
Copy Markdown
Owner

Reserves the visual block-programming opcode domain at the operator-chosen slot 0x17XX, as the vocabulary foundation for the block-editor arc (blockly-rs + scratch-rs).

What lands

Zero concept rows. This is a domain reservation, not a mint — the same reserved-empty posture as Osint (0x07XX) and Genetics (0x0EXX): the slot exists so canonical_concept_domain returns a stable tag before any opcode concept is promoted.

  • ConceptDomain::Blocks variant
  • canonical_concept_domain0x17 arm
  • CODEBOOK doc table updated

Two fences, carried in the variant doc

1 — Naming. The domain names the shared opcode concept, never a renderer. Per D-CLASSID-CANON-HIGH-FLIP the canon hi u16 carries the shared concept and each consumer selects its own render skin in the custom lo u16 — so blockly-rs (editor/ABI half) and scratch-rs (opcode + .sb3 + JIT half) are two app prefixes over one vocabulary. A block's behaviour stays a property of the Core node the classid resolves to (ActionDef + KausalSpec), never of the address.

2 — Provenance. Concepts minted here must derive from permissively-licensed or specification sources (the Apache-2.0 Blockly block definitions; the public project file-format spec) — never by transcribing a GPL/AGPL implementation. This keeps the public codebook unencumbered while a GPL consumer links it freely, and is what allows the GPL boundary to sit entirely inside the consumer repo rather than propagating here.

The 0x10–0x16 gap is deliberate

0x17 is an operator-chosen slot, not the next free one. A pinned test asserts 0x1000 / 0x1600 / 0x1800 stay Unassigned, so a later pass cannot "tidy" the domain downward — ids are stable forever once shipped.

Stale-doc corrections found while verifying the slot was free

Both are in the same commit because both were discovered by the check that 0x17XX was actually available:

  • The CODEBOOK doc table said 0x0FXX+ unassigned, but 0x0FXX Geo is fully populated — 10 OSM concepts, osm_node 0x0F01osm_user 0x0F0A. The ConceptDomain enum doc was already correct; only the ASCII table had drifted.
  • A domain test comment said "trailing unassigned tail (0x0F+)". The assertion (0xFFFF) was still correct; the comment was not.

Ledger

docs/DISCOVERY-MAP.mdD-BLOCKS-DOMAIN (append-only, [G] CODED).

Gates

The central risk in adding an enum variant is an exhaustive match on it elsewhere in the workspace, so this was checked explicitly rather than left to CI:

  • No exhaustive match on ConceptDomain exists anywhere in crates/ — the only match in that neighbourhood is on &str and already carries a _ arm. Other crates (ogar-cpic) use the type in equality comparisons only.
  • cargo check --workspace --all-targets — exit 0. The two warnings emitted are pre-existing and in untouched files (ogar-from-ruff/examples/compile_corpus.rs, ogar-from-elixir/src/lib.rs).
  • cargo test --workspace — 0 failures across all crates.
  • cargo test -p ogar-vocab — 141 unit + 7 doctests, 0 failed.
  • cargo fmt -p ogar-vocab -- --check — clean.
  • cargo clippy -p ogar-vocab --all-targets — clean, no warnings.

Note for anyone diffing test counts: ogar-vocab reports 141 under -p … --lib and 142 under --workspace. That gap is pre-existing workspace feature unification enabling one cfg-gated test — verified identical at HEAD~1. This PR adds no test functions, only assertions inside existing ones.

Follow-up (not in this PR)

App-prefix allocation in ports.rs for blockly-rs and scratch-rs, then the opcode concept mints themselves once the vocabulary is harvested from the Apache-2.0 Blockly block definitions.

Reserves the visual block-programming opcode domain at the
operator-chosen slot 0x17XX. Zero concept rows -- the same
reserved-empty posture as Osint (0x07XX) and Genetics (0x0EXX):
the domain slot exists so canonical_concept_domain returns a
stable tag before any opcode mints.

The domain names the shared opcode CONCEPT, not a renderer. Per
the canon-high flip, the hi u16 carries that shared concept and
each consumer picks its own render skin in the custom lo u16, so
blockly-rs (editor/ABI half) and scratch-rs (opcode + .sb3 + JIT
half) are two app prefixes over one vocabulary. Behaviour stays a
property of the Core node the classid resolves to, never of the
address.

A provenance fence is carried in the variant doc: concepts minted
here must derive from permissively-licensed or specification
sources -- the Apache-2.0 Blockly block definitions, the public
project file-format spec -- never by transcribing a GPL/AGPL
implementation. That keeps this public codebook unencumbered while
a GPL consumer links it freely, which is what allows the GPL
boundary to sit entirely inside the consumer repo.

The 0x10-0x16 gap is deliberate rather than next-free, so a test
pins those slots as Unassigned to stop a later pass tidying the
domain downward.

Also corrects two stale doc lines found while verifying the slot
was free: the CODEBOOK table claimed "0x0FXX+ unassigned" while
0x0FXX Geo is fully populated (osm_node 0x0F01 .. osm_user
0x0F0A), and a domain test comment said "trailing unassigned tail
(0x0F+)".

Ledger: docs/DISCOVERY-MAP.md D-BLOCKS-DOMAIN.

Gates: 141 unit + 7 doctests pass, fmt clean, clippy clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011DN5odWu4eisdevH9bPWyz
@cursor

cursor Bot commented Aug 4, 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_c6ef8149-807d-4a9a-977e-df270e55eea4)

@AdaWorldAPI
AdaWorldAPI marked this pull request as ready for review August 4, 2026 13:57
@AdaWorldAPI
AdaWorldAPI merged commit d12b891 into main Aug 4, 2026
2 checks passed
AdaWorldAPI pushed a commit that referenced this pull request Aug 4, 2026
Docs-only. Turns the session's rulings into a durable plan and
records the a2ui-rs wiring as a ledger entry.

docs/BLOCK-EDITOR-PLAN.md sequences W0-W5 with gates, five open
decisions, and five falsifiers. It opens by naming what is LOCKED
so a future session cannot re-derive it: the 0x17XX domain, the
plug-and-play producer posture, the provenance fence, one content
classid, (function:value) calls, arity-by-classid via LaneShape,
nesting by reference, loud narrowing, literal-over-grammar, and the
retired edge block. Every one is shipped code with tests (#234,
#235, #236), not intention.

The headline finding for the a2ui wiring is that most of it already
exists. Charter C1.6 says a click IS a navigates_to/ActionInvocation
edge, and a2ui-server already ships receive_action -> KlickwegEdge
-> lower_action_fire -> ActionInvocation as pure compile-time value
construction (#209, warden COMPILE-TIME-CLEAN, 34 tests). Placing a
block, connecting two blocks and clicking a placed block are each a
click by ordinal address, so each is already a Klickweg edge. Edit
telemetry and harvested-app telemetry unify in one closed predicate
set with NO new predicate -- the Predicate enum is count-locked at
79 and extending it is a gated ontology change, not a consequence of
this arc.

Nesting maps 1:1: the ObjectSlot "A3 Klickwege brick" recursion
desktop -> window -> region -> widget becomes canvas -> script ->
block -> input, which a2ui-wasm::resolve_nested walks unchanged.

The gaps are recorded as measured, not assumed. Interaction-to-edge
and nested addressing exist. A palette of pickables, 2-D placement
(Skin::Form and Skin::Flow are both 1-D list renderers) and
multi-facet body ingest (a2ui-wasm implements one 12-byte facet; a
body is thirty) are absent -- none charter-forbidden, but the editor
tier is a real build rather than wiring. Drag/connect is the one T2
pressure point: local drag state is fine, the result must travel as
an address-carried write.

Open decision D2 proposes that "place tile at slot N" rides
ActionInvoke{ordinal: PLACE, args:[N, fn]} rather than a third
FrameKind: args is explicitly ClassView/ActionDef-carved, so it is
an address-carried write, and a third kind would widen a
deliberately closed vocabulary.

Roadmap order is operator-set: ABI-shaped Blockly/Scratch first,
Klickwege wiring second, PowerAutomate-shaped skin third -- both
skins Mario-editor ergonomics over ClassView : WideFieldMask, which
is T1 applied at editor scale. The W1 falsifier is unchanged from
the first turn of the arc: a drag produces zero SoA writes, an
operand change exactly one.

Ledger: docs/DISCOVERY-MAP.md D-BLOCKS-KLICKWEGE, graded [H] (PLAN)
-- the W0 substrate it builds on is [G]/CODED, the wiring is unbuilt.

Gates: docs-only; 16 ogar-blockly tests and workspace check
re-verified unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011DN5odWu4eisdevH9bPWyz
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