Skip to content

feat(nova-hook): NOVA HOOK — arcade climber một ngón tay, chạy thẳng trên web - #4

Closed
baoduy3108 wants to merge 35 commits into
mainfrom
claude/game-animation-frameworks-k5hv7k
Closed

baoduy3108 wants to merge 35 commits into
mainfrom
claude/game-animation-frameworks-k5hv7k

Conversation

@baoduy3108

Copy link
Copy Markdown
Owner

Game arcade dọc, điều khiển bằng đúng một thao tác: giữ để móc dây vào
neo, thả để bay ra. Thời điểm thả chính là toàn bộ chiều sâu của game —
thả trúng cung xanh (tiếp tuyến tới neo kế tiếp) là PERFECT, nối chuỗi
combo và nạp NOVA SURGE; giữ quá lâu thì dây đứt và mất chuỗi.

Không phụ thuộc thư viện, không file ảnh/âm thanh: toàn bộ sprite được
sinh bằng canvas lúc chạy, âm thanh tổng hợp bằng WebAudio. Bản build
gộp thành một file HTML ~95KB, chơi được offline, cài được như PWA.

Nội dung:

  • Endless + Daily Run (seed theo ngày, mọi người chơi cùng một màn)
  • Nhiệm vụ hằng ngày, 6 skin thuần trang trí, hồi sinh miễn phí 1 lần
  • Lưu cục bộ, không tài khoản, không theo dõi, không SDK quảng cáo
  • Tuỳ chọn giảm chuyển động, bật/tắt âm thanh, nhạc, rung

Kiến trúc: phần mô phỏng tách hoàn toàn khỏi DOM nên chạy test được
headless. 49 test với node --test, trong đó có một bot tự chơi thật
trong World để kiểm tra tiến độ, tính tất định theo seed, và một test
canh độ khó (trung vị mỗi lượt phải nằm trong 8–90 giây), cùng một test
bảo đảm không chướng ngại nào chặn đường bay lý tưởng.

Co-Authored-By: Claude Opus 5 [email protected]
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M

claude added 30 commits August 5, 2026 03:21
…trên web

Game arcade dọc, điều khiển bằng đúng một thao tác: giữ để móc dây vào
neo, thả để bay ra. Thời điểm thả chính là toàn bộ chiều sâu của game —
thả trúng cung xanh (tiếp tuyến tới neo kế tiếp) là PERFECT, nối chuỗi
combo và nạp NOVA SURGE; giữ quá lâu thì dây đứt và mất chuỗi.

Không phụ thuộc thư viện, không file ảnh/âm thanh: toàn bộ sprite được
sinh bằng canvas lúc chạy, âm thanh tổng hợp bằng WebAudio. Bản build
gộp thành một file HTML ~95KB, chơi được offline, cài được như PWA.

Nội dung:
- Endless + Daily Run (seed theo ngày, mọi người chơi cùng một màn)
- Nhiệm vụ hằng ngày, 6 skin thuần trang trí, hồi sinh miễn phí 1 lần
- Lưu cục bộ, không tài khoản, không theo dõi, không SDK quảng cáo
- Tuỳ chọn giảm chuyển động, bật/tắt âm thanh, nhạc, rung

Kiến trúc: phần mô phỏng tách hoàn toàn khỏi DOM nên chạy test được
headless. 49 test với node --test, trong đó có một bot tự chơi thật
trong World để kiểm tra tiến độ, tính tất định theo seed, và một test
canh độ khó (trung vị mỗi lượt phải nằm trong 8–90 giây), cùng một test
bảo đảm không chướng ngại nào chặn đường bay lý tưởng.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Game cũ ném thẳng người chơi vào giữa shaft rồi để họ tự đoán. Giờ lượt
đầu tiên là một lượt chơi thật nhưng có "coach" đi kèm:

- Thế giới chạy 0.34x cho tới khi móc được dây lần đầu, neo cần móc có
  vòng sáng xanh nhấp nháy — không thể bấm "trễ" ở lần đầu.
- Vào bullet time 0.42x khi vòng đu tiến gần cung xanh, để người chơi
  cảm được nhịp thả trước khi phải thả ở tốc độ thật.
- Dưới mốc 2600px không sinh chướng ngại, không neo dễ vỡ, vực thẳm lùi
  thêm 700px.
- Câu chữ đổi theo kết quả thật: thả trúng thì "PERFECT — ...", thả
  trượt thì "Missed it — ...".
- Sáu dòng ngắn, tự kết thúc, không modal, không cần bấm bỏ qua; chạy
  đúng một lần, có nút "Replay the intro" trong Settings.

Kèm sửa một lỗi thật phát hiện khi test FTUE trên trình duyệt: vòng lặp
game bị dừng hẳn sau khi tab chuyển sang ẩn (loop.stop trong
visibilitychange, nếu lỡ sự kiện visible thì game đứng vĩnh viễn). Nay
tạm dừng bằng cách kiểm tra document.hidden mỗi khung hình, tự phục hồi.

7 test mới cho coach và vùng an toàn của màn intro (tổng 56 test).

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Game idle/incremental: bạn là một sợi nấm dưới khu rừng chết. Sợi thành
nút, nút bện thành dây, dây đẩy thể quả lên mặt đất, đến khi cả thung
lũng nghĩ một ý nghĩ chậm. Rồi bạn thả — tất cả hoá bào tử, chơi lại từ
đầu nhưng mạnh hơn. Prestige chính là vòng đời của sinh vật, không phải
một nút "reset lấy điểm" gắn thêm.

Ba điểm kỹ thuật đáng kể:

- Tiến độ offline là **chính xác**, không phải xấp xỉ. Chuỗi 8 tầng là hệ
  tuyến tính có ma trận tam giác trên chặt → luỹ linh → exp(At) là chuỗi
  hữu hạn 9 số hạng. Cùng một hàm advance() dùng cho tick 20Hz lẫn cho
  6 tiếng vắng mặt, nên hai đường không thể lệch nhau. Test đối chiếu với
  90.000 bước nhỏ.
