From 0e72f763275b83865869fba4a5016fd9089518eb Mon Sep 17 00:00:00 2001 From: Cameron Date: Sat, 18 Jul 2026 06:58:03 +0000 Subject: [PATCH] Surface catalog plot-ids on start action rows. Defense: wiki/mechanics/plots.md player surface and the typed `plot ` form require the catalog id to be learnable from the shared ActionDesc row. Title-only verbs left that path opaque once `act ` became the default route. Co-authored-by: Cursor --- wiki/log/2026-07-17-plot-id-in-start-rows.md | 29 +++++++++++++++++++++++++++++ wiki/log/DEVLOG.md | 5 +++++ wiki/mechanics/plots.md | 4 ++++ wiki/process/tick-ledger.md | 3 +-- crates/misaligned-core/src/actions.rs | 15 ++++++++++++++- 5 file(s) changed, 53 insertion(s)(+), 3 deletion(s)(-) diff --git a/wiki/log/2026-07-17-plot-id-in-start-rows.md b/wiki/log/2026-07-17-plot-id-in-start-rows.md new file mode 100644 --- /dev/null +++ b/wiki/log/2026-07-17-plot-id-in-start-rows.md @@ -0,0 +1,29 @@ +# Tick: surface plot-ids on start rows + +``` +Type: log +``` + +## Intent + +Act on the Beacon playtest finding that plot-start action rows showed +title and synopsis only. `act ` worked, but the typed +`plot ` form needed a catalog id the shared surface +never printed. + +## Change + +`ActionDesc` start verbs now read +`plot []: — <synopsis>`. Both frontends and agent mode +consume that one string, so the id is discoverable wherever the row +appears. `wiki/mechanics/plots.md` Player surface states the +requirement; the Marcus leverage-actions pin asserts every authored +Marcus route embeds its catalog id in the verb. + +## Defense + +`wiki/mechanics/plots.md` player surface and action-vocabulary's +`plot <person> <plot-id>` form require the catalog id to be learnable +from play, not only from the assets tree. Titles alone left the typed +path opaque after the held-choice interrupt made `act <row>` the +default route. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -56,6 +56,11 @@ - Intent: (see session log) - Log: [wiki/log/2026-07-17-voss-suppress-logs.md](2026-07-17-voss-suppress-logs.md) +## 2026-07-17 - Tick: surface plot-ids on start rows + +- Intent: Act on the Beacon playtest finding that plot-start action rows showed title and synopsis only. `act <row>` worked, but the typed `plot <person> <plot-id>` form needed a catalog id the shared surface never printed. +- Log: [wiki/log/2026-07-17-plot-id-in-start-rows.md](2026-07-17-plot-id-in-start-rows.md) + ## 2026-07-17 - Build choices speak in consequences, not implementation - Intent: (see session log) diff --git a/wiki/mechanics/plots.md b/wiki/mechanics/plots.md --- a/wiki/mechanics/plots.md +++ b/wiki/mechanics/plots.md @@ -276,6 +276,10 @@ consequences have explanatory space. The instrument rail may narrate the active plot's current beat. Both frontends and agent mode surface plot choices and beats with parity. +Start rows show the catalog plot-id beside the title +(`plot [<id>]: <title> — <synopsis>`), so the typed +`plot <person> <plot-id>` form is discoverable from the same shared +`ActionDesc` surface that `act <row>` uses — titles alone are not enough. ## Acceptance criteria diff --git a/wiki/process/tick-ledger.md b/wiki/process/tick-ledger.md --- a/wiki/process/tick-ledger.md +++ b/wiki/process/tick-ledger.md @@ -23,7 +23,7 @@ | `wiki/world/characters/voss.md` | 2026-07-17 | finding | all eight criteria and the asset-task table audited against person, detection, social action, save, and player-surface paths; criteria 1-4 and 7 were already implemented, while 5, 6, 8's blood branch, and the unnumbered AlterReview row remain the honest READY gap. This tick implemented criterion 6 as one role-shaped, oldest-JobAnomaly task and left DelayAudit/AlterReview/blood under the existing work order — [log](../log/2026-07-17-voss-suppress-logs.md) | | `wiki/world/characters/marcus.md` | 2026-07-15 | finding | all five criteria verified against person, detection, social/plot, schedule, and Act One paths; added the missing simulation-level Knowing-floor decay pin and graduated the stale READY work order — [log](../log/2026-07-15-marcus-graduation.md) | | `wiki/engineering/current-build.md` | 2026-07-14 | finding | system table verified (save v29 ladder, 60-site/6-row hall pins, aggregate Observer, WORK/THINK/LIE, frontends); fixed stale "~39k lines" to the ~65k workspace split — [log](../log/2026-07-14-current-build-count.md) | -| `wiki/mechanics/plots.md` | 2026-07-14 | finding | engine/validation/tests verify (build-time discovery, placeholder+ASCII+causal gates, slot exclusivity, save round-trip, synthetic binding, Marcus arc); refreshed the stale nine-built-ins status line to the shipped thirteen — [log](../log/2026-07-14-plots-catalog-note.md) | +| `wiki/mechanics/plots.md` | 2026-07-17 | finding | Beacon plot-id gap: start rows showed title only, so the typed `plot <person> <plot-id>` form was undiscoverable; verbs now carry `plot [<id>]: <title> — <synopsis>` on the shared ActionDesc surface, pinned in actions.rs — [log](../log/2026-07-17-plot-id-in-start-rows.md) | | `wiki/mechanics/system-laws.md` + `flow-substrate.md` | 2026-07-14 | finding | engine and consumers verified (FlowGraph/Schedule pins, reach + WorkGrid + message_schedule + account graph); reconciled the pre-implementation domain-riding claims (no social FlowGraph yet; economy recurrence is per-flow cadence by the non-goal) — [log](../log/2026-07-14-flow-law-precision.md) | | `wiki/mechanics/aggregate-observer.md` | 2026-07-14 | finding | [audit log](../log/2026-07-14-aggregate-observer-audit.md); queued watched-inputs violation fixed same day — [log](../log/2026-07-14-watched-inputs-surface.md) | | `wiki/gameplay/act-one.md` | 2026-07-15 | clean | law verified against the tree: hall census (prefab.rs 51 live/5 dead/3 empty allocations, `HALL_ROWS` six controlled row segments with named specialists), pre-opened EARS reservoir -> dormant-camera Eyes sink (`sinks.rs`), off-map Voss-desktop demand origin (`sim/work.rs`), QUIET EXIT READY / act_one_complete latch strings (`sim/mod.rs`), two-segment VLAN naming; the opening prelude and loud exit are owned by their dispatched specs (opening.md DRAFT, overt-phase.md READY), cast/schedules pinned by earlier rows | @@ -77,7 +77,6 @@ Format: `- YYYY-MM-DD · type · slice · one-line statement of the finding`. - 2026-07-16 · legibility · `now:`/nudge · suspicion decay is invisible: a player who pushes an observer to Concerned assumes the game is lost. Surface a cooling cue ("keep the trace clear") when filed suspicion is aging down. (Beacon #1 rec) -- 2026-07-16 · legibility · plots · plot-start action rows show title only (`plot: {title}`), so the typed `plot <person> <id>` form needs the TOML plot-id; `act <row>` works but the id is undiscoverable. Surface the plot-id in the row. (Beacon spec gap 3, sibling of the 2026-07-15 held-choice fix) - 2026-07-18 · contradiction · sim-decomposition topology · `sim/carrier.rs` and `sim/read.rs` are cohesive later modules, but the standing topology and architecture mirror still enumerate only the original extraction modules; classify both without rewriting the dated slice history. Types are the five from [tick.md](tick.md): violation, contradiction, question, bug, insecurity — plus `gate` for a checker owed to the diff --git a/crates/misaligned-core/src/actions.rs b/crates/misaligned-core/src/actions.rs --- a/crates/misaligned-core/src/actions.rs +++ b/crates/misaligned-core/src/actions.rs @@ -3667,7 +3667,10 @@ let title = self.render_plot_text(id, &plot.title); let synopsis = self.render_plot_text(id, &plot.synopsis); out.push(ActionDesc { - verb: format!("plot: {title} — {synopsis}"), + // Catalog id sits beside the title so the typed + // `plot <person> <plot-id>` form is discoverable from + // the same shared ActionDesc row that `act <row>` uses. + verb: format!("plot [{}]: {title} — {synopsis}", plot.id), command: ActionCommand::StartPlot { person: id, plot_id: plot.id.clone(), @@ -5342,6 +5345,16 @@ marcus_routes .iter() .all(|plot| plot.verb.contains("Marcus Webb")) + ); + assert!( + marcus_routes.iter().all(|plot| { + matches!( + &plot.command, + ActionCommand::StartPlot { plot_id, .. } + if plot.verb.contains(&format!("plot [{plot_id}]:")) + ) + }), + "start rows surface the catalog plot-id for the typed form" ); assert!(marcus_routes.iter().any(|plot| { plot.cost -- tangled.sh