334da9bc59c25f3677d5c072d1f2b68f0f34012b
The targeted edits in the previous commit left the document self-contradictory in places. This reconciles it. - The stale-export rule contradicted the append-only invariant on PayrollExport. Staleness is now derived from PayPeriod.unlockedAt rather than written as a flag, and the period gains unlockedAt/unlockedBy to support it. - Invariant count was still seven after an eighth was added. - Lot references were a mix of the old Lot 0-4 numbering and the current WP-xx packages; all now use WP-xx. - Articles/conversations were said to be deferred to "lot 5" while HR analytics were wrongly listed as deferred too. - Section 1 now carries all five audit findings, including the non-terminal pay-period lock and the closed enumerations. Adds the matching tests: the unlock/re-export cycle, cross-view consistency, mutation refusal while locked, and CSP enforcement. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Cr9dkEHwbDgkWPnyGj1Rjv
Languages
TypeScript
97%
CSS
1.2%
Shell
0.7%
JavaScript
0.5%
PLpgSQL
0.4%
Other
0.2%