No code change. T2.1 asks to lift the drawer out of "three near-copies" into one
shared implementation. There are no copies to lift.
html/wp-sidenav.js and html/wp-sidenav.css are already a single implementation
included by admin, field view and directory. .wp-sidenav, .wp-navscrim and
.wp-navbtn are each declared in exactly one file, and no page defines its own
drawer. The review's sentence was that the drawer "ships on 3 of 6 pages while a
flat strip duplicates it" - the duplication is between the drawer and the flat
strip, not among three drawers. The plan read "3 of 6 pages" as "3 copies".
It already satisfies every T2.1 done-when, including the one that could have
failed: activeProjectId() at wp-sidenav.js:62-68 reads ?project= and falls back
to ProjectData.getActiveId(), which is the single source T1.1 established. It
also self-mounts into .wp-appbar OR .header and returns early inside an iframe,
so it is already built for the pages T2.2 has to put it on.
Refactoring a single shared component into a single shared component would be
churn with regression risk and nothing gained, so nothing was touched. Recorded
as file-map D5 so the next reader does not go looking for the copies either.
The real work of this wave is T2.2.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>