通行証 · HALL PASS DOCS · PLAY

Audio coverage review — 2026-09-15

Current sourcing inventory: Audio Cue Sheet and the sound library now distinguish live cues, available unused takes, missing proposals and historical references. Use that sheet for sourcing; this document preserves the implementation audit below.

The largest gaps were missing event hooks, not missing music. This review traced Sim events through Game, UI actions and the actual Sound methods at baseline 14710cb, before the September 15 cue pass. File/line references in the BEFORE sections refer to that revision; function names remain the navigation anchors as the implementation changes.

This is a code/asset coverage audit. Asset presence proves neither a good performance nor a good mix. Physical-phone listening, voice direction and subjective approval remain separate from automated coverage checks.

Implementation status

The September 15 engine and cue wiring are implemented and verified by the full Node suite and real Chrome audio matrix. The verification record below separates those checks from physical-phone listening and voice production.

No soundtrack master, catalog loop, boss-score timing, enemy model, map, combat balance or HUD control needs changing for this work. The existing sample-clock and pause contracts in MUSIC-ENGINE.md remain authoritative.

September 15 coverage added

The remaining voice work and deliberate quiet areas below are still a backlog. The BEFORE matrices are retained as the audit record, not a claim that those hooks remain missing after this pass.

BEFORE: prioritized findings

Priority Finding and player consequence Baseline evidence Bounded response
1 All four current shikigami lacked dedicated arrival, bite and departure sounds. A long-cooldown summon could feel absent despite its model and damage. sim.js:787,887,921 emits shiki/shikiout/shikibite; Game._dispatchEvents has no cases. Sound.summon() is reached only by the obsolete elective.id === 'kuroinu' branch at game.js:2399. Wire the three real events, retain e.who after tags, use a strong arrival, limited bite accent and quiet exit.
2 Ren's palm had no cast sound when it missed; successful attacks relied on generic impacts. _cone, sim.js:2953, emits cone; Game ignores it even though Sound.shoot('cone') already exists at audio.js:716. Connect actual primary casts, without also sounding the same Clean Sweep cone twice.
3 Four bosses' signature attack paths were effectively silent, and several other attacks borrowed unrelated player sounds. Boss matrix below; especially _bossAI, sim.js:1204,1285,1292, and the spit/burst exclusion at game.js:2370. Distinguish warning, release and impact; sound a sequence, not every projectile.
4 Critical hits and large kills bypassed repetition limits. A dense hit could mask the new warnings and allocate many nodes. Sound.hit, audio.js:730: three sources per crit before the normal-hit gate. Sound.kill, audio.js:740: only small kills gated. Both buses feed the same compressor at audio.js:84. Gate/coalesce common impacts and bound the new cue layer. A compressor is not an event-priority system.
5 Permanent teammate knockout sounded like ordinary damage followed by a voluntary tag. Sim._die, sim.js:1772; game.js:2428 only toasts the knockout. Forced swap plays the normal tag sound. One outgoing-student knockout cue; suppress conflicting same-batch hurt/tag VO. Keep final crew death distinct.
6 Specials and run weapons looked more distinct than they sounded. Most elective events map to dash; decoyboom uses nonexistent Sound.boom and always falls back to dash. weaponBlast/weaponChill/weaponImpact, orbpop, chains and signature procs have no dedicated dispatcher sound. First separate an actual explosion from a dash; expand a few event families with caps rather than one sample per weapon/proc.
7 Mana lacked a distinct collection identity; rare rewards mostly reused basic upgrade/kill feedback. sim.js:3346 collects ce; Sound.pickup, audio.js:746, gives it the generic fallback pitch. Weapon binding and card acceptance use upgrade. Give recovered energy a recognizable short cue; preserve the exorcism's reward reveal before adding another celebratory layer.
8 Some advertised VO paths had no assets, while existing boss-kill recordings were unused. Game._onTag requests <id>_tag; no tag assets or load entries exist. _loadTracks loads Sora boss-kill reads; no Game caller uses them. Keep missing optional VO harmless; prioritize the production backlog below and use existing reads only with correct attribution.

The lethal-hit ownership edge matters: _hurt queues an event and _die can switch students before dispatch. The old hurt handler reads the now-active student, so the incoming survivor can speak the outgoing student's hurt line. Do not infer the speaker of a knockout from sim.character after that swap.

BEFORE: all nine bosses

Every boss already had the generic entrance sting, boss-song handoff, the authored pressure layer below 40% HP and the three-stage exorcism. Only the last living boss starts the encounter's defeat cadence. The table describes attack coverage in addition to that shared presentation.

Boss Attack path Actual sound before this pass
The Janitor Sweep preparation / rotating sweep Generic surge / player dash.
Hall Monitor Searchlight capture, summoned wisps, aimed shot No capture-edge sound; summon ignored; shoot('spit') deliberately filtered out.
Pop Quiz Spiral preparation / spiral emission windup ignored; spiral pulses create bullets without an audio event.
The Substitute Vanish / appear / slam Player dash / player shoot('orb') / large kill.
Exam Season Three fuse zones / detonations Player shoot('volley') / ordinary kill; same-batch gates collapse repeats.
Detention Closing cage / collapse Full generic boss entrance sting / ordinary kill.
Group Project Spiral preparation / spiral emission Same silent quiz kit as Pop Quiz.
Parent-Teacher Night Searchlight / summon / aimed shot Same silent spotlight kit as Hall Monitor.
The Vice Principal Vanish / appear / slam Same borrowed teleport sounds as Substitute.

