The quality targets follow the same split used by the sibling Pac-Man and Super Mario Bros. preservation projects.
make formatnormalizes every ca65.asmand.incsource and the text files, then runs all lintersmake format-checkchecks formatting without changing filesmake lint-asmchecks the shared house style: Retrolarium Kit's linter (rltool lint) overconfig/lint.json, for the ca65 sources and the text contract (LF endings, no trailing spaces, one final newline, valid JSON)make lint-sourcechecks the repository structure, every Python and JSON source, local documentation links, source contracts, ASM module sizes and directory organization, and tracked private/generated output policymake lint-projectis a compatibility alias formake lint-sourcemake lintruns every lintermake testruns the Python unit-test suitemake quality-checkruns lint and tests without requiring a reference ROMmake symbolsvalidates ld65 source mappings and exports FCEUX ROM/RAM labels plus a machine-readable debugger summarymake validate-symbolsproves that the debugger configs and generated summary still match the current linker symbolsmake prg-layout-auditclassifies every PRG byte from source mappings and checks the reviewed code/data/stream/padding/vector fingerprintmake trace-runtimecaptures deterministic FCEUX boot and Room 1 traces;make validate-runtimerechecks their event timing and final RAM statemake checkadds byte-identical ROM verification, room-data validation and round trips, semantic reconstruction audit, debugger symbols, and every subsystem contract without launching the emulatormake release-checkstarts from an empty build directory, verifies the pinned toolchain and private input, runs the static gate, freshly captures all ten runtime scenarios, validates the preservation release manifest, then checks commit history, worktree cleanliness, and tag absencemake source-1-auditis a compatibility alias formake release-checkmake source-1-post-tag-auditvalidates annotated local and published tag integrity after release
The former address-ordered preservation listing has been eliminated. New semantic refinements should continue to follow understood subsystem boundaries and remain registered in the reconstruction manifest. Formatting remains safe because the release check rebuilds the ROM and compares every byte with the reference.
Assembly modules normally contain 300–700 lines. make lint requires every
shorter or longer file to have a concrete architectural justification in
config/reconstruction/source_organization.json, limits each directory to six ASM files, and
rejects repeated underscore-delimited filename prefixes within one directory.
This keeps compact fixed tables and generated-asset boundaries possible without
allowing subsystem code to drift back into a flat collection of tiny files.
Comments that contain only an address, optionally followed by encoded bytes,
such as ; $B173 or ; $82AD D0 01, are rejected as
machine-code-comment. They duplicate the assembler listing without
explaining behavior. make format removes these pure address/byte dumps
automatically; a comment that also explains the code is kept.
Important generated and authored outputs use the shared
scripts/build/atomic_io.py writer: a uniquely named sibling temporary file is
flushed before os.replace publishes it. ROMs, JSON documents, debugger label
reports, formatted assembly, and WAV previews therefore never expose a partial
destination. The FCEUX Lua capture scripts follow the same temporary-then-rename
contract, and project lint rejects new direct Python write_text/write_bytes
calls outside the shared owner.