Skip to content

5. Diagnose a Validator Error

This chapter practices a failure you will eventually create by accident: a reference that is valid JSON but does not point to a real campaign object.

Start from Checkpoint 4 or download the intentionally broken Checkpoint 5.

  • The difference between JSON syntax and campaign validation
  • How to read a validator finding as a path through the campaign
  • How quest and objective IDs work together
  • Why plausible-looking names are still broken references
  • What validator success does and does not prove

In Mara’s quest-start actions, the working checkpoint contains:

{
"completeQuestObjective": [
"tutorial_codex:missing_courier",
"hear_maras_request"
]
}

Change only the objective ID:

{
"completeQuestObjective": [
"tutorial_codex:missing_courier",
"recover_sealed_letter"
]
}

recover_sealed_letter sounds reasonable, but the quest does not declare an objective with that ID.

The file is still valid JSON. Braces, commas, strings, and arrays are all correct. This is now a campaign-reference error, not a JSON syntax error.

Open the Author tools and validate the broken file.

The important parts of the finding are:

code: quest.objectiveRef
quest: tutorial_codex:missing_courier
missing objective: recover_sealed_letter

The displayed wording may contain more context, but the plain-English meaning is:

A campaign action tries to complete an objective that does not exist inside the named quest.

Do not start by searching the entire file for vaguely similar words. Follow the relationship the validator identified.

The consumer is the action that uses the reference:

"completeQuestObjective": [
"tutorial_codex:missing_courier",
"recover_sealed_letter"
]

Look under:

quests
└── tutorial_codex:missing_courier

The quest exists, so the first value is valid.

The quest declares:

hear_maras_request
recover_letter
show_letter_to_oren

It does not declare recover_sealed_letter.

This action runs when Mara starts the quest. Its job is to record that the player has heard Mara’s request. The intended ID is therefore:

hear_maras_request

A validator can prove that recover_sealed_letter is missing. A human must still decide which existing objective the action was meant to reference.

Restore the action:

{
"completeQuestObjective": [
"tutorial_codex:missing_courier",
"hear_maras_request"
]
}

Validate again. This specific quest.objectiveRef error should disappear.

After the correction, the validator can prove that:

  • the named quest exists,
  • the named objective exists inside that quest,
  • the action uses a supported shape,
  • related campaign references are structurally resolvable.

It still cannot prove that:

  • this is the narratively correct objective,
  • the player can reach Mara,
  • the dialogue branch will be selected at the intended time,
  • the quest can be completed in every allowed order,
  • the experience is understandable or enjoyable.

Those remaining questions require dependency review and playtesting.

Checkpoint 5 adds no legitimate campaign feature. Its purpose is to preserve a known invalid state with one deliberate error:

recover_sealed_letter → unknown objective

Once you understand the finding, return to your corrected Checkpoint 4 file. Chapter 6 supplies the next valid cumulative checkpoint.

Continue to Chapter 6: Make Progression Out-of-Order Safe.