"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:
co-authored by
Claude Opus 5
parent
4892f42939
commit
0b51d4e778
+21
-2
@@ -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 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user