# Project status & handoff

**Summary.** This is the resume point. It says what GLOWFALL is, what's built, where to play it,
and what's still waiting. A new session (or a new person) should read this page first, then
[Home](Home.md). Keep it current: update it at the end of every working session. The full
milestone-by-milestone log is in [Build history](history.md).

*Last updated: 2026-10-03 (shipped as v1.0; Phases 8-10 closed the short-of-the-plan lists,
checked difficulty and sound, and brought Stage 1 to the bar; Phase 11 proved every branch of
every stage by play in the sim (178 branches) and a Perfect Weave campaign, finding and fixing
twenty-four bugs no check had seen; Phase 12 tidied what the proofs left; Phase 13 taught the
play bot to read tells and judged the hard spots again, fixing two traps. Phases 0-13 are done;
the owner's playtests and a full campaign run by hand wait).*

**See also:** [Home](Home.md) · [Roadmap](roadmap.md) · [Build history](history.md) ·
[Open questions](open-questions.md)

---

## What GLOWFALL is
An NES-style co-op run-and-gun for 1-4 players, a Contra that takes place on Veyra, Avatar's moon
of living light. It runs in the browser on a deterministic fixed-point sim: the same code plays
alone, on one screen with up to four players, and online (rollback netcode through the
expedition server). Eleven stages, seven movement modes (SIDE, VERT, TOP, RIDE, FLY, SWIM and
the CORRIDOR tribute), mounts and stolen machines, four acts a stage, 33 Weave Echoes, two
endings, and then Nightfall → [Home](Home.md), [Vision](vision.md).

## What's built
All of it, as the roadmap planned it, Phases 0-13, every branch proven by play
→ [Roadmap](roadmap.md), [Proof report](tech/proof-report.md):
- **Eleven stages**, each with its look (16 depths, lighting scripts, real tiles and sprites),
  living terrain, adversaries, set pieces, mid-boss and guardian, secrets, music and sound, and
  an as-built audit that passes all ten rows of the [quality bar](design/stage-quality-bar.md)
  → [Stages](stages/index.md).
- **The campaign:** Stage 1 to 11 in one run, carrying score, lives and letters, with the
  stages' carry-overs (Stage 2's pups, Stage 4's stingwings, the sky-horn, Ironhold's young
  skywing); the standard and Perfect Weave endings and the credits; then **Loop 2 "Nightfall"**
  (every stage at night, Hard enemies, ×1.5) and Loop 3+ (×2, spotter-lamp mortars)
  → [Core gameplay: campaign](design/core-gameplay.md#campaign),
  [Scoring & difficulty](design/scoring-difficulty.md).
- **Online:** every stage and the whole campaign, up to four browsers, protocol 6, the
  expedition server at `/glowfall/ws` (health at `/glowfall/healthz`) → [Netcode](tech/netcode.md).
- **The front end:** the title menu, attract mode, the local high-score table, the code
  (↑↑↓↓←→←→ B A Enter: any lives from 1 to 99, or ∞), act
  select (SELECT PLACE), difficulty (Easy, Normal, Hard, applied in the sim), the settings
  panel, rebinding (F2), gamepads with their own button names, hot-plug and rumble, touch
  controls, and phones scaled to fill their height.
- **Game feel:** hit-stop and white flashes on every guardian's fall, shots that visibly pass
  through wild creatures, reduced-flash and reduced-motion options.
- **The bestiary** (`wiki.html`, 139 entries that unlock as you meet them) and **the player
  guide** ([The Songlines](../guide/index.md), spoiler-gated).
- **Tooling:** the level validator (reach, dead ends, restarts, co-op scaling, rule 7 and
  more; every level at 0 problems), `npm run check` (standards, lint, types, 1,600+ tests,
  sheets, levels, wiki and guide links), `tools/campaign-run.js` (the whole campaign in the
  sim with a carry, about 10 s), and the **play bot** (`tools/play-bot/`, milestone 9.1): an
  aiming, dodging, never-invulnerable bot that plays every act at every difficulty, solo and
  with four, and writes the [difficulty report](tech/difficulty-report.md) (clears, deaths and
  their causes, the triage).

## Where to play
On the live site, `https://arachnicode.com/glowfall/`:
- **`play.html`**: the game. With no query it's a campaign from the title. `?stage=N` (1-11)
  starts a single stage for practice; `&act=A`, `&cp=N` start part-way; `&loop=2` previews
  Nightfall. `?ending=standard` or `?ending=perfect` previews the endings (`&auto` to run
  unattended).
- **`wiki.html`**: the bestiary (`?all` shows every entry).
- **`index.html`**: the hub, with every stage's link, the roadmap (read live) and the guide.
- **Greybox rooms** for each mode: `play.html?room=vert`, `top`, `ride`, `fly`, `swim`,
  `gear`, `mixed`, `sky`, `reef`, `deep`, `flood`, `corridor`, `crown`.
- **Dev pages** in `tools/`: the look test, the sheet viewer, the level viewer, the music
  preview, the parity check.

The web root is the live checkout, so any saved change to a client file is live at once. A
change under `shared/` or `levels/` changes the sim hash: run `sudo bash deploy/install.sh`
after it, or online play locks out.

## What's waiting
1. **The owner's playtests** of Stages 2-11 (Stage 1 too, since Phase 2's exit check was
   never run with hands on keys), solo and with friends, and **one full campaign run**: that
   run is Phase 6's exit check. The audits prove every stage can be cleared; only a person can
   judge how each feels. The pages flag these stretches for a human in particular (milestone
   9.1's play bot re-checked them → [Difficulty report](tech/difficulty-report.md#the-flagged-stretches)):
   Stage 2's Bastion Gate (beatable on foot only since 11.1; the tell-reading bot of 13.1
   clears it in all 18 runs, with about 8 deaths a solo run), Stage 1's Clearcutter at Hard
   solo, Stage 11's Veilwyrm lake (a hop to the next coil when the gold-marked one sinks), Stage 7's Hornet wing and Kestrel Flight (the
   aiming bot beats both far inside their windows), Stage 9's riot-line Strider (the bot never captured it in 18 runs: it takes a shot
   through the cracked glass), Stage 11's Veilwyrm ride (the lake takes lives when a coil sinks)
   and the Green Way's seed-and-defend (the bot barely plants a sprout), and every stage's
   first-clear time. The report's triage lists the fair-but-brutal spikes for the owner to tune.
