"bare" is a banned word, and BANNED now refuses instead of warning

Diagnosed rather than guessed. The martlet failed three times over ninety
minutes while the gryphon succeeded in the same background run, so it was
neither the service nor the account nor the window. Regenerating it with the
single word "bare" replaced and nothing else changed brought it back
immediately.

It comes from armourWords at naturalArmour 0 — Midjourney reads it as nudity
— and thirteen creatures carried it, every one of them a creature with no
natural armour. That band says "thin-skinned, nothing between it and a blow"
now.

BANNED returned its hits as `warnings` for the caller to print. A warning in
a log nobody reads is precisely what let this stall three times, because the
failure it predicts is a job that never arrives and never fails, which looks
exactly like the service being slow. promptFor throws now, as it does for an
over-long negative list, and says why the refusal is invisible. All 204 specs
still build; a planted "corpse" is refused.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-09-23 02:04:00 +01:00
co-authored by Claude Opus 5
parent 4892f42939
commit 0b51d4e778
+21 -2
View File
@@ -80,7 +80,12 @@ export const TOKENS = {
* and twenty minutes of wondering whether the account is out of fast hours. Cheaper to * and twenty minutes of wondering whether the account is out of fast hours. Cheaper to
* catch here than to sit through. * catch here than to sit through.
*/ */
const BANNED = ["gore", "bust", "corpse", "mutilat", "blood-soaked"]; /* Learned in production, one silent stall at a time. "bare" was added on 2026-09-23 after
the martlet failed three times over ninety minutes: the gryphon succeeded in the same
run, so it was not the service, and replacing that single word made the martlet return
immediately. A moderation refusal never appears in the channel, so this is the only
record that the word costs half an hour. */
const BANNED = ["gore", "bust", "corpse", "mutilat", "blood-soaked", "bare"];
/* ---------------------------------------------------------------- derivation */ /* ---------------------------------------------------------------- derivation */
@@ -116,7 +121,11 @@ const buildWords = ch => bandOf((Number(ch?.str) || 12) / (Number(ch?.siz) || 12
armour to be left out, because a word choice is an argument and a --no is closer to a armour to be left out, because a word choice is an argument and a --no is closer to a
guarantee. */ guarantee. */
const armourWords = (n, era = "antique") => bandOf(Number(n) || 0, [ const armourWords = (n, era = "antique") => bandOf(Number(n) || 0, [
[0, "bare, unprotected"], /* NOT "bare". Midjourney's moderation refuses that word — it reads as nudity — and a
refusal is ephemeral, so the job simply never arrives. The martlet stalled for thirty
minutes three times; changing this one word and nothing else made it return. Thirteen
creatures carried it, every one of them a creature with no natural armour. */
[0, "thin-skinned, nothing between it and a blow"],
[3, "tough hide"], [3, "tough hide"],
[6, "thick natural plating, part of the animal"], [6, "thick natural plating, part of the animal"],
[99, era === "future" || era === "anomalous" [99, era === "future" || era === "anomalous"
@@ -331,7 +340,17 @@ export function promptFor(spec, kind = "npc") {
+ `Steer in the prompt instead. Terms: ${negatives.join(", ")}`); + `Steer in the prompt instead. Terms: ${negatives.join(", ")}`);
} }
/* REFUSE, rather than warn. These were returned as `warnings` for the caller to print,
and a warning in a log nobody reads is what let the martlet stall three times: the
failure it predicts is a job that never arrives, which is indistinguishable from the
service being slow. The negative cap above refuses for the same reason. */
const warnings = BANNED.filter(b => prompt.toLowerCase().includes(b)); const warnings = BANNED.filter(b => prompt.toLowerCase().includes(b));
if (warnings.length) {
throw new Error(`${spec.key}: prompt contains ${warnings.map(w => `"${w}"`).join(", ")}, `
+ `which Midjourney's moderation refuses even in innocent use. The refusal is ephemeral `
+ `— the job never arrives and never fails — so this must not be sent. Reword the `
+ `clause that produced it.`);
}
return { prompt, token, warnings }; return { prompt, token, warnings };
} }