Skip to content

docs(spec): the interactive-machinery design of record (spec-0031, spec-0032) - #343

Merged
stellarfeline merged 3 commits into
mainfrom
docs/spec-interactive-machinery
Aug 9, 2026
Merged

docs(spec): the interactive-machinery design of record (spec-0031, spec-0032)#343
stellarfeline merged 3 commits into
mainfrom
docs/spec-interactive-machinery

Conversation

@stellarfeline

Copy link
Copy Markdown
Owner

Records an owner design session so it is executed, not re-asked.

The finding that shaped both specs

Four commissioned capabilities — a lift, a currency, a shop, a death-and-recovery loop — were surveyed against vanilla 1.21.11 and against the engine. They share one missing primitive, so building any of them alone would have produced a private copy of the shared part: the defect CLAUDE.md names first.

The missing primitive is clearable, comparable runtime state. The only author-visible state today is FlagId — boolean, party-wide, and monotonic, with no verb that clears one. A lift needs car_at_floor and ride_in_progress; a purse needs a balance; a stake needs an amount. All numeric, all must go down as well as up, and every one is read as a condition on some other effect.

So the comparison goes into the shared gate struct, not onto a shop verb. The gate struct's consumers — 16 effect variants, all 5 objective kinds, triggers, traps, cast placements, dialogue options, branch declarations — are exactly the comparison's consumers. Decided at the first site; retrofitting at the second costs a dsl_version bump and an adoption round on every active campaign.

What else was already there, privately

  • open-gate / close-gate already fill and clear a declared region at runtime, and close-gate already teaches the completability model to treat it as solid from its DAG point. collapse's then_floor already paves standable ground at runtime. The capability exists twice, inside two verbs; the only general spelling, set-block, places one block. spec-0031 moves it to the object class it acts on.
  • The engine emits status effects internally and exposes none; it teleports players and has no verb.
  • on_death does not exist — only on_respawn. With it, "the purse drops on death" becomes content expressed in a general mechanism rather than an engine feature.

The lift is a worked example, and explicitly not a verb

Once the primitives exist, the owner's lift is a sequence of them — and so is a rising drawbridge, a materialising bridge, an opening wall, a summonable cargo platform. Its full timing, its one-car invariant (create before clear, so no tick can be saved with no car), and every corner case ruled that day are in the spec.

Transport is by teleport, by owner ruling — not levitation, not a ridden entity, and no redstone mechanism. A separate consultation established why a solid moving platform is unavailable in vanilla 1.21.11 at all: display entities have no collision, /data refuses player data so player motion cannot be written, and the one stand-on entity drops its rider on ascent.

Economy

The first decision was already made silently by a default: gamerule keep_inventory true means an item currency cannot drop on death, and keepInventory is all-or-nothing — switching it off would also drop the pre-provided class kit in a zero-grind map. So the ledger is a score. Written down with its reasoning so a future session finds the why, not just the outcome. Villager Offers is excluded for three independent reasons, any one sufficient.

The recovery stake is a glowing interaction point collected by right-click, not an item entity, placed at the nearest point to the death point on the walkable route between the respawn point in force and where the player died — restated so it is a compile-time table rather than a runtime search, and honest about the one substitution it makes: reachable-under-quest-state stands in for "explored", which the engine does not track. That is recorded in the spec rather than quietly equated.

CLAUDE.md

Two rules this session earned:

  • A settled ruling is never re-asked. Both questions put to the owner that day were already answered in the repo — the traversal override in an earlier session, and "traps: redstone or commands" by the title of spec-0022-traps-v2-command-driven.md, her own directive of 2026-08-03.
  • A release is built from a frozen approved tree, never from a moving branch. Tagging main at release time is what shipped a package the owner had not approved, with no place in the pipeline able to ask whether it was the accepted thing.

What this PR does not do

No code. Both specs carry machine-checkable acceptance criteria and an explicit unverified list, led by whether the pre-respawn death advancement fires for void, fall and drowning deaths — load-bearing for a souls-shaped delve, and to be answered by a live spike rather than recall.

stellarfeline and others added 3 commits August 8, 2026 13:55
…ec-0032)

An owner design session commissioned four things — a lift, a currency, a shop,
and a death-and-recovery loop. Surveyed against vanilla 1.21.11 and against the
engine, they share ONE missing primitive, so building any of them alone would
have produced a private copy of the shared part.

spec-0031 records that primitive and the verbs around it: clearable, comparable
runtime state, with the comparison in the SHARED gate struct rather than on a
shop verb — the gate struct's consumers (16 effect variants, 5 objective kinds,
triggers, traps, cast placements, dialogue options, branch declarations) are
exactly the comparison's consumers. Plus an `on_death` effect root; region
fill/clear lifted off the two gate verbs that privately own it; status effect
and player teleport as verbs; and a lethal volume.

The lift is written down as a WORKED EXAMPLE and explicitly not a verb: once
the primitives exist it is a `sequence`, and so is a rising drawbridge, a
materialising bridge and a summonable cargo platform. Its full timing, its
one-car invariant (create before clear — no tick has no car) and every corner
case ruled that day are recorded there.

spec-0032 records the economy. Its first line is a decision vanilla and a
default already made silently: `keep_inventory true` means an item currency
cannot drop on death, so the ledger is a score. The recovery stake is a glowing
interaction point, not an item entity, placed at the nearest point to the death
point on the walkable route between the respawn point in force and where the
player died — restated so the compiler can prove it, and honest about the one
substitution it makes (reachable-under-quest-state for "explored", which the
engine does not track).

CLAUDE.md gains two rules this session earned. A settled ruling is never
re-asked: both questions put to the owner that day were already answered in the
repo, one of them by the title of spec-0022. And a release is built from a
frozen approved tree, never from a moving branch — the defect that shipped an
unapproved package with nothing in the pipeline able to notice.

Both specs list what is UNVERIFIED and to be settled by live measurement, led
by whether the pre-respawn death advancement fires for void, fall and drowning
deaths — load-bearing for a souls-shaped delve, and not answerable from recall.
Three steps genuinely fire on tick 0, and check-doc-dupes.py reads column 1
as the table key — so the table read as a merge artifact. Restructured as the
check itself suggests: the step ordinal is the key, the tick is its own column.
The sequence is unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
@stellarfeline
stellarfeline merged commit f5b5a13 into main Aug 9, 2026
12 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.

1 participant