frontend/{index.html,app.js,style.css}: no build step, no npm, vanilla JS
hash router (05 §5.7). Real page content is PH3 (U-022+, starting from
docs/wireframes/); this is only the empty shell + working navigation the
Done criterion asks for.
backend_server.py serves the 3 files via an exact-path whitelist (not a
generic static-file/directory server) -- no path-traversal surface to
reason about for 3 fixed files.
Verified in an actual browser this session (navigated to localhost, clicked
all 3 nav links, screenshotted each) rather than only trusting stdlib
tests -- a Python-only test can't exercise real hashchange/DOM behavior
without a JS engine. Nav highlighting and content swap both confirmed
working, no page reload, no build step.
7 new stdlib unittest cases covering what the server is actually
responsible for (static files served with correct content-type, 404 on
unknown GET path). 66 total across U-001-008, all passing.
This closes out PH0 (U-001~U-008) -- all three Phase-acceptance criteria
now hold for real: target-project directory scaffold, 15-table schema with
constraint tests, and a real claude --agent round-trip.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>