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:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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]].
|
||||
@@ -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]].
|
||||
@@ -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.
|
||||
@@ -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`.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
|
||||
@@ -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]].
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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 |
|
||||
@@ -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.*
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user