The foe block broke twice in two releases, both times because each surface decided for itself, in its own hand-written ternary, which of the cases it was in. classifyFoes() in the new module/foes.mjs makes that choice once — forged, planned, unavailable, none — and both surfaces switch on it. foes.mjs is Foundry-free on purpose, so foundry-module/ test.mjs can run it under plain node with no shim. Fourteen tests, each one a case that shipped broken or nearly did. enter() now survives a Forge that throws. It had no catch, so a failure left the scene raised, no cards posted and the turn not advanced, and a retry would stage the area twice — while the comment above it claimed the branch handled exactly that. A failed stage stops before the turn advances, since there is nothing to run; a failed population keeps going, because the scene is up and the planned roster stands in. An area with combat heat but neither actors nor a roster used to render nothing at all. It now says so and points at the decision and fallback. The "say so before initiative" addendum is gone from all three renderers. It was gated on the literal word ONLY, and the palace, port and village battle rosters already end with that exact phrase, so it printed twice. The packs that need the instruction carry it themselves. Also: draft() spreads params before the pack, like raiseDungeon; and packById validates the cached pack rather than trusting it, so the fail-closed rule holds at boot too. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DELVE — Foundry module
Install by copying this directory to Data/modules/vanity-delve/, then copying the generator
into it:
cp -R ../core foundry-module/module/core
module/core/ is a verbatim copy of core/. It is not vendored in git because the standalone
generator is the source of truth — if the copy ever needs editing to run inside Foundry, the
portability claim in DESIGN.md §4 is false.
Using it
The ⛏ button in the token controls opens the Forge. Set the parameters, press Raise the dungeon, and it builds — in one folder per document type:
- one scene per area, walls and lighting placed, via the VANITY Forge
- encounter actors, foldered rather than scattered
- a JournalEntry: GM truth, one page per area, the ending — this is the adventure
Every document is stamped with a dungeonId, so the 🗑 button removes a whole dungeon and
nothing else.
Requires the VANITY system 0.10.5+ for quiet output; on older versions the Forge posts its own cards over DELVE's and the module says so on startup.