Chronicles · Advanced · Tutorial 3 of 3
Four files leave this tool.
Only one of them is the game's.
Chronicles writes four different files out of the same project, three of them named almost identically, at three different fidelities. Knowing which one matters — and knowing which of its checks is a check and which is only a count — is the whole of this tier.
What this tier is about
The first two tiers stayed inside one record at a time: a quest, then a conversation. Advanced is about the body of work — how the pieces refer to each other, what the tool will tell you about them, and what actually leaves the building.
You will deliberately break a cross-reference, watch validation pass anyway, and read the number
that looks like proof and isn't. Then you will learn which of the four output files the game reads,
and which one Test in Crucible actually hands over.
Before you start
Open Chronicles from the Hub with the demo project loaded — two quests, one dialogue, one lore entry. Nothing here needs the game installed.
One habit to bring: read the log line after every button. All five export buttons report to the log and nowhere else — no dialog on success, none on failure.
The Lore tab
The hint that isn't a link
Lore is where a narrative stops being a list of records and starts being a world. It is also where Chronicles quietly stops checking your work — and the demo entry demonstrates the trap all by itself.
Drill01
Open Lore → The Ashfall
- Switch to the Lore tab and select the one demo entry.
- Read the Category dropdown:
History. - Read the Content body: “When the sky burned, the old world ended…”
- Now read the last three fields together — they are the reason this tier exists.
Done whenYou can say which of those three fields the game will ever read.
The three fields01b
Two are data. One is a note to yourself.
- Unlock Hint / Conditions — reading
Complete First Contact - Related Quests (names/IDs, one per line) — empty
- Related Dialogues (names/IDs, one per line) — empty
NoticeThe entry claims a dependency in prose while the field that would record it is blank.
The entry says in prose that it depends on First Contact — a quest that exists, two tabs over — while the machine-readable field that would record that relationship is empty. This is the same split the beginner tier found inside a single objective row, one level up.
The prose says one thing, the data says another, and only the data ships. Anything you write in Unlock Hint is a note to yourself.
Validation, and its edge
A count is not a check
Tutorial two ended on Validate catching a dangling NextNodeId, and
called it the check that earns its keep. Here is the boundary of that
praise — and you are going to find it by hand rather than take it on trust.
Point lore at a quest that does not exist
- In Related Quests, type a quest name that is nowhere in the project —
The Quest That Never Was. the field is free text, so nothing stops you - Click away so the edit commits, then press Validate. Chronicles auto-saves on blur; validating a stale buffer proves nothing
- Read the result. Then press Generate Report and open the
.txtit names in the log. the report is where the cross-reference finally shows up — as a number
Narrative validation passed (no issues).
With a lore entry pointing at a quest that has never existed. Now the report:
AshForge Chronicles Narrative Report
Mod: Unnamed Mod Generated: 2026-08-29T06:27:54Z
Quests: 2
- First Contact (Easy) : 2 objs, 1 rewards
- The Lost Cache (Medium) : 3 objs, 2 rewards
Dialogues: 1
- Elder Greeting : 1 nodes, 2 choices
Lore: 1
- The Ashfall [History] links Q:1 D:0
The report counts strings, not connections. links Q:1 means
“one line of text is in this box”. It does not mean the line points at anything.
Validate never looks at the cross-references at all — for lore it asks two questions, is
there a title and is there a body, and that is the entire rule.
So the number that looks most like verification is the one doing least of it. Rename a quest and every lore entry naming it goes quietly stale, with the count unchanged and validation still green.
The same tool, opposite decisions
| Cross-reference | Checked? | Why |
|---|---|---|
choice → NextNodeId | Yes | Nodes have generated ids, so a choice can only mean one node. |
lore → Related Quests | No | Free text, “names/IDs”, one per line. Nothing to resolve against. |
lore → Related Dialogues | No | Same field type, same reason. |
Unlock Hint | No | Prose. Never parsed by anything. |
The export seam
Three files, three fidelities
Five buttons sit along the header: Export Bundle, Test in Crucible,
Export Narrative, Generate Report, Merge Bundle. Three of them write files,
into user://output — and every one reports only to the log. No dialog, no
toast. If you don't read the log line, you don't know where it went.
Figure 01 — the export seam One button writes two files, and the flag named --definitions will happily be handed a file that isn't a definition bundle.
The differences are real, not cosmetic. _narrative.json is the project serialized
whole — the safest thing to archive, the wrong thing to ship.
_narrative_runtime.json is built field by field for loading: quests keep
structured objectives with their type, target and seconds
intact.
_definitions.json is the suite-wide handoff contract, and it is the lossy
one. Objectives collapse into plain strings — the objective's description if it has one,
otherwise type:target — and prerequisites, status and notes aren't in the
bundle shape at all. That is a deliberate contract boundary, not a bug, but it means a round
trip through the bundle is not a round trip through your work.
_narrative.json somewhere
dated yourself.Test in Crucible
Whatever you touched last
The button looks like it knows what your project is. It doesn't — it knows what you pressed most recently.
Drill04
Watch the argument change
- Press Export Bundle, then Test in Crucible. Read the log line.
- Press Export Narrative, then Test in Crucible again.
- Read it a second time. The argument is different.
Done whenYou can predict the argument before pressing the button.
The rule04b
It chooses in this order
- The project's mod root if one is set →
--mod - Otherwise the last file any export button wrote →
--definitions - Otherwise →
--help
NoticeThe third case fails silently — Crucible opens on its help text and nothing says why.
Both Export Bundle and Export Narrative update that “last exported” slot, so the flag is stable but its argument isn't. Export the narrative last and Crucible receives the whole-project dump under a flag that names the bundle. And the runtime file — written in the very same click, and the one actually shaped for loading — is never what gets passed.
ModRoot populated the
button always passes --mod and never consults the export slot at all. If you're
testing repeatedly, set it once and stop thinking about button order. If you're not, press the
export you mean immediately before Test, every time.Ending a session
A shipping pass
None of this is enforced by the tool. All of it is the tool's shape.
The end-of-work sequence
- Validate. it catches dangling dialogue links and empty required fields — necessary, and not sufficient
- Generate Report and read the lore lines. Compare each
links Q:nagainst the quests you know exist. this is a manual reconciliation and there is no substitute for it - Export Narrative. You get the archive copy and the runtime copy in one press. Ship
_narrative_runtime.json. one button, two files, only one of them the game's - Copy the archive somewhere dated. the next export overwrites it in place
- Test in Crucible last — or set a mod root and skip the worry. so the export slot holds what you think it holds
- Read the log after every one of these. all five buttons succeed and fail silently in the UI
When it goes wrong
| Symptom | What it actually means | Fix |
|---|---|---|
| Validation is green but a lore link goes nowhere | Validate never resolves cross-references — for lore it only checks title and body. | Reconcile links Q:n against real quests by hand, in the report. |
Report shows links Q:1 for a quest you renamed |
The count is the number of lines in the box, not the number of targets that exist. | Treat a rename as a two-file edit; search lore for the old title. |
| Crucible opens on its help text | No mod root, and no export has been pressed this session. | Set ModRoot, or export immediately before pressing Test. |
| The game ignores objectives you structured | You shipped _definitions.json — objectives are flattened to strings there. |
Ship _narrative_runtime.json instead. |
| Yesterday's export is gone | Exports overwrite in place; only reports are timestamped. | Copy _narrative.json to a dated file after each session. |
| Nothing appeared to happen when you pressed a button | It probably worked. Every export reports to the log and nowhere else. | Read the log line; it names the full output path. |
Chronicles ladder complete
What you now know
Check yourself
- Lore's Unlock Hint is prose and ships as prose; only Related Quests and Dialogues are data, and they are free text accepting “names/IDs”.
- Validate checks lore for a title and a body. Nothing else. Cross-references are never resolved.
links Q:1counts lines in a box, not connections that exist — verified by pointing lore at a quest that was never created.- Three buttons write four files at three fidelities;
_definitions.jsonis lossy by contract,_narrative_runtime.jsonis the one to ship. - Reports accumulate; exports overwrite. Archive deliberately.
- Test in Crucible passes the last-exported path, or the mod root if set, or
--helpif neither. - Every button reports to the log and nowhere else.
That closes the Chronicles ladder: a quest's structure, a conversation's branches, and the seam between what you author and what leaves the building.
