Files
vanity-delve/core/my.json
T
tevansandClaude Opus 5 47778fdbf6 The Forge: one button, a whole dungeon in the world
The brief was a tool in Foundry that generates everything on a click and injects
it as a new dungeon. Previously the module could only stage a delve authored at
the desk, and the only way in was a console command — an API with a button glued
on, which is why it looked like nothing was there.

The ⛏ button now opens a form (theme, areas, depth, heroes, deadliness, density,
greed, clock, ending, seed, and whether to build maps and roll encounters), and
Raise the dungeon builds the lot in about five seconds:

  • a folder per document type, named for the dungeon
  • one scene per area, walls and lighting placed, via the VANITY Forge
  • encounter actors, foldered rather than scattered across the world
  • a JournalEntry — GM truth, a page per area, the ending — which is the
    adventure, and is written to be read cold

The journal is the deliverable. Scenes without it are a pile of maps.

Generating is cheap, so removing had to be. Every document DELVE creates is
stamped with a dungeonId, and a 🗑 button lists what it built and deletes one
dungeon entirely — confirming with exact counts first, and never deleting the
scene the GM is standing in. Colour is not an identifier: it is a Color object,
and a GM may recolour a folder.

Verified live: two dungeons raised from the form and the API, then one removed
cleanly at -3 scenes, -10 actors, -1 journal, -3 folders with nothing else
touched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 09:27:23 +01:00

535 lines
18 KiB
JSON

