Repository navigation
task 9 report
Status: DONE_WITH_CONCERNS. The Wind Temple is dressed from the Eagle JSON by the same tool as the eight LTTP temples.
The plan keeps the owner's four east rooms and his route to his Boss Key, and the lead's (0,1) ruling as written. It
solves with reasons: [], passes the audit, and needs the Boss Key.
Getting there took two tool changes, each its own commit with ClassicDress fixtures first. The eight LTTP modules regenerate byte-identical after each. Two decisions are the lead's to review: concern 1 (the shop behind Zelda's cracked wall) and concern 2 (specs edited outside the gate).
| SHA | Subject |
|---|---|
193706a5 |
feat(tools): a circle keeps the cell it shares with a riddle, as a flight does |
ba4c1fb6 |
feat(tools): a classic plan can draw rooms of its own, pin its shop, guard chests with side fights and keep every chore |
2c8a21c5 |
test(temples): the wake and Quick Start specs walk the Howling Spire as the owner made it |
2c39776b |
feat(temples): the Wind Temple's rooms follow Zelda's Eagle one to one |
The stand-in dressing showed five gaps.
- The 1F (0,1) cell has both a riddle and a teleport, and the riddle won. The circle moved to an added room at (0,0), and the B1 and 1F circles each got a landing circle, so the temple had four circles.
- The three side fights in the compass, map and gold cells were pushed out. They took (2,0), the old man's room, and (1,5), the Triforce room. The Master Room then went to (0,4).
- The shop was added below the entrance.
- The owner's rooms do not exist in the JSON.
- The Eagle has six must-clear rooms. One of them guards the boss door, so five rooms were left for six of today's monster chores, and one chore left the temple.
Each fix:
-
A circle outranks a riddle (
193706a5, a general rule indressBoard.PRECEDENCE). A circle now ranks like a flight: it is the way on, and a displaced riddle is only dropped. Two LTTP cells (Earth 1F (4,2), Shadow B1 (0,3)) hold both, but they lose both to a fight or a chest, so all eight modules came out byte-identical. The guard's Wind stand-in pin changed by one word ("puzzle" became "teleport"); I fixed that inba4c1fb6. -
Plan options (
ba4c1fb6, all opt-in, so the LTTP modules come out byte-identical):-
handRooms: HandRoom[](aClassicCellplusfloor).withHandRooms(dungeon, plan)joins these cells to the converter's dungeon before the board reads it: the floors grow and the report counts their keys. The same rules then dress them like the dungeon's own cells. A hand room on a converted cell, or on a floor the dungeon lacks, throws.dressDungeoncalls it, so the dressing stays pure, and the module's header lists the rooms. -
shopAt: CellRef: the shop goes in a converted cell the plan names. A cell that is not free throws. -
guardedChests: boolean: a side fight sharing a cell with a plain chest keeps the cell and holds the chest asholds, so it hands the chest out in itsdrops. This matches Zelda 1, which leaves the item in the room its enemies stand in. -
keepsEveryChore: boolean: any spare must-clear chore goes tooverflow(a side room of its own), not only a starter.
-
-
TDD. AERIE, the Eagle in miniature (
classicFixtures.ts), andClassicDressEagle.spec.ts(new, 13 tests).- RED for the precedence change: 2 of 2 failed, then green.
- RED for the options: a compile error first. Then, with the three behavioural switches turned off, 5 of 13 failed.
- Green: 13.
| Field | Value |
|---|---|
| name, theme, element |
Wind Temple, plains (the registry's world), wind
|
| relic |
Wind Whistle (ChestLoot's WIND_WHISTLE) |
| trap, puzzle |
["gust", 4], generic
|
| shop | none, as today's S0002 (the shop still sells Bombs) |
| mustClear | cushion-croc 1 daily, mustwisp 1 daily am, mailbox-mimic 1 daily, gravel-gnome 2 weekly, crumb-crawler 2 daily, spill-sprite 1 daily |
| minibosses | dust-bunny-king 3 weekly, cobweb-widow 3 weekly |
| minibossRooms |
Eagle (2,4), Owner's Mini-boss Room
|
| boss | fluffalo 8 weekly |
| handRooms | the owner's four (below) |
| shopAt | 1F (2,0) |
| guardedChests, keepsEveryChore | true, true |
All nine of today's quests are in the plan and in the temple, with the same templates (difficulty, schedule and due time as in 61d7b718).
WIND_EAST_ROOMS: every side is open, so it is drawn door, verbatim from his file.
| Cell | Room | Today's token | Dressed as |
|---|---|---|---|
| (3,5) | Owner's Boss Key Room | L0503 | loot, master-key
|
| (4,4) | Owner's Key Room | M0404 |
key room, one small key |
| (4,5) | Owner's Mini-boss Room | m0504 | miniboss cobweb-widow 3, lockOnEnter |
| (5,5) | Owner's Circle | T0505 | teleport (link to B1 (0,0)) |
The route (the lead's ruling, as written):
- The Eagle's locks lead up to the push-block steps: (2,2) to (1,2) to (0,2), then the circle at (0,1).
- The circle at (0,1) rides to B1 (0,1), beside the Wind Whistle in the Big Chest at B1 (0,0).
- B1 (1,0) rides on to (5,5).
- From (5,5), the way runs past the Cobweb Widow at (4,5) to the Boss Key at (3,5).
WindTemple.spec checks that the Boss Key cannot be reached with any of these blocked: (0,1), B1 (0,0), B1 (1,0), (5,5), (4,5).
The basement's three rooms: the relic, the circle from (0,1), and the circle on to (5,5). The second circle was not hand-drawn. It is the tool's own rule: the owner's circle lands on the basement cell, which is not a circle, so a landing circle is added beside it. One difference from his description: in Zelda, (1,2)-(0,2) is a small-key door, so his "bomb the cracked wall" step is now Zelda's lock (see concern 1).
| Cell | Contents |
|---|---|
| (0,1) | circle (the push-block riddle is dropped) |
| (0,2) | must-clear crumb-crawler, drops a key |
| (1,2) | must-clear gravel-gnome, drops a key (riddle dropped) |
| (1,4) | boss fluffalo |
| (1,5) | Master Room (the Triforce room) |
| (2,0) | shop (the old man) |
| (2,1) | side gravel-gnome |
| (2,2) | side cushion-croc, drops the compass |
| (2,3) | side crumb-crawler, drops 25 gold (the boomerang) |
| (2,4) | miniboss dust-bunny-king, drops a key |
| (3,1) | side mustwisp |
| (3,2) | must-clear mailbox-mimic, drops a key |
| (3,3) | side mailbox-mimic, drops the map |
| (4,2) | side spill-sprite (overflow; this room is where today's spill-sprite stood) |
| (5,1) | must-clear cushion-croc, drops a key |
| (5,2) | entrance |
| (5,3) | must-clear mustwisp, drops a key |
Matches with today's assignments: (5,3) mustwisp, (3,2) mailbox-mimic, (2,1) gravel-gnome, (2,3) crumb-crawler and (4,2) spill-sprite are where the owner had them.
Doors. The small locks are drawn on one end each: (5,2)N, (3,1)N, (2,2)E, (1,2)N, (0,2)W. The sixth small-key door is the boss door, now masterlocked. The cracked walls are (2,0)-(2,1), (2,2)-(3,2) and (2,3)-(3,3). The shutters are drawn as doors.
| Field | Value |
|---|---|
| floors, rooms | 2 (B1, 1F), 24 rooms |
| mustClear | 5 |
| repeats | [] |
| overflow | [spill-sprite] |
| left | [] |
| moves |
teleport B1 (0,0) -> B1 (0,1) and landing circle B1 (0,0) -> B1 (1,0) (the basement's two added cells) |
| dropped |
puzzle 1F (1,2) (displaced by the must-clear fight), puzzle 1F (0,1) (displaced by the teleport) |
| merged, bombChests, compacted, shifted, plainBigKeyDoors | all []
|
- Solver:
solveTempleis solvable withreasons: []. - Audit:
missingNamesis[]. - Keyless (Boss Key chest replaced with gold): unsolvable.
- With the shop removed: still solvable, so no Bomb is needed.
- Guards: the PINNED entry is now
{ solvable: true, audit: [], reasons: [] }.
-
WindTemple.spec.tswas rewritten first: 12 tests on the Eagle. On today's hand-made module, 11 of 12 failed. After the plan and the regenerated module, 12 of 12 passed.
Gate on the final tree (chemx, one at a time):
chemx test tests/unit/WindTemple.spec.ts All tests passed (12 passed)
chemx test tests/unit/ClassicTemples.spec.ts All tests passed (180 passed)
chemx test tests/unit/ClassicDungeonGuards.spec.ts All tests passed (91 passed)
chemx test tests/unit/ShippedTemplesAudit.spec.ts All tests passed (162 passed)
chemx test tests/unit/ClassicDressEagle.spec.ts All tests passed (13 passed) # the tool commits' fixture spec
chemx test tests/unit/ClassicDress.spec.ts All tests passed (48 passed)
ClassicTemples.spec (494 to 495 lines):
- It reads
withHandRooms(loadDungeon(id), plan), so the owner's rooms count as cells. - The "one-ended small lock" rule now skips a small-key door into the boss. Zelda keys the Eagle's boss door with a small key; the line above already holds that door to masterlocked. LTTP never does this.
- A kept chore's overflow passes when the plan sets
keepsEveryChore.
ClassicDungeonGuards.spec:
-
dungeonOf(id)is the joined dungeon. - The shop rule accepts the plan's pinned cell.
- Wind is pinned clean, and the header says so.
ShippedTemplesAudit.spec:
- Every shipped temple is classic now, so HAND_MADE, COMBAT_ROOMS, TEMPLE_SIZE and the
isClassicbranches are removed, along with the test that compared the pinned keys. - The header no longer tells the old Bomb story.
npx --yes chemx@26.10.19-530 audit --no-index --unroll, output in my scratchpad, then
git checkout -- chemx-ratchet.json (the file showed no change).
- Counts are as in Task 8: INLINE_BOOLEAN 5/4, LINE_BUDGET_FILE 36/4, DISPATCH_SWITCH 36, CASCADE_GUARDS 14, HOOK_RETURN_OVERLOAD 19. TYPE_COLOCATION and UNGUARDED_LOGGING are not listed.
- None of my files appears under any rule.
All are under 500 lines.
Tool:
| File | Lines |
|---|---|
tools/temples/classic/dressBoard.ts |
414 |
tools/temples/classic/dress.ts |
257 |
tools/temples/classic/dressPlans.ts |
313 |
tools/temples/classic/dressChores.ts |
197 |
Generated: src/lib/engine/temples/wind-temple.ts, 53 lines.
Specs:
| File | Lines |
|---|---|
tests/unit/ClassicDressEagle.spec.ts (new) |
140 |
tests/unit/classicFixtures.ts |
447 |
tests/unit/WindTemple.spec.ts |
197 |
tests/unit/ClassicTemples.spec.ts |
495 |
tests/unit/ClassicDungeonGuards.spec.ts |
444 |
tests/unit/ShippedTemplesAudit.spec.ts |
352 |
tests/unit/windBeforeEagle.ts (new) |
70 |
tests/unit/wakeOnEntry.spec.ts |
one import line and one doc line changed |
tests/unit/quickStartTemple.spec.ts |
one import line and one doc line changed |
tests/unit/TempleFreshness.spec.ts |
one lookup changed, one comment line added |
-
The shop sits behind Zelda's cracked wall. The dot's edge between the old man (2,0) and (2,1) reads
bin one direction and empty in the other; Task 6's converter took the bomb. The shop (the old man's room, by the ruling) therefore sells Bombs behind a Bomb wall. Inside the temple, a hero reaches it only with a Bomb from their own bag, and the solver never reaches it. Nothing needs it: all three cracked walls are shortcuts, so Wind solves without Bombs. The guard's "sells before any key, Bomb or seal" rule now accepts a plan-pinned shop instead.- The lead's text ("sells the Bomb before the wall") assumed the shop comes first.
- Options: keep it as is; open the (2,0)-(2,1) wall (not 1:1); or put a Bomb chest before it.
- The owner's "bomb (1,2)-(0,2)" step is Zelda's locked door now, as the task's doors-follow-Zelda rule says.
-
Specs outside the gate that broke with Wind's layout were edited in
2c8a21c5and not run, per the rules. CI will run them.-
wakeOnEntry.specandquickStartTemple.specnamed the Spire's rooms (M0305, B0401…), its one floor and its six monster rooms. They now walkwindBeforeEagle.ts, the owner's 61d7b718 module verbatim. Only the import and doc lines changed. The logic they test does not change; quickStartTemple's "no record" test still reads the shipped layout, and gravel-gnome is still woken. -
TempleFreshness.speclooked for anemptyroom in the shipped Wind, and the Eagle leaves none. It now edits alootroom. - Others I checked:
- TempleSolver.spec still lists
HAND_MADE = ["wind-temple"]; this is harmless, since the skip applies only if reasons exist. - importAllTemples.spec uses its own fixtures.
- The e2e specs visit Wind rooms by x/y (voxel-fit, visual); their screenshots will differ.
- TempleSolver.spec still lists
-
-
The Wind Whistle is in two chests. The basement's Big Chest holds it as the relic (the brief's pick). ChestLoot's
asWhistledstill adds a Wind Whistle row to Wind's Pegasus chest. Taking either one unlocks it. Removing the Pegasus row is a ChestLoot change I did not make. -
"Verbatim" owner rooms. Their place, kind and sides are his. Their content uses the dressing's shapes: the key
room has no
monsterType: "small", no room hasbeasts: [], the mini-boss is sealed (lockOnEnter, which R5 needs; his was not), and his circle names its target (B1 (1,0)) instead of auto-pairing. - Today's quests in new rooms. cushion-croc moves from (1,2) to (5,1), and gravel-gnome from (2,1) to (1,2) as its must-clear room (it also keeps (2,1) as a side room). Easiest-nearest forces this.
- Families' saved Wind. An unedited stored Wind refreshes to the new layout (two floors, new tokens). An edited copy stays, as with the other eight. Runs inside the old Wind follow the refresh rules from Task 7.
- ClassicTemples.spec is at 495 lines. The next rule should go to a split spec.
Status: DONE. All four items are done, in small commits on the same worktree under the same rules. The lead's two rulings are met: Wind's shop is reached without a Bomb, and the Wind Whistle is only the Pegasus chest's prize. This resolves concerns 1 and 3 above.
| SHA | Subject |
|---|---|
3bb38a20 |
feat(tools): a classic plan can open a side of its dungeon, and its own rooms open on no converted cell |
bfb01a5b |
feat(tools): a classic plan's Big Chest can hold treasure where the temple has no relic of its own |
dab45bdf |
fix(temples): Wind's shop is reached without a Bomb, and its Big Chest holds treasure, not the whistle |
403cbe71 |
chore(temples): the solver spec lets no shipped temple off a rule; two dress-step comments put right |
13d7d79e |
refactor(tools): a hand room's troubles in one validator, not three guards in a row |
Tool.
-
ClassicPlan.opens?: OpenedSide[], where an OpenedSide is{ floor, row, col, side }. Each side opens on both ends. -
asPlanned(dungeon, plan)is the joined-dungeon step:withOpenedSides, thenwithHandRooms.dressDungeonreads it. Both steps return copies, so the converter's dungeon is unchanged. - A side that does not stand between two converted cells throws.
Wind. The plan opens 1F (2,0) east. P001's east side and m001's west side are now door.
Specs.
- WindTemple: the shop at (2,0) is reached from the entrance with every cracked wall closed. The temple keeps two cracked walls, (2,2)-(3,2) and (2,3)-(3,3).
- ClassicDungeonGuards: a pinned shop must be where the plan pins it and reached from the entrance with every bomb door closed. Keys and seals before it are allowed.
- Specs that read the joined dungeon read
asPlanned.
Tool.
-
ClassicPlan.relicis now optional, besidetreasure?: BigChestTreasure({ gold, items }). -
dressRooms.bigChestOfreturns the relic if the plan has one. Otherwise it returns{ chest: "gold", gold, items }. - A plan with neither throws once the dungeon has a Big Chest.
- A treasure Big Chest is spelled as a loot room (O).
Wind.
-
treasure: { gold: 50, items: ["Potion"] }. "Potion" is the bag's supply name. The 50 gold is my pick: twice anotherchest. - B1 (0,0) is now
O001 { chest: "gold", gold: 50, items: ["Potion"] }. - WindTemple checks that no room in the module names the whistle. It also checks that, played through
asChestRoom(room, "wind-temple"), exactly one room hands it out: the Pegasus chest.
Specs.
- ClassicTemples' relic line is relaxed: a plan with a relic has one relic chest and no treasure; one with treasure has none and one treasure per Big Chest. The expected gold counts the treasure.
- The guards count the same way.
The split. The Storm Temple's pins moved from ClassicTemples.spec.ts to the new StormTemple.spec.ts:
- ClassicTemples: 495 → 410 lines.
- StormTemple: 100 lines.
- Tests: 172 + 8, the same 180 as before.
withHandRooms throws when a hand room has a side that is not a wall facing a converted cell. Hand rooms join the
dungeon only through their own circles or flights. Wind's four rooms and AERIE's pass.
13d7d79e folds the three checks into handRoomTrouble. The audit had counted them as a new CONTROL_FLOW_CASCADE_GUARDS
item (14 → 15); it is back to 14.
- dress.ts:
renderClassicModule's doc comment is back above it. - dressBoard.ts: the header's 194-character line is rewrapped.
- TempleSolver.spec: the
HAND_MADEskip is gone. The result is 54 passed and none skipped (it was 53 + 1 skipped). The file is down from 502 lines to 499.
-
Tool,
opensand the face check. RED first as a compile error. Then, with both behaviours turned off, 2 of 16 failed. Green: 16. - Tool, treasure. RED first as a compile error. Green: 18.
- Wind. RED first: WindTemple failed 4 of 13 and the guards' shop rule 1 of 91. Then green.
- Modules. All nine regenerate byte-identical after each tool commit. Wind's module changes only in the Wind commit: 4 lines (O001, P001 east, m001 west, the maze token).
chemx test tests/unit/WindTemple.spec.ts All tests passed (13 passed)
chemx test tests/unit/ClassicTemples.spec.ts All tests passed (172 passed)
chemx test tests/unit/StormTemple.spec.ts All tests passed (8 passed)
chemx test tests/unit/ClassicDungeonGuards.spec.ts All tests passed (91 passed)
chemx test tests/unit/ShippedTemplesAudit.spec.ts All tests passed (162 passed)
chemx test tests/unit/ClassicDressEagle.spec.ts All tests passed (18 passed)
chemx test tests/unit/ClassicDress.spec.ts All tests passed (48 passed)
chemx test tests/unit/TempleSolver.spec.ts All tests passed (54 passed)
npx --yes chemx@26.10.19-530 audit --no-index --unroll, then git checkout -- chemx-ratchet.json.
- Counts are as at the start: CASCADE_GUARDS 14, INLINE_BOOLEAN 5/4, LINE_BUDGET_FILE 36/4, DISPATCH_SWITCH 36, HOOK_RETURN_OVERLOAD 19.
- None of my files is listed.
All are under 500 lines.
| File | Lines |
|---|---|
| dressPlans.ts | 406 |
| dress.ts | 257 |
| dressBoard.ts | 415 |
| dressRooms.ts | 306 |
| ClassicDressEagle.spec | 181 |
| WindTemple.spec | 210 |
| ClassicTemples.spec | 410 |
| StormTemple.spec (new) | 100 |
| ClassicDungeonGuards.spec | 450 |
| TempleSolver.spec | 499 |
| wind-temple.ts | 53 |
-
Wind's room backgrounds have no floor in their path. They live at
src/assets/images/backgrounds/wind-temple/[r,c].webp, so B1's cells reuse the 1F art at the same coordinates. This is out of scope, noted only. -
A treasure carried by a boxed-in fight would lose its items. If a Big Chest holding treasure were ever carried by
a boxed-in sealed fight,
dropsOfwould hand out the gold but not the items (it sums keys and gold). Wind's Big Chest is in no fight, so this does not happen today. -
Opening a small-key side leaves the lock count stale. If an
opensentry ever opens a small-key side, the report'ssmallLockscount would not be updated. Wind opens a cracked wall, so this does not apply to it.
- Architecture
- Component-Library
- Hooks-Reference
- Temple-System
- Battle-Field-Architecture
- current_context - For AI/Human Handoff
- User Menu
- General Settings
- Family Settings
- Sound Settings
- Notification Settings
- Reward Settings
- Party Settings
- Theme Settings
- Chore Settings