The naming check was documented as an auto-running pre-commit hook,
but .git/hooks is never cloned - a fresh clone had nothing and CI is
the real enforcement. Ship .githooks/pre-commit for opt-in local use.
PowerShell-first onboarding (most devs are on VS Code/Windows), a
Windows variant for the VS Code check task, and a .gitattributes rule
keeping shell scripts LF so Windows checkouts do not corrupt them.
Clone-to-first-change onboarding, plus .vscode launch/tasks/extensions
so F5 debugs the backend and a task runs both dev servers. Fix the
README manual path to run the backend on 5001 (the frontend proxies
there; the default 5000 loaded nothing).
The gage lab assigns real WJRP asset numbers: internal itemcode stays
auto-minted, a new optional unique gagelabtag carries the lab's number,
searchable and kiosk-resolved (scans and bare digits against either
identifier). Print files render as stacked revision cards instead of a
scrolling table.
The dark form-control override used the background shorthand, which
resets a select's repeat/position; restated as background-color plus
explicit no-repeat/position.
Photos already resolved at read time; names only came from the stored
column, so imports without the employee source showed bare SSOs. New
mode-aware display-name resolver backs a live fallback; stored names
still win.
The uploaded-blueprint thumbnails used the raw setting value, which
404s under a subpath mount while the map itself worked. Wrap the
previews in withBase.
Users without a profile photo show the GE monogram (sidebar, employee
detail, directory thumbs). Document titles become
'<Facility> ShopDB - <Page>' so copied links and tabs identify the
page.
External HR Picture values are relative paths; the resolver hardcoded
/static/employees/, but sites can serve photos from another host. New
employee_photo_base_url setting; blank keeps the old behavior.
Deleting any user who owned an API token or appeared in the audit log
hit the users FK and returned 500. Tokens are revoked outright; audit
history is kept but detached so the trail survives the account.
At sites running the external HR directory the self-hosted table is
empty, so every kiosk badge fell to the deny policy. The resolver now
branches on employee_directory_mode: selfhosted reads the directory
table by SSO; external queries the HR directory, resolving PayNo
badges by their real PayNo column.