# Changelog All notable changes to Crewship are documented in this file. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Pre-1.0 releases may introduce breaking changes in minor versions (`0.x.0`); patch releases (`0.x.y`) are backwards-compatible fixes. ## [Unreleased] - **Routine run logs show when a step waits for an occupied agent (#5290).** The journal records when waiting begins and whether the agent becomes available, the wait times out, or the run is cancelled. The outcome includes elapsed wait time. - ⚠️ **Behaviour change: routine budgets include costs reported by every agent attempt.** Reported costs from empty responses, failed attempts, and attempts preceding cancellation during backoff now count toward the run total. A routine close to its configured cost cap can stop earlier. - ⚠️ **Behaviour change: Claude Code routine attempts use a 20-turn limit.** The routine runner now passes the existing unattended-run limit to Claude Code. Other CLI adapters use the execution timeout. - **Routine validation rejects unsupported step controls.** Definitions with `permissions` or `max_turns` on a step now identify the offending field during validation. - **Dependency updates keep the frontend, document editor and Go runtime libraries current (#5280).** Integrates the pending Dependabot updates and refreshes version-scoped license notices for packages that ship no license text. ⚠️ **Behaviour change:** authentication now explicitly requires compact JWE tokens, matching the tokens Crewship issues; JSON-serialized JWE messages are rejected. - **The CLI says when a profile overrides an exported `CREWSHIP_SERVER` (#5245).** Run outside a directory bound to a profile, a command went to the `server use` default instead of the exported server, and that server's answers looked like faults of the intended one (on crewship-dev, an intermittent `503 Docs are not enabled on this server` from a slot without Docs). The precedence is unchanged; the CLI now prints one warning line on stderr naming the profile and the server it dials. An explicit `--profile` or `CREWSHIP_PROFILE` prints nothing. - **Canvas cards name mentioned people as the Page does (#5197).** A card resolves a mention through the same reader-scoped people lookup as the Page editor, so it shows a name only for someone who can read the document, and only to its readers; anyone else stays **@Unknown member**. The Canvas no longer uses the workspace member list. - **Docs presence is one entry per person (#5166).** A person with several tabs on a document is now one peer with a `tabs` count and the caret of the tab that moved last, instead of one caret per tab. A tab also no longer answers a selection update that did not move its caret with an extra heartbeat, and no longer redraws the other people's carets when a reply did not change, so it stays at one heartbeat a second while idle. - **Docs presence is one entry per person (#5166).** A person with several tabs on a document is now one peer with a `tabs` count and the caret of the tab that moved last, instead of one caret per tab; a tab without a caret (such as `crewship doc presence`) never hides a tab that has one. A tab also no longer answers a selection update that did not move its caret with an extra heartbeat, so it stays at one heartbeat a second while idle. - **The Design Library shows themes instead of `-dark` swatches (#5145, behind `NEXT_PUBLIC_ARTIFACT_DESIGN_SYSTEM`).** `design-system.json` schema 2 adds `themes`, per-theme colour values with a usage note, `{name}` aliases and type groups; schema 1 files are read unchanged and a newer schema is named instead of shown in part. The Library has a theme switch for swatches and component previews, the WCAG contrast of each swatch, usage notes, grouped text styles and a note when the system carries no font files. The Template Crewship Design System mirror now uses its two real themes. - **A full storage quota no longer blocks saving a Word or Sheet document for the rest of the session (#5124).** After a refused save the editor keeps the changes and says they are not yet saved on the server; **Uložit znovu** in the alert or Ctrl+S sends them again, and once space is freed they are saved as a new version. Autosave still never retries a quota refusal by itself, and no version is deleted. The status line now tells 95 % (*historie je téměř plná*) and a full history apart from 80 %. - **Releasing a saved Word or Sheet document no longer shows an unsaved draft (#5089).** A final capture with the exact bytes of the last confirmed save now counts as that version, so the status stays honest, the leave guard releases and no copy waits in the browser to be offered later. - **Deleting an agent stops its runs whose container is already gone (#5050).** A protected host run in a removed container stayed pending and held on to its work; it now counts as stopped. Any other inspect failure still reports an error. - ⚠️ **Behaviour change: only OWNER or ADMIN can change the governance model credential (#5024).** PATCH, rotate, escalation answers, OAuth completion and internal token writes refuse a bound credential for narrower roles, and `credential.rotate` no longer reaches it. Binding now needs an active credential. - **A delayed sign-out no longer removes unsent chat proposals (#5026).** If a tab learns of a sign-out after its person signed back in, it now keeps their chat recovery. A real sign-out still removes it, even when saving drafts fails. - ⚠️ **Behaviour change: invalid native version reads now return exit code 2 instead of 1 (#4930).** `crewship craft version` classifies non-positive, non-canonical and overflowing version numbers as validation errors before authentication or any HTTP request. Scripts must now expect process exit 2 and `error.exit_code: 2` in machine-readable errors. Negative positional versions are passed after `--` so they reach version validation. - **A Design comment sent to an agent no longer produces a duplicate version (#4527).** The task prompts from the Design editor, `crewship page design comment --send-to-agent --wait` and the chat bridge told the agent to call `design_snapshot` after `design_apply`. A successful `design_apply` already saves the version and answers the comment, so the agent saved the same canvas twice. The prompts now say not to snapshot afterwards, matching the `crewship-design` skill, and the PRD acceptance test requires exactly one agent version and no `design_snapshot` call. - **A failed release or handoff in Word and Sheet can be tried again (#5028).** A network error during the transfer used to leave the other person blocked until the holder closed the tab. - **Accepting an agent proposal in Word no longer goes stale when nothing was edited (#4699).** Word rewrites a document into its normalized form when it opens it, so the save before accepting, handing over or releasing the editor wrote that rewrite as a new version and every proposal over the opened version became stale. The native editor host now passes the engine's revision state right after bootstrap (`loaded.mountedState`). The save coordinator treats an export as the loaded version only when no edit was reported and the engine's own revision is still the bootstrapped one, so a change whose `changed` event arrives late is still saved. Nothing is sent and the action continues on the loaded version, and an untouched final capture no longer leaves a local draft to offer on the next open. Edits and a native Ctrl+S still save. Sheet, whose engine reports no revision state, and hosts that do not pass the state keep the earlier behaviour. - **A tab whose draft save failed during a sign-out keeps following later sign-outs (#4714).** The sign-out and expiry listeners used a sticky flag, reset by hand on each path where the tab stays. After a failed draft drain followed by a refresh from a still-mounted component, the flag stayed set and every later sign-out or expiry was ignored, so a shared browser kept the previous person's editors open. The listeners now compare against the refresh generation: any newer refresh or settle re-arms them. A sign-out superseded by a refresh during its drain, and an expiry during a re-settle (exactly one navigation), are now covered by tests. - **Design canvases can be played as prototypes (#4449, default off).** With `NEXT_PUBLIC_ARTIFACTS_DESIGN_PROTOTYPE=true` (on top of `NEXT_PUBLIC_ARTIFACTS_DESIGN`), an editor links a layer to a screen in **Properties → Link to screen**, and anyone who can open the Design clicks **Play** to move between linked screens with mouse or keyboard, **Back** and **Esc**. Playback is local and never changes the canvas; a link to a deleted screen stays inert with a hint. The link is the optional node field `linkTo`, set through the existing live sync, `page design apply` and agent `design_apply`; no new endpoint or migration. The server now accepts `linkTo` (string, at most 128 characters), so deploy the server before enabling the UI variable. - **A tab that stayed signed in after a sign-out elsewhere still follows later sign-outs (#4705).** When a delayed sign-out message from another tab found the session still live, the tab stayed but then ignored every later sign-out and session expiry, keeping the person's editors open on a shared browser until its next refresh. It now keeps listening. - **Text typed before the session check answers is no longer wiped (#4706).** Since #4628 every session check that changed the local draft identity remounted the whole app, including the first one after a page load and signing in from a signed-out page, so a Share ID on `/shared-chat`, sign-up fields or the bootstrap step entered meanwhile disappeared. The app now remounts only when it leaves a signed-in person (another person, or signed out), which still retires that person's local draft writers; refreshing the same person never remounts. - **Normal CLI chat turns can write their enabled memory again.** Each host-authorized turn now owns a fenced work-ledger attempt before execution, using the existing serial capacity limits and rechecking the original human authority at process creation. Ended or stale turns still cannot write; an unknown execution outcome keeps custody until protected exit evidence is recovered (#2762). - **Memory audit keeps running when a directory cannot be watched (#4568).** A per-directory watch failure (an unreadable directory, or an exhausted `fs.inotify.max_user_watches`) is logged and skipped instead of disabling memory audit until restart, and if the file watcher cannot start the audit continues on polling alone. The audit watcher now applies its documented 30 s poll fallback, which production previously left off, so `memory_versions` and `memory.updated` keep recording writes. - **Truncated multibyte text stays valid UTF-8 (#4566).** Hook messages and output, HTTP hook errors, the backup flush-hook detail and TUI dashboard cells no longer cut a character in half (shown as U+FFFD and rejected by strict JSON consumers); dashboard cells now count characters rather than bytes. - **Native Craft agent tasks now respect the workspace agent artifact policy (#4681).** The policy is the ceiling for agent work on artifacts and already gated Projects, Design, Documents and Mooring, but `crewship craft task start` admitted a Word or Sheet task for an agent whose crew was not listed, or under a disabled policy, once the owner gave whole-document consent. Task admission now refuses it (`403`, nothing queued), and every agent write rechecks the policy (a policy change already retired running tasks through the authority generation; the explicit check keeps that independent of the trigger). - **Accepting a Craft proposal no longer goes stale when a concurrent save repeated the same bytes, and the proposals migration now moves the schema version (#4669).** A save that landed between choosing the acceptance base and publishing, with content identical to the base, used to retire the proposal permanently; acceptance now re-reads the head, retries on it when the content is unchanged and goes stale only when the content really changed. A no-op migration `20261031100000_craft_native_proposals_frontier` is added because `craft_native_proposals` (20261029165715) was numbered below the previous newest migration, so a rollback to the old binary passed the version-skew guard and its backup left out the table. The applied migration is untouched and databases keep all data. - **Craft access rechecks and native agent edits: four backend fixes (#4670).** The `page.access_recheck` fan-out is now registered as background work, bounded to four running plus 64 waiting fan-outs (further ones are dropped; the 30 s poll covers them) and gives up after 5 s against a hub that stopped draining. A native agent `apply`/`propose` refused at storage admission (`ErrStorageBusy`/quota) no longer burns its request ID, so the same retry runs the engine instead of failing with 422. The lease-renewal goroutine no longer shares its context variable with the request goroutine (data race). Legacy document, Slides and restore writes remain bounded by the SQL storage triggers; the free-disk probe is not on those paths (follow-up). - **Artifacts docs and agent skills corrected after the #4527 review (#4527).** The `crewship-design` skill (1.0.1) now says that the workspace artifact policy must be enabled and list the agent's crew; the `crewship-craft` skill (1.0.1) states the 32 KiB cell-input limit and that a corrected edit needs a new `request_id`. The embedded `crewship ai` skill notes that Design `restore` takes no `--base-version`. The guides now state that creating an artifact at the page cap answers `422` `pages_limit` (not `413`), that a never-written Dashboard collection is not listed, that "Design capacity is full" also covers a used-up storage budget, and give the Design policy prerequisite, plus smaller corrections to the library, Project, Slides and Docs pages. - **The page cap is now a setting, and Design / artifact project create at the cap give the real reason (#4664).** Instance administrators read and set the maximum pages per workspace (default 100, range 10-10000; `GET`/`PUT /api/v1/admin/instance/page-limit`, CLI `crewship admin instance page-limit get|set`, audited as `instance.page_limit_set`); lowering it never deletes pages. Every create path now uses one check, and creating a Design or an artifact project at the cap answers `422` `pages_limit` with the limit stated, instead of `413` "Design capacity is full" or `artifact_history_quota`; the new-artifact dialog, the artifact client and the agent artifact tool pass that message on. Mooring, agent Documents and GridCraft create at the cap also answer `422` `pages_limit` (previously `409`). Test items still count toward the cap (follow-up). - **A retained agent run whose ownership cannot be verified no longer stays RUNNING forever (#4700).** When the controller recovers a run's retained output after a restart and finds its recorded workspace or agent conflicting with the trace's journal start or terminal entries, disagreeing with the agent, missing, or differing from its work attempt, it still projects nothing, but once the execution has verifiably ended it settles the run state to `error` with the reason (`unprojected`) and stops retrying, so the `retained output pending projection` warning no longer repeats every 30 s. For a journal conflict the run's own row in `GET /api/v1/agents/{id}/runs` ends as `FAILED` with "retained run output withheld: its trace has conflicting journal ownership", written only under the workspace and agent that the run state, the agent and the run's own `run.started` all agree on, with no output or exit code; rows of the conflicting owner and work attempts are never written. A run whose own recorded ownership disagrees with its agent, is missing, or differs from its work attempt settles its run state only, and its retained output stays on disk. - **Craft hands over and releases an unchanged native editor again (#4693).** Taking the Word or Sheet editor and then choosing "Předat uživateli …" or "Uvolnit úpravy" without editing was refused with "Výsledek akce nebyl potvrzen" since unchanged content stopped being saved as a new version (#4657, #4661). The editor now transfers custody when its final capture equals the confirmed server version; edited content is still saved and acknowledged first. - **Craft no longer saves unchanged content as a new version when a freshly opened editor is released (#4661).** The save coordinator now seeds its confirmed baseline from the loaded server snapshot (version and SHA-256 of the loaded bytes), so after an outage, reload or reopening a release flush or autosave of identical bytes creates no version, in Word and Sheet. A restored local draft, normalized content or any edit hashes differently and is still saved; an explicit Ctrl+S ticket always transmits. - **Nullable API fields no longer publish unsupported null types in OpenAPI 3.0.** Artifact and Design origins and Page folders retain null values and their existing object constraints using OpenAPI 3.0 nullable alternatives. Arbitrary JSON payload and preference arrays also retain nested null values. - **Craft no longer saves byte-identical content as a new version on editor release or after a reconciled lost acknowledgement (#4657).** The single-editor save coordinator now records the confirmed baseline for every application (Sheet included, not only Word) and skips the upload of an autosave or a release/transfer flush whose bytes, native state and base version match it. Native Ctrl+S still saves. Versions and quota are no longer spent on a duplicate. - **Artifact storage budget: configurable limits, counter recompute and a clear refusal in the collaborative editors (#4648).** Instance administrators read and set the workspace limit (default 32 GiB) and instance limit (default 64 GiB) with `crewship admin instance artifact-storage get|set` (`GET`/`PUT /api/v1/admin/instance/artifact-storage`); defaults are unchanged until set, lowering a limit never deletes data, and each change is audited. `crewship admin instance artifact-storage recompute [--dry-run]` (`POST /api/v1/admin/instance/artifact-storage/recompute`) rebuilds the usage counters from the stored artifacts in one transaction and reports the drift per workspace; it is idempotent and writes only the derived counters. A Mooring command write that hits the budget now answers `413` `artifact_storage_quota` instead of "command not confirmed", and a WordCraft collaboration socket is closed with code 4009 before the session ends. Both editors show "Kapacita úložiště neumožňuje další uložení" and keep the unsaved work in the browser. - **Craft preview rechecks no longer slow grant changes and also follow membership changes (follow-up to #4652).** The `page.access_recheck` signals are sent after the commit from a bounded background goroutine, in batches, and skip suspended and restricted accounts. Removing a workspace member or changing their role sends that member alone an empty `page.access_recheck`, which makes open shared previews re-read at once. - **A revoked Craft shared preview removes its content within seconds, not up to 30 s (#4652).** When a Read or Comment grant on a Word or Sheet page is removed, the server sends the affected person alone a `page.access_recheck` signal with the page id only (on their own `user:{id}` channel; no content, no other users). The open shared preview repeats its authorised read at once and shows "Sdílený náhled není dostupný" on 403/404. The 30 s poll and the focus/online rereads remain as the fallback, and the PRD row `A.craft.read-revoked` now expects removal within about 5 s. - **Craft names the editor address when the page is opened on another origin (#4649).** If the browser blocks the editor frame because the page is not on the configured editor origin (`CREWSHIP_PAGE_STUDIO_ORIGIN`), the editor now says at once "Editor je dostupný jen na adrese . Otevřete stránku tam." with a link, instead of waiting 20 seconds for a generic connection error. The local draft is kept, and the Content-Security-Policy is unchanged. - **Seven review findings in the CLI, the orchestrator and the PRD harness are fixed (#4667).** `crewship page enable|disable` now serialise on a lock file next to the compiler image record, and `disable` re-reads the record after its confirmation, so an enable that finishes meanwhile is no longer dropped; the record writer refuses to write more than the 64 KiB the server reads (it used to turn Pages Apps off for every version). A legacy run whose container is removed while its stop confirmation is pending now releases admission, capacity, HOME and credential holds. `chat room messages --follow` subscribes before its first read (and before each catch-up), so a message committed in between is printed. `page artifact reconcile` no longer reports "save not applied" for a 404 on a version an Edit user cannot read; it says the outcome is unknown unless the latest version is not newer than the base. Artifact and Design comment lists return the newest 500 comments (oldest first), so `--wait` finds a comment created beyond 500. The PRD acceptance session files are namespaced by origin, output directory and account, so concurrent runs no longer share an identity. - **Routine saves honor machine output formats.** `routine save --format json|yaml|ndjson` returns the saved routine identity and trigger metadata without progress text; the human receipt stays unchanged (#4621). - **Chat no longer offers Project creation to an agent whose crew the workspace policy excludes.** The composer asks `GET /api/v1/pages/artifacts/availability?agent_id=...` (CLI: `crewship page artifact availability --agent `), which now returns `can_create` and, when refused, `code` `artifact_crew_not_allowed`. If a send is refused anyway, the chat shows "This agent's crew is not allowed to create artifact projects in this workspace", keeps the typed message and starts no run, instead of "failed to save message". - **Agent peer-card errors no longer expose server internals.** When reading or deleting an agent's peer cards fails inside the server, the API now answers `Internal server error` and logs the cause, instead of returning database driver text or a host file path. - **Artifact MCP tools advertise the inputs they accept.** Tool descriptions now name the Slides/data flag dependencies and explain mandate, version conflict and quota behavior; version schemas require the positive values already enforced by the host. - ⚠️ **Behaviour change: workspace webhook destinations are visible only to channel administrators.** Channel lists omit a workspace webhook URL for roles below ADMIN/OWNER while retaining its metadata and personal destinations owned by the caller. Delivery configuration and signing secrets are unchanged. - **New artifact can create a blank Sheet.** When the server advertises `gridcraft_native` (see `crewship doc status`), **Sheet** is offered in the Artifacts New artifact dialog and opens the native GridCraft editor; without the profile it stays listed under Coming. It reuses the existing page and craft initialize endpoints, so no new API or CLI command (#4635). - **A skipped schedule no longer blames a routine disabled afterwards.** When a schedule's last fire was skipped with nothing counted as missed, the Triggers tab now always shows "skipped: previous run busy or routine inactive". Before, a routine that skipped a tick because its previous run was still going and was disabled later showed "skipped: routine inactive", reading today's state into a past fire. - **`crewship page enable` installs the Page compiler on a server whose page project storage is already configured (part 1 of #3108).** Prerequisite: `CREWSHIP_PAGE_PROJECTS_PATH` (or `storage.page_projects_path`) is set and the server was started with it; `page enable` does not configure storage and refuses to run without it. A default storage location and enabling Pages Apps on a fresh install without configuration or restart are not part of this release (#3108 stays open). `crewship page enable` builds the Page compiler image from the binary itself (no source checkout), tags it `crewship-pages-build:`, labels it with a fingerprint of its whole build context (Dockerfile and base image digest included) and records its exact image ID in `/pages-build-image.json` (mode 0600); run it on the Docker host as the server's account, with the server's configuration. The server uses only the recorded image, and only while it keeps that ID, tag and label — never an image found by its label alone, since crew images built `FROM` a labelled base inherit it — for Pages and Artifacts Project builds alike, within seconds and without a restart once storage is configured; a missing or non-verifying record fails closed. `crewship page disable` removes this version from the record and then its image (`--all`: every recorded version), deleting only images that still verify. `CREWSHIP_PAGE_BUILD_IMAGE` stays an optional override that wins when set; Docker Compose deployments and air-gapped hosts use it with `crewship page enable --image-only`. A local installation with Studio on `http://localhost:` no longer needs `CREWSHIP_PAGE_RUNTIME_ORIGIN`: the server derives `http://127.0.0.1:`, a separate browser site, used only for browsers that reach the server directly on a loopback host — not through a proxy (`Forwarded`, `X-Forwarded-*` or `X-Real-IP`) — and never for the same-host editor. After upgrading the binary, run `crewship page enable` again; older images stay recorded for rollback. ⚠️ **Behaviour change:** while Pages Apps are not enabled, `GET /api/v1/pages/{slug}/project/preview` for a Page without a draft answers 503 `page_apps_not_enabled` instead of 404, and the Page build, check, publish and application 503s now carry `code` `page_apps_not_enabled` or `page_runtime_origin_missing`. See [Operate Pages applications](docs/guides/pages-apps-operations.mdx). - **Craft reconnects an interrupted metadata stream.** Recovery checks current authority for the same admission, allows exponential backoff while an old server stream is still held after transport loss, and stops after bounded retries; saves and custody changes are never replayed. - **Artifact API reference explains version and access rules.** OpenAPI summaries and descriptions now document artifact manifests, comments, Design and native Craft tasks, including conflict, quota and visibility behavior; routes and schemas are unchanged. - **Native Word and Sheet proposals have a separate retained storage allowance.** Every retained candidate counts toward a 64 MiB default budget, including rejected and superseded proposals. Concurrent proposals cannot exceed it, and filling it leaves the human’s available history allowance intact. Reads and saves no longer scan proposal payloads. A refusal preserves existing work and history. - **Native Word and Sheet proposals survive backup and fork restore.** A fork keeps each candidate on its new document with an identifier the editor and CLI can open; backups preserve the exact candidate bytes and content hash. - **Native agent proposals are idempotent within their authenticated run.** Two runs of the same agent can reuse a request identifier without adopting each other’s proposal. Apply and propose share the run’s change request limit; proposals cannot bypass an unresolved save. Exact retries reuse the recorded candidate without running the engine again, including after the document advances. - **Design keeps work visible when saved history is full.** A clear message replaces the saved status and offers a draft download containing the local canvas and unsent feedback, or an explicit copy of the canvas into a new Design with fresh history. The original editor, unsent feedback and retained versions stay intact. Copy creation checks current source and create permissions atomically and is never automatically replayed. - ⚠️ **Design readers and commenters see only the shared version.** Private saved and live changes are withheld from REST and websocket readers, and comments target the displayed shared snapshot. Workspace administrators read and edit every Design, with foreign access recorded atomically in the audit log and keyed journal, and edits using the existing locks and versions. - Add an original-human and immutable-Page bound key-recovery primitive for private browser drafts, checked against current read authority. Browser retention and sign-out integration remain separate. - **A Word or Sheet save whose reply was lost in a long outage is still confirmed.** Reconciling the exact attempted version no longer needs a live editing lease, so an outage longer than the lease no longer leaves an already saved draft offered for recovery; the expired lease still cannot save. - **The chat's side viewer lies over the chat on a tablet.** With chat artifact projects on, below the large breakpoint an open artifact or saved document covers 78% of the chat from the right instead of squeezing the conversation into a narrow column. Wide screens keep the shared row; phones keep the full-screen viewer. - **Chat starts a project from "+" › New artifact.** With chat artifact projects on, the composer's "+" menu offers Project next to Word. Picking a starter sets the same explicit creation consent as before, and the chosen kind shows as one removable chip ("New Project") in place of the two text buttons, so the toolbar fits on a phone. - **A Page opens with its content inside Artifacts.** Its application or panels show in the library detail with the same views Pages uses, read by the page's immutable ID; the detail no longer sends you to Pages. - **New `crewship` commands for API operations the CLI reached only with another method.** `crew member set-role` (or `--clear`), `agent learning`, `agent files --container`, `persona suggest`, `checkpoint get`, `notifychannel update` and `nuke keeper-requests`; `workspace member capabilities list` without a user id lists every member in one request, and `workflow get` reads a template by id before falling back to a name lookup. `GET /api/v1/workflow-templates` now creates the built-in templates on a fresh workspace, as `/api/v1/templates` already did, so `crewship workflow list` is no longer empty there. Built-in workflow templates are now read-only through `/api/v1/workflow-templates` too (`403` on update or delete, as on `/api/v1/templates`), since listing would otherwise recreate a deleted one and duplicate a renamed one. The `docs-inventory -strict` CLI-parity gate now compares HTTP method and path rather than path alone, and calls made only by `crewship seed` no longer count as coverage (#4510). - **Every artifact in the Artifacts library has its own address.** Opening one goes to `/artifacts/` (its immutable page ID), so Back returns to the list it was opened from, and a reload or a shared link opens it again. Links from before, `/artifacts?item=`, open by slug and move to the new address; an ID address never falls back to a slug another artifact may hold now. - **Home's Artifacts card opens Artifacts.** With the Artifacts library on, *All artifacts* goes to `/artifacts` and each recent item to its own `/artifacts/` address instead of Pages. Without the flag nothing changes. - **Design System artifacts get an opt-in token preview.** An artifact project with a `design-system.json` file (colors, typography, spacing, radii and an optional component list) opens as a read-only sheet of swatches, type scale, spacing and radii when the web UI is built with `NEXT_PUBLIC_ARTIFACT_DESIGN_SYSTEM=true`. Agents and the CLI create and version it through the existing `page artifact create/publish/restore` commands; no new endpoint or storage. Default off. - **Recovered HTTP panic reports identify the route without request details.** Crash reports and local panic logs use the registered route pattern and panic type; unmatched requests use a fixed label. - ⚠️ **Behaviour change: notification channel URLs are checked more strictly.** The delivery library (shoutrrr 0.22.1) rejects a channel URL that could never send when a channel is created from the provider form or tested, and at send time for raw URLs: Gotify needs a real application token (15 characters starting with `A`, or a Gotify 3 `gtfya.` token), Google Chat needs both `key` and `token`, Mattermost needs a host, and ntfy topics follow ntfy's naming rule. Saved channels are never checked at startup or when listed; a Google Chat channel saved without `key` or `token` now reports a delivery error. SQLite driver updated to modernc.org/sqlite 1.61.0. - **Artifact history warns before it is full and previews a retention rule.** Artifact and native document reads now return `quota.level` (`none`, `near` from 80%, `critical` from 95%, `full` at the limit) next to the existing `warning`. The owner snapshot, also printed by `crewship page artifact versions`, adds `retention_preview`: a dry run of "keep every version from the last 14 days, then the newest per day, plus latest, shared, named and restored versions" listing what it would thin. Nothing is deleted; retention stays keep-all. A `QuotaBanner` component for the Artifacts library is included but not yet wired. - **Agents prepare a proposal when a person is editing a Word or Sheet document.** Instead of a bare refusal, the agent's `craft_propose` records a complete candidate over the version it read; the document stays unchanged. The person holding the editor can compare it, accept it as their own save (rights, lease and current version are re-checked in one transaction; a proposal over an older version becomes stale) or reject it. Any co-editor with write rights can reject without holding the editor. Open proposals over a version the document has moved past are marked stale when the agent proposes again, so they no longer count toward the limit of 16 open proposals per document. Also available as `crewship craft connect` actions. The agent's task then succeeds with outcome `proposal` and the proposal id (shown by `crewship craft task status`) instead of failing without a receipt; only a proposal recorded by that run counts. - **An agent runtime is no longer held busy by another crew's interrupted run.** A run recovered without a container but recorded for a different crew no longer blocks refreshing this crew's runtime; a run with an unknown crew still blocks it (#4486). - **A Read-only Design viewer can no longer stall every database write or lock an editor out.** Answering a Design websocket sync request no longer runs the Yjs engine while holding the server-wide writer lock, and a flood of sync requests closes the socket (4429). An update the engine refuses now closes with 4400 "Design update rejected" instead of 1008 "permissions changed", which sent the browser into an endless re-admission loop; 1008 is used only for changed authority. Another person claiming an editor's presence ID is ignored instead of closing the editor, and the same person reconnecting replaces their stale connection. - **`crewship feature-flag` help explains roles, outputs and the Artifacts flags.** Every subcommand now has a description and an example; the help lists the Artifacts workspace flags with their defaults, dependencies and the web build switches their screens need, says that creating, updating and deleting a flag needs an instance administrator, and notes that `update`, `delete`, `enable`, `disable` and `inherit` print only a confirmation line (`create` honours `-f json`). Command behaviour is unchanged. - **Deleting a workspace closes its public Page links.** Deletion revokes the links in the same transaction, and public reads also refuse previously deleted workspaces. - **A preference no longer carries over to the next account signed in to the same browser.** The browser's copy of each preference (recently opened artifacts, favorites, panel sizes) now belongs to one signed-in user, so the next account no longer sees the previous account's values on first paint or uploads them, private artifact slugs included, into its own preferences. Nothing is read from the browser until the session is known, the older shared copy is dropped, and a change not yet saved for one account is sent only when that account signs in again. - **Chat opens saved items in Artifacts.** With the Artifacts library on, the chat viewer has *Open in Artifacts*, and saved-document cards, the document access panel and page provenance link to the item's own `/artifacts/` address instead of Pages. Without the library flag the links stay as they were. - **Pages can hand its overview to the Artifacts library.** With `NEXT_PUBLIC_PAGES_OPEN_ARTIFACTS` and the library flag both on, `/pages` opens `/artifacts` in the same workspace. Reference links, restricted members' catalogs and single pages stay on Pages. Off by default. - **The built-in `crewship` agent skill now covers Artifacts.** The guide an agent reads through the CLI explains when to use artifact projects, Design canvases and native Craft documents, which flags and switches each needs, who may write, how to reply to comments and hold the Craft lease, and what to do on a version conflict (409), full storage (413) or an uncertain 503 without retrying blindly. Command behaviour is unchanged. - **Artifacts is the single home for a page and its Word or Sheet.** Behind the same two flags, `/pages/` resolves the page's immutable ID and opens `/artifacts/` in the same workspace for a Page, a native Word or Sheet or a versioned project. Reference links, pinned versions, edit addresses, restricted members and any page whose ID cannot be resolved stay on Pages. A native Word or Sheet is edited inside its Artifacts detail in the single Craft editor with its lease (who edits now, ask for the handoff) when the server confirms the editor is available; otherwise the detail says editing is not available and keeps the saved preview. Off by default. - **Shared artifact commenters can post feedback in the preview.** Comments stay anchored to the shared version without granting editing or agent execution rights; changing accounts, workspace or permissions retires an unfinished selection. - ⚠️ **Behaviour change: a Comment grant can no longer queue agent work on an artifact project.** The Artifacts detail now offers Select and Save comment to Comment-level readers, as `/pages/?artifact=1` already did. `POST /artifact/comments` with `send_to_agent:true` returns `403` and stores nothing unless the author has Edit, matching Design comments. An agent run whose intent names no comment may answer feedback only with a version it published, never with `needs_clarification`, and no run may answer a task another run holds. - **Workspace identity erasure also clears Mooring human attribution.** Collaboration edits keep their exact saved history while losing the erased person's ID; generic Mooring mandates keep their preconditions and revocation state and can no longer authorize that person's agent. Other people and workspaces remain unchanged. - **Project source edits survive a lost save reply and a closed tab.** If the save reply is lost, the editor confirms the exact next version instead of reporting a false conflict, and an unsaved source draft is kept in the browser and offered back until it is saved or discarded. - **Agents gain bundled Design and native Craft playbooks.** They explain scoped mandates, retained Design versions, session-bound leases and confirmed native saves. Design tool descriptions clarify version and conflict handling. - **`crewship slides` and `crewship doc` help describes the real commands.** The generic "Slides " and "Document " texts are replaced with descriptions and examples, the `doc draft` subcommands get a summary, and native decks and documents are no longer presented as living in Pages. Command behaviour is unchanged. - **Private artifact and document drafts survive expired sign-in.** Recovery requires the same identity and a fresh Page-read check. Failed local capture keeps the editor open behind a recovery warning; explicit sign-out asks before removing persistent copies and preserves newer revisions. New local payloads are encrypted; legacy plaintext from other identities is removed before identity admission, and confirmed read revocation removes reachable copies (#4606). - **Artifact and Design drafts are no longer lost or left behind in the browser.** Edit source no longer overwrites a source draft kept after a crash, a successful save keeps edits typed after it was submitted, and a failed browser-storage read no longer deletes the stored comment draft. - **The Artifacts detail no longer sends you to Pages where Pages opens nothing.** Behind `NEXT_PUBLIC_PAGES_OPEN_ARTIFACTS`, a native Word or Sheet whose editor is unavailable shows its saved version without an Edit that opened the same unavailable editor on Pages, and its preview error no longer points to Pages. An old-editor Word keeps Open in Pages only while its saved document can be read, because Pages opens it with the same read. Off by default. - **Test Design canvases can be identified in the library.** Human canvas creation now retains the explicit test-item marker for catalog filtering. - ⚠️ **Behaviour change: `journal priority` and `memory export` honour `--format`.** With `--format json` (or `yaml`/`ndjson`), `crewship journal priority` prints the server's answer as an object with `id`, `priority` and `previous`, and `crewship memory export` writes the bundle as before and then prints `out`, `documents` and `skipped` instead of the prose listing. With the default table or `quiet` output both keep their human-readable line. `memory export` help now states that it requires OWNER or ADMIN. - Add human Comment grants for shared artifact feedback without edit or agent execution rights, explicit QA item markers and catalog filters, and confirmed archive and folder-move previews with live access checks. Access reports include effective capabilities and their sources; existing content, history and grants remain intact. - **`--format json` now prints what the server sent for routines, skills and workspaces, and mutation commands answer in JSON.** `routine list/get` decoded the response into a CLI struct before printing it, so JSON lost the pending draft and its test result, `files` and `manifest`; `routine versions` lost each version's `test_result`; `skill get/list` lost `lifecycle_state`, `needs_credentials`, usage and missing credentials; `workspace get/list` lost `kind`, `personal_owner_id` and `guest_routine_max_run_minutes`. Machine formats retain every server field and preserve the explicit empty routine keys existing scripts received. Deleted-crew IDs remain usable for inbox history, unreadable successful crew-delete responses still produce a JSON receipt, and memory file reads are capped locally at 128 KiB. The human views gain a `Draft:` line and a TESTED column on routines, Lifecycle / Needs credentials / Uses 7d/30d on `skill get`, a LIFECYCLE column and `--lifecycle` filter on `skill list`, and Kind / Personal owner / Guest routine max run on workspaces. `agent stop/delete`, `crew delete`, `routine replay`, `policy set`, `skill archive/restore`, `workspace logo set/remove`, `routine pending cancel` and routine folder/template delete print the server's outcome under `-f json` instead of nothing; human output is unchanged. `admin instance backups overview` reports `crewless_workspaces`. New `crewship memory initialize` (first-write memory provisioning) and `crewship feedback peer-card` (read your own peer card). `feedback preferences` commands accept an agent slug, show the preference VALUE, check `--reason` against catalogue v1 and print JSON receipts. `inbox list --crew` accepts a slug, and `inbox list --deadline today` / `inbox counts` send your local end of day like the web inbox (`--day-end` overrides) (#4508). - **An unsent artifact comment survives a crash.** The chat and library artifact viewer keeps the comment text in this browser for the same person and Page, and offers it again after reopening; the place has to be selected again. - **Artifact comments reach agents as fenced data.** `artifact_comments` and `artifact_versions` now wrap comment text, the quoted element label and every reply in the same nonce-delimited `` block used for issue text, so a reader with only a Comment grant cannot write instructions into the owner's run. Selectors and code file content stay exact for anchoring and republishing. - **Artifact saves are confirmed after an interrupted success response.** The CLI reads the exact successor version without repeating the publish request, preserves definitive refusals, and rejects duplicate-path matches. Craft errors redact session tokens before truncating their display. - **`crewship page artifact comment --send-to-agent` no longer leaves the task stuck at "pending".** The task only starts when the artifact's source chat receives a message carrying its purpose, which the viewer sends and the CLI never did. `--wait` on `page artifact comment` and `page design comment` now sends it, confirms the host saved it and waits for the agent's answer or clarification; `crewship run --chat --artifact-target ` sends the same purpose by hand, including a "Describe it" creation (#4505). - ⚠️ **Behaviour change: a busy agent exits `9`, a full artifact history exits `2`.** A message bounced because the agent already has a live run now exits `9` (was `1`) for `crewship run` and the new `--wait` commands; nothing was sent or stored. A full artifact version history (HTTP 413 `artifact_history_quota`) now exits `2` (was `1`) and says nothing was saved, your `--file` is unchanged and every version is retained (#4505). - **`crewship craft` shows why the server refused.** Refusals printed only `native HTTP 409` and exited `1`. They now carry the server's text with the session token removed, exit with the usual codes (`5` conflict, `2` validation, `7` server, `8` network) and fill the `--format json` error envelope; a lease conflict names who holds the lease, and a proposal refusal says whether it was stale. Agent `task` commands still print status only (#4505). - **`crewship page artifact publish` confirms a save whose reply was lost.** After a transport error, a 5xx or a 409, it reads version base+1 once and reports the save as done when that version holds exactly your manifest; otherwise the original error stands. `crewship page artifact reconcile` does the same check by hand (#4505). - **More Design and Mooring operations from the CLI.** `page design create --test-item`, `page design watch --authority-revision`, `mooring command-session` and `mooring session --reauthorize` (#4505). - **Home-installed agent CLIs remain visible during startup checks.** Offline qualification uses a separate temporary home while preserving read-only executable paths from the immutable image. - **Mooring connect help now explains streaming and refusal conditions.** It documents output formats, the 256 KiB frame limit, agent-token refusal and rejected connections; the Design and Craft task reference covers versions, lease generations and uncertain saves. - **Design artifacts gain an opt-in collaborative canvas.** People and agents can edit frames, shapes, text and images through Yjs, with live presence and normal artifact version history. Agents can address their selected canvas by its immutable ID. Disabled by default. Long-running cookie sessions renew only their collaborative transport after fresh authority checks, retaining unsaved work. Restoring saved canvases preserves prototype-named node IDs and their original contents. - A shared dev release now switches one checked-in build profile (`CREWSHIP_BUILD_PROFILE` in `.env.production`); the flag tests and the phone browser contract verify the main and the release profile, and main must keep the main profile. - **CLI stop confirms the caller’s cancelled run.** Waiting for a stop and signal handling require a private request-correlated completion (`cancel_accepted`, then `cancel_result`); another member’s terminal event, an agent stop or a server shutdown cannot report success. Repeated requests for the same run — on one socket or from several of the same user’s sockets — share its outcome, and the server answers `cancelled:false` with a reason after a 90 s deadline. **Requires a server from this release:** against an older server `chat stop --wait` and a Ctrl-C/SIGTERM-stopped `run` report “run ended; cancellation not confirmed by server (server too old?)” and exit 10 once the run’s `done` arrives, instead of waiting out the timeout. Chat retry selects the caller’s authored turn rather than another member’s latest message; an unattributed legacy turn is retried only in the caller’s own private chat (`GET /api/v1/agents/{id}/chats` now reports `visibility` and `created_by_caller`). - ⚠️ **Behaviour change: `crewship run` stops a run on SIGTERM and only says `[cancelled]` once the server confirms it.** SIGTERM — what `timeout`, CI runners and supervisors send — used to kill the CLI and leave the run going server-side; it now sends the same stop as Ctrl-C. Both print `[stopping…]` and keep reading until the run's own terminal event, then `[cancelled]`; a stop not confirmed within 30 s exits non-zero, and a second signal still exits at once. `--no-stream` runs are stoppable the same way. New `crewship chat stop [--wait]` stops a run you started from another terminal or the browser (#4504). - **`crewship run` and `crewship ask` can send what the web composer sends.** `--attach ` (repeatable) uploads into the chat and names the paths in the message with the composer's exact wording; `--page ` attaches a Page snapshot; `run --chat --ask-form
--var name=value` submits an agent's ask form with the envelope the server re-checks, printing `[form delivered]` or exiting non-zero with the refusal; `run --create-document` sends the composer's "Create document" intent. `run` also prints the run summary (`[summary] $… · tokens · turns`) and delegation, escalation and port-exposure progress (#4504). - **New chat commands for what only the browser could do.** `crewship chat --parts` shows thinking, tool calls and results, and group-chat authors; `chat export -o file.md` writes the Export dialog's Markdown; `chat retry` and `chat edit -m` are Regenerate and Edit-and-resend; `--watch` on `chat refs`, `chat decision list` and `chat proposal list` re-prints on change, and `chat room messages --follow` tails a room. `chat stream` now renders the user's line, the run summary, busy/build/refusal notices and broadcasts instead of dropping them. Smaller: `conversation search --chat --from --has --after --before` (client-side, marked partial like the search box), `chat list --counts` (per-kind totals) and `crew peer-conversations --offset` (#4504). - **`crewship chat stream` shows which assignment, escalation or exposed port an event is about.** Session broadcasts that are not chat events (`assignment_*`, `escalation_*`, `peer_query_*`, `port_expose_created`) reached the NDJSON run stream as a bare type name; the WebSocket delivered the same frame with its payload. The stream now carries the payload as `metadata`, cost-redacted like every other frame (#4504). - **`crewship chat ` shows message times again, and `--since` filters.** The transcript read each message's `created_at`, which the messages endpoint never sends — it sends `ts` — so every header printed without a time and `--since` kept every message. It now reads `ts` (#4504). - **"Send to agent" on Design and Project comments reports delivery correctly.** A delivered comment no longer turns into "Retry when the source chat is connected" after 15 seconds, and a busy agent is reported at once instead of after a timeout. - **Native Craft editing can continue past access-token expiry.** The browser refreshes its cookie before admitting or renewing the same editing connection and replaces only its authenticated metadata stream. Unsaved work, the lease generation and in-flight saves remain in place; document mutations are never replayed. - **Read-only Craft viewers saw editing controls.** Native Craft previews now show edit actions only when the server confirms current edit access. Comment viewers can open an explicitly published native preview without acquiring an editor lock or reading private drafts. The CLI exposes the same shared preview and publication paths. ⚠️ **Behaviour change:** admitted native CLI actions and shared preview reads reject HTTP redirects. - **Workspace backups now preserve experimental workbooks.** Encrypted portable restore and forks retain snapshots, published audience and immutable mutation receipts; recovery fences unfinished edits and requires fresh editor sessions and run permissions. - **Full document history now says what happens and what you can do.** Word and Sheet editors stop saving, state that every version is kept and the unsaved work stays in the browser, and offer the draft as a download. Projects keep their preview and source draft at full quota. Neither promises more storage. - Add a disabled dashboard dataset storage foundation with atomic document version checks, bounded JSON batches, server attribution, portable backups and Page lifetime cleanup; code versions remain in the existing artifact VersionStore. - Accept valid near-limit Dashboard data batches by counting their exact metadata and original value bytes, preserving document limits and atomic version conflicts. - Add default-off Dashboard collection reads and atomic JSON document batches through authenticated Page API, CLI and original-run MCP tools. Shared readers use the current shared code manifest; data changes preserve code history and document conflicts never overwrite newer data. - Classify Dashboard artifacts from the authorized code manifest in Page lists and detail: owners use the latest code, shared readers use the current shared pin. The disabled Dashboard data flag preserves the ordinary Project classification. - Require actual Chromium execution of native document privacy regressions in frontend CI while preserving the strict browser-dialog guard. - Add an opt-in Artifacts library at `/artifacts` (`NEXT_PUBLIC_ARTIFACTS_LIBRARY`): a gallery or table of projects, Word, Sheet, Slides and dashboards with kind and shared version, a project detail on its version history and the edit lock of a native Word; the Pages list reports `artifact_kind` and `artifact_shared_version`. - Rebuild the opt-in Artifacts library on the Harbor 2 panel: Home, Mine, Favorites, Clean up, Test items, Empty and Archive views kept in the URL, a colour and drawn thumbnail per kind, folder icons, J/K navigation, and one New artifact dialog that offers only kinds this workspace can create, including Slides through an agent. Share with Read, Comment or Edit inside the workspace, an Access tab that says why each person can open an item, folder settings, and Move, Share, Archive and Unarchive on a selection, each confirmed after a preview of who gains or loses access; archiving hides and never deletes. `NEXT_PUBLIC_ARTIFACTS_SHARING_MOCK` runs sharing in the browser until the backend routes ship. New Doc and New artifact create Word documents through one shared hook. - Add opt-in inert Dashboard previews (`NEXT_PUBLIC_ARTIFACT_DASHBOARDS`): authorized collection data refreshes numbers, tables and native meter charts without publishing new code; shared readers stay on their shared manifest and data has source and freshness labels. - **Every Dashboard number shows where it came from.** With `NEXT_PUBLIC_ARTIFACT_DASHBOARDS` on, hovering or keyboard-focusing a bound value in a Dashboard preview shows its dataset, row and field, its producer (`You`, `Contributor` or `Agent`) and its last update time in UTC; the same text is the value's accessible description and appears in the Data sources list. Values whose producer is unknown, or whose document is not loaded, are marked "Source not stated" and drawn with a dashed underline instead of looking authoritative. The provenance comes from the reader-safe fields the data API already returns; no API or storage change. - **A Design created from the Artifacts New dialog opens.** The dialog handed the new page's slug to the detail as if it were an ID, so a fresh Design landed on "This artifact is not available". It now opens the created artifact by its slug. - Add Preview, History and Comments tabs to the opt-in Artifacts library; sending an anchored comment starts the source agent, with delivery confirmation and retry of the saved task. - Add a bounded Slides artifact import adapter for a closed `deck.json` and authored HTML profile, reusing the existing slide schema and static comment anchors without enabling a new editor or preview. - Open backend-typed artifacts in their versioned viewer from library links and ordinary Page URLs, preserving workspace and selected versions without falling back to an empty panels view. - **Artifact comments could report that the agent did not start after it answered.** Persisted chat acknowledgements now confirm the exact artifact request, and verified task progress clears stale delivery warnings and their retry action. - Show agent artifact project steps in chat as cards with kind, version, Draft/Shared state and a running "Creating version n…" step that settles into "vn ready · Restore"; off by default behind `NEXT_PUBLIC_CHAT_ARTIFACT_PROJECTS`. - Chat artifact cards wear the same coloured kind tile and kind label as the Artifacts library (from the shared kind registry), show `Shared vN` and the server-reported `Agent working…` as status pills, say "Can’t show this version here" instead of guessing a type, and the running step says the current version stays as it is, or that nothing was saved when it fails; still behind `NEXT_PUBLIC_CHAT_ARTIFACT_PROJECTS`. - **Saved artifact comments could lose Retry when their viewer was closed.** Reopening now offers Retry for an undelivered task, rereads its current delivery state and reuses the same saved comment; accepted or running tasks are not sent again. - Add an opt-in private native-document draft journal and whole-snapshot save coordinator. Recovery offers compare or copy, stale generations cannot replay drafts, and only an exact durable receipt confirms a save. Existing editor profiles remain unchanged. - **Native Sheet documents can use the full GridCraft editor.** The experimental, default-off native profile now initializes qualified Grid workbooks with the same edit lease, local draft and confirmed whole-document save flow as Word. - Open an artifact card in a side viewer (full screen on phones) with screens, element select and anchored comments, the agent comment queue, version history and restore; off by default behind `NEXT_PUBLIC_CHAT_ARTIFACT_PROJECTS`. - Add a default-off typed artifact Slides preview (`NEXT_PUBLIC_ARTIFACT_SLIDES`) with existing slide canvases, thumbnails, presentation, authored comment anchors and authorized PDF download; requires the backend Slides capability. - Show the Craft edit-lock bar, agent proposal cards (Compare / Accept / Reject) and recovered local drafts in chat, and a "+ New artifact" composer menu offering only kinds with a backend; off by default behind `NEXT_PUBLIC_CHAT_CRAFT_LEASE` and `NEXT_PUBLIC_CHAT_ARTIFACT_PROJECTS`. - **Opening a new conversation logged three 404s.** A draft session no longer requests its execution profile, messages or participants before the first send creates it. - **`crewship workspace artifact-policy show|set` work with a workspace chosen by slug.** The slug from `--workspace`/`-w`, `CREWSHIP_WORKSPACE` or the config is now resolved to the workspace ID before the request, as other workspace commands do, instead of being put raw into `/workspaces/{id}/` and answered with 404; a slug that does not resolve fails rather than falling back. `set` without either `--crew-id` or `--clear-crews` now says one of them is required instead of `not both`. - **Project Edit grants could return 403 instead of allowing changes.** Human editors can read and save the latest complete project with version conflict checks and their own attribution. Read and Comment stay on the shared version; publishing a shared pin, restoring history and agent execution keep separate owner permissions. - **Artifacts CLI help now explains data, Slides, archive and creation policy commands.** The help includes required flags and examples, and agent refusal text names artifact and Design operations. Command behavior is unchanged. - **Artifact authoring clients support complete project versions.** Add pilot MCP tools and `page artifact` commands for atomic manifests, explicit version conflicts, restore and anchored feedback on servers that enable the artifact project backend. - Artifact project feedback exposes verified human/agent attribution, occupied addresses have a distinct error, and authoring tools require stable selection IDs. - Add default-off authored Slides projections and vector PDF export with explicit version pins and current Page/run authority rechecked after rendering. Existing artifact history and comments remain authoritative. - Add authenticated artifact project creation and workspace availability endpoints behind the disabled artifact projects flag. - Artifact creation and publication tools now request stable element IDs so generated screens support precise element comments. - Version the bundled Project, Dashboard and Slides authoring packages and preserve their release in agent skill files, with immutable compiled type metadata and unchanged content versions. - **Page catalogs filter and page on the server.** Search names and slugs, combine kind (including Design), privacy, version, owner, folder and empty-item filters, and choose stable ordering through the existing API and `page list` CLI. The Artifacts library can page its All view on the server behind the default-off `NEXT_PUBLIC_ARTIFACTS_SERVER_CATALOG` flag. Totals and page windows include only authorized matching items; existing unpaged callers retain their array response. - Clear copied-command feedback timers when onboarding unmounts. - **Saved Slides pages could look empty.** Page detail and list responses now include native Slides presence and schema metadata, allowing the existing opt-in Slides viewer to recognize saved presentations. - Add a standalone, bounded Slides-to-PDF foundation with a fixed embedded font, vector shapes and tables, and explicit text overflow errors; product export entrypoints are not enabled yet. - **Native single-editor documents gain a default-off edit lease boundary.** SQL-backed holder generations fence expired, handed-off and revoked writers; workspace erasure and user deletion remove retained holder identities while preserving the fence. Lease acknowledgements recheck authority after SQL; recovery retires source holders while retaining generations, and portable replacement refuses issued target fences. A target-local workspace issuance marker preserves restore protection after Page deletion. Runtime editor and version-store wiring remain disabled. - Expose a default-off native Craft human session and edit-lease HTTP API with Page-scoped availability, named holders, requested handoff and live connection renewal. Original credentials and current Page rights fence every action; existing document profiles are unchanged. - Add a bounded host adapter for original Word/Sheet engine edits and reads: pinned executables, private files and a closed command allowlist. Agent authority remains in the separately guarded native task and edit-lease boundary. - Add separately opt-in native Word/Sheet agent tasks with explicit original-human consent, confirmed run identity, shared edit leases, original-engine edits and receipt-backed whole-document saves. Human holders are refused; the original human can inspect actual task outcomes and stop the agent without lending a human editor session. - Allow native Craft editors to copy to the clipboard while keeping clipboard reads and opaque-frame isolation restricted. - Add a default-off whole-native WordCraft/GridCraft version store with immutable compatibility pins, engine validation, lease and CAS fencing, exact snapshot receipts and portable profile backups. Its visible 16 GiB history budget preserves versions on exhaustion; editor activation remains separate. - Create vendored WordCraft numeric test fixtures exclusively so a competing output file cannot be truncated. - Execute a flat WordCraft editor package with a real WASM snippet import in the packaging regression, checking the original ABI identity and manifest hashes. - Keep an idle native WordCraft read alive when typing starts, ignoring its obsolete projection without resending the command. - **Taking over a native document no longer ignores the first click during refresh.** Lease controls wait for a newer read-only editor snapshot to finish opening before accepting custody actions. - Explain when a browser cannot support the isolated WordCraft command editor, including iPhone browsers. - Allow the 72 generated fixture-qualified WordCraft commands in the default-off C1 backend test profile, with closed parameters and a new exact catalog identity. - Keep native selection receipts valid when a WordCraft command also returns command-specific metadata. - Add a disabled native WordCraft command HTTP controller with immutable viewer fences, confirmed SQL-only projections and bounded current-rights delivery; product startup registration remains separate. - Validate private C1 checkpoints and quoted RPC frames with their existing 4MiB/32MiB byte bounds and a fixed bounded JCS structure profile, preserving the legacy command-envelope limits. - Preserve bounded native C1 command selection in the original immutable staged operation receipt and atomic SQL outcome, without adding a shared peer caret or inferring selection from input. - Add a disabled command-document runtime lifecycle that initializes only new documents, restores confirmed SQL state, and retains existing owner fencing without falling back to the legacy adapter. - Bound the native C1 host's live generation history across repeated restores, preserving pending candidates and handles when replacement capacity is refused. - Add a separate opt-in C1 renderer source recipe and actual native WASM registry/codec harness, with confirmed selection checks and explicit pending-input refusal; it does not enable product UI, preserve rapid input or change the legacy SDK. - Add a default-off private inherited-FD WordCraft command host that pins its native helper and stages immutable checkpoints for trusted SQL confirmation, without exposing a public commit endpoint. - Keep private native WordCraft agent commands and outcome lookups bound to their original confirmed chat mandate and current Page permissions. - Add an opt-in private native command port with pinned engine identity, bounded correlated process messages, opaque staged handles, and SQL-authoritative recovery without command replay. - Keep the opt-in WordCraft command host candidate separate from confirmed state until a trusted host SQL-success callback, retaining participant undo and committed operation receipts across checkpoint recovery. - Preserve new command-document formats and immutable engine pins while legacy collaboration adapters refuse their payloads, including when command support is disabled. - Add a separately disabled SQL interface for new WordCraft command documents, with current-rights checks, atomic checkpoints and operation receipts, and reconciliation without replay after uncertain outcomes. - Keep idle WordCraft editors connected through standard WebSocket ping/pong while preserving the existing response and inactivity limits. - Show the Crewship page name in attached WordCraft chrome and hide its standalone Discord, Share and Zotero controls. - **Native document exports did not download.** Word and spreadsheet export copies now download through the host browser while retaining the isolated editor and separate server save confirmation. - **New Doc was unavailable with only the native Word profile enabled.** The qualified, default-off native profile now offers Word creation through the existing whole-document initializer and opens the full editor after releasing creation custody. Ambiguous initialization never creates another Page or blindly retries a write. - Open document links in their accessible workspace before requesting document content, preserving unsaved-work navigation guards. - **WordCraft documents can be created from Pages.** When native collaboration is enabled, choose WordCraft in New Doc to open a blank document in the editor without setup scripts. - **Create native Sheets from New Doc.** The Sheet choice appears only for a qualified GridCraft release, initializes its original engine model, and reopens saved native Sheets in the full editor. - **Native Sheet documents can use the full GridCraft editor.** The experimental, default-off native profile now initializes qualified Grid workbooks with the same edit lease, local draft and confirmed whole-document save flow as Word. - **New Doc was unavailable with only the native Word profile enabled.** The qualified, default-off native profile now offers Word creation through the existing whole-document initializer and opens the full editor after releasing creation custody. Ambiguous initialization never creates another Page or blindly retries a write. - **One departing or expired collaborator could disconnect everyone.** Keep late lease replies scoped to the original closed participant and finish an already reserved reply before that participant leaves, preserving the other collaborators' session. - **Opening large collaborative documents could time out.** Avoid repeated checkpoint validation in incompatible message variants and scan the existing base64 schema vocabulary directly, preserving checkpoint integrity and the five-second startup deadline. - Bind document-agent task registration and partial-result policy to the original admitted human task before native submission. - Add bounded native document pages to the original task's `doc_read` tool, preserving one immutable revision, complete application data and current read authorization across continuations and physical delivery. - Allow an explicit read-only native document task through the existing original-message flow, preserving its attached read intent across admission, native grants, renewal and retirement while rejecting submissions. Default tasks retain their original write mode. - Qualify Mooring startup metadata and complete targets from one checked owned WordCraft document, preserving checkpoint integrity and final owner checks without changing runtime deadlines. - Replay contiguous committed Mooring native deltas after recipient reopen or a delivery gap, checking current reader rights for every frame without creating a new snapshot or source authority. - Show recorded native agent edits separately from current document grants and tasks, with independently authorized source-chat backlinks. Historical references grant no rights and do not claim artifact creation or complete version history. - Package the optional Mooring runtime and isolated WordCraft editor from pinned public sources, with embedded asset integrity checks and disabled-by-default runtime configuration. - Bound Mooring session admission request and response I/O, flush buffered responses under the original ingress lease, and retain the read deadline through HTTP body cleanup. - Rust-backed Mooring saves retain immutable original human/agent task attribution in the same transaction as each new saved atomic change. Rejections, failed commits and known retries do not create another edit record; this does not yet provide artifact creation, version browsing or live chat acceptance. - **Document access in chat:** distinguish the agent's current document grants from verified active task permissions. Hide inaccessible document metadata, expire unverified views, and identify unknown output provenance explicitly. - Preserve original task authority and private-run ownership through the existing Mooring agent dispatcher and confirmed-attempt chain. This prerequisite does not enable an agent route or qualify a private execution environment. - Mooring sessions retain a Pending notification and its matching terminal receipt separately while delivery is blocked, preserving each until its own completion. - WordCraft documents expose existing authorized sharing from their header and list menu without replacing the running editor. Opening access rechecks the current viewer and keeps document sharing separate from agent task permissions. - Run the complete catalog of actual Mooring Rust/SQL integration tests in hosted CI using freshly built public-source fixtures; reject missing, skipped or failed execution evidence. - Grade the actual Mooring session response and optional editor DTOs against their OpenAPI schema without increasing the ungraded-response budget. - Keep the participant stalled-write regression tied to its unchanged physical/context deadline even when the network poller wakes before the context timer callback. - Document the default-off Mooring session request/response and bodyless WebSocket upgrade, with exact conditional-route checks and CLI/configuration contracts. - WordCraft explains restricted undo/redo refusals without closing the editor or changing its save state; deletion undo and changes overlapping another author's deletion remain refused. - Mooring CLI streams honor JSON/NDJSON and YAML output; unsupported quiet output is rejected before opening input or connecting. Original submitted packets remain unchanged. Literal HTTP registrations expose the existing authenticated session and WebSocket paths to route inventories. - Account for both Mooring FIFO lifecycle goroutines during API teardown, and make the file-download classification guard ignore braces inside Go literals and comments. - Isolate Mooring Page-grant revocation to the affected participant while rechecking unaffected writers against current rights. Retain bounded old-gate output until its original provenance and current delivery gate are both verified, and decline a revoked pending ticket without inventing a replacement grant. - Connect default-off Mooring human submissions to immutable live originals, same-writer public receipts, and SQL-backed per-atomic peer updates. Bootstrap requires the actual native human and complete-origin-inventory capabilities; restart recovery and agent writing remain separate qualifications. - Add a default-off authenticated Mooring HTTP/WebSocket controller with one-use human joins and current SQL-gated checkpoint delivery. Raw editing remains refused until the native human prepare capability is integrated; in-process backup restore requires disabling the controller and restarting. - Retain bounded original human proposals only after authenticated admission commits, and require their immutable publication proof before any sealed outcome lookup or dependency rejection. Missing or uncertain originals remain nonterminal; this does not enable raw editing. - Mooring SDK recovery refuses incomplete full snapshots even when Yrs reports no missing updates, preserving every original unsaved draft instead of accepting silently omitted history. - **Mooring agent reads:** an inactive session checkpoint reader retains the original agent mandate and confirmed attempt under the existing immutable authority; it grants no write or external delivery access. - **Independent collaboration authors:** dormant admission callbacks distinguish original author generations from broad delivery invalidation, so another user's grant revocation does not reject an unaffected original author. Current source and Page policy remain required; missing tracking or schema drift stays nonterminal, and no content path is enabled. - **Collaboration revocation metadata:** prepare persistent author-relevant generations from canonical policy mutations, separate from broad delivery invalidation. Portable restore preserves target tombstones. Admission integration remains unqualified and disabled. - **Mooring ingress groundwork:** an inactive bounded host registry retains original operation membership and authenticated author proofs after admission COMMIT. Session transport remains disabled pending independent review and mixed-author revocation qualification. - **Mooring session groundwork:** inactive queued commits retain their exact owner and original author proofs; uncertain authorization cannot become a durable refusal. No session transport or agent execution is enabled. - **Mooring recovery groundwork:** inactive human admissions can retain their original identity and authority across a verified Rust-only replacement. Old store bindings and join tickets cannot follow the new process; issued delivery gates remain recorded until blocked or expired. - **Mooring ownership groundwork:** a host can voluntarily release its exact current owner lease, preserving its generation and every issued delivery expiry. Replacement ownership does not acknowledge pending delivery gates. - **Mooring admission groundwork:** an inactive human registry preserves original Page authority, burns bounded join tickets once and opens current SQL delivery gates. Its store wrapper holds the restore fence through the complete operation. - **Mooring authorization groundwork:** an inactive human Page authority adapter checks current canonical grants, folder scope and original credential inside the protected writer transaction. - **Mooring admission preserves the original human credential.** Authenticated chat receipts retain the original user revocation fence and exact credential through run admission and retries; legacy receipts remain unfenced and cannot authorize the new Mooring admission path. - Conversation transcript appends stay inside their configured storage root even when an existing transcript path is a symbolic link. - Adapt WordCraft C-E acceptance to actual HTTP commit receipts and passive native queue observations, keeping separate visual evidence, authenticated peers and participant undo requirements. - **[Resource Access v1](docs/security/rbac.mdx#resource-access-v1)** delivers Guest/restricted mode, per-object agent/routine/project sharing, crew View/Use presets and trusted Manage with ordinary membership controls, existing Pages ACL, Publish in UI/API/CLI, and atomic chained audit with sealed keyring, rotation, verification and alerts. Credential grants, crew/workspace recipients, the complete inherited Access card/grid, universal GET/stream/query-count guards, unified Pages grants and Guest published-routine execution remain deferred to v1.1; the documented absence of a universal leak guard is an accepted release limitation. - **Explicit crew managers can use ordinary member controls.** A live trusted Manage share enables adding and removing ordinary crew members in Settings. Role editing and removal of explicit crew roles remain administrator controls. Failed access checks and context switches withdraw grant-based controls. - **Crew sharing can create explicit trusted Manage grants.** The crew Share dialog and person Access editor offer Manage to trusted MEMBER/MANAGER recipients, preserves account mode and other grants, and keeps inactive shares visible for revocation after role changes. Guest shares remain View/Use; Manage does not assign roles or expose credentials. - **The opt-in WordCraft command editor can show silent connection loss without losing its draft.** A separate connection indicator stops claiming “Uloženo” after its configured server-silence limit and waits for authoritative server state on recovery, without replaying commands. The command host must explicitly wire this component before it affects an editor. - **Idle work polling avoids unnecessary writer transactions.** Empty or not-yet-eligible queues use a fresh read hint; capacity, deadlines and attempt ownership remain checked in the claiming transaction when work is present. - **Trusted members can receive explicit crew management shares.** Administrators can grant crew Manage to trusted MEMBER/MANAGER recipients through the member-policy API and CLI, permitting crew profile/configuration and membership changes without explicit crew role overrides. Role assignment, crew deletion, private-network opt-in, budgets and workspace administration retain their existing guards. Account conversion requires deliberate revocation of trusted-only shares first; writes and audit remain atomic. Existing Access editors preserve and display these shares. - ⚠️ **Behaviour change: Host lifecycle hooks require instance administration.** Creating, editing or enabling host commands now requires an instance administrator and appropriate token scope. Existing host hooks are retained but disabled for explicit review after upgrade; restored hooks also require local review. UI and CLI explain how an administrator can review and re-enable them. Live host-hook changes commit atomically with their authorization audit. Shell output capture is bounded while retaining the existing truncation and exit-result behavior. Container hooks and the default lifecycle pause are unchanged. - **Guest agent access can inherit from an explicit crew share.** Administrators can share a crew with View or Use through the member-policy API and CLI. View discovers current crew agents; Use also permits Chat and Run, without Delegate or credential access. Revocation, crew retirement and agent moves fence existing attempts. Access screens preserve and display saved crew shares. - **Guest runs of published routines are deferred from the v1 contract.** Guests retain explicitly shared View, Results, Edit and Publish rights; publication never starts execution. Team members and crew triggers initiate routine runs under their existing authorization rules. Guest execution requires a separately qualified private runtime: a default install returns `503 restricted_runtime_unavailable` without creating or queuing work. Existing optional runtime code and configured qualifications are unchanged. - **Restricted text workers have an independent release producer.** A main-only manual workflow can publish scanned, signed immutable `responses_text` candidates with source, binary and license provenance. Pull requests and publication test the real production worker against synthetic data; signing requires the exact candidate digest to pass. Image approval, host qualification and Guest runtime acceptance remain separate steps. - **Restricted native scratch tools can fail on noatime-backed Docker storage.** The native image rebuilds bubblewrap with an atime-preserving remount fix while retaining the inner workspace sandbox and unchanged container security policies. - **Guests can read explicitly shared crews.** Crew View/Use now opens filtered crew list/detail with identities, agent counts and current agent statuses, while configuration, credentials, membership and activity stay hidden. `crewship crew access` explains the actor’s current Guest share; Use remains conditional on agent authority and runtime preflight. Revocation, crew retirement and issuer authority apply immediately to subsequent requests. - **Administrative security operations explicitly opt in to emergency audit fallback.** Only single/all-session revocation can use this fallback in the session handler; unlock remains chained-only, and unknown internal operations are rejected before any account or audit mutation. Web password changes and resets continue to fail closed on a broken audit chain. - **CLI object sharing accepts routine Publish.** `crewship share` and `unshare` now accept `--operation publish`, matching the Share dialog. The server still requires Edit in the resulting policy; unrelated grants and issuer provenance are preserved, and conflicts are never retried. - **An open workbook could remain active after its editor grant was removed.** Revocation now closes the persisted editor session in the grant transaction, sends a targeted `session_closed` control immediately, and drops queued protected frames while keeping other workbook subscriptions alive. A bounded fallback catches membership and ownership changes. - **An agent could save a result calculated from cells that had already changed.** Workbook commands now carry cell and range read preconditions, including the range structure revision, and reject changed inputs with a visible reason. Older agent clients conservatively require an unchanged base revision. - **A full workbook history could silently erase earlier revisions.** Writes now fail visibly with `quota_exceeded` when history or checkpoint capacity is exhausted, preserving the confirmed workbook and every previous revision. - **An unavailable embedded editor offered no direct retry.** A failed startup now explains the availability problem and offers “Retry editor” after the existing connection deadline, creating a fresh isolated frame. Connected editors retain their current draft and pending changes. - **A confirmed application edit could remain stuck on “Saving…” during a live update.** The editor host now waits for an in-flight snapshot read and its queued fresh read before acknowledging the durable receipt, while retaining the same mutation for a failed-read retry. - **Mooring activity was missing from journal filters.** Creation, confirmed edits and agent mandate changes now use registered event types and appear in the Artifact activity group with matching icons. - **Selecting a workspace could leave the rest of the application unclickable.** Workspace rows now allow the menu to dismiss normally after selection, releasing its modal pointer lock before returning to Artifacts or another workspace screen. - **Application editors can share a small TypeScript protocol SDK.** The pilot adds a manifest-driven editor surface and a non-Rust reference editor with separate local drafts, live confirmed state and durable receipt status; GridCraft retains its existing conflict recovery on the shared capability channel. - Workbook publication, custody requests, explicit ownership transfers and orphan deletion now append their authorization audit atomically; failed audit writes roll back the access change. - Workbook conflict notices and save status keep the editor frame stationary, preserving rapid input during refusals, including on narrow screens. - ⚠️ **Shared workbooks no longer accept direct agent mandates.** The experimental post-publication exception bypassed the required proposal path. New admissions and legacy mandate use now fail closed with `proposal_required`; proposal delivery remains unavailable. Private workbook mandates are unchanged. - **Workbook previews now explain why editing is unavailable.** A disabled workspace, unsupported browser, failed availability check or invalid editor configuration has a visible reason and next step. Failed availability checks can be retried without reloading the page. - **Workbook editor: edits saved during a reload no longer stay "Saving…".** When the workbook was reloaded (pruned history or an import) while a saved edit waited for earlier revisions, the editor was never told it was saved and kept showing it as unsaved, hiding later changes to that cell. Such an edit is now confirmed right after the reload, a repeated send gets the same confirmation without a second write, and a reload never takes the editor back behind a revision it already shows. - **Workbook editor: a refused edit never loses cells.** A refused multi-cell edit (a paste, a fill) keeps every cell on the Page, marks which ones another writer changed, and waits for a decision: **Keep mine** writes all of its cells again, **Take theirs** keeps the other writer's values only for the cells they changed and still saves the rest, and **Discard mine** drops an edit with no such cell. Every refusal (also an unconfirmed edit or one whose recalculation could not be confirmed) stays open until decided, survives a workbook reload, and holds the status at not saved and the leave prompt; deciding one never clears another. Each notice row names its cells for screen readers, announces itself politely, disables its buttons while the choice is saved and moves focus to the next decision or the editor. Taking theirs on a session that expired unnoticed reopens the session instead of closing the editor. - **Workbook editor: clearer bundle failures and same-cell conflicts.** An editor bundle that does not match the approved version is now reported as such instead of as a protocol break. When another writer changes a cell you are editing, the host warns at once (when the editor reports its open drafts) and keeps your draft; a commit refused because of that change shows both values with Keep mine or Take theirs instead of only an error. Take theirs sends nothing; once no other refused change is shown and nothing else is unsent, the status returns to no unsaved changes and the editor reloads the head so its own refusal notice clears. Conflict notices also clear whenever the editor loads a fresh snapshot. - **Experimental embedded workbook editor host (off by default).** With the workspace flag `gridcraft_editor` and a server editor session, a workbook Page frames the editor from its own origin with exactly `sandbox="allow-scripts"`, `credentialless` and no referrer, checks the handshake (frame window, opaque origin, bundle digest), and ends the session and removes the frame on any later load of the frame. **Saved** appears only after a durable server receipt; an answer without one is retried a bounded number of times and then reported as not saved, without holding back later edits. A failed workbook read at open, a handshake that does not finish within 15 seconds, the editor being turned off or its bundle withdrawn while open, and an expired session all remove the frame and fall back to the read-only preview with a notice. Leaving with unconfirmed edits asks first. Otherwise the read-only preview stays. - **The embedded workbook editor needs no extra hostname and no configured origin.** With the editor enabled and no `CREWSHIP_EDITOR_RUNTIME_ORIGIN`, Crewship serves it on the Studio origin under `/_editor/b//`, with no DNS record, certificate or proxy route, and without any origin setting: the editor's policy and Studio's `frame-src` follow the origin each request reached (its `Host`, and the scheme by the trusted-proxy rule), and the host page frames the editor by path. `CREWSHIP_PAGE_STUDIO_ORIGIN`, when set, becomes the only origin the editor answers on (other hosts get `421`). The editor still runs in an opaque, CSP-sandboxed origin. Its policy sources and Studio's `frame-src` name only the bundle path, so it cannot call the Studio API or navigate itself onto a Studio page. That path scoping holds only while nothing in front of Crewship redirects or rewrites `/_editor/`; with the mandatory iframe attributes (`sandbox="allow-scripts"` and `credentialless`) the frame stays opaque and without cookies either way. The server learns the public origin from signed-in browser requests (or uses the configured one) and checks it for such a proxy, recognising a traversal that reaches Crewship outside the editor by its `X-Crewship-Route` header; a confirmed redirect, path rewrite or stripped `X-Crewship-Route` disables the editor on that exact origin until three consecutive checks pass again. Because those request headers are under any signed-in user's control, learning is bounded: `https` only (plain `http` only for loopback on a server bound to loopback), never link-local, cloud-metadata, unspecified or multicast addresses (the self-check also refuses to connect to them), one origin per user, at most four, forgotten after 24 hours unused, and an administrator's origin always gets a slot. Until a browser has used Studio the check is `pending`. The public `/healthz` shows only `ok`, `pending`, `failed` or `disabled`, counting only the configured origin and origins an administrator used; instance administrators see origins, causes and which user taught each origin with `crewship admin instance workbook-editor`, and `crewship doctor` repeats the check from outside for origins on the `--server` host and warns while the server's own check has not passed. The docs list the proxy rules (path unchanged, `Host` forwarded, no redirect, no SSO gate), which are reverse-proxy defaults. It answers `403` to requests that carry Crewship's own session, refresh or CSRF cookies, so it never loads without `credentialless`, while cookies a load balancer or CDN sets (for example ALB stickiness or `__cf_bm`) do not stop it from reopening in the same tab. It also refuses Studio pages loading its code. Editor responses send Studio's exact HSTS value, assets are `Cache-Control: private` so shared caches never store them, Studio documents get `private` added to their `Cache-Control` while their policy names the request's origin, and the editor policy carries `webrtc 'block'`; because Chromium does not enforce that directive yet, bundles that reference the WebRTC API are refused at load in both modes. A dedicated editor origin remains optional hardening. Same-host mode is refused with a cleartext non-loopback configured Studio origin, with a Page runtime on the Studio origin, and when `null` is a trusted origin. - **Default-off workbook editor origin.** Operators can configure a dedicated HTTPS origin that serves only digest-pinned, manifest-verified editor bundles (pinned by the manifest digest) under a fixed server-set policy: the document is CSP-sandboxed into an opaque origin (no cookies, storage, top navigation or popups) and must be framed with `sandbox="allow-scripts"` plus `credentialless`, assets load cross-origin without credentials, manifests are decoded strictly, inline scripts run only by hash, `'wasm-unsafe-eval'` applies only there and `frame-ancestors` is limited to the Studio origin. The configuration refuses an editor host shared with or parent of Studio or the Page runtime, apex and trailing-dot hosts, and trusted API origins; Studio frames it while enabled. - **Experimental offline workbook operations** add a default-off GridCraft Artifact adapter, native-file imports and scoped agent cell edits with durable receipts, retry recovery and bounded worker admission. Runtime activation requires a qualified persistent digest-pinned worker reached over a private authenticated socket. Embedded editing, collaboration and portable workbook backup/restore are unavailable; affected workspace backups fail explicitly. - **Guest access explanations match the supported resource policy.** Member settings name agents, routines and projects; CLI help explains the runtime prerequisites, and Edit explains the separate Publish share instead of claiming publication always needs a trusted reviewer. - **Skill repository imports use verified, pinned HTTPS connections.** Redirects and inherited Git/proxy/credential configuration are disabled. Administrators can allow exact private Git hosts with `skills.private_hosts`; loopback and metadata targets stay blocked. Imported `SKILL.md` files are read within the chosen import root, with bounded regular-file reads. - **Backup inspection reads metadata and reports that integrity has not been verified.** Restore, verification, recovery and conversion use operator-configured decoder, work, output, metadata, time and admission limits. Defaults allow one million logical entries and 256 MiB of cumulative path/link names across all passes. Large operations can fail with an explicit resource allowance error; operators can tune the documented capacity settings. - **LLM stream accounting avoids redundant JSON decoding.** The sidecar decodes valid SSE usage envelopes once while retaining existing token accounting and malformed-root fallback. - Mooring SDK recovery refuses incomplete full snapshots even when Yrs reports no missing updates, preserving every original unsaved draft instead of accepting silently omitted history. - **Ask form patterns are checked by the server before a submitted answer is saved.** Author patterns no longer run in the browser's native regular-expression engine, including in message previews. The server uses the chat agent's stored definition and the same answer validator as CLI preview; a refused answer stays in the open form with its field error. ⚠️ **Behaviour change:** Go-only patterns such as `(?i)` are now enforced where older browsers silently skipped them. Legacy stored patterns Go cannot compile remain unenforced, while saving a new or updated definition with an invalid pattern is still refused. Invalid or stale submission envelopes are rejected rather than saved as ordinary messages. Restricted text-only chats refuse ask forms instead of discarding their validation metadata. Deferred submissions recheck the current form and Page access after an environment build; refusals are private and correlated with the original submission. - ⚠️ **Behaviour change: routine expression inputs stay data.** CEL and expr code now receive typed inputs and prior step outputs instead of rendered program text. Simple legacy `{{ inputs.x }}` references, including a whole quoted reference, translate at runtime without rewriting saved definitions. Embedded or complex templates are rejected on save and fail closed for historical definitions; use typed selectors directly. Complete JSON step outputs retain their JSON types, missing selectors fail explicitly, and nested selectors walk each path segment. `crewship routine validate` reports the same migration guidance. - ⚠️ **Behaviour change:** Public Pages password checks have configurable process-wide and per-link concurrency limits. Busy checks return 429 with Retry-After immediately; existing per-link rate limits and password refusal responses remain in force. - **Native WordCraft and GridCraft editors stay connected through unrelated workspace changes.** Creating another Page, changing a grant on another Page or adding a workspace member no longer disconnects every open native editor with "Editor odpojen" and a 403 on the next save. A native editing session now ends only when a change can affect that person or that Page, including a revoked and restored grant, membership loss or a revoked credential. - **Open Design canvases stay connected through unrelated workspace changes.** Creating another Page, changing a grant on another Page or adding a workspace member no longer closes every open Design websocket in the workspace, which could drop unconfirmed edits on large canvases. A Design connection now closes only when a change can affect that person or that Design Page, including a revoked and restored grant, membership loss or a revoked credential. - ⚠️ **Behaviour change:** Routine-version and consolidation diff previews share configurable byte, line and concurrency budgets. Oversized previews return 413 and busy comparisons return 429 with Retry-After immediately; the UI and CLI show an explicit refusal. Accepted comparisons keep their existing hunks and stored definitions are unchanged. - **Audit history damage is detected without operator requests.** Full instance and workspace verification now runs at startup and hourly outside writer transactions; post-upgrade defects and unchained fallback records alert instance admins. Delivery receipts commit with the inbox notice and survive inbox purge/retention, so handled security notices are not repeatedly restored or resent. - **Crews pick up a new sidecar after an upgrade without `crewship crew restart-agents`.** A crew container keeps running the `crewship-sidecar` it was created with, so after an upgrade agents silently lacked whatever the new sidecar adds (such as new MCP tools) until an operator recycled the crew. Crew containers are now stamped with the hash of their sidecar (`crewship.sidecar-hash`); at a crew's next start a container with a different or missing stamp is recreated when it is stopped or idle, keeping its volumes, workspace data and credentials wiring, and a `sidecar.recreated` journal entry records the old and new hash. A container with an active run is never interrupted: the run keeps the existing `sidecar.stale` signal and the container is replaced at its next idle start. Runs that start together recreate it at most once. ⚠️ The first start of each idle crew after upgrading to this version recreates its container once, because existing containers carry no stamp yet. - ⚠️ **Downgrade boundary: saved preset choices are per version.** After migration `20261022114610`, a routine can carry both a v1 and a v2 preset choice. Earlier builds cannot handle that and are refused at start by the version-skew guard. Downgrade by restoring the pre-upgrade snapshot (see Upgrades → Rollback / downgrade), never by deleting migration records. - Guests with separate View, Edit and Publish shares can save, structurally validate and publish an exact shared draft from the web editor. Publication never starts a run; conflicts require explicit reload. Routine Share and the person's Access card expose Publish with its Edit dependency. The new immutable v2 preset (levels None, Edit, **Edit + Publish**) preserves separate View, Results and Run shares and revokes Publish through the same reviewed preview; v1 stays unchanged, and saved preset choices are now kept per preset version so applying v2 no longer overwrites a v1 record. A refused publication or structure check (422) shows the server's reason. Publishing a routine that other saved routines reach through `call_pipeline` is refused with 422. Bounded execution remains a separate runtime slice. - **A staged audit key rotation is installed at start only if its audit entry vouches for it.** A `crewship audit rotate-key` interrupted after its audit commit is finished at the next start only when the entry is the newest rotation, names the staged active key and that key is not yet in the keyring; a stale or replayed `audit-keyring.json.pending-*` file is kept aside as `.discarded-` (never overwriting an earlier copy) and the start continues with a warning instead of installing it. - **Content scanners skip regex work when required literals are absent (#3995).** Conservative per-rule prefilters preserve Unicode case folding, custom and registered-secret rules, stream boundaries, normalization, findings and existing limits. - **Agent MCP configuration values no longer reach the audit log, and agent privilege changes roll back when their audit fails.** Updating an agent used to copy the request body, including `mcp_config_json` with any API keys in its `env` or headers, into `audit_logs` and the journal, after the change had committed. The update is now one transaction with its hash-chained audit, which records previous and current tool profile, crew, role and MCP servers (server names, transport, command name and env/header key names only); temporary hire, rehire and release are chained the same way. Rows written by earlier versions are not rewritten: rotate credentials that were set in an agent's MCP configuration. A MANAGER's credential folder move is now checked against the folder's policy as it stands in the update's own transaction. - **Optional qualified runtime: Guest-published routine execution (deferred from v1).** `crewship routine run --wait` starts a bounded manual run of a Guest-published routine on its recorded agents and `responses_text`/`native_api_key` profiles. Logging out does not stop it; revoking a used grant, removing or suspending the member, an administrator revoking the user's sessions (recorded durably, so this works after the user logged out), a grant issuer losing authority, rotating an agent's credential, or withdrawing the routine stops it before the next step, as does a 30-minute run limit. Delayed start is refused for published routines. Start and stop (with its reason) are recorded in the chained audit journal. Schedules, webhooks, nested calls and Page actions still refuse published routines. - **Withdraw a Guest publication and set the Guest run limit.** `crewship routine unpublish ` (Publish holder or workspace OWNER/ADMIN) withdraws a Guest-published routine: new runs are refused and running ones stop before their next step, with the change audited; republishing makes it runnable again. OWNER/ADMIN set the hard limit for one Guest-published run with `crewship workspace update --guest-routine-max-run-minutes N` (1-240, default 30). - **Project checkpoints allocate less memory (#3993).** Pack creation reuses compression state between objects while preserving independent completed zlib streams and Git pack verification. - **The audit signing keyring is encrypted at rest, and `crewship audit rotate-key` rotates it.** `/audit-keyring.json` held the audit HMAC keys as plaintext JSON. It is now sealed with AES-256-GCM under a key derived (HKDF) from the current master key; an existing plaintext keyring is sealed at the next start, and a master-key rotation re-wraps it at the restart the rotation already requires (keep earlier `ENCRYPTION_KEY_V` until then). A keyring that does not open with the configured master key stops the start instead of being replaced. `crewship audit rotate-key` (`POST /api/v1/admin/audit/signing-keys/rotate`, instance OWNER with `instance:admin`) adds a new active key, keeps the old ones for verification, records `audit.signing_key_rotated`, and takes effect at the next start. A keyring configured outside the data directory is read but never rewritten. ⚠️ **Behaviour change:** builds before this one cannot read the sealed keyring; before rolling back, export it with `crewship audit export-keyring --plaintext` (see the audit security page). - **Crew links, the artifact creation policy, credential folder policy and routine origin clears roll back when their audit fails.** These access changes used to be recorded only in the unchained Settings Audit log, some of them after the change had already committed; each now appends the hash-chained journal in the same transaction, with previous and current values, and still writes the Settings Audit row. Refused waitpoint decisions are chained the same way without naming the callback token. The crew runtime privilege audit now also records `init` and mounts, alongside `privileged` and added capabilities. - ⚠️ **Behaviour change: first-run Setup is refused for MEMBER.** `POST /api/v1/onboarding/setup` now requires the OWNER, ADMIN or MANAGER role in the workspace; a MEMBER (or VIEWER) gets 403 Forbidden instead of creating the first crew. Ask a workspace owner or admin to run Setup, or to raise your role first. - **Managed native executable verification avoids whole-file Go buffers (#3994).** Hashing and ELF inspection retain the same open descriptor and existing static-ELF acceptance. Unix image capture uses private, immediately unlinked temporary storage; Windows retains the existing buffered archive path. - ⚠️ **Behaviour change: a password reset now revokes the account's CLI tokens.** Redeeming an emailed reset link and `crewship admin reset-password` used to revoke only browser sessions, so a CLI token minted under the old (possibly stolen) password kept working. Both now revoke every live CLI token of the account in the same transaction as the new password, the revoked sessions and the `auth.password_reset` audit entry (which now counts `cli_tokens_revoked`); after the emailed reset, open streams using those tokens close. Scripts and other machines need a fresh `crewship login` after a reset. - **`crewship recover --force` works on a data directory that already booted.** Recovery restored the database and then refused because the directory's own audit keyring differed from the bundle's, stopping before `secrets.env` was written. It now checks the keyring before changing anything, replaces it with the bundle's atomically and keeps the old one as `audit-keyring.json.replaced-`. - **Forked workspace restores keep Artifact comments dispatchable to agents.** `--as-workspace` and `--as-crew` gave each send-to-agent task a new id but left the comment's `task_id` on the old one, so pending feedback vanished from the hand-off list and could not be sent. The comment now follows its task. - **`crewship admin reset-password` signs with the target instance's audit keyring.** With `DATABASE_URL` it used the default `~/.crewship` keyring, creating one if absent, so its audit entry could not be verified by the server owning that database. It now uses the keyring beside the database or in the named data directory, never creates one, and says which `CREWSHIP_AUDIT_KEYRING_PATH` to set when it cannot tell. - **Audited writes no longer slow down as the audit history grows.** Appending to a workspace journal or the instance audit chain now checks only the chain tail and the new rows instead of re-verifying the whole history inside the write transaction (one append against 100,000 rows: about 1.4 s before, 0.3 ms after). Older defects no longer make every audited write fail with HTTP 500 after an upgrade; `crewship journal verify` and the new `crewship admin instance audit verify` (`GET /api/v1/admin/instance/audit/verify`) report them as `historical_invalid` / `historical_unverified` (rows from before the keyring upgrade or the last reseal) or `post_upgrade_invalid` (keyring-signed rows). A tail that does not authenticate, or whose predecessor vanished without a compaction checkpoint, still refuses. Revoking CLI tokens or sessions, suspending an account and local `crewship admin reset-password` recovery still succeed when the instance chain tail is broken, recording an audit row marked as an unchained fallback; access-granting actions, including password change and web password reset (now a clear 503), stay refused. - **Instance admins are told when an audit chain breaks or is resealed.** A refused append, a failed check in the instance audit log or a defect found by `crewship journal verify` or `crewship admin instance audit verify` (including `post_upgrade_invalid`) record an `audit.chain_break_detected` instance audit event and put **Audit chain needs attention** in each instance admin's inbox (category security); every reseal records an instance event and sends **Audit chain resealed**. Background journal entries refused by a broken workspace chain are now held and retried every 30 seconds (up to 10,000) instead of being dropped, and other workspaces keep writing meanwhile. - A Document or Slides page with edits the server has not accepted now asks before an in-app link leaves it (Keep editing or Leave anyway); the link used to do nothing and say nothing. - Replaying a Document creation submission after a lost reply no longer adds a duplicate human message or starts another run. - **A MANAGER's agent delete is re-checked against their current role, and agent-created agents name the calling run in the audit.** The delete's authorization is now decided again inside the delete transaction, so a demotion, removal or ownership change that lands meanwhile refuses it (403). The `agent.created` audit records the workspace and crew the caller's internal token is bound to and, for a valid run token, the run and agent; an invalid one is flagged, never trusted. The redacted MCP audit records a server command's executable only when it is a plain program name, so a quoted value split by spaces is no longer recorded in its place. - **Creating and deleting an agent now roll back if their audit fails.** Agent create, delete and agent-initiated (internal) create used to be audited best effort after commit. They are now chained in the same transaction and record the agent's crew, role, tool profile and MCP servers (redacted). A removal after a failed review hold is chained too, and it completes even if the client disconnects. The MCP audit no longer records `NAME=value` assignments that come before the executable in a server command. - Enter in a Document acts where the caret is shown: after a quick keyboard caret move such as Ctrl+End, it no longer splits the document where the caret was a moment before. - Explicitly update an existing personal Document from its private chat with `run --document-target`, retaining the original human purpose and revision through agent drafting. - New Documents retain their initial confirmed version in history, so it remains readable after later edits. - Build releases with Go 1.27.3 to fix the reachable crypto/x509 certificate verification vulnerability GO-2026-6809. - Fix Document formatting updates with bounded position-history metadata and aligned browser/service editor dependencies (#3855). - **Chat says Stopping until the stop is confirmed.** After Stop on a live reply, the Stop button reads **Stopping…** and does nothing more until the server reports how the turn ended; pressing it again sends no second cancel. The partial reply stays on screen, and a turn that did not complete ends with one line in words: **Stopped**, **Interrupted** or **The run failed**, each noting that the reply above is partial or may be incomplete (or that it ended before any reply); the line stays after a reload. Applies to chats on the versioned event stream; older streams still return to ready at once. - **New Doc states who can open the document.** The dialog no longer calls a new Doc private: it says **Who can open it — you, and workspace owners and admins; others only after you share it**, which is what the server enforces for a Doc created there. The Pages guide says the same and notes that such a Doc is not listed in **My space**, which holds only Documents whose audience is you alone. - **Copy on a chat reply says what happened.** The reply's Copy button turns into a check and screen readers hear **Copied to clipboard** only after the browser confirmed the copy; when the clipboard refuses (permission, an insecure dev host without the fallback), it says **Copy failed. Select the text and copy it with your keyboard.** instead of failing silently. The same confirmed copy is used in the onboarding setup chat. - **Saved documents in chat say who can open them, and empty documents say how to start.** A document card in the chat adds **Private to its owner and workspace owners**, which is what the server enforces for documents created from a chat. An empty document no longer shows a blank area: the editor says **This document is empty. Start writing below, or ask an agent in a chat to draft it.**, and the document panel in the chat points to **Edit here**. A document that only holds an inserted heading, list or table is not called empty. - **Copy on a chat reply says what happened.** The reply's Copy button turns into a check and screen readers hear **Copied to clipboard** only after the browser confirmed the copy; when the browser refuses both the clipboard and the fallback copy, it says **Copy failed. Select the text and copy it with your keyboard.** instead of failing silently. The same confirmed copy is used in the onboarding setup chat. - **A stopped reply stays in the chat.** A turn stopped (or failed) before any reply no longer disappears when the chat reloads its history; it stays below the message it answered with its **Stopped** line. A page reload still shows only the message, because the server keeps no record of such a turn. - **Undo and Redo on the Document toolbar.** The editor's toolbar has **Undo** and **Redo**, so a phone or tablet without a keyboard shortcut can take back an edit. Undo only ever takes back your own edits in this editor: a paragraph another person saved in the meantime stays, and cannot be undone from your editor. - **Chat says Stopping until the stop is confirmed.** After Stop on a live reply, the Stop button reads **Stopping…** and does nothing more until the server reports how the turn ended; pressing it again sends no second cancel. The partial reply stays on screen, and a turn that did not complete ends with one line in words: **Stopped**, **Interrupted** or **The run failed**, each noting that the reply above is partial or may be incomplete (or that it ended before any reply); the line stays after a reload for a turn the server saved. Applies to chats on the versioned event stream; older streams still return to ready at once. - **New agents can save Documents in a running crew.** Authorized creation and drafting no longer fail because the shared container's startup roster lacks the new agent's label; current run and human permissions are still checked by the host. - **Backup downloads stop after access is revoked.** Bundle downloads recheck credential, account and live role before each chunk. Browser streams also observe session revocations persisted by a separate local recovery process. Private Page custodians retain versions, exports, documents, projects and chat context when restricted elsewhere; access by another workspace OWNER remains audited before output. - **Access changes and their audit commit together.** Workspace/crew settings, crew deletion and admin session/lockout changes roll back if audit fails. Private membership and invitation snapshots retain old rights without exposing them through public feeds or search; provisioning records non-secret account/setup facts. - **First-run Setup records crew membership atomically.** Setup requires current crew-creation authority (MANAGER, ADMIN or OWNER); stale, suspended and globally restricted accounts cannot create a crew through onboarding. - **Guests can publish an exact shared routine draft through API and CLI.** Validation is structural only; publication checks live explicit rights and commits immutable authority plus audit without starting a run. Stale/busy snapshots return 409, existing triggers 422 and null descriptions 400. Generic callers and triggers cannot use bounded publication authority; manual execution remains a separate slice. - **Routine Publish is an explicit share.** Member policies, invitations and provisioning accept `publish` only together with `edit` for the same routine; otherwise they return 422 without writes. View and Run stay separate. Preset changes preserve this dependency. Bounded publication archives retain their authority across backup/restore and cannot enter generic runs or triggers. - **Harbor 2: the rail on one axis.** Every icon, the workspace mark, Search, the Crewship sail and your avatar are centred on the same line in the folded and the open rail; icons are 18 px, and the workspace, the sail and you are all 28 px. Search is an icon like any other row in the folded rail and a borderless field in the open one. The open workspace card shows your role under the name. The app list scrolls between a fixed top and foot with a fade at the edge, and groups (Work, Build) fold in the open rail and stay folded on this device. The sail stays Crewship blue in every style. - **The Crewship sail is always in the rail.** It ends the rail, just above the footer's rule, in its own lit blue tile, and stays when the rail folds to icons; the top of the rail is the workspace switcher and Search. It opens **About Crewship**: what Crewship is, the edition and build, and links to the documentation, what's new and reporting a problem. - **Linked issues appear in a new chat without a reload.** After the first message of a new conversation, the chat used to show a bare **Unavailable** line and no linked issue, proposal or decision cards until the page was reloaded; it now checks access as soon as the conversation exists. - **A chat you cannot use says so.** Opening someone else's private chat by its address shows an empty composer, as before (the address alone does not reveal whether it exists). The first send is refused, and the chat now keeps a notice in place: **This conversation isn't available to you**, with **Start a new chat**. Your draft stays in the box. A refused send no longer blames your connection, and **Prepare project inputs** is not offered there. - **Harbor 2 on a phone: Inbox and Settings pilot.** On a phone an Inbox item's header is Back, the item's name in two lines and a ⋯ with Previous, Next, Archive and Mark unread; Back returns to the list with its search, filters and scroll — also after the browser's Back or a reload — and after a direct link it goes to the Inbox, never out of the app. A workspace switch starts the list clean. Active filters get **Clear filters** beside their chips; a search that finds nothing says what and where; a failed load shows Retry in the list. A Settings section is a step in the browser history, so Back returns to the section list and asks first when a form has unsaved edits. Save bars dock on every phone width and ride above the on-screen keyboard; the tab bar steps aside while you type; toasts sit above both. Header buttons are real 44 × 44 targets on touch screens. On the approval detail the decision note sits above the buttons, Approve keeps its size while it works, run steps no longer wrap letter by letter, and denying an approval shows "Denied · stopped" instead of a red failure. - **Animated Voxel avatars, the new default (#3789).** The avatar picker offers DiceBear's **Voxel Bot** and **Voxel Art**, marked New, and new agents start on Voxel Bot — from the dashboard, the CLI, the API or a template. Drawn at 32 px or larger they blink and stretch now and then; smaller ones stay still, and so do all of them with Reduce motion On, with the new **Settings → Appearance → Animated avatars** switch off (on by default, synced with the other appearance choices; per viewer, so a workspace default never sets it), or when the operating system asks for reduced motion. The picker says so in one line when an animated style is chosen. **Existing agents keep their face:** upgrading pins every agent that was drawn with the old default to Bottts Neutral by name (the picker now shows it as Bottts Neutral rather than "Follow the crew"); agents with their own style or a styled crew are untouched. The voxel styles come from DiceBear 10, loaded beside 9.4 only for them (CC0 1.0); the other 25 styles stay on 9.4. Voxel avatars are always drawn live, never stored, and **Store missing avatars** counts them as such. `crewship agent create|update --avatar-style` and `crewship crew apply-avatar-style --style` accept `voxel-bot` and `voxel-art` and list every style in `--help`. ⚠️ **Behaviour change:** an unknown avatar style slug is now refused — `400` from the API, an error from the CLI before anything is sent — instead of being stored and drawn as the default. - **Composer artifact context and conversation library, behind the same flag.** An attached item needs an explicit create, update or reply-only choice, shows executor, location and the real audience before sending, and blocks on an ambiguous target. The library lists only explicitly linked items, with restricted links shown anonymously. Updating an attached document from chat stays disabled until the server confirms the chat's audience (no such signal exists yet); a reply-only or plain message is unaffected. - **Composer artifact context and conversation library, behind the same flag.** An attached item needs an explicit create, update or reply-only choice, shows executor, location and the real audience before sending, and blocks on an ambiguous target. The library lists only explicitly linked items, with restricted links shown anonymously. Updating an attached document from chat stays disabled until the server confirms the chat's audience (no such signal exists yet); a reply-only or plain message is unaffected. - **Chat result cards and viewer switching, behind `NEXT_PUBLIC_CHAT_ARTIFACT_CONTEXT` (off by default).** Result cards report server run state, saved content and freshness separately, and give revoked access, lost connection, unknown result, conflict, stopped run, missing runtime and broken preview each their own next action. The side viewer header switches only between accessible conversation links and keeps an exact revision distinct from an explicit latest. These components are not mounted in this change and no backend serves their endpoints yet. - Stop pending Document journal writers before erasing browser drafts on sign-out or account change, so delayed writes cannot restore private copies. - **Composer artifact context and conversation library, behind the same flag.** An attached item needs an explicit create, update or reply-only choice, shows executor, location and the real audience before sending, and blocks on an ambiguous target. The library lists only explicitly linked items, with restricted links shown anonymously. Updating an attached document from chat stays disabled until the server confirms the chat's audience (no such signal exists yet); a reply-only or plain message is unaffected. - **Chat result cards and viewer switching, behind `NEXT_PUBLIC_CHAT_ARTIFACT_CONTEXT` (off by default).** Result cards report server run state, saved content and freshness separately, and give revoked access, lost connection, unknown result, conflict, stopped run, missing runtime and broken preview each their own next action. The side viewer header switches only between accessible conversation links and keeps an exact revision distinct from an explicit latest. These components are not mounted in this change and no backend serves their endpoints yet. - Stop pending Document journal writers before erasing browser drafts on sign-out or account change, so delayed writes cannot restore private copies. - ⚠️ **Behaviour change: GDPR erasure anonymizes retired credential creators.** Retired credentials no longer require a live custodian; their creator attribution becomes NULL while IDs and audit history remain. Active credentials retain the existing custody requirement, and creatorless tombstones cannot be reactivated. Workspace restore/fork preserves nullable retired creators. - Retain original human authority for targeted Document runs and refuse missing or superseded intent bindings; the chat update entry point remains disabled. - ⚠️ **Behaviour change: credential retirement irreversibly erases vault material.** Existing and newly retired credentials retain their IDs and audit history, while secret/refresh values, account metadata, custom fields and pending OAuth state are cleared, including historical restore/fork imports. Active credentials remain unchanged. Integration removal now rolls back if credential retirement or its audit cannot be completed. - **Chat shows the model the chat is configured to use.** The composer's model control read a path the server never served and always offered a built-in list, silently treating its first entry as selected. It now shows the model the chat run preview reports, lists the provider's models from the server labelled as live or curated, says plainly when the list cannot be loaded, and states that a listed model is not proof of access or of what a run will use. Choosing a model from the list is not offered yet. - **Audit signing keys survive vault-key rotation and instance recovery.** New audit rows identify their signing key; retained keys verify history without rewriting it. The encrypted recovery kit retains the keyring. An explicit OWNER `crewship audit reseal` checkpoint can start a verified continuation while preserving the unverified status of history whose key is missing. - **Slides says a local draft is not saved, in the same words as Document.** With `NEXT_PUBLIC_SLIDES_EDITOR` on, an edited deck reads **Not stored in this browser or on the server · keep this tab open**, and **Saved** with **Confirmed by server** appears only after a receipt for the change that was sent. Document and Slides now share one save lifecycle (save states, a write queue that waits for the receipt and retries the same change, and the leave prompt); Document's save words are unchanged, and nothing changes with the flag off. When access to a Document is removed while edits are unsent, it now says **Your latest edits were not saved: access to this document was removed.** (the unsent edits are still not kept) (#3889). - Preserve Claude Code tool result text and error details in chat and run traces when the CLI returns structured content blocks. - Reject unsupported Document revision selectors instead of silently returning the latest content. Saved checkpoints remain available through their explicit reader. - **Edit a chat's saved document without leaving the chat.** The document panel opened from a result card now has **Edit here**: the body becomes the document's own editor, with its save state and recovery, and **Done editing** shows the saved result. Leaving editing or closing the panel with unsent edits asks first; **Open full editor** still opens the Page in a new tab (#3886). - **The Document save status separates "saved locally" from "confirmed by server".** While work is unsent the header says whether the browser has kept a copy, is still writing it, or could not store it; only a server receipt shows "Confirmed by server". - **Unconfirmed Document edits survive browser reloads.** Pending human edits are retained privately per signed-in user and document before transmission; reopening offers explicit recovery after current access is checked. Unavailable browser storage prevents editing, and restored drafts never replay an old write grant automatically. The browser copy is deleted when access to the document is lost (401, 403, 404) and on sign-out, session expiry or a change of signed-in user, so a shared browser keeps no private text. - **Native Slides can be initialized and read with `crewship slides` when `CREWSHIP_SLIDES_ENABLED` is enabled.** Current custodians can save a schema-1 deck on an empty private Page; exact retries retain the original receipt. Reads check live private access and audit another workspace OWNER before releasing content. Private Pages remain indistinguishable from missing Pages even for malformed requests. The adapter remains disabled by default. - Prepare a client-side mirror of the strict native Slides operation contract (hashes, validation, atomic batch apply and diff-to-patch) with a flagged save client contract; no editor or save route is exposed yet. - Prepare a static App preview boundary with scripts, navigation and external resources disabled, pinned revisions and immediate removal on access loss; it is not mounted in app routes and stays behind `NEXT_PUBLIC_STATIC_APP_PREVIEW` until a Page endpoint serves publication HTML. - **Document history can compare revisions and revert one change; agent proposals can be reviewed.** Compare any retained revision with the last saved version by labelled blocks (unsent edits are not included) (including link and formatting changes), revert a single change as a separate action from restore, and accept or reject a proposal. Compare is always available; revert and proposals stay off behind `NEXT_PUBLIC_DOCUMENT_REVIEW_ACTIONS` until the server endpoints exist. - **Chat search with filters.** The chat sidebar has a search dialog (Ctrl/Cmd+Shift+F) with This chat / All chats / Files tabs and `from:`, `in:`, `has:`, `after:`, `before:` filters. Results open the exact message; `from:` matches only the message's author (agent or an agent's own replies; `from:me` waits for the server to return the author), a full page of 50 says more may exist, a full page narrowed on the client, an unavailable source or an error is shown as such and never as a clean zero. The Ctrl/Cmd+Shift+F shortcut is on for everyone but never fires inside text fields. Files search and room/DM search wait for backend support. - **Chat sidebar views (behind `NEXT_PUBLIC_CHAT_SIDEBAR_VIEWS`, default off).** With the flag on, the chat sidebar has Unreads and Agents running views, and lists hold still under the pointer or keyboard focus: background updates change rows in place and a Refresh button applies new order, while your own actions (search, favourites, opening a row) apply at once. The open chat stays listed, marked "Open chat", when a view would filter it out. Mentions, Threads, Saved, Drafts, Waiting for you and Review are sample-data previews behind `NEXT_PUBLIC_CHAT_SIDEBAR_SMART_SECTIONS`. - Prepare the native Slides editor interactions: select (Shift for several), drag, resize and keyboard-nudge elements, layer commands, undo/redo, empty/loading/error/conflict states and a read-only phone preview. The editor is not mounted yet and edits stay a local draft until the Slides save route exists. - Read and initialize native Slides through the server's `GET .../slides` and `POST .../slides/initialize` contract (behind `CREWSHIP_SLIDES_ENABLED`): the read must name the requested Page in `deck.deck_id` and carry exactly the five documented fields, and an initialize receipt is checked field by field. The Pages route mounts the editor behind `NEXT_PUBLIC_SLIDES_EDITOR`; edits are a labelled local draft because the server has no save route yet. - Prepare a client-side mirror of the strict native Slides operation contract (hashes, validation, atomic batch apply and diff-to-patch) with a proposed save client contract; no editor or save route is exposed yet. - **The Document save status separates "saved locally" from "confirmed by server".** While work is unsent the header says whether the browser has kept a copy, is still writing it, or could not store it; only a server receipt shows "Confirmed by server". - **Unconfirmed Document edits survive browser reloads.** Pending human edits are retained privately per signed-in user and document before transmission; reopening offers explicit recovery after current access is checked. Unavailable browser storage prevents editing, and restored drafts never replay an old write grant automatically. The browser copy is deleted when access to the document is lost (401, 403, 404) and on sign-out, session expiry or a change of signed-in user, so a shared browser keeps no private text. - Prepare the native Slides editor interactions: select (Shift for several), drag, resize and keyboard-nudge elements, layer commands, undo/redo, empty/loading/error/conflict states and a read-only phone preview. The editor is not mounted yet and edits stay a local draft until the Slides save route exists. - Read and initialize native Slides through the server's `GET .../slides` and `POST .../slides/initialize` contract (behind `CREWSHIP_SLIDES_ENABLED`): the read must name the requested Page in `deck.deck_id` and carry exactly the five documented fields, and an initialize receipt is checked field by field. The Pages route mounts the editor behind `NEXT_PUBLIC_SLIDES_EDITOR`; edits are a labelled local draft because the server has no save route yet. - Prepare a client-side mirror of the strict native Slides operation contract (hashes, validation, atomic batch apply and diff-to-patch) with a proposed save client contract; no editor or save route is exposed yet. - Prepare a static App preview boundary with scripts, navigation and external resources disabled, pinned revisions and immediate removal on access loss; it is not mounted in app routes and stays behind `NEXT_PUBLIC_STATIC_APP_PREVIEW` until a Page endpoint serves publication HTML. - **Password changes, HTTP and local CLI password resets, workspace/folder deletion and folder ACL changes fail atomically when their required chained audit cannot be recorded.** Passwords, reset-proof consumption and session/token revocations commit together; existing CLI commands retain their request shapes. Session disconnects are notified only after commit. Workspace deletion and workspace member removal recheck current authority inside the writer transaction. - **Routine schedules say how their last fire ended.** Each schedule in a routine's Triggers tab now ends with "last fire