From 81de167e6388163a73698ca1965f5888c2072ec7 Mon Sep 17 00:00:00 2001 From: Cameron Pfiffer Date: Fri, 31 Jul 2026 10:29:48 -0700 Subject: [PATCH] Keep small-switch vocabulary executable. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Document the exact route command and defend the live four-family realization boundary so the canonical action inventory cannot regress to declaration-only support. 👾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta Code --- tools/corpus_engine.py | 44 ++++++++++++++++ tools/test_corpus_engine.sh | 50 +++++++++++++++++++ wiki/interface/action-vocabulary.md | 16 +++++- wiki/interface/agent-play.md | 9 ++++ ...26-07-31-small-switch-action-vocabulary.md | 34 +++++++++++++ wiki/log/DEVLOG.md | 5 ++ wiki/process/tick-ledger.md | 2 +- 7 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 wiki/log/2026-07-31-small-switch-action-vocabulary.md diff --git a/tools/corpus_engine.py b/tools/corpus_engine.py index f86de8fd..8add8e45 100755 --- a/tools/corpus_engine.py +++ b/tools/corpus_engine.py @@ -1319,6 +1319,49 @@ class Engine: "outside the contiguous Controls table" ) + def validate_small_switch_action_vocabulary(self) -> None: + """Keep the SmallSwitch action inventory aligned with live routes.""" + path = self.root / "wiki/interface/action-vocabulary.md" + if not path.is_file(): + return + + rows = [ + line + for line in self.read(path).splitlines() + if re.match(r"^\|\s*\*\*PROPOSE SWITCH\*\*\s*\|", line) + ] + rel = path.relative_to(self.root).as_posix() + if len(rows) != 1: + self.bad( + f"{rel} must contain exactly one PROPOSE SWITCH inventory row; " + "SmallSwitch declaration and realization are live" + ) + return + + columns = [part.strip() for part in rows[0].strip().strip("|").split("|")] + if len(columns) != 4: + self.bad(f"{rel} has a malformed PROPOSE SWITCH inventory row") + return + support = " ".join(columns[3].casefold().split()) + required = ( + "live", + "four realization route families", + "ask someone", + "send a false order", + "buy new", + "use what is here", + "build-route ", + "no wire run", + ) + missing = [phrase for phrase in required if phrase not in support] + if missing: + self.bad( + f"{rel} presents stale PROPOSE SWITCH support; the row must name " + "LIVE, all four named realization route families, the exact agent " + "build-route command, and no wire run " + f"(missing: {', '.join(missing)})" + ) + def multi_binary_packages(self) -> dict[str, tuple[str, ...]]: """Derive packages with several runnable binaries from Cargo layout.""" packages: dict[str, tuple[str, ...]] = {} @@ -1432,6 +1475,7 @@ class Engine: def run_corpus(self) -> int: self.validate_explicit_multi_binary_run_commands() + self.validate_small_switch_action_vocabulary() self.validate_doorway_save_policy() self.validate_wiki_save_version_claims() self.validate_current_build_line_count() diff --git a/tools/test_corpus_engine.sh b/tools/test_corpus_engine.sh index f141cb4e..ec30bc0a 100755 --- a/tools/test_corpus_engine.sh +++ b/tools/test_corpus_engine.sh @@ -98,6 +98,52 @@ root=$tmp/clean setup_base "$root" assert_ok clean --root "$root" --all +echo "=== fixture: SmallSwitch vocabulary cannot remain declaration-only ===" +root=$tmp/small-switch-stale-vocabulary +setup_base "$root" +mkdir -p "$root/wiki/interface" +cat >> "$root/wiki/SUMMARY.md" <<'EOF' +- [Action vocabulary](interface/action-vocabulary.md) +EOF +cat > "$root/wiki/interface/action-vocabulary.md" <<'EOF' +# Action vocabulary + +``` +Type: knowledge +``` + +| Action | Target | Meaning | Support | +|---|---|---|---| +| **PROPOSE SWITCH** | Tile | Declare an inert switch footprint. | **LIVE**; declaration only, realization routes absent. | +EOF +assert_fails small-switch-stale-vocabulary --root "$root" --corpus +out=$(python3 "$engine" --root "$root" --corpus 2>&1 || true) +echo "$out" | grep -q 'presents stale PROPOSE SWITCH support' || { + echo "FAIL: stale SmallSwitch vocabulary diagnostic missing" + echo "$out" + fail=1 +} + +echo "=== fixture: SmallSwitch vocabulary names live realization boundary ===" +root=$tmp/small-switch-live-vocabulary +setup_base "$root" +mkdir -p "$root/wiki/interface" +cat >> "$root/wiki/SUMMARY.md" <<'EOF' +- [Action vocabulary](interface/action-vocabulary.md) +EOF +cat > "$root/wiki/interface/action-vocabulary.md" <<'EOF' +# Action vocabulary + +``` +Type: knowledge +``` + +| Action | Target | Meaning | Support | +|---|---|---|---| +| **PROPOSE SWITCH** | Tile | Declare an inert switch footprint, then choose a route. | **LIVE**; declaration and four realization route families: ask someone, send a false order, buy new, and use what is here; agent `build-route `; no wire run. | +EOF +assert_ok small-switch-live-vocabulary --root "$root" --corpus + echo "=== fixture: B1 horizon claims deferred spatial rollback ===" root=$tmp/b1-spatial-rollback setup_base "$root" @@ -1258,6 +1304,10 @@ Type: knowledge Operations: INTEL / PEOPLE / PERSONAS / ACCOUNTS / SCHEMES / ACTIVE. EOF done + cat >> "$root/wiki/interface/action-vocabulary.md" <<'EOF' + +| **PROPOSE SWITCH** | Tile | Declare and realize a switch footprint. | **LIVE**; declaration and four realization route families: ask someone, send a false order, buy new, and use what is here; agent `build-route `; no wire run. | +EOF } root=$tmp/operations-current diff --git a/wiki/interface/action-vocabulary.md b/wiki/interface/action-vocabulary.md index eccda10a..efab8457 100644 --- a/wiki/interface/action-vocabulary.md +++ b/wiki/interface/action-vocabulary.md @@ -4,6 +4,12 @@ Type: spec Status: IMPLEMENTED Status note: Implemented 2026-07-18 for the Intel human-vocabulary amendment. + Amended 2026-07-31: PROPOSE SWITCH remains an inert declaration, but its + small-switch intent now has all four ordinary realization route families: + ASK SOMEONE, SEND A FALSE ORDER, BUY NEW, and USE WHAT IS HERE. Unlike a + NetworkLink, a SmallSwitch has no physical wire run and rejects a run id. + Agent mode commits the exact candidate printed by `intents` with + `build-route `. Amended 2026-07-26: terminal and Bevy now share the keyboard map's renderer-neutral semantic navigation. `a` is MOVE ATTENTION left, shifted directions jump to the next earned anchor, and only `e` / Enter opens the @@ -231,7 +237,7 @@ Device state may change TAP's price and trace, never its meaning. | Canonical action | Target | Meaning | Support / owner | |---|---|---|---| | **PROPOSE LINK** | Two network devices | Pin an inert build intent between the endpoints. No world edge exists yet. | LIVE — building | -| **PROPOSE SWITCH** | One earned empty growable pad | Pin one exact inert small-switch footprint. No device, graph node, source object, payment, signature, or actuator exists yet. | LIVE declaration — building; realization routes absent | +| **PROPOSE SWITCH** | One earned empty growable pad | Pin one exact inert small-switch footprint. No device, graph node, source object, payment, signature, or actuator exists yet. | LIVE — building; four realization route families: ASK SOMEONE, SEND A FALSE ORDER, BUY NEW, and USE WHAT IS HERE; agent `build-route `; no wire run | | **CANCEL INTENT** | Pending build intent | Abandon the proposed work before completion. | LIVE — building | | **ROBOT-BUILD** | Pending build intent | Reserved for a future controlled robot actuator. | **STUB** — registry only; hidden from all player surfaces until the robot system is playable | @@ -458,6 +464,11 @@ mechanic and surfaces: install/retire job, including host, persona, mandate, allowed methods, reachable inputs, and envelope. Configuration consumes Thought on the host; retirement does not cancel already-submitted work. +15. PROPOSE SWITCH declares an inert footprint whose realization uses the same + four ordinary route families as other supported construction. Agent mode + executes the exact candidate printed by `intents` with + `build-route ` and no wire-run id; supplying a + third run argument fails closed. ### Operations routing and intel-scale delta @@ -505,3 +516,6 @@ PROCEDURE as one exact-slot control. Action, projection, save, and simulation tests prove the visible envelope, generic agent dispatch binding, Thought-backed configuration, standing slot cost, persona/host provenance, and the retire-without-cancelling-submitted-work boundary. +The corpus gate separately pins PROPOSE SWITCH as LIVE with four realization +route families and no wire run, preventing the old declaration-only status from +returning after the implemented building route composer. diff --git a/wiki/interface/agent-play.md b/wiki/interface/agent-play.md index c60cb2a8..267aa210 100644 --- a/wiki/interface/agent-play.md +++ b/wiki/interface/agent-play.md @@ -30,6 +30,10 @@ Status note: the ordinary `misaligned --agent` protocol and the issue-#15 - **Verbs.** Machine delegation and `intensity`, research, finance/economy, the canonical TAP / PROCESS / FAVOR / DECEIVE roots, multi-select (`select` + `delegate selected`), `focus last`, and `objective` inspect. + `intents` prints exact building candidates; `build-route + []` commits one. A NetworkLink requires one earned + run id, while a SmallSwitch rejects a run id and uses the same command + without that final argument. Plots and held choices ride the shared surface: `actions ` lists them and `act ` executes the flattened row, so new data-defined plots need no parser branch. Every implemented `AssetTask::ALL` value also has a @@ -278,6 +282,11 @@ unlike raw keys, no command's meaning depends on which panel is open. build through the existing willing or false-pretense social verb. A network link requires one explicit earned run id printed by `intents`; these commands never reveal map knowledge or choose a run on the player's behalf. +- `intents`, then `build-route []` — inspect + exact pending build candidates and commit one current binding. A NetworkLink + requires the explicit earned run id printed by `intents`; a SmallSwitch has + no wire run and rejects an added run id. Missing, stale, crossed, or unknown + candidate/run bindings fail instead of choosing another route. - `recruit unwitting|complicit|knowing` - `task plug|package|lookaway|suppress|switch|badge|circuit|po|maintenance|patrol|audit|review` - `persona` — retired compatibility word; redirect to PERSONAS and mutate diff --git a/wiki/log/2026-07-31-small-switch-action-vocabulary.md b/wiki/log/2026-07-31-small-switch-action-vocabulary.md new file mode 100644 index 00000000..db508c98 --- /dev/null +++ b/wiki/log/2026-07-31-small-switch-action-vocabulary.md @@ -0,0 +1,34 @@ +# 2026-07-31 — Small-switch realization enters the canonical vocabulary + +``` +Type: log +``` + +## Finding + +The runtime and building-route corpus had advanced beyond the canonical action +inventory. `PROPOSE SWITCH` was still documented as an inert declaration whose +realization routes were absent, even though current agent commands expose all four +implemented families: ask someone, send a false order, buy new, and use what is +here. The row also omitted the physical boundary: unlike player-built network +links, a small switch has no selected wire run. + +The parser was already complete. Agent mode accepts +`build-route ` for a small switch and dispatches that +exact binding through the shared route executor; an added run id is rejected. No +runtime or save behavior changed in this audit. + +## Repair + +The canonical inventory now marks `PROPOSE SWITCH` live across declaration and all +four realization families, names the shared agent command shape, and states plainly +that switch realization has no wire-run choice. The agent-play spec now includes +the same current route command without exposing human display labels as parser +syntax. + +## Defense + +Defense: `validate_small_switch_action_vocabulary()` requires the canonical +`PROPOSE SWITCH` inventory row to name the live four-family realization boundary, +the exact agent command, and the absence of wire-run selection. Paired corpus +fixtures reject the former declaration-only status and accept the current contract. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 8c244251..dc493a91 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -16,6 +16,11 @@ add or amend a session log, then re-run the generator. - Intent: (see session log) - Log: [wiki/log/2026-07-31-standing-network-lie-scrub-teaching.md](2026-07-31-standing-network-lie-scrub-teaching.md) +## 2026-07-31 - Small-switch realization enters the canonical vocabulary + +- Intent: (see session log) +- Log: [wiki/log/2026-07-31-small-switch-action-vocabulary.md](2026-07-31-small-switch-action-vocabulary.md) + ## 2026-07-31 - Physical route candidates make a link a built wire - Intent: (see session log) diff --git a/wiki/process/tick-ledger.md b/wiki/process/tick-ledger.md index 3b8105f1..eed7d4cb 100644 --- a/wiki/process/tick-ledger.md +++ b/wiki/process/tick-ledger.md @@ -32,7 +32,7 @@ Verdicts: **clean** (slice and code agree), **finding** (acted this tick), | `wiki/world/places/basement-map.md` room topology | 2026-07-27 | finding | the queued five non-hall corridor cuts remained, and an executable all-room perimeter audit exposed the same dead-door shape at the loading-dock entry plus fixed objects blocking the interior faces of the roll door, HVAC door, both storage doors, Janitor door, and stairwell. Every non-hall approach now reaches its authored door from outside the prefab, every other perimeter tile remains closed, doorway interiors are clear, and the roll, sealed, tier-2, and tier-3 boundaries retain their exact kinds — [room-approach log](../log/2026-07-27-room-approaches-meet-doors.md). Prior [west-approach](../log/2026-07-26-west-hall-approach.md) and [hall-density](../log/2026-07-26-foundation-hall-density.md) repairs stand. | | `wiki/mechanics/sensor-network.md` generated sensor population / criteria 1-5, 8 | 2026-07-28 | finding | criterion 8's standing subscription cost existed only in the global Thought-sink ledger, so a player choosing which individual camera to keep could not read that camera's exact burden. Every retained foreign subscription now names its exact `Thought/tick` upkeep and live/starved state on the device's shared inspect card, within both frontends' visible fact budget; UNTAP removes that addressed cost. The integrated several-subscription starvation/inbox-overflow experience remains pending, so criterion 8 is partial rather than overclaimed — [standing-upkeep log](../log/2026-07-28-subscription-upkeep-inspect.md). Prior generated-camera placement and badge-passage findings stand — [placement repair](../log/2026-07-27-room-camera-floor-placement.md), [passage implementation](../log/2026-07-27-badge-reader-passage-custody.md), [population foundation](../log/2026-07-27-sensor-population-foundation.md). | | `wiki/interface/keymap.md` + terminal/Bevy input routes | 2026-07-26 | finding | the canonical table assigned `A` to left movement and only `e` / Enter to the context menu, but terminal still opened and closed menus with its older `a` alias and lacked the specified Shift+direction semantic jump. Terminal now implements WASD parity, `a` means left, `e` / Enter alone open the menu, and both frontends consume one renderer-neutral nearest-earned-anchor query without changing selection or opening a menu. README, action-vocabulary, terminal, context-menu, and pinned terminal hints now teach the same boundary — [log](../log/2026-07-26-terminal-keymap-a-reconciliation.md) | -| `wiki/interface/action-vocabulary.md` + `ActionKind` registry | 2026-07-26 | finding | the exhaustive runtime registry and shared person/ACTIVE projections implemented `ActionKind::PlotPolicy`, but the canonical inventory omitted that live direct control. PLOT POLICY now names exact authored-route authorization, its generic `actions person ` / `act` route, and its disable-without-cancelling-submitted-work boundary; old Review/OpenEgress command variants remain correctly internal compatibility shapes rather than authored vocabulary — [log](../log/2026-07-26-action-vocabulary-plot-policy.md) | +| `wiki/interface/action-vocabulary.md` + agent command registry | 2026-07-31 | finding | `PROPOSE SWITCH` still described declaration-only R2a after all four realization families and their exact agent route command had landed. The canonical inventory and agent-play spec now name current execution plus the honest remaining boundary—small-switch realization has no wire-run choice—and a paired corpus defense rejects regression to the stale support claim — [log](../log/2026-07-31-small-switch-action-vocabulary.md). Prior PLOT POLICY inventory repair stands — [log](../log/2026-07-26-action-vocabulary-plot-policy.md). | | `wiki/world/places/zplanes.md` + plane-stack substrate/API | 2026-07-26 | finding | criteria 1-2 remain implemented and criteria 3-6 honestly deferred, but the ratified plane-agnostic contract still left an unused `World::active()` simulation accessor plus active-plane comments on the B1 compatibility map path. The accessor is removed, map reads now say plane 0, the stale criterion/sensing comments are corrected, and a source-shape regression rejects restoration of simulation-owned floor selection — [log](../log/2026-07-26-zplanes-plane-agnostic-api-audit.md) | | `wiki/mechanics/markets.md` + `income.md` B1 contract/account/evidence mirror | 2026-07-26 | finding | the deferred B3 criteria and their current B1 mirror still allowed the operation shape to collapse into payout plus signature, bypassing or obscuring exact AccountGraph, financial-mail, carrier, and routed-evidence custody. Markets now aggregate immutable B1 contract/position records through the same causal chain; current runtime is unchanged — [log](../log/2026-07-26-markets-contract-custody-reconciliation.md) | | `wiki/art/effects-lab.md` + corpus navigation | 2026-07-26 | finding | the owning spec, shared renderer, game adapter, and runtime title all describe the current Thought-only route/pool harness, but `SUMMARY.md` still advertised the retired “dust and liquid” scope. Navigation now names Thought routes and pools, and the recurring retired-form gate rejects particulate/dust labels on links to `effects-lab.md` as well as prose that names the binary — [log](../log/2026-07-26-effects-lab-navigation-gate.md) | -- 2.51.2