AChronicles / What the Game Actually Reads Advanced · 5 lessons

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.

Application  AshForge Chronicles Comes after  Making It Branch Format  read → break → diagnose → ship Time  ~40 min

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.

01

The Lore tab

The hint that isn't a link

Read Lore tab ~8 min

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
  1. Switch to the Lore tab and select the one demo entry.
  2. Read the Category dropdown: History.
  3. Read the Content body: “When the sky burned, the old world ended…”
  4. 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.

Key

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.

Note
Read the field label too: names/IDs. It accepts either. That flexibility is exactly why nothing downstream can verify it — a title isn't an id, so there is no single thing to look the entry up by.
02

Validation, and its edge

A count is not a check

Break it Validate Generate Report ~12 min

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.

Do this

Point lore at a quest that does not exist

  1. 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
  2. Click away so the edit commits, then press Validate. Chronicles auto-saves on blur; validating a stale buffer proves nothing
  3. Read the result. Then press Generate Report and open the .txt it 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
Stop

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.

02b

The same tool, opposite decisions

Cross-referenceChecked?Why
choice → NextNodeIdYes Nodes have generated ids, so a choice can only mean one node.
lore → Related QuestsNo Free text, “names/IDs”, one per line. Nothing to resolve against.
lore → Related DialoguesNo Same field type, same reason.
Unlock HintNo Prose. Never parsed by anything.
Fix
Paste the quest's exact title into Related Quests, and treat renaming a quest as a two-file edit — rename it, then search your lore for the old name. The tool will not remind you. Clear the bogus entry now and re-run Validate before moving on.
03

The export seam

Three files, three fidelities

Read 5 header buttons ~10 min

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.

PRESS WRITES WHAT'S IN IT Export Bundle Export Narrative Generate Report _definitions.json _narrative.json _narrative_runtime.json _report_<ts>.txt · .json · .html lossy — objectives flattened to strings; no prerequisites or status the entire project object, editor state and all the flattened, game-ready shape — this is the one to ship for you, not for the game (the .json omits the link counts) Test in Crucible → launches with --definitions <whichever file you exported last> nothing exported and no mod root set? it launches Crucible with --help

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.

Careful
Don't archive from the report. Reports are timestamped, so they accumulate rather than overwrite — every press leaves three more files behind. The exports overwrite in place. If you want a snapshot of a day's work, copy _narrative.json somewhere dated yourself.
04

Test in Crucible

Whatever you touched last

Diagnose Crucible handoff ~6 min

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
  1. Press Export Bundle, then Test in Crucible. Read the log line.
  2. Press Export Narrative, then Test in Crucible again.
  3. 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.

Key
Set a mod root and the ambiguity disappears. With 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.
05

Ending a session

A shipping pass

Ship 6 steps ~4 min

None of this is enforced by the tool. All of it is the tool's shape.

Every session

The end-of-work sequence

  1. Validate. it catches dangling dialogue links and empty required fields — necessary, and not sufficient
  2. Generate Report and read the lore lines. Compare each links Q:n against the quests you know exist. this is a manual reconciliation and there is no substitute for it
  3. 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
  4. Copy the archive somewhere dated. the next export overwrites it in place
  5. Test in Crucible last — or set a mod root and skip the worry. so the export slot holds what you think it holds
  6. Read the log after every one of these. all five buttons succeed and fail silently in the UI
05b

When it goes wrong

SymptomWhat it actually meansFix
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:1 counts 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.json is lossy by contract, _narrative_runtime.json is 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 --help if 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.