diff --git a/CLAUDE.md b/CLAUDE.md index cd3134f..fc53abb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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 `.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 ""` (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 diff --git a/memory/MEMORY.md b/memory/MEMORY.md index 4225d1d..2d67275 100644 --- a/memory/MEMORY.md +++ b/memory/MEMORY.md @@ -2,19 +2,10 @@ - [Midjourney bridge](midjourney_bridge.md) — `mj-gen ""` 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/.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. diff --git a/memory/afterimage-scenario.md b/memory/afterimage-scenario.md deleted file mode 100644 index 20602f8..0000000 --- a/memory/afterimage-scenario.md +++ /dev/null @@ -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]]. diff --git a/memory/blueprint-news.md b/memory/blueprint-news.md deleted file mode 100644 index 2b89174..0000000 --- a/memory/blueprint-news.md +++ /dev/null @@ -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]]. diff --git a/memory/canvas_oss_course.md b/memory/canvas_oss_course.md deleted file mode 100644 index 580622a..0000000 --- a/memory/canvas_oss_course.md +++ /dev/null @@ -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. diff --git a/memory/clipsync.md b/memory/clipsync.md deleted file mode 100644 index 6711093..0000000 --- a/memory/clipsync.md +++ /dev/null @@ -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 `-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:-, 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`. diff --git a/memory/gmtool-director.md b/memory/gmtool-director.md deleted file mode 100644 index dad5486..0000000 --- a/memory/gmtool-director.md +++ /dev/null @@ -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** (`` + -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 `` (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. diff --git a/memory/mapwright-module.md b/memory/mapwright-module.md deleted file mode 100644 index ff85618..0000000 --- a/memory/mapwright-module.md +++ /dev/null @@ -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. diff --git a/memory/midjourney_bridge.md b/memory/midjourney_bridge.md index 2222579..03eb603 100644 --- a/memory/midjourney_bridge.md +++ b/memory/midjourney_bridge.md @@ -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. diff --git a/memory/princes-bride-scenario.md b/memory/princes-bride-scenario.md deleted file mode 100644 index b5508b7..0000000 --- a/memory/princes-bride-scenario.md +++ /dev/null @@ -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]]. diff --git a/memory/rpg-skill.md b/memory/rpg-skill.md deleted file mode 100644 index 2a93571..0000000 --- a/memory/rpg-skill.md +++ /dev/null @@ -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). diff --git a/settings.json b/settings.json index 36e36ba..abcb4f0 100644 --- a/settings.json +++ b/settings.json @@ -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" } diff --git a/skills/convention-scenario-tooling/SKILL.md b/skills/convention-scenario-tooling/SKILL.md index 17ddc69..13a9524 100644 --- a/skills/convention-scenario-tooling/SKILL.md +++ b/skills/convention-scenario-tooling/SKILL.md @@ -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 diff --git a/skills/convention-scenario-tooling/app-editions-and-deploy.md b/skills/convention-scenario-tooling/app-editions-and-deploy.md index faba451..e51fe68 100644 --- a/skills/convention-scenario-tooling/app-editions-and-deploy.md +++ b/skills/convention-scenario-tooling/app-editions-and-deploy.md @@ -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: diff --git a/skills/convention-scenario-tooling/scenario-authoring.md b/skills/convention-scenario-tooling/scenario-authoring.md index 64e7540..07434ac 100644 --- a/skills/convention-scenario-tooling/scenario-authoring.md +++ b/skills/convention-scenario-tooling/scenario-authoring.md @@ -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 diff --git a/skills/rpg/SKILL.md b/skills/rpg/SKILL.md deleted file mode 100644 index 2df2d10..0000000 --- a/skills/rpg/SKILL.md +++ /dev/null @@ -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//...` - 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: "`. - 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 ""` (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 | diff --git a/skills/rpg/assets/scenario-template.md b/skills/rpg/assets/scenario-template.md deleted file mode 100644 index f3384c8..0000000 --- a/skills/rpg/assets/scenario-template.md +++ /dev/null @@ -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.* diff --git a/skills/rpg/references/campaign.md b/skills/rpg/references/campaign.md deleted file mode 100644 index f80de35..0000000 --- a/skills/rpg/references/campaign.md +++ /dev/null @@ -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. diff --git a/skills/rpg/references/convention-one-shot.md b/skills/rpg/references/convention-one-shot.md deleted file mode 100644 index b44d724..0000000 --- a/skills/rpg/references/convention-one-shot.md +++ /dev/null @@ -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. diff --git a/skills/rpg/references/craft.md b/skills/rpg/references/craft.md deleted file mode 100644 index 34bf1e8..0000000 --- a/skills/rpg/references/craft.md +++ /dev/null @@ -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. diff --git a/skills/rpg/references/lessons.md b/skills/rpg/references/lessons.md deleted file mode 100644 index efab0d3..0000000 --- a/skills/rpg/references/lessons.md +++ /dev/null @@ -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. diff --git a/skills/rpg/references/playtest.md b/skills/rpg/references/playtest.md deleted file mode 100644 index bc6b5cb..0000000 --- a/skills/rpg/references/playtest.md +++ /dev/null @@ -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/` (`-con-run-.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. diff --git a/skills/rpg/references/pregens.md b/skills/rpg/references/pregens.md deleted file mode 100644 index 101598c..0000000 --- a/skills/rpg/references/pregens.md +++ /dev/null @@ -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. diff --git a/skills/rpg/references/production.md b/skills/rpg/references/production.md deleted file mode 100644 index 514f548..0000000 --- a/skills/rpg/references/production.md +++ /dev/null @@ -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: - -``` -/ -├── 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////...` -- Each event gets a **private GitHub repo** (`slaguru666/`, 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: "© . 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 ""` 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