GameBuddy v1 — demo

Spoiler-safe session recall for singleplayer games. v1 reference title: Sekiro.

All artifacts are real outputs of the v1 codebase, rendered against the developer's actual Sekiro game-context (49 nodes, full progression DAG, entity files with gates frontmatter). Player state is a fake playthrough seeded by replaying gamebuddy log sekiro <node> in three growing phases.

The headline shot — spoiler filter, side-by-side

The same checkpoint, rendered two ways. Left: masked (what the player sees — gated nodes omitted entirely, frontier nodes show only a type stub). Right: reveal (authoring view — the full 49-node DAG). Same code, same data; the only difference is one boolean.

Mid-game (14 observed)

Masked — player view
sekiro-mid-masked.svg
14 observed 5 frontier 30 gated — invisible
Reveal — authoring view
sekiro-mid-reveal.svg
All 49 nodes — bosses, areas, endings, items.

Map evolution — the masked view as the player progresses

Watch the green island grow and the orange frontier shift outward. The grey "gated" region behind it stays invisible to the player the whole time.

Bare — no progress yet
sekiro-bare-masked.svg
Nothing observed. The map is almost empty.
Early
sekiro-early-masked.svg
6 obs 3 fro 40 gated
Mid
sekiro-mid-masked.svg
14 obs 5 fro 30 gated
Late
sekiro-late-masked.svg
27 obs 9 fro 13 gated
Late — reveal (authoring)
sekiro-late-reveal.svg
Endings and final bosses visible. Player would never see this view.
Bare — reveal (full DAG)
sekiro-bare-reveal.svg
The complete 49-node progression — what the developer authored.

The journal — Ship-Log-style player view

One card per observed or frontier node, with type badges, first paragraph of the entity MD, and a "leads to" list. Frontier cards use stable Rumor #N handles so cross-references survive masking.

Early
sekiro-early-masked.html
8 cards
Mid
sekiro-mid-masked.html
15 cards
Late
sekiro-late-masked.html
30 cards
Late — reveal (authoring)
sekiro-late-reveal.html
Frontier cards unmasked. Comparison shot to the masked late.

The envelope — what the model actually receives

This is the structural spoiler proof. gamebuddy resume --dry-run emits the exact prompt body that would be sent to the synthesis call. Compare the entity lists across phases:

The model literally cannot leak what it was never given.

Early — 8 entities
sekiro-early.txt
16 KB
Mid — 15 entities
sekiro-mid.txt
28 KB
Late — 30 entities
sekiro-late.txt
53 KB

The .sl2 discovery

A field note from building the Sekiro save-file provider. The plan was to extract an AES key via debugger, the way the community had done it for DS3 and Elden Ring. The actual finding: there is no key. Sekiro saves are plaintext + MD5. Five-minute hex-editor session deleted two hours of planned work.

Read
sl2_discovery.md
~1200 words.

The briefing — synthesis mocked via subagent

Without an Anthropic API key we can't make the real one-shot call. Instead the late envelope (above) was handed verbatim to a Claude Opus subagent running with all tools disabled — same model class, same prompt, same "no data-fetching tools" constraint as the production call. The subagent's JSON response was then formatted through gamebuddy's own _format_summary(), so the output below is byte-identical to what gamebuddy resume sekiro --reveal would print.

Why a subagent: a fresh Claude with zero prior context is a faithful proxy for what the real API call would see. If I synthesized this in the main conversation, I'd have read the full DAG, design doc, memory, and entity files — too much context to honestly simulate the structural spoiler boundary.
Resume — masked (default)
resume-late-masked.txt
Spoiler layers replaced with [hidden — use --reveal].
Resume — reveal
resume-late-reveal.txt
Spoiler layers shown inline.
Raw subagent output (audit)
synthesis-late-mock.json
The exact JSON the subagent returned. Conforms to SUMMARY_SCHEMA from gamebuddy/synthesis.py.

What's not here