Repository navigation
feat: add reversible session archiving and list actions - #309
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Too many files changed for review (208 files, 100 file limit). Bypass the limit by tagging |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughThis change adds session archive and unarchive support across storage, APIs, clients, tools, SDKs, and web interfaces. It also adds route-readiness gating for provider HTTP servers. ChangesSession archival
Provider route readiness
Estimated code review effort: 5 (Critical) | ~120 minutes Sequence Diagram(s)sequenceDiagram
participant Client
participant API
participant SessionManager
participant SessionStore
Client->>API: POST archive or unarchive session
API->>SessionManager: Archive or Unarchive(workspaceID, sessionID)
SessionManager->>SessionStore: Read or update ArchivedAt
SessionStore-->>SessionManager: Updated session metadata
SessionManager-->>API: SessionInfo
API-->>Client: SessionPayload with archived_at
sequenceDiagram
participant Provider
participant ProviderHTTPServer
participant Lifecycle
Provider->>ProviderHTTPServer: Start configured routes
ProviderHTTPServer->>Lifecycle: Wait for RoutesReady
Lifecycle-->>ProviderHTTPServer: RoutesReady closes
ProviderHTTPServer-->>Provider: Serve provider request
Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
React Doctor found no new issues. 🎉 Reviewed by React Doctor for commit |
There was a problem hiding this comment.
Actionable comments posted: 13
🧹 Nitpick comments (3)
web/src/systems/agent/components/agent-sessions-list.tsx (1)
222-226: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winUse
Eyebrowfor the archive label.Line 224 renders
"ARCHIVED"directly inPill. Wrap the label withEyebrow, or apply theeyebrowutility class.As per coding guidelines, “Every uppercase label must use
Eyebrowfrom@compozy/uior theeyebrowutility class.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/src/systems/agent/components/agent-sessions-list.tsx` around lines 222 - 226, Update the archived-session label in the session list rendering to use the `Eyebrow` component from `@compozy/ui` or the `eyebrow` utility class around “ARCHIVED,” while preserving the existing `Pill` styling and archive condition.Source: Coding guidelines
internal/api/core/handlers_test.go (1)
385-426: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd
t.Parallelto this subtest.Call
t.Parallel()as the first statement in this subtest. The test fixture is local toTestBaseHandlersSessionEndpoints, and the project test convention requires parallel tests by default.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/api/core/handlers_test.go` around lines 385 - 426, Add t.Parallel() as the first statement inside the “Should archive and restore stopped sessions” subtest, before any requests or fixture usage, while preserving the existing archive and unarchive assertions.Sources: Coding guidelines, Path instructions
internal/tools/builtin/builtin_test.go (1)
358-358: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick winAssert the
archiveschema instead of raw JSON text.The
strings.Containscheck does not prove thatarchiveis a string enum withexclude,only, andinclude. Decode the input schema and assert the property type and exact enum values.As per path instructions, tests must verify behavior outcomes with meaningful assertions.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/tools/builtin/builtin_test.go` at line 358, Replace the raw JSON strings.Contains check in the sessionList schema assertions with decoded-schema assertions: verify the archive property is a string and its enum exactly contains exclude, only, and include. Keep the test focused on the observable InputSchema behavior and use meaningful assertions for both type and allowed values.Source: Path instructions
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@internal/api/core/session_workspace_internal_test.go`:
- Around line 233-241: Wrap the archive error mapping loop in
statusForSessionError tests with a named subtest using t.Run("Should map archive
errors to conflict", ...), keeping the existing assertions and error cases
unchanged.
In `@internal/bridgesdk/provider_http_test.go`:
- Around line 114-119: Update the NewProviderHTTPServer test case for missing
routes readiness to assert the specific error “bridgesdk: provider http routes
readiness is required” (or verify the corresponding sentinel with errors.Is)
instead of only checking that an error was returned; preserve the existing
failure message for a nil error.
In `@internal/bridgesdk/provider_http.go`:
- Around line 95-103: Update ProviderHTTPServer.serveWhenRoutesReady to also
select on a server-owned shutdown signal, and close or cancel that signal from
ProviderHTTPServer.Shutdown. When shutdown occurs before RoutesReady, return the
existing service-unavailable response promptly; preserve the current route-ready
and request-context behavior, and add coverage with RoutesReady left open.
In `@internal/cli/client_test.go`:
- Around line 2016-2025: The added archive lifecycle and archive query tests are
not organized as required named subtests. Update the relevant test functions
around the archive response cases and the additional locations to use t.Run with
“Should...” names, keeping lifecycle assertions together in one subtest and
query serialization assertions in a separate subtest.
In `@internal/cli/session_test.go`:
- Around line 778-820: Wrap each affected test case in a named t.Run subtest
using a “Should …” name, retaining t.Parallel() inside each independent subtest:
internal/cli/session_test.go lines 778-820 for archive/unarchive behavior, lines
822-836 for conflicting archive-filter validation, lines 752-761 for the
server-owned page-filter case, and internal/store/globaldb/global_db_test.go
line 2871 for the schema-column case. No direct changes are required outside
these test cases.
In `@internal/daemon/daemon_test.go`:
- Around line 1352-1364: Update the “Should reject session archive operations
when source does not support them” test around archiveManager.Archive to also
invoke Unarchive, and assert both operations return the specific
unsupported-operation error using the project’s required error assertion style,
such as ErrorContains or ErrorAs, rather than only checking that an error is
non-nil.
In `@internal/extension/host_api_test.go`:
- Around line 528-595: Wrap the archive round-trip body in
internal/extension/host_api_test.go:528-595 with t.Run("Should archive and
unarchive a stopped session", ...). In
internal/daemon/native_tools_test.go:5978-6000, split the archive test cases
into separate named subtests t.Run("Should archive a session", ...) and
t.Run("Should unarchive a session", ...), preserving each case’s existing
assertions and behavior.
In `@internal/session/manager_resume.go`:
- Around line 27-33: Unify Archive and Resume behind one atomic transition guard
so archive cannot proceed after Resume enters beginSessionResume. Update
Archive’s StateStopped validation and Resume’s
requireSessionUnarchived/resumeLifecycle.runs flow to use the same
synchronization boundary, preserving valid state checks. Add a concurrent
archive/resume test covering this race.
In `@internal/store/globaldb/global_db_session_archive.go`:
- Around line 52-63: Make archive and restore updates idempotent: in the session
archive update query in internal/store/globaldb/global_db_session_archive.go
around lines 52-63, require archived_at IS NULL when archiving and archived_at
IS NOT NULL when restoring, preserving the existing re-read path when no row
changes; in internal/session/manager_transition_test.go around lines 533-539,
return current when archived already matches current.ArchivedAt before assigning
a new timestamp.
In `@internal/tools/builtin/builtin_test.go`:
- Around line 169-174: Replace the loop in the archive schema test with separate
t.Run("Should...") subtests for ToolIDSessionArchive and ToolIDSessionUnarchive.
Call t.Parallel() within each subtest, then invoke
assertSessionTargetMutationSchema with the corresponding descriptor so failures
identify the affected tool.
In `@internal/tools/builtin/sessions_archive.go`:
- Line 36: Update sessionArchiveDescriptor() and sessionUnarchiveDescriptor() to
assign a SessionStatus-compatible output schema instead of
sessionCreateOutputSchema. Ensure the schema exposes archived_at and the other
fields expected by the SDK SessionStatus contract while preserving the existing
archive and unarchive behavior.
In `@web/src/systems/session/components/session-delete-dialog.tsx`:
- Around line 33-34: Update the Dialog onOpenChange handling in the delete
dialog component to ignore close requests while isDeleting is true, including
Escape and outside-pointer events, while preserving normal onOpenChange behavior
when deletion is not pending.
In `@web/src/systems/session/hooks/use-session-actions.ts`:
- Around line 97-121: Update the mutationFn implementations in useArchiveSession
and useUnarchiveSession to accept the mutation context’s default AbortSignal and
pass it to archiveSession and unarchiveSession, preserving workspace resolution
and session IDs. Ensure the API calls receive that signal so cancellation
propagates through the mutation lifecycle; update onSettled only if required by
the resulting abort handling.
---
Nitpick comments:
In `@internal/api/core/handlers_test.go`:
- Around line 385-426: Add t.Parallel() as the first statement inside the
“Should archive and restore stopped sessions” subtest, before any requests or
fixture usage, while preserving the existing archive and unarchive assertions.
In `@internal/tools/builtin/builtin_test.go`:
- Line 358: Replace the raw JSON strings.Contains check in the sessionList
schema assertions with decoded-schema assertions: verify the archive property is
a string and its enum exactly contains exclude, only, and include. Keep the test
focused on the observable InputSchema behavior and use meaningful assertions for
both type and allowed values.
In `@web/src/systems/agent/components/agent-sessions-list.tsx`:
- Around line 222-226: Update the archived-session label in the session list
rendering to use the `Eyebrow` component from `@compozy/ui` or the `eyebrow`
utility class around “ARCHIVED,” while preserving the existing `Pill` styling
and archive condition.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 235a3f02-46cf-4b23-b0d0-ed730191e9d3
⛔ Files ignored due to path filters (42)
docs/articles/2026-05/03-one-daemon-four-surfaces.mdxis excluded by!**/*.mdxdocs/qa/_seeds/feature-stories/01_analysis_runtime-sessions.mdis excluded by!**/*.mddocs/qa/_seeds/final-qa/_children/03-acp-sessions.mdis excluded by!**/*.mddocs/qa/_seeds/final-qa/_children/11-api-cli-parity.mdis excluded by!**/*.mddocs/qa/_seeds/final-qa/_children/13-docs-site.mdis excluded by!**/*.mddocs/qa/_seeds/qa-e2e-playbook.mdis excluded by!**/*.mddocs/qa/bugs/BUG-20260805-archived-detail-unarchive-missing.mdis excluded by!**/*.mddocs/qa/bugs/BUG-20260805-session-archive-sdk-missing.mdis excluded by!**/*.mddocs/qa/charters/CH-archive-session-catalog.mdis excluded by!**/*.mddocs/qa/charters/CH-archive-session-structured-parity.mdis excluded by!**/*.mddocs/qa/charters/CH-session-row-open-canary.mdis excluded by!**/*.mddocs/qa/journeys/J-archive-session-without-deleting.mdis excluded by!**/*.mddocs/qa/reports/2026-08-04-session-archive.mdis excluded by!**/*.mddocs/qa/scenarios/ET-web-sessions-catalog-modal.mdis excluded by!**/*.mddocs/qa/scenarios/RT-011.mdis excluded by!**/*.mddocs/qa/scenarios/RT-012.mdis excluded by!**/*.mddocs/qa/scenarios/RT-014.mdis excluded by!**/*.mddocs/qa/scenarios/RT-082.mdis excluded by!**/*.mddocs/qa/scenarios/RT-session-archive-catalog.mdis excluded by!**/*.mddocs/qa/scenarios/RT-session-list-row-actions.mdis excluded by!**/*.mdinternal/codegen/hostapi/catalog.jsonis excluded by!**/*.jsoninternal/store/globaldb/schema/migrations/atlas.sumis excluded by!**/*.sum,!**/*.suminternal/tools/builtin/testdata/native-tool-catalog.jsonis excluded by!**/*.jsonopenapi/compozy.jsonis excluded by!**/*.jsonpackages/site/content/docs/cli/session/archive.mdxis excluded by!**/*.mdxpackages/site/content/docs/cli/session/index.mdxis excluded by!**/*.mdxpackages/site/content/docs/cli/session/list.mdxis excluded by!**/*.mdxpackages/site/content/docs/cli/session/meta.jsonis excluded by!**/*.jsonpackages/site/content/docs/cli/session/unarchive.mdxis excluded by!**/*.mdxpackages/site/content/docs/extensions/permissions.mdxis excluded by!**/*.mdxpackages/site/content/docs/operations/database.mdxis excluded by!**/*.mdxpackages/site/content/docs/operations/troubleshooting.mdxis excluded by!**/*.mdxpackages/site/content/docs/sessions/index.mdxis excluded by!**/*.mdxpackages/site/content/docs/sessions/lifecycle.mdxis excluded by!**/*.mdxsdk/typescript/src/generated/contracts.tsis excluded by!**/generated/**,!**/generated/**skills/compozy/references/extension-authoring.mdis excluded by!**/*.mdskills/compozy/references/native-tools.mdis excluded by!**/*.mdskills/compozy/references/runtime-operations.mdis excluded by!**/*.mdweb/src/generated/compozy-openapi.d.tsis excluded by!**/generated/**,!**/generated/**,!**/*.d.tsweb/src/systems/agent/components/stories/agent-sessions-list.stories.tsxis excluded by!**/*.stories.tsxweb/src/systems/os/components/stories/attention-surfaces.stories.tsxis excluded by!**/*.stories.tsxweb/src/systems/os/components/stories/os-menubar.stories.tsxis excluded by!**/*.stories.tsx
📒 Files selected for processing (143)
extensions/bridges/discord/discord_runtime.goextensions/bridges/gchat/gchat_runtime.goextensions/bridges/github/provider.goextensions/bridges/linear/provider.goextensions/bridges/slack/provider.goextensions/bridges/teams/teams_runtime.goextensions/bridges/telegram/telegram_runtime.goextensions/bridges/whatsapp/provider.gointernal/api/contract/session_runtime_payloads.gointernal/api/core/conversions.gointernal/api/core/handlers_test.gointernal/api/core/interfaces.gointernal/api/core/session_archive.gointernal/api/core/session_catalog.gointernal/api/core/session_manager_stub_test.gointernal/api/core/session_workspace.gointernal/api/core/session_workspace_internal_test.gointernal/api/core/test_helpers_test.gointernal/api/httpapi/handlers_test.gointernal/api/httpapi/session_routes.gointernal/api/spec/registry_session_archive.gointernal/api/spec/registry_session_attach.gointernal/api/spec/registry_sessions.gointernal/api/spec/session_catalog.gointernal/api/testutil/session_stub.gointernal/api/testutil/session_stub_archive.gointernal/api/udsapi/handlers_test.gointernal/api/udsapi/session_routes.gointernal/bridgesdk/provider_http.gointernal/bridgesdk/provider_http_test.gointernal/cli/client_session_api.gointernal/cli/client_sessions.gointernal/cli/client_test.gointernal/cli/helpers_test.gointernal/cli/session_archive.gointernal/cli/session_catalog_client.gointernal/cli/session_command.gointernal/cli/session_list.gointernal/cli/session_test.gointernal/daemon/daemon_test.gointernal/daemon/host_api_session_adapter.gointernal/daemon/native_session_archive.gointernal/daemon/native_session_list.gointernal/daemon/native_tool_binding_groups.gointernal/daemon/native_tools_test.gointernal/extension/contract/host_api.gointernal/extension/contract/host_api_method_aliases_gen.gointernal/extension/contract/host_api_method_registry_core_gen.gointernal/extension/contract/host_api_results.gointernal/extension/contract/permissions.gointernal/extension/host_api.gointernal/extension/host_api_memory_document.gointernal/extension/host_api_methods.gointernal/extension/host_api_session_archive_filter.gointernal/extension/host_api_sessions.gointernal/extension/host_api_test.gointernal/extension/host_api_workspace_binding.gointernal/extensionprotocol/host_api_methods_gen.gointernal/extensionprotocol/host_api_test.gointernal/mcp/serve_projection_decisions.gointernal/session/agent_metrics.gointernal/session/archive.gointernal/session/catalog_page.gointernal/session/manager_resume.gointernal/session/manager_transition.gointernal/session/manager_transition_test.gointernal/session/query.gointernal/session/query_test.gointernal/session/session.gointernal/session/session_info.gointernal/store/globaldb/global_db_session.gointernal/store/globaldb/global_db_session_agent_metrics.gointernal/store/globaldb/global_db_session_archive.gointernal/store/globaldb/global_db_session_index_test.gointernal/store/globaldb/global_db_session_page.gointernal/store/globaldb/global_db_session_scan.gointernal/store/globaldb/global_db_session_test.gointernal/store/globaldb/global_db_test.gointernal/store/globaldb/queries/session_core.sqlinternal/store/globaldb/schema/definitions/20_sessions.sqlinternal/store/globaldb/schema/migrations/00053_schema.sqlinternal/store/globaldb/sqlcgen/models.gointernal/store/globaldb/sqlcgen/session_core.sql.gointernal/store/session_catalog.gointernal/store/session_catalog_page.gointernal/store/types_session.gointernal/toolmeta/native_entries.gointernal/toolmeta/registry_test.gointernal/tools/builtin/builtin_test.gointernal/tools/builtin/sessions.gointernal/tools/builtin/sessions_archive.gointernal/tools/builtin/toolsets.gointernal/tools/builtin_ids.gosdk/go/contracts/host_contracts_gen.gosdk/go/contracts/host_methods_gen.gosdk/go/contracts/types_020_gen.gosdk/go/host_api.gosdk/go/runtime_contract_test.gosdk/typescript/src/__tests__/host-api.test.tssdk/typescript/src/host-api.tsweb/src/hooks/routes/__tests__/use-session-page-controls.test.tsxweb/src/hooks/routes/use-session-page-controls.tsweb/src/routes/_app/__tests__/-agent-session-deeplink.router.integration.test.tsxweb/src/systems/agent/components/__tests__/agent-sessions-list.test.tsxweb/src/systems/agent/components/agent-sessions-list.tsxweb/src/systems/agent/components/agent-sessions-tab.tsxweb/src/systems/agent/hooks/__tests__/use-agent-sessions.test.tsxweb/src/systems/agent/hooks/use-agent-sessions.tsweb/src/systems/agent/lib/__tests__/fleet-signals.test.tsweb/src/systems/agent/routes/agent-detail-story-fixtures.tsweb/src/systems/network/mocks/fixtures.tsweb/src/systems/os/apps/agents/__tests__/use-agent-detail.test.tsxweb/src/systems/os/apps/agents/agent-detail-location.tsxweb/src/systems/os/apps/agents/use-agent-detail.tsweb/src/systems/os/apps/session/session-window-content.tsxweb/src/systems/os/apps/session/session-window-dialogs.tsxweb/src/systems/os/apps/session/use-session-window-controller.tsxweb/src/systems/os/components/__tests__/os-window-deck.test.tsxweb/src/systems/os/components/__tests__/sessions-modal.test.tsxweb/src/systems/os/components/desktop-shell.tsxweb/src/systems/os/components/sessions-modal.tsxweb/src/systems/os/hooks/__tests__/use-os-attention.test.tsxweb/src/systems/os/hooks/use-os-attention.tsweb/src/systems/os/lib/__tests__/attention-model.test.tsweb/src/systems/session/adapters/__tests__/session-api.test.tsweb/src/systems/session/adapters/session-api.tsweb/src/systems/session/adapters/session-archive-api.tsweb/src/systems/session/components/session-delete-dialog.tsxweb/src/systems/session/components/session-row-actions.tsxweb/src/systems/session/components/session-status-line.tsxweb/src/systems/session/hooks/__tests__/use-session-actions.test.tsxweb/src/systems/session/hooks/__tests__/use-session-create-dialog.test.tsxweb/src/systems/session/hooks/__tests__/use-session-topbar-slot.test.tsxweb/src/systems/session/hooks/__tests__/use-sessions.test.tsxweb/src/systems/session/hooks/use-session-actions.tsweb/src/systems/session/hooks/use-session-lifecycle-actions.tsweb/src/systems/session/hooks/use-session-topbar-slot.tsxweb/src/systems/session/index.tsweb/src/systems/session/lib/session-list-query.tsweb/src/systems/session/lib/session-running.tsweb/src/systems/session/mocks/fixtures.tsweb/src/systems/session/mocks/handlers.tsweb/src/systems/workspace/mocks/fixtures.ts
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@internal/bridgesdk/provider_http_test.go`:
- Around line 144-146: Add an exact response-body assertion alongside the status
check in the affected HTTP test, verifying the shutdown path returns "provider
routes are not ready\n" and failing when it differs; keep the existing
StatusServiceUnavailable assertion unchanged.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 7fcd8c3c-e467-4d03-8c31-7baa5b3b459b
⛔ Files ignored due to path filters (5)
docs/qa/bugs/BUG-20260805-session-delete-dialog-disappears.mdis excluded by!**/*.mddocs/qa/reports/2026-08-05-session-archive-coderabbit.mdis excluded by!**/*.mddocs/qa/scenarios/ET-web-sessions-catalog-modal.mdis excluded by!**/*.mddocs/qa/scenarios/RT-session-list-row-actions.mdis excluded by!**/*.mdinternal/tools/builtin/testdata/native-tool-catalog.jsonis excluded by!**/*.json
📒 Files selected for processing (23)
internal/api/core/session_workspace_internal_test.gointernal/bridgesdk/provider_http.gointernal/bridgesdk/provider_http_test.gointernal/cli/client_test.gointernal/cli/session_test.gointernal/daemon/daemon_test.gointernal/daemon/native_tools_test.gointernal/extension/host_api_test.gointernal/session/archive.gointernal/session/manager_resume.gointernal/session/manager_transition_test.gointernal/store/globaldb/global_db_session_archive.gointernal/store/globaldb/global_db_test.gointernal/tools/builtin/builtin_test.gointernal/tools/builtin/sessions_archive.goweb/src/systems/os/components/__tests__/sessions-modal.test.tsxweb/src/systems/os/components/desktop-shell.tsxweb/src/systems/os/components/sessions-modal.tsxweb/src/systems/session/components/__tests__/session-delete-dialog.test.tsxweb/src/systems/session/components/session-delete-dialog.tsxweb/src/systems/session/hooks/__tests__/use-session-actions.test.tsxweb/src/systems/session/hooks/use-session-actions.tsweb/src/systems/session/hooks/use-session-lifecycle-actions.ts
🚧 Files skipped from review as they are similar to previous changes (13)
- internal/api/core/session_workspace_internal_test.go
- internal/extension/host_api_test.go
- web/src/systems/session/components/session-delete-dialog.tsx
- internal/session/manager_resume.go
- internal/cli/session_test.go
- internal/tools/builtin/builtin_test.go
- web/src/systems/os/components/desktop-shell.tsx
- internal/daemon/native_tools_test.go
- internal/cli/client_test.go
- internal/daemon/daemon_test.go
- web/src/systems/session/hooks/use-session-lifecycle-actions.ts
- web/src/systems/os/components/sessions-modal.tsx
- internal/session/archive.go
114e0da to
2e97535
Compare
Summary
Changes
archived_atmetadata with append-only migration00053; archive is idempotent, stopped-only, and separate from runtime state.archive=exclude|only|includewith defaultexclude, exact filtered totals, cursor fingerprints, and archived-row exclusion from normal metrics.compozy session archive|unarchive, list flags, native tools, extension Host API methods, and typed Go/TypeScript SDK helpers.Release Notes
🎉 Features
🧪 Testing
Migration
00053_schema.sql; existing migrations are unchanged.archived_atis nullable.QA
Final Status: PASS — all seven affected scenarios are terminal and the strict evidence audit has zero blockers and zero warnings.
Coverage: Three personas walked the catalog, structured-parity, and direct-open journeys across Web, CLI, HTTP, UDS, native tools, a live extension Host API client, daemon restart, and cross-workspace rejection.
Issues: 2 (Blocks-Completion: 0, Data-Loss: 0, Trust-Damage: 0, Friction: 2, Cosmetic: 0), both fixed and verified:
BUG-20260805-session-archive-sdk-missingBUG-20260805-archived-detail-unarchive-missingVisual evidence: Four deterministic Storybook captures were inspected at desktop and narrow widths for both list surfaces; no clipping, blocked controls, or unresolved structural mismatch remained. Run-scratch PNGs stay in the isolated QA lab and are indexed by the report.
Blocked / needs human: None.
Full report:
2026-08-04-session-archive.mdCompozy Impact Audit
compozy__session_archiveandcompozy__session_unarchive, descriptors, schemas, toolset bindings, availability metadata, registry fixtures, and archived list filtering.session.write; no lifecycle hook, sidecar, registry type, orconfig.tomlkey changes.archived_atis session data owned inside one workspace. Store, manager, HTTP/UDS, CLI, native-tool, Host API, Web query/cache, and catalog-stream paths preserveworkspace_id; cross-workspace reads and writes return not found.Test plan
make gate-full— fullmake verifypassed for fingerprint19bb305b9414a085cfbf5bceaddd997943bc374e(.cache/gate/logs/full-1785904840.log).teardown.jsonrecordsclean: true.Summary by CodeRabbit