2. **Listen to the sound.** No one has heard Stages 7-11's music and effects in a browser.
   Milestone 9.2 measured all of it instead (every song voicing, jingle, the credits' reprises
   and all 441 effects, rendered through the real engine): no clipping, no broken loop seams,
   and the outliers levelled → [Levels report](audio/levels-report.md). Whether it sounds good
   is still the owner's to judge by ear; the report lists what to listen for.
3. **The credits text.** It names no one yet ("Directed by the owner", "Built with Claude"):
   edit `CREDITS` in `client/game/ending-script.js` → [Story: endings](lore/story.md#endings).
4. **Owner decisions still open** (from the early phases):
   - Approve the look and the music (the sheet viewer and the look test).
   - Run the renderer benchmark on a 2018-class laptop (look test, *Run the ADR 0001
     benchmark*) and record the default renderer as ADR 0003
     → [ADR 0001](tech/decisions/0001-renderer-backend-interface.md).
   - Heroes' identity colours glow at night (Tavo's crimson sash reads like a collar's red):
     keep it, or make identity colours non-emissive.
   - `tools/` is web-served so its pages can be reviewed; the planned nginx rule would deny it
     → [Deploy](tech/deploy.md#static-hosting-rules).
   - The rollback cap is 8 frames (smooth to ~100 ms RTT, stalls above it); raise it to reach
     laggier players? → [Netcode](tech/netcode.md).
   - Bundling the ~620 JavaScript modules would cut a cold load's requests, but needs a build
     dependency.
   - **The Perfect Weave and route splits** (milestone 11.3): a solo run can't take both sides of
     Thunder Plains' fork, so a freed creature on one side is now excused when the party found a
     secret on the other (Echoes never are). The alternative is to move the pup's cage where both
     routes reach it → [Core gameplay: campaign](design/core-gameplay.md#campaign).

## Short of the plan
Nothing here blocks a quality-bar row; each is recorded on its owning page.
- **Stage 1** (Phase 10): its first as-built audit (10.1) found the high route and the sap
  chamber had never opened and fixed both; 10.1-10.3 built everything its notes had left and
  it passes all ten rows. Only the Clearcutter at Hard, solo (the play bot never beats it inside
  5 minutes, every death told) is left, for the playtest
  → [Stage 1: quality audit](stages/01-rootfall.md#quality-audit).
- **Everywhere:** the set-piece beats the build notes left to the tests were seen in headless
  screenshots in milestone 8.5 and its follow-up sweep (each stage page's "Seen in milestone
  8.5", the follow-up's marked so); only the gondola carriages' sway and the isles' fronds
  parting stay test-only, too small to judge from a still. The follow-up also saw the Loop 3
  spotter lamp (beam, mark, mortar), name entry after a real game over (initials into the
  table) and a bestiary unlock surviving a reload of `wiki.html`.

## How to work on it
- Read [Engineering standards](tech/engineering-standards.md) and `CLAUDE.md` first. Run
  `npm run check` from `glowfall/` before calling anything done; the pre-commit hook runs it
  over the whole tree.
- Level edits are `@screen` blocks in `levels/NN-*/play.map` plus `entities.js`, then
  `node tools/validate-levels.js --build`.
- Deploy: `sudo bash deploy/install.sh` (it stages the nginx snippet, runs `nginx -t`, restarts
  the server and checks the sim hash matches the checkout).

## How to resume
- In a terminal: `cd /var2/www/html/arcadegames && claude --continue` resumes the last
  conversation, or run `claude` and say "resume GLOWFALL from glowfall/wiki/STATUS.md".
- Using `screen`: detaching (Ctrl-A D) keeps the session and its background writers alive;
  reattach with `screen -r`. Exiting Claude stops any writers still running, but files already
  written are kept.
