Reference

Manifest

lw.manifest.json, one per level. Loaded once; any error is a load error with the reason, never a runtime surprise.

Top level

fieldtypenotes
manifest1schema version
vocabulary"town-1"the vocabulary this brain speaks; anything else is rejected
worldstringmust equal the state feed's world
levelstringdisplay name; defaults to world
sliceslistday slices; default ["morning","noon","evening","night"]
verbslistthe level's verbs (below)
neverlistlevel-wide rules (below)
placesobjectplace tags (below)
eventsobjectyour phrasings, classed by you (below)
speechobjectwhat the talk lane may say about this level (below)
charactersobjectper-character narrowing (below)
toolslistArchitect tools and the verbs they require

verbs

{ "name": "report", "engine": "navigate-to", "speaks": true, "description": "...", "tags": ["draw"] }. name must be in the vocabulary; engine and speaks default from it. tags let a rule cover a group ("verb": "draw").

The vocabulary, town-1, 27 verbs: greet, serve, warn, investigate, flee, confront, call_help, claim_task, resume_task, complain, demand, guard_player, go_station, report, refuse_service, watch, avoid, gratitude, seek_station, buy_from, ask_friend, lead, sit, eat, lean, sandbox, say. Calm reflexes (stay, watch, idle_social) are never masked.

characters

"Hulda": { "persona": "...", "handle": 1000, "can": ["greet", "serve"], "never": [ ... ], "speech": { "knows": [...], "voice": "..." } }

A released verb (one we built for you) is a vocabulary name too once lw licence activate has pulled it; it enters plans through the same door. Keys are case-insensitive. can may only narrow the level's verbs. No can means the archetype's default, reported at load.

never rules

{ "verb": "confront", "when": "target.isChild", "name": "no-confronting-children" }

Grammar: and, or, not, parentheses, comparisons. Namespaces:

namespacefields
self.armed_close, was_hit, is_guard, is_child, is_elder, has_command, in_own_place, accompanying, unmet_need
target.isChild, isGuard, isPlayer, name, klass, relation
place.any tag in places, plus built-in interior, exterior
slice.any name in slices

A field the feed does not supply evaluates the whole rule to false.

places

"temple": { "loctypes": ["temple"], "locations": ["Temple of Kynareth"], "name_words": ["shrine"], "default": false, "description": "..." }

Known loctypes: castle, cave, dungeon, dwelling, farm, guild, inn, jail, mine, store, temple. Exactly one tag may be default (the outdoor fallback). A tag must match by at least one of the three matchers, or be the default.

events

{ "ambient": [...], "theft": [...], "importance": { "weapon": 0, "theft": 8 } }

Classes: theft 9, attack 9, threat 8, debt 7, amends 7, gift 6, slight 5, need 5, ambient 2 (default bands; importance overrides a class or re-weighs a word). Phrases are case-insensitive substrings, consulted before the gate.

speech

{ "level_facts": ["..."], "names": ["..."], "places": ["..."] } at the level; { "knows": ["..."], "voice": "..." } per character. Anything a speech model says outside these, the journal and the conversation is rejected.

Load report

python -m pipeline.verb_manifest --check lw.manifest.json --executes <engine actions> --adapter <name> or POST /v1/manifest/check. Exit 0 all executable, 3 some verbs have no body here, 4 the manifest does not load.