Commit 16ddb56
committed
chore(release): 0.8.0 [skip ci]
## [0.8.0](v0.7.0...v0.8.0) (2026-10-01)
### ✨ Features
* add --only flag to check-pages.ts for selective failure gating ([d976572](d976572))
* add a verify skill — production-build server, page checker, and gitignore narrowing ([e306742](e306742))
* build trainee modules 2-4 and fix module 1 navigation ([a6fde8f](a6fde8f))
* **canvas:** add defeaters, away goals and modules from the canvas (ADR 0005 D7) ([cc7191c](cc7191c))
* **canvas:** highlight a selected node's edges ([2e7ab4f](2e7ab4f)), closes [#963](#963)
* **canvas:** lay out side-attached elements as ELK cells (ADR 0005 D1) ([7daabdd](7daabdd))
* **canvas:** render away goals, modules and defeaters (ADR 0005 D2-D5) ([b0792eb](b0792eb))
* **db:** add per-user session_version column (AP-QA-003) ([1260d07](1260d07))
* **docs:** add Getting Started and Building a Case to the platform guide ([ebba80b](ebba80b))
* **docs:** migrate documentation from Nextra to Fumadocs ([4e2ad4e](4e2ad4e))
* **docs:** render curriculum cases on the real case canvas, not a parallel viewer ([d79d160](d79d160))
* encrypt OAuth tokens at rest ([eb0e698](eb0e698))
* **json-editor:** schema-aware editing, full screen, wrap, and format ([f7abbf2](f7abbf2))
* let trashing a published case archive its Discover copy instead of removing it ([45e320f](45e320f))
* **names:** defeater identifiers follow GSN (CP1, CG1, CE1) ([718f9b3](718f9b3))
* **plugins:** manifest card copy and off-switch consequence read ([5de8842](5de8842))
* **plugins:** Plugins management page, cards, and off-switch confirmation ([ed2fe7c](ed2fe7c))
* **schemas:** generate json-schema-v1.0.json from CaseExportNestedSchema ([56781e8](56781e8))
### 🐛 Bug Fixes
* **account:** send the account-deleted confirmation on self-service deletion ([ef2fbf6](ef2fbf6))
* add bfcacheId to feedback form router test mock ([62e79a2](62e79a2))
* address verify-skill review findings ([0b2961a](0b2961a))
* allow editing existing context entries in the node edit dialog ([1c7b3cc](1c7b3cc))
* allow LAN dev origins for cross-origin HMR and static chunks ([f364ffd](f364ffd))
* **auth:** bind OAuth account linking to a signed, session-bound intent ([91f0720](91f0720))
* **auth:** bump session version atomically on password change and reset ([f5244ab](f5244ab))
* **auth:** drop lib/errors import from middleware to keep it edge-bundleable ([31e7107](31e7107))
* **auth:** hash password-reset tokens at rest and consume atomically ([7a8535f](7a8535f))
* **auth:** reject JWTs whose session version is stale ([288b464](288b464))
* **auth:** remove the proxy auth-page redirect loop and sign out on password change ([338073b](338073b))
* **auth:** return JSON 401 for unauthenticated API requests instead of redirecting to login ([4ee13dc](4ee13dc))
* **auth:** scope the link-intent guard to OAuth sign-ins and fix expiry ([572e6fd](572e6fd))
* **canvas:** capture case thumbnails with html-to-image so Tailwind oklch colours render ([71ed42b](71ed42b))
* **canvas:** cell-aware child ordering, below-cell connector, arrow gap ([05ae466](05ae466))
* **canvas:** flatten nested defeaters into one cell, direction-aware bend, layout safety net ([0874637](0874637))
* **canvas:** let a detached away goal / module be re-attached ([626afa9](626afa9))
* **canvas:** re-validate citedElementId when only moduleReferenceId moves ([b044c71](b044c71))
* **canvas:** render the Defeater chip and border ADR 0005 D2 asked for ([b2bef76](b2bef76))
* **canvas:** respect prefers-reduced-motion on the edge highlight; stop forcing the deselect click ([8e5f84d](8e5f84d))
* **canvas:** scope citedElementId to the case moduleReferenceId names ([892524e](892524e))
* **canvas:** skip web-font embedding in thumbnail capture ([a82d9f6](a82d9f6))
* **canvas:** stop citedElementId's case check short-circuiting on null ([ce39316](ce39316))
* **canvas:** wire moduleEmbedType through the create path for MODULE elements ([c85a7f2](c85a7f2))
* **case:** identifier comparator understands multi-letter prefixes ([15324c2](15324c2))
* **cases:** map the post-parse file-size error to 413, dedupe case-information reads ([631b345](631b345))
* **cases:** require EDIT before parsing feature-image uploads ([57ddb9c](57ddb9c))
* **cases:** stop leaking private case names via page metadata ([b529337](b529337))
* change the case and screenshot media address on every upload, and support conditional 304 requests ([59d8d5a](59d8d5a))
* check access before serving case images, isolate published copies from live edits ([ebd0060](ebd0060))
* **db:** reconcile deployed schema drift and add a CI diff gate (AP-QA-004) ([0728c8b](0728c8b))
* **db:** review follow-ups on the schema-drift reconciliation migration ([df195dc](df195dc))
* deduplicate sharp and patch transitive advisory overrides ([d376665](d376665))
* **deps:** pair the changelog preset with the release-notes writer ([c5d9493](c5d9493))
* **deps:** pin nextra's internal zod resolution to 4.3.6 ([559682d](559682d))
* **deps:** rebase nextstepjs patch, fail on drift ([84d9ad6](84d9ad6))
* **deps:** revert @radix-ui/* patch bumps — they break the nested-dialog dismiss guard ([fdf14b9](fdf14b9)), closes [#914](#914) [#914](#914) [#914](#914)
* **deps:** scope js-yaml for next-openapi-gen ([bf6d581](bf6d581))
* **dialogs:** keep the import modal open until warnings are seen ([35c5bf0](35c5bf0))
* **dialogs:** remove name field, surface server errors verbatim ([632992b](632992b))
* **docs:** hide the dead comment button in the read-only case canvas ([2f0da31](2f0da31))
* **docs:** prefix technical-guide's Card and Callout links with /docs ([17fab1a](17fab1a))
* **docs:** remove the duplicate h1 on every content page ([a98cbd0](a98cbd0))
* **docs:** restore data-retention-policy to the platform-guide sidebar ([429ab37](429ab37))
* **elements:** bump the case's updatedAt on element-level writes ([b7a0132](b7a0132))
* **email:** never log message bodies; fail closed when no provider is configured in production ([39a114c](39a114c))
* **F10/F11:** cap the table of contents to h2/h3, h2 only on the changelog ([deaa827](deaa827))
* **F1:** stop Fumadocs prose CSS underlining card title and description text ([a3b9be6](a3b9be6))
* **F2:** stop Edit on GitHub stretching to a full-width bar ([6236fa0](6236fa0))
* **F3:** dock the minimized progress pill as a full-width bar on phones ([32d002d](32d002d))
* **F4:** add an overflow cue to code blocks and lift the copy button ([f13c5ec](f13c5ec))
* **F5:** remove MDX headings duplicated by Quiz and ReflectionPrompts ([2a6c3a9](2a6c3a9))
* **F9:** drop the case-studies index's duplicate domain-grouped list ([616ca91](616ca91))
* **fonts:** load the Google Fonts stylesheet with CORS so canvas captures can embed it ([39270eb](39270eb))
* harden page-check CI step and lower buildFailReasons complexity ([d223c32](d223c32))
* identify canvas nodes by id and type, not colour, in module 1 guidance ([150494d](150494d))
* **import:** add defeats_dangling column for import-time dangling-defeat flag ([bcfc22b](bcfc22b))
* **import:** carry isDefeater/defeatsElementId through nested->flat and import rows ([f6e38ad](f6e38ad))
* **import:** enforce citation case-membership on batch/import paths; degrade absent module references ([71f7869](71f7869))
* **import:** filter soft-deleted elements when resolving external citedElementIds ([fb72c34](fb72c34))
* **import:** reset defeatsDangling when the author edits defeatsElementId ([df11e7a](df11e7a))
* **import:** surface defeatsDangling on element API responses ([67a7d57](67a7d57))
* **import:** treat a self-referencing defeater as unresolvable on import ([a92c585](a92c585))
* **json-editor:** keep the draft when the clipboard copy fails ([0c14c4c](0c14c4c))
* **json-editor:** reset scroll position before the e2e wheel-scroll check ([f97e4de](f97e4de))
* **json-editor:** revalidate before Apply so a corrected document is diffed, not the rejected one ([8737981](8737981))
* **json-editor:** scope the full-screen Esc handler to the panel ([b343864](b343864))
* **json-editor:** surface the 409 conflict state on Apply ([045bd61](045bd61))
* **json-editor:** use Radix's own onEscapeKeyDown, and fix full-screen width ([f9766fd](f9766fd))
* keep the module 1 stage stepper usable at 375px ([4613bd2](4613bd2))
* **landing:** remove redundant layout wrapper that triggered [#418](#418) hydration errors ([eb745a5](eb745a5))
* **names:** flat count excludes strategy-transparent claims too ([b566d60](b566d60))
* **names:** ordinary children of defeaters take a flat plain number ([31cf5d8](31cf5d8))
* **picker:** de-duplicate directly-shared cases in the away-goal picker ([5e0a2d0](5e0a2d0))
* **plugins:** make manifest docsPath optional until a docs page exists ([afa405b](afa405b))
* **plugins:** review round — conditional docs link, shared fetch hook, dialog copy and height ([b0816ea](b0816ea))
* **plugins:** share the API error parser, settle the dialog test, reserve dialog height ([c475bcb](c475bcb))
* **privacy:** say Data Protection Team, not Officer ([96d5ab1](96d5ab1))
* refuse to read, copy, delete or store a case's feature image using a key it doesn't own ([f219d79](f219d79))
* **release:** drop the # Changelog line from changelogTitle ([e09d79b](e09d79b))
* remove dangling links to the deleted standalone guides ([e8c1f95](e8c1f95))
* remove duplicated plugin sentence in architecture overview ([b08942f](b08942f))
* return a validation error when a case feature image value is refused ([be7831a](be7831a))
* route the published-copy delete choice through every entry point and close the publish/trash races ([7a2dfd3](7a2dfd3))
* run the release config test when the config changes, and correct a plugin return type ([7c5ca3c](7c5ca3c))
* **schemas:** guard the recursive-def rename against more than one match ([42f14be](42f14be))
* **schemas:** restore field descriptions TreeNodeSchema was missing ([7783f6e](7783f6e))
* skip the plugin-enablement fetch on the read-only docs canvas ([26802f7](26802f7))
* stop leaking internal storage keys through public Discover responses ([9dd2209](9dd2209))
* treat a returned sendEmail error as a failed retention warning ([a7c9ef6](a7c9ef6))
* treat undecryptable stored tokens as absent instead of throwing ([79ca821](79ca821))
### 📚 Documentation
* add AGENTS.md as the shared agent instructions and correct CONTRIBUTING hooks and issue-tracking sections ([0e0d207](0e0d207))
* add r3b feature pages to platform and technical guides ([b55a6d8](b55a6d8))
* add REVIEW.md review checklist ([7e7b8ad](7e7b8ad))
* apply Chris's review edits; remove the standalone guides ([15fc489](15fc489))
* apply the approved 1.0 page map ([7241eea](7241eea))
* correct the adapter's comment about the shapes it accepts ([b3f6e33](b3f6e33))
* correct the integration test database name pattern and restore the environment table ([aecb99a](aecb99a))
* correct the SEED_USER_PASSWORD comments after the register-test fix ([304e263](304e263))
* correct token column comments in the Prisma schema ([16ffa5f](16ffa5f))
* describe Fumadocs, not Nextra, in CONTRIBUTING.md ([666abe5](666abe5))
* describe the published-case delete choice and account-deletion archiving accurately ([4d64e9f](4d64e9f))
* document the password policy next to SEED_USER_PASSWORD ([4f352ad](4f352ad))
* document UPLOADS_DIR in the example environment file ([e0ef1d4](e0ef1d4))
* explain the baseline and where to run proof scripts in verify-in-browser ([178499f](178499f))
* fix import-chain direction in proxy.ts comments ([5a0000a](5a0000a))
* fix the SEED_USER_PASSWORD comments to name real tests ([a444f45](a444f45))
* move UPLOADS_DIR under file storage with a comment ([d01fe44](d01fe44))
* note the removed anonymous uploads route and the public image field change in the changelog ([04b69f4](04b69f4))
* port r3b technical guide and quick reference content ([de26fb3](de26fb3))
* remove D10 pre-migration pages and dead links ([d99ef70](d99ef70))
* remove remaining stale Nextra references ([1aa9dd6](1aa9dd6))
* scope REVIEW.md rules and mark those that need a test run ([657228e](657228e))
* the logger cannot be imported from the middleware bundle ([7550ca2](7550ca2))
### 💄 Styles
* apply formatter to trainee module data files ([2a51bd4](2a51bd4))
* **auth:** satisfy lint (top-level regex constants, formatting) ([eb81f1b](eb81f1b))
### ♻️ Code Refactoring
* British spelling, rounded baseline CLS, robust entry guard ([1892afa](1892afa))
* **canvas:** extract CitedCaseLink; drop unused D5 resolver exports ([1622328](1622328))
* **canvas:** extract picker fetching/selection and payload building ([ed67019](ed67019))
* **canvas:** two more small extractions for the coverage-mapped gate ([2607293](2607293))
* **cases:** dedupe body-cap reading, stop spy leaks between tests ([a41588f](a41588f))
* consolidate duplicate schema/service types ([bf252a6](bf252a6))
* dedupe encryptForStorage, cut config.ts/sweep complexity, drop cast ([288eb07](288eb07))
* describe behaviour rather than a design label in two comments ([bf0d3a0](bf0d3a0))
* **docs:** drop SafeHeading, remarkUnwrapHeadingLinks is sufficient ([29a5fba](29a5fba))
* extract pure helpers to shrink orchestration functions ([40c50ad](40c50ad))
* **import:** split dialogical-reasoning fields out of applyOptionalFields ([bb4c8d5](bb4c8d5))
* **types:** de-duplicate curriculum TreeNode/CaseExportNested/ExportComment ([d4dbbc6](d4dbbc6))
* **types:** drop curriculum's now-unused ExportComment/Element* re-exports ([6ed82c6](6ed82c6))
### ✅ Tests
* add adversarial coverage for private case media access control ([6130e89](6130e89))
* add unit coverage for the Azure blob adapter ([3ee3f35](3ee3f35))
* adversarial coverage for trashing a published case ([2a4c95d](2a4c95d))
* **auth:** cover malformed-token and changePassword reset-clearing (AP-QA-006) ([da2efe3](da2efe3))
* **auth:** reach the payload-decoding branches in verifyLinkIntent ([3faa07c](3faa07c))
* **canvas:** nested-defeater flattening, degrade-without-throwing, ELK fallback, LR centreX ([7b2604f](7b2604f))
* **canvas:** split the layout probe; add two-defeater and LR coverage ([e364955](e364955))
* **canvas:** unit tests for the challenges edge and the node-kind resolver ([189f012](189f012))
* **canvas:** x-position assertions for ordering, centreY, support-edge unit tests, e2e ([f0cbfec](f0cbfec))
* close three context-editing test gaps flagged in QA ([00f2c15](00f2c15))
* cover nextstepjs pointer recalculation ([1e1a098](1e1a098))
* cover OAuth token encryption in the config/github-drive integration suites ([f5e0e27](f5e0e27))
* cover the adapter's throw branches in buildStrategy and buildPropertyClaim ([5e2ac77](5e2ac77))
* cover the local upload path's key check and write failure ([c11e23e](c11e23e))
* cover the ownership check, legacy media shapes, collaborator access and header details ([c209cb6](c209cb6))
* cover the remaining orchestration functions ([0cfe2dc](0cfe2dc))
* cover the shared encryptForStorage and encryptIfPlaintext helpers ([aebb6d7](aebb6d7))
* **dialogs:** no-name-field render tests, verbatim error assertions, import path+message ([b29eb06](b29eb06))
* **dialogs:** warnings hold the import modal open before navigation ([29c9dac](29c9dac))
* **e2e:** allow running against an external server without resetting the database ([52f002e](52f002e))
* **e2e:** anchor G1 and AG<n> selectors (nanaki round 2) ([cf78fd1](cf78fd1))
* **e2e:** clarify the external-server variables and accept true for the reset skip ([3eff6af](3eff6af))
* **e2e:** drop the case-studies grouped-list assertions removed by F9 ([bf25c13](bf25c13))
* **e2e:** force the deselect click past the fixed top nav overlay ([e1119e4](e1119e4))
* **e2e:** point-in-rectangle stranded check, exact cited-case name match ([59f75cf](59f75cf))
* **e2e:** register test uses its own throwaway password ([4ac1154](4ac1154))
* extract the TOC depth rule into a pure, tested function ([9e2ce93](9e2ce93))
* fix flaky tamper helper in the token-encryption integration tests ([3681dfd](3681dfd))
* **fonts:** pin crossOrigin on the injected Google Fonts link ([b157432](b157432))
* give each integration test worker its own throwaway uploads root ([652adad](652adad))
* **import:** cover defeatsDangling surfacing on element GET response ([2dba749](2dba749))
* **import:** round-trip and unit coverage for defeater import fidelity ([33a2308](33a2308))
* **import:** split defeater round-trip test to keep fallow complexity gate clean ([a9e8417](a9e8417))
* **json-editor:** drop toolbar assertions that can't fail on this PR ([d76c0be](d76c0be))
* **json-editor:** exercise the schema-aware path, Format, and wrap ([0170bf1](0170bf1))
* **json-editor:** narrow indexed reads for noUncheckedIndexedAccess ([c89ebc0](c89ebc0)), closes [Array#at-index](https://github.com/alan-turing-institute/Array/issues/at-index)
* **json-editor:** polyfill Range geometry for real CodeMirror mounts ([cd88c3b](cd88c3b))
* **json-editor:** prove the Escape/width fixes, and the mounted linter ([bb7a3c6](bb7a3c6))
* **json-editor:** tolerate sub-pixel scroll residual after Home ([2c3764f](2c3764f))
* **json-editor:** toolbar, panel, and validation-gate coverage ([c84e746](c84e746))
* **names:** defeater identifier naming class, both ways ([4bb806a](4bb806a))
* **names:** ordinary children of defeaters, and isDefeater flips ([e1e31c1](e1e31c1))
* **names:** strategy-transparent claims excluded from the flat count ([f7b181b](f7b181b))
* pin decryptToken's ciphertext-too-short branch ([dbcec41](dbcec41))
* reach the publish/trash race guards for real, and cover the archived-copy edge cases ([3673103](3673103))
* render release notes with the repository's release config ([69b58ac](69b58ac))
* **retention:** assert the loser's outcome and the claimed state ([875a050](875a050))
* **retention:** assert the warn30 send-failure log ([57e5a0a](57e5a0a))
* **retention:** make concurrent-sweep race test deterministic ([5e2b23a](5e2b23a))
* **schemas:** drift tests for the generated JSON Schema and enum vocabularies ([2e8d530](2e8d530))
* **settings:** guard that every settings tab resolves to a real page ([b881217](b881217))
* split nextstepjs pointer test into two checks ([182f910](182f910))
* wait for a real lock instead of sleeping in the row-lock race tests ([14bd383](14bd383))
### 👷 Build System
* drop the --webpack flags now Turbopack builds clean ([de30608](de30608))
### 🔧 CI/CD
* also strip attachments the HTML reporter copies into playwright-report/data ([64162bd](64162bd))
* check every page loads after E2E tests ([e32f687](e32f687))
* correct the deploy queue comment and staging recovery note ([d6e20d5](d6e20d5))
* gate OpenAPI spec drift on PRs ([a806aea](a806aea))
* guard the artifact-strip step against a missing test-results dir ([56350da](56350da))
* narrow the staging reseed queue comment ([4863478](4863478))
* narrow the staging reseed queue comment ([23cbb80](23cbb80))
* queue staging reseeds so two never run at once ([c49da86](c49da86))
* queue staging reseeds so two never run at once ([b722689](b722689))
* **release:** merge main back into staging after each release ([6006edb](6006edb))
* serialise staging deploys with staging reseeds ([dcb4dca](dcb4dca))
* skip the Structural Quality audit on staging→main promotion PRs ([fc3f041](fc3f041)), closes [#940](#940)
* strip failure snapshots and traces before uploading e2e artifacts ([f54c88f](f54c88f))1 parent 270e522 commit 16ddb56
2 files changed
Lines changed: 241 additions & 1 deletion
0 commit comments