From f25bd074f890cd2321aef59697dc0e768c099df0 Mon Sep 17 00:00:00 2001 From: Stella Wang Date: Fri, 7 Aug 2026 22:55:17 -0400 Subject: [PATCH] fix(emit): the delve's own machinery narrated itself to the player MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner playtest 2026-08-07: every dialogue option a player picks printed "Triggered [dw.dlg_antiphos]" in chat, beside the line the character had just spoken. Root cause, not the symptom: dialogue options are `trigger`-type scoreboard objectives (`dw.dlg_`, `dw.class`), so choosing one runs `/trigger` and vanilla answers it. `sealing_commands` sets eight gamerules to seal the box garden — spawning, time, weather, griefing, fire, respawn scatter, inventory-on-death, TNT — and `send_command_feedback` was simply missing from that list. Command feedback is engine implementation reaching the player, which is the one thing every other rule there exists to stop. NOT version-gated, unlike `tnt_explodes`: that rule gates a new capability, so old campaigns must stay byte-identical. This is a defect, and a campaign at any `dsl_version` wants its dialogue to stop announcing its scoreboard. The compiler's own command validator earned its keep here: the first attempt wrote the legacy camelCase `sendCommandFeedback`, which 1.21.11 rejects outright, and the validator refused it against the vendored command tree before it could reach a world. rcon replies to its caller regardless of this rule, so the harness and `validation/` are unaffected; the creator overlay's log stamp is `log_admin_commands`, a different rule. Measured against the build the owner is playing: one added line in one file (`setup.mcfunction`), nothing else moves. baseline cf882e2e...b337a45 with fix 24638a3c...903dada9 Full workspace suite: 154 test binaries, 0 failures. --- crates/compiler/src/emit.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/crates/compiler/src/emit.rs b/crates/compiler/src/emit.rs index 39fe03b..e19e9e0 100644 --- a/crates/compiler/src/emit.rs +++ b/crates/compiler/src/emit.rs @@ -1116,6 +1116,20 @@ fn sealing_commands( // Box-garden death policy: dying must never cost quest items (a dropped // trial key despawns in 5 minutes = softlock for a human player). "gamerule keep_inventory true".to_string(), + // The delve's own machinery must not narrate itself. Dialogue options are + // `trigger`-type objectives (`dw.dlg_`, `dw.class`), so every option a + // player picks runs `/trigger` and vanilla answers it in chat — "Triggered + // [dw.dlg_antiphos]" beside the line the character just said (owner + // playtest, 2026-08-07). Command feedback is engine implementation reaching + // the player, which is what every other rule in this list exists to stop; + // it was simply missing from the seal. NOT version-gated: a campaign at any + // `dsl_version` wants its dialogue to stop announcing its scoreboard. + // rcon replies to the caller regardless of this rule, so the harness and + // `validation/` are unaffected, and the creator overlay's log stamp is + // `log_admin_commands`, a different rule. (The legacy camelCase spelling is + // rejected outright by 1.21.11 — the compiler's own command validator caught + // `sendCommandFeedback` here before it could reach a world.) + "gamerule send_command_feedback false".to_string(), format!("time set {}", time.token()), ]; // Traps (DSL v0.6, spec-0011) exclude TNT as a payload — no gamerule separates