Skip to content

getwrite: v2.2.0

Choose a tag to compare

@github-actions github-actions released this 24 Sep 19:00
a21e8af

2.2.0 (2026-09-24)

Features

  • api-schemas: add compile/export/patch-revision transport schemas (76a3b1d)
  • api-schemas: add transport-boundary response schemas (283006f)
  • api-transport-validation: add shared validation-failure helper (d12de22)
  • api: map locked-access errors to 401/409 in with-storage-context [task_eb5b7035] (44aa78d)
  • api: validate degrade-to-fallback transport response bodies (Feature 50) (2b3d63b)
  • api: validate HTTP response bodies at the transport boundary (Feature 48) (5aea44c)
  • api: validate status-only-reject transport response bodies (Feature 51) (cac7d86)
  • authored typed entity relationships (Feature 38) (a5f1ff2)
  • compile-api: validate text/markdown compile response shape (fc0ff56)
  • destructive-styling-a11y: alias destructive Button variant to secondary [task_af2622dc] (f72904f)
  • destructive-styling-a11y: install axe-core@4.11.4 devDependency [task_e9426456] (0b8f5b1)
  • destructive-styling-a11y: real axe-core check for TrashView a11y test [task_13c25bf8] (dd9eddb)
  • destructive-styling-a11y: strict-axe override on TrashView stories [task_87f1b3a2] (237abda)
  • destructive-styling-a11y: sync fg-tertiary tokens, repoint gw-secondary [task_98bb9023] (1674686)
  • docx: add CLI project import-docx command [task_17473395] (54afbeb)
  • docx: add comment/tracked-change/image package-part detection [task_e3e650db] (6d27266)
  • docx: add docProps/core.xml title/author reader [task_0db8238c] (3f4fedc)
  • docx: add DOCX import report builder [task_faeaa2d6] (0d4934d)
  • docx: add Electron worker entry point and build:worker wiring [task_99d8d530] (0317790)
  • docx: add heading-level document split [task_c251bafc] (2efbc6a)
  • docx: add import orchestrator importDocxProject [task_c93ff801] (21a1e72)
  • docx: add ImportDocxDialog state machine [task_858ac96d] (cc3a88e)
  • docx: add main-process IPC for the DOCX import flow [task_a4d4cc0c] (d8b7e2e)
  • docx: add mammoth and jszip dependencies [task_3bf469c5] (dae6284)
  • docx: add mammoth-to-TipTap conversion with footnote/endnote handling [task_e547c5a1] (f545fdf)
  • docx: add renderer-facing bridge channels for DOCX import [task_455afc11] (a41992d)
  • docx: add source detection and folder walk [task_c2258b9e] (aec2cb2)
  • docx: add Storybook stories for the DOCX import flow [task_54107608] (949d7aa)
  • docx: DOCX-specific destination-not-empty refusal wording [task_0358cbd2] (60d90b3)
  • docx: package the DOCX import worker bundle [task_e197764b] (5a05b77)
  • docx: wire the Import Word Document entry point on the Start page [task_8df6a3f4] (7c65890)
  • docx: Word/DOCX project importer (Feature 45) (15d7713)
  • electron: add destination-root and default-name computation for Scrivener import [task_922823a7] (7918e47)
  • electron: add Scrivener import worker entry point and build:worker bundle [task_babc419d] (1685b66)
  • electron: add selection-handle registry for Scrivener import [task_29c7d3a1] (fad38a2)
  • electron: add single-import guard for Scrivener import [task_dc5b5c84] (b865ee5)
  • electron: expose Scrivener import channels on the desktop bridge [task_3ac7c24b] (4bdf4bb)
  • electron: ship Scrivener import worker bundle in packaged build and dev [task_32a9fde8] (585e4a7)
  • electron: wire Scrivener import IPC handlers into main.ts [task_25d8ff8c] (c8a3999)
  • entity co-occurrence (Feature 37) + entity-graph specs (36cef1e)
  • entity relationship graph view (Feature 39) — completes FR-39 (53699cf)
  • entity-alias-table-api: validate getEntityAliasTable response shape (7f9f3e8)
  • entity-cooccurrence: add client transport module [task_9b30833e] (131e603)
  • entity-cooccurrence: add entity-cooccurrence HTTP route [task_9b30833e] (b2231a0)
  • entity-cooccurrence: add EntityMentionsSection Storybook stories [task_9b30833e] (2d7afc3)
  • entity-cooccurrence: add getEntityCooccurrence to mentions-core [task_9b30833e] (f721d18)
  • entity-cooccurrence: render Also appears with list [task_9b30833e] (4f24434)
  • entity-cooccurrence: wire alias-table name resolution into EntityMentionsSection [task_9b30833e] (47d2f41)
  • entity-cooccurrence: wire native transport parity [task_9b30833e] (c0c150a)
  • entity-graph-drag: add live position override state [task_f67e0c8b] (235f1e3)
  • entity-graph-drag: add Storybook story for node dragging [task_f67e0c8b] (715e282)
  • entity-graph-drag: resolve edge endpoints from overrides at render [task_f67e0c8b] (439f0da)
  • entity-graph-drag: suppress click/navigation after a drag [task_f67e0c8b] (9d6b38d)
  • entity-graph-drag: wire node drag mechanics [task_f67e0c8b] (c32f392)
  • entity-graph-tooltips: add Storybook story for edge tooltip [task_ed4ccf87] (517790a)
  • entity-graph-tooltips: add transparent hit-target line per edge [task_ed4ccf87] (7f417bf)
  • entity-graph-tooltips: extract shared edge-description module [task_ed4ccf87] (bc59ee2)
  • entity-graph-tooltips: wire edge hover/tap tooltip via bespoke overlay (FAIL path) [task_ed4ccf87] (e39d01c)
  • entity-graph: drag nodes to reposition them on the relationship graph (6f699f4)
  • entity-graph: edge tooltips on the relationship graph (aec132f)
  • entity-highlighting: add alias-table cache slice with FR-12 refetch triggers [task_4b2ec55f] (912ab7c)
  • entity-highlighting: add client transport for the alias table [task_4b2ec55f] (98355eb)
  • entity-highlighting: add entity-alias-table HTTP route [task_4b2ec55f] (69e766a)
  • entity-highlighting: add entity-match decoration core [task_4b2ec55f] (7625515)
  • entity-highlighting: add entityHighlighting project feature flag [task_4b2ec55f] (a749ce9)
  • entity-highlighting: add gated entity highlighting toggle to preferences [task_4b2ec55f] (ccd1483)
  • entity-highlighting: style the two FR-10 highlight states + story [task_4b2ec55f] (731fd6d)
  • entity-highlighting: wire decoration extension into the editor [task_4b2ec55f] (c198f64)
  • entity-highlighting: wire native transport parity for the alias table [task_4b2ec55f] (d1cb566)
  • entity-layer: add alias detection engine with boundary/possessive/plural matching [task_ddb55116] (e9b7bb7)
  • entity-layer: add alias noise-warning heuristics [task_ddb55116] (8390758)
  • entity-layer: add entities-mentioned read-only section to resource view [task_ddb55116] (e6f77d7)
  • entity-layer: add entity mentioned-in section with linked/mentioned labels and ambiguity flags [task_ddb55116] (acd91a3)
  • entity-layer: add entity metadata UI (entityKind and alias editor) [task_ddb55116] (09ffa9b)
  • entity-layer: add entity sidecar fields entityKind and aliases [task_ddb55116] (c18cab1)
  • entity-layer: add mention index schema and persistence [task_ddb55116] (8afc8cc)
  • entity-layer: add mentions data-access core and API routes [task_ddb55116] (e1001e5)
  • entity-layer: add mentions query intrinsic field [task_ddb55116] (82c09c0)
  • entity-layer: add native transport for mentions core (ADR-021 parity) [task_ddb55116] (52491cc)
  • entity-layer: add per-project entity alias table with ambiguity detection [task_ddb55116] (2b0d5ca)
  • entity-layer: add targeted per-entity mention rescan on name/alias change [task_ddb55116] (4961a96)
  • entity-layer: gate the entity panel behind an off-by-default project feature flag [task_ddb55116] (df2e555)
  • entity-layer: rebuild mention index in getwrite-cli reindex [task_ddb55116] (6e3908a)
  • entity-layer: wire entity mention detection into indexer-queue save path [task_ddb55116] (16edc71)
  • entity-relationship-graph: activate a node to navigate to its resource [task_129bcb39] (93f874c)
  • entity-relationship-graph: add d3-force headless layout dependency [task_129bcb39] (e381007)
  • entity-relationship-graph: add pan, zoom, and node selection [task_129bcb39] (03646e9)
  • entity-relationship-graph: add Storybook stories for graph, canvas, list [task_129bcb39] (7822693)
  • entity-relationship-graph: assemble graph node and edge data [task_129bcb39] (6546fdf)
  • entity-relationship-graph: build FR-11 accessible node/edge list [task_129bcb39] (a530453)
  • entity-relationship-graph: build SVG canvas with d3-force layout [task_129bcb39] (83cd11d)
  • entity-relationship-graph: distinguish edge kinds, direction, weight [task_129bcb39] (ea73c6b)
  • entity-relationship-graph: wire seventh Graph view into shell [task_129bcb39] (0fc87db)
  • entity-relationships-api: validate list/listOrThrow response shape (6ac6b66)
  • entity-relationships: add client transport module [task_fdd64cd6] (db6040e)
  • entity-relationships: add default relationship-type vocabulary fallback [task_29382dbe] (1fe05d5)
  • entity-relationships: add EntityRelationshipsSection create control [task_fdd64cd6] (3284755)
  • entity-relationships: add EntityRelationshipsSection Storybook stories [task_fdd64cd6] (803154f)
  • entity-relationships: add HTTP routes for list/create/remove [task_fdd64cd6] (eb8f392)
  • entity-relationships: add locked, idempotent entity-relationships model [task_fdd64cd6] (cadbd05)
  • entity-relationships: add per-project relationship-type list [task_fdd64cd6] (57f7526)
  • entity-relationships: add relationship-type settings editor [task_29382dbe] (1b00342)
  • entity-relationships: add remove-by-entity HTTP route [task_9f942710] (3b0a5f6)
  • entity-relationships: add removeEntityRelationshipsForEntity [task_06806c66] (6b45fc6)
  • entity-relationships: persist relationshipTypes via feature-config route [task_29382dbe] (ebf9d88)
  • entity-relationships: render relationship list with removal and FR-11 placeholder [task_fdd64cd6] (8f7fa1e)
  • entity-relationships: wire native transport parity and web exclusion [task_fdd64cd6] (91324c3)
  • entity-relationships: wire native transport parity for remove-by-entity [task_5b651146] (7c918c0)
  • entity-roster: add client transport for mention counts [task_facfacac] (1c01f9e)
  • entity-roster: add entity-mention-counts HTTP route [task_facfacac] (02b0789)
  • entity-roster: add getProjectMentionCounts to mentions-core [task_facfacac] (c945ec6)
  • entity-roster: assemble roster entity list with counts and warnings [task_facfacac] (852e494)
  • entity-roster: build accessible entity roster row [task_facfacac] (980bf55)
  • entity-roster: wire native transport parity for mention counts [task_facfacac] (506f674)
  • entity-roster: wire row activation to setSelectedResourceId + edit view [task_facfacac] (6412b90)
  • entity-roster: wire the Entities view into ViewSwitcher and AppShell [task_facfacac] (3f13952)
  • entity-scoped compile (cf97d8b)
  • entity-scoped-compile: add entity-mode to CompilePreviewModal [task_79e35996] (b06da08)
  • entity-scoped-compile: add read-only ordered resource list component [task_79e35996] (c79675b)
  • entity-scoped-compile: add tree-position ordering bridge [task_79e35996] (a64e788)
  • entity-scoped-compile: wire compile trigger into EntityMentionsSection [task_79e35996] (817cb5e)
  • export-api: validate text/markdown export response shape (22d333c)
  • project-level entity roster (e86adf3)
  • project-types-api: validate list response against ProjectTypeSchema (32d170c)
  • projects-api: validate list/open/create response shape (FU-10 fix) (2178121)
  • remove-entity: add clearKeys allowlist to updateSidecarCore and sidecar route [task_583e43e7] (3cadeec)
  • remove-entity: add clearKeys transport parity for HTTP and native [task_00d773c7] (077e2a7)
  • remove-entity: add ConfirmDialog isConfirmDisabled prop [task_4c6f9116] (fdd8019)
  • remove-entity: add failure-aware relationship read for the dialog [task_2b49912a] (26028ba)
  • remove-entity: add RemoveEntityControl dialog with fetch and gating [task_c8feb188] (4b872ee)
  • remove-entity: add RemoveEntityControl Storybook stories [task_bfcb37cc] (d3003f6)
  • remove-entity: add sidebar-scoped relationships-refresh context [task_c1745766] (ba4d511)
  • remove-entity: wire confirm handler ordering, sidecar write, and focus [task_d7ca190d] (67f813f)
  • remove-entity: wire Remove Entity and field-clearing path onto clearKeys [task_3ecf5c2e] (5b52c30)
  • resources-api: validate create/uploadMedia/copy response shape (4375256)
  • Scrivener UI import flow for the desktop app (Feature 43) (e2768ed)
  • scrivener: add .scrivx parser and Creator allow-list check [task_01594827] (ae61baf)
  • scrivener: add binder to resource-tree mapper [task_8899ba4a] (825fb2b)
  • scrivener: add FR-9 import report builder [task_6b2bd6ed] (4f2da3e)
  • scrivener: add hand-rolled RTF to TipTap converter [task_d31e3f24] (225b6d0)
  • scrivener: add importScrivenerProject orchestrator [task_f60daa66] (fb07b47)
  • scrivener: add sidecar synopsis/notes and feature-toggle enablement [task_6743a166] (87edcb5)
  • scrivener: add Status/Label/Keywords/CustomMetaData mapper [task_a04d9498] (8f6350e)
  • scrivener: expose importScrivenerProject via core.ts and add CLI command [task_088c019d] (accfc2a)
  • scrivener: suspend background indexing/watcher for the import's write phase [task_173aca2a] (0def42b)
  • start: add ImportScrivenerDialog state machine [task_3833a997] (e3f906e)
  • start: wire Import button on Start page to ImportScrivenerDialog [task_bde05f95] (9e59ca3)
  • task-1: add shared locked-access predicate module [task_3fbfddff] (9a4a86f)
  • task-1: add transport response-body schemas for degrade sites [task_31c1ed58] (c9593dc)
  • task-1: thread restoredName through restore route, client, and TrashView notice [task_c6228e07] (79c9ea1)
  • task-2: folder-specific delete confirmation wording [task_8c23ba89] (403b60d)
  • task-2: marker-first fail-closed rewrite of adapterFor [task_6ea3fdb2] (78e1640)
  • task-2: validate resources.ts fetchContent and fetchRevisionContent [task_86d8b8c4] (f73b78f)
  • task-3: add softDeleteFolderCore and route deleteFolder through ResourcesTransport [task_7bb54199] (87112b7)
  • task-3: validate entity-relationships.ts write-path response bodies [task_ec88e146] (54e7db2)
  • task-4: reject on non-2xx response from HTTP remove and deleteFolder [task_1cf310b1] (31f048b)
  • task-4: validate tags.ts list and listAssignments response bodies [task_a0709ee0] (e1d400d)
  • task-5: keep delete state unchanged and toast an error on rejection [task_96624fcc] (01ffa3e)
  • task-5: validate mentions.ts getResourceMentions and getEntityMentionedIn [task_3ab9a06d] (85cf94c)
  • task-6: TrashView refetches on a resourcesSlice delete made elsewhere [task_205ac241] (126cfdf)
  • task-6: validate entity-cooccurrence.ts getEntityCooccurrence [task_b81daa9b] (b5a7a44)
  • task-7: validate entity-mention-counts.ts getEntityMentionCounts [task_c47ca9b0] (3359995)
  • task-8: validate resource-excerpts.ts fetch response body [task_e973c987] (0c22372)
  • task-9: raise a generic toast from reportTransportValidationFailure [task_b8ce593a] (d83a8d3)
  • trash-ui: add folder cascade soft delete with FR-20 manifest [task_0dc2c852] (607aa88)
  • trash-ui: add folder-delete route and fix client-side orphaning gap [task_5f2e7b67] (4645796)
  • trash-ui: add FR-18 ordered, resumable purge sweep [task_1d613c6b] (2a7a923)
  • trash-ui: add lib/api/trash.ts client transport with native web stub [task_ba35c625] (1a2305e)
  • trash-ui: add multi-select restore/purge/empty-trash batch controls [task_6dc26c7d] (10c905a)
  • trash-ui: add purge-sweep primitives for revisions and idempotency [task_d5f5a15b] (e1ac8b8)
  • trash-ui: add restore relocation/rename notices and WCAG 2.1 AA pass [task_b2814e1d] (3993d39)
  • trash-ui: add restoreFolder rebuilt from the FR-20 manifest [task_fe07f8be] (a9abe22)
  • trash-ui: add Storybook stories for TrashView [task_b22c0115] (e81a9d2)
  • trash-ui: add Trash list, restore, and purge API routes [task_37496a5d] (fa2d8e5)
  • trash-ui: add TrashFolderManifestSchema for trashed-folder manifests [task_07aab304] (6814737)
  • trash-ui: add TrashRefRecordSchema for nullified-reference records [task_d0dcce8d] (59710e4)
  • trash-ui: add TrashView container with nested folder display [task_d1fadcdf] (0257f18)
  • trash-ui: move revisions into/out of .trash/ at delete and restore time [task_d1270a92] (a2e6fc0)
  • trash-ui: per-project Trash with folder cascade, restore and purge (Feature 26) (2f180cd)
  • trash-ui: persist and restore the FR-8 nullified-reference record [task_e0f28b8c] (5337f57)
  • trash-ui: remove soft-deleted resource from index/backlinks/mentions immediately [task_818a7f4e] (d444195)
  • trash-ui: rewrite restoreResource with root fallback, collision suffix, re-linking [task_7c4c3601] (5c15946)
  • trash-ui: wire ungated Trash tab into ViewSwitcher and AppShell [task_b6038f71] (910fba1)
  • trash: add native-trash-backend failure taxonomy [task_993464ff] (0816ae3)
  • trash: extract transport-agnostic trash-core.ts (522267b)
  • trash: implement native trash transport over trash-core [task_9fa4bf05] (17ad768)
  • trash: implement the native trash transport (Feature 49, step 2 of 2) (3535359)
  • trash: rewire HTTP routes onto trash-core.ts (002808f)

