Repository navigation
v0.4.0
What's Changed
- docs: correct stale release-workflow claims found in a post-merge audit by @fderuiter in #735
- fix(deps): pin jsdom to 26.1.0 to fix ERR_REQUIRE_ESM production 500s by @fderuiter in #741
- feat(a11y): implement dyslexia-first typography, pretext calibration and speed insights (#722, #738, #739, #740) by @fderuiter in #743
- Install and configure Vercel Speed Insights by @vercel[bot] in #742
- fix(a11y): resolve CRF Studio's remaining structural WCAG violations (#727) by @fderuiter in #745
- feat(crf): implement form removal preview, duplication, positional insertion and draft protection (#668, #667, #669, #666) by @fderuiter in #746
- feat(crf): dependency web sentinel and calculated field derivations (#542, #671) by @fderuiter in #768
- feat(crf): insert starter clinical smart blocks with slash commands (#538) by @fderuiter in #772
- fix(arcade): fix dead isSupported check and label the mobile fullscreen fallback by @fderuiter in #773
- feat(crf): save named baselines and restore into a new draft (#672) by @fderuiter in #774
- docs(blog): define blog product strategy, editorial scope, and content architecture ADR by @fderuiter in #771
- fix(crf): insert new fields into the section the author actually targeted (#669) by @fderuiter in #770
- ci(actions): split fast/heavy gates and cut redundant Playwright matrix cost by @fderuiter in #775
- feat(crf): compare working draft against a named baseline (#676) by @fderuiter in #776
- refactor(crf): unexport internal modal props interfaces by @fderuiter in #777
- test(ci): verify browser-scoped cache contracts by @fderuiter in #778
- fix(ci): gate merges on targeted device coverage by @fderuiter in #779
- fix(dx): align verification output with exit status by @fderuiter in #780
- fix(ci): enforce required-check event safety by @fderuiter in #781
- feat(blog): integrate resilient published-post persistence by @fderuiter in #782
- fix(duck): suspend play during reading interruptions by @fderuiter in #783
- test(migrations): include blog migration in integrity inventory by @fderuiter in #787
- fix(duck): coordinate manual hotkeys and interruption ownership by @fderuiter in #788
- fix(blog): enforce cache contracts and rendered-page invalidation by @fderuiter in #790
- docs(ci): synchronize references and current merge-gate guidance by @fderuiter in #793
- fix(duck): select visible responsive manual owner by @fderuiter in #794
- feat(blog): add authorized sanitized draft collection API by @fderuiter in #795
- feat(blog): add authorized draft reading and editing by @fderuiter in #797
- fix(content): render case-study Mermaid diagrams by @fderuiter in #798
- feat: reconcile dev authoring, studio, and accessibility work into main by @fderuiter in #801
- fix(dx): normalize Next.js bracket route parameters in OpenAPI doctor check by @google-labs-stitch[bot] in #818
- refactor: relocate CopyButton implementation to components/ui and update consumer imports by @google-labs-stitch[bot] in #819
- feat(arcade): enforce standardized 44px minimum touch targets and active visual feedback across Arcade HUD components by @google-labs-stitch[bot] in #820
- refactor(audio): centralize sound engine delegation across application by @google-labs-stitch[bot] in #824
- feat(test): direct Stryker CLI runner and unified core coverage inclusion by @google-labs-stitch[bot] in #825
- feat(patrol): headless shift state machine engine and wave 1 enhancements (#748) by @fderuiter in #827
- feat(patrol): unified vertical slice, OET mini-game, and OEC scene interaction (#749, #750, #751) by @fderuiter in #831
- feat(patrol): three MVP scenario content packages and interpersonal dialogue system (#752) by @fderuiter in #832
- feat(patrol): contextual rule-based debrief engine (#753) by @fderuiter in #833
- feat(patrol): ambient operations mini-events and realistic Welch Village trail map (#754, #835) by @fderuiter in #837
- feat(patrol): field manual, optional audio layer, and M10 launch QA (#755, #756) by @fderuiter in #838
- perf(web-vitals): keep hero text an opaque LCP candidate and drop production layout reflow by @fderuiter in #839
- feat(crf): resolve show, hide and require sentence rules at runtime by @fderuiter in #842
- feat(crf): save and reuse versioned personal clinical blocks by @fderuiter in #843
- feat(crf): test forms in a responsive in-builder simulator dock by @fderuiter in #844
- feat(crf): save named test scenarios with expected outcomes and run evidence by @fderuiter in #845
- fix(domain): canonicalize on the apex so advertised URLs match the serving host by @fderuiter in #846
- ci(actions): supersede redundant main-push runs and correct the Free-plan budget by @fderuiter in #847
- dx(lint): exclude agent worktrees from ESLint traversal by @fderuiter in #855
- chore(deploy): stop uploading build output and agent worktrees to Vercel by @fderuiter in #856
- fix(build): gate fallback logging on runtime rather than production alone by @fderuiter in #857
- fix(build): abort a production build when a data source is unreachable by @fderuiter in #858
- fix(db): run migrations on the direct endpoint by default by @fderuiter in #860
- docs(agents): correct the fallback logging gate and state the build-time rule by @fderuiter in #861
- fix(build): load .env.local before falling back to a dummy connection by @fderuiter in #862
- docs(neon): record observed provider state and correct two false protections by @fderuiter in #864
- docs(neon): record a measured restore rehearsal and correct the production branch id by @fderuiter in #870
- chore(git): state the .env*.local ignore rule explicitly by @fderuiter in #872
- fix(seed): upsert by slug instead of wiping, and recover two orphaned case studies by @fderuiter in #873
- feat(blog): cover all six content pillars and enforce the taxonomy by @fderuiter in #876
- fix(case-studies): render editorial_content as Markdown and de-duplicate ids by @fderuiter in #877
- chore(deps): add @upstash/qstash and bump @upstash/redis by @fderuiter in #878
- fix(ui): stop clipping code blocks, de-duplicate titles, and add missing page headings by @fderuiter in #881
- fix(observability): stop spending the Sentry error budget on local development by @fderuiter in #883
- dx(hooks): close the guardrail, branch, drift and test-scope gaps by @fderuiter in #884
- fix(routes): stable /crf heading, bounded titles, gated mobile blur by @fderuiter in #885
- chore(release): license the source under Apache-2.0 and harden public repository readiness by @fderuiter in #886
- docs(release): reconcile public-release readiness and Vercel/production evidence by @fderuiter in #887
- refactor(security): unify secret scanning into lib/security-scan by @fderuiter in #888
- feat(clinical-chaos): offices, sponsor inbox, outfits, and a guided board redesign by @fderuiter in #908
- feat(crf): add durable field review threads by @fderuiter in #938
- feat(trial-and-error): deliver SAP-defined Demographics QC Desk slice by @fderuiter in #941
- feat(trial-and-error): amend ADR 0046 for card-table presentation and scoped cabinet tokens (T&E-UX-00) by @fderuiter in #953
- feat(trial-and-error): build the Card Table and re-frame the QC Desk as Inspect (T&E-UX-01) by @fderuiter in #955
- docs(trial-and-error): record the narrative frame in ADR 0046 by @claude[bot] in #962
- fix(trial-and-error): keep QC Desk cell taps from being lost at narrow widths by @claude[bot] in #963
- fix(docs): ignore TypeDoc literal-union reordering in the drift gate by @claude[bot] in #966
- test(e2e): fix the four failing Playwright specs and regenerate Linux home baselines by @fderuiter in #970
- test(dx): run the full doctor diagnostic against a fixture workspace by @claude[bot] in #973
- fix(dx): skip agent worktrees and Stryker sandboxes in the doctor's file scans by @claude[bot] in #967
- feat(arcade): show a desktop-only notice for six games on phones by @fderuiter in #972
- feat(trial-and-error): expand Act I to three progressive review Blinds (T&E-02) by @claude[bot] in #965
- docs(readme): rewrite the README for public visitors by @fderuiter in #974
- chore(release): prepare 0.4.0 and let staged probes through Vercel Authentication by @fderuiter in #971
- fix(security): replace a Neon password literal in a test and detect bare npg_ passwords by @fderuiter in #975
- fix(docs): regenerate the TypeDoc media copy of CHANGELOG.md by @fderuiter in #976
- ci(release): deploy main automatically once CI passes by @fderuiter in #977
- feat(trial-and-error): add population snapshots and stale-output invalidation (T&E-03) by @claude[bot] in #978
- feat(trial-and-error): add shell planning, CPU replenishment and footnote seals (T&E-04) by @claude[bot] in #979
- ci(deploy): deploy main through Vercel and migrate in the production build by @fderuiter in #981
- chore(github): file new issues under the type:* labels by @fderuiter in #980
- refactor: make Vercel the sole production migration path by @fderuiter in #991
- docs(agents): configure Matt Pocock skills by @fderuiter in #1023
- chore(dx): allow jules/ branch prefix and sync the documented list by @fderuiter in #1026
- docs(agents): credit the vendored agent skills under their MIT license by @fderuiter in #1025
- test(deploy): lock down the ADR 0049 deploy contract by @fderuiter in #1027
- test(a11y): add unit test suite for accessibility utilities by @google-labs-stitch[bot] in #1001
- feat(security): add Anthropic and Google API key detectors to secret catalog by @google-labs-stitch[bot] in #1000
- release: one-time Jules consolidation and stabilization by @fderuiter in #1029
- feat(trial-and-error): add seeded crisis cards, boss pools and Blind modifiers (T&E-05) by @claude[bot] in #1033
- fix(build): break the neuro mesh worker's runtime chunk cycle and gate chunk cycles by @fderuiter in #1032
- docs(deploy): add the Vercel environment-variable matrix and drift test by @fderuiter in #1035
- feat(build): add a production-only Vercel configuration preflight by @fderuiter in #1036
- fix(clinical-chaos): finish Fast-Track submissions through the signing path by @fderuiter in #1037
- fix(blog): keep the RSS feed well-formed when a post contains "]]>" by @fderuiter in #1039
- dx(telemetry): stop a missing local database from flagging the dev overlay by @fderuiter in #1040
- feat(arcade): replace the duck game's recruiter pitch with victory copy by @fderuiter in #1041
- fix(cron): bound the maintenance route and surface partial runs by @fderuiter in #1042
- chore(deps): bound engines.node and allowlist dependency install scripts by @fderuiter in #1044
- docs(deploy): describe the real Vercel release controls, canary as manual by @fderuiter in #1048
- docs(deploy): document the inputs a local production build needs by @fderuiter in #1049
- docs(deploy): add the Production, Preview and Development isolation matrix by @fderuiter in #1050
- test(a11y): hold the footer ticker on a settled line during axe scans by @fderuiter in #1051
- feat(newsletter): persist subscribers with double opt-in, one-click unsubscribe and capped dispatch by @fderuiter in #1052
- fix: verify Upstash auth before production migrations by @fderuiter in #1054
- feat(trial-and-error): add Guidance cards, hand levels and Run Info (T&E-UX-05) by @fderuiter in #1063
- feat(blog): comprehensive article analysis, reader-experience formatting & SEO enhancements (#1055) by @fderuiter in #1066
- feat(trial-and-error): trace table discrepancies into patient Listings (T&E-06) by @fderuiter in #1069
- fix(clinical-chaos): restore accessible controls and responsive conveyor by @fderuiter in #1068
- feat(media): comprehensive photo archive, bio spotlight, and visual gallery by @fderuiter in #1067
- feat(trial-and-error): add dependent Kaplan–Meier figures with QC (T&E-07) by @fderuiter in #1070
- feat(trial-and-error): add the DMC open/closed-session blinding firewall (T&E-08) by @fderuiter in #1071
- fix(clinical-chaos): guide early station routing by @fderuiter in #1072
- feat(arcade): add the DMC milestone defense Boss Blind (T&E-09) by @fderuiter in #1073
- feat(arcade): dispatch routine clinical packets in one action by @fderuiter in #1075
- feat(arcade): add the balance harness and retune Blind quotas (T&E-14) by @fderuiter in #1090
- feat(arcade): add the Procurement Shop, cash-out and booster packs by @fderuiter in #1098
- feat(arcade): classify hands against the stage's accepted hands by @fderuiter in #1141
- perf(blog): query only published posts (fixes #1110) by @fderuiter in #1142
- fix(db): enforce unique case study reaction identity (fixes #1114) by @fderuiter in #1145
- fix(crf): preserve unused CDASH base names (fixes #1100) by @fderuiter in #1147
- feat(arcade): explain under Play Hand why a hand cannot be played by @fderuiter in #1152
- fix(crf): prevent orphaned PDF section headers (fixes #1101) by @fderuiter in #1151
- perf(web-vitals): remediate LCP element render delay, critical CSS, and landing bundle bloat (#817) by @fderuiter in #1138
- fix(telemetry): preserve historical aggregate counts (fixes #1111) by @fderuiter in #1153
- fix(clinical-chaos): winnable choices with a CRF protocol, and finish the #834 overhaul by @fderuiter in #1155
- feat(arcade): resume an in-progress run after a page reload by @fderuiter in #1154
- perf(telemetry): index event retention timestamps (fixes #1115) by @fderuiter in #1156
- fix(crf): enforce strict export form scopes (fixes #1099) by @fderuiter in #1158
- fix(hero): update approved homepage location (fixes #1149) by @fderuiter in #1159
- feat(hero): replace sample demos with Duck spotlight (fixes #1157) by @fderuiter in #1160
- feat(copy): define and apply authored prose punctuation standard (fixes #1144) by @fderuiter in #1161
- docs(trial-and-error): bring the field manual up to date by @fderuiter in #1162
- feat(trial-and-error): add hand cheat sheet on H by @fderuiter in #1164
- feat(trial-and-error): add per-Blind score log by @fderuiter in #1165
- feat(trial-and-error): show boss intro on every Boss Blind by @fderuiter in #1166
- feat(trial-and-error): add timed FDA information request boss by @fderuiter in #1167
- feat(trial-and-error): add act two phase two content by @fderuiter in #1170
- feat(trial-and-error): add act three phase three content by @fderuiter in #1171
- feat(trial-and-error): lock the csr package at the act three boss by @fderuiter in #1172
- feat(trial-and-error): link the three acts into one campaign by @fderuiter in #1173
- feat(trial-and-error): fire SOP relics in trigger phases (#924) by @fderuiter in #1174
- feat(trial-and-error): endless post-marketing rounds, and list the game in the arcade by @fderuiter in #1183
- fix(retro-labyrinth): size the windowed playfield to the cabinet by @fderuiter in #1184
- fix(arcade): keep keyboard focus in the game after launch and restarts by @fderuiter in #1188
- fix(working-with-duck): make ignoring Duck a losing strategy by @fderuiter in #1189
- fix(trial-and-error): fit the whole hand in its row at desktop widths by @fderuiter in #1190
- feat(laser-loon): give the loon three hits so campaign acts can be lost by @fderuiter in #1191
- fix(laser-loon): document U as the Tremolo key and round boss HP by @fderuiter in #1195
- feat(quasi-puzzler): give Story Mode a real, double RAM budget by @fderuiter in #1192
- fix(garmin): name the real crash cause on the game-over overlay by @fderuiter in #1194
- fix(retro-labyrinth): describe the loadout the game actually gives you by @fderuiter in #1196
- feat(trial-and-error): add SAP Amendment consumables (#1086) by @fderuiter in #1197
- fix(retro-labyrinth): make the player, exit and objective easy to find by @fderuiter in #1193
- fix(crf): stop the aCRF Viewer from re-rendering forever by @fderuiter in #1207
- fix(arcade): render game canvases sharply on HiDPI screens by @fderuiter in #1198
- fix(crf): give first-time visitors a visible guide and a real tour by @fderuiter in #1238
- feat(trial-and-error): seeded protocol deviations in Acts II and III by @fderuiter in #1239
- fix(crf): enforce field min/max ranges when Live EDC saves a form by @fderuiter in #1241
- fix(crf): make Exports tab downloads match what each tab shows by @fderuiter in #1242
- fix(crf): give the studio canvas room on desktop by @fderuiter in #1240
- fix(crf): describe asymmetric visit windows accurately by @fderuiter in #1244
- fix(crf): make studio usable on phone screens by @fderuiter in #1243
- fix(blog): restore readable dispatch pages (#1146) by @fderuiter in #1245
- fix: make studio correctness checks reflect actual state by @fderuiter in #1246
- fix(quasi-puzzler): respect Sandbox tactic targets by @fderuiter in #1248
- docs: record required main merge protection by @fderuiter in #1249
- docs: keep manual release hold until replacement is verified by @fderuiter in #1250
- fix(proof): make workspace dialogs keyboard accessible by @fderuiter in #1258
- docs(adr): record ADR 0053 generative engine optimization & multi-platform social previews by @fderuiter in #1257
- feat(crf): route ActiveFormGrid mutators through engine & audit review targets by @google-labs-stitch[bot] in #1261
- feat(crf): integrate document-level EDC simulation state schema by @google-labs-stitch[bot] in #1260
- feat(crf): integrate functional protocol audit middleware and audit log by @google-labs-stitch[bot] in #1262
- feat(route-wrapper): evaluate options.auth inline in createApiHandler by @google-labs-stitch[bot] in #1266
- feat(mobile): decouple mobile routes with dedicated touch views and edge middleware redirection by @google-labs-stitch[bot] in #1264
- fix(proof): load validated custom formula sessions by @fderuiter in #1267
- fix(proof): make graph nodes keyboard operable by @fderuiter in #1268
- fix(build): externalize sitemap dependencies and isolate history checks by @fderuiter in #1273
- fix(ci): allow cleanup after completed fast gate checks by @fderuiter in #1274
- fix(dx): enforce staged index guardrails with safe Git path handling by @fderuiter in #1275
- feat(crf): validate USDM imports and preserve audit provenance by @fderuiter in #1276
- fix(vercel): preserve Git gates and fail closed on unverified headroom by @fderuiter in #1277
- test(vitest): add path-scoped UI coverage thresholds and remove blanket exclusions by @google-labs-stitch[bot] in #1278
- fix(proof): run terminal connect on parsed arguments by @fderuiter in #1287
- fix(clinical-chaos): shuffle fix-dialog choices so the answer isn't always option 1 by @fderuiter in #1358
- fix(laser-loon): let Tremolo and Cryo-Mortar kills finish the act by @fderuiter in #1357
- docs: document owner merge override for main by @fderuiter in #1353
- test(mutation): ratchet stryker break threshold from 45 to 53 by @fderuiter in #1352
- fix(arcade): derive playable game count from a single registry by @fderuiter in #1351
- fix(arcade): keep focus on the game in fullscreen and let game dialogs take Escape first by @fderuiter in #1350
- fix(patrol): replace internal issue numbers and milestone jargon with plain copy by @fderuiter in #1349
- fix(seo): keep DOM sanitizer out of the sitemap import chain by @fderuiter in #1348
- perf(db): add composite indexes for CaseStudy, CaseStudyFeedback and BlogPost by @fderuiter in #1335
- fix(garmin-watch): make setup wizard start the run and apply selected options by @fderuiter in #1299
- fix(quasi-puzzler): require confirmed restart when switching mode mid-proof by @fderuiter in #1292
- feat(study-director): ADR 0054 and deterministic domain core by @fderuiter in #1289
- docs: mark the retired dev consolidation branch as done by @fderuiter in #1288
- fix(neuro): make Field Manual and success overlay accessible dialogs by @fderuiter in #1293
- fix(crf): annotate SDTM targets and link absolutely in CRF exports by @fderuiter in #1290
- fix(proof): distinguish GIVEN premises from pending deductions by @fderuiter in #1291
- fix(observability): treat Redis enqueue timeout as expected degradation by @fderuiter in #1359
- feat(queue): event-driven sub-daily email retries via Upstash QStash by @fderuiter in #1337
- fix(clinical-chaos): stop trapping Tab and let focused buttons take Enter and Space by @fderuiter in #1360
- feat(study-director): archetypes, 31 branching events and the audit mechanic by @fderuiter in #1362
- fix(a11y): raise small metadata text to 4.5:1 via shared text-muted token by @fderuiter in #1361
- feat(study-director): database lock, evaluations, profile and FDA inspection by @fderuiter in #1363
- fix(working-with-duck): stop trick and code-burst spam from winning a sprint by @fderuiter in #1374
- feat(study-director): add the Study Director cabinet UI by @fderuiter in #1373
- fix(garmin-watch): drain the battery without the backlight and save high scores by @fderuiter in #1375
- fix(retro-labyrinth): run the TSP room mechanics and make hacking terminals reachable by @fderuiter in #1376
- feat(study-director): add the /arcade/study-director route and discovery entries by @fderuiter in #1379
- fix(quasi-perfect): parenthesize nested operators so grouping is visible by @fderuiter in #1380
- fix(retro-labyrinth): restore room-entry HP on retry and make drones cost HP by @fderuiter in #1378
- fix(neuro): stop Sandbox and repeat recon runs from farming QA score by @fderuiter in #1298
- fix(garmin-watch): prevent no-op GC and core-variable jettison from farming points by @fderuiter in #1296
- fix(study-director): make attention scarce and polish the desk UX by @fderuiter in #1386
- fix(neuro): label slice sliders and terminal send button, make log scrollable by @fderuiter in #1385
- feat(study-director): add 14 routine-work events to the quiet stretches by @fderuiter in #1390
- fix(neuro): derive case instructions and shortcuts from one hotkey table by @fderuiter in #1388
- ci: cancel a PR's CI runs when the PR closes or merges by @fderuiter in #1392
- fix(laser-loon): pause on Escape and while the museum or manual is open by @fderuiter in #1396
- fix(neuro): disclose 3D mesh vs synthetic slice and QA provenance by @fderuiter in #1391
- feat(trial-and-error): offer a skippable guided first Blind by @fderuiter in #1397
- fix(neuro): keep per-case drafts and offer undo after reset by @fderuiter in #1400
- feat(laser-loon): give bosses a telegraphed volley and a minion trickle by @fderuiter in #1399
- fix(neuro): reflow QA cards at 320px and replace raw TeX with readable symbols by @fderuiter in #1402
- fix(arcade): keep the setup wizard rectangular over the Garmin watch by @fderuiter in #1403
- fix(quasi-puzzler): update Story Mode briefing and RAM copy to match the 2× budget by @fderuiter in #1417
- fix(dx): ignore regenerated standalone engine bundles in the benchmark clean-tree check by @fderuiter in #1418
- fix(trial-and-error): size guided Blind buttons to 48px touch targets by @fderuiter in #1416
- fix(garmin-watch): align screen-reader controls and announcements with visible gameplay by @fderuiter in #1414
- feat(seo): add accessible FAQ accordion with matching FAQPage schema by @fderuiter in #1413
- test(quality): use shoehorn fromAny in error-sanitization mutants by @fderuiter in #1412
- fix(quasi-puzzler): make rewrite targeting errors and level-two guidance accurate by @fderuiter in #1411
- test(e2e): check controls are fully visible without failing on float noise by @fderuiter in #1409
- fix(garmin-watch): normalize score, distance, and battery progression across refresh rates by @fderuiter in #1408
- feat(geo): generate static /llms.txt and /llms-full.txt manifests by @fderuiter in #1405
- test(retro-labyrinth): freeze the animation loop in the retry-HP test by @fderuiter in #1427
- chore(deps): update zod, pretext, resend and tailwind-merge by @fderuiter in #1428
- fix(retro-labyrinth): one currency name, room numbers and pause keys by @fderuiter in #1460
- fix(dx): use the shared clean-tree check in the sub-route performance gate by @fderuiter in #1459
- refactor(navigation): add an accessible scrollToElement primitive and useScrollToAnchor hook by @fderuiter in #1457
- refactor(a11y): route ad-hoc live regions through useAnnouncer by @fderuiter in #1456
- refactor(haptics): route virtual pad vibration through triggerHaptic by @fderuiter in #1455
- refactor(simulator): derive Incident Simulator state from useStudioHashParams by @fderuiter in #1452
- refactor(events): add a shared useHotkeys hook and use it in the Navbar and Field Manual by @fderuiter in #1450
- refactor(core): route ad-hoc Math.random IDs through generateId by @fderuiter in #1448
- fix(neuro): raise provenance labels to WCAG AA contrast by @fderuiter in #1447
- chore(deps): upgrade framer-motion 13, isomorphic-dompurify 4 and mermaid 12 by @fderuiter in #1445
- feat(ui): add a shared ToastProvider and move the CRF Studio toasts onto it by @fderuiter in #1444
- fix(garmin-watch): disable Drain Battery until a run starts by @fderuiter in #1435
- chore(deps): upgrade @playwright/test to 1.63.0 by @fderuiter in #1431
- feat(og): bundle brand fonts and add artifact-enriched social card presets by @fderuiter in #1430
- feat(trial-and-error): derive every Card Table render decision from the view by @fderuiter in #1425
- perf(api): project summary columns for the case-study search index by @fderuiter in #1424
- feat(quasi-puzzler): put the active level within reach on mobile by @fderuiter in #1423
- feat(hooks): add useDebounce and useThrottle timing primitives by @fderuiter in #1422
- feat(seo): add engineering bridges linking tools to case studies and ADRs by @fderuiter in #1421
- fix(laser-loon): one name for weapon 4, one flight range, and a combo pill that lapses by @fderuiter in #1419
- fix(quasi-puzzler): preserve best earned score when a replay uses sorry by @fderuiter in #1407
- test(mutation): expand stryker target scope to telemetry and clinical logic with 65% gate by @google-labs-stitch[bot] in #1394
- feat(garmin-watch): ramp difficulty and put costs on pops and GC by @fderuiter in #1453
- fix(garmin-watch): rewrite the field manual and page copy from the real game by @fderuiter in #1440
- fix(working-with-duck): fit the cabinet on a desktop screen and correct two labels by @fderuiter in #1432
- feat(a11y): enforce shift-left accessibility audits and remediate UI components by @google-labs-stitch[bot] in #1280
- feat(deps): migrate to native npm allowScripts configuration by @google-labs-stitch[bot] in #1294
- ci(security): add daily scheduled security audit workflow and step summaries by @google-labs-stitch[bot] in #1295
- feat(telemetry): add in-memory 10s TTL cache and compound index by @google-labs-stitch[bot] in #1300
- feat(dx): add prisma schema and env verifier to doctor diagnostics by @google-labs-stitch[bot] in #1304
- refactor(case-studies): prune unused module exports and unexport embedded code by @google-labs-stitch[bot] in #1315
- test(vitest): integrate script coverage with path-scoped threshold gate by @google-labs-stitch[bot] in #1329
- refactor(crf): align eslint-config-next and refactor navigation to useRouter by @google-labs-stitch[bot] in #1339
- test(fuzz): add fast-check clinical property fuzzing suite and harden serialization engines by @google-labs-stitch[bot] in #1345
- fix(neuro): generate terminal diagnostics from the active case and validate recon-all by @fderuiter in #1398
- fix(api): describe case-study tags as the comma-separated string the route returns by @fderuiter in #1439
- perf(email): lease the retry batch in one SKIP LOCKED statement by @fderuiter in #1433
- fix(docs): regenerate TypeDoc pages stale on main by @fderuiter in #1472
- feat(security): add 14-day pre-expiry warning system for audit overrides by @google-labs-stitch[bot] in #1301
- perf(db): reorder unique constraint columns on BlogPostReaction to enable prefix index matching by @google-labs-stitch[bot] in #1334
- fix(garmin-watch): make NV flash write and clear match telemetry and persistence by @fderuiter in #1404
- chore(dx): run only locally installed binaries, drop bare npx by @fderuiter in #1429
- refactor(export): route every file download through one downloadFile helper by @fderuiter in #1434
- chore(deps): update next, clerk, sentry 11, tabler icons and upstash redis by @fderuiter in #1437
- fix(garmin-watch): show pause, fit the HUD, name crashes right and scale up in fullscreen by @fderuiter in #1438
- feat(retro-labyrinth): lock the exit until the room objective is done by @fderuiter in #1454
- fix(field-manual): leave keys a game already handled to the game by @fderuiter in #1461
- fix(quasi-perfect): screen-reader tactic buttons apply, level 1 copy by @fderuiter in #1462
- fix(clinical-chaos): carry the campaign score, count wrong fixes, close dialogs by @fderuiter in #1463
- refactor(client): add a typed apiClient and migrate the feedback, reactions and blog authoring forms by @fderuiter in #1466
- refactor(storage): route provider and telemetry storage access through safeStorage by @fderuiter in #1467
- refactor(trial-and-error): concentrate hand interaction policy behind one seam by @fderuiter in #1471
- refactor(hooks): add useSafeTimeout and useInterval and clean up leaking timers by @fderuiter in #1473
- refactor(logging): route service console calls through the StructuredLogger and ban raw console in app code by @fderuiter in #1474
- feat(clinical-chaos): keep late phases busy and fit the cabinet on a 900px screen by @fderuiter in #1477
- fix(meme-vault): stop the chaos button awarding the Konami trophy by @fderuiter in #1478
- fix(arcade): one prev/next ring for every game and no doubled top padding by @fderuiter in #1479
- fix(a11y): put the toast viewport in a named region landmark by @fderuiter in #1481
- fix(dx): stop the a11y integrity test flagging its own source by @fderuiter in #1485
- fix(dx): use shoehorn fromAny in the case-study list schema test by @fderuiter in #1484
- refactor(navigation): route Navbar, Footer and Command Palette anchor jumps through scrollToElement by @fderuiter in #1476
- refactor(i18n): add locale-pinned number formatting primitives by @fderuiter in #1465
- test(trial-and-error): scan the Hand key policy for Field Manual coverage by @fderuiter in #1487
- fix(dx): use shoehorn fromAny in the Hand interaction test stubs by @fderuiter in #1489
- fix(dx): give the lazy ELK layout chunk its own bundle budget by @fderuiter in #1491
- feat(seo): root viewport themeColor, brand dedupe hardening, og:image type by @fderuiter in #1332
New Contributors
- @vercel[bot] made their first contribution in #742
- @claude[bot] made their first contribution in #962
Full Changelog: v0.3.0...v0.4.0