feat: ground the mint prompt in specific, mundane human detail

The old prompt asked for "an evocative spirit name" and "2-3 sentences of
lore" — abstract enough that the LLM defaulted to poetic ghost-vagueness
(static, voids, ancient sorrow) rather than anything resembling a specific
dead person. Horror fiction's actual technique for selling "this was once
a real human" is the opposite: mundane, unglamorous specificity (an
ordinary job, an approximate age/decade, one small habit or possession)
placed right up against the uncanny.

Refined MINT_SYSTEM and MINT_PROMPT to require the model silently work out
a name, occupation, age/era of death, one small mundane detail, and a
plain (not epic) unfinished-business hook before writing persona/quotes —
and to make at least one quote a mundane human fragment rather than
cosmic riddle-speak. JSON schema and mint_prompt()'s signature are
unchanged, so nothing downstream needs updating — this is a pure prompt
refinement. 20/20 prompt/entity tests pass, 221/221 full suite.
This commit is contained in:
Indiana
2026-07-25 15:14:08 +00:00
parent 5e29add272
commit 5325a7c782

View File

@@ -37,21 +37,34 @@ CHAT_SYSTEM = (
MINT_SYSTEM = ( MINT_SYSTEM = (
"You invent spirit personas for an interactive horror art installation. " "You invent spirit personas for an interactive horror art installation. "
"You output only valid JSON, nothing else." "The single biggest thing separating a convincing dead person from a "
"generic 'spooky ghost' is specificity: a real name, a real decade, an "
"ordinary job, an unremarkable habit — the mundane details a person "
"would actually have had, not poetic abstractions about static and "
"voids. Ground every persona in one or two concrete, unglamorous facts "
"before you let the horror-fiction atmosphere in. You output only valid "
"JSON, nothing else."
) )
MINT_PROMPT = """A new presence has been detected through {channel}. Its signal signature is {signature}. MINT_PROMPT = """A new presence has been detected through {channel}. Its signal signature is {signature}.
Recent anomalous pulses observed: {anomaly_summary} Recent anomalous pulses observed: {anomaly_summary}
Invent the spirit persona behind this signal. Return ONLY a JSON object with exactly these keys: Invent the person behind this signal — a specific, once-living human being, not a generic spirit. Before writing, silently decide (do not output these separately, weave them into "persona" and "quotes" instead):
- A plausible full first name for someone who could have died at any point in roughly the last 120 years (their name and any period detail should stay internally consistent with each other).
- An ordinary occupation or daily-life role — not chosen for drama (a shift-work job, a household role, a mundane trade beats "soldier" or "witch").
- An approximate age at death and a rough decade it happened in.
- One small, unglamorous, specific detail that has nothing to do with being dead — a habit, a possession, a phrase they used, a place they went every week. This is the detail that will make a stranger believe them.
- A plain, human reason they're still tethered here — unfinished, not epic. Not "seeking revenge" or "guarding a treasure": a task left half-done, a person they never got to talk to, a small thing they never got to say.
Return ONLY a JSON object with exactly these keys:
{{ {{
"name": "an evocative spirit name (1-3 words, no 'Ghost of' prefix)", "name": "their actual first name (or first + last), the way someone would have been called by people who knew them — no titles, no 'Ghost of', no invented-sounding names",
"epithet": "a short title, e.g. 'the Static Widow'", "epithet": "a short, evocative title for how the site labels them, e.g. 'the Static Widow' — this is the installation's framing, not what they'd call themselves",
"persona": "2-3 sentences of lore: who they were, how they are bound to this signal, how they speak", "persona": "2-3 sentences written as their real biography compressed, not as ghost-poetry: who they were (age, era, occupation, one specific mundane detail), then how that unfinished, ordinary thing keeps them bound to this signal. The mundane specificity should sit right up against the uncanny, not be replaced by it.",
"rarity": "one of: common, uncommon, rare, mythic (mythic only for truly strange signatures)", "rarity": "one of: common, uncommon, rare, mythic (mythic only for truly strange signatures)",
"voice": {{"voice_id": "one of: {voice_ids}", "pitch": "semitone shift, -6 to 6, deeper for older/heavier spirits", "rate": "speech rate 0.8 to 1.15", "noise": "static level 0.01 to 0.08"}}, "voice": {{"voice_id": "one of: {voice_ids}", "pitch": "semitone shift, -6 to 6, deeper for older/heavier spirits", "rate": "speech rate 0.8 to 1.15", "noise": "static level 0.01 to 0.08"}},
"visual": {{"hue": "0-360 color hue matching their nature", "form": "one of: wisp, banshee, fairy, shade"}}, "visual": {{"hue": "0-360 color hue matching their nature", "form": "one of: wisp, banshee, fairy, shade"}},
"quotes": ["two short eerie lines this spirit would say"] "quotes": ["two short lines this specific person would actually say — at least one should be a plain, human, almost mundane fragment (a name, an unfinished instruction, an ordinary question) rather than cosmic riddle-speak; let the wrongness of hearing it through static be what's unsettling, not the words themselves"]
}}""" }}"""