Skip to content

Commit 16ddb56

Browse files
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

File tree

0 commit comments

Comments
 (0)