The bodies list had grown to 20+ entries mixing nude anatomical bases, dressed NPCs and
assembled outputs with no way to tell them apart — and the house rule "bases stay in the
library, only dressed outfits ship into games" existed as exactly one unenforced line in
README.md:45. Tagging without a gate would just be labelling; the gate is the point.
Follows the convention already in use across the fleet rather than inventing a second one:
a '-nsfw' suffix before the extension, as in ~/Documents/FBX (106 of 124 files tagged, with a
matching `nsfw` column in _INVENTORY.csv). Filenames beat a sidecar database here because these
assets get rsynced between six machines constantly — a tag in the name travels with the file,
cannot drift out of sync, and is visible in Finder.
· scan() reports `nsfw` per asset; the UI shows a badge, hides bases by default behind a "show
bases" toggle, and says how many are hidden rather than silently shortening the list.
· POST /api/tag renames an asset to add or remove the suffix.
· Export into a live game directory now REFUSES anything nsfw-tagged (403). Verified both ways:
a tagged stem is blocked, an untagged one still exports.
· An assembled result INHERITS the body's tag. Clearing it automatically because "a garment was
added" would be a silent wrong call — a hat does not clothe a nude base — and the failure mode
is shipping a nude model into a game, so untagging stays deliberate.
Verified in-browser: 1 base hidden with the count shown, badge renders, toggle reveals it.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>