- Số **không có trần**: core/decimal.js là kiểu số mantissa/mũ riêng, save
  lưu dạng "m e" nên ván có 1e1200 sinh khối vẫn nạp lại đúng.
- Cân bằng được **đo**, không đoán: tests/pacing.test.js cho một người
  chơi tham chiếu chạy engine thật trong một giờ và bắt các mốc phải nằm
  trong khoảng người thật chấp nhận được.

Bộ dò nhịp bắt được hai lỗi thiết kế thật, cả hai nay là regression test:
nút forage scale theo tổng bào tử (mỗi lần bloom biến thành một cú bấm
khởi động lại, sập vòng lặp), và công thức prestige dạng luỹ thừa (khuếch
đại qua 8 tầng thành bùng nổ kép — chu kỳ tụt từ 15 phút xuống 40 giây
trong 2 giờ). Đổi sang thang log thì chu kỳ ổn định ở 3-4 phút.

Ngoài ra: mạng nấm vẽ trên canvas đọc thẳng từ state (số nhánh theo sinh
khối, thể quả theo tầng 4, hơi thở vàng theo tầng 6), PWA chơi offline,
mã save xuất/nhập được, và bản gộp một file 63KB. 47 test, node --test,
không phụ thuộc.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
…ên tập thể

Game nhiều người chơi thời gian thực: bạn là một đốm lửa, bóng tối lan
khắp bản đồ liên tục. Mote mọc ở chỗ sáng, bạn mang chúng về beacon,
beacon đẩy lùi bóng tối. Shade chui ra từ vùng tối và cướp thứ bạn đang
cầm; đất đủ sáng thì thiêu chúng.

Ý đồ thiết kế nằm ở một câu hỏi: làm sao để sự có mặt của người lạ là
tin vui? Ở đây ánh sáng là tài nguyên chung có con số chung: chỗ sáng
sinh nhiều mote hơn, thiêu shade, và thanh bình minh là toàn cục. Nên
người lạ gửi mote ở đầu kia bản đồ làm góc của bạn an toàn hơn — không
cần chat, không cần lập nhóm, hợp tác là vật lý của thế giới.

Và điều đó đo được, không phải khẩu hiệu:
  1-2 người: không bao giờ tới bình minh (chỉ giữ được một ngọn nến)
  8 người:  ~12 phút   12 người: ~10 phút   20 người: ~8 phút

Kỹ thuật:
- Server WebSocket tự viết theo RFC 6455 (~200 dòng), không phụ thuộc
  thư viện nào. Test đối chiếu ví dụ trong chính RFC, mọi biên độ dài
  khung, khung bị cắt qua nhiều gói TCP, và 24 client thật cùng lúc.
- Server toàn quyền: client chỉ gửi hướng + số thứ tự, không bao giờ gửi
  vị trí hay điểm. Kèm giới hạn 4KB/tin, chặn spam input, chuẩn hoá
  vector, lọc tên.
- Client dự đoán chuyển động của chính mình ở 60fps, nội suy người khác
  trễ 120ms; cắt theo vùng quan tâm (AOI) nên snapshot trong thế giới
  200 người vẫn dưới 24KB.
- Bot chạy qua đúng đường input của người thật, giữ thế giới luôn có
  người, tự nhường chỗ khi người thật vào.

Bộ đo cân bằng bắt một lỗi thiết kế thật: beacon hao charge theo lượng
cố định khiến nhóm 4 người giữ bản đồ ở đúng 0 ánh sáng vĩnh viễn. Đổi
sang hao theo tỉ lệ thì nhóm nhỏ vẫn tiến được, chỉ cú đẩy cuối tới bình
minh mới cần đông người — đúng cảm giác mong muốn.

36 test, gồm test dựng server thật rồi cho 40 client đồng thời vào chơi.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
… cặp đôi

