New sessions land in what looks like a game repository and start treating the
task as game development, so the accessibility framing had to be re-explained
every time. CLAUDE.md states it up front: everything outside accessibility/ is
the vanilla game and is read-only reference, and a request phrased as a game
bug ("the journal doesn't work") means a screen reader user cannot use it.
Deliberately a pointer rather than a copy, so it cannot drift out of sync with
accessibility/docs/. It sends readers to docs/scratch.md first and carries only
what a fresh agent would otherwise get wrong: that the user is blind so no
verification may depend on seeing anything, the small-footprint rule, that
speech must never throw, the FoV rule, how to run the testbed, and how to read
the startup self-test when something is silent.
CLAUDE.md sits in the game tree, so it would show up in the footprint check
that must stay "main.lua | 1 +". Excluded there and in the three places the
docs quote that command.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Adds accessibility/README.md, the player-facing setup and keymap reference --
the thing to read before playtesting.
Brings the developer docs in line with what was actually built:
- docs/README.md rewritten as an index with current status and a one-paragraph
architecture summary.
- docs/scratch.md gains a HANDOFF section: state of play, the commands to run
after any change, the five traps that each cost real debugging time, what is
NOT verified and why, deliberate omissions, and how to rebase onto a future
game version.
- docs/03-implementation-plan.md gains a status banner listing where the
implementation deliberately diverged from the plan (menu narration pulled
forward as a blocker, levelCursorPopup not patched, tryInteract insufficient
as a tracker filter, testbed added, no settings UI built).
- docs/04-open-questions.md gains a resolution banner: Q6 and Q8 remain open.
Also records that the testbed check count varies between runs (23-26) because
some blocks are conditional, so what matters is zero failures rather than the
total.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Establishes the mod skeleton and gets speech working end to end.
Game-file footprint: one line in main.lua.
- accessibility/init.lua: sole entry point. Patch registry, hooks states.switch
(announces screen changes) and states.update (per-frame speech flush, avoiding
an edit to love.update). Startup self-test prints what resolved -- the canary
for when a future game version moves something we hook.
- accessibility/speech.lua: TTS wrapper. pcall-guarded so a missing DLL degrades
to silence instead of crashing. Queues utterances within a frame and joins them,
since one game turn emits several console.print calls and speaking each with
interrupt would leave only the last audible.
- accessibility/stateNames.lua: spoken names for the 28 states.
- accessibility/vendor/love2talk: vendored TTS library, see VENDORED.md.
Loads Tolk.dll by absolute path via love.filesystem.getSource() and adds that
directory via SetDllDirectory, so the DLLs live in the project instead of
needing an elevated copy into Program Files.
Verified with lovec against NVDA: TTS available, speech channel yes,
'Main menu' spoken on startup.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>