5 Commits
Author SHA1 Message Date
slaguru666andClaude Opus 5 5351c25fda Ship the bestiary art: 47 plates and tokens, as webp
The illustrations were sitting in art/creatures/, where nothing looked for
them. build-packs resolves a creature's picture by stem under art/portraits/,
so none of the 47 reached the game.

tools/make-art.py (was make-tokens.py) now derives both from one plate:
art/portraits/<key>.webp and art/tokens/<key>.webp. Same drawing, so the
token cannot disagree with the portrait — the argument mj-queue already makes
for deriving prompts from statblocks.

Webp because every one of the 309 art files already here is one, at 160-220
KB. The raw Midjourney plates are 2.3 MB each; 47 of them would have put 93
MB into a 29 MB repository permanently, for pictures nothing renders at that
size. At quality 88 a plate is ~300 KB with the pencil hatching intact. The
plates stay on disk as working files and are gitignored.

The token lookup in build-packs was a hardcoded `.png`, so the first webp
token would have silently fallen back to the portrait and Foundry would have
gone back to cropping a 2:3 plate into a circle. Portraits and tokens now
share one resolver and one extension list.

146 of 147 npcs carry a portrait and 46 a derived token.

Also: the gryphon came back as a mech a second time. The first fix branched
the armour SIMILE on era while both arms still opened with the word
"armoured", and that word is what Midjourney draws — changing the reasoning
is not the same as changing the cause. No natural creature's prompt contains
"armour" now, and negativesFor() asks for plate, machinery and worn armour to
be left out, because a word choice is an argument and a --no is closer to a
guarantee.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:14:51 +01:00
slaguru666andClaude Opus 5 bbe7b92459 Stop tracking LevelDB's LOG; it churns on read, not on change
LOG is LevelDB's diagnostic text — "Delete type=3 #1" and compaction notes — and it is
rewritten every time a pack is OPENED. Not rebuilt: opened. So all eighteen went dirty
whenever anything merely read the compendia, Foundry and any verification script
alike, and pack churn kept turning up in commits that had not touched any content.

Verified disposable before ignoring rather than assumed: a copy of packs/npcs with LOG
and LOG.old deleted opens cleanly, reads back all 21 actors, and LevelDB writes itself
a fresh LOG on open.

CURRENT and MANIFEST-* stay committed, deliberately. They are how a fresh clone finds
the data, and ignoring them would ship compendia nobody can open.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 20:44:38 +01:00
slaguru666andClaude Opus 5 187a317a0a mj-queue: the illustrated upgrade path, without a self-bot
The Mac bridge posts /imagine to Discord with a user token. It is not ported here and
should not be: Midjourney's terms since 27 May 2026 forbid automated access, there is
no official API, and the bridge's own memory note records Discord silently dropping
its interactions from 22 July — which is what enforcement looks like from inside. A
Windows clone would be a second self-bot on the same account.

So this does everything except talk to Discord, which turns out to be most of the
work. `next` derives a prompt from the creature's spec and puts it on the clipboard;
you paste it yourself; `file` or `watch` renames the download to the canonical name
and retires the generated placeholder. One at a time, because the memory note is
explicit that concurrent jobs in one channel steal each other's grids.

Prompts are derived, not written — anatomy from the location table, scale from SIZ,
build from STR against SIZ, plating from naturalArmour — so they cannot drift from the
statblock. Three things learned by reading the data rather than assuming it:

- tactics is written for a GM, not an illustrator. "Advances by bounds, 15 m per
  round" put a rate of fire in an art prompt. role is the one-line essence and is
  already the sentence you would hand an artist. Sentences carrying mechanics are
  dropped; dates and ages are kept.
- era is the wrong test for whether something is a person. It classified Mr Bewley of
  the Registry and everyone in 1881 Cordera as monsters, because their kit is old.
- 18 creatures are species "baseline" and are not human-shaped — a black dog, a case
  file that eats case files, a machine that has decided it is the site. The prompt
  refuses to describe a body it cannot verify, and `list` names them. That is a
  statblock to write, not something to paper over here.

`sheet` emits a prompt sheet that the existing gen-art.mjs parses unchanged, so if the
bridge ever works again the whole bestiary drives from it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 20:33:16 +01:00
slaguru666andClaude Opus 5 b31b1028a9 Rebuild the pause overlay as a containment hold
The uniselector rotated forever, which is the one thing a hunting stepping switch never does, and it was carrying two outright bugs: the motion trail pointed the way the arm was going rather than the way it came, because conic angles run clockwise from the origin and the tip was declared first; and the hub pip ran on a free 2.6s sine against a 7.7s arm, so the light drifted permanently out of phase with the mechanism and meant nothing.

Replaced with an instrument that acquires, locks, reports and lets go: a static field, four corner brackets that close and snap, a scan line reading down the field at exactly cycle/3 so its third pass always lands on the lock, and a readout welded to the same cycle. Every layer reads --rb-pause-cycle, so nothing can drift. The field offset is derived from the column rather than measured and pasted in.

Also ignores the impeccable hook cache and keeps its config, which records why broken-image is suppressed for a stylesheet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 21:08:23 +01:00
slaguru666andClaude Opus 5 d0144f744e The Custodians v0.6.1 — full system
A Foundry VTT game system: Basic Roleplaying d100 in a drab British agency that
deals with crossings, where reality keeps a record of what belongs where and can be
made to get it wrong.

Contents:
- rules.mjs as the single authority for every rule formula, with 40 rules and 132
  spot-checked values. Nothing may restate a formula it defines.
- 25 postings, each with a key characteristic, trained skills, talents and its own
  kit; a 175-item catalogue across four eras; 231 generated icons.
- Reaction Lanes initiative, re-rolled every round including the first.
- Coherence, and the Quiet Arts, which only ever arrive from a crossing gone wrong.
- Graded defences: only a critical stops a critical.
- Borrowed Authority — access as a record rather than a hacking roll.
- A case generator, and a rules journal generated from rules.mjs so the book cannot
  drift from the code.

Built compendia are committed so a remote Foundry needs only the files.
node_modules is not; `npm install` restores it for rebuilding content.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 18:09:07 +01:00