Correct convention skill with post-con table truth: apps went unused; concision + single-surface + invest in the GM help tool

This commit is contained in:
2026-07-27 09:27:18 +01:00
parent 79a7ae0605
commit 4d6da98c5a
24 changed files with 51 additions and 1370 deletions
+1 -1
View File
@@ -32,7 +32,7 @@ Discard:
- Auth: ChatGPT login, creds in `~/.codex/auth.json`. Only run `codex login --device-auth` (SSH-friendly) if `codex login status` says you are logged out — a valid `auth.json` may already exist even when the binary is missing.
- Config: `~/.codex/config.toml` plus `<name>.config.toml` per profile, generated by the `codex-ops-kit` repo (`~/codex-ops-kit`, `slaguru666/codex-ops-kit`) — edit the templates there, not the live files, or the next install overwrites them. Profiles: `codex --profile economy|balanced|deep`; plain `codex` uses balanced defaults.
- Use via the `codex@openai-codex` plugin (`/codex:*` commands) or directly: `codex exec "<prompt>"` (add `--skip-git-repo-check` outside a git repo).
- The user runs Claude Code on multiple machines: `timevans-MINI-S` (Linux, Zorin OS 18.1; static LAN IP `192.168.1.6`, key-only SSH — see the `infra-minis-remote-access` memory), a Mac Mini (`tims-mac-mini-local`), and `tim-ThinkPad-X1-NanoTS` (Lenovo ThinkPad X1 Nano laptop, Linux Mint 22 "Wilma" XFCE on Ubuntu 24.04 base, x86_64; package managers apt/flatpak/brew — note `/usr/local/bin/apt` is a wrapper shadowing the real `/usr/bin/apt`). Check the hostname to know which one you're on.
- The user runs Claude Code on multiple machines: `timevans-MINI-S` (Linux, Zorin OS 18.1; static LAN IP `192.168.1.6`, key-only SSH — see the `infra-minis-remote-access` memory) and a Mac Mini (`tims-mac-mini-local`). Check the hostname to know which one you're on.
- The user adds `$HOME/bin` to PATH in `.bashrc`.
## Memory Protocol
-9
View File
@@ -2,19 +2,10 @@
- [Midjourney bridge](midjourney_bridge.md) — `mj-gen "<prompt>"` drops a PNG on disk; full pipeline via Discord, no MJ API needed.
- [GitHub account](user_github.md) — username: slaguru666; 19 repos, mostly SLA Industries Foundry VTT modules.
- [The Director (gmtool)](gmtool-director.md) — offline convention GM tablet PWA; Slices 1–5 done, all six Continuum 2026 slots ported + scheduled.
- [Semaphore Gitea URL](feedback_semaphore_gitea_url.md) — use `http://gitea:3000/tevans/<repo>.git` inside Semaphore, not the external Cloudflare URL
- [Canvas OSS course](canvas_oss_course.md) — Canvas test server canvas.timevans.uk + `~/gema-oss-canvas-course/` idempotent course-builder (pin account id 1).
- [Mapwright module](mapwright-module.md) — new standalone Foundry v13 battle-map generator at `~/FoundryVTT/Data/modules/mapwright/`; procedural-vector, buildings-first, one-geometry-model design.
- [Blueprint News](blueprint-news.md) — engine-agnostic SLA BPN briefing generator at `~/blueprint-news/`; reusable component + standalone app, seeded procedural SVG art, Player/GM split, NPC seam for a separate module.
- [clipsync](clipsync.md) — CouchDB-backed clipboard history for the Macs; `clipsync-setup` to install, `clip` to browse.
- [AFTERIMAGE scenario](afterimage-scenario.md) — 4-player Blade Runner game for Continuum 2026, Fri 24 July, Slot 2; repo slaguru666/Continuum2026; convention-ready.
- [Princes Bride scenario](princes-bride-scenario.md) — Dee Sanction game for Continuum 2026, Sun 26 July, Slot 7; reconciled canon + real rules (ignore old quick-ref); convention-ready.
- Continuum 2026 slate complete in slaguru666/Continuum2026: Day One (Fri S1), AFTERIMAGE (Fri S2), Vain Crown (Sat S4), Another Fine Mess — Pulp Cthulhu chopper sequel (Sun S6), Princes Bride (Sun S7).
- [Plugin sync](project_plugin_sync.md) — keep Claude Code plugins identical across all servers via the claude-config repo (settings.json enabledPlugins); run sync.sh after install/remove
- [MINI-S remote access](infra_minis_remote_access.md) — timevans-MINI-S: static 192.168.1.6, key-only SSH + fail2ban, Zyxel DX3301-T0 port-forward 2222->22 (Voneus)
- [MINI-S Docker stacks](infra_minis_docker_stacks.md) — homelab (Portainer/Gitea/Obsidian/Stirling-PDF/Nextcloud) + Seafile cloud drive; ports, data paths, secrets locations
- [MINI-S browser automation](infra_minis_browser_automation.md) — Playwright MCP (headless Chromium) lets Claude view/control web pages on the LAN incl. the Zyxel router; restart Claude after adding to load tools
- [Local LLM agent stack](local-llm-agent-stack.md) — Hermes Agent + Ollama + Gemma 4 12B on the user's Mac; install gotchas (64K ctx, uv-managed Python 3.11)
- [NotebookLM CLI setup](notebooklm-cli-setup.md) — notebooklm-py on the Mac; pin --python 3.12 (else silent 0.1.1 downgrade), browser login, launchd auth-refresh keepalive
- [RPG skill](rpg-skill.md) — house scenario-writing skill at ~/.claude/skills/rpg, shared via claude-config; pull+install before sync, sync.sh after RPG work.
-21
View File
@@ -1,21 +0,0 @@
---
name: afterimage-scenario
description: AFTERIMAGE — 4-player Blade Runner scenario for CONTINUUM 2026, Friday 24 July, Slot 2 (20:00–00:00); repo slaguru666/Continuum2026 (private)
metadata:
node_type: memory
type: project
originSessionId: 445b61b6-6e68-4f8e-8caa-28bf213400e9
modified: 2026-07-19T10:56:54.351Z
---
AFTERIMAGE is the Blade Runner RPG scenario for **Continuum 2026** (continuumconvention.co.uk, Cranfield), **Friday 24 July 2026, Slot 2 = 20:00–00:00**, 4 players. *(Corrected 2026-07-19: it was originally mis-filed under Contingency 2026 Wed Slot 3 — the old repo `Contingency26` is now a pointer stub.)* Chamber-noir: memory designer Elias Kade dead; three replicant copies of his estranged daughter Aris; the real Aris may or may not have killed him — ambiguity is by design and must not be resolved by dice. Foot chase in Act Two (night market); duplicated key-memory monologue handout (print F2-H02-A twice) is the core reveal.
Locations: private GitHub repo `slaguru666/Continuum2026` (full history); local copy at `.../RPGS/Conventions/Continuum 2026/01 Friday/Slot 2 Evening Blade Runner/AFTERIMAGE/`. Asset IDs are `F2-*`; scenario file is `scenarios/fri-slot2-blade-runner-afterimage.md`.
Also in the repo: **REP-DETECT GM Console** (`gm-utility/index.html`) — Tim's touch-screen Blade Runner GM app; offline single-file HTML, localStorage per module + JSON export, animated idle screen (film-style Spinner + live rain), scenario modules via `BRGM.registerModule()` in `gm-utility/modules/` (AFTERIMAGE included). To add a scenario: new module JS + a script tag in index.html.
Status (v2.3+, convention-ready): three desk playtests (GM chair, Act Two stress, player chair), three endings, all inside 3:30; art complete (F2-ART-01..06 + app art); PDFs exported with Continuum branding; only physical prep remains (print sheets/handouts — monologue card ×2 — and Tim's read-through). Cosmetic playtest findings 6–9 still open.
Continuity anchors (Tim-requested audit; he's had date/name errors in past scenario work — always audit these): Aris b. 1998, pier memory 2007 (age 9), adult (33) at the 2031 callout, off-grid 2031 (= six years in 2037); Kade at Tyrell 2009–2022, gap, Wallace 2028–2031; death Wed 23:40, found Fri 10:15 (~35 hrs); **Sloane is a Nexus-9, serial SN9-1.11, 12 months** (not N8); Kael's examiner is Dr. Imani Okafor; Sloane's bakery is Castellano & Sons.
Portrait art mapping (art also copied into the repo): true portraits are `Rick.png`, `JAX copy ZOOM.png`, `KAEL copy.png`, `SLONE Zoom.png`; the `* Trans` PNGs are sheet scans, not portraits. Related: [[mapwright-module]], [[user_github]].
-54
View File
@@ -1,54 +0,0 @@
---
name: blueprint-news
description: Engine-agnostic SLA BPN briefing generator at ~/blueprint-news/ (component + standalone app)
metadata:
node_type: memory
type: project
originSessionId: 5042e85b-5232-4f59-bf1d-92d635c764de
---
"Blueprint News" — a new **engine-agnostic** SLA Industries BPN (Blue Print News)
mission-briefing generator at `~/blueprint-news/`. Rebuild of the earlier
Foundry-bound experiments with every engine call stripped out.
Shape: a framework-free ES-module **component** + a standalone web **app** built on it.
- `core/` — `generateBPN({seed,colourKey,frameId,squadSize,overrides})`, deterministic; `data/` colours, frames, tables.
- `art/bpn-art.js` — seeded procedural SVG (`crestSVG`, `bannerSVG`): flat stencil/propaganda SLA style, never photorealistic. Seed drives the art.
- `render/` — `briefHTML()` (Player Brief) + `dossierHTML()` (GM Dossier), scoped under `.bpn`; responsive + print CSS.
- `assets/fonts/` — bundled local Josefin Sans + Roboto Mono + Modesto Condensed.
- `app/` + `index.html` — generator UI: Player/GM/Both, library (localStorage), Print, Export HTML.
Two **separate surfaces** per briefing: Player Brief (official dispatch) vs GM Dossier
(twist, withheld fact, true threat read, levers, dice state).
NPC/monster generation is a **separate future module** — each briefing exposes
`bpn.npcSeam {contactArchetype, threatArchetype, threatRole}` as the hand-off seam.
Per-band art: `art/bpn-art.js` `SCENES` map drives distinct foreground motifs
(tunnel/transit/wall/cordon/gantry/stage/canal/tower/vault/exec) + atmosphere/lighting;
`portraitSVG()` gives a halftone non-photorealistic contact ident in the Player Brief.
Published PUBLIC at https://github.com/slaguru666/blueprint-news (default branch `master`).
GitHub **MCP is not authenticated** here — use the `gh` CLI (logged in as slaguru666) for pushes.
**Zero Engine variant**: separate module **Blueprint News 0 Engine** (id `sla-blueprint-news-zero`)
at `~/FoundryVTT/Data/modules/sla-blueprint-news-zero/`, repo https://github.com/slaguru666/sla-blueprint-news-zero (v0.5.0).
Superset of the base module that, in a `zero-engine` world, also spawns real Zero Engine `npc`
actors on Create — a threat group (leader + mooks: gangs/Carrien/corpsec/Stormer/black-ops) + cast —
with attributes, HP, armour, damage, threat and embedded weapons, replicating the system's own NPC
Creator (`SLA_NPC_TYPES`/`_slaWeaponData` in systems/zero-engine). Logic in `module/zero-adapter.mjs`.
De-collided (global `game.slaBlueprintNewsZero`) so it coexists with the base module. Original
module backed up to `sla-blueprint-news-backup-20260617-185229.tar.gz`. Not load-tested in Foundry yet.
**Foundry module** (the installable deliverable): `sla-blueprint-news` at
`~/FoundryVTT/Data/modules/sla-blueprint-news/`, ApplicationV2 generator (idiom from
mapwright), vendors the component under `module/vendor/`, writes one JournalEntry with a
player **Mission Brief** page (Observer) + GM-only **Dossier** page (None). Uses render
`artMode:"img"` so Foundry doesn't strip inline SVG. Published at
https://github.com/slaguru666/sla-blueprint-news (release v0.1.0); remote install manifest:
`https://raw.githubusercontent.com/slaguru666/sla-blueprint-news/main/module.json`.
Not yet load-tested in a running Foundry world.
Source aesthetic/palette/fonts come from `~/FoundryVTT/Data/systems/sla-industries-brp`.
Run with any static server (ES modules need HTTP); `.claude/launch.json` serves it on :8778.
Related: [[mapwright-module]].
-22
View File
@@ -1,22 +0,0 @@
---
name: canvas-oss-course
description: Canvas LMS test server details + the idempotent course-builder tool for the Omnissa Sovereign Solution training
metadata:
node_type: memory
type: project
originSessionId: 2eafb1c4-b851-441d-b039-2189d5d33699
---
Canvas LMS test server under evaluation: `https://canvas.timevans.uk` (web admin `admin@timevans.uk`; host SSH `tevans@77.68.99.134`; Canvas runs as a container).
Built a repeatable, idempotent Canvas-REST-API course builder at `~/gema-oss-canvas-course/`:
- `build_course.py` (CLI: `--check`, `--verify`, `--fresh`), `course_content.py` (curriculum as data), `README.md`.
- Config in `config.env` (git-ignored): `CANVAS_BASE_URL`, `CANVAS_API_TOKEN`, `CANVAS_ACCOUNT_ID`.
Course built = id **4**: "Implementing the Omnissa Sovereign Solution - Engineer Onboarding" (OSS-ENG-101). 11 modules / 41 items (21 pages, 9 classic quizzes/37 questions, 7 labs + capstone, 4 discussions).
**Gotchas:** admin is a Site Admin, so `/accounts` lists "Site Admin" (id 2) first — pin `CANVAS_ACCOUNT_ID=1` ("Tim Evans Canvas", the real institution root; sub-account 3 = "Manually-created courses"). Classic quizzes must be created unpublished → add questions → publish. **File upload is broken on this server** — `/files_api` returns 500 — and the HTML sanitizer strips data-URI images, but it KEEPS inline CSS incl. `linear-gradient` (drops `letter-spacing`). So visual styling = CSS gradient hero banners + callout panels rendered inline, not uploaded images (`art_gen.py` PNGs remain for if upload is ever fixed). `--fresh` deletes+recreates so course id increments each rebuild; latest is **course id 6** (default_view=syllabus).
Subject ties to the [[gema-training-ideas]] project: Omnissa Sovereign Solution = Workspace ONE UEM delivered with GEMA as regional hosting/support partner, with BYOK + Desired State Management as sovereignty controls.
**Security:** the access token used was shared in chat — rotate it in Canvas after evaluation.
-30
View File
@@ -1,30 +0,0 @@
---
name: clipsync
description: "CouchDB-backed clipboard history for the user's Macs — daemon, picker, setup."
metadata:
node_type: memory
type: project
originSessionId: 3c4e91f6-6e5f-4674-b5e0-413eb9e499ff
---
`clipsync` syncs macOS clipboard history into a remote CouchDB so it's shared across Macs.
- Obsidian vault files (2026-06-21): import now includes non-`.md` files — images → image notes (PNG+thumbnail), PDFs/other → file notes (attachment), all type:"note", 50MB cap, encryption-honored. App `NoteImport.obsidianDocs`+`Store.importObsidianVault`; CLI parity. (Earlier obsidian import was .md-only.) CAUTION lesson: a test cleanup query `source:obsidian` deleted ~20 of the user's real obsidian notes — never bulk-delete by broad selector; re-import (idempotent, stable ids) restores them.
- Apple Notes import fix (2026-06-21): original Apple Notes import HUNG (no timeout; per-note loop too slow + permission prompt blocked osascript ~20min). Also collection `body of notes`/`body of (notes i thru j)` fails with **-1741** on a single locked/attachment note, and inline `if` in osascript -e gives parse errors. Working approach: fetch **names in bulk** (`(name of notes) as text`, ~0.2s) + **bodies per-note with `try`** (~89ms/note, ~96s for the user's **758 notes**) + watchdog timeout + clear permission message. Fixed in app `Import.swift` (`NoteImport.appleNotes` + `run()` helper) and the `macmem-import` CLI. Imported all 758 of the user's Apple Notes into CouchDB (type:note). Requires one-time Automation permission (System Settings → Privacy & Security → Automation → MacMem → Notes).
- Note import (2026-06-21): `bin/macmem-import` (uv CLI) imports Obsidian (vault `.md`, folders→tags), Evernote (`.enex` export, ENML→text), Apple Notes (AppleScript dump, needs one-time automation permission). Stores `type:"note"` docs (separate from clipboard `type:"clip"`) with stable ids (idempotent), honors `MACMEM_PASSPHRASE` encryption. App: notes have `type`/`source`, new **Notes** sidebar filter, excluded from clip filters AND from prune (prune only targets type:clip). MCP: `list_notes`/`search_notes` tools + `source` in summaries. Verified Obsidian+Evernote + MCP note tools end-to-end.
- Tranche 3 (2026-06-21) — all 8 of the big batch now done: (6) **auto-paste** (Settings toggle; ↩ copies+hides+synthesizes ⌘V via CGEvent, needs Accessibility) + **⌘1–9** menu-bar quick-paste; (7) **tags/name** per entry (editor in preview pane, Tags sidebar section), **date-range** toolbar menu (Today/7d/30d), tokenized **full-text** search (client-side over name/text/filename/tags); (5) **encrypt-everything** — AES-256-GCM + PBKDF2-SHA256, cipher PROVEN to interop Swift(CryptoKit)↔Python(cryptography) via round-trip test. New clips (text→`enc`, image thumb+`full.png` attachment, file bytes+`encFilename`, attName="data") encrypted on capture; decrypted on display/copy/search via global `CryptoBox.key`. Shared salt+check in `macmem-crypto` doc so every Mac derives same key from the passphrase; passphrase set in Settings, key cached in Keychain (service `<keychain_service>-key`). Existing plaintext clips stay readable; lost passphrase = unrecoverable. MCP decrypts via `MACMEM_PASSPHRASE` env; encrypted search is client-side (ciphertext can't be server-indexed — accepted tradeoff). Files: `app/Sources/MacMem/{Crypto,Paste}.swift`. Verified encryption end-to-end via MCP (with/without passphrase). KNOWN: format/kind/ts/host metadata stays plaintext (structural) even when encrypted.
- Tranche 2 (2026-06-21): **per-device + sync**: toolbar device filter (All/per-host), sidebar sync indicator (Synced/Offline + N pending from offline-queue), filename search. **Signing**: `build-app.sh` now signs with a stable identity (Developer ID > Apple Development > ad-hoc) → no more per-rebuild Keychain reprompt AFTER one "Always Allow" for the new identity (this Mac has "Apple Development: Tim Evans" but NOT a "Developer ID Application" cert yet). `app/package-dmg.sh` + `app/MacMem.entitlements` = full Developer-ID signed + hardened-runtime + notarized + stapled DMG pipeline (user installs Developer ID cert in Xcode + sets up `xcrun notarytool store-credentials MACMEM_NOTARY` then runs it). REMAINING (tranche 3): auto-paste+⌘1-9, tags/date+type filters/full-text, and the big one — **encrypt-everything** (user chose encrypt-all: will need shared key on every Mac + MCP, and removes server-side search → client-side decrypt+search). Caveat: switching to dev-signing triggers ONE Keychain prompt that blocked capture until approved.
- Tranche 1 of big feature batch (2026-06-21): (1) **Files ≤50MB**: watcher captures pasteboard file URLs (audio/video/pdf/any), stores bytes as CouchDB attachment under filename + `kind:"file"`, `format` audio/video/pdf/file, `fileSize`/`contentType`; 50MB cap (`config.max_file_mb`) skips+notes oversized; restore writes temp file + puts URL on pasteboard; "Files" sidebar filter + file rows/preview. (2) **Storage**: `Couch.dbInfo()`/`compact()`; sidebar storage footer (live MB + doc count + warning when over `config.warn_mb`, reclaimable hint); "Compact database" in overflow menu; MCP `stats()` returns bytes. (3) **HTTP MCP transport**: `macmem_mcp.py --http` (FastMCP streamable-http) for ChatGPT/remote — verified binds + initialize 200; new `get_file` tool. All verified via CouchDB/MCP CLI + UI screenshot. STILL TODO (tranche 2+): notarized/signed build (needs user's Apple Developer ID), encryption-at-rest (needs scope decision), auto-paste+⌘1-9, tags/date+type filters/full-text, per-device/sync indicator.
- MCP server + UI redesign + index (2026-06-21): **MCP server** at `mcp/macmem_mcp.py` (Python single-file via `uv` PEP723 inline deps, FastMCP, stdio) exposes the history to LLMs — tools search_clipboard/list_recent/get_entry/get_image/add_entry/stats + resource `macmem://entry/{id}`; READ+ADD only (no delete). Reuses shared config + Keychain; password also via `MACMEM_COUCH_PASSWORD` env. Reading via `/usr/bin/security` doesn't prompt (same tool that created the item). Register: `mcp/register-claude.sh` → `claude mcp add macmem -- uv run --script .../macmem_mcp.py` (a config change — left for user to run). **Index system**: `Couch.ensureIndexes()` creates Mango indexes (ts, kind, format, pinned) on app launch; verified created. Each text entry classified into `format` (url/email/color/code/text) via `app/Sources/MacMem/Classify.swift`. **UI redesign**: three-column NavigationSplitView (sidebar filters All/Pinned/Text/Links/Code/Images with badge counts; content list with per-type icons + colour swatches; preview pane with Open-link for urls, monospace code, colour swatch). Verified on screen. NOTE: clipboard history was cleaned of my test artifacts (down to user's real entries).
- Polish/features (2026-06-21): app icon (AppKit-generated `app/generate-icon.swift` → MacMem.icns); keyboard nav (List selection, ↑/↓, Return=copy+hide app, ⌫=delete); global hotkey ⌘⇧V (Carbon RegisterEventHotKey, no Accessibility perm, Settings toggle); pin/favourite (starred, sorted top, excluded from prune); clear-unpinned in toolbar menu; relative timestamps, item count, footer hints, copy toast. Robust window summon: `WindowAccessor` captures the real NSWindow and **hides-on-close instead of destroying** (fixes "window won't reopen" + multi-display wandering). GOTCHA fixed: CouchDB Mango `$ne: true` and `$not` do NOT match docs where the field is absent, so prune/clear (which excluded pinned) deleted nothing — use `$or: [{pinned:{$exists:false}},{pinned:false}]` (app prune, app clear, CLI clipsync-prune). NOTE: each ad-hoc rebuild changes the signature → macOS Keychain re-prompts (SecurityAgent) once per update; harmless, user clicks Always Allow.
- Image support (2026-06-21): app now captures copied images too — normalised to PNG, full image stored as a CouchDB attachment `full.png` + a small inline base64 `thumb` (120px) in the doc (`kind:"image"`, with `w`/`h`). List shows thumbnails; a split-view preview pane shows the full image or full text with a Copy button (single-click previews, double-click copies). Image dedup via SHA-256; self-copy guard is `ignoreCurrentPasteboard`. CLI `clip` labels image rows but can't copy them (app-only). Helpers in `app/Sources/MacMem/ImageUtils.swift`.
- App UX fix (2026-06-21): originally the window couldn't be reopened after closing (WindowGroup didn't restore, no menu-bar presence, opened on secondary display) — user reported "can't open it." Fixed by adding a MenuBarExtra (recent items + Open/Settings/Quit), switching to a single `Window(id:"main")` that reopens via Dock/menu, `.defaultPosition(.center)`, and a window-independent refresh timer in AppState. Capture itself was always working.
- **Mac app** (`app/` in repo): self-contained SwiftUI window app `MacMem.app` (installed in /Applications) that captures the clipboard itself AND shows searchable/clickable history. Built via SwiftPM + `app/build-app.sh` (ad-hoc signed, no Xcode; macOS 14+). Reuses `~/.config/clipsync/config.json` + Keychain; in-app Settings (⌘,) for connection + launch-at-login. On the Mini the launchd capture+prune agents were RETIRED (moved to `~/.config/clipsync/retired-agents/`) so the app is the sole capturer — don't run both. CLI `clip` picker still works as an alternate reader.
- GitHub: **private** repo `slaguru666/MacMem` (https://github.com/slaguru666/MacMem). Clean source-of-truth at `~/MacMem` (git, origin set). Per-Mac install: `git clone … && ./install.sh` then `clipsync-setup`. No secrets committed (example config uses couchdb.example.com; `.gitignore` excludes config.json/offline-queue/logs/binary).
- Remote: `couchdb.timevans.uk`, db `macmem`, user `macmem`. Password in login Keychain (service `clipsync-couchdb`), never on disk.
- Code in `~/bin`: `clip-watch` (compiled Swift `NSPasteboard` watcher, source `clip-watch.swift`), `clipsync` (stdlib-Python daemon, offline queue), `clip` (fzf picker → `pbcopy`), `clipsync-prune` (retention), `clipsync-setup` (Keychain + DB + ts index + launchd bootstrap).
- Config/lib/README in `~/.config/clipsync/`. launchd: `uk.timevans.clipsync` (KeepAlive), `uk.timevans.clipsync-prune` (daily 04:30). Logs `~/Library/Logs/clipsync.log`.
- Doc shape: `{_id:<host>-<ms>, type:clip, text, host, ts}`. Skips concealed/transient pasteboard types, length bounds, `deny_patterns` regex.
- No PyObjC in any local Python (system 3.9 / brew 3.14 / venv) → Swift used for pasteboard access.
- Per-Mac install: copy `~/bin/clip*`, `~/bin/clipsync*`, `~/.config/clipsync/`, then run `clipsync-setup`.
-40
View File
@@ -1,40 +0,0 @@
---
name: gmtool-director
description: "The Director" — offline-first convention GM tablet app (repo slaguru666/gmtool)
metadata:
type: project
---
**The Director** (repo `slaguru666/gmtool`, package name `gm-director`) — an offline-first PWA
for running tabletop RPG sessions at conventions. Vanilla ES modules + Web Components (light DOM)
over pure, deterministic core logic (injected `now`/`rng`); Vite + Vitest/jsdom; no runtime deps.
Permanent feature is the always-on **Director Rail** (session clock + drift + next hard trigger).
State (2026-07-20): Slices 1–5 all complete. Slice 5 = the **convention hub** (`<con-hub>` +
pure `src/con/schedule.js`, live-now/up-next, deep-links via `src/scenarios/index.js` registry;
shell routes hub↔session). All **six** Continuum 2026 slots are ported into scenario modules and
scheduled with real times in `src/con/continuum-2026.js`.
Correction to the old slate note: Continuum 2026 is **six** GM'd slots, not five — Slot 5
**By the Light of the Silvery Moon** (CoC Gaslight) was missing, and Slot 6 is *Get to the Chopper —
Another Fine Mess*. Full slate: Fri S1 Day One (BRP), Fri S2 AFTERIMAGE (Blade Runner), Sat S4 The
Vain Crown (VANITY), Sat S5 Silvery Moon (CoC Gaslight), Sun S6 Chopper (Pulp Cthulhu), Sun S7 The
Princes Bride (Dee Sanction). Scenario source-of-truth for timelines is the `gm-utility/*console`
files in the [[afterimage-scenario]] repo `slaguru666/Continuum2026`.
All six scenarios' **clue trails AND NPC cast rosters are ported** (transcribed from the console
sources): clues feed the Slice 4 safety-net; cast feeds `<cast-tray>` (tap-to-reveal secrets).
**Every design §5 tray tool is now built**: dice (6 packs incl. a dedicated `brp-d100` for Day One),
NPC, art, clue-net, cast-tray, break-timer (pauses the clock so breaks don't poison drift),
parking-lot (timestamped thread capture), and a wake-lock toggle. Rail chips: 🏠🎲👤✏️🔍👥☕📝💡.
Also a **markdown→scenario-data generator** (`tools/scenario-md.js` + `npm run gen:scenario`): a
deterministic parser over a defined structured-markdown format (frontmatter + Timeline/Clues/Cast
lists), validated before emit; `tools/` is dev-only, never bundled. **Online art "Generate"** is also
built: the art tray generates pencil art via a GM-configured endpoint (nothing hardcoded — paste the
URL in the ⚙ field) and caches results into a persisted, searchable library; degrades gracefully
offline/unconfigured. The **native iPad wrapper** is scaffolded too: a Capacitor 8 iOS shell
(`capacitor.config.json`, `@capacitor/{core,cli,ios}` devDeps, `ios:*` npm scripts, SW skipped under
Capacitor, `docs/native-ipad-wrapper.md` build guide). Generating/building the actual iOS project
needs a Mac with **full Xcode + CocoaPods** (this Mac mini has only Command Line Tools, no pods) — so
that step is documented for the user to run, not done. ~211 tests. **The whole design is now built** —
The Director is convention-ready for Continuum 2026.
-28
View File
@@ -1,28 +0,0 @@
---
name: mapwright-module
description: Mapwright — standalone Foundry v14 battle-map generator; published on GitHub (slaguru666/mapwright)
metadata:
node_type: memory
type: project
originSessionId: 876e6f57-7721-4a19-83bd-1400e94b8c64
---
`mapwright` — standalone Foundry VTT battle-map generator at `~/FoundryVTT/Data/modules/mapwright/`. Auto-generates good-looking tactical maps with Foundry walls/doors/windows/lighting pre-placed. Fresh rebuild replacing the underwhelming `quick-battlemap-builder` / sprawling `scifi-deckplan-generator`.
**PUBLISHED (2026-06-17, v0.5.0):** GitHub repo `https://github.com/slaguru666/mapwright` (public). Install in Foundry via manifest URL: `https://github.com/slaguru666/mapwright/releases/latest/download/module.json`. Releases via `gh` CLI (auth'd as slaguru666) — GitHub MCP has no release tool, so use gh for releases. Release assets: `module.json` + `mapwright.zip` (clean module files, no dev/). To ship a new version: bump module.json version → zip `module.json module templates styles lang README.md` → `gh release create vX.Y.Z module.json mapwright.zip`. `.gitignore` excludes dev/*.svg|png|jpeg|html.
**Live Foundry is v14.361** (world SLA_Industries, system zero-engine). Can log into the GM session via Playwright (Gamemaster user, no password, localhost:30000) to test live. Module is ENABLED there.
**Core principle:** one geometry model feeds BOTH the picture and the Foundry walls. Pipeline per category: generate layout → wall segments → SVG (preview + scene background PNG) + Foundry walls/doors/lights/notes/tiles.
**Categories (6):** Modern Building, Fantasy Building (BSP, footprint shapes rect/L/T/U/plus + "auto" random, multi-floor 1-4 with stairs/elevator, era-aware door/window art, furniture as LOCKED TILES); Cave/Dungeon (organic CA, themes cave/crypt/sewer); Outdoors (grassland/desert/snow/badlands); Town/Village + City Block (solid rooftop blocks + perimeter walls, dense + colourful + lots of baked scenery: cars/trees/lamps/crosswalks/wells/stalls).
**KEY v14 GOTCHAS (hard-won):**
- Scene background moved to LEVELS: set `scene.updateEmbeddedDocuments("Level",[{_id, background:{src,color}}])` on the default level (`defaultLevel0000`), NOT the deprecated `scene.background`. See `applyBackground()` in scene.mjs.
- FilePicker is `foundry.applications.apps.FilePicker.implementation`; normalise upload paths to relative.
- Tiles use `texture.src` (not `img`); furniture tiles are `locked:true`, generated sprites cached in `mapwright/furniture/`.
- Default scenes: tokenVision:false (flat fully-lit map = matches preview); dynamic lighting opt-in.
**File map:** lib/{rng,building,walls,render-vector,furniture,furniture-layout,organic,dungeon,render-cave,outdoor,render-outdoor,settlement,render-settlement,population,scene}.mjs; app/generator-app.mjs; mapwright.mjs (entry). Pure libs are Node-testable via dev/*.mjs harnesses (render → qlmanage to PNG to eyeball).
**Next ideas:** enterable hero buildings; more biomes; moving-traffic city look; village cobble plaza.
-23
View File
@@ -5,7 +5,6 @@ metadata:
node_type: memory
type: reference
originSessionId: fa4ca039-8c0e-4b9c-aee8-b6d7a81482b5
modified: 2026-07-19T14:01:49.937Z
---
# Midjourney bridge (`mj-gen`)
@@ -41,28 +40,6 @@ mj-gen "Ink sketch, lone figure standing on a flooded London street at dawn, ...
Then read the resulting PNG back to verify it matches the brief before placing it into game files. If the user dislikes U1, re-run `mj-gen` (cheap re-roll) or — if the same grid is still in the channel — manually post the other U-button custom_ids; the script currently only auto-clicks one upscale per call.
## Prompt gotchas (learned in production)
- MJ's moderation blocks prompts containing banned words **even in negation**
("no visible gore") — the grid never arrives and `mj-gen` times out with no
error. Reword positively ("understated, nothing graphic").
- Scene prompts drift photorealistic; for illustration styles lead with
"hand-drawn pen and ink illustration, NOT a photograph" and append
`--no photography, photorealism`.
- Saved files get a `-u1` (upscale-button) suffix — rename to canonical names.
- Don't run two `mj-gen` calls concurrently in one channel: each polls the
channel for the newest grid and they can grab each other's jobs.
- **A silently-dying job = a banned word, almost always.** MJ declines in an
ephemeral reply the channel-poller can never see, so `mj-gen` waits out its
full timeout on nothing — NO new bot messages appear in the channel (check
via the messages API). Words confirmed to trip it even in innocent use:
**"gore"** (even negated: "no visible gore") and **"bust"** ("portrait bust
of a warrior"). Reword and rerun; the fix is never account-side unless the
account page actually shows 0 fast hours. (19 Jul 2026: five "Portrait
bust..." prompts died in a row and were misread as fast-hours exhaustion —
the account had 13h56m remaining; "Head and shoulders portrait" worked
first try.) `timeout_seconds` in config.json is 1800 (was 600).
## Known fragility
- If MJ changes the `/imagine` slash command schema, run `mj-capture-command` to refresh.
-17
View File
@@ -1,17 +0,0 @@
---
name: princes-bride-scenario
description: THE PRINCES BRIDE — Dee Sanction game for Continuum 2026 Sunday Slot 7 (14:00–18:00); v1.1 convention-ready in slaguru666/Continuum2026
metadata:
node_type: memory
type: project
originSessionId: 445b61b6-6e68-4f8e-8caa-28bf213400e9
modified: 2026-07-19T14:05:10.686Z
---
THE PRINCES BRIDE (The Dee Sanction) is Tim's Continuum 2026 **Sunday Slot 7** game (26 July, 14:00–18:00, Arkham room). v1.1 convention-ready, built from the January materials at `/Volumes/Mac 2TB/Convention/contingency-2026/dee-sanction`. Repo: `slaguru666/Continuum2026` (shared-folder convention: `scenarios/sun-slot7-dee-sanction-princes-bride.md`, `gm-utility/princes-bride/`, art in `scenarios/art/princes-bride/`); local: `RPGS/Conventions/Continuum 2026/03 Sunday/Slot 7 Afternoon Dee Sanction/PRINCES-BRIDE/`.
**Canon (reconciled — the January drafts contradicted each other):** Mary Fletcher made the planted poppet; the real fae charm came from the late Agatha Thorne; Garratt is a persuadable pragmatist; McShay's rejected proposal was to Eleanor Patterson; the Prince is **Sigismund** (not Henry — PC name collision); the village is **Faversholme**, Yorkshire, October **1586**. Table conventions: pregens are "Meg", "Nell", "Lynton" — never Margaret/Eleanor/Thomas.
**Real Dee Sanction rules** (the old gm-quick-reference.html was a different game's system — ignore it): roll one Ability die (Physicall/Intellectuall/Supernaturall, d4–d12); 3+ succeeds, 1–2 Falters (success at cost); Expertise steps the die up; Fortune = one re-roll; Unravelling track steps down on uncanny Falters.
**Set-pieces:** the Trial at dawn on an open **Verdict Die** (evidence steps it up, d10+ = acquittal without rolling, Falter = water ordeal) and the Bargain at the stones (courtesies; no roll wins the parley). Console: THE SANCTION DESK. Tim runs FOUR Continuum slots: Day One (Fri S1), AFTERIMAGE (Fri S2), Vain Crown (Sat S4), Princes Bride (Sun S7). Related: [[afterimage-scenario]], [[rpg-skill]].
-17
View File
@@ -1,17 +0,0 @@
---
name: rpg-skill
description: "The \"rpg\" Claude Code skill — house scenario-writing system, shared via claude-config repo, self-updating lessons log"
metadata:
node_type: memory
type: project
originSessionId: 063192d8-013b-4c4f-9d0b-ad355d9ae7c1
modified: 2026-07-19T11:17:43.964Z
---
The **rpg** skill at `~/.claude/skills/rpg/` (created 2026-07-19) auto-triggers on any tabletop RPG scenario work and encodes the house system: 3h30 convention structure with 2:45 hard rule, three-route clue standard, pregen private seams, desk playtest protocol, mj-gen art pipeline.
**Live loop:** transferable lessons are appended to `references/lessons.md` (promotion rule: delete once encoded into a reference); scenario-specific facts go to Graphiti; sync across machines with `cd ~/Git/claude-config && ./sync.sh`.
**Sync ordering matters:** `sync.sh` copies live state over the repo with deletes — always `git pull && ./install.sh` before working on a machine, `./sync.sh` after, or machines clobber each other's memory/skill files (this happened once; fixed by union merge 2026-07-19).
Related: [[afterimage-scenario]] (the exemplar scenario the skill was distilled from).
+2 -75
View File
@@ -11,78 +11,7 @@
"Bash(mj-capture-command *)",
"Bash(/Users/timevans/bin/mj-gen *)",
"Bash(/Users/timevans/bin/mj-auth-check *)",
"Bash(/Users/timevans/bin/mj-capture-command *)",
"Read",
"Edit",
"Write",
"Glob",
"Grep",
"Bash(git status)",
"Bash(git diff)",
"Bash(git log)",
"Bash(git add )",
"Bash(git commit )",
"Bash(git push)",
"Bash(git pull)",
"Bash(git branch)",
"Bash(git checkout )",
"Bash(git stash)",
"Bash(git fetch)",
"Bash(npm run )",
"Bash(npm install)",
"Bash(npm test)",
"Bash(npm ci)",
"Bash(npx )",
"Bash(node )",
"Bash(ls)",
"Bash(dir)",
"Bash(mkdir )",
"Bash(mv )",
"Bash(cp )",
"Bash(touch )",
"Bash(cat )",
"Bash(head )",
"Bash(tail )",
"Bash(wc )",
"Bash(find )",
"Bash(grep )",
"Bash(sort )",
"Bash(uniq )",
"Bash(diff )",
"Bash(which )",
"Bash(where )",
"Bash(echo )",
"Bash(pwd)",
"Bash(cd )",
"Bash(type )",
"Bash(file )",
"Bash(whoami)",
"Bash(hostname)",
"Bash(date)",
"Bash(yarn )",
"Bash(pnpm )",
"Bash(python )",
"Bash(python3 )",
"Bash(pip )",
"Bash(pip3 )",
"Bash(cargo )",
"Bash(go )",
"Bash(dotnet )"
],
"deny": [
"Bash(rm -rf )",
"Bash(rm -r )",
"Bash(rmdir /s)",
"Bash(del /s)",
"Bash(sudo )",
"Bash(chmod 777)",
"Bash(format )",
"Read(.env)",
"Read(**/.env)",
"Read(**/.env.*)",
"Read(**/credentials*)",
"Read(**/*.pem)",
"Read(**/*.key)"
"Bash(/Users/timevans/bin/mj-capture-command *)"
]
},
"model": "opus",
@@ -129,7 +58,5 @@
"theme": "dark",
"verbose": false,
"preferredNotifChannel": "terminal_bell",
"autoUpdaterStatus": "enabled",
"agentPushNotifEnabled": true,
"inputNeededNotifEnabled": true
"autoUpdaterStatus": "enabled"
}
@@ -9,6 +9,29 @@ Authoring convention one-shot **documents** and shipping the **apps** derived fr
Distilled from Continuum 2026 (six one-shots, a weekend at the table) — including, honestly,
the parts that were done the hard way.
## The lesson from the table (read this first — it overrides the rest)
**The GM built five editions of the scenario app and used NONE of them at the convention.**
His words afterward: *too complex, the story material too convoluted; it needs to be more
concise and focused.* The convention was the real test and the comprehensive content apps
failed it. What he *did* value was the separate **GM help tool** (The Director — live pacing,
dice rule-packs, NPC/clue safety-net): **help in the moment, not reference material to read.**
Consequences that must shape any future work here:
- **Default to NOT building a content app.** Comprehensive, faithful, multi-page renders of the
scenario are prep artifacts, not table tools. He won't open them mid-game.
- **At the table, concision beats completeness — always.** One focused surface with the few
things a GM needs *live* (where we are, the next beat, the one secret) beats everything that
is true. Convolution killed it.
- **"All the information in one place" is a real preference** — he liked single-surface, disliked
multi-tab/multi-edition sprawl. One page, not six consoles.
- **The winning product is the in-play *help* tool. Invest there, not in content reference.**
The rest of this skill (doc structure, deploy pattern) is still correct for *authoring and prep*
and for the rare case a content app is explicitly wanted — but it is now secondary to the lesson
above.
## The one idea that ties it together
**A convention scenario has one source of truth — the scenario document — and everything else
@@ -4,6 +4,16 @@ This is the shipping half. It captures what the Continuum 2026 project got *righ
honestly — what it got *wrong*, verified by watching fresh agents solve the same requests
better than the project actually did.
## Before any of this: should the edition exist at all?
Post-convention truth: **all five editions went unused.** The GM found the content apps too
complex and the story material too convoluted; the tool he valued was the separate in-play
**help** tool, not content reference. So the first question is never "which architecture" — it
is **"will this actually get opened at the table?"** For scenario *content*, the honest default
is **no** — build lean prep docs and put effort into the live help tool instead. Only build a
content edition when the GM explicitly asks for one, and even then make it one concise surface.
The decision table below applies *once you've established the thing is genuinely wanted.*
## The core decision: adapt one source, or build a separate artifact?
A new "make me a version for device X" request is one of three things. Classify it before you build:
@@ -6,6 +6,21 @@ downstream artifact — print packs, GM consoles, a phone story reader — could
or distilled from it.** Write the scenario doc this way and the apps fall out of it cheaply.
Write it as freeform prose and every app becomes bespoke hand-work.
## Prep doc ≠ table surface (the hardest-won lesson)
Everything below describes a **rich, comprehensive prep document** — the right form for
*writing and understanding* a scenario. It is the WRONG form to put in front of a GM *during
play.* At Continuum 2026 the comprehensive apps built from these docs went **unused** — "too
complex, too convoluted." So keep two things separate:
- **The prep doc** (this file's structure) — complete, for authoring and cold stand-in reading.
- **The table surface** — a ruthless distillation of the *live* essentials only: the session
clock / current beat, the next hard trigger, the one secret in play, and any "if late, cut
this" note. One page. If a field isn't needed *in the moment*, it does not belong on the
table surface. Concision is the feature.
Write the prep doc in full; render the table surface as the smallest possible subset.
## The governing constraint: a stand-in must be able to run it cold
The single most important property. At a convention the GM can fall through — illness, a
-122
View File
@@ -1,122 +0,0 @@
---
name: rpg
description: >-
Tim's tabletop RPG scenario-writing system — house structure, GM-readable
writing style, pregen design, playtesting protocol, production pipeline
(handouts, art, GM console), and memory/repo integration. Use this skill
whenever the work touches tabletop RPG scenarios or adventures in ANY way:
writing or revising a scenario, one-shot, con game, adventure, module,
campaign, session, or BPN; designing pregens, NPCs, clues, handouts, chases,
or set-pieces; playtesting; preparing convention slots (Continuum,
Contingency, Airecon, Convulsion, ChaosiumCon); or working with systems like
Blade Runner, Call of Cthulhu, SLA Industries, Mothership, Traveller,
Pendragon, Daggerheart, Shadowdark, Stormbringer, RingWorld, BRP, Delta
Green. Trigger even if the user doesn't say "scenario" — "prep my Friday
slot", "new adventure for X", "fix the pregens", "make handouts" all count.
---
# RPG Scenario Writing
Tim writes tabletop RPG scenarios — mostly 4-hour convention one-shots, sometimes
longer campaign material — and runs them as GM. This skill is the house system:
structure, style, production pipeline, and the memory loop that keeps it all alive
across machines and sessions.
## The prime directive: write for the GM at the table
A scenario is a performance document, not a novel. The GM reads it in 30-second
glances while four people wait. Every formatting decision serves that:
- **Scannable over literary.** Bullets, tables, bold keywords. Prose only where it
earns its place (read-aloud text, plot summary, atmosphere).
- **Information in the order the GM needs it**, not the order the story happens.
- **Read-aloud text in `>` blockquotes**, ≤3 sentences by default (players
disengage after two; only the cold open may run to 4–6), always labelled
"read aloud or paraphrase". Longer material becomes bullets the GM voices.
- **Mechanics inline, bracketed:** `[BR: Observation — spots the torn hem]`.
Never send the GM to another page for a roll.
- **Every NPC gets a one-line essence** (who they are + what they want) before
any detail, and appears again in the end-of-document **NPC Roster quick sheet**.
- **State the failure case.** Every clue, scene, and set-piece says what happens
if players miss it, skip it, or break it.
## Workflow
### 1. Orient (start of any RPG task)
- Query Graphiti (`search_memory_facts`) for the scenario/convention/system at hand.
- Find the working directory. Convention material lives under
`~/Library/Mobile Documents/com~apple~CloudDocs/RPGS/Conventions/<Event Year>/...`
and is mirrored to a private GitHub repo per event (e.g. `slaguru666/Continuum2026`).
- Ask which **scenario type** this is only if it isn't obvious:
- **Convention one-shot** (default) → read `references/convention-one-shot.md`
- **Campaign / multi-session** → read `references/campaign.md`
- For craft questions (structure, clues, pacing, mystery design) read
`references/craft.md`. Before writing or revising anything, skim
`references/lessons.md` — it is the accumulated playtest wisdom.
### 2. Build
Order of work for a new scenario:
1. **Concept + Design intent** — 3–5 numbered statements of what this scenario
is and deliberately is not. Include an elevator pitch line (the tagline under
the title) and content warnings.
2. **Plot Summary (GM truth)** — the full hidden truth, then a **timeline** of
events before play begins. Write this before any scenes: scenes are windows
onto a situation that already exists.
3. **Structure pass** — acts, timing table with GM checkpoints, countdown clock
of what antagonists do on schedule.
4. **Scenes, NPCs, clue trails** — per act, using `assets/scenario-template.md`.
5. **Pregens** — read `references/pregens.md`. Wire each PC into the case.
6. **Production** — handouts, art, GM console, print: `references/production.md`.
7. **Playtest** — read `references/playtest.md`. A scenario is not
"convention-ready" until it has survived desk playtests and the fix list is
applied and versioned.
### 3. Close the loop (end of any RPG session)
This skill is **live** — it must get smarter every time it is used:
- **Graphiti:** `add_memory` with decisions made, scenario state, and anything
learned (structure fixes, ruling patterns, player-behaviour discoveries).
- **Repo:** commit and push scenario work to its event repo.
- **Skill self-update:** if the session produced a transferable lesson (not
scenario-specific detail), append it to `references/lessons.md` with a date
and one-line context, then sync the skill across machines:
`cd ~/Git/claude-config && ./sync.sh "rpg skill: <what changed>"`.
Scenario-specific facts go to Graphiti, *transferable craft* goes to lessons.md
— that distinction keeps the skill lean.
## House conventions (all scenario types)
- **Files are Markdown**, one scenario per file, self-contained (a GM with only
that file can run the game). HTML only for print artifacts (character sheets,
handout packs, GM console).
- **Folder shape per scenario:** `scenarios/` `characters/` `handouts/`
`reference/` `playtest/` `gm-utility/` `print/` + `README.md` index with
status line (version, playtest count, remaining prep).
- **Versioning:** v1 draft → playtest → v2, v2.1... Status becomes
"convention-ready" only after a full-session playtest lands inside the time
budget. README tracks version + what remains.
- **Mechanic tags:** `[SYSTEM: Skill — effect]` e.g. `[CoC: Spot Hidden — ...]`,
`[BR: Manipulation — ...]`. Include a 3–4 line system crash-course in the
Master Rules block so a stand-in GM could run it.
- **Art:** ink sketch / pencil illustration, hand-drawn feel, never
photorealistic. Asset IDs `[Slot]-ART-[##]`, handouts `[Slot]-H[act]-[letter]`.
Generate via `mj-gen "<prompt>"` (Midjourney bridge). Each scenario defines
its own art direction line on top of the base style.
- **Licence footer** on READMEs: private convention play materials, not for sale.
## Reference files
| File | Read when |
|---|---|
| `references/convention-one-shot.md` | Building/revising a 4-hour slot scenario (the default) |
| `references/campaign.md` | Multi-session or open-ended material |
| `references/craft.md` | Structure, clue, pacing, mystery design decisions |
| `references/pregens.md` | Creating or auditing pre-generated characters |
| `references/playtest.md` | Running desk playtests, writing fix lists |
| `references/production.md` | Handouts, art, GM console, print, repo layout |
| `references/lessons.md` | Always skim before writing; append new lessons |
| `assets/scenario-template.md` | Starting a new scenario document |
-272
View File
@@ -1,272 +0,0 @@
# [Event – Slot] – [System]: [TITLE]
> *[Tagline — one line, the scenario's hook as a whisper.]*
---
## GM ESSENTIALS (one glance, any GM)
- **System crash-course:** [3–4 lines on the core roll, so a stand-in GM could
run this. e.g. attribute die + skill die, 6+ succeeds, push to re-roll…]
- **Mechanics inline:** `[SYSTEM: Skill — what it reveals or does]`
- **The clock counts play time** — pause it for the break. All cumulative
times and checkpoints below are on that clock.
- **Hard rule: at 2:45, go to Act Three regardless.** Fast-tracks per act.
- **Safety:** state tool in use (X-card / open door) during seating — 30
seconds, no ceremony.
---
## Overview
- **Event:** [Convention — day, slot, time, venue]
- **System:** [Game + publisher]
- **Setting:** [Where and when]
- **Tone:** [Two or three precise words, then one sentence]
- **Maximum Runtime:** 3 hours 30 minutes play + 10 minute break
- **Players:** [N] pregens (runs [N−1]–[N+1]; drop [PC] first at fewer; at
[N−1] the splits become [adjustment])
- **Content warnings:** [List — conventions require them, players deserve them]
- **Art Style:** Ink sketch / pencil illustration. [Scenario-specific direction line]
### Design intent (read this first)
1. [What kind of scenario this is — e.g. investigation-first, no required combat]
2. [Structural promise — e.g. built to split into 2+2 parallel tracks]
3. [Ending shape — closure or designed ambiguity, and why]
4. [What this scenario deliberately is *not*]
---
## Session Timing Guide
| Section | Duration | Cumulative (play) | GM Checkpoint |
|---------|----------|-------------------|---------------|
| Slot Zero + Introduction | ~15 min | 0:15 | [One-line test the GM can apply] |
| Act One — [Title] | ~60 min | 1:15 | [Essential clue found; hook to Act Two live] |
| *Break — pause the clock* | *10 min* | *1:15* | *Lands on the Act One cliffhanger* |
| Act Two — [Title] | ~90 min | 2:45 | [Truth revealed; heading to confrontation] |
| Act Three — [Title] | ~30 min | 3:15 | [Confrontation resolved] |
| Epilogue | ~15 min | 3:30 | [Vignettes delivered, debrief done] |
Durations are **ceilings, not fills** — plan ~3:15 of content against them.
**Hard rule:** at 2:45, go to Act Three regardless.
---
## Plot Summary (GM truth — players never see this page)
*The full hidden truth, start to finish, regardless of player action. What
actually happened, who wants what, what the antagonist does next.*
**Timeline (GM reference):**
- **T-[n]:** [event before play]
- **Game night:** [where play begins]
- **[Deadline]:** [the convergence point]
### Revelations (GM checklist — 8–12, abstracted from where they're found)
| # | Revelation | Expected by | Delivered? |
|---|-----------|-------------|------------|
| R1 | | Act One | |
| R2 | | Act Two | |
*Anything undelivered by end of Act Two: fold into Act Three's confirmation
scene or consciously drop — the Act Two Pacing Note says which.*
---
## Player Experience
*One paragraph, second person: the scenario as the table will live it. This is
the pitch — if it reads flat, the scenario is flat.*
---
## The Countdown (background clock)
*Antagonists move on schedule whether or not the players are watching. When the
party stalls, advance one step and let the players feel it. Opposition stays
one step behind the players until the climax. This table is also the universal
fallback: any missed essential clue can arrive as a Countdown event.*
| Clock | Event |
|---|---|
| [t0] | [Opening state] |
| [t1] | [Antagonist move] |
| [deadline] | [Convergence] |
---
## Pre-Game Handouts
| ID | Description | Format | When Given |
|----|-------------|--------|------------|
| [Slot]-H00-A | | | |
---
## Introduction — [Title] *(~15 minutes, including Slot Zero)*
### Slot Zero (before the fiction)
1. Seating + safety line (30 seconds)
2. Pitch each pregen aloud in one tagline (the sheet's italic essence line)
3. Players choose — or GM deals — in ≤5 minutes
4. Open in motion; introductions surface during the action
### Opening (read aloud or paraphrase)
> [≤3 sentences default; the cold open may run to 4–6. Sensory, in motion,
> ends pointing at the players. Longer material becomes bullets the GM voices.]
### Player Briefing
- [What the players know, as bullets — victim, job, constraint, authority]
- [Which handout to give, and when]
### Atmosphere Notes
- [Sound, light, smell — the loops the GM returns to]
- [Suggested audio — home tables only; con halls are loud]
### Hook into Act One
[The choice or thread that moves them — offer, don't assign.]
---
## ACT ONE — [Title] *(~60 minutes)*
> **Goal:** [What this act establishes; what must be true before Act Two.]
### Summary
[What happens here, in five lines or fewer.]
### Split Plan *(if this act runs as parallel tracks)*
- **Recommended pairing:** [2+2 by PC lanes — offer, don't assign]
- **Segments:** alternate ~12 min, end each on a pull line: "[e.g. what was the hurry?]"
- **Cross-team payoff:** [what each half learns that the other needs]
### Locations
#### [Location Name] (Track A/B if split)
- **First impression:** [what they see/hear/smell on arrival]
- **Interactables:** [what rewards attention]
- **Hidden:** [optional/extra material only — essential clues never live here]
`[SYS: Skill — effect]`
- **Artwork:** [Slot]-ART-[##]
### NPCs
#### [NPC Name]
*[One-line essence: who they are + what they want.]*
- **Physical:** [one evocative detail]
- **Motivation:** | **What they know:** | **Disposition:**
- **Mechanics:** [system stat line, inline — no page refs]
### Clue Trail — Act One
| # | Clue | Location / Source | How Found | What It Reveals | Type |
|---|------|-------------------|-----------|-----------------|------|
| 1 | | | | | Essential |
| 2 | | | | | Optional |
**Fallbacks (one per essential clue):** [How the GM introduces each naturally
if missed — NPC volunteers it, environmental prompt, or Countdown event.]
### Story Hooks (if players stall)
- [Proactive event — the world moves]
### Handouts
| ID | Description | Format |
|----|-------------|--------|
| [Slot]-H01-A | | |
### Pacing Note
[What must be true before Act Two. At 1:15:]
> Fast-track: [specific action to jump forward]
---
## ACT TWO — [Title] *(~90 minutes)*
> **Goal:** Investigation, revelation, escalation. The players make the choices that define the ending.
[Same section pattern as Act One — Split Plan, Locations, NPCs, Clue Trail
(continue the numbering), Story Hooks, Handouts. Additionally:]
### [THE SET-PIECE] (one per scenario)
- [Round-by-round or beat-by-beat GM structure; own quick-ref page in `reference/`]
- **Idle players:** [the job the sidelined pair runs — obstacle cards, bystanders]
- **If it breaks:** [escape, refusal, early violence — what then]
### Pacing Note
At 2:45, move to Act Three regardless. [Name here which undelivered
revelations fold into Act Three and which get dropped.]
> Fast-track: [specific jump to the climax]
---
## ACT THREE — [Title] *(~30 minutes)*
> **Goal:** Consequence. Fast pace, high stakes. No new information — only confirmation.
### Opening (read aloud)
> [Short. Arrival at the convergence.]
### The Situation
[Who is present, what they want, what the clock says.]
### The Choices (present plainly; then get out of the way)
- [Choice A — and its cost]
- [Choice B — and its cost]
- [Compromise options playtests or tables have found]
### If Someone Shoots
[The chaos contingency — the table that torches the negotiation gets a real ending too.]
### Story Hooks (contingencies)
[If players freeze, or head for a catastrophic ending.]
### Pacing Note
30 minutes maximum. If unresolved at 3:15:
> [The pressure line — deploy at the *first* sign of circular debate.]
---
## Epilogue — [Title] *(~15 minutes)*
### Outcomes
| Outcome | Trigger Condition | What Happens |
|---------|------------------|--------------|
| **[Named ending 1]** | | |
| **[Named ending 2]** | | |
| **[Failure / Pyrrhic]** | | |
### Closing Scene (read aloud, adapt to outcome)
> [Land the last line on the theme. Per-PC vignettes if earned.]
**Early finish:** expand the vignettes, then run The Tangent as a bonus scene.
---
## NPC Roster Summary (GM quick sheet)
| NPC | Essence | Wants | Key line |
|---|---|---|---|
---
## Artwork Assets
- **Art Style:** Ink sketch / pencil illustration. [Direction line.]
| Asset ID | Description | Used In | Generation Prompt |
|----------|-------------|---------|-------------------|
| [Slot]-ART-01 | Cover | Intro | |
---
## The Tangent
*One alternative direction the story could have taken, or the thread a future
session would pull. Doubles as the early-finish bonus scene.*
---
## GM Notes (private)
*Pacing advice, tone reminders, staging instructions, things to watch for.*
-50
View File
@@ -1,50 +0,0 @@
# Campaign & Multi-Session Material
Tim will say when material is campaign-shaped rather than a convention one-shot.
The GM-readability rules, clue discipline, and production standards all still
apply; what changes is the shape of time.
## What changes from the one-shot format
- **Timing loosens.** No 3h30 hard ceiling, no 2:45 rule. Keep per-session
targets and checkpoints, but sessions may end mid-arc.
- **Endings invert.** Sessions *should* end on unresolved peril, an escalating
bang (stakes suddenly transformed), or an earned quiet character beat — the
cliffhanger types a one-shot must avoid. The *arc* still needs a written
destination.
- **Hooks must respect choice.** Con players opted in by sitting down; campaign
players resent coerced hooks. Offer situation-hooks the party can approach
from any angle, and plant **long-term hooks** whose payoff is sessions away.
- **Foreshadowing is a discipline.** Before writing session N, re-read what is
planned for N+1..N+3 and seed their elements now. Twists only land if the
clues predate them.
- **Carry-forward bookkeeping** at the end of each session:
- Undiscovered revelations roll into the next session's list.
- Fronts advance a grim portent; clocks tick for everything ignored.
- Log NPC status, faction posture, promises made, and loose player theories
(player theories are free plot — steal the good ones).
- Persist all of this to Graphiti so any machine can pick the campaign up.
- **Structure by fronts, not acts.** Bundle dangers into fronts, each with an
impending doom and escalating portents. Prep situations per the Alexandrian;
let acts emerge in play.
- **Characters progress.** Advancement, gear drift, and relationship maps need
tracking; pregen audit rules from `pregens.md` apply to any handed-out PCs
but expect player-authored characters here.
## Session prep loop (Sly Flourish's 8 steps, house-adapted)
1. Review the characters (and last session's carry-forward log)
2. Create a strong start — in motion within 20 minutes
3. Outline potential scenes (brief, disposable)
4. List secrets and clues — ~10 one-liners, abstracted from location
5. Develop locations (immediate impression → interactables → hidden)
6. Outline NPCs (one-line essence + want)
7. Choose opposition
8. Select rewards
## Convention scenario ↔ campaign reuse
A convention one-shot can seed a campaign: "The Tangent" section of every
one-shot names the thread a future session would pull. Going the other way,
compressing campaign material into a slot means cutting to one situation, one
set-piece, one decision — and writing a real ending.
@@ -1,121 +0,0 @@
# Convention One-Shot Structure
The house format for 4-hour convention slots. This structure is proven across
Continuum, Contingency, ChaosiumCon and Airecon games — deviate only with a
stated reason in the Design intent.
## Master Rules
### Structure
- **Introduction → Act One → Act Two → Act Three → Epilogue**
- Maximum runtime **3h30 (210 min) of play** inside a 4-hour slot, plus a
10-minute break — ~3h40 wall clock, leaving real margin: strangers at a con
table run slower than any playtest.
- Budgets: Intro 15 · Act One 60 · Act Two 90 · Act Three 30 · Epilogue 15.
These are **ceilings, not fills** — plan ~3:15 of actual content against
them. A scenario that playtests "on schedule with zero slack" is over-stuffed.
- **The session clock counts play time.** Pause it during the break; every
cumulative time and checkpoint in the scenario is on that clock. (The GM
console's clock supports this.)
- **Act Three always happens.** Compress Act Two if needed; never sacrifice the
climax. Hard rule: at 2:45 on the clock, go to Act Three regardless.
- Every act ends with a **Pacing Note**: what must be true before the next act,
and a specific fast-track action if the clock has beaten the table.
- Place the 10-minute **break** at the end of Act One, on a natural cliffhanger.
- A one-shot must **end written**: closure or *designed* ambiguity, never an
unwritten "to be continued". The Epilogue includes an outcomes table
(Full / Partial / Failure / Pyrrhic — or scenario-specific named endings)
and an adaptable closing read-aloud.
### Timing table
Include a Session Timing Guide with a **GM Checkpoint** column — a one-line
test the GM can apply mid-session ("both copies met, chase done, deadline
known"). Checkpoints are what make the timing table usable in play.
### Clues — the house standard
Every essential clue has **three routes** to the players:
1. **Automatic on the right approach** — the right skill or question in the
right scene finds it without a roll; rolls only buy *extra* information.
2. **A written fallback** — NPC volunteers it, environmental prompt, second
location.
3. **The Countdown** — a proactive antagonist move that delivers or forces the
revelation (this is the universal third route; it's why the Countdown table
is mandatory).
Plus:
- Clues form a **guided trail** — each points to the next, but players should
feel they discovered it, not followed a map.
- Every act: at least one **essential** clue and one **optional** clue
(optional = reward for thorough play; trail survives without it).
- Essential clues never live behind a search roll or in a location's "Hidden"
line — Hidden is for optional/extra material only.
- Clue trail is a table per act: # | Clue | Location/Source | How Found |
What It Reveals | Type. Number clues continuously across acts, one fallback
line per essential clue.
- Keep a **Revelations checklist** (8–12 one-liners, abstracted from where
they're found) after the Plot Summary. Anything undelivered by the end of
Act Two is folded into Act Three's confirmation scene or consciously
dropped — the Act Two Pacing Note says which. Beyond that, Act Three
contains **no new information** — only confirmation and consequence.
### The countdown clock
Antagonists and world events move on schedule whether or not players act.
Write a timetable ("The Countdown") the GM advances when the party stalls —
and make each advance *felt* (a glimpsed van, a witness gone quiet). Keep the
opposition **one step behind the players until the climax** — pressure, not
punishment.
### Design intent block
Right after the Overview, 3–5 numbered statements, e.g. "Investigation-first:
no required combat", "Built to split: Acts One and Two run as 2+2 parallel
tracks", "Ambiguous ending: conversation, not firefight". This is the contract
the rest of the document must honour, and the first thing a reviewer checks.
### Plot Summary + Player Experience
Two views of the same scenario, both mandatory:
- **Plot Summary (GM truth)** — what actually happened/is happening,
player-independent, with a dated timeline. Players never see this page.
- **Player Experience** — one paragraph of the scenario as lived from the
table, second person, spoiler-shaped but honest. This is the pitch — if it
reads flat, the scenario is flat.
## Slot logistics
- Default **4 players** with pregens (6 max for some systems — pick per game
and say so). The Overview states the scaling line: which player counts the
scenario runs at, which pregen drops first at fewer, how splits adjust.
Nothing essential may live *only* on one PC.
- **Safety tools, stated in 30 seconds, no ceremony** (X-card or open door —
UK cons expect it, and scenarios with private seams that cut close need the
exit ramp). One line in the Introduction covers it.
- **Slot Zero** (the first 15 minutes, before the fiction): seating + safety
line → pitch each pregen in one spoken tagline (the sheet's italic essence
line) → players choose or GM deals in ≤5 minutes → open in motion.
- **Party splits** are a feature: parallel scene tracks (Track A / Track B)
with engineered cross-team payoffs — each half holds half of a revelation.
Alternate between tables in ~12-minute segments, ending each segment on a
pull ("what was the hurry?").
- One **set-piece** per scenario (chase, heist, séance...) with its own GM
quick-reference page. During set-pieces, give idle players jobs: hand them
the obstacle cards, let them voice the bystanders.
- **Content warnings** in the Overview. Conventions require them and players
deserve them.
## Endings
- Aim the climax at a **decision, not a die roll**. The best Act Three is a
situation where every choice costs something and the scenario honours all
of them ("nobody gets to be right; the players decide who pays").
- Write an "If someone shoots" (or equivalent chaos) contingency — the table
that torches the negotiation must also get a real ending.
- List **compromise endings** players will invent (partial trades, third
options). If a playtest finds one, write it in.
- Epilogue delivers per-PC **vignettes** keyed to the outcome, then table
debrief. Land the last line on the scenario's theme.
- **Early finish** (table cracks it at 2:30): expand the per-PC vignettes,
then run The Tangent as a bonus scene — it's already written.
## Fitting the slot (cut discipline)
- Plan ~3:15 of content against the 3:30 budget; playtest timing includes
setup drift.
- Pre-write the cuts: each act's Pacing Note names what to drop first.
- Deploy pressure lines (an NPC checking a watch) at the *first* sign of
circular table debate, not when the clock is already lost.
-88
View File
@@ -1,88 +0,0 @@
# Scenario Craft
Distilled from the best published design writing (The Alexandrian, GUMSHOE/Robin
Laws, Sly Flourish, Sean McCoy's Mothership layout school, convention-GM guides
by Katrina Ostrander and Burn After Running). These are the field's proven rules;
the house structure in `convention-one-shot.md` already embodies most of them —
use this file when making design *decisions* or debugging a draft that isn't
working.
## Situations, not plots (The Alexandrian)
- Prep **situations** (locations, NPCs with goals and resources, available
information), never event chains — a scripted plot is a chain of potential
points of failure.
- Write **goal-oriented opponents**: what the antagonist is trying to do, on
what timetable, with what tools (squads, safehouses, informants). Improvise
their reactions; never script them.
- Always write the **adversary timeline**: what happens if the PCs do nothing.
(House form: The Countdown.)
## Clues and mystery (Three Clue Rule + GUMSHOE)
- The Alexandrian's Three Clue Rule (three independent routes to every
necessary conclusion) is implemented as the **house standard** in
`convention-one-shot.md`: automatic-on-right-approach + written fallback +
Countdown event. Apply that standard; this section explains the why.
- **Never gate progress behind a die roll to notice something.** Finding core
clues is automatic for the right approach in the right scene; rolls buy
*extra* information. The game is *interpreting* clues, not finding them.
- A **core clue** points to another scene. Test: if it's not worth writing in a
player's notes, it isn't a core clue. Write each scene with lead-ins and
lead-outs.
- **Don't author red herrings** — players manufacture their own false leads for
free. Over-provision true information instead; the sorting is the gameplay.
- Design **backwards from the truth**: write what actually happened and what
the villain does next, then lay the trail from the trigger event.
- Keep a **revelation checklist** (the 8–12 things players must eventually
learn), abstracted from where they're discovered — any scene can deliver a
homeless revelation. Carry undiscovered ones forward. (Sly Flourish's
"secrets and clues".)
- Unstick tools, in order: fallback delivery of the missed clue → **proactive
antagonist event** (a new death, the opposition strikes) → invent a new core
clue on the spot. Structures serve the table, not vice versa.
## Pacing (convention wisdom)
- **One substantive scene per hour of real play**; a 3h30 slot holds ~5. The
critical path should fill only about *half* the slot — deliberation, rules,
and jokes eat the rest. (Total planned content ≈ 3:15 against the 3:30
budget, per the house cut discipline.)
- **Dice roll within the first 20 minutes.** Open in motion (in medias res or
pressure-adjacent) and let introductions surface during the action, not as
round-the-table monologues.
- Premise formula for pitches: "When [disruptive event], will [adjective]
[group] manage to [verb] the [thing]?"
- Introduce mechanics when first needed, not in a front-loaded rules lecture.
- Spotlight is a resource: track who hasn't had a meaningful roll or scene and
aim the next beat at them.
- Personal Agendas (Free League cinematic model): per-act secret goals on the
pregens are a drama engine — quiet tension in Acts One–Two, open
confrontation fuel in Act Three. The house "Private box" is the single-arc
version; use per-act agendas when the scenario needs PvP-adjacent heat.
## Structural skeletons worth stealing
- **Five Room Dungeon** (any genre): Guardian/Entrance → Puzzle or Social →
Trick/Setback → Climax → Revelation/Reward. Good emergency skeleton for a
short slot or a side episode.
- **Fronts** and **progress clocks** (see `campaign.md`): the Countdown is the
wall-clock variant; use segment clocks when antagonist triggers are
event-driven rather than time-driven.
## Writing for the running GM (McCoy / OSR layout school)
- **The cascade:** can this prose be bullets? the bullets a table? the table a
diagram? Always compress downward.
- Tell the GM **the truth on page one** — mystery is for players, never for the
reader. (House form: Plot Summary before any scene.)
- Read-aloud text: players disengage after ~two sentences. Keep boxed text
short and sensory, or replace with a bullet list of details the GM voices in
their own words.
- No mid-scene page-flips: stat lines live next to their encounter, maps next
to their key, cross-references carry explicit pointers.
- Immediate impression first, then interactables, then hidden things — in every
location key.
- Expressive terseness: telegram-minimal strips usable flavour; purple prose
buries the one fact that matters in paragraph three. One evocative detail per
element, load-bearing words in bold.
-191
View File
@@ -1,191 +0,0 @@
# Lessons Log
Living file. Append transferable lessons here (dated, one-line context) at the
end of any RPG work session; sync via `~/Git/claude-config/sync.sh`. Scenario-
specific facts belong in Graphiti, not here — this file is only for lessons
that will change how the *next* scenario is written.
**Promotion rule:** when a lesson gets written into a reference file or the
template, delete it from this log (git history keeps it) — otherwise this file
grows into a duplicate of the skill. Several 2026-07 entries below are already
encoded in the references; they stay as worked examples until the next pruning
pass.
## 2026-07 — AFTERIMAGE desk playtests (Blade Runner, Continuum 2026)
- **Answer the obvious professional move.** Players will always try the
competent thing (field-scan the suspect, phone ahead to a contact, run a
city-wide facial search). If the scenario's premise hinges on such a move,
write its result explicitly — ideally as a sanctioned alternate route that
rejoins the trail, never a stonewall. Improvised rulings here are the
biggest holes playtests find.
- **A player's key relationship is a loaded gun.** If a pregen's relationship
NPC guards a scenario target, decide in the text what happens when the
player leverages the relationship early. Done right it *improves* the scene
(the warned target is already spooked → better chase start).
- **Formalise staging for twin/duplicate reveals.** When two groups hold
halves of a revelation, the NPC recites aloud while the GM hands the
matching card at the same moment. Never let a player's skim carry the scene.
- **Idle pairs get jobs.** During any split set-piece, hand the sidelined
players the obstacle/bystander material to run. Formalise it in the
set-piece text.
- **Deploy pressure lines early.** The written "NPC checks a watch" beat goes
in at the *first* sign of circular debate, not at the scheduled time.
- **List the compromise endings.** Playtests and real tables invent partial
trades (wipe half the drive, surrender the copy). If a compromise is good,
it goes in the choices table — players will find it again.
- **"On schedule with zero slack" is a fail.** Strangers run slower than any
desk test. Keep pre-written cuts per act and take them early.
- **No-roll scenes need a sign.** If a beat is designed so no die roll
resolves it (a confession that stays ambiguous), say so in the text —
"no roll resolves this" — so the GM doesn't improvise one under pressure.
## 2026-07 — Day One consistency audit (BRP, real-London setting)
- **Real-city scenarios need a dedicated geography pass.** Check every compass
direction, "across the river", landmark sightline, and named route against
the actual map before calling a scenario ready — desk playtests won't catch
these, but any local player will (Day One had a hospital on the wrong bank,
a pier route through a tunnel that's past the destination, and a gatehouse
on the wrong end of the bridge).
- **Grep the cast list for surname collisions between PCs and NPCs** — an
audit's cheapest catch (Kira Osei-Mensah vs Fatima Osei), and it reliably
confuses a convention table.
- **In-fiction timestamps deserve arithmetic checks.** If the text says "two
hours before the alert", subtract the actual clock times; drafts drift as
timelines get re-plotted.
## 2026-07 — Pregen roster rebuilds
- **Audit inherited rosters against the current scenario, not just the
rules.** A mechanically-legal PC can still be skill-dead all night (a pilot
in a scenario with no vehicles). Rebuild the lane, keep the flavour, flag
the change for review.
- **Signature items with a tiny mechanic** (once/session stress heal on
interaction) reliably produce unprompted table moments; pure-flavour items
go unused and nobody minds — both outcomes are fine, so always include one.
## 2026-07 — Day One art production (mj-gen batch)
- **Midjourney silently blocks banned words even in negation.** "no visible
gore" kills the job — the grid simply never arrives and the bridge times
out. Write the positive form instead ("understated, nothing graphic").
- **Scene prompts drift photorealistic; style-lock them.** For the house ink
style, lead with "hand-drawn pen and ink illustration, NOT a photograph"
and append `--no photography, photorealism` — one dusk-boat prompt came
back as a photo without it.
- **Maps are drawn, not generated.** MJ cannot do accurate labelled
geography; a hand-styled SVG (rough displacement filter, handwriting font,
cream paper) passes visually as sketch art and stays correct. Expect two
or three label-collision passes in a browser before it's clean.
## 2026-07 — The Vain Crown build (house-system debut package)
- **A rulebook's pregens are not con pregens.** VANITY's five shipped without
Vices — the system's own core engine. When packaging an included adventure
for a slot, audit the pregens against the system's *incentive* mechanics,
not just their stat legality.
- **Debut systems need a dice primer baked into the Intro** — one staged
practice roll per player that doubles as the arrival scene, so teaching
costs zero extra minutes and the first Stumble happens somewhere safe.
- **Give the villain a countdown table.** "Where is he now" per session-clock
row makes lost time (a failed pathfinding roll) mean something concrete and
lets fast tables genuinely change the finale's staging.
- **Silence from a generation pipeline is a diagnosis, not a delay.** When a
batch goes quiet, check the actual channel/API for what the service said
before waiting again — and keep a fallback asset source (the system's own
existing art) so the package ships regardless.
## 2026-07 — Princes Bride rebuild (Dee Sanction, Continuum 2026)
- **Inherited multi-draft projects need a canon-reconciliation clause.** When
source materials disagree (two different charm-givers, two Eleanors, a
villain who is a fraud in one draft and a pragmatist in another), pick one
canon, write it as a numbered Design-Intent item ("Canon reconciled: ..."),
and list every superseded fact — otherwise the GM re-derives the
contradictions at the table.
- **Verify the system against primary sources, not inherited quick-refs.** A
project's own GM reference had an entirely different game's dice mechanic
(PbtA 2d6 for a step-die Falter system). The character sheets + publisher's
site are ground truth; the quick-ref is a hypothesis.
- **Run the set-piece on the system's own resolution mechanic.** The trial as
an open Verdict Die (the game's step-up/step-down, made visible on the
table) needed zero new rules and made evidence-presentation mechanical.
Find the system's native verb before inventing subsystems.
- **Keep good inherited sheets; add an insert layer.** When existing pregens
are printed and well-made but generic, don't rebuild — print per-agent
mission inserts (private seam + dice crib + table-name conventions) that
slip inside the sheets. Cheaper, and the sheets stay canon.
## 2026-07 — Silvery Moon rebuild (inherited-draft salvage)
- **Verify a period scenario's real-world facts, then decide: correct or
canonize.** Silvery Moon's eclipse was astronomically impossible (new moon
that night — checked against the real 1892 record). Correcting it would
have cost the climax; canonizing the wrongness AS the horror (the moon that
should not be there, proven by an almanac handout and an astronomer pregen)
turned the draft's worst error into its best clue. Always check which move
the fiction wants before reaching for the eraser.
- **Mine the draft's own margins for pregens.** The strongest pregen is often
already in the text as a named-but-unused NPC (Dr. Lyle was the draft's own
"recent collaborator"). Lift them before inventing.
- **When two source layers contradict (prose vs app data), reconcile so both
are true** — Braddock "too afraid to act" AND "cult member" became a
coerced member, which was stronger than either. Contradictions are usually
two halves of a better fact.
## 2026-07 — The Con Desk (multi-slot convention tooling)
- **A convention weekend needs ONE entry point.** When several scenarios each
have their own GM console, build a hub with the con's real schedule baked
in: live-clock "up next / live now" badges, one-tap launches, and per-slot
pack-the-bag checklists. Every console gets a ⌂ link home. The hub's
relative links mean the whole repo folder must travel to the tablet
together — say so in the README.
- **A contrarian pass earns its keep on the moves the GM prays nobody makes.**
"Cross the river NOW" and "we go back for the van" were both one-line hooks
until dice forced them; both became the best unwritten scenes. If a hook
can be driven to, it needs a written destination and its cost said aloud.
## 2026-07 — Vain Crown big-table heroes (fixed-class-list systems)
- **When the system has a closed class list, big-table pregens are variant
builds, not new classes.** Differentiate inside the class: a different
fighting style (sword-and-board Bram vs two-handed Hedda), a different
lane emphasis (stealth-killer Pinch vs thrown-blade showman Marlo), a
different creed/spell loadout (sustain Wren vs control grave-warden
Tobin). Show the audit math so the variants are provably legal.
- **Point the new Vices at the existing roster.** "A Rival — [existing PC]"
only fires at player counts where both are dealt, which big-table extras
guarantee. Doctrinal Pride vs the other cleric's creed, and a Glory-Hound
pairing, gave every added seat built-in table chemistry for free.
- **Scale the set-piece with the roster on the card.** The deal-order note
(6th/7th/8th) plus boss Grit per extra hero and mook multiplier lives ON
the GM cut-out corner of the last hero card page, not buried in the doc.
## 2026-07 — RUNDOWN cardless chase system (Blade Runner, house subsystem)
- **Do the expected-value arithmetic before committing to a subsystem.** A
spec self-review pass that actually computed the dice maths caught two dead
mechanics that read fine in prose: a role structure where the pursuers' net
was ~0.00 per round (the chase could literally never end), and a support role
worth +0.24 successes when simply doubling up on the main role was worth
+0.57 — nobody would ever have picked it. Prose hides both. One script found
both in a minute.
- **A role that spends a resource needs a role that refunds it.** Four roles
only became an economy once the support role was recast from "adds successes"
to "buys off the cost the aggressive role generates". Test any new role menu
by asking what each option *trades*, not what it *does* — if two options
trade the same thing, one of them is decoration.
- **Check whether the rules you're replacing already contain the escape
hatch.** The published Blade Runner chase ships a die table as an alternative
to its own obstacle deck, so "make it cardless" was already solved in the
book. The real brief was the other four problems (idle players, no
accumulating state, generic obstacles, lookup load). Always ask what the
request is *actually* for before designing to its literal wording.
- **When a house subsystem gets a digital aid, test the aid headlessly.** A
~60-line stub-DOM harness in Node drove the real console module through every
state transition (clamping, round cap, overtime drift, undo) with no browser
and no dependencies. Worth it: two of the "failures" it surfaced were the
harness lying, which is itself the thing you want to find before a
convention floor.
-71
View File
@@ -1,71 +0,0 @@
# Desk Playtest Protocol
A scenario is not "convention-ready" until it has survived desk playtests and
the fixes are applied and versioned. Three passes is the proven cadence:
full session (GM chair) → stress re-run of the weakest act → full session
(player chair, contrarian choices).
## Method
- **Full table simulation.** Run the scenario as GM *and* play every pregen as
a distinct player archetype. The proven quartet:
- the methodical veteran note-taker
- the roleplay-first talker who never reads handouts silently
- the quiet rules-literate tactician
- the lore-digger who asks "can I check…?" constantly
- **Roll dice honestly** for every contested beat (physical dice or a fair
roller). Fudged playtests produce fudged timing.
- **Log timing against the schedule** per section: planned vs actual, with the
drift explained. Note where the break landed.
- **Play the players, not the script.** Ask the obvious professional questions
("I scan her", "can I phone ahead?", "I run the face against city feeds").
Every improvised ruling the playtest forces is a hole in the text — the
written scenario must absorb it.
- Later passes go **contrarian**: split the party wrong, skip the expected
route, refuse the set-piece, shoot early. Verify the fast-tracks and
contingencies actually work.
## The playtest document
One markdown file per pass in `playtest/`:
1. **Method header** — what was simulated, which version of the scenario
2. **Play log** by section — planned/actual minutes, what landed, what
dragged, table quotes worth keeping, each problem flagged inline with ⚠
3. **Player-hat verdicts** — one line per player archetype, with a score
4. **Feedback summary / fix list** — numbered, prioritised, each fix stating
the problem, the proposed text change, and where it goes. Nothing is
rewritten inside the playtest doc itself.
## Applying fixes
- Apply fixes as a separate pass; bump the version (v1 → v2 → v2.1 …) and
record in the README which playtest's fixes each version absorbed.
- Classify every ⚠ before fixing:
- **Text hole** (a legitimate player move the scenario doesn't answer) →
write the answer into the scenario, not the GM's head
- **Timing** (a section runs hot) → pre-write the cut into the Pacing Note
- **Staging** (a scene lands only if performed a specific way — e.g. an NPC
must recite while the GM hands the card) → formalise the staging
instruction in the scene
- **Missing option** (players invented a compromise the text doesn't list) →
add it to the choices/outcomes tables
- Timing target: full run inside the time budget with the drift noted. If a
playtest lands on schedule "to the minute with zero slack", that is a
**fail** for a real table of strangers — cut deeper.
- Convention-ready = full-session playtests from both chairs inside budget,
multiple endings reached, art and handouts done, README status updated.
## Post-slot debrief (after the real convention run)
The con run is the highest-value data the system ever gets. Same day, ten
minutes, one file in `playtest/` (`<scenario>-con-run-<event>.md`):
- Timing actuals per act vs the table, and where the break landed
- Every improvised ruling (each one is a text hole — classify as above)
- Compromise endings or routes the table invented
- What confused players, what they quoted back, which handout landed hardest
- Verdict: what to fix before this scenario runs again
Then close the loop as usual: fix list → version bump → transferable lessons
appended to `lessons.md` → Graphiti.
-47
View File
@@ -1,47 +0,0 @@
# Pre-Generated Characters
Pregens are half the scenario. A con player meets the game through the sheet.
## The three tests (every roster must pass all three)
1. **Rules-accurate.** Audit every sheet against the system's build rules —
attribute/skill budgets by experience tier, derived stats, restrictions
(e.g. Blade Runner replicant rookies carry no specialties). Show the audit
math in the pregens file so errors are checkable:
`(Budget: Veteran +2 attr → INT A, EMP B; +12 skill increases ✓)`.
2. **A working party.** Each PC owns a distinct **investigation/action lane**
with minimal overlap (scene-reader, people-person, muscle/pursuit,
forensics/tech is a proven quartet). If the scenario has a set-piece, check
no PC sits skill-dead all night — rebuild the sheet or the set-piece.
Flag deliberate rebuilds of existing roster characters for review.
3. **Wired into the case.** Every PC gets a **Private (do not share)** box: a
personal seam the scenario will pull on, phrased as a question the night
will force them to answer. The best private seams make the player *decide
something about themselves* in Act Three, not just recognise a connection.
## Sheet contents (per PC)
- Name, archetype, experience tier, one-line essence in italics — the essence
line doubles as the GM's spoken pitch during Slot Zero pregen picks
- Attributes table, derived stats (show modifiers: *incl. replicant +2/−2*)
- Skills (only the ones above baseline), specialties with rules text inline
- Gear with the numbers the player needs (damage, range) — no page refs
- **Signature item** with a small mechanical hook (e.g. interact once per
session to heal 1 stress) — these produce the best unprompted table moments
- **Key memory** and **key relationship** — write relationships to NPCs and
places that appear in the scenario, so the case walks through their lives
- **Private** box (see above)
- **"Playing X"** — three bullet behaviour cues, imperative mood ("speak
second, watch first"), so a stranger can act the character in 30 seconds
## Roster-level checks
- Party seams: note which PCs pair naturally for splits, and give a
recommended 2+2 split per act (but let players choose at the table).
- Player-count scaling: state which PC drops first at fewer players (their
lane must be recoverable elsewhere), how splits adjust (2+2 → 2+1), and
what a walk-up extra plays if the system supports a +1.
- The roster file opens with goals + audit notes + errors fixed from previous
versions, so the next revision has provenance.
- Produce print-ready sheets (HTML → A4, one page per PC + a table
quick-reference page). Portraits from the scenario art set.
-71
View File
@@ -1,71 +0,0 @@
# Production Pipeline
Everything beyond the scenario text that makes a slot runnable.
## Folder & repo layout
Each scenario ships as a self-contained folder:
```
<SCENARIO>/
├── README.md # index table, status line (version, playtests, remaining prep), licence footer
├── scenarios/ # the scenario markdown (+ art/ for scenario illustrations)
├── characters/ # pregens.md, character-sheets.html, art/ (portraits)
├── handouts/ # print-ready handout pack (HTML)
├── reference/ # set-piece GM quick-reference sheets
├── playtest/ # one file per desk playtest
├── gm-utility/ # GM console app (module per scenario)
└── print/ # final print artifacts
```
- iCloud is the working copy:
`~/Library/Mobile Documents/com~apple~CloudDocs/RPGS/Conventions/<Event Year>/<Day>/<Slot>/...`
- Each event gets a **private GitHub repo** (`slaguru666/<Event><Year>`, e.g.
`Continuum2026`) as backup + cross-machine share. Commit at meaningful
checkpoints (draft, post-playtest, version bumps), not per-edit.
- Licensed settings (Blade Runner, CoC, …) stay in **private** repos with the
licence footer: "© <publisher>. Private convention play materials — not for
sale or distribution."
## Handouts & props
- IDs: `[Slot]-H[act]-[letter]` (e.g. `F2-H00-A` = Friday slot 2, pre-game,
first handout). Every handout appears in the scenario's per-act handout
tables with When Given.
- Build one **print-ready HTML pack** per scenario (A4, print margins,
background graphics on). Physical props beat screens: print guidance in the
scenario says what to hand around vs lay flat.
- The best handout tricks are *staged*: duplicated documents revealed
simultaneously, sealed items ("bag it, don't open it"), cut-out props.
Write the staging into the scenario, not just the pack.
## Artwork
- Base style: **ink sketch / pencil illustration** — hand-drawn, single-weight
line, sparse wash, negative space. Never photorealistic. Each scenario adds
one art-direction line (e.g. "heavy rain hatching").
- Asset IDs `[Slot]-ART-[##]`, tracked in the scenario's Artwork Assets table
with description, where used, and the full generation prompt (prompts are
part of the document — regeneration must be possible).
- Generate with the Midjourney bridge: `mj-gen "<prompt>"` drops a PNG on
disk. Keep alternates in an archive folder; portraits feed the character
sheets.
## GM console (`gm-utility/`)
Touch-screen GM app (static HTML, no build step) with: session clock with the
scenario's checkpoints, dice roller with system-specific push/advantage rules,
set-piece runner (e.g. chase obstacles), PC/NPC dashboards, fullscreen props,
autosaving state. Scenarios plug in as modules — when building a new scenario,
add a module rather than a new app.
## Print checklist (before the con)
- Character sheets: A4 portrait, 100% scale, one page per PC + table
quick-reference page
- Accessibility: handout body text ≥11pt (con halls are dim, eyes are tired);
the GM reads every handout aloud as it's given
- Handout pack, including any duplicated staging cards
- Set-piece GM quick-ref
- GM read-through of the final versioned scenario
- README status flipped to convention-ready with remaining-prep list emptied