PRISM (game #4, thể loại khác hẳn 3 game trước): puzzle logic dẫn tia sáng
qua lưới bằng gương và bộ tách chùm. Điểm đáng kể: có solver vét cạn, mọi
câu đố sinh ra đều được CHỨNG MINH giải được trước khi đưa cho người chơi,
và solver còn chứng minh được câu đố bất khả thi. Test bắt một bug thật:
solve() đếm số nước xoay so với vòng lặp trước thay vì trạng thái ban đầu,
làm mọi "par" và gợi ý đều sai.

LUMENFALL (game github#5): gộp theo cây cặp đôi đúng như yêu cầu —
  1×3 arcade × thế giới chung → THE CLIMB
  2×4 idle × puzzle          → THE ENGINE
  3×2 thế giới chung × idle  → THE COMMONS
  4×1 puzzle × arcade        → THE LOCK
rồi gộp bốn lai đó thành một.

Chất kết dính: một cây đèn là CÙNG MỘT VẬT THỂ trong cả bốn lớp — vừa là
chỗ đu dây, vừa là ổ khoá phải giải, vừa là cỗ máy kiếm lumens khi tắt máy,
vừa là ánh sáng chung đang bị đêm ăn mòn.

Phát minh thật nằm ở 2×4: bàn cờ tia sáng mở khoá xong Ở LẠI làm cỗ máy của
cây đèn đó, và cách bạn dẫn tia CHÍNH LÀ sản lượng lumens/giây vĩnh viễn.
Không mua đèn tốt hơn — dẫn tia tốt hơn. Solver biết trần của mỗi bàn nên
game nói thẳng "đang ×1.06, có thể ×1.62".

Và 4×1: bóng tối vẫn dâng trong lúc bạn ngồi nghĩ ổ khoá.

15 test cho các mối nối (không phải cho từng phần), gồm: offline đúng dạng
đóng đối chiếu 72.000 bước nhỏ, mọi ổ khoá đều mở được, bàn cờ luôn chạm
được trần của chính nó, và chết vì mải giải đố.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Bản trước sai: tôi bê nguyên LỐI CHƠI của game 1 (đu dây) làm khung rồi
gắn ba game kia lên. Đu dây xây thì vui, đưa cho người khác thì không ai
chơi nổi. Nay bỏ sạch bốn giao diện cũ, chỉ giữ bốn cái lõi:

  NOVA HOOK  → giá trị của MỘT khoảnh khắc quyết định
  PRISM      → sắp xếp vật tĩnh để năng lượng chảy tối ưu
  HYPHAE     → thứ bạn dựng vẫn chạy khi tắt máy
  EMBERFALL  → nó hao mòn cho tất cả, mọi lúc

Bốn lõi đó sinh ra một lối chơi mà không game nào trong bốn cái có: xung
sáng chạy dọc tuyến bạn tự dẫn, vòng tròn khép lại ở mỗi nút, chạm MỘT
cái đúng lúc. Một ngón tay. Không phản xạ, không khéo tay, không thua —
là một nhịp, không phải bài kiểm tra.

  1×3 THE BEAT   chạm đúng nhịp để nạp nút; trượt vẫn được chút ánh sáng
  2×4 THE ROUTE  xoay gương đổi xem nút nào nằm trên nhịp; solver biết
                 trần nên game nói thật "đang 1.2, tối đa 1.6"
  3×2 THE NIGHT  nút đã nạp sinh lumens kể cả khi đóng tab, và hao mòn
                 trên đúng hàm mũ mà phần thu tích phân qua
  4×1 THE DAWN   sáng đủ thì đêm vỡ, đổi lấy ember nhân vĩnh viễn

Sửa hai lỗi thật khi đo bằng máy:
- bàn cờ sinh ra ở trạng thái "chưa giải" nên 9 giây gõ đầu tiên không ăn
  gì; nay mở màn ở tuyến gần tối ưu, lệch đúng một gương.
- hai xung cùng chờ mà chỉ có một ngón tay ⇒ 99 trượt / 16 trúng. Nay
  không phát xung mới khi còn xung đang chờ: 23 trúng / 1 trượt.

12 test cho từng lõi và cho các mối nối giữa chúng.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
The previous five games shared a flaw the bots kept proving: a fixed policy
played each of them optimally, which is why they felt hollow to play. This
one is built so that cannot be true. The house keeps a model of *you* — the
tiles you wear out, the door you favour, the shadow you wait in, how quickly
you work — and every night it changes itself to beat that model, announcing
each change in plain words.

The design claim is falsifiable and tested: a bot replaying a working plan
must get worse at it. Measured over 5 houses x 12 nights, a careful player
who reads the guards' cones escapes ~60% of nights; a shortest-path bot that
ignores them, ~15%. That gap is the game.

Four fairness rules exist because a bot found the unfair case first:
- the cone a guard will look down *next* turn is drawn on the board, so
  planning is possible and guessing is not required
- a doorway is cover, or the house eventually camps your only way in
- a new lock releases the oldest one, so it can never bolt every door
- dawn ends the night at 45 turns, so waiting is a resource

Bilingual with a one-tap VI/EN switch in the corner. Nothing stores a
sentence: doors carry ids, the house records structured events, and words
are chosen at drawing time, so the button re-reads the whole history.

Deletes nova-hook, hyphae, emberfall, prism and lumenfall — recoverable from
history if any of it is ever wanted back.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
A listening post, a dial, and a paper roll. Most of the band is machinery
pulsing on fixed periods; somewhere among it a person is sending by hand.
Their message is two digits, and those digits are where they will be
tomorrow — so a night read correctly is not a score, it is a place to stand
the next night, plus one more sentence from someone far away. Miss it and
they are gone: sweep blind tomorrow, with one more voice in the way.

Two tells, and the second one is the game:
- no machine here uses a period of two, so the grammar finds the person
- from night five something imitates that grammar with the wrong number,
  and the only thing separating them is that a hand on a key is never
  exact while the imitation keeps perfect time

Deliberately no panorama of the band. A spectrogram would hand over every
station for free; the meter says something is here, and only listening says
what. The technique that gets you through a jammer is the real one — tune
slightly off and the neighbour fades faster than the voice you want.

The suite ends with a bot that gets nothing but the dial: sweep, try
thresholds, split on the long silences, believe a number only when it
arrives several times on a steady beat. It reads 190 of 200 nights across
seeds and night levels 1-20. Separately, the generator proves before handing
a night over that a readable spot exists, pushing the loudest neighbour away
and finally off the air if not — asserted at 100%, because a generator that
can emit an unsolvable puzzle is a bug the player would blame on themselves.

Difficulty is more voices, not faster ones: one clear night at the start,
44% of ticks contaminated by night twelve.

Bilingual VI/EN on one button, sound optional and fully redundant with the
paper roll.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
A player could not tell what the numbers meant, which makes the whole game
unplayable — the code is the game. The old wording described the grammar
("pairs, two notches apart") without ever showing one, so it read as a
definition rather than an instruction.

Now the coach shows the thing itself: clusters versus lone machine ticks,
count each cluster, and then the example that makes it land — four pulses,
pause, seven pulses, that is 47, and tomorrow they are at mark 47. The
permanent legend carries the short form so it is on screen at all times.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
The last game was too hard to even understand, so this one is built the
opposite way round: it shows you everything and lets persistence carry you.

The danger zone is painted on the floor during every wind-up — where the blow
lands, plus a bar that fills as it gets closer — and vanishes the moment the
swing goes live. Two tests hold that honest: the real hit span must sit
inside the span that was drawn, and no warning may survive into the active
frames. Phase two escalates by shortening recovery, never wind-up, so the
tells stay exactly as readable and only the punish window shrinks.

Dying is the progression. Damage dealt becomes essence; die and it drops
where you fell, and picking it up next attempt banks it immediately —
spendable win or lose. A browser playtest caught that this was broken:
ESSENCE 0 after taking the boss to 53%, because essence only banked on a
win, which meant a player who could not win could never buy anything and the
whole premise was a lie. Now it is a test.

Measured by two bots every run: reading the tells wins 82% at level 0 and
100% fully upgraded; walking forward mashing attack wins 0%.

Also fixed along the way: a roll's ease-out raised a negative base to a
fractional power on its final frame, and the resulting NaN silently
teleported the knight out of the world — the sim ran for four minutes with
196 swings and zero contact before a diagnostic printed the position.

Five languages (vi/en/ja/ko/zh) on one button, deliberately outside the HUD
because a fixed-position parent makes its own stacking context and a button
inside it can never rise above the death screen.

Deletes signal/ — recoverable from history.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
First half of turning the single arena into a place you explore. The map is
authored as a graph rather than a level list, because the thing that makes a
souls map feel like somewhere real is not its size — it is that it folds back
on itself. You walk the long dangerous way out and a ladder drops you thirty
seconds from the fire you started at.

That folding is measured, not asserted by vibes: shortcutValue() reports how
many rooms each shortcut saves off the walk to a boss, and a test fails any
shortcut that saves nothing, because a shortcut that saves nothing is
scenery. Another test proves no room can strand you away from every fire — in
a game whose entire loop is die-and-walk-back, a room you can enter but never
leave is not difficulty, it is a lost save.

Shortcuts open from the far side only, so a fold has to be earned from the
long way round instead of being handed over as a door.

Room depth is derived from the graph, never authored beside it. The first
version carried hand-written depth numbers and they were already wrong when
the tests first ran — belfry was labelled 4 rooms in and was actually 7. Two
sources of truth for one fact drift apart immediately.

26 tests pass. Still to come: wiring this into the renderer so it can be
walked, lesser-enemy combat reusing the existing fight rules, the map screen,
and area names in all five languages.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Scaled to roughly Dark Souls 1's shape. The 36-area graph and every
connection between areas is authored by hand — that is the part that decides
whether a world is a place or a level select — and the rooms inside each area
are grown from it deterministically. One source of truth, no 400-line table
to keep in sync, and a map that cannot disagree with itself.

Foes are counted the way that game counts its ~70: sixteen families across
five carry variants, minus the combinations that make no sense (nothing at
190 speed lugs a heavy shield), giving 75 concrete types with real stat
spreads — the fastest is over four times the speed of the slowest.

Nine folds. Each measured, not asserted: shortcutValue() reports how many
rooms a fold takes off the walk from the nearest fire, and they save between
10 and 98. A fold that saved nothing would fail the suite, because that is
scenery wearing a shortcut's clothes.

Two real bugs the tests caught immediately:
- areas run to tier 11 but there are only eight tiers of creature, so the
  deepest third of the map was picking foes out of an empty list and filling
  its rooms with `undefined`
- one boss sat 35 rooms from the nearest fire. Walking 35 rooms back after
  every death is not difficulty, it is a reason to stop playing. Every area
  now has a fire, and every boss has one in the room before it.

tools/map.js draws the whole thing to dist/map.svg — one dot per room, one
line per door, folds dashed — because whether a world folds back on itself is
something you should be able to see, not take on faith.

30 tests. Still to come: weapons, then wiring this into the renderer.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Every area is an inked landmass with an organic coastline, coloured by what
it is made of — eight biomes, so stone reads cold grey, the marsh and the
drowned city read blue, the forge and the kiln burn, the wood is green, the
ossuary is bone, the void areas are violet. Depth is a band down the page, so
the whole thing reads as a descent.

Every room is a glyph that says what kind of space it is: hall, stair,
bridge, cave, yard, each drawn differently and each fading up in opacity with
how many things live in it. Bonfires are flames with a glow. Bosses are a
sigil in a red ring with their name inked beneath the area cartouche. Gates
between areas arc with a ring at the threshold; the nine folds are gold
dashed threads drawn last, over everything, because seeing the far side of
the world reach back to the near side is the entire point of the picture.

Fixed on the way: two opacity attributes on one element aborted the SVG
parse, so the first render lost every label, the title and the whole legend —
the browser drew the landmasses and then stopped. dist/map.svg now parses
clean, checked in the build.

Nothing here is authored by hand. It is generated from src/world.js, so the
map cannot drift from the game it describes.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
HANDMADE in src/world.js replaces an area's generated rooms entirely: the
name in two languages, a line of description, the exact creature standing in
each spot, the light, and a design note saying what the room is *for*. Any
area not listed there is still grown, so the game stays whole while the map
is written one area at a time rather than in a single unfinishable sitting.

The undercroft is the template — seven rooms, all authored:
  the cell           empty, a door left open a long time ago
  the ash pit        the first fire
  the long drain     two husks, one carrying a torch
  the kennel         two hounds — the first fast enemy, teaching that
                     rolling is not only for big swings
  the broken stair   a husk with a spear in a chokepoint, the first room
                     that pays for standing in the right place
  the lamplighter's rest
  the undergate      two ways out, both worse than here

Rooms now carry name/line/light/note, and a test refuses a hand-written room
that has no name, no description, or a creature with no stat block. The other
361 rooms keep working exactly as before.

31 tests. Next: the remaining 35 areas, written the same way.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Second area written by hand: nine rooms of open ground after seven of drain,
so every fight in it is about space rather than corridors. It is where the
game teaches that being surrounded can happen, and then does it to you.

  the gate mouth    daylight, of a sort
  the yard          three husks, well apart — pull one at a time or lose
  the well          a swift hound, waiting
  the broken cart   two spears behind cover; in the open this would be unfair
  the shrine        nothing lives here — a breath between two hard rooms
  the north walk    narrow with a drop, so they come single file: the reward
                    for anyone who learned the broken stair
  the thicket       first pack, three fast things at once, near a way out
  the arch          first heavy variant — same creature, twice the poise
  the outer door    first ring. The whole area was teaching you to avoid this

Rooms now carry a layout — single, spread, pack, ring, ambush — taken from
the reference kit's spawn patterns, because "three husks" and "three husks
surrounding you" are different rooms and a list of names cannot tell them
apart.

A test caught the first version handing a crowd arrangement to empty rooms:
a room with nothing in it has nothing to arrange. Empty rooms are now
'single' by rule, and the undercroft states its arrangements out loud rather
than leaning on a default.

32 tests. 16 rooms hand-written across 2 areas, 352 still generated.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
They were eighteen strings on a map. Now each one is who it was, three ways
it kills you with the frames written out, the tell for each, and what its
second phase takes away. Names and lore in both languages; numbers in the
same units as the Warden in rules.js, so a move here drops straight into that
fight loop with no translation.

The law from the Warden fight holds across all of them, and the suite
enforces it: no wind-up under 0.35s, recovery always longer than the active
frames, and a second phase that shortens recovery but never the wind-up. A
boss gets harder by giving you less time to use what you read — never by
hiding it.

One test worth having: each boss's hardest hit must also be its most readable
one, with the longest wind-up and the biggest opening. The Chanter failed it
on the first run — her kneel hit for 26 with only 0.75s of recovery, which
makes the heaviest attack in her set a tax rather than an invitation. Raised
to 0.88.

37 tests.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
I pushed the previous commit with a red test, which I should not have done —
this is the fix, and the fix found two real design faults rather than one.

The rule: a boss's biggest attack must also be the one with the longest
wind-up and the longest recovery. If the hardest hit is also the fastest, it
is not a challenge, it is a tax — you cannot read it and you get nothing for
surviving it.

  the drowned king  the sceptre hit for 24 off a 0.7s tell while the summon,
                    with a 1.15s tell, hit for 22. Swapped: the summon is now
                    the heavy one, the sceptre is a jab.
  the shepherd      the drive was simultaneously his heaviest and his fastest.
                    The whistle has the long tell, so what the flock does when
                    it answers is what should hurt.
  the chanter       her kneel hit hardest with only 0.75s of recovery, too
                    little to punish. Raised to 0.88.

Also: checking these one at a time was the wrong method — a five-line script
listed every violator at once and there were only three.

38 tests, green.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Eight rooms of moving water. The area teaches footing and then takes the
floor away at the end of it.

  the sluice gate    the wheel rusted open; nobody was coming back to close it
  the overflow       fast water under a narrow plank. One of the two carries
                     the torch, so killing it makes the room harder to read
  the silt bank      first crawler, waiting under soft ground — slow, heavy
                     poise, and it punishes panic-rolling straight into it
  the weir           two spears on the far bank and one way across. They know
  the drowned cells  water at chest height, some doors still locked
  the grate          a dead end and three of them behind you. The courtyard
                     taught you to fear a ring; this one has no way out
  the keeper's step  dry stone above the waterline, and the fire — close
                     enough to the boss that dying to it stays cheap
  the drain head     the bloated. The room is a bowl and the bowl is full

A test caught the boss room: a hand-written room is checked against the list
of kinds an author may write, and 'fog' is not one of them because the map
sets it, not the author. Now the check allows it and additionally insists
that any room holding a boss *is* fog.

38 tests. 24 rooms hand-written across 3 areas, 344 still generated.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Ten rooms. Everything before this was a corridor wearing the costume of a
choice; the gatehouse ends in two doors and refuses to tell you which is
easier, because neither is — both lead to tier 2.

  the portcullis       lowered, teeth still up: somebody won an argument here
  the guardroom        the fire, chairs still facing it
  the murder hole      a spear from a direction the game has not used yet
  the barracks         three of them, waking one at a time — the room pays
                       for a quiet approach
  the armoury          heavy plus reach: the first pair that punishes one bad
                       roll rather than several
  the winch            something asleep in the slack of the chain
  the lantern keeper   the first acolyte, and the first enemy that fights on
                       purpose rather than out of habit
  the long hall        four of them using the pillars better than you are.
                       The pillars are also the answer
  the wall walk        open on both sides, a fast pack, nowhere to stand but
                       forward
  the two doors        deliberately unsignposted

38 tests. 34 rooms hand-written across 4 areas, 334 still generated. Twelve
of the seventy-five foe types have appeared so far, which is the shape I
want: the early game should be a small cast used well.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Nine rooms of standing water, and then a hatch in the floor that drops you
into the room you woke up in, four areas ago. Verified end to end: the fold
opens at the hatch, lands at the ash pit, and takes fifteen rooms off the
walk.

That moment is the entire reason this world is a graph and not a list, so
the room it happens in is built for it — lit, quiet, and with nothing in it
to fight. The realisation is the event; putting an enemy there would talk
over it.

  the inflow         the drain empties here, and so does what it carried
  the dry shelf      a ledge the water never reached; the fire
  the pillar field   sound travels — they hear you before they see you, and
                     the pillars cut both ways
  the wading         first ghouls, knee-deep, in the one place where your
                     roll is slower than theirs
  the sunken arch    the top of an arch, so the rest is under your feet
  the deep end       two crawlers where the footing is worst
  the overspill      up, out of the water
  the hatch          bolted from this side
  the chapel stair   dry stone, and singing somewhere above it

38 tests. 43 rooms hand-written across 5 areas, 325 still generated.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
The Watchman's cheapest move is a shove for twelve damage that wants the drop
behind you. So the area spends ten rooms teaching that the fall is worse than
the hit, and then hands you a boss built around exactly that.

  the tower stair      out into the weather
  the roof fire        under an awning, still burning; someone was thorough
  the first span       no rail on the left, and one spear with long reach
  the arrow slits      reach from cover — the room wants you to walk past it
                       rather than clear it
  the broken merlon    fast things beside a hole: the first room that kills
                       by geometry rather than damage
  the siege ladder     they arrive one at a time from below. Hold the top and
                       it costs nothing
  the brazier walk     a line of cold iron baskets, all but one
  the collapsed span   a plank across a real gap, two swift hounds on it
  the old signal       first knightling — armour and poise, and it does not
                       stagger from a single hit
  the watchpost        his chair, his view of the road, and not him
  the north tower      the only thing up here still doing its job

Checked rather than assumed: the nearest fire is two rooms from his door.

38 tests. 54 rooms hand-written across 6 areas, 314 still generated. Fifteen
of seventy-five foe types have appeared.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Deliberately the opposite of the ramparts. The wall kills you with its edges;
the chapelyard has no edges at all and kills you with arithmetic — enclosed
rooms, more of them than there are of you, and nowhere to back into. Both
branches are tier 2 and neither is the easy one, which is the point of an
unsignposted fork.

  the lychgate       a roofed gate for setting a body down; only the roof left
  the porch          a fire somebody keeps feeding
  the nave           four of them down a long room. The benches are cover,
                     not decoration — four in the open would be too many
  the side chapel    small enough that what is in it is already close
  the choir          three rows facing each other, closing the aisle behind
                     you. The first ring made of a single enemy type: it is
                     about the count, not the mix
  the crypt stair    the singing gets quieter, which is not the same as safer
  the charnel        no cover, no edges, three of them. The arithmetic room
  the bell rope      empty and quiet on purpose
  the vestry         first stonemask — poise high enough that trading hits is
                     simply not on the menu
  the ossuary door   carved with a choir, and the carving is a plan of what
                     is through it

38 tests. 64 rooms hand-written across 7 areas, 304 still generated. Twelve
of seventy-five foe types so far — the early game keeps reusing a small cast
and only adds one when it has something new to teach.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
A tower, so it reads vertically: eight rooms stacked, each narrower than the
last, one rope running down the middle of all of them. At the top you cut the
last rope and it drops to the yard you crossed on the first day. Checked:
the long drop lands in the courtyard's yard and takes 28 rooms off the walk.

  the bell stair     worn deepest on the outside edge; people came down fast
  the ringing floor  eight ropes, seven tied off, and the fire
  the first bell     still warm from being struck, and nothing here struck it
  the frame          first moth — the fastest thing in the game so far, put
                     on the narrowest floor in it
  the cracked bell   split lip to crown; it still rings, it rings wrong. Two
                     armoured things in a room with no room
  the roost          three moths at once: the hardest room here
  the long drop      the last rope, uncut. Empty, like the hatch was
  the upper door     out onto the roofs, where you can see how much of this
                     place there is

Fixed a test that had rotted rather than held: it asserted the generated
remainder was still over 300 rooms, a number the hand-writing was always
going to walk past. Replaced with the actual invariant — written and grown
rooms partition the world exactly, and the generator still covers everything
unwritten.

38 tests. 72 rooms hand-written across 8 areas.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
The Chanter's verse is a ring of sound you escape by leaving the circle, not
by backing away from her. So the area is built to teach that difference
before the door: rooms where retreating works, and rooms where only getting
out of the shape does.

  the bone door       not carved to look like bone; made of it, fitted well
  the antechamber     a bench, a fire, a place to leave your boots
  the sorting floor   the work is half done, and the half that is done is
                      very neat
  the femur walk      a causeway of long bones, all laid the same way
  the skull wall      a stonemask against a wall of faces — you cannot tell
                      which one moved
  the echo            whatever you do happens twice, the second time behind
                      you. The room teaches you to stop trusting your ears
  the lower choir     a rehearsal for the verse: the ring closes on a beat
                      you can actually hear
  the reliquary       cases mostly emptied, and one opened from the inside
  the tallow room     they render something here to make the candles
  the descant         a narrow gallery with four of them on it — the hardest
                      room, and the last before the fire
  the cantor's step   worn in the middle, facing the loft. Where she stood
  the choir loft      the bones are stacked in the shape of a choir, and the
                      choir is facing her

Checked: the fire is one room from her door. Three of eighteen bosses now
have a hand-written approach.

38 tests. 84 rooms hand-written across 9 areas.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Every area so far has been a place people worked: a drain, a wall, a bell, a
bone store. This is the first whose rooms had a use that was not defence — a
stable, a kitchen, a hall for eating in — so the horror in it is domestic,
and it is the last quiet before the gold.

  the inner gate       smaller than the outer one and much better made; this
                       was the door that mattered
  the well court       a bucket, a rope, and a fire someone lit out of habit
  the stables          twelve stalls, all opened from the inside. A pack in a
                       room built to hold animals — the stalls are the cover
  the kitchens         a pot still on, with something in it that has been
                       there a long time
  the servants' stair  narrow and unlit and it goes everywhere. It is how the
                       whole place worked
  the hall of arms     first warder — the poise wall proper, and the first
                       thing that punishes greed twice in one exchange
  the gallery walk     portraits down one side, all facing the far door
  the solar stair      warmer going up, and brighter, and neither is good news
  the gilded door      gold leaf worn through where a hand goes: the only
                       sign that anybody still opens it

38 tests. 93 rooms hand-written across 10 areas, 16 of 75 foe types used.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
The largest area so far, and the only fork in the world that goes three ways.
Everything in it is corridors cut through the dead, so the area is about file
order: who reaches you first, and whether you chose that. Verified the last
room really does open onto the vault, the marsh and the winding stair.

No fold leaves the catacombs. It is the one place the world does not shrink,
which is what makes getting lost down here mean something.

  the way down          cut, not built: whoever made it was going somewhere
  the lamp niche        a shelf for one lamp at the height of a hand, still lit
  the first gallery     the empty top shelves are where the ghouls come from,
                        one beat after you have committed
  the narrow file       three armoured things in a corridor that only lets
                        one of them work
  the collapsed vault   the ceiling took two galleries with it
  the water table       first drowned, a long way from any marsh — the water
                        got here before you did
  the lost count        the shelf numbers stop agreeing; two rooms share one
  the mason's mark      the same mark on every stone, upside down on one. That
                        stone is the door, and the two stonemasks are the
                        reason to bother finding it
  the deep gallery      older work, better work, shelves still full
  the black stair       no lamp niches: nobody who cut it expected to come up
  the wet descent       you can hear it moving somewhere below
  the last lamp         somebody carried it this far and set it down
  the three mouths      three openings, three different hands, none the mason's

38 tests. 106 rooms hand-written across 11 of 36 areas, 19 of 75 foe types.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Eight rooms of it, which after eleven areas underground is its own kind of
hostility. The Gilded's tell is light running down the blade, so the area is
lit brightly enough that a gleam is genuinely hard to pick out, and spends
six rooms teaching you to watch the arm instead.

The fire and the fold share a room on purpose: the lift head is the safest
place in the area and the whole reason to have walked up here. Verified —
it drops to the gatehouse guardroom and takes 35 rooms off the walk, and the
fire is one room from the boss door.

  the gilded stair          every tread edged in gold; never for walking on,
                            for being seen on
  the antechamber of light  windows on three sides and a fire nobody needs
  the long window           light in strips, and shadows in strips: the room
                            where reading a tell first gets hard
  the leaf room             gold beaten thinner than paper. The leaf moves
                            before they do — the only honest warning here
  the mirror walk           bronze down both walls: four of you, one problem
  the throne approach       a carpet still red, nothing on it in years
  the lift head             a counterweight and a lever, straight down
  the solar                 the brightest room in the world, and he is facing
                            the window

38 tests. 114 rooms hand-written across 12 of 36 areas — a third of the world.
22 of 75 foe types.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
A treasury, so every room was built to be hard to get into and nobody gave a
thought to getting out. Eleven rooms of one-way doors, and the last two are
already warm: the forge is close and the area lets you feel it before it
says so.

  the vault door        a foot of iron on a pivot, standing open. Whatever
                        opened it had a key
  the clerk's room      a ledger, a lamp, a chair pushed back in a hurry
  the counting hall     benches worn into grooves by coin; four still at work
  the strong boxes      cages inside the room, one shut from the inside —
                        that one is the ambush
  the lead room         lined floor to ceiling, dead quiet. No sound cue at
                        all, so the moths arrive on sight alone
  the assay             small furnaces for testing metal; one relit
  the deep shelf        a ledge around a bottomless shaft. The drop does the
                        killing, not the ghouls
  the collapsed scale   a weighing machine the size of a room, fallen through
                        its own floor
  the tally wall        marks cut in fives that keep going after the light
                        stops — the only thing that ever counted the dead here
  the second door       identical to the first, and it only opens outward
  the forge stair       the handrail is warm, and has been the whole way down

A test caught the tally wall calling itself a ring with two foes in it. Two
things cannot surround anybody. It is the hardest room in the area, so the
fix was a third enemy rather than a smaller claim.

38 tests. 125 rooms hand-written across 13 of 36 areas, 24 of 75 foe types.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
The Drowned King's third move calls three of his court up out of the water.
So the area is the court: twelve rooms of them standing in it, most of them
not moving, and nothing ever says which are scenery. Learning to tell is the
area. Getting it wrong is how it kills you.

  the reed gate         reeds taller than a man, in rows, and the rows were
                        planted
  the dry hummock       a hand of dry ground, and somebody found it first
  the standing court    forty of them waist deep, facing one way. Two turn.
                        The whole area in one room
  the sunk road         paving under a foot of water, running straight out
                        and straight under
  the eel run           a channel things use to get behind you — the room
                        punishes fighting with your back open
  the lantern poles     evenly spaced, every lamp out: the only landmark in
                        an area with no walls
  the flooded shrine    the altar is high ground and the one place the ring
                        cannot close
  the mud flat          nothing to hide behind, and nothing hiding
  the willow line       still in a line, and still alive
  the king's boat       beached, upright, empty. He got out and walked
  the last dry stone    after this there is no more standing
  the open water        no bank, no bottom, and the court already surrounds
                        the room before he calls it

Checked: the fire is one room from his door. Five of eighteen bosses now have
a hand-written approach.

38 tests. 137 rooms across 14 of 36 areas, 28 of 75 foe types.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Nine rooms of cages, which is a strange thing to find above a throne room.
Everything here was kept for its voice and the voices are still going. It is
where the chorister first appears, and where the game stops using sound as a
warning and starts using it as a lie.

  the cage door        barred on the outside: this whole floor is the cage
  the keeper's loft    seed in jars, water in a dish, and all of it recently
                       topped up
  the great cage       wire floor to roof with a dead tree inside. The first
                       room with a ceiling, against things that fly
  the perch walk       a rail at head height that breaks your line of sight
                       and none of theirs
  the moulting room    ankle deep in feathers that are not from any bird
  the song room        built round, for the sound, and she is standing where
                       it works best — the first chorister, in a room shaped
                       to make her wind-up sound closer than it is
  the open roof        torn open from the inside; whatever left did not come
                       back. Reach in the middle, speed circling it
  the empty cages      two hundred, all open, all clean. Somebody let
                       everything out on purpose
  the spire stair      outside the building, and no rail at all on this one

38 tests. 146 rooms hand-written across 15 of 36 areas, 28 of 75 foe types.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
claude added 5 commits August 7, 2026 20:37
The Smith made most of what you are carrying and would like it back, so what
stands between you and him is everything he ever made: the billets before
they were anything, the blades that came out wrong, and the rack of the ones
that came out right.

It is the loudest area in the world, which is exactly why the room before his
door is the quietest one in it. His hammer going up is the tell, and silence
is where it lands.

  the slack tub       water black with scale, and warm — somebody quenched
                      something here today
  the bellows room    two leather lungs the size of carts, breathing alone
  the billet yard     iron stacked by weight, none of it yet anything
  the hammer line     first ironclad. Six trip hammers keep a beat you can
                      hide your own footsteps in
  the quench trough   steam standing over the channel, hiding the far half.
                      His quench is rehearsed here
  the scale pit       knee deep and it moves under you like sand
  the blade rack      everything he got right, in order, with a gap in it the
                      shape of yours. That gap is why he is coming
  the unfinished      everything he got wrong, in a heap, some still moving.
                      His failures fight better than most things that work
  the anvil step      one cold anvil and a stool: the only quiet room in the
                      forge, on purpose
  the great hearth    wide enough to lie down in, hot enough that you will not

Checked: the fire is one room from his door. Six of eighteen bosses now have
a written approach.

38 tests. 156 rooms across 16 of 36 areas, 31 of 75 foe types.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Eleven rooms following it anyway, because the road is the only straight line
left in the marshes and everything still walks it, in file, in the direction
it was going.

The fold at the end is a culvert that comes up inside the chapelyard porch —
checked, and it takes 20 rooms off the walk. It is the first fold that
explains something rather than only shortening something: the road always did
end at the chapel, it just stopped being above ground.

  the milestone        a distance and a name, both under the waterline
  the way house        built for travellers, one storey up; the ground floor
                       is a pond
  the first ford       stones exactly one stride apart, so your roll lands on
                       one or it does not
  the toll arch        a gate across a road with no wall either side, and
                       somebody still collects
  the pilgrim line     they arrive in file because the road is a file
  the sunk inn         a roof at knee height with a room under it, sign still
                       legible
  the broken causeway  the ramparts' lesson again, wetter
  the ferry post       a post, a rope, no boat, and the rope stays taut. Never
                       explained
  the shrine of the road   coins in the bowl, and the bowl is above the water
  the chapel culvert   a drain wide enough to walk up
  the wood edge        the water stops at a line of trees, too suddenly to be
                       natural

38 tests. 167 rooms across 17 of 36 areas — nearly half the world.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
The Keeper keeps the stair. Not from anything; she simply keeps it. So the
area is the stair: eight rooms that are all the same stair, getting narrower,
and the only thing that changes room to room is how much space you have to
roll in. By the last landing there is almost none, which is the argument the
fight is going to make.

  the lowest step     worn into a bowl by feet, and nothing has come down it
                      in a long time
  the first landing   wide enough to turn around on — the last time that is
                      true
  the turning         round a pillar, so you never see more than a quarter of
                      it. First wisp: the fastest thing alive, on a stair
                      with no sightline
  the narrowing       each flight a hand narrower than the one below. Nobody
                      built that by accident — and the ironclad, the widest
                      enemy in the game, is in the room running out of width
  the window step     the one room with a view and no space to enjoy it
  the bell below      hung under the floor above so it rings down at you. Her
                      toll rehearsed: sound from overhead, one beat early
  the last landing    two paces across, and the fire is in the middle so you
                      step around it
  the stairhead       not a room. The last flight, and she is standing on it

A boss arena with no arena, which is the entire idea of her. Checked: the
fire is one room below. Seven of eighteen bosses have a written approach.

38 tests. 175 rooms across 18 of 36 areas — half the areas written.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Thirteen rooms of a country that already burned. Nothing here is on fire any
more, and that is the point: the only heat left is underfoot. It is also
where the world stops being built by people, so the first colossus stands in
it — enormous, slow, and it does not stagger at all.

  the cinder fall       loose cinder that moves when you do and keeps moving
  the ash camp          a slate windbreak and a fire banked for the night
  the standing stacks   chimneys with no houses under them, in the pattern of
                        a street — the only cover, exactly a street apart
  the glass field       sand gone to glass in ripples; it takes your weight,
                        mostly
  the charcoal rows     a plantation burned standing, every trunk still in row
  the smoke line        a crack in the ground you cannot cross, so every fight
                        here is frontal
  the buried village    roofs at ankle height: you are on somebody's second
                        storey
  the kiln yard         brick domes each with a door, and one door is warm
  the white ash         ash goes white when it has burned completely. This is
                        the part that burned longest, and the colossus is in it
  the ember drift       live coals under a skin of grey — the floor hurts, so
                        the room is about where you stand, not who you fight
  the long burn         a coal seam alight underground. Two things that will
                        not stagger, on hot ground: the hardest room here
  the second camp       same windbreak, same banked fire. Somebody walks this
                        road both ways
  the gate road         up, towards something still burning properly

38 tests. 188 rooms across 19 of 36 areas, 33 of 75 foe types.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
The Shepherd is not protecting the wood from you. The area is you finding
that out: trees in rows because somebody planted them, notches cut in because
somebody counted them, and gaps because somebody took some. By the hut you
know, and the fight is only the confirmation.

  the treeline          starts all at once, in a straight edge, the way a
                        field starts
  the fold              stacked stone in a circle, with a gate, and the fire
  the first stand       planted in rows; you can see down every one and there
                        is nothing in any of them. First shade — it arrives
                        from the row you were not looking down
  the thinning          every third tree gone, stumps cut clean. Husbandry
  the crook marks       a notch at shoulder height on every trunk, all the
                        same height. That height is his reach, marked on the
                        world a room before you meet it
  the white bark        pale enough to see by: whatever comes, you will see
                        it, and it knows
  the grazing           bare ground cropped short — something feeds here and
                        keeps it neat
  the cull              trunks dragged into a heap. He took these out for a
                        reason, and the heap is the only thing keeping the
                        ring from closing
  the lambing ground    saplings close together, none of them old
  the deep stand        too big to have been planted by anyone still
                        remembered — and these are the ones he calls first
  the shepherd's hut    one bed, one window facing the clearing, and a fire he
                        laid this morning
  the clearing          round and open, trees standing all the way around the
                        edge, facing in

A test caught the cull calling itself a ring with two foes, the same fault as
the tally wall in the vault. Its own description says the heap is what stops
the ring closing, so there had better be a ring: added a third.

38 tests. 200 rooms hand-written across 20 of 36 areas. Eight of eighteen
bosses have a written approach.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TZgvaYvAdsLjLN68XAM68M
Repository owner locked and limited conversation to collaborators Aug 7, 2026
@baoduy3108 baoduy3108 closed this Aug 7, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants