Tracked remediation plan from the 2026-06-04 audit of natobytes/Volts + the contract with the natobytes/VoltsApp app. Check items off as they land. Severity: π΄ Critical Β· π High Β· π‘ Medium Β· βͺ Low. Items marked [OWNER] require repo/settings access.
Owner decisions applied: custom horns are Boombox β drop .ogg from hornsounds; committed binaries are fixtures to be replaced with real assets (add real binary validation; reject stubs).
- π F1
deploy.ymlnever runs validation β a push straight tomainships an unvalidated catalog. Addnpm ci+npm run validateas a required step before build (fail on non-zero). File:.github/workflows/deploy.yml. - π F2
build.tsemits top-levelfiles[]from a disk glob, not declaredmeta.filesβ stray/extra/renamed files reach the feed. Emitfiles[]from validatedmeta.files(intersect disk β© meta); log/fail loud on missing files or defaultedtitle/authorinstead of silently defaulting. File:scripts/build.ts:74-121. - π‘ F3 (added
.github/workflows/build-check.yml) No build/Jekyll gate on PRs β a change that breaksbuild.tsorjekyll buildonly fails on themaindeploy (then serves the last good artifact silently). Addnpm run build+bundle exec jekyll build(no deploy) as a required PR check. - π F4 [OWNER] Branch-protect
mainto require the validate + build checks; commit aCNAME(or confirm Pages custom-domain settings); enable Enforce-HTTPS + deploy-failure alerting.
- π G1 No fseq/audio pairing check. Add a lightshow rule: exactly one
.fseq+ one audio file with matching base name;meta.audiomust match. File:scripts/validate.ts. - π G2 No binary format validation β current samples are 36-byte
.fseq/ 421-byte.mp3/ 69-byte.pngstubs that pass clean. Add magic-byte checks (PSEQfseq,RIFF/WAVEwav,ID3/0xFFFBmp3, PNG signature) and reject implausibly small files (e.g. < 1 KB). - π‘ G3 Add: PNG dimension validation for wraps (512β1024 px, decode IHDR); (category, slug) + title uniqueness (two horn sounds both titled "La Cucaracha"); cross-check
meta.audio/meta.filesextensions against the category allow-list. - π G4 Drop
.oggfromhornsoundsALLOWED_EXTENSIONS(Boombox plays WAV/MP3 only) β pairs with the app routing hornsounds β Boombox. File:scripts/validate.ts:25.
- π‘ G5 (added
SCHEMA.md; fixed all 5 PR templates) Reconcile.github/PULL_REQUEST_TEMPLATE/*.mdwithvalidate.tsrequired fields (files[],audio,thumbnail); add aSCHEMA.md; clarify theaudiofield (required here but currently dropped by the app's model). - [~] βͺ G6 Tags: added a sync assertion in
validate.ts(errors if_data/tags.yamlortags/*.mddrift fromcontent/tags.yaml). Remaining: optional GitHub Issue Form intake for non-technical contributors (currently git+npm only).
- π‘ H1 (documented in
SCHEMA.mdβ "API contract") Treat the JSON shape as a contract: keep the 5 category keys stable (the app'sCATEGORY_KEYSis hardcoded β new categories are dropped until the app updates);downloadUrlmust stay root-relative incl. the/Voltsprefix (driven by_config.yml baseurl);meta.files[].labelis relied on by the app. Document inSCHEMA.md; the path literal is duplicated in 4+ places (build.ts).
- Branch protection on
mainrequiring validate + build checks (F4) CNAME/ Pages custom-domain + Enforce-HTTPS + deploy-failure monitoring (F4)- Replace the placeholder stub binaries with real assets before launch