# Council #9 — `dungeon/` retirement (2026-05-27)

> Two dead files retired from `data/evercraft/function/dungeon/`. Two additional dev-convenience commands lifted to `admin/give/`. One dead-write reset stripped. One sonic-cue pair lifted into the live 9am news path to preserve the daily-challenge announcement identity. See `_council/2026-05-27-dead-code-dungeon/CLOSED.md` for the full convening.

## Files in this archive

| Archived as | Original path | Lines | Reason |
|---|---|---:|---|
| `announce.mcfunction` | `data/evercraft/function/dungeon/daily_challenge/announce.mcfunction` | 13 | Superseded by 9am news broadcast (see Evidence A). Zero live callers. The dawn reset of `#daily_challenge_announced` at `roll.mcfunction:36` was the dead twin (stripped in same ship). |
| `ready_check.mcfunction` | `data/evercraft/function/dungeon/ready_check.mcfunction` | 17 | Half-baked initiator: writes `#dg_ready_timer ec.var 600` with no decrement chain anywhere; partner consumer `ready_confirm.mcfunction` has a LIVE multi-party race bomb (see Evidence C) that would arm the moment this initiator gets wired. Zero live callers. |

## Evidence A — `announce` was deliberately retired (perf + race seats independently)

The README pre-recon framed `announce.mcfunction` as "the watcher half the author never finished." Wrong. The 10am global broadcast was migrated to the unified 9am news pipeline and orphaned. Verbatim supersede comment from `data/evercraft/function/luck_buffs/tick.mcfunction:63-65`:

```
# === FOREVERCRAFT NEWS: 9 AM announcement (DayTime 3000 = 9:00 AM) ===
# Daily Challenge is now part of the news broadcast (no separate 10am announcement)
execute if score #prev_vtime ec.var matches ..2999 if score #visual_time ec.var matches 3000.. run function evercraft:news/morning_announce
```

The 9am `morning_announce` → `morning_personal_daily` → `morning_daily_dungeon` chain shows daily-challenge flavor to every player at visual_time 3000. Wiring `announce` at visual_time 10000..10500 would duplicate-broadcast the same flavor 4000 ticks later through different prose. Council #9 ratified ARCHIVE.

## Evidence B — sonic-cue lift (revert insurance)

The only lore-unique cargo in `announce.mcfunction` was the 2 distinct playsound cues at the end of its companion `daily_challenge/show.mcfunction:5-6`. The sounds were what gave the 10am announcement its sonic identity. Both lines lifted verbatim into `data/evercraft/function/news/morning_daily_dungeon.mcfunction` after the 2nd tellraw so the 9am path now also rings the daily-challenge chime.

Verbatim lift target (in the live news path):

```
playsound minecraft:block.note_block.bell master @s ~ ~ ~ 0.7 1.2
playsound minecraft:block.amethyst_block.chime master @s ~ ~ ~ 0.5 0.8
```

Note the `@s` (not `@a`) — `morning_daily_dungeon` runs per-player within `morning_announce`'s `execute as @a at @s` fan-out. Volumes + pitches match `show.mcfunction:5-6` byte-clean for revert.

## Evidence C — PRE-EXISTING multi-party race bomb in `ready_confirm`

**This bomb pre-exists this council and is NOT introduced by archiving `ready_check`.** Race seat's stress-test (see `_council/2026-05-27-dead-code-dungeon/chat/race.md §2.B`) walked the failure mode end-to-end.

In `data/evercraft/function/dungeon/ready_confirm.mcfunction:11-20`:

- `#dg_ready_total ec.temp` and `#dg_ready_count ec.temp` are GLOBAL scratch keys, not party-scoped.
- Two parties within mutually overlapping 32-block radii cross-trigger each other's "All ready!" announcement.
- Worse: `ready_confirm:20` clears `ec.dg_ready 0` on every `dg.player` within 32 blocks of the @s — silently wipes the OTHER party's ready state when one party fires.

The reason this hasn't fired in production: nobody is wiring `ready_check` (the initiator that primes `ec.dg_ready=1` on a leader). The trigger `/trigger ec.ready set 1` is still declared in `init.mcfunction:521-523` and consumed by `util/trigger_dispatch.mcfunction:53-55` → `dungeon/ready_confirm` — so a player typing the raw trigger can still arm the bomb today. Queued to `BIG_BRAIN/10-pending.md` as a real bug followup.

## Evidence D — dead-reset strip

`data/evercraft/function/dungeon/daily_challenge/roll.mcfunction` had a 2-line tail that reset `#daily_challenge_announced ec.var 0` "so it fires at 10am" — the only consumer was the now-archived announce. Lines stripped in the same ship:

```
# Reset announcement flag so it fires at 10am
scoreboard players set #daily_challenge_announced ec.var 0
```

After this strip, `#daily_challenge_announced` has zero writers and zero readers anywhere outside `data/.archive/`. The objective declaration in `init.mcfunction` (if any) survives reload but is harmless dead state.

## Companion changes (not in this archive)

1. **Admin lifts (`git mv`).** Two dev-convenience commands routed to the canonical `admin/give/` pattern:
   - `data/evercraft/function/dungeon/give_key.mcfunction` → `data/evercraft/function/admin/give/dungeon_key.mcfunction` (headers normalized to `# Dungeon Key — Give to player (admin/test)`, `(Test)` marker stripped).
   - `data/evercraft/function/dungeon/village/give_horn.mcfunction` → `data/evercraft/function/admin/give/village_horn_here.mcfunction` (name reflects "the village you're standing at"; `test command` marker stripped).
2. **`morning_daily_dungeon.mcfunction`** — 2 playsound lines appended (see Evidence B).
3. **`roll.mcfunction`** — 2 dead lines stripped (see Evidence D).

## Revert instructions

If the 9am news path proves insufficient and a separate 10am announce is wanted again:

1. `git mv data/.archive/2026-05-27-dead-dungeon/announce.mcfunction data/evercraft/function/dungeon/daily_challenge/announce.mcfunction`.
2. Re-add the dawn reset to `daily_challenge/roll.mcfunction` (Evidence D, last 2 lines).
3. Author a sibling `quests/time/check_daily_challenge.mcfunction` mirroring `quests/time/check_noon.mcfunction:8`, gated by `if score #visual_time ec.var matches 10000..10500 unless score #daily_challenge_announced ec.var matches 1`. Wire it from `quests/tick.mcfunction:16`. **Also add** `#daily_challenge_announced 1` to `news/morning_announce.mcfunction` to prevent duplicate-broadcast (see perf seat §3.2).
4. Either remove the 2 playsound lines from `morning_daily_dungeon.mcfunction` (so the 10am path keeps the sonic ID exclusively), or accept double-chime per day.

If multi-party ready-check is wanted:

1. `git mv data/.archive/2026-05-27-dead-dungeon/ready_check.mcfunction data/evercraft/function/dungeon/ready_check.mcfunction`.
2. **First** refactor `ready_confirm.mcfunction:11-20` + `ready_check.mcfunction:8-9` to use per-party scoreboard keys (e.g., `#dg_ready_total.<party_id> ec.var` via macro on `ec.party_id`).
3. Replace the orphan `#dg_ready_timer 600` write with a gametime-delta start stamp (`store result score @s ec.dg_ready_start run time query gametime`), and check elapsed inside `ready_confirm` via subtraction.
4. Decide initiator entry point (UI book, sign-click, advancement reward, or admin-only).