Bug Fixes

  • a11y: clear three structural axe findings [task_e9eb6421] (f02a211)
  • a11y: drop the hex arithmetic from the SchemaManager comment (776667c)
  • a11y: drop the opacity compositing behind 11 contrast findings [task_ba93b76e] (a8df784)
  • a11y: put the five settings panels in sections to leave one banner [task_e9eb6421] (cb62376)
  • api: accept the locked-project entry shape in projects.list [task_f4f99d90] (96b4bff)
  • api: rethrow locked-access errors from 13 further swallowing routes [task_bcfcaad1] (465c859)
  • api: rethrow locked-access errors from nine swallowing routes [task_f4a976c3] (b85c72d)
  • backlinks: descend extractSidecarRefIds into sidecar.userMetadata [task_08553ca3] (a6a8d1f)
  • cli: refuse to run against an encrypted project (32c0a08)
  • cli: refuse to run against an encrypted project [task_72a3f87e] (10e4833)
  • cli: stop doctor crashing on an encrypted project (9c5bd12)
  • cli: stop doctor crashing on an encrypted project [task_cb439f48] (aa23e71)
  • compile: deliver compiled files on Android via the filesystem [task_344ee3b6] (acd0adc)
  • compile: route the Start Page download through the same seam [task_344ee3b6] (a0ef27b)
  • crypto: fail closed on locked-project access (Feature 54) (8bf48d3)
  • crypto: gate the encryption panel off the native runtime [task_6d770169] (f67eb6e)
  • deliver compiled files on Android via the filesystem (92f7df4)
  • docx: distinguish no-heading and preamble resource naming [task_f3477a8b] (5a38155)
  • docx: silence the sidecar-not-found warning on new-resource writes [task_c6732be6] (5c4216d)
  • e2e: green the Playwright suite and run it in CI (334a76f)
  • e2e: update story mocks and specs to the current API contracts [task_05a6dc36] (8c57103)
  • editor: keep a document load out of the undo stack [task_4c9ebc93] (0094625)
  • editor: stop flattening documents whose revision payload is plain text [task_c04e8efc] (7dcaaf2)
  • editor: stop setParagraphLeading flattening headings [task_05a6dc36] (e791cb8)
  • electron: fix Scrivener import Open Project + keep source paths out of import outcomes [task_babc419d] (d3ed02d)
  • electron: let the macOS picker select .scriv packages [task_25d8ff8c] (6d5b239)
  • electron: strip .scriv from the Scrivener import default project name [task_25d8ff8c] (08cd8c9)
  • entity-graph-drag: make node dragging work on touch [task_f67e0c8b] (676da04)
  • entity-graph: anchor wheel zoom on the pointer rather than the canvas origin [task_129bcb39] (11c5e4a)
  • entity-graph: hide the accessible list visually, keep it exposed [task_966869fc] (861b027)
  • entity-graph: hide the graph's accessible list visually, keep it exposed (e063449)
  • entity-graph: place the edge tooltip clear of the hovered edge's nodes (c0e85c6)
  • entity-graph: place the edge tooltip clear of the hovered edge's nodes [task_feb7b230] (e169a9b)
  • entity-highlighting: disclose both needs-attention conditions in title text [task_4b2ec55f] (3598ada)
  • entity-layer: stop the alias warning firing on an empty draft field [task_ddb55116] (90333d6)
  • entity-roster: count mentions and documents as separate numbers [task_d22a3278] (b531f55)
  • entity-roster: render the roster with no resource selected [task_facfacac] (6a5fb38)
  • entity-scoped-compile: pass folders to the tree-ordering walk [task_79e35996] (feb203b)
  • knip: resolve @gw/core alias for electron worker to avoid false unused-export findings [task_da125a98] (dd885d2)
  • land the stranded entity-scoped compile work on main (4fcd1fa)
  • mentions: rethrow locked-access errors from loadMentionIndex [task_faf475a5] (c943c83)
  • models,search: fail closed on locked project-root lookups [task_49f795f7] (a06c1e8)
  • models,search: make the locked-access check scan-local in project lookups [task_764ffbac] (2d1c5bd)
  • models: propagate locked-access failures from entity rescan [task_1b70366d] (2b66743)
  • models: rethrow locked-access errors from loadIndex instead of degrading [task_7fd75c36] (9750fd3)
  • models: rethrow locked-access errors from sidecar pre-write reads [task_e494e661] (c76f8a5)
  • models: rethrow locked-access errors in backlinks.ts catch blocks [task_84da2d73] (20bb533)
  • previews: rethrow locked-access errors instead of degrading to null [task_8e64b338] (f280f94)
  • remove-entity: fix trigger/checkbox accessible names and drop red styling [task_93c98567] (3d34857)
  • remove-entity: reset dialog state on success and key control by resource [task_faeac9d5] (0555daa)
  • remove-entity: restructure withoutEntityFields to drop unused-binding lint warnings [task_22238e0d] (25987c9)
  • resources-api: stop fabricating updatedAt on malformed patch response (c74aea5)
  • resources: stop a seeded template resource opening blank (38c9d94)
  • resources: stop a seeded template resource opening blank [task_e40b5d7e] (e0c9c96)
  • revisions: preserve content an autosave would destroy [task_4c9ebc93] (4c774e5)
  • roster counted documents but said mentions (cbacc23)
  • scrivener: decode 'XX hex escapes via ansicpg code page [task_ce03b6b4] (79677ec)
  • scrivener: read real .scrivx element shapes, recover from fragment errors [task_0ac3e8a3] (d4dc904)
  • scrivener: rebuild fixture to measured real-project XML shapes [task_49aed81c] (a7ab219)
  • scrivener: refuse a non-empty destination up front, clean up a run-created destination on fatal error [task_107b0536] (59846af)
  • scrivener: resolve built-in field-key clashes with a deterministic suffix, never abort on a field-schema failure [task_30b653a1] (a71be65)
  • scrivener: silently ignore \deftab/\pardeftab [task_7ec9e89a] (1da7a94)
  • scrivener: treat backslash-newline as a paragraph break [task_2bf3e928] (0306e44)
  • scrivener: untitled fallback naming and Option/Date/Status resolution [task_f212cf59] (f59c080)
  • scrivener: wire recoverable skips into report; RTF text-fidelity fixes [task_986df71a] (2b3f51d)
  • scrivener: write canonical revision as serialized TipTap JSON [task_12a1b0a4] (3f55816)
  • sidecar: write sidecars atomically so unlocked readers never see a partial file (cc70f0b)
  • sidecar: write sidecars atomically so unlocked readers never see a partial file [task_333b73a0] (600094f)
  • start: detect the desktop bridge after mount to avoid a hydration mismatch [task_bde05f95] (580aceb)
  • stop an undo overshoot destroying a writer's only copy (9fff589)
  • stories: give EditView an explicit spy so the story renders (9982bac)
  • stories: give EditView an explicit spy so the story renders [task_05a6dc36] (124f32a)
  • storybook: alias node builtins so the preview builds [task_417d4451] (12fdfaf)
  • storybook: alias node builtins so the preview builds, unblocking the e2e suite (f93cb65)
  • styles: move repoint comments above their declarations for check:no-hex (294ca37)
  • styles: remove the undefined --color-gw-mid reference [task_714dc8cd] (9723e28)
  • tiptap-utils: rethrow locked-access errors from loadResourceContent [task_7eedaa68] (f778848)
  • trash-ui: cascade-remove a folder's descendants from resourcesSlice [task_bdadf61f] (f5176de)
  • trash-ui: full gate verification pass — update stale End-key tab test [task_9c7d5090] (373a65a)
  • trash-ui: guard TrashView post-restore refetch against a malformed body [task_a71529a2] (adb0a0f)
  • trash-ui: refetch resource tree after restore [task_9def38a3] (1afae08)
  • trash-ui: remove invalid ARIA roles from TrashView list markup [task_b22c0115] (3611337)
  • trash-ui: resolve nested descendant names in trashed folder listing [task_a8d83811] (cf708b5)
  • trash-ui: satisfy naming-convention lint rule in resources.ts [task_b22c0115] (c68eacc)
  • trash-ui: satisfy naming-convention lint rule in trash-purge-primitives test [task_d5f5a15b] (d31dab0)
  • trash-ui: style TrashView with shared UI primitives [task_766eeda1] (e86aff9)
  • trash-ui: Trash follow-ups FU-1, FU-2, FU-3, FU-8 (close FU-4, FU-6) (9d33f29)
  • trash-ui: write ref record on delete, clear it on restore [task_e5301a72] (51485b5)
  • trash: refresh the resource tree after a restore [task_33a403cb] (0566ae3)
  • trash: rethrow locked-access errors from trash catch sites [task_8ed992c4] (6341ac0)

Performance Improvements

  • test: derive with a cheap Argon2 profile in tests [task_adaf1b34] (c02a037)
  • test: split vitest environments and stop deriving keys at production cost (c33b64c)
  • test: split vitest into node and jsdom projects [task_1db80a21] (0287be7)