detail
Token rotation Phase 3 COMPLETE. USR369 confirmed NordPass + Claude.ai userPreferences updated with new token (yttcom-admin-3a50115a...ed8640). Retired old token from tokens.json active[] (moved to retired[]), verified via OPEN.php and records-api.php that new token now works and old is rejected.
CRITICAL DISCOVERY during rollout: file-reader.php and file_write_web.php -- the two most-used diagnostic/write tools, used constantly every session -- were NEVER on the known token-migration list (TOKEN-ROTATION-PLAN.md only listed 9 Tech/Kitchen HTML files + gym-api.php + file_write_web.php as a known-hardcoded item, but file-reader.php was completely undocumented). Both had the admin token hardcoded as a PHP literal/constant, entirely independent of tokens.json -- confirmed by direct source read. This meant immediately after retiring the old token, file-reader.php broke for the new token (accepted only the now-retired old one) -- would have locked every future session out of reading server files with the current token.
Fixed both: backed up each (BACKUP.php), patched the hardcoded literal from old to new token value, wrote back (bootstrapped file_write_web.php via itself using the still-valid old token one last time, then used the fixed tool to patch file-reader.php), verified new token now works and old is rejected on both.
Then completed the remaining known list: 9 Tech[30]/Kitchen[80] HTML files + Health[70] gym-api.php -- backed up each via BACKUP.php (per owning system), pulled live content, string-replaced the old token literal for new (1-2 occurrences each), wrote back, verified byte-for-byte size match and zero remaining old-token occurrences in all 10.
Filed T-TOKENGATE-MISDIAG (id 433) to Server[40] separately -- unrelated finding from same session, about OPEN.php force=1 being misattributed to a stale tokens field that per verify_lib.php source is excluded from the blocking pass/fail computation.