Prompt kit
Prompts that turn your book into a Lokee vault
Six prompts, run in order, for Claude Code, Codex or another coding agent. They are generalised from the ones an author used to turn a whole novel into a vault, and they work for any book in any language.
Read the step-by-step guide first →How to use them
Replace the placeholders in curly braces, then paste each prompt into your agent, opened in the working folder. Run them in order and start a fresh session for each one, so the agent works from the files rather than from memory. Extraction and descriptions can run in several sessions at once.
The agent writes everything a reader sees in your book's language. File names, field names and the JSON examples stay in English in every language, because Lokee reads them.
Placeholders
- {BOOK_TITLE}
- The title of your book.
- {SOURCE_FOLDER}
- The folder with your manuscript. The agent only reads it.
- {WORK_FOLDER}
- A new folder where the agent keeps chapter files and intermediate results.
- {VAULT_FOLDER}
- A new, empty folder for the finished vault.
- {GROUP_ID}
- A group id from chapters.md, for example g01.
- {CHAPTERS}
- The chapter files of that group, for example 01–06.
- {DOSSIER_NUMBER}
- The number of a dossier file, for example 1.
Prompt 1
Prepare the book
Once, at the start. You approve the chapter groups and entity types before anything is extracted.
You are helping me turn my book “{BOOK_TITLE}” into a Lokee vault — a structured database of its characters, places, relationships and events. The manuscript is in {SOURCE_FOLDER}. Work only inside {WORK_FOLDER}; never change anything in {SOURCE_FOLDER}.
Step 1 — chapter files. Convert the manuscript to Markdown, one file per chapter: {WORK_FOLDER}/book/NN-short-title.md, where NN is the two-digit reading order (01, 02, …). The first line of each file is “# ” followed by the chapter title exactly as in the book. Copy the text word for word: no summaries, no corrections, no rewording. Give the prologue, epilogue, appendices and glossary their own files.
Step 2 — groups. Write {WORK_FOLDER}/chapters.md: every chapter file with its word count, then a split into groups of roughly 15,000–25,000 words (ids g01, g02, …). Each group will be extracted by a separate agent.
Step 3 — the extraction spec. Read the whole book quickly and write {WORK_FOLDER}/SPEC.md, the instructions every extraction agent will follow. It must contain:
- The book's language. All extracted content is written in that language, and names are spelled exactly as in the book.
- Entity types, as exact strings. Start from these and adapt them to the book, in its language: Character, Place, Organisation, Object, Creature or species, Magic or technology, Event, Concept. Drop types the book does not need; add ones it does (for example Prophecy or Ship).
- Attribute names for each type: short snake_case names in the book's language — for a character, for example: role, age, appearance, personality, abilities, status; for a place: kind, region, appearance. Attributes are filled only with what the text states.
- Canonical keys for the main cast and every recurring place, group and object: the canonical name in lowercase ASCII kebab-case without diacritics (for example mira-vale). One entity has one key; other names and spellings go into aliases.
- The relationship types below. Use these names, and propose a new snake_case name only when none fits. Each line is “type ↔ reciprocal”; a type paired with itself reads the same both ways. Write each relationship once, from the side that does the verb (the source does it to the target), never both directions of a pair. For families keep the names parent_of, child_of, sibling_of, spouse_of, ancestor_of and descendant_of, so Lokee can draw the family tree.
parent_of ↔ child_of
grandparent_of ↔ grandchild_of
ancestor_of ↔ descendant_of
sibling_of ↔ sibling_of
spouse_of ↔ spouse_of
kin_of ↔ kin_of
friend_of ↔ friend_of
ally_of ↔ ally_of
enemy_of ↔ enemy_of
rival_of ↔ rival_of
companion_of ↔ companion_of
loves ↔ loved_by
betrayed ↔ betrayed_by
mentor_of ↔ student_of
serves ↔ served_by
leader_of ↔ led_by
member_of ↔ has_member
rules ↔ ruled_by
owns ↔ owned_by
part_of ↔ has_part
created ↔ created_by
located_in ↔ contains
lives_in ↔ home_of
born_in ↔ birthplace_of
imprisoned_in ↔ prison_of
visited ↔ visited_by
hunts ↔ hunted_by
captured ↔ captured_by
attacked ↔ attacked_by
saved ↔ saved_by
killed ↔ killed_by
participated_in ↔ had_participant
belongs_to_race ↔ race_of
uses ↔ used_by
knows ↔ knows
- The output format: each group writes one JSON file, {WORK_FOLDER}/extract/<group id>.json, in exactly this shape (the values are only an example):
{
"group": "g01",
"chapters": [
"01-the-lamplighter",
"02-the-toll-house"
],
"entities": [
{
"key": "mira-vale",
"name": "Mira Vale",
"type": "Character",
"aliases": [
"the Lamplighter"
],
"attributes": {
"role": "lamplighter",
"appearance": "grey braid, burn scars on both hands"
},
"facts": [
"Has walked the Lantern Road for thirty years (01)."
],
"quotes": [
{
"text": "Mira Vale had walked the Lantern Road for thirty years.",
"category": "appearance",
"chapter": "01-the-lamplighter"
}
],
"states": [
{
"milestone": "Chapter 1",
"note": "takes Tobin as her apprentice"
}
]
}
],
"relationships": [
{
"source": "mira-vale",
"type": "mentor_of",
"target": "tobin",
"evidence": "she told Tobin, her new apprentice",
"chapter": "01-the-lamplighter",
"note": ""
}
],
"events": [
{
"title": "Mira takes Tobin as her apprentice",
"chapter": "01-the-lamplighter",
"order": 1,
"description": "Two to four sentences.",
"participants": [
"mira-vale",
"tobin"
],
"places": [
"lantern-road"
],
"spoiler": false
}
]
}
- These rules: quotes[].text and relationships[].evidence are copied character for character from the chapter file, because they will be found again by exact search — quotes up to 200 characters, evidence up to 120. A quote's category is one of appearance, personality, relationship, event, worldbuilding, dialogue, clue, custom. Give each significant entity 1–4 quotes, and every character whose looks are described an appearance quote. Facts are short sentences that end with the chapter number in parentheses, like (07): thorough for main characters, 1–3 for minor ones. Events are each chapter's main plot beats in order (order = position in the chapter), 3–10 per chapter, with spoiler: true for twists. Mark uncertainty in words (“probably”, “not stated”). Extract only from the assigned chapters.
When you are done, show me the groups and the entity types you chose, and wait for my go-ahead.Prompt 2
Extract a chapter group
Once per chapter group — in parallel, one session or sub-agent per group.
Read {WORK_FOLDER}/SPEC.md and follow it exactly. Your group is {GROUP_ID}: chapters {CHAPTERS} in {WORK_FOLDER}/book/.
Read every assigned chapter completely, every line. Extract everything that has a name — characters (including people who are only mentioned, such as ancestors or rulers), places, organisations and groups, objects, creatures and species, magic or technology, named events, concepts and terms — plus important unnamed figures (“the old ferryman”). Use the canonical keys from SPEC.md whenever an entity is one of them. If you are not sure whether two names are the same entity, use one key and put the other name in aliases.
Write one file, {WORK_FOLDER}/extract/{GROUP_ID}.json — UTF-8, valid JSON, no comments — and check that it parses. Then reply with a five-line summary: the number of entities, relationships and events, and any naming doubts.Prompt 3
Merge into dossiers
Once, after every group has its file.
Merge the extraction files {WORK_FOLDER}/extract/*.json for “{BOOK_TITLE}”. You may write and run a small script; do not edit the extraction files by hand.
1. Find keys that name the same entity — spelling variants, a nickname used as a key, singular and plural — and write them to {WORK_FOLDER}/merge.json as variant key → canonical key:
{
"lamp-road": "lantern-road",
"mira": "mira-vale"
}
Show me the list before you apply it.
2. Merge each canonical key: keep one name and the most specific type; combine aliases (no duplicates, not the name itself), attributes (join different values with “; ”), facts, quotes, states, and the chapters the entity appears in. Rewrite relationship ends and event participants to canonical keys.
3. Write dossiers for the description step: {WORK_FOLDER}/dossiers/dossier-1.json, dossier-2.json and so on, about 40–60 entities each, with the main characters spread across files:
{
"mira-vale": {
"name": "Mira Vale",
"type": "Character",
"aliases": [
"the Lamplighter"
],
"attributes": {
"role": "lamplighter"
},
"facts": [
"Has walked the Lantern Road for thirty years (01)."
],
"chapters": [
"01-the-lamplighter"
],
"relationships": [
"mentor_of tobin"
]
}
}
Report the number of entities per type, the keys you merged, and any relationships or events that point at keys no entity has.Prompt 4
Write descriptions
Once per dossier, in parallel if you like. Optional: without it, descriptions are lists of facts.
Write encyclopedic descriptions for the entities of “{BOOK_TITLE}”. Your input is {WORK_FOLDER}/dossiers/dossier-{DOSSIER_NUMBER}.json. Facts end with a chapter number such as (05); the chapter files are in {WORK_FOLDER}/book/ — open them to check anything unclear or contradictory, especially for main characters.
Write {WORK_FOLDER}/descriptions/desc-{DOSSIER_NUMBER}.json, with one Markdown description for every key in your dossier:
{
"mira-vale": "Mira Vale is the lamplighter of the Lantern Road (Chapter 1).\n\n## Appearance\n…"
}
Style — a wiki article in the book's language:
- Start with one plain lead sentence saying who or what it is.
- Major entities (8 or more facts): 2–5 short sections with ## headings that fit (for example Appearance, Abilities, History, Relationships), 150–450 words in total.
- Medium entities (3–7 facts): one or two paragraphs, 60–150 words.
- Minor entities (1–2 facts): one to three sentences.
- Glossary terms: the definition first, then the context.
- Put chapter references in parentheses at the end of sentences, for example (Chapter 4).
- Only what the dossier and the text support. Keep uncertainty in words. Start a sentence that reveals a major twist with **Spoiler:**.
Check that the file parses as JSON, then reply with one line: the number of descriptions written.Prompt 5
Build the vault
Once; run it again whenever an input changes. It describes the vault format precisely enough for the agent to write it.
Build the Lokee vault for “{BOOK_TITLE}” from the files in {WORK_FOLDER}, into the empty folder {VAULT_FOLDER}. Write and run a script (Python or Node.js) to do it; do not type the vault files by hand.
Inputs: the chapter files {WORK_FOLDER}/book/*.md, the extraction files {WORK_FOLDER}/extract/*.json, {WORK_FOLDER}/merge.json, and the descriptions {WORK_FOLDER}/descriptions/*.json. Where an entity has no description, use its facts as a bullet list.
General rules:
- Every id is a UUID. Make ids deterministic — uuid v5 from one fixed namespace and a stable name such as “entity/mira-vale” or “event/03/2” (in Python: uuid.uuid5) — so running the build again gives the same ids.
- Timestamps are ISO-8601 UTC strings such as “2026-01-15T12:00:00.000Z”. Use one timestamp for the whole build.
- Files are UTF-8 and valid JSON without comments. Field names, file names and the fixed values given here stay exactly as written, in English. Everything a reader sees — names, labels, descriptions, titles — is in the book's language.
Folder layout (names exactly as shown; <…> is an id):
.cache/
project.json
entities/<entityId>/<entityId>.json
source-documents/<docId>/<book file>.md
source-documents/<docId>/manifest.json
manuscript/manifest.json
manuscript/containers/<leafId>.md
story-events/<eventId>/<eventId>.json
notes/<noteId>/<noteId>.json
project.json — the vault itself. Required: id, version (always 1), name, createdAt, updatedAt, entityTypes, relationshipTypes. An entity type has id, name and fieldTemplates (each: id, name, type "string", required false), and optionally color (a hex colour) and shape (circle, square, diamond or triangle). A relationship type has id, name (the snake_case key) and label (shown to the reader, in the book's language). For a pair such as mentor_of and student_of, each side's reciprocalTypeId is the other's id; a symmetric type such as friend_of points at itself. Include only the relationship types you use, plus their reciprocals. Useful optional fields: language ("en" or "pl" only — leave it out for any other language), entityPresentation "wiki" (descriptions read as articles), catalogueFolders (folder paths shown in the sidebar, such as "Characters"). Add no other fields.
{
"id": "0b1e7c52-6a0d-5f2e-9c41-2d7a8e3f5b10",
"version": 1,
"name": "The Lantern Road",
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z",
"language": "en",
"entityPresentation": "wiki",
"catalogueFolders": [
"Characters",
"Places"
],
"entityTypes": [
{
"id": "1c2d3e4f-5a6b-5c7d-8e9f-0a1b2c3d4e01",
"name": "Character",
"color": "#e0915a",
"shape": "circle",
"fieldTemplates": [
{
"id": "2d3e4f5a-6b7c-5d8e-9f0a-1b2c3d4e5f01",
"name": "role",
"type": "string",
"required": false
},
{
"id": "2d3e4f5a-6b7c-5d8e-9f0a-1b2c3d4e5f02",
"name": "appearance",
"type": "string",
"required": false
}
]
},
{
"id": "1c2d3e4f-5a6b-5c7d-8e9f-0a1b2c3d4e02",
"name": "Place",
"color": "#4f9d8a",
"shape": "square",
"fieldTemplates": [
{
"id": "2d3e4f5a-6b7c-5d8e-9f0a-1b2c3d4e5f03",
"name": "region",
"type": "string",
"required": false
}
]
}
],
"relationshipTypes": [
{
"id": "3e4f5a6b-7c8d-5e9f-8a1b-2c3d4e5f6a01",
"name": "mentor_of",
"label": "Mentor of",
"reciprocalTypeId": "3e4f5a6b-7c8d-5e9f-8a1b-2c3d4e5f6a02"
},
{
"id": "3e4f5a6b-7c8d-5e9f-8a1b-2c3d4e5f6a02",
"name": "student_of",
"label": "Student of",
"reciprocalTypeId": "3e4f5a6b-7c8d-5e9f-8a1b-2c3d4e5f6a01"
},
{
"id": "3e4f5a6b-7c8d-5e9f-8a1b-2c3d4e5f6a03",
"name": "friend_of",
"label": "Friend of",
"reciprocalTypeId": "3e4f5a6b-7c8d-5e9f-8a1b-2c3d4e5f6a03"
}
]
}
Entities — entities/<id>/<id>.json, one per entity. Required: id, version 1, entityTypeId, name, tags ([] is fine), attributes, description (Markdown; "" when empty), relationships, citations, aiExtracted true, aiVerified false, deletedAt null, createdAt, updatedAt. Optional: aliases, cataloguePath (one of catalogueFolders), quotes, states. An attribute is {fieldId, name, value: {type: "string", value}}, where fieldId is the id of the entity type's field template with that name; add the template to the type if it is missing.
{
"id": "4f5a6b7c-8d9e-5f0a-9b2c-3d4e5f6a7b01",
"version": 1,
"entityTypeId": "1c2d3e4f-5a6b-5c7d-8e9f-0a1b2c3d4e01",
"name": "Mira Vale",
"tags": [],
"cataloguePath": "Characters",
"aliases": [
"the Lamplighter"
],
"attributes": [
{
"fieldId": "2d3e4f5a-6b7c-5d8e-9f0a-1b2c3d4e5f01",
"name": "role",
"value": {
"type": "string",
"value": "lamplighter; Tobin's mentor"
}
}
],
"description": "Mira Vale is the lamplighter of the Lantern Road, which she has walked for thirty years (Chapter 1).",
"relationships": [
{
"id": "5a6b7c8d-9e0f-5a1b-8c3d-4e5f6a7b8c01",
"relationshipTypeId": "3e4f5a6b-7c8d-5e9f-8a1b-2c3d4e5f6a01",
"targetEntityId": "4f5a6b7c-8d9e-5f0a-9b2c-3d4e5f6a7b02",
"direction": "outgoing",
"createdAt": "2026-01-15T12:00:00.000Z"
}
],
"citations": [
{
"id": "6b7c8d9e-0f1a-5b2c-9d4e-5f6a7b8c9d01",
"sourceDocumentId": "7c8d9e0f-1a2b-5c3d-8e5f-6a7b8c9d0e01",
"passage": "Mira Vale had walked the Lantern Road for thirty years.",
"startOffset": 30,
"endOffset": 85
}
],
"quotes": [
{
"id": "6b7c8d9e-0f1a-5b2c-9d4e-5f6a7b8c9d02",
"text": "The road remembers who lights it.",
"category": "dialogue",
"sourceDocumentTitle": "The Lantern Road",
"sourceChapter": "Chapter 1: The Lamplighter",
"pinned": false,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
}
],
"states": [
{
"id": "6b7c8d9e-0f1a-5b2c-9d4e-5f6a7b8c9d03",
"milestone": "Chapter 1",
"note": "takes Tobin as her apprentice",
"createdAt": "2026-01-15T12:00:00.000Z"
}
],
"aiExtracted": true,
"aiVerified": false,
"deletedAt": null,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
}
Relationships are stored on both entities, with the same relationship id. The source entity gets direction "outgoing", the relationship type's id, and targetEntityId = the target. The target entity gets direction "incoming", targetEntityId = the source, and the reciprocal type's id (the same id for a symmetric type) — this is Tobin's side of the example above:
[
{
"id": "5a6b7c8d-9e0f-5a1b-8c3d-4e5f6a7b8c01",
"relationshipTypeId": "3e4f5a6b-7c8d-5e9f-8a1b-2c3d4e5f6a02",
"targetEntityId": "4f5a6b7c-8d9e-5f0a-9b2c-3d4e5f6a7b01",
"direction": "incoming",
"createdAt": "2026-01-15T12:00:00.000Z"
}
]
First turn every relationship written from the reciprocal side around to the canonical side, then keep each relationship once (for a symmetric type, A–B and B–A are the same). Drop relationships whose ends are unknown keys or the same entity.
Citations link an entity to the book text: {id, sourceDocumentId, passage, startOffset, endOffset}, where passage is exactly the source text from startOffset to endOffset (character positions in the source document below). Find each extracted quote — and each relationship's evidence, cited on the source entity — in the source text: an exact match first, then one that tolerates differences in whitespace and dashes, searching the quote's own chapter before the whole book. Skip quotes you cannot find, and count them. Quotes also go into quotes: {id, text, category, sourceDocumentTitle, sourceChapter, pinned, createdAt, updatedAt}; pin the first appearance quote. States are {id, milestone, note, createdAt}.
The source document — needed for citations: source-documents/<docId>/ holds the whole book as one Markdown file (chapters in order, each starting with “# ” and its title) and manifest.json with id, originalFilename, importedAt, fileSize (bytes, UTF-8), mimeType "text/markdown" and chapterCount.
{
"id": "7c8d9e0f-1a2b-5c3d-8e5f-6a7b8c9d0e01",
"originalFilename": "The Lantern Road.md",
"importedAt": "2026-01-15T12:00:00.000Z",
"fileSize": 192,
"mimeType": "text/markdown",
"chapterCount": 1
}
The manuscript — the book in Lokee's Writer: manuscript/manifest.json is {version 1, updatedAt, statusLabels, root}. A node in root is a container {id, kind "container", label, titleCache, children} or a leaf {id, kind "leaf", label, titleCache}; use containers for books or parts and one leaf per chapter. Every leaf has a file manuscript/containers/<leafId>.md, directly in containers/ however deep the leaf sits: YAML front matter with id, title, status (one of statusLabels), wordCount, linkedEntities [] and updatedAt, every value written as a JSON value (strings in double quotes, so dates stay text), then the chapter text without its title line.
{
"version": 1,
"updatedAt": "2026-01-15T12:00:00.000Z",
"statusLabels": [
"draft",
"revised",
"final",
"archived"
],
"root": [
{
"id": "8d9e0f1a-2b3c-5d4e-9f6a-7b8c9d0e1f01",
"kind": "container",
"label": "Book",
"titleCache": "The Lantern Road",
"children": [
{
"id": "8d9e0f1a-2b3c-5d4e-9f6a-7b8c9d0e1f02",
"kind": "leaf",
"label": "Chapter",
"titleCache": "Chapter 1: The Lamplighter"
}
]
}
]
}
---
id: "8d9e0f1a-2b3c-5d4e-9f6a-7b8c9d0e1f02"
title: "Chapter 1: The Lamplighter"
status: "final"
wordCount: 26
linkedEntities: []
updatedAt: "2026-01-15T12:00:00.000Z"
---
Mira Vale had walked the Lantern Road for thirty years.
“Hold the lamp higher,” she told Tobin, her new apprentice. “The road remembers who lights it.”
Story events — the event plan: one main event per chapter (parentId null, order = the chapter's position, a link {kind "chapter", id: the leaf id}) with the chapter's plot beats under it (parentId = the main event's id, order = position in the chapter, links to the chapter and to the entities and places taking part). Required: id, parentId, order, title, description (Markdown), links (kind is "entity", "chapter" or "note"), causalLinks [], aiExtracted true, aiVerified false, deletedAt null, createdAt, updatedAt. Mark spoilers at the start of the description.
[
{
"id": "9e0f1a2b-3c4d-5e5f-8a7b-8c9d0e1f2a01",
"parentId": null,
"order": 0,
"title": "Chapter 1: The Lamplighter",
"description": "",
"links": [
{
"kind": "chapter",
"id": "8d9e0f1a-2b3c-5d4e-9f6a-7b8c9d0e1f02"
}
],
"causalLinks": [],
"aiExtracted": true,
"aiVerified": false,
"deletedAt": null,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
},
{
"id": "9e0f1a2b-3c4d-5e5f-8a7b-8c9d0e1f2a02",
"parentId": "9e0f1a2b-3c4d-5e5f-8a7b-8c9d0e1f2a01",
"order": 0,
"title": "Mira takes Tobin as her apprentice",
"description": "On the Lantern Road, Mira teaches Tobin to hold the lamp high.",
"links": [
{
"kind": "chapter",
"id": "8d9e0f1a-2b3c-5d4e-9f6a-7b8c9d0e1f02"
},
{
"kind": "entity",
"id": "4f5a6b7c-8d9e-5f0a-9b2c-3d4e5f6a7b01"
},
{
"kind": "entity",
"id": "4f5a6b7c-8d9e-5f0a-9b2c-3d4e5f6a7b02"
}
],
"causalLinks": [],
"aiExtracted": true,
"aiVerified": false,
"deletedAt": null,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
}
]
Notes: notes/<id>/<id>.json is {id, title, body (Markdown), tags, links, deletedAt null, createdAt, updatedAt}. Write one note saying the vault was generated by an AI agent from the book text and is unverified, and list the continuity problems you noticed in the book (contradictions in names, ages, dates, descriptions).
{
"id": "a0f1a2b3-4c5d-5e6f-9a8b-9c0d1e2f3a01",
"title": "About this vault",
"body": "Generated by an AI agent from the text of *The Lantern Road*. Everything extracted is unverified until reviewed.\n\n## Continuity notes\n- None found yet.",
"tags": [
"meta"
],
"links": [],
"deletedAt": null,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
}
Finally, create the empty folder {VAULT_FOLDER}/.cache, and write a zip next to the vault folder for importing: the files of {VAULT_FOLDER} with project.json at the root of the archive (not inside a folder), story-event files with parentId null before the others, and no .cache folder.
Print: entities per type, relationships, citations, quotes not found, story events, manuscript chapters, and the paths of the folder and the zip.Prompt 6
Check the vault
Once, before you open the vault in Lokee.
Check the Lokee vault in {VAULT_FOLDER} before I open it. Write and run a script; change nothing unless I agree.
- Every JSON file parses. project.json has id, version, name, createdAt, updatedAt, entityTypes and relationshipTypes, and no fields other than the ones the build prompt listed.
- Every entity's entityTypeId, every attribute's fieldId and every relationship's relationshipTypeId exist in project.json, and every reciprocalTypeId points at an existing type.
- Every relationship id appears exactly twice: once as "outgoing" on the source and once as "incoming" on the target, each pointing at the other entity.
- Every citation's sourceDocumentId has a folder in source-documents/, and its passage equals the source text between startOffset and endOffset.
- Every leaf in manuscript/manifest.json has its .md file, and every .md file is in the manifest. Front-matter values are quoted.
- Every story event's parentId is null or the id of an existing event; every entity or chapter link points at something that exists.
- The folder {VAULT_FOLDER}/.cache exists; the zip has project.json at its root and no .cache folder.
- Spot-check five entities against the book: the name, one quote and one relationship.
List every problem with the file it is in, then propose fixes — to the build script, not to the generated files.Vault ready?
Open the folder in the desktop app with Open vault, then review what the agent extracted — everything starts out unverified.