Source: boss identities in config.js:142; attacks in Sim._bossAI, sim.js:1159; existing dispatch at game.js:2449. Shared kit/color data cannot by itself identify the actual boss. New identity-specific cues need the event's real boss name or stable identity, without an extra RNG draw.

BEFORE: the rest of the game

System Covered Gap or restraint
Primary combat Bolt, orb, volley, normal/critical hit, kill, chain-count milestone Ren cone unwired. Chains, splash, orb expiration and run-weapon secondary effects use incidental damage audio.
Movement and crew Flash Step, manual/forced tag, rejection cues Tag VO unavailable. Knockout lacks a distinct cue. No footstep loop is required.
Specials Cast acknowledgement; decoy explosion fallback Most casts share dash; there is no meaningful explosion identity for Paper Doll.
Shikigami Generic damage and kills; denial/cooldown feedback Actual summon/bite/exit events ignored. Readiness is visual only.
Domains Large cast sound, character cast VO, Ren crush and Kaito strike accents Readiness/expiry have no dedicated cue. Frequent fields and damage ticks should not each sound.
Ordinary enemies Hit/kill sounds windup, telegraph, charge, smash and hostile firing are unhandled/suppressed. Warning cues should take precedence over ambient enemy chatter.
Elites Arrival surge, defeat upgrade, generic damage Bulwark guard changes, Pouncer wind-up and Conductor gathering change state without audio events. Conductor release is filtered spit.
Pickups and economy XP, Coin/heal pickup variants; purchase, denial, upgrade Mana generic. Coin/heal bursts are ungated; Sora's heal VO can be requested repeatedly in one collection burst.
Boss rewards Exorcism release/sever/seal; weapon bind and card acceptance upgrade Ground drops mostly visual; new sounds must not pile over all three exorcism beats and the defeat cadence.
Cards and progression Purchase, slots/locks/buyback, banked-level ping, level-up arpeggio, selected upgrade Passive/trigger card procs generally visual. Pull-card flips have no synchronized reveal/rarity sound. Generic upgrade events are handled at the committing UI/controller path, not in the event switch.
Recovery/risk Hurt, exhaustion denial, revive, death and stopped music Rally is deliberately quiet; permanent KO is not well distinguished.
Waves/time Surge, recoil breath, banked level, approaching bell, held bell, clear and win VO Generic sounds repeat across unrelated events; the held-bell warning is distinct from actual completion in the controller.
Room/School Run Start/resume music, pause/resume, checkpoint stop and next-room restart No additional reward song, route jingle or checkpoint drone; these are not missing technical integrations.
UI Shared button activation, keyboard/gamepad navigation, toggles, buy/deny, back Field Report/Club Card/Docs & FAQ callbacks duplicate the shared click. Mouse hover intentionally avoids a beep per crossed button.

Game._onWin/_announceWin defer the clear cue until the exorcism finishes. _onExorcismCue supplies the three SFX beats; bossDefeated supplies the short music ending. Neither is a reason to add a second full reward track. Sound.setIntensity affects only procedural fallback music, not the authored songs. Manual pause keeps the song playing, cancels boss pressure cues and ducks ambience; level selection uses the existing turntable behavior. None of these is a request to alter the loop engine.

Voice and sound-art backlog

The files below existed at baseline; optional failures are intentional no-ops. Counts include alternate takes, not different event types.

Student Domain Death Win Dash Hurt Heal Boss kill Tag / shikigami
Ren 5 2 1 1 — — — None
Yui 3 1 1 — — — — None
Kaito 5 2 1 2 1 — — None
Sora 4 1 2 3 1 3 3, loaded but unused None

Presence was checked against assets/vo/, _loadTracks and VO_ALTS; it does not imply every take has been auditioned in this review. No boss spoken entrance/death lines are currently supplied. Prioritize future production:

  1. Optional signature boss vocal punctuation: cast one entrance and one death for a single boss before recording all nine. Keep the threat cue intelligible, avoid lengthy taunts, and allow an unvoiced identity cue.
  2. Crew essentials: Yui dash plus Ren/Yui hurt reads; then concise tag lines for all four. Author variants only after the first set works in the full mix. Existing Sora boss-kill reads need reliable killer/owner data, especially for delayed attacks and tags, before activation.
  3. Shikigami sound art: review four synthesized identities first. Only commission short creature calls or texture layers where synthesis leaves a specific gap; avoid four long samples, voices on every bite or loops.
  4. Reward polish: one brief card seal/flip, then a rare-card accent tied to the actual reveal. Rewards must already be committed; skipping animation never changes ownership. No Rive work before the parked review date.
  5. Contextual crew dialogue: keep the separately proposed checkpoint exchanges in IDEAS.md; this pass does not add conversations.

The nested-click cleanup identified at baseline (ui.js:730,736,1134) was completed in this pass; it is not remaining sound-production work.

Deliberate quiet and technical boundaries

For implementation details, the primary Web Audio specification defines StereoPannerNode and scheduled source start/stop/ended behavior. These API contracts support the implementation; they do not establish this game's mobile performance or subjective mix quality.

Verification record

HALL PASS by Very Bad Games · Solo Developer Chris Sands · All documentation