{
"schema": 1,
"generatorVersion": "0.1.0",
"catalogVersion": "barrow@1",
"seed": "my-delve",
"params": {
"areas": 6,
"depth": 2,
"party": 4,
"deadliness": "standard",
"density": "standard",
"greed": "standard",
"clock": "standard",
"ending": "authored",
"theme": "barrow"
},
"skeleton": {
"placeName": "The Tomb of the Silent Margrave",
"knot": {
"appetiteId": "first",
"accommodationId": "bound",
"claimant": "Silent Margrave",
"conscript": "a procession",
"transgression": "The Silent Margrave bound a procession by oath they could not break, so that someone would always go behind them.",
"cruelty": 2
},
"motif": {
"id": "precedence",
"danger": "procession",
"dangerLine": "the barrow keeps its order, and you have joined the queue",
"trigger": "announced"
},
"prize": {
"kind": "regalia",
"label": "the crown worn first, and only once",
"function": "the proof of precedence"
},
"bottomProblem": {
"label": "The Silent Margrave",
"wantNow": "to be first in all things",
"failureState": "is second now, and cannot bear it",
"handledBy": "giving them what they want, at a price"
},
"appeasement": {
"move": "stand aside and let it go ahead of you",
"attribute": "Poise",
"successes": 2,
"why": "it goes first",
"gain": {
"vanity": 1
},
"cost": {
"bane": 1
},
"repeatable": true,
"faction": "The Silent Host"
},
"factions": [
{
"id": "host",
"name": "The Silent Host",
"kind": "undead",
"essence": "still performing the ritual they were buried for",
"handledBy": "courtesy",
"conscriptedAs": "a procession"
},
{
"id": "wardens",
"name": "the Barrow-Wardens",
"kind": "undead",
"essence": "sealed this place and stayed to make sure",
"handledBy": "proof of right"
}
],
"foreshadow": [
{
"index": 1,
"role": "approach",
"facet": "institution",
"fragment": "numbered flagstones, counting down"
},
{
"index": 2,
"role": "complication",
"facet": "ritual",
"fragment": "banners in sequence, each house a place further back"
},
{
"index": 3,
"role": "complication",
"facet": "ritual",
"fragment": "a herald's script with the order still marked"
},
{
"index": 4,
"role": "turn",
"facet": "demand",
"fragment": "a door only one person may pass at a time, and only first"
},
{
"index": 5,
"role": "descent",
"facet": "wound",
"fragment": "a name moved to the front by force, repeatedly"
},
{
"index": 6,
"role": "threshold",
"facet": "anchor",
"fragment": "the crown worn first, and only once"
},
{
"index": 7,
"role": "ending",
"facet": "demand",
"fragment": "a corridor that will not let two walk abreast"
}
]
},
"areas": [
{
"index": 1,
"role": "approach",
"name": "The Outer Cut",
"facet": "institution",
"cueFragments": [
"numbered flagstones, counting down",
"the queue disturbed — three of the dead pushed aside"
],
"situation": {
"occupant": "two of the Host",
"doing": "refusing, each of them, to go through a door second",
"onArrival": "they both look at you to break it",
"because": "neither may be seen to yield",
"offer": "rule between them and the loser attaches to you as a lesser"
},
"truth": "This is how the place was ordered, and it still is",
"decision": {
"cue": "banners in strict order, and one you could move",
"cost": "reordering them opens a way and insults everyone buried here",
"resolve": {
"roll": "Wits 2",
"success": "you reorder them correctly and a way opens",
"failure": "you reorder wrongly and insult everyone buried here: +1 Bane",
"orElse": "leave them: the way stays shut, one Turn to find another"
}
},
"encounter": null,
"hoard": null,
"temptation": null,
"trigger": "disturbed",
"baneBeat": "noticing",
"clue": {
"automatic": "numbered flagstones, counting down — and it was done deliberately",
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
},
"failureCase": "If they skip this, move its cue fragment into the next area so the motif still completes.",
"fallback": {
"route": "The Silent Host will receive anyone who behaves as a guest",
"cost": "one Bane on the tab, and they will expect it again"
}
},
{
"index": 2,
"role": "complication",
"name": "The Waiting Room",
"facet": "ritual",
"cueFragments": [
"banners in sequence, each house a place further back",
"a rank-plate prised off and dropped, still shiny where it sat"
],
"situation": {
"occupant": "a procession",
"doing": "passing through, unhurried, with you in its way",
"onArrival": "it does not stop or go round",
"because": "it has right of way and has had for three centuries",
"offer": "stand aside and be counted courteous; join it and be counted one of them"
},
"truth": "The office is still being performed, for someone who is no longer served by it",
"decision": {
"cue": "a corridor that will not let two walk abreast",
"cost": "whoever goes first meets whatever is there first",
"resolve": {
"roll": "Poise 1",
"success": "you settle the order and whoever leads meets what is there, ready",
"failure": "you argue in the corridor and something arrives while you do",
"orElse": "send one scout: slow, one Turn, and they are alone"
}
},
"encounter": null,
"hoard": "pocket",
"temptation": {
"id": "herald",
"cue": "a herald's script with your name pencilled in",
"benefit": "once, be announced as whatever you claim",
"useCost": {
"bane": 1
},
"standingDrawback": "you must live up to it in front of the Host"
},
"trigger": "seenTwice",
"baneBeat": "noticing",
"clue": {
"automatic": "banners in sequence, each house a place further back — and it was done deliberately",
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
},
"failureCase": "If they skip this, move its cue fragment into the next area so the motif still completes.",
"fallback": {
"route": "The Silent Host will receive anyone who behaves as a guest",
"cost": "one Bane on the tab, and they will expect it again"
}
},
{
"index": 3,
"role": "complication",
"name": "The Attendants' Row",
"facet": "ritual",
"cueFragments": [
"a herald's script with the order still marked",
"someone has walked the corridor the wrong way, scuffing one side"
],
"situation": {
"occupant": "a living robber",
"doing": "prising number-plates off the flagstones",
"onArrival": "they freeze, then offer you one",
"because": "they worked out the order is what keeps the doors shut",
"offer": "take a plate and go first anywhere — the Host will hate you for it"
},
"truth": "The office is still being performed, for someone who is no longer served by it",
"decision": {
"cue": "a door that opens only for the foremost of a party",
"cost": "someone must be named first, aloud, and the others must accept it",
"resolve": {
"roll": "Flair 2",
"success": "someone is named first, aloud, and the door opens for them",
"failure": "the naming is disputed and the door reads that as no answer",
"orElse": "let the barrow choose: it picks the loudest, and remembers"
}
},
"encounter": {
"heat": "fight",
"kind": "undead",
"roster": {
"line": "1 Ghoul and 2 Skeletons",
"foes": [
{
"n": 1,
"name": "Ghoul",
"atk": 4,
"def": 3,
"grit": 4,
"nerve": 5,
"note": "on a hit, a free Called Shot to freeze for a round"
},
{
"n": 2,
"name": "Skeleton",
"atk": 3,
"def": 2,
"grit": 1,
"nerve": 5,
"note": "fearless"
}
],
"harmedBy": "anything",
"avoid": "the Ghoul goes for court dress first — send someone plain"
}
},
"hoard": "cache",
"temptation": {
"id": "rankplate",
"cue": "a rank-plate prised off something and pocketed",
"benefit": "go first through any door the barrow guards",
"useCost": {
"bane": 1
},
"standingDrawback": "going first is now expected of you"
},
"trigger": "loud",
"baneBeat": "noticing",
"clue": {
"automatic": "a herald's script with the order still marked — and it was done deliberately",
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
},
"failureCase": "If they skip this, move its cue fragment into the next area so the motif still completes.",
"fallback": {
"route": "The Silent Host will receive anyone who behaves as a guest",
"cost": "one Bane on the tab, and they will expect it again"
}
},
{
"index": 4,
"role": "turn",
"name": "The Middle Vault",
"facet": "demand",
"cueFragments": [
"a door only one person may pass at a time, and only first",
"a seat at the head of the hall dragged back, as if to sit in"
],
"situation": {
"occupant": "a queue of the Host",
"doing": "waiting to pass a door, in strict order, not moving",
"onArrival": "the queue opens a gap at exactly your rank",
"because": "the first in line is waiting for someone who never arrived",
"offer": "take the gap and go with them; take the front and they will remember it"
},
"truth": "Here the want is explicit — the place asks something of whoever enters",
"decision": {
"cue": "a claim to settle: which of you the barrow should address",
"cost": "settling it opens the way; refusing to settle it does not",
"resolve": {
"roll": "Poise 2",
"success": "the claim is settled and the barrow addresses one of you from now on",
"failure": "it is not settled, and the barrow keeps asking, in worse places",
"orElse": "refuse to settle: the way on does not open"
}
},
"encounter": null,
"hoard": null,
"temptation": null,
"trigger": "announced",
"baneBeat": "noticing",
"clue": {
"automatic": "a door only one person may pass at a time, and only first — and it was done deliberately",
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
},
"failureCase": "If they skip this, move its cue fragment into the next area so the motif still completes.",
"fallback": {
"route": "The Silent Host will receive anyone who behaves as a guest",
"cost": "one Bane on the tab, and they will expect it again"
}
},
{
"index": 5,
"role": "descent",
"name": "The Lower Cut",
"facet": "wound",
"cueFragments": [
"a name moved to the front by force, repeatedly",
"a numbered flagstone lifted and not replaced"
],
"situation": {
"occupant": "one of the Host with a herald's staff",
"doing": "announcing arrivals to an empty stair",
"onArrival": "it announces you, inventing a rank",
"because": "the post requires arrivals and there have been none",
"offer": "accept the invented rank and the barrow will treat you as it"
},
"truth": "This is the damage the want did to those who had to satisfy it",
"decision": {
"cue": "a stair where the order of descent is visibly recorded",
"cost": "whoever goes last is remembered as having gone last",
"resolve": {
"roll": "Poise 2",
"success": "you settle the order before you descend and the record reads as a party, not a rabble",
"failure": "you descend in a scramble: whoever is recorded last is treated as least by the Host from here",
"orElse": "descend however you like and accept the record as it falls"
}
},
"encounter": null,
"hoard": null,
"temptation": null,
"trigger": "announced",
"baneBeat": "noticing",
"clue": {
"automatic": "a name moved to the front by force, repeatedly — and it was done deliberately",
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
},
"failureCase": "If they skip this, move its cue fragment into the next area so the motif still completes.",
"fallback": {
"route": "The Silent Host will receive anyone who behaves as a guest",
"cost": "one Bane on the tab, and they will expect it again"
}
},
{
"index": 6,
"role": "threshold",
"name": "The Last Door",
"facet": "anchor",
"cueFragments": [
"the crown worn first, and only once",
"banners pulled down and stacked without regard for order"
],
"situation": {
"occupant": "one of the Host",
"doing": "reading out an order of precedence to an empty hall",
"onArrival": "it pauses and asks where you fall in it",
"because": "the list must be read in full before anyone may proceed",
"offer": "name your own place in the order and it will be honoured, exactly"
},
"truth": "The thing the whole barrow is arranged around is close",
"decision": {
"cue": "a queue of the dead, and a way to step round it",
"cost": "waiting costs two Turns; pushing in costs the Host's patience",
"resolve": {
"roll": "Poise 2",
"success": "you step round without breaking the order, and the Host allows it",
"failure": "you push in: +1 Bane and the queue closes behind you",
"orElse": "wait: two Turns, and the Host thinks better of you"
}
},
"encounter": {
"heat": "battle",
"kind": "undead",
"roster": {
"line": "1 Wraith and 3 Skeletons",
"foes": [
{
"n": 1,
"name": "Wraith",
"atk": 5,
"def": 3,
"grit": 10,
"nerve": 5,
"note": "INCORPOREAL — chill touch ignores armour and drains 1 max Grit"
},
{
"n": 3,
"name": "Skeleton",
"atk": 3,
"def": 2,
"grit": 1,
"nerve": 5,
"note": "fearless"
}
],
"harmedBy": "blessed, silvered or magical weapons ONLY",
"avoid": "it will take an appeasement over a fight every time"
}
},
"hoard": "chest",
"temptation": {
"id": "coronet",
"cue": "a small crown, sized for someone who never grew",
"benefit": "+1 die when others must defer to you",
"useCost": {
"bane": 1
},
"standingDrawback": "you must be addressed correctly or lose the benefit"
},
"trigger": "announced",
"baneBeat": null,
"clue": {
"automatic": "the crown worn first, and only once — and it was done deliberately",
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
},
"failureCase": "If they skip this, the ending opens with them holding nothing the bottom problem wants.",
"fallback": {
"route": "The Silent Host will receive anyone who behaves as a guest",
"cost": "one Bane on the tab, and they will expect it again"
}
}
],
"ending": {
"index": 7,
"role": "ending",
"mode": "authored",
"heat": null,
"hoard": null,
"name": "The Audience",
"cueFragments": [
"a corridor that will not let two walk abreast"
],
"question": "\"Who goes first?\"",
"authored": true
},
"triggerGlossary": {
"announced": "entered somewhere grandly — the big doors, a shout, a herald",
"seenTwice": "reflected, echoed or witnessed twice over in one place",
"loud": "a raised voice, a broken door, steel on stone",
"lingering": "stayed in one place longer than it takes to search it",
"disturbed": "struck or moved something that had not moved in centuries"
},
"budget": {
"plannedFights": 2,
"heatBase": "fight",
"wantFights": 2
},
"pressure": {
"turn": 0,
"clockRolls": 0,
"clockFired": 0,
"triggerNumber": 1,
"escalated": false,
"tab": 5,
"target": 5
},
"authored": {
"title": null,
"intro": null,
"areas": {
"1": {
"readAloud": null,
"notes": null,
"nameOverride": null,
"locked": []
},
"2": {
"readAloud": null,
"notes": null,
"nameOverride": null,
"locked": []
},
"3": {
"readAloud": null,
"notes": null,
"nameOverride": null,
"locked": []
},
"4": {
"readAloud": null,
"notes": null,
"nameOverride": null,
"locked": []
},
"5": {
"readAloud": null,
"notes": null,
"nameOverride": null,
"locked": []
},
"6": {
"readAloud": null,
"notes": null,
"nameOverride": null,
"locked": []
}
},
"ending": {
"readAloud": null,
"notes": null,
"locked": []
}
}
}