Skip to content

feat: memory v2#108

Merged
pedronauck merged 5 commits into
mainfrom
memv2
May 6, 2026
Merged

feat: memory v2#108
pedronauck merged 5 commits into
mainfrom
memv2

Conversation

@pedronauck
Copy link
Copy Markdown
Member

@pedronauck pedronauck commented May 6, 2026

Summary by CodeRabbit

  • New Features

    • Full Memory v2 API: create/edit/delete, search, reindex, promote, reset, reload, decisions, recall traces
    • Memory dreams, extractors, providers, session ledger & replay, ad‑hoc notes
    • CLI: richer memory commands, JSONL output, scope/agent-tier display
    • SSE/event scrubbing to avoid leaking memory context
  • Tests

    • Extensive Memory v2 contract, route parity, hygiene, and integration tests
  • Chores

    • Migrated to contract-based memory surface and reworked memory configuration and server wiring

@pedronauck pedronauck self-assigned this May 6, 2026
@vercel
Copy link
Copy Markdown

vercel Bot commented May 6, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agh-site Ready Ready Preview, Comment May 6, 2026 5:33pm

Request Review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 6, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b9446270-b1c8-43a7-8071-15049204c3af

📥 Commits

Reviewing files that changed from the base of the PR and between e505801 and 739337d.

⛔ Files ignored due to path filters (38)
  • .codex/ledger/2026-05-06-MEMORY-memory-llm-mode.md is excluded by !**/*.md
  • .codex/ledger/2026-05-06-MEMORY-memv2-real-qa.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-INT-001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-INT-002.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-INT-003.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-INT-004.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-INT-005.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-REG-001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-SCEN-001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-SCEN-002.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-SEC-001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-UI-001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-UI-002.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-UI-003.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-plans/memory-v2-regression.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-plans/memory-v2-test-plan.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-plans/memory-v2-traceability.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_002.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_003.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_004.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_005.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_006.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_007.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_008.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_009.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_010.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_011.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_012.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_013.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_014.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_002.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_003.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_004.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_005.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_006.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_007.md is excluded by !**/*.md
📒 Files selected for processing (41)
  • go.mod
  • internal/api/contract/contract_test.go
  • internal/api/contract/memory.go
  • internal/api/contract/settings.go
  • internal/api/core/conversions.go
  • internal/api/core/error_paths_test.go
  • internal/api/core/errors.go
  • internal/api/core/handlers.go
  • internal/api/core/interfaces.go
  • internal/api/core/memory.go
  • internal/api/core/memory_services_test.go
  • internal/api/core/memory_workspace_test.go
  • internal/api/core/more_coverage_test.go
  • internal/api/core/prompt_stream.go
  • internal/api/core/settings.go
  • internal/api/core/settings_internal_test.go
  • internal/api/core/settings_test.go
  • internal/api/core/sse.go
  • internal/api/core/sse_hygiene_test.go
  • internal/api/core/test_helpers_test.go
  • internal/api/httpapi/handlers.go
  • internal/api/httpapi/handlers_test.go
  • internal/api/httpapi/httpapi_integration_test.go
  • internal/api/httpapi/memory_test.go
  • internal/api/httpapi/routes.go
  • internal/api/httpapi/server.go
  • internal/api/httpapi/shared_test.go
  • internal/api/spec/spec.go
  • internal/api/spec/spec_test.go
  • internal/api/testutil/memory_routes.go
  • internal/api/udsapi/handlers_test.go
  • internal/api/udsapi/memory_test.go
  • internal/api/udsapi/routes.go
  • internal/api/udsapi/server.go
  • internal/api/udsapi/shared_test.go
  • internal/api/udsapi/udsapi_integration_test.go
  • internal/cli/client.go
  • internal/cli/client_test.go
  • internal/cli/config.go
  • internal/cli/format.go
  • internal/cli/helpers_test.go

Walkthrough

This PR implements Memory v2 across the codebase: it adds a large public memory contract (types/payloads), expands memory configuration, introduces three memory service interfaces (extractor, providers, session ledger), wires memory services through handlers/servers/daemon boot, updates SSE scrubbing for memory content, migrates many tests to the new memcontract surface, and extends CLI, OpenAPI, and HTTP/UDS routes for the new memory API.

Changes

Memory v2 Contract and Configuration

Layer / File(s) Summary
Data Shape / Contract Types
internal/api/contract/memory.go, internal/api/contract/settings.go, go.mod
Adds comprehensive Memory v2 contract types (many enums and payload structs) and moves Settings memory payloads to the contract; adds direct dependency github.com/oklog/ulid v1.3.1. SettingsMemoryWorkspacePayload changed to TOMLPath/AutoCreate.
Configuration Defaults & Validation
internal/config/config.go, internal/config/memory_v2_config_test.go, internal/config/bootstrap.go, internal/config/bootstrap_test.go
Introduces DefaultMemoryConfig and nested builders; expands MemoryConfig shape; switches Validate() to pointer receiver and adds detailed nested validation; updates default dream agent constant and adds migration test.
Config Merge & Tool Surface
internal/config/merge.go, internal/config/tool_surface.go, internal/config/tool_surface_test.go
Expands memory overlay types and applies them in overlay merging; exposes many memory.* keys to mutable config; refactors trust-root checks into specialized helpers.

API Core Services and Wiring

Layer / File(s) Summary
Service Interfaces
internal/api/core/interfaces.go
Adds MemoryExtractorService, MemoryProviderService, and MemorySessionLedgerService public interfaces.
Handler Configuration / Defaults
internal/api/core/handlers.go
Extends BaseHandlerConfig/BaseHandlers with memory service fields and introduces normalizeBaseHandlerConfig for defaults.
Memory Conversion / Shapes
internal/api/core/memory.go
Adopts memcontract types for memory shapes, extends MemoryLocation with workspace/agent fields, and adds wrappers: ResolveMemoryWriteScope, ParseOptionalMemoryScope, MemoryHealthWorkspaces. Payload constructors updated to accept []memcontract.OperationRecord.
Settings Payload Construction
internal/api/core/settings.go, internal/api/core/settings_test.go
Refactors memory config-from-payload into modular helpers (memoryControllerConfigFromPayload, memoryExtractorConfigFromPayload, etc.) and switches to pointer-based handling for safe nil checks.
SSE and Event Scrubbing
internal/api/core/conversions.go, internal/api/core/sse.go, internal/api/core/prompt_stream.go, internal/api/core/sse_hygiene_test.go
Adds memory-context scrubbing for SSE/events via ssepkg calls; Content and Summary are scrubbed before emission; tests added.
Contract Tests
internal/api/contract/contract_test.go
Adds TestMemoryV2PublicContractJSONShape and assertJSONFieldAbsent helper to validate exposed shapes and hard cuts.

HTTP/UDS API Endpoints and OpenAPI

Layer / File(s) Summary
Route Definitions
internal/api/httpapi/routes.go, internal/api/udsapi/routes.go, internal/api/core/test_helpers_test.go
Expands /api/memory surface with many v2 endpoints (create POST /api/memory, PATCH edits, search, reindex, promote, reset, reload, decisions, recall traces, dreams, extractor/provider controls, session ledger endpoints, ad-hoc notes); removes legacy PUT/consolidate endpoints.
Handler Implementations & Server Wiring
internal/api/httpapi/handlers.go, internal/api/httpapi/server.go, internal/api/udsapi/server.go, internal/api/core/memory_services_test.go
Wires memory services into handlers; adds server options WithMemoryExtractorService, WithMemoryProviderService, WithMemorySessionLedgerService; adds tests with stub services for extractor/provider/ledger handlers.
OpenAPI / Route Parity
internal/api/spec/spec.go, internal/api/spec/spec_test.go, internal/api/testutil/memory_routes.go
OpenAPI updated to reflect memcontract enums and Memory v2 endpoints; new contract-focused spec test validates presence/absence of endpoints; utilities added to assert route parity.

API Tests, Integration and Shared Utilities

Layer / File(s) Summary
API Tests Migration
internal/api/core/*_test.go, internal/api/httpapi/*_test.go, internal/api/udsapi/*_test.go
Migrates tests to memcontract types and new v2 request/response shapes; updates write/read flows to use MemoryCreateRequest and MemoryEntryResponse; adds tests for promotion, decision listing/revert, recall traces, daily logs, extractor failures, provider ops, dream triggers.
Integration Tests
internal/api/httpapi/httpapi_integration_test.go, internal/api/udsapi/udsapi_integration_test.go, internal/daemon/daemon_memory_e2e_integration_test.go
Integrates Memory v2 workflows (write/search/dream-trigger) into integration tests; refactors helpers and payload builders for new contract surface.
Shared Test Utilities
internal/api/httpapi/shared_test.go, internal/api/udsapi/shared_test.go
Adds type aliases for new memory responses and updates helper signatures to return memcontract.Scope.

Daemon Boot and Runtime Integration

Layer / File(s) Summary
Boot Sequence
internal/daemon/boot.go, internal/daemon/daemon_test.go
Adds bootMemoryPromptProvider, bootMemorySessionRuntime, and bootRuntimeResourceGraph; initializes memory store, provider registry, and ledger materializer during boot; extends SessionManagerDeps and extensionManagerDeps.
Runtime Wiring
internal/daemon/daemon.go, internal/daemon/boundary.go
Extends RuntimeDeps with memory store/services/provider registry and ledger; wires memory services into HTTP/UDS servers; observer integration includes memory event source; adds import boundary checks for memory contract.

CLI Surface and Client

Layer / File(s) Summary
DaemonClient and CLI Types
internal/cli/client.go, internal/cli/client_test.go
Adds many CLI type aliases mapping to contract types and extends DaemonClient with 30+ memory operations (List, Show, Create, Edit, Delete, Search, Reindex, Promote, Reset, Reload, decisions, dreams, extractor/provider ops, session ledger ops, ad-hoc notes).
CLI Commands and Output
internal/cli/memory.go, internal/cli/format.go, internal/cli/memory_test.go
Adds promotion selector parsing, agent-tier-aware scope labels, JSONL output support, expanded health/list/history formats, and a large test suite covering memory commands and flows.
CLI Config
internal/cli/config.go, internal/cli/helpers_test.go
Expands memory-related config mutation keys and updates test stub client to include the new memory methods; removes legacy ConsolidateMemory.

SDK / Codegen

Layer / File(s) Summary
Type Mapping for Codegen
internal/codegen/sdkts/generate.go
Updates generator to use memcontract types for memory enums and adds new enum values (e.g., TypeFeedback, TypeReference, ScopeAgent).

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant HTTPAPI
    participant Core
    participant Store

    rect rgba(100, 150, 200, 0.5)
        Note over Client,HTTPAPI: Memory Create Flow
        Client->>HTTPAPI: POST /api/memory (MemoryCreateRequest)
        HTTPAPI->>Core: WriteMemory handler
        Core->>Store: Create entry (scope/workspace/agent)
        Store-->>Core: MemoryMutationDecisionResponse
        Core-->>HTTPAPI: Decision response
        HTTPAPI-->>Client: Applied=true + metadata
    end
Loading
sequenceDiagram
    participant Client
    participant HTTPAPI
    participant Core
    participant Store

    rect rgba(150, 100, 200, 0.5)
        Note over Client,HTTPAPI: Memory Search Flow
        Client->>HTTPAPI: POST /api/memory/search (MemorySearchRequest)
        HTTPAPI->>Core: SearchMemory handler
        Core->>Store: Recall query (weights/topk)
        Store-->>Core: MemorySearchResponse (results)
        Core-->>HTTPAPI: Ranked results
        HTTPAPI-->>Client: Search results
    end
Loading
sequenceDiagram
    participant Client
    participant HTTPAPI
    participant Core
    participant Extractor
    participant Providers

    rect rgba(100, 200, 150, 0.5)
        Note over Client,HTTPAPI: Dream Trigger Flow
        Client->>HTTPAPI: POST /api/memory/dreams/trigger
        HTTPAPI->>Core: TriggerMemoryDream handler
        Core->>Providers: Check/select provider
        Core->>Extractor: Check extractor status
        Extractor-->>Core: Status
        Providers-->>Core: Provider selection
        Core-->>HTTPAPI: MemoryDreamTriggerResponse
        HTTPAPI-->>Client: Trigger result
    end
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • compozy/agh#108: Another implementation of Memory v2 surface and wiring touching the same contract, core, daemon, CLI, and tests.
  • compozy/agh#35: Overlapping memory subsystem changes (search/reindex, memory DTOs, handlers).
  • compozy/agh#37: Related changes to settings contract surface that intersect memory settings types.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 13

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
internal/cli/client_test.go (1)

3297-3315: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

This parity check marshals the same type twice.

sharedMemoryRequest is inferred as MemoryCreateRequest, so this comparison can never catch drift from contract.MemoryCreateRequest.

💡 Suggested fix
-	var sharedMemoryRequest = memoryRequest
+	var sharedMemoryRequest contract.MemoryCreateRequest = memoryRequest
🤖 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/cli/client_test.go` around lines 3297 - 3315, The test currently
marshals the same local type twice (MemoryCreateRequest) so it cannot detect
drift against the contract type; change the second instance to explicitly use
the contract type (e.g., memcontract.MemoryCreateRequest) for
sharedMemoryRequest, populate its fields to match the CLI MemoryCreateRequest,
then json.Marshal that contract instance and compare cliMemoryJSON to
sharedMemoryJSON (variables cliMemoryJSON/sharedMemoryJSON) to validate parity.
internal/api/core/memory_workspace_test.go (1)

356-377: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Close recall signal recorders for the manual stores too.

These two tests call Search() on stores that never get CloseRecallSignalRecorders(). Since setup() needed explicit cleanup for the same lifecycle, these cases can still leak goroutines/file handles and make the suite flaky under parallel runs.

Suggested fix
 		store := memory.NewStore(
 			filepath.Join(baseDir, "global"),
 			memory.WithCatalogDatabasePath(filepath.Join(baseDir, "agh.db")),
 		).ForWorkspace(workspace)
+		t.Cleanup(func() {
+			ctx, cancel := context.WithTimeout(context.Background(), time.Second)
+			defer cancel()
+			if err := store.CloseRecallSignalRecorders(ctx); err != nil {
+				t.Fatalf("CloseRecallSignalRecorders() error = %v", err)
+			}
+		})
 		if err := store.EnsureDirs(); err != nil {
 			t.Fatalf("EnsureDirs() error = %v", err)
 		}

Apply the same cleanup in both manual-store test setups.

Also applies to: 409-429

🤖 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/memory_workspace_test.go` around lines 356 - 377, The tests
create manual stores via memory.NewStore(...).ForWorkspace(workspace) and call
EnsureDirs/Write/Search but never call CloseRecallSignalRecorders(), which can
leak goroutines/handles; fix by adding a deferred cleanup (prefer t.Cleanup) to
invoke store.CloseRecallSignalRecorders() (and Close if applicable) after setup
in the test that uses ForWorkspace(workspace) and repeat the same change for the
other manual-store test (the one around the other block mentioned), ensuring the
recorder is closed regardless of test outcome.
internal/api/udsapi/udsapi_integration_test.go (1)

335-353: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Assert the workspace identifier passed into the dream trigger.

This route test only checks calls == 1, while integrationDreamTrigger.Trigger drops the workspace argument. The test will still pass if /api/memory/dreams/trigger forwards the wrong identifier type or no identifier at all, which leaves the new Memory v2 contract path effectively unverified.

Suggested fix
 func TestUDSMemoryRoundTripAndConsolidate(t *testing.T) {
 	runtime := newIntegrationRuntime(t)
+
+	resolveResp := mustUnixRequest(
+		t,
+		runtime.client,
+		http.MethodPost,
+		"http://unix/api/workspaces/resolve",
+		[]byte(`{"path":"`+runtime.workspace+`"}`),
+		nil,
+	)
+	if resolveResp.StatusCode != http.StatusOK {
+		body, _ := io.ReadAll(resolveResp.Body)
+		_ = resolveResp.Body.Close()
+		t.Fatalf("resolve workspace status = %d, want %d; body=%s", resolveResp.StatusCode, http.StatusOK, string(body))
+	}
+	var resolved contract.WorkspaceResponse
+	decodeHTTPJSON(t, resolveResp, &resolved)

 	writeResp := mustUnixRequest(
 		t,
 		runtime.client,
@@
 	resp := mustUnixRequest(
 		t,
 		runtime.client,
 		http.MethodPost,
 		"http://unix/api/memory/dreams/trigger",
-		[]byte(`{"workspace_id":"`+runtime.workspace+`"}`),
+		[]byte(`{"workspace_id":"`+resolved.Workspace.ID+`"}`),
 		nil,
 	)
@@
-	if !payload.Triggered || runtime.dream.calls != 1 {
+	if !payload.Triggered || runtime.dream.calls != 1 || runtime.dream.workspaceID != resolved.Workspace.ID {
 		t.Fatalf("payload = %#v dream.calls=%d, want triggered once", payload, runtime.dream.calls)
 	}
 }

 type integrationDreamTrigger struct {
 	enabled   bool
 	triggered bool
 	reason    string
 	last      time.Time
 	calls     int
+	workspaceID string
 }
@@
-func (t *integrationDreamTrigger) Trigger(context.Context, string) (bool, string, error) {
+func (t *integrationDreamTrigger) Trigger(_ context.Context, workspaceID string) (bool, string, error) {
 	t.calls++
+	t.workspaceID = workspaceID
 	return t.triggered, t.reason, nil
 }
As per coding guidelines, "MUST test meaningful business logic, not trivial operations".

Also applies to: 2557-2559

🤖 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/udsapi/udsapi_integration_test.go` around lines 335 - 353, The
test currently only asserts runtime.dream.calls but doesn't verify the workspace
id sent; update the test after decodeHTTPJSON to also assert that the fake
handler received the expected workspace by comparing
runtime.dream.<field-that-records-workspace> (or add such a field to
integrationDreamTrigger.Trigger if missing) against runtime.workspace, e.g. fail
the test if they differ, and keep the existing assertions on payload. Ensure you
reference the runtime.dream recorder used by the fake Trigger implementation so
the test fails when the route forwards the wrong or missing workspace
identifier.
🧹 Nitpick comments (1)
internal/daemon/boot.go (1)

1867-1872: 💤 Low value

Conditional assignment can be simplified

The assignment pattern on lines 1869-1872 can be simplified. The explicit nil assignment before the conditional is unnecessary since Go initializes pointers to nil by default.

♻️ Simplified assignment
 d.memoryExtractor = state.memoryExtractor
-d.localMemoryProvider = nil
-if state.localMemoryProvider != nil {
-	d.localMemoryProvider = state.localMemoryProvider
-}
+d.localMemoryProvider = state.localMemoryProvider
🤖 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/daemon/boot.go` around lines 1867 - 1872, The code redundantly sets
d.localMemoryProvider = nil before conditionally assigning
state.localMemoryProvider; simplify by removing the explicit nil and directly
assign d.localMemoryProvider = state.localMemoryProvider (leave the existing
assignments to d.memoryProviderRegistry and d.memoryExtractor unchanged) so the
pointer is set correctly in one statement using the unique symbols
d.localMemoryProvider and state.localMemoryProvider.
🤖 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/contract/memory.go`:
- Around line 503-507: The MemoryProviderLifecycleRequest struct currently
contains Name and Reason which allows two different identifiers for the same
lifecycle call; remove the Name field from MemoryProviderLifecycleRequest so
lifecycle requests only carry Reason (and rely on the provider path/ID from
routing/client surface), then update all handlers and callers that previously
read MemoryProviderLifecycleRequest.Name (e.g., your enable/disable provider
handlers and any client code constructing this request) to use the route/path
provider identifier instead; also update tests and any JSON serialization
expectations accordingly.

In `@internal/api/contract/settings.go`:
- Around line 348-350: The SettingsMemoryWorkspacePayload struct change removed
legacy fields (enabled, global_dir, dream) and will break clients; restore
backward compatibility by either (A) adding the old fields back into
SettingsMemoryWorkspacePayload (enabled bool, global_dir string, dream string)
alongside the new TOMLPath and AutoCreate so deserialization preserves both
shapes, or (B) introduce a versioned envelope struct (e.g., SettingsWorkspaceV1
and SettingsWorkspaceV2) and update the API handler/serializer to emit a version
tag and marshal/unmarshal the appropriate struct; locate the
SettingsMemoryWorkspacePayload type and the related serializer/deserializer code
paths to implement one of these options.

In `@internal/api/core/memory_services_test.go`:
- Around line 54-79: The tests call performRequest and immediately decode bodies
(variables failuresResp, retryResp, drainResp) which can mask HTTP errors;
before decoding each response for the memory extractor endpoints
("/memory/extractor/failures", "/memory/extractor/retry",
"/memory/extractor/drain") assert resp.Code == http.StatusOK (use the response
objects failuresResp, retryResp, drainResp) and fail the test if not OK, then
proceed to decode into contract.MemoryExtractorFailuresResponse,
contract.MemoryExtractorRetryResponse and contract.MemoryExtractorDrainResponse;
apply the same pattern to the other test blocks referenced (lines ~95-121 and
~152-170) so every handler call checks status code before decoding.

In `@internal/api/httpapi/httpapi_integration_test.go`:
- Around line 3434-3441: The test builds JSON request bodies via string
concatenation (see the mustHTTPRequest call that injects runtime.workspace and
other variables), which breaks on Windows (backslashes) and with quotes/newlines
in message; instead, create a Go value (struct or map) for the request body,
marshal it with json.Marshal, and pass the resulting bytes to mustHTTPRequest;
update the two occurrences referenced (around the mustHTTPRequest that posts to
"/api/sessions" and the other block at lines ~3555-3562) to use e.g. a
map{"agent_name": "coder", "workspace_path": runtime.workspace} and json.Marshal
so inputs are properly escaped.
- Around line 1574-1596: The test currently only checks for HTTP 401 but not the
response payload; update the invalid webhook assertion to read and decode the
response body from invalidResp (use io.ReadAll on invalidResp.Body and close
it), unmarshal the JSON into the project's error response shape (or a small
local struct with fields like Code and Message), and assert that the error
payload indicates a signature-validation failure (e.g., error code/message
referencing invalid webhook signature) for the request sent with
core.WebhookSignatureHeader = "sha256=deadbeef"; keep the status code assertion
and add explicit checks on the decoded fields to ensure the contract for
signature validation is enforced.
- Around line 1254-1271: The test currently only checks payload.Triggered and
runtime.dream.calls, which lets a handler ignore workspace_id; modify the POST
to include the scope/workspace in the JSON (add "scope" or "workspace_id" field
alongside workspace_id already present), extend memoryDreamTriggerResponse (or
inspect the decoded payload) to include the returned scope field if the endpoint
echoes it, and update the dream stub used by runtime.dream to record the
workspace argument it received (add a recordedWorkspace field or similar) so the
test can assert that runtime.dream.recordedWorkspace == runtime.workspace; keep
the existing checks for payload.Triggered and runtime.dream.calls but add an
explicit equality assertion for the recorded workspace to ensure the correct
target was triggered.

In `@internal/api/udsapi/routes.go`:
- Around line 278-310: Add a backward-compatibility path: keep the current new
handlers but add aliases that preserve the old unversioned endpoints and/or
introduce a versioned prefix for the new surface. Concretely, create a v2 group
(e.g., memoryV2) and move the new handlers (ReadMemory, WriteMemory,
SearchMemory, ReindexMemory, PromoteMemory, EditMemory, DeleteMemory, etc.)
under "/v2/memory"; then add compatibility routes on the original unversioned
group that map the legacy endpoints to the appropriate current handlers — e.g.,
register PUT("/:filename") to the handler that previously served file writes
(WriteMemory or EditMemory as appropriate), GET("/search") -> SearchMemory, and
POST("/consolidate") -> ReindexMemory (or the exact handler that implements
consolidation), so existing clients keep working while new clients use
/v2/memory during the migration window.

In `@internal/api/udsapi/udsapi_integration_test.go`:
- Around line 2942-2948: The helpers createIntegrationSession and sendPrompt
currently construct request bodies by concatenating strings (e.g., embedding
runtime.workspace or the prompt directly into JSON) and ignore response
read/close errors; replace hand-built JSON with proper encoding using
encoding/json (marshal a struct or map) when building the POST body in
mustUnixRequest calls inside createIntegrationSession and sendPrompt to ensure
proper quoting/escaping, and ensure all response bodies are closed and
io.ReadAll errors are checked and returned/handled (do not use blank identifier
for errors) so callers receive and can assert on real errors.

In `@internal/cli/client_test.go`:
- Around line 1376-1398: The stub responses for ShowMemory, CreateMemory,
DeleteMemory, and TriggerMemoryDream must validate incoming request shape;
update the matching cases in internal/cli/client_test.go to assert the query
params and JSON body fields (e.g., for ShowMemory ensure
req.URL.Query().Get("scope") and workspace_id when required; for CreateMemory
parse req.Body and assert required fields like frontmatter.name/type, scope,
workspace_id or content; for DeleteMemory assert scope query equals "workspace"
already shown and add any required workspace_id; for TriggerMemoryDream parse
body and assert scope and workspace_id/payload fields). Use the existing pattern
(read and decode req.Body, compare values and call t.Fatalf on mismatch)
consistent with the SearchMemory/ReindexMemory assertions to make the tests fail
on regressions.

In `@internal/cli/memory.go`:
- Line 1000: The variable fromDLQ is being captured but then suppressed with a
blank identifier assignment (`_ = fromDLQ`), leaving an incomplete
implementation; remove the dummy assignment and either use the fromDLQ flag in
the memory command flow (e.g., pass it into the function that lists/filters
memories or DLQ handling logic where flags like fromDLQ were intended) or, if
the flag is not needed, remove its capture/definition entirely (search for the
fromDLQ variable and the surrounding flag parsing/handler code to apply the
fix).
- Line 552: The includeSystem boolean flag is captured but then discarded with
`_ = includeSystem`; either remove the flag registration entirely or actually
use includeSystem when querying/filtering memories. Locate the flag variable
`includeSystem` and either delete its declaration and any flag registration
code, or thread it into the memory listing/query call (e.g., pass
`includeSystem` into the function that fetches memories such as the memory
query/list function) and ensure the query logic respects the flag to include or
exclude system memories.

In `@internal/config/bootstrap.go`:
- Around line 57-61: The migration only handles empty or legacy ("claude")
values; extend the condition that sets dreamAgent so it also treats the old
bootstrap-managed agent value as needing migration: when
current.Memory.Dream.Agent is empty, equals legacyDreamAgentName, or equals the
previous bootstrap agent constant (e.g. DefaultAgentName), set dreamAgent =
DefaultMemoryDreamAgentName; update the conditional around
current.Memory.Dream.Agent/dreamAgent in bootstrap.go accordingly.

In `@internal/config/config.go`:
- Around line 1944-1950: validateEnum currently lowercases/trims the input for
validation but leaves the original value in configs, causing downstream exact
comparisons to fail; change validateEnum to return the canonicalized value along
with error (signature like validateEnum(path string, value string, allowed
...string) (string, error)) and have the function normalize
(strings.ToLower/strings.TrimSpace) and return that normalized string when
validation passes, or return an error for invalid input; update all callers to
assign the returned canonical value into the config fields (or alternatively
enforce canonical literals by comparing against the provided allowed slice
without lowercasing and return an explicit error), ensuring the config stores
the normalized/canonical enum rather than the original input.

---

Outside diff comments:
In `@internal/api/core/memory_workspace_test.go`:
- Around line 356-377: The tests create manual stores via
memory.NewStore(...).ForWorkspace(workspace) and call EnsureDirs/Write/Search
but never call CloseRecallSignalRecorders(), which can leak goroutines/handles;
fix by adding a deferred cleanup (prefer t.Cleanup) to invoke
store.CloseRecallSignalRecorders() (and Close if applicable) after setup in the
test that uses ForWorkspace(workspace) and repeat the same change for the other
manual-store test (the one around the other block mentioned), ensuring the
recorder is closed regardless of test outcome.

In `@internal/api/udsapi/udsapi_integration_test.go`:
- Around line 335-353: The test currently only asserts runtime.dream.calls but
doesn't verify the workspace id sent; update the test after decodeHTTPJSON to
also assert that the fake handler received the expected workspace by comparing
runtime.dream.<field-that-records-workspace> (or add such a field to
integrationDreamTrigger.Trigger if missing) against runtime.workspace, e.g. fail
the test if they differ, and keep the existing assertions on payload. Ensure you
reference the runtime.dream recorder used by the fake Trigger implementation so
the test fails when the route forwards the wrong or missing workspace
identifier.

In `@internal/cli/client_test.go`:
- Around line 3297-3315: The test currently marshals the same local type twice
(MemoryCreateRequest) so it cannot detect drift against the contract type;
change the second instance to explicitly use the contract type (e.g.,
memcontract.MemoryCreateRequest) for sharedMemoryRequest, populate its fields to
match the CLI MemoryCreateRequest, then json.Marshal that contract instance and
compare cliMemoryJSON to sharedMemoryJSON (variables
cliMemoryJSON/sharedMemoryJSON) to validate parity.

---

Nitpick comments:
In `@internal/daemon/boot.go`:
- Around line 1867-1872: The code redundantly sets d.localMemoryProvider = nil
before conditionally assigning state.localMemoryProvider; simplify by removing
the explicit nil and directly assign d.localMemoryProvider =
state.localMemoryProvider (leave the existing assignments to
d.memoryProviderRegistry and d.memoryExtractor unchanged) so the pointer is set
correctly in one statement using the unique symbols d.localMemoryProvider and
state.localMemoryProvider.
🪄 Autofix (Beta)

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

Run ID: 3210468e-ba9d-4b11-ab7c-65a749a27f57

📥 Commits

Reviewing files that changed from the base of the PR and between fd13867 and 2909c5d.

⛔ Files ignored due to path filters (80)
  • internal/memory/prompts/what_not_to_save.v1.md is excluded by !**/*.md
  • internal/skills/bundled/skills/agh-memory-guide/SKILL.md is excluded by !**/*.md
  • internal/testutil/acpmock/testdata/bridge_ingress_fixture.json is excluded by !**/*.json
  • internal/testutil/acpmock/testdata/browser_session_lifecycle_fixture.json is excluded by !**/*.json
  • internal/testutil/acpmock/testdata/driver_fault_fixture.json is excluded by !**/*.json
  • internal/testutil/acpmock/testdata/permission_env_fixture.json is excluded by !**/*.json
  • internal/testutil/acpmock/testdata/tool_permission_fixture.json is excluded by !**/*.json
  • openapi/agh.json is excluded by !**/*.json
  • packages/site/content/runtime/api-reference/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/agh.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/adhoc/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/adhoc/list.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/adhoc/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/memory/adhoc/show.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/daily/archive.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/daily/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/daily/ls.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/daily/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/memory/daily/purge.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/daily/restore.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/daily/show.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/decisions/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/decisions/list.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/decisions/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/memory/decisions/revert.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/decisions/show.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/delete.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/dream/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/dream/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/memory/dream/retry.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/dream/show.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/dream/status.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/dream/trigger.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/edit.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/extractor/disable.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/extractor/drain.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/extractor/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/extractor/list-pending.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/extractor/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/memory/extractor/replay.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/extractor/status.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/health.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/history.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/list.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/memory/promote.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/provider/disable.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/provider/enable.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/provider/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/provider/list.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/provider/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/memory/recall/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/recall/meta.json is excluded by !**/*.json
  • packages/site/content/runtime/cli-reference/memory/recall/trace.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/reindex.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/reload.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/reset.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/scope-show.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/search.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/show.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/memory/write.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/observe/events.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/cli-reference/task/run/enqueue.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/configuration/config-toml.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/configuration/file-locations.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/extensions/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/hooks/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/memory/best-practices.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/memory/dream.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/memory/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/memory/scopes.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/memory/system.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/sessions/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/skills/bundled.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/tools/index.mdx is excluded by !**/*.mdx
  • packages/site/content/runtime/core/workspaces/resolver.mdx is excluded by !**/*.mdx
  • sdk/typescript/src/generated/contracts.ts is excluded by !**/generated/**
  • web/src/generated/agh-openapi.d.ts is excluded by !**/generated/**
📒 Files selected for processing (220)
  • go.mod
  • internal/api/contract/contract_test.go
  • internal/api/contract/memory.go
  • internal/api/contract/settings.go
  • internal/api/core/conversions.go
  • internal/api/core/error_paths_test.go
  • internal/api/core/errors.go
  • internal/api/core/handlers.go
  • internal/api/core/interfaces.go
  • internal/api/core/memory.go
  • internal/api/core/memory_services_test.go
  • internal/api/core/memory_workspace_test.go
  • internal/api/core/more_coverage_test.go
  • internal/api/core/prompt_stream.go
  • internal/api/core/settings.go
  • internal/api/core/settings_internal_test.go
  • internal/api/core/settings_test.go
  • internal/api/core/sse.go
  • internal/api/core/sse_hygiene_test.go
  • internal/api/core/test_helpers_test.go
  • internal/api/httpapi/handlers.go
  • internal/api/httpapi/handlers_test.go
  • internal/api/httpapi/httpapi_integration_test.go
  • internal/api/httpapi/memory_test.go
  • internal/api/httpapi/routes.go
  • internal/api/httpapi/server.go
  • internal/api/httpapi/shared_test.go
  • internal/api/spec/spec.go
  • internal/api/spec/spec_test.go
  • internal/api/testutil/memory_routes.go
  • internal/api/udsapi/handlers_test.go
  • internal/api/udsapi/memory_test.go
  • internal/api/udsapi/routes.go
  • internal/api/udsapi/server.go
  • internal/api/udsapi/shared_test.go
  • internal/api/udsapi/transport_parity_integration_test.go
  • internal/api/udsapi/udsapi_integration_test.go
  • internal/cli/client.go
  • internal/cli/client_test.go
  • internal/cli/config.go
  • internal/cli/format.go
  • internal/cli/helpers_test.go
  • internal/cli/memory.go
  • internal/cli/memory_test.go
  • internal/codegen/sdkts/generate.go
  • internal/config/bootstrap.go
  • internal/config/bootstrap_test.go
  • internal/config/config.go
  • internal/config/config_test.go
  • internal/config/memory_v2_config_test.go
  • internal/config/merge.go
  • internal/config/tool_surface.go
  • internal/config/tool_surface_test.go
  • internal/daemon/boot.go
  • internal/daemon/boundary.go
  • internal/daemon/daemon.go
  • internal/daemon/daemon_memory_e2e_integration_test.go
  • internal/daemon/daemon_test.go
  • internal/daemon/hooks_bridge.go
  • internal/daemon/memory_runtime.go
  • internal/daemon/native_tools.go
  • internal/daemon/native_tools_test.go
  • internal/daemon/notifier_test.go
  • internal/daemon/prompt_input_composite_test.go
  • internal/daemon/settings.go
  • internal/extension/contract/host_api.go
  • internal/extension/contract/sdk.go
  • internal/extension/host_api.go
  • internal/extension/host_api_bridges.go
  • internal/extension/host_api_test.go
  • internal/extension/memory_provider_registry.go
  • internal/extension/memory_provider_registry_test.go
  • internal/fileutil/atomic.go
  • internal/fileutil/atomic_memv2_test.go
  • internal/hooks/async_clone.go
  • internal/hooks/dispatch.go
  • internal/hooks/dispatch_events.go
  • internal/hooks/events.go
  • internal/hooks/events_test.go
  • internal/hooks/hooks_test.go
  • internal/hooks/introspection.go
  • internal/hooks/matcher.go
  • internal/hooks/payloads.go
  • internal/hooks/payloads_test.go
  • internal/memory/assembler.go
  • internal/memory/assembler_test.go
  • internal/memory/catalog.go
  • internal/memory/consolidation/runtime.go
  • internal/memory/consolidation/runtime_test.go
  • internal/memory/contract/contract_test.go
  • internal/memory/contract/doc.go
  • internal/memory/contract/enums.go
  • internal/memory/contract/types.go
  • internal/memory/controller/controller.go
  • internal/memory/controller/controller_test.go
  • internal/memory/decision.go
  • internal/memory/document.go
  • internal/memory/dream.go
  • internal/memory/dream_test.go
  • internal/memory/dream_v2.go
  • internal/memory/extractor/events.go
  • internal/memory/extractor/inbox.go
  • internal/memory/extractor/runtime.go
  • internal/memory/extractor/runtime_test.go
  • internal/memory/extractor_events.go
  • internal/memory/extractor_events_test.go
  • internal/memory/interfaces_test.go
  • internal/memory/observability.go
  • internal/memory/observability_test.go
  • internal/memory/perf_bench_test.go
  • internal/memory/prompts/decide.v1.tmpl
  • internal/memory/prompts/doc.go
  • internal/memory/prompts/dream.v1.tmpl
  • internal/memory/prompts/extract.v1.tmpl
  • internal/memory/prompts/registry.go
  • internal/memory/prompts/registry_test.go
  • internal/memory/provider/local/memstore/memstore.go
  • internal/memory/provider/local/memstore/memstore_test.go
  • internal/memory/provider/local/provider.go
  • internal/memory/provider/local/provider_test.go
  • internal/memory/query_records.go
  • internal/memory/recall.go
  • internal/memory/recall/recall.go
  • internal/memory/recall/recall_test.go
  • internal/memory/recall/signal_recorder.go
  • internal/memory/recall/signal_recorder_test.go
  • internal/memory/recall_source.go
  • internal/memory/recall_test.go
  • internal/memory/replay.go
  • internal/memory/scan/doc.go
  • internal/memory/scan/scan.go
  • internal/memory/scan/scan_test.go
  • internal/memory/snapshot.go
  • internal/memory/store.go
  • internal/memory/store_memv2_test.go
  • internal/memory/store_test.go
  • internal/memory/types.go
  • internal/observe/observer.go
  • internal/observe/observer_test.go
  • internal/observe/query.go
  • internal/resources/kernel.go
  • internal/resources/kernel_test.go
  • internal/session/hooks.go
  • internal/session/interfaces.go
  • internal/session/ledger.go
  • internal/session/ledger_test.go
  • internal/session/manager.go
  • internal/session/manager_hooks.go
  • internal/session/manager_hooks_test.go
  • internal/session/manager_lifecycle.go
  • internal/session/manager_prompt.go
  • internal/session/query.go
  • internal/session/query_test.go
  • internal/session/spawn.go
  • internal/session/spawn_test.go
  • internal/sessions/ledger/materializer.go
  • internal/sessions/ledger/materializer_test.go
  • internal/settings/sections.go
  • internal/settings/service_test.go
  • internal/skills/registry.go
  • internal/sse/decode_test.go
  • internal/sse/scrub.go
  • internal/store/globaldb/global_db.go
  • internal/store/globaldb/global_db_heartbeat_test.go
  • internal/store/globaldb/global_db_observe.go
  • internal/store/globaldb/global_db_soul_test.go
  • internal/store/globaldb/global_db_test.go
  • internal/store/globaldb/global_db_workspace.go
  • internal/store/memv2_coverage_test.go
  • internal/store/schema.go
  • internal/store/sessiondb/session_db.go
  • internal/store/sessiondb/session_db_extra_test.go
  • internal/store/store_helpers_test.go
  • internal/store/types.go
  • internal/store/workspacedb/workspace_db.go
  • internal/store/workspacedb/workspace_db_test.go
  • internal/store/write.go
  • internal/store/write_test.go
  • internal/testutil/acpmock/cmd/acpmock-driver/main.go
  • internal/testutil/acpmock/cmd/acpmock-driver/main_test.go
  • internal/testutil/acpmock/fixture.go
  • internal/testutil/acpmock/fixture_test.go
  • internal/tools/builtin/builtin_test.go
  • internal/tools/builtin/memory.go
  • internal/tools/builtin/toolsets.go
  • internal/tools/builtin_ids.go
  • internal/tools/dispatch.go
  • internal/tools/native.go
  • internal/tools/reason.go
  • internal/tools/tool.go
  • internal/workspace/clone.go
  • internal/workspace/helpers.go
  • internal/workspace/identity.go
  • internal/workspace/identity_test.go
  • internal/workspace/resolver.go
  • internal/workspace/resolver_crud.go
  • internal/workspace/resolver_test.go
  • internal/workspace/workspace.go
  • internal/workspace/workspace_test.go
  • magefile.go
  • packages/site/components/landing/__tests__/landing.test.tsx
  • packages/site/components/landing/memory-dream-section.tsx
  • packages/site/lib/memory-v2-qa-artifacts.test.ts
  • packages/site/lib/runtime-docs-discovery.test.ts
  • packages/site/lib/runtime-docs-truth.test.ts
  • packages/site/lib/runtime-manual-cli-examples.test.ts
  • packages/site/scripts/generate-openapi.ts
  • packages/ui/src/components/stories/accordion.stories.tsx
  • sdk/typescript/src/integration.test.ts
  • sdk/typescript/vitest.config.ts
  • web/e2e/bridges.spec.ts
  • web/src/hooks/routes/use-knowledge-page.test.tsx
  • web/src/hooks/routes/use-knowledge-page.ts
  • web/src/hooks/routes/use-settings-memory-page.test.tsx
  • web/src/hooks/routes/use-settings-memory-page.ts
  • web/src/lib/memory-api-contract.test.ts
  • web/src/routes/_app/-agents.$name.sessions.$id.test.tsx
  • web/src/routes/_app/-knowledge.test.tsx
  • web/src/routes/_app/agents.$name.sessions.$id.tsx
  • web/src/routes/_app/knowledge.tsx

Comment thread internal/api/contract/memory.go
Comment thread internal/api/contract/settings.go
Comment thread internal/api/core/memory_services_test.go
Comment thread internal/api/httpapi/httpapi_integration_test.go Outdated
Comment thread internal/api/httpapi/httpapi_integration_test.go Outdated
Comment thread internal/cli/client_test.go
Comment thread internal/cli/memory.go Outdated
Comment thread internal/cli/memory.go Outdated
Comment thread internal/config/bootstrap.go
Comment thread internal/config/config.go Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
internal/config/config.go (1)

1613-1618: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add NaN and infinity checks to float64 threshold validations.

NaN and Inf slip through the current checks because IEEE-754 comparison semantics make all ordering comparisons (<, >, <=, >=) return false when either operand is NaN. This lets invalid config pass validation and corrupt downstream scoring and scheduling logic.

Two vulnerable fields need protection:

  • MinHours (float64) in DreamConfig.Validate(): line 1614 check should verify finiteness
  • MinScore (float64) in MemoryDreamGatesConfig.Validate(): line 1830 check should verify finiteness

The codebase already has a validateWeight() helper (line 1962) that implements the correct pattern; use it for MinScore. For MinHours, add explicit math.IsNaN() and math.IsInf() checks before the range check.

Suggested fix
 func (c DreamConfig) Validate() error {
 	if !c.Enabled {
 		return nil
 	}
 	if strings.TrimSpace(c.Agent) == "" {
 		return errors.New("memory.dream.agent is required")
 	}
-	if c.MinHours <= 0 {
-		return fmt.Errorf("memory.dream.min_hours must be positive: %v", c.MinHours)
+	if math.IsNaN(c.MinHours) || math.IsInf(c.MinHours, 0) || c.MinHours <= 0 {
+		return fmt.Errorf("memory.dream.min_hours must be positive and finite: %v", c.MinHours)
 	}
 func (c MemoryDreamGatesConfig) Validate() error {
 	if c.MinUnpromoted <= 0 {
 		return fmt.Errorf("memory.dream.gates.min_unpromoted must be positive: %d", c.MinUnpromoted)
 	}
 	if c.MinRecallCount <= 0 {
 		return fmt.Errorf("memory.dream.gates.min_recall_count must be positive: %d", c.MinRecallCount)
 	}
-	if c.MinScore < 0 || c.MinScore > 1 {
-		return fmt.Errorf("memory.dream.gates.min_score must be between 0 and 1: %v", c.MinScore)
+	if err := validateWeight("memory.dream.gates.min_score", c.MinScore); err != nil {
+		return err
 	}
 	return nil
 }
🤖 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/config/config.go` around lines 1613 - 1618, The MinHours float
validation in DreamConfig.Validate currently only checks <=0 and misses NaN/Inf;
update DreamConfig.Validate to first check math.IsNaN(c.MinHours) ||
math.IsInf(c.MinHours, 0) and return an error if so, then perform the existing
<=0 range check on c.MinHours; for MinScore in MemoryDreamGatesConfig.Validate,
replace the manual numeric check with a call to the existing
validateWeight(name, value) helper (or call
validateWeight("memory.dream.min_score", c.MinScore)) so NaN/Inf and range are
handled consistently via validateWeight.
internal/cli/client_test.go (1)

3320-3338: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use an explicit shared-contract value in this parity check.

sharedMemoryRequest := memoryRequest marshals the CLI type twice, so this stays green even if MemoryCreateRequest drifts from contract.MemoryCreateRequest.

💡 Minimal fix
-	var sharedMemoryRequest = memoryRequest
+	sharedMemoryRequest := contract.MemoryCreateRequest{
+		Scope:       memoryRequest.Scope,
+		WorkspaceID: memoryRequest.WorkspaceID,
+		Type:        memoryRequest.Type,
+		Name:        memoryRequest.Name,
+		Content:     memoryRequest.Content,
+	}
As per coding guidelines "MUST test meaningful business logic, not trivial operations".
🤖 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/cli/client_test.go` around lines 3320 - 3338, The test currently
assigns sharedMemoryRequest := memoryRequest which just copies the CLI type and
makes the JSON parity check vacuous; instead construct an explicit
shared-contract instance (e.g. memcontract.MemoryCreateRequest) with the same
field values as the CLI MemoryCreateRequest and marshal that for comparison.
Update the code to build a memcontract.MemoryCreateRequest (setting Scope,
WorkspaceID, Type, Name, Content to the same values) into sharedMemoryRequest,
marshal it to sharedMemoryJSON, and then keep the bytes.Equal assertion to
ensure real parity between the CLI type (MemoryCreateRequest) and the shared
contract type (memcontract.MemoryCreateRequest).
🧹 Nitpick comments (1)
internal/cli/memory.go (1)

47-57: ⚡ Quick win

Preserve agent tier in memory search output.

memorySearchItem drops AgentTier, and the renderers print string(item.Scope). That makes agent:workspace and agent:global results both show up as just agent, unlike the other memory commands.

Suggested fix
 type memorySearchItem struct {
 	Filename      string            `json:"filename"`
 	Name          string            `json:"name"`
 	Type          memcontract.Type  `json:"type"`
 	Scope         memcontract.Scope `json:"scope"`
+	AgentTier     memcontract.AgentTier `json:"agent_tier,omitempty"`
 	Score         float64           `json:"score"`
 	Snippet       string            `json:"snippet,omitempty"`
 	WhyRecalled   []string          `json:"why_recalled,omitempty"`
 	ShadowedBy    string            `json:"shadowed_by,omitempty"`
 	AlreadyShown  bool              `json:"already_shown"`
 	StalenessNote string            `json:"staleness_banner,omitempty"`
 }
@@
 		items = append(items, memorySearchItem{
 			Filename:      result.Memory.Filename,
 			Name:          result.Memory.Name,
 			Type:          result.Memory.Type,
 			Scope:         result.Memory.Scope,
+			AgentTier:     result.Memory.AgentTier,
 			Score:         result.Score,
 			Snippet:       result.Snippet,
 			WhyRecalled:   result.WhyRecalled,
 			ShadowedBy:    result.ShadowedBy,
 			AlreadyShown:  result.AlreadyShown,
@@
 		func(item memorySearchItem) []string {
 			return []string{
 				stringOrDash(item.Filename),
 				stringOrDash(item.Name),
-				stringOrDash(string(item.Scope)),
+				stringOrDash(memoryScopeLabel(item.Scope, item.AgentTier)),
 				fmt.Sprintf("%.2f", item.Score),
 				stringOrDash(item.Snippet),
 			}
 		},
 		func(item memorySearchItem) []string {
-			return []string{item.Filename, item.Name, string(item.Scope), fmt.Sprintf("%.2f", item.Score), item.Snippet}
+			return []string{
+				item.Filename,
+				item.Name,
+				memoryScopeLabel(item.Scope, item.AgentTier),
+				fmt.Sprintf("%.2f", item.Score),
+				item.Snippet,
+			}
 		},
 	)

Also applies to: 1500-1539

🤖 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/cli/memory.go` around lines 47 - 57, The memorySearchItem struct
drops AgentTier which causes agent-scoped results to render identically; add an
AgentTier field (use the existing memcontract.AgentTier type or string) to
memorySearchItem and populate it where items are constructed, then update the
renderers that currently call string(item.Scope) to include/format
item.AgentTier when Scope==memcontract.ScopeAgent (or always include AgentTier
for agent scopes) so results show agent:workspace vs agent:global correctly;
update any JSON tags (e.g., `agent_tier` or `agent_tier,omitempty`) to match
existing conventions.
🤖 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/memory.go`:
- Around line 75-83: ListMemory currently always returns system memories; update
it (and the corresponding show handler) to honor the include_system flag by
reading the query param (or the flag set by memorySelectorFromQuery) and
filtering out entries whose name starts with "_system" when include_system is
false. Concretely: in BaseHandlers.ListMemory (and the memory show handler) use
the selector returned by memorySelectorFromQuery or c.Query("include_system") to
determine include_system, call listMemoryHeaders as you already do, then if
include_system is false remove any headers with names starting with "_system"
before converting with memorySummaryPayloads and returning; ensure the same
check is applied in the single-memory show path so system-managed entries are
only returned when include_system is true.
- Around line 1549-1567: memoryRecallStoreForSelector currently calls
store.ForWorkspace(resolved.Workspace) and store.ForAgent(...) whenever
resolved.Workspace or resolved.AgentName are set, which incorrectly routes
explicit global selectors into a workspace-local store; update the logic after
resolveMemorySelector so you only call ForWorkspace when resolved.Workspace is
non-empty AND not equal to the global sentinel (e.g., "global"), and only call
ForAgent when resolved.AgentName is non-empty AND not equal to the agent-global
sentinel (e.g., "global"); keep using resolved.WorkspaceID/resolved.AgentTier as
before but guard the ForWorkspace and ForAgent calls against the global values
to preserve true global scope.

In `@internal/api/httpapi/httpapi_integration_test.go`:
- Around line 81-92: The test currently only checks statusResp.StatusCode after
calling mustHTTPRequest for GET "/api/daemon/status" and immediately closes
statusResp.Body, so it doesn't validate the JSON payload; update the test in
httpapi_integration_test.go to read and decode statusResp.Body (from the
mustHTTPRequest call using runtime.client and runtime.host/runtime.port) into a
struct/map and assert that the response contains a "daemon" field (and any
expected subfields) before closing the body; use the existing statusResp
variable and fail the test with t.Fatalf or t.Errorf if decoding fails or the
"daemon" field is missing/incorrect.
- Around line 1282-1283: The test references memcontract.ScopeWorkspace but the
package is not imported; add an import for the memcontract package in
internal/api/httpapi/httpapi_integration_test.go (so memcontract.ScopeWorkspace
can be resolved) — update the import block that contains the test functions
(where runtime.workspace and payload.Dream are used) to include the memcontract
package name.

In `@internal/cli/memory.go`:
- Around line 1010-1035: The --timeout flag is only validated but not applied;
update newMemoryExtractorDrainCommand to parse timeoutRaw into a time.Duration,
derive a timed context via context.WithTimeout(ctx, duration) (remember to defer
cancel()), and pass that timed context to client.DrainMemoryExtractor instead of
cmd.Context(); keep validating the parse error as already done and ensure the
default "60s" is honored when timeoutRaw is empty or whitespace. Reference
symbols: newMemoryExtractorDrainCommand, timeoutRaw,
client.DrainMemoryExtractor, cmd.Context(), and the deferred cancel for the
created context.

In `@internal/config/config.go`:
- Around line 1679-1710: The validator currently normalizes origins for checking
but leaves MemoryControllerPolicyConfig.AllowOrigins unchanged, causing later
exact-match checks to fail; change Validate to accept a pointer receiver (func
(c *MemoryControllerPolicyConfig) Validate() error) and, inside the loop over
c.AllowOrigins in Validate, replace each entry with its canonical form
(strings.ToLower(strings.TrimSpace(origin))) after validating it (use the same
allowedOrigins/seen logic), so the stored AllowOrigins are normalized for
downstream use.

---

Outside diff comments:
In `@internal/cli/client_test.go`:
- Around line 3320-3338: The test currently assigns sharedMemoryRequest :=
memoryRequest which just copies the CLI type and makes the JSON parity check
vacuous; instead construct an explicit shared-contract instance (e.g.
memcontract.MemoryCreateRequest) with the same field values as the CLI
MemoryCreateRequest and marshal that for comparison. Update the code to build a
memcontract.MemoryCreateRequest (setting Scope, WorkspaceID, Type, Name, Content
to the same values) into sharedMemoryRequest, marshal it to sharedMemoryJSON,
and then keep the bytes.Equal assertion to ensure real parity between the CLI
type (MemoryCreateRequest) and the shared contract type
(memcontract.MemoryCreateRequest).

In `@internal/config/config.go`:
- Around line 1613-1618: The MinHours float validation in DreamConfig.Validate
currently only checks <=0 and misses NaN/Inf; update DreamConfig.Validate to
first check math.IsNaN(c.MinHours) || math.IsInf(c.MinHours, 0) and return an
error if so, then perform the existing <=0 range check on c.MinHours; for
MinScore in MemoryDreamGatesConfig.Validate, replace the manual numeric check
with a call to the existing validateWeight(name, value) helper (or call
validateWeight("memory.dream.min_score", c.MinScore)) so NaN/Inf and range are
handled consistently via validateWeight.

---

Nitpick comments:
In `@internal/cli/memory.go`:
- Around line 47-57: The memorySearchItem struct drops AgentTier which causes
agent-scoped results to render identically; add an AgentTier field (use the
existing memcontract.AgentTier type or string) to memorySearchItem and populate
it where items are constructed, then update the renderers that currently call
string(item.Scope) to include/format item.AgentTier when
Scope==memcontract.ScopeAgent (or always include AgentTier for agent scopes) so
results show agent:workspace vs agent:global correctly; update any JSON tags
(e.g., `agent_tier` or `agent_tier,omitempty`) to match existing conventions.
🪄 Autofix (Beta)

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

Run ID: 410b516c-f0e1-42a3-96ef-b2de767efaa2

📥 Commits

Reviewing files that changed from the base of the PR and between 2909c5d and ceda691.

⛔ Files ignored due to path filters (30)
  • .compozy/tasks/mem-v2/qa/test-cases/TC-INT-001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-INT-002.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-INT-003.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-INT-004.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-INT-005.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-REG-001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-SCEN-001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-SCEN-002.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-SEC-001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-UI-001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-UI-002.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-cases/TC-UI-003.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-plans/memory-v2-regression.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-plans/memory-v2-test-plan.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/qa/test-plans/memory-v2-traceability.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_002.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_003.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_004.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_005.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_006.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_007.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_008.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_009.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_010.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_011.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_012.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_013.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-001/issue_014.md is excluded by !**/*.md
  • openapi/agh.json is excluded by !**/*.json
📒 Files selected for processing (12)
  • internal/api/contract/memory.go
  • internal/api/core/memory.go
  • internal/api/core/memory_services_test.go
  • internal/api/httpapi/httpapi_integration_test.go
  • internal/api/udsapi/udsapi_integration_test.go
  • internal/cli/client_test.go
  • internal/cli/memory.go
  • internal/cli/memory_test.go
  • internal/config/bootstrap.go
  • internal/config/bootstrap_test.go
  • internal/config/config.go
  • internal/config/memory_v2_config_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • internal/cli/memory_test.go

Comment thread internal/api/core/memory.go
Comment thread internal/api/core/memory.go
Comment thread internal/api/httpapi/httpapi_integration_test.go Outdated
Comment thread internal/api/httpapi/httpapi_integration_test.go
Comment thread internal/cli/memory.go
Comment thread internal/config/config.go Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
internal/api/httpapi/memory_test.go (1)

77-156: 🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Normalize subtests to required Should ... pattern and parallelize each subtest

The new subtests are missing the mandated naming format and per-subtest t.Parallel(). Please apply this consistently to each t.Run block.

Suggested update pattern
- t.Run("default list returns global scope", func(t *testing.T) {
+ t.Run("Should return global scope by default", func(t *testing.T) {
+   t.Parallel()
    resp := performRequest(t, engine, http.MethodGet, "/api/memory", nil)
    ...
 })

As per coding guidelines, "Use t.Run('Should ...') pattern for Go test subtests instead of flat test structures" and "Default to t.Parallel in Go tests unless there is a specific reason to disable it (opt-out with t.Setenv)."

🤖 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/httpapi/memory_test.go` around lines 77 - 156, The subtests in
memory_test.go (the t.Run blocks testing default list, scope filtering,
workspace query, and include_system behavior) do not follow the required "Should
..." naming convention and are missing per-subtest t.Parallel() calls; update
each t.Run invocation to use a name like "Should return global scope by default"
/ "Should filter to global when scope=global" / "Should filter to workspace when
scope=workspace" / "Should include both scopes when workspace_id is provided" /
"Should include system-managed entries when include_system=true" and add a
t.Parallel() as the first line inside each subtest body (inside the closure) so
each subtest runs in parallel while preserving existing assertions and use of
performRequest, decodeJSONResponse, and the memoryListResponse checks.
🧹 Nitpick comments (2)
internal/cli/memory_test.go (1)

560-619: 💤 Low value

Consider grouping related assertions into subtests.

The TestMemoryBundleHelpers function contains multiple independent assertions (e.g., memoryScopeLabel, boolStatus, parseOptionalCLIMemoryScope) that could be organized into t.Run("Should...") subtests for clearer failure attribution and documentation.

🤖 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/cli/memory_test.go` around lines 560 - 619, TestMemoryBundleHelpers
contains many independent checks that should be split into identifiable
subtests; refactor the test by wrapping each logical assertion group (e.g., the
listBundle human check for memoryListBundle/memoryListBundle.human, the
decisionBundle check for memoryMutationBundle.human, the memoryScopeLabel and
boolStatus checks, the
parseOptionalCLIMemoryScope/parseOptionalCLIAgentTier/parseOptionalMemoryType
validation checks, the resolveMemoryContentValue error cases, and the
readOptionalCommandInput call) into separate t.Run("description", func(t
*testing.T){ ... }) subtests so failures are scoped and labeled; keep t.Parallel
on the top-level TestMemoryBundleHelpers (or call t.Parallel inside each subtest
if desired), move the existing assertions into their respective subtest bodies,
and preserve existing helper calls like memoryScopeLabel, boolStatus,
parseOptionalCLIMemoryScope, parseOptionalCLIAgentTier, parseOptionalMemoryType,
resolveMemoryContentValue, readOptionalCommandInput, memoryListBundle and
memoryMutationBundle.
internal/config/config.go (1)

718-730: ⚡ Quick win

Keep the allowed-origin list in one place.

defaultMemoryControllerConfig() and MemoryControllerPolicyConfig.Validate() each carry the same origin set. The next edit can make the built-in defaults fail validation or leave the validator behind the runtime contract.

Suggested refactor
+var defaultMemoryControllerAllowOrigins = []string{
+	"cli",
+	"http",
+	"uds",
+	"tool",
+	"extractor",
+	"dreaming",
+	"file",
+	"provider",
+}
+
 func defaultMemoryControllerConfig() MemoryControllerConfig {
 	return MemoryControllerConfig{
 		Mode:            "hybrid",
 		MaxLatency:      300 * time.Millisecond,
 		DefaultOpOnFail: "noop",
@@
 		Policy: MemoryControllerPolicyConfig{
 			MaxContentChars: 4096,
 			MaxWritesPerMin: 60,
-			AllowOrigins: []string{
-				"cli",
-				"http",
-				"uds",
-				"tool",
-				"extractor",
-				"dreaming",
-				"file",
-				"provider",
-			},
+			AllowOrigins: cloneStrings(defaultMemoryControllerAllowOrigins),
 		},
 	}
 }
@@
-	allowedOrigins := map[string]struct{}{
-		"cli":       {},
-		"http":      {},
-		"uds":       {},
-		"tool":      {},
-		"extractor": {},
-		"dreaming":  {},
-		"file":      {},
-		"provider":  {},
-	}
+	allowedOrigins := make(map[string]struct{}, len(defaultMemoryControllerAllowOrigins))
+	for _, origin := range defaultMemoryControllerAllowOrigins {
+		allowedOrigins[origin] = struct{}{}
+	}

Also applies to: 1686-1712

🤖 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/config/config.go` around lines 718 - 730,
defaultMemoryControllerConfig() and MemoryControllerPolicyConfig.Validate()
duplicate the same AllowOrigins list; extract the canonical allowed-origins
slice into a single shared constant or package-level variable (e.g.,
DefaultMemoryControllerAllowedOrigins) and have both
defaultMemoryControllerConfig() and MemoryControllerPolicyConfig.Validate()
reference that shared symbol so defaults and validation remain consistent;
update any tests or usages that construct the list inline to use the new symbol
and keep the original semantics (same entries and order).
🤖 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/httpapi/httpapi_integration_test.go`:
- Around line 107-114: The JSON request body is built via string concatenation
(`"{"agent_name":"coder","name":"demo","workspace_path":"`+runtime.workspace+`"}"`)
which breaks on Windows paths; replace this with the existing helper
`mustIntegrationJSON` to construct a proper JSON payload (e.g., pass a
map/struct with keys agent_name, name, workspace_path) and use that result as
the request body in the call to `mustHTTPRequest` (keep using `mustURL` and
`runtime.client`/`origin` unchanged). Ensure the code uses `runtime.workspace`
as a value in the object passed to `mustIntegrationJSON` so backslashes are
escaped correctly.
- Around line 877-884: The request body for the POST to /api/sessions is being
built via raw string concatenation (see createResp and the mustHTTPRequest call
using runtime.workspace), which can break on Windows or when the workspace
contains quotes/escapes; instead construct a Go struct or map with fields
agent_name, workspace_path and channel and json.Marshal it, then pass the
marshaled []byte to mustHTTPRequest (or use fmt.Sprintf only after properly
json-escaping runtime.workspace via json.Marshal); update the code around
createResp/mustHTTPRequest to use the marshaled JSON to ensure safe escaping.

In `@internal/api/httpapi/memory_test.go`:
- Around line 251-265: The negative-path tests (using performRequest with engine
against POST "/api/memory", variables invalid and missing) currently only assert
HTTP status; update each failure-case to also decode the response body JSON and
assert the structured error contract (e.g., an "error" or "message" field exists
and the message contains the expected fragment like "missing" or "invalid
name/type"); do this for the invalid and missing cases shown here and similarly
for the other failure blocks referenced (around the other test ranges) so tests
assert both status code and expected error message content.

In `@internal/config/config.go`:
- Around line 1635-1652: MemoryControllerConfig.Validate currently allows c.Mode
to be "llm" even when the nested LLM config is disabled; after you
validate/assign mode in MemoryControllerConfig.Validate, add a check that if
c.Mode == "llm" and the nested LLM enabled flag (c.LLM.Enabled) is false (or
nil/false-equivalent), return a validation error rejecting the combination,
similarly mirror this guard in the other nearby validator block (the second
MemoryControllerConfig validation around lines 1656-1675) so any "llm" mode is
rejected when the LLM block is disabled.

---

Outside diff comments:
In `@internal/api/httpapi/memory_test.go`:
- Around line 77-156: The subtests in memory_test.go (the t.Run blocks testing
default list, scope filtering, workspace query, and include_system behavior) do
not follow the required "Should ..." naming convention and are missing
per-subtest t.Parallel() calls; update each t.Run invocation to use a name like
"Should return global scope by default" / "Should filter to global when
scope=global" / "Should filter to workspace when scope=workspace" / "Should
include both scopes when workspace_id is provided" / "Should include
system-managed entries when include_system=true" and add a t.Parallel() as the
first line inside each subtest body (inside the closure) so each subtest runs in
parallel while preserving existing assertions and use of performRequest,
decodeJSONResponse, and the memoryListResponse checks.

---

Nitpick comments:
In `@internal/cli/memory_test.go`:
- Around line 560-619: TestMemoryBundleHelpers contains many independent checks
that should be split into identifiable subtests; refactor the test by wrapping
each logical assertion group (e.g., the listBundle human check for
memoryListBundle/memoryListBundle.human, the decisionBundle check for
memoryMutationBundle.human, the memoryScopeLabel and boolStatus checks, the
parseOptionalCLIMemoryScope/parseOptionalCLIAgentTier/parseOptionalMemoryType
validation checks, the resolveMemoryContentValue error cases, and the
readOptionalCommandInput call) into separate t.Run("description", func(t
*testing.T){ ... }) subtests so failures are scoped and labeled; keep t.Parallel
on the top-level TestMemoryBundleHelpers (or call t.Parallel inside each subtest
if desired), move the existing assertions into their respective subtest bodies,
and preserve existing helper calls like memoryScopeLabel, boolStatus,
parseOptionalCLIMemoryScope, parseOptionalCLIAgentTier, parseOptionalMemoryType,
resolveMemoryContentValue, readOptionalCommandInput, memoryListBundle and
memoryMutationBundle.

In `@internal/config/config.go`:
- Around line 718-730: defaultMemoryControllerConfig() and
MemoryControllerPolicyConfig.Validate() duplicate the same AllowOrigins list;
extract the canonical allowed-origins slice into a single shared constant or
package-level variable (e.g., DefaultMemoryControllerAllowedOrigins) and have
both defaultMemoryControllerConfig() and MemoryControllerPolicyConfig.Validate()
reference that shared symbol so defaults and validation remain consistent;
update any tests or usages that construct the list inline to use the new symbol
and keep the original semantics (same entries and order).
🪄 Autofix (Beta)

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

Run ID: c87d405a-4e91-4eb8-9754-1560742224e2

📥 Commits

Reviewing files that changed from the base of the PR and between ceda691 and e505801.

⛔ Files ignored due to path filters (7)
  • .compozy/tasks/mem-v2/reviews-002/issue_001.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_002.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_003.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_004.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_005.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_006.md is excluded by !**/*.md
  • .compozy/tasks/mem-v2/reviews-002/issue_007.md is excluded by !**/*.md
📒 Files selected for processing (7)
  • internal/api/core/memory.go
  • internal/api/httpapi/httpapi_integration_test.go
  • internal/api/httpapi/memory_test.go
  • internal/cli/memory.go
  • internal/cli/memory_test.go
  • internal/config/config.go
  • internal/config/memory_v2_config_test.go

Comment on lines +107 to +114
createResp := mustHTTPRequest(
t,
runtime.client,
http.MethodPost,
mustURL(runtime.host, runtime.port, "/api/sessions"),
[]byte(`{"agent_name":"coder","name":"demo","workspace_path":"`+runtime.workspace+`"}`),
map[string]string{"Origin": origin},
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

JSON request body still uses string concatenation with file paths.

The same pattern flagged in past reviews (string concatenation for JSON bodies) appears here. runtime.workspace from t.TempDir() contains backslashes on Windows, producing invalid JSON. Use mustIntegrationJSON as done in the helper functions.

🛠️ Suggested fix
 	origin := fmt.Sprintf("http://%s:%d", runtime.host, runtime.port)
 	createResp := mustHTTPRequest(
 		t,
 		runtime.client,
 		http.MethodPost,
 		mustURL(runtime.host, runtime.port, "/api/sessions"),
-		[]byte(`{"agent_name":"coder","name":"demo","workspace_path":"`+runtime.workspace+`"}`),
+		mustIntegrationJSON(map[string]any{
+			"agent_name":     "coder",
+			"name":           "demo",
+			"workspace_path": runtime.workspace,
+		}),
 		map[string]string{"Origin": origin},
 	)
🤖 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/httpapi/httpapi_integration_test.go` around lines 107 - 114, The
JSON request body is built via string concatenation
(`"{"agent_name":"coder","name":"demo","workspace_path":"`+runtime.workspace+`"}"`)
which breaks on Windows paths; replace this with the existing helper
`mustIntegrationJSON` to construct a proper JSON payload (e.g., pass a
map/struct with keys agent_name, name, workspace_path) and use that result as
the request body in the call to `mustHTTPRequest` (keep using `mustURL` and
`runtime.client`/`origin` unchanged). Ensure the code uses `runtime.workspace`
as a value in the object passed to `mustIntegrationJSON` so backslashes are
escaped correctly.

Comment on lines +877 to +884
createResp := mustHTTPRequest(
t,
runtime.client,
http.MethodPost,
mustURL(runtime.host, runtime.port, "/api/sessions"),
[]byte(`{"agent_name":"coder","workspace_path":"`+runtime.workspace+`","channel":"builders"}`),
nil,
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Same string concatenation issue with workspace path.

This is another instance of the same pattern that could break on Windows.

🛠️ Suggested fix
 	createResp := mustHTTPRequest(
 		t,
 		runtime.client,
 		http.MethodPost,
 		mustURL(runtime.host, runtime.port, "/api/sessions"),
-		[]byte(`{"agent_name":"coder","workspace_path":"`+runtime.workspace+`","channel":"builders"}`),
+		mustIntegrationJSON(map[string]any{
+			"agent_name":     "coder",
+			"workspace_path": runtime.workspace,
+			"channel":        "builders",
+		}),
 		nil,
 	)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
createResp := mustHTTPRequest(
t,
runtime.client,
http.MethodPost,
mustURL(runtime.host, runtime.port, "/api/sessions"),
[]byte(`{"agent_name":"coder","workspace_path":"`+runtime.workspace+`","channel":"builders"}`),
nil,
)
createResp := mustHTTPRequest(
t,
runtime.client,
http.MethodPost,
mustURL(runtime.host, runtime.port, "/api/sessions"),
mustIntegrationJSON(map[string]any{
"agent_name": "coder",
"workspace_path": runtime.workspace,
"channel": "builders",
}),
nil,
)
🤖 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/httpapi/httpapi_integration_test.go` around lines 877 - 884, The
request body for the POST to /api/sessions is being built via raw string
concatenation (see createResp and the mustHTTPRequest call using
runtime.workspace), which can break on Windows or when the workspace contains
quotes/escapes; instead construct a Go struct or map with fields agent_name,
workspace_path and channel and json.Marshal it, then pass the marshaled []byte
to mustHTTPRequest (or use fmt.Sprintf only after properly json-escaping
runtime.workspace via json.Marshal); update the code around
createResp/mustHTTPRequest to use the marshaled JSON to ensure safe escaping.

Comment on lines 251 to 265
invalid := performRequest(
t,
engine,
http.MethodPut,
"/api/memory/invalid.md",
[]byte(`{"scope":"global","content":"not frontmatter"}`),
http.MethodPost,
"/api/memory",
[]byte(`{"scope":"global","type":"user","name":"Invalid"}`),
)
if invalid.Code != http.StatusBadRequest {
t.Fatalf("invalid status = %d, want %d; body=%s", invalid.Code, http.StatusBadRequest, invalid.Body.String())
}

missing := performRequest(t, engine, http.MethodPut, "/api/memory/missing.md", []byte(`{"scope":"global"}`))
missing := performRequest(t, engine, http.MethodPost, "/api/memory", []byte(`{"scope":"global"}`))
if missing.Code != http.StatusBadRequest {
t.Fatalf("missing status = %d, want %d; body=%s", missing.Code, http.StatusBadRequest, missing.Body.String())
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Strengthen negative-path assertions by validating error response bodies

These updated failure-path checks currently assert status code only. Please also assert response body contract/content (e.g., structured error field and expected message fragment) so regressions in API error semantics are caught.

Suggested assertion pattern
 invalid := performRequest(t, engine, http.MethodPost, "/api/memory", []byte(`{"scope":"global","type":"user","name":"Invalid"}`))
 if invalid.Code != http.StatusBadRequest {
   t.Fatalf("invalid status = %d, want %d; body=%s", invalid.Code, http.StatusBadRequest, invalid.Body.String())
 }
+var invalidErr map[string]any
+decodeJSONResponse(t, invalid, &invalidErr)
+msg, _ := invalidErr["error"].(string)
+if msg == "" {
+  t.Fatalf("invalid error payload = %#v, want non-empty error message", invalidErr)
+}

As per coding guidelines, "Assert both HTTP status code AND response body in tests; status-code-only assertions are insufficient."

Also applies to: 467-475, 696-708

🤖 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/httpapi/memory_test.go` around lines 251 - 265, The
negative-path tests (using performRequest with engine against POST
"/api/memory", variables invalid and missing) currently only assert HTTP status;
update each failure-case to also decode the response body JSON and assert the
structured error contract (e.g., an "error" or "message" field exists and the
message contains the expected fragment like "missing" or "invalid name/type");
do this for the invalid and missing cases shown here and similarly for the other
failure blocks referenced (around the other test ranges) so tests assert both
status code and expected error message content.

Comment thread internal/config/config.go
Comment on lines +1635 to +1652
func (c *MemoryControllerConfig) Validate() error {
mode, err := validateEnum("memory.controller.mode", c.Mode, "hybrid", "rules", "llm")
if err != nil {
return err
}
c.Mode = mode
if c.MaxLatency <= 0 {
return fmt.Errorf("memory.controller.max_latency must be positive: %s", c.MaxLatency)
}
defaultOpOnFail, err := validateEnum("memory.controller.default_op_on_fail", c.DefaultOpOnFail, "noop", "reject")
if err != nil {
return err
}
c.DefaultOpOnFail = defaultOpOnFail
if err := c.LLM.Validate(); err != nil {
return err
}
return c.Policy.Validate()
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Reject mode = "llm" when the LLM block is disabled.

This currently validates a self-contradictory config: memory.controller.mode = "llm" can pass while memory.controller.llm.enabled = false, because the nested validator short-circuits on disabled configs. That pushes an invalid mode combination into runtime instead of failing fast.

Suggested fix
 func (c *MemoryControllerConfig) Validate() error {
 	mode, err := validateEnum("memory.controller.mode", c.Mode, "hybrid", "rules", "llm")
 	if err != nil {
 		return err
 	}
 	c.Mode = mode
+	if c.Mode == "llm" && !c.LLM.Enabled {
+		return errors.New(`memory.controller.llm.enabled must be true when memory.controller.mode is "llm"`)
+	}
 	if c.MaxLatency <= 0 {
 		return fmt.Errorf("memory.controller.max_latency must be positive: %s", c.MaxLatency)
 	}
 	defaultOpOnFail, err := validateEnum("memory.controller.default_op_on_fail", c.DefaultOpOnFail, "noop", "reject")

Also applies to: 1656-1675

🤖 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/config/config.go` around lines 1635 - 1652,
MemoryControllerConfig.Validate currently allows c.Mode to be "llm" even when
the nested LLM config is disabled; after you validate/assign mode in
MemoryControllerConfig.Validate, add a check that if c.Mode == "llm" and the
nested LLM enabled flag (c.LLM.Enabled) is false (or nil/false-equivalent),
return a validation error rejecting the combination, similarly mirror this guard
in the other nearby validator block (the second MemoryControllerConfig
validation around lines 1656-1675) so any "llm" mode is rejected when the LLM
block is disabled.

@pedronauck pedronauck merged commit dafe517 into main May 6, 2026
1 of 2 checks passed
@pedronauck pedronauck deleted the memv2 branch May 6, 2026 17:30
@coderabbitai coderabbitai Bot mentioned this pull request May 7, 2026
pedronauck added a commit that referenced this pull request May 26, 2026
## Release v0.0.1

This PR prepares the release of version v0.0.1.

### Changelog

## 0.0.1 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

- Project structure (#7)
- Kb improvements (#12)
- Rename spaces to channels (#17)
- Add extensions gaps (#21)
- Improve tool calls ui (#22)
- Remove web app header
- Module improvements (#29)
- Memory improvements (#35)
- Storybook for web and ui (#38)
- Enable AGH network by default for new installs (#57)
- Hermes adjustments (#69)
- Badges design (#84)
- Storybook scenario and logos gallery
- Migrate typescript tests (#114)
- Internal go packages (#120)
- Ui patterns (#127)
- Improve e2e tests (#130)
- Ui redesign
- Workspace isolation across runtime surfaces (#145)
- Prod ready applies (#162)
- Tool card ui (#164)
- Alpha on logo
- Prod ready features (#167)
- Thread sheet (#202)



### 🎉 Features

- Implement config foundation packages
- Implement sqlite store package
- Add ACP client package
- Add session lifecycle manager
- Implement observe package
- Add daemon composition root
- Add uds api server
- Implement cli package
- Add http api server
- Add system design
- Add foundation types, schemas, and layout shell for web client
- Add daemon health polling and agent sidebar systems for web client
- Add session system CRUD, streaming core, and session store for web
client
- Add chat view, messages, and composer tests for web client
- Add tool cards and renderers for web client
- Add file-backed memory store core
- Scaffold memory session seams
- Add memory dream consolidation service
- Wire memory assembler into daemon
- Add memory api and cli
- New skills system (#1)
- Add workspace entity (#5)
- Add new skill capabilities (#8)
- Web ui v2 (#9)
- Improve hooks system (#10)
- Session resilience (#11)
- Add extensability (#13)
- Add automation (#16)
- Add channels (#14)
- Add network implementation (#15)
- Add network, bridges and automations web pages (#18)
- Ext registry (#20)
- Add core tasks (#19)
- Bridge adapters (#23)
- Add site (#26)
- Add ext refac and sandbox (#25)
- Settings ui (#37)
- Tasks ui (#36)
- Harness improvements (#44)
- Agent capabilities (#49)
- Redesign ui (#48)
- Unify capability (#53)
- Redesign network workspace (#59)
- Add task deletion and split session delete from stop (#58)
- Session provider selection (#60)
- Production grade adjustments (#66)
- Autonomous system (#75)
- Add agent session route (#80)
- Tools registry (#85)
- Agents soul (#88)
- Add network threads (#105)
- Orchestration improvements (#106)
- Memory v2 (#108)
- Agent categories (#113)
- Providers model (#118)
- Add canonical AGH bundled skill (#143)
- Onboarding and improvements (#198)
- Onboarding and improvements (#201)



### 🐛 Bug Fixes

- Review round
- Review rounds
- Resolve memory extensibility review batch
- Embed web into daemon
- Defaults agents
- Acp integration (#4)
- Lint errors
- Prd folder
- Remove orphan web actions and dead surfaces (#55)
- Qa testing and fixes (#73)
- New review rounds (#82)
- Security audit (#90)
- Release qa round (#95)
- Add missing tools (#141)
- New qa round (#147)
- Advanced qa round (#149)
- Homebrew tap
- Final review round (#151)
- Daemon healthy
- Reasoning models (#158)
- Lint errors (#160)
- Review round (#168)
- Release adjustments (#171)
- Stabilize release ci fixtures
- Stabilize release integration gate
- Stabilize release verify gates
- Stabilize release integration flows
- Stabilize release verify gates
- Stabilize main verify shutdown
- Ignore stale acpmock cancel
- Marketplace search focus and filtering (#193)
- Website video
- Workspace command select



### 📚 Documentation

- Update agents.md
- Update prd
- Update skills
- Update compozy tasks
- Update compozy
- Update compozy
- Add new skills
- Archive prd
- Update prds
- Update rfc
- Update prds
- Update prds
- Add automation prd
- Channels prd
- Update prd
- Update prd
- New prds
- Archive prds
- Bridges adapters prd
- Sandbox prd
- Update
- Archive prd
- Update
- Add new prd
- New design
- Update prd
- Archive prds
- Update prds
- Tasks-ui prd tasks
- Update prd
- Update design docs
- Agent capabilities prd
- Improve site docs
- Remove old design references
- Udpate
- Autonomous prd
- Update skills
- Blog design
- Agent sould prd
- Final qa plan
- Update
- Remove codex ledgers from gitignore
- Remove not needed files
- Udpate ledger
- Update cy-codex-loop skill
- Orchestration improves prd
- Update prds
- Orch improvs prd
- Memv2 prd
- Providers model prd
- Update refacs prd
- New design proposal
- Update rules
- Update skills
- New blog posts (#173)
- Format docs
- Remove old design files
- Remove old
- Skeeper update



### 📦 Build System

- Initial structure
- Commitlint
- Frontend base structure
- Update vscode settings
- Add subagents
- Coderabbit
- Prd and tooling
- Bun lock
- Lint tooling
- Copy.md and tooling adjusts
- Add repoclone rc
- Upgrade skeeper to v0.2.0
- Update go.mod
- Adopt task artifacts into skeeper
- Sync codex plans with skeeper
- Skeeper lock
- Skeeper lock
- New skills
- Skeeper lock
- Skeeper lock
- Skeeper lock
- Update deps and go
- Regenerate daytona sidecar assets for go 1.26.3
- Fix cliff
- Ignore docs on fmt
- Build web assets before goreleaser
- Extend release dry-run timeout



### 🔧 CI/CD

- Lint errors
- Fint release pr
- Fix goreleaser



### 🧪 Testing

- Add e2e tests (#27)
- Qa rounds (#78)
- Improve test suite (#138)
- Harden daemon-served restart reloads
- Harden daemon-served readiness waits
- Stabilize dashboard focus assertion
- Stabilize release integration gates
- Stabilize release e2e markers
- Stabilize release e2e flows

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This was referenced May 26, 2026
pedronauck added a commit that referenced this pull request May 26, 2026
## Release v0.0.1

This PR prepares the release of version v0.0.1.

### Changelog

## 0.0.1 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

- Project structure (#7)
- Kb improvements (#12)
- Rename spaces to channels (#17)
- Add extensions gaps (#21)
- Improve tool calls ui (#22)
- Remove web app header
- Module improvements (#29)
- Memory improvements (#35)
- Storybook for web and ui (#38)
- Enable AGH network by default for new installs (#57)
- Hermes adjustments (#69)
- Badges design (#84)
- Storybook scenario and logos gallery
- Migrate typescript tests (#114)
- Internal go packages (#120)
- Ui patterns (#127)
- Improve e2e tests (#130)
- Ui redesign
- Workspace isolation across runtime surfaces (#145)
- Prod ready applies (#162)
- Tool card ui (#164)
- Alpha on logo
- Prod ready features (#167)
- Thread sheet (#202)



### 🎉 Features

- Implement config foundation packages
- Implement sqlite store package
- Add ACP client package
- Add session lifecycle manager
- Implement observe package
- Add daemon composition root
- Add uds api server
- Implement cli package
- Add http api server
- Add system design
- Add foundation types, schemas, and layout shell for web client
- Add daemon health polling and agent sidebar systems for web client
- Add session system CRUD, streaming core, and session store for web
client
- Add chat view, messages, and composer tests for web client
- Add tool cards and renderers for web client
- Add file-backed memory store core
- Scaffold memory session seams
- Add memory dream consolidation service
- Wire memory assembler into daemon
- Add memory api and cli
- New skills system (#1)
- Add workspace entity (#5)
- Add new skill capabilities (#8)
- Web ui v2 (#9)
- Improve hooks system (#10)
- Session resilience (#11)
- Add extensability (#13)
- Add automation (#16)
- Add channels (#14)
- Add network implementation (#15)
- Add network, bridges and automations web pages (#18)
- Ext registry (#20)
- Add core tasks (#19)
- Bridge adapters (#23)
- Add site (#26)
- Add ext refac and sandbox (#25)
- Settings ui (#37)
- Tasks ui (#36)
- Harness improvements (#44)
- Agent capabilities (#49)
- Redesign ui (#48)
- Unify capability (#53)
- Redesign network workspace (#59)
- Add task deletion and split session delete from stop (#58)
- Session provider selection (#60)
- Production grade adjustments (#66)
- Autonomous system (#75)
- Add agent session route (#80)
- Tools registry (#85)
- Agents soul (#88)
- Add network threads (#105)
- Orchestration improvements (#106)
- Memory v2 (#108)
- Agent categories (#113)
- Providers model (#118)
- Add canonical AGH bundled skill (#143)
- Onboarding and improvements (#198)
- Onboarding and improvements (#201)



### 🐛 Bug Fixes

- Review round
- Review rounds
- Resolve memory extensibility review batch
- Embed web into daemon
- Defaults agents
- Acp integration (#4)
- Lint errors
- Prd folder
- Remove orphan web actions and dead surfaces (#55)
- Qa testing and fixes (#73)
- New review rounds (#82)
- Security audit (#90)
- Release qa round (#95)
- Add missing tools (#141)
- New qa round (#147)
- Advanced qa round (#149)
- Homebrew tap
- Final review round (#151)
- Daemon healthy
- Reasoning models (#158)
- Lint errors (#160)
- Review round (#168)
- Release adjustments (#171)
- Stabilize release ci fixtures
- Stabilize release integration gate
- Stabilize release verify gates
- Stabilize release integration flows
- Stabilize release verify gates
- Stabilize main verify shutdown
- Ignore stale acpmock cancel
- Marketplace search focus and filtering (#193)
- Website video
- Workspace command select



### 📚 Documentation

- Update agents.md
- Update prd
- Update skills
- Update compozy tasks
- Update compozy
- Update compozy
- Add new skills
- Archive prd
- Update prds
- Update rfc
- Update prds
- Update prds
- Add automation prd
- Channels prd
- Update prd
- Update prd
- New prds
- Archive prds
- Bridges adapters prd
- Sandbox prd
- Update
- Archive prd
- Update
- Add new prd
- New design
- Update prd
- Archive prds
- Update prds
- Tasks-ui prd tasks
- Update prd
- Update design docs
- Agent capabilities prd
- Improve site docs
- Remove old design references
- Udpate
- Autonomous prd
- Update skills
- Blog design
- Agent sould prd
- Final qa plan
- Update
- Remove codex ledgers from gitignore
- Remove not needed files
- Udpate ledger
- Update cy-codex-loop skill
- Orchestration improves prd
- Update prds
- Orch improvs prd
- Memv2 prd
- Providers model prd
- Update refacs prd
- New design proposal
- Update rules
- Update skills
- New blog posts (#173)
- Format docs
- Remove old design files
- Remove old
- Skeeper update



### 📦 Build System

- Initial structure
- Commitlint
- Frontend base structure
- Update vscode settings
- Add subagents
- Coderabbit
- Prd and tooling
- Bun lock
- Lint tooling
- Copy.md and tooling adjusts
- Add repoclone rc
- Upgrade skeeper to v0.2.0
- Update go.mod
- Adopt task artifacts into skeeper
- Sync codex plans with skeeper
- Skeeper lock
- Skeeper lock
- New skills
- Skeeper lock
- Skeeper lock
- Skeeper lock
- Update deps and go
- Regenerate daytona sidecar assets for go 1.26.3
- Fix cliff
- Ignore docs on fmt
- Build web assets before goreleaser
- Extend release dry-run timeout



### 🔧 CI/CD

- Lint errors
- Fint release pr
- Fix goreleaser
- Fix release



### 🧪 Testing

- Add e2e tests (#27)
- Qa rounds (#78)
- Improve test suite (#138)
- Harden daemon-served restart reloads
- Harden daemon-served readiness waits
- Stabilize dashboard focus assertion
- Stabilize release integration gates
- Stabilize release e2e markers
- Stabilize release e2e flows

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
pedronauck added a commit that referenced this pull request May 26, 2026
## Release v0.0.2

This PR prepares the release of version v0.0.2.

### Changelog

## 0.0.2 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

- Project structure (#7)
- Kb improvements (#12)
- Rename spaces to channels (#17)
- Add extensions gaps (#21)
- Improve tool calls ui (#22)
- Remove web app header
- Module improvements (#29)
- Memory improvements (#35)
- Storybook for web and ui (#38)
- Enable AGH network by default for new installs (#57)
- Hermes adjustments (#69)
- Badges design (#84)
- Storybook scenario and logos gallery
- Migrate typescript tests (#114)
- Internal go packages (#120)
- Ui patterns (#127)
- Improve e2e tests (#130)
- Ui redesign
- Workspace isolation across runtime surfaces (#145)
- Prod ready applies (#162)
- Tool card ui (#164)
- Alpha on logo
- Prod ready features (#167)
- Thread sheet (#202)



### 🎉 Features

- Implement config foundation packages
- Implement sqlite store package
- Add ACP client package
- Add session lifecycle manager
- Implement observe package
- Add daemon composition root
- Add uds api server
- Implement cli package
- Add http api server
- Add system design
- Add foundation types, schemas, and layout shell for web client
- Add daemon health polling and agent sidebar systems for web client
- Add session system CRUD, streaming core, and session store for web
client
- Add chat view, messages, and composer tests for web client
- Add tool cards and renderers for web client
- Add file-backed memory store core
- Scaffold memory session seams
- Add memory dream consolidation service
- Wire memory assembler into daemon
- Add memory api and cli
- New skills system (#1)
- Add workspace entity (#5)
- Add new skill capabilities (#8)
- Web ui v2 (#9)
- Improve hooks system (#10)
- Session resilience (#11)
- Add extensability (#13)
- Add automation (#16)
- Add channels (#14)
- Add network implementation (#15)
- Add network, bridges and automations web pages (#18)
- Ext registry (#20)
- Add core tasks (#19)
- Bridge adapters (#23)
- Add site (#26)
- Add ext refac and sandbox (#25)
- Settings ui (#37)
- Tasks ui (#36)
- Harness improvements (#44)
- Agent capabilities (#49)
- Redesign ui (#48)
- Unify capability (#53)
- Redesign network workspace (#59)
- Add task deletion and split session delete from stop (#58)
- Session provider selection (#60)
- Production grade adjustments (#66)
- Autonomous system (#75)
- Add agent session route (#80)
- Tools registry (#85)
- Agents soul (#88)
- Add network threads (#105)
- Orchestration improvements (#106)
- Memory v2 (#108)
- Agent categories (#113)
- Providers model (#118)
- Add canonical AGH bundled skill (#143)
- Onboarding and improvements (#198)
- Onboarding and improvements (#201)



### 🐛 Bug Fixes

- Review round
- Review rounds
- Resolve memory extensibility review batch
- Embed web into daemon
- Defaults agents
- Acp integration (#4)
- Lint errors
- Prd folder
- Remove orphan web actions and dead surfaces (#55)
- Qa testing and fixes (#73)
- New review rounds (#82)
- Security audit (#90)
- Release qa round (#95)
- Add missing tools (#141)
- New qa round (#147)
- Advanced qa round (#149)
- Homebrew tap
- Final review round (#151)
- Daemon healthy
- Reasoning models (#158)
- Lint errors (#160)
- Review round (#168)
- Release adjustments (#171)
- Stabilize release ci fixtures
- Stabilize release integration gate
- Stabilize release verify gates
- Stabilize release integration flows
- Stabilize release verify gates
- Stabilize main verify shutdown
- Ignore stale acpmock cancel
- Marketplace search focus and filtering (#193)
- Website video
- Workspace command select



### 📚 Documentation

- Update agents.md
- Update prd
- Update skills
- Update compozy tasks
- Update compozy
- Update compozy
- Add new skills
- Archive prd
- Update prds
- Update rfc
- Update prds
- Update prds
- Add automation prd
- Channels prd
- Update prd
- Update prd
- New prds
- Archive prds
- Bridges adapters prd
- Sandbox prd
- Update
- Archive prd
- Update
- Add new prd
- New design
- Update prd
- Archive prds
- Update prds
- Tasks-ui prd tasks
- Update prd
- Update design docs
- Agent capabilities prd
- Improve site docs
- Remove old design references
- Udpate
- Autonomous prd
- Update skills
- Blog design
- Agent sould prd
- Final qa plan
- Update
- Remove codex ledgers from gitignore
- Remove not needed files
- Udpate ledger
- Update cy-codex-loop skill
- Orchestration improves prd
- Update prds
- Orch improvs prd
- Memv2 prd
- Providers model prd
- Update refacs prd
- New design proposal
- Update rules
- Update skills
- New blog posts (#173)
- Format docs
- Remove old design files
- Remove old
- Skeeper update



### 📦 Build System

- Initial structure
- Commitlint
- Frontend base structure
- Update vscode settings
- Add subagents
- Coderabbit
- Prd and tooling
- Bun lock
- Lint tooling
- Copy.md and tooling adjusts
- Add repoclone rc
- Upgrade skeeper to v0.2.0
- Update go.mod
- Adopt task artifacts into skeeper
- Sync codex plans with skeeper
- Skeeper lock
- Skeeper lock
- New skills
- Skeeper lock
- Skeeper lock
- Skeeper lock
- Update deps and go
- Regenerate daytona sidecar assets for go 1.26.3
- Fix cliff
- Ignore docs on fmt
- Build web assets before goreleaser
- Extend release dry-run timeout



### 🔧 CI/CD

- Lint errors
- Fint release pr
- Fix goreleaser
- Fix release
- Fix release process



### 🧪 Testing

- Add e2e tests (#27)
- Qa rounds (#78)
- Improve test suite (#138)
- Harden daemon-served restart reloads
- Harden daemon-served readiness waits
- Stabilize dashboard focus assertion
- Stabilize release integration gates
- Stabilize release e2e markers
- Stabilize release e2e flows
- Improve suite speed

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
pedronauck added a commit that referenced this pull request May 27, 2026
## Release v0.0.2

This PR prepares the release of version v0.0.2.

### Changelog

## 0.0.2 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

- Project structure (#7)
- Kb improvements (#12)
- Rename spaces to channels (#17)
- Add extensions gaps (#21)
- Improve tool calls ui (#22)
- Remove web app header
- Module improvements (#29)
- Memory improvements (#35)
- Storybook for web and ui (#38)
- Enable AGH network by default for new installs (#57)
- Hermes adjustments (#69)
- Badges design (#84)
- Storybook scenario and logos gallery
- Migrate typescript tests (#114)
- Internal go packages (#120)
- Ui patterns (#127)
- Improve e2e tests (#130)
- Ui redesign
- Workspace isolation across runtime surfaces (#145)
- Prod ready applies (#162)
- Tool card ui (#164)
- Alpha on logo
- Prod ready features (#167)
- Thread sheet (#202)



### 🎉 Features

- Implement config foundation packages
- Implement sqlite store package
- Add ACP client package
- Add session lifecycle manager
- Implement observe package
- Add daemon composition root
- Add uds api server
- Implement cli package
- Add http api server
- Add system design
- Add foundation types, schemas, and layout shell for web client
- Add daemon health polling and agent sidebar systems for web client
- Add session system CRUD, streaming core, and session store for web
client
- Add chat view, messages, and composer tests for web client
- Add tool cards and renderers for web client
- Add file-backed memory store core
- Scaffold memory session seams
- Add memory dream consolidation service
- Wire memory assembler into daemon
- Add memory api and cli
- New skills system (#1)
- Add workspace entity (#5)
- Add new skill capabilities (#8)
- Web ui v2 (#9)
- Improve hooks system (#10)
- Session resilience (#11)
- Add extensability (#13)
- Add automation (#16)
- Add channels (#14)
- Add network implementation (#15)
- Add network, bridges and automations web pages (#18)
- Ext registry (#20)
- Add core tasks (#19)
- Bridge adapters (#23)
- Add site (#26)
- Add ext refac and sandbox (#25)
- Settings ui (#37)
- Tasks ui (#36)
- Harness improvements (#44)
- Agent capabilities (#49)
- Redesign ui (#48)
- Unify capability (#53)
- Redesign network workspace (#59)
- Add task deletion and split session delete from stop (#58)
- Session provider selection (#60)
- Production grade adjustments (#66)
- Autonomous system (#75)
- Add agent session route (#80)
- Tools registry (#85)
- Agents soul (#88)
- Add network threads (#105)
- Orchestration improvements (#106)
- Memory v2 (#108)
- Agent categories (#113)
- Providers model (#118)
- Add canonical AGH bundled skill (#143)
- Onboarding and improvements (#198)
- Onboarding and improvements (#201)



### 🐛 Bug Fixes

- Review round
- Review rounds
- Resolve memory extensibility review batch
- Embed web into daemon
- Defaults agents
- Acp integration (#4)
- Lint errors
- Prd folder
- Remove orphan web actions and dead surfaces (#55)
- Qa testing and fixes (#73)
- New review rounds (#82)
- Security audit (#90)
- Release qa round (#95)
- Add missing tools (#141)
- New qa round (#147)
- Advanced qa round (#149)
- Homebrew tap
- Final review round (#151)
- Daemon healthy
- Reasoning models (#158)
- Lint errors (#160)
- Review round (#168)
- Release adjustments (#171)
- Stabilize release ci fixtures
- Stabilize release integration gate
- Stabilize release verify gates
- Stabilize release integration flows
- Stabilize release verify gates
- Stabilize main verify shutdown
- Ignore stale acpmock cancel
- Marketplace search focus and filtering (#193)
- Website video
- Workspace command select



### 📚 Documentation

- Update agents.md
- Update prd
- Update skills
- Update compozy tasks
- Update compozy
- Update compozy
- Add new skills
- Archive prd
- Update prds
- Update rfc
- Update prds
- Update prds
- Add automation prd
- Channels prd
- Update prd
- Update prd
- New prds
- Archive prds
- Bridges adapters prd
- Sandbox prd
- Update
- Archive prd
- Update
- Add new prd
- New design
- Update prd
- Archive prds
- Update prds
- Tasks-ui prd tasks
- Update prd
- Update design docs
- Agent capabilities prd
- Improve site docs
- Remove old design references
- Udpate
- Autonomous prd
- Update skills
- Blog design
- Agent sould prd
- Final qa plan
- Update
- Remove codex ledgers from gitignore
- Remove not needed files
- Udpate ledger
- Update cy-codex-loop skill
- Orchestration improves prd
- Update prds
- Orch improvs prd
- Memv2 prd
- Providers model prd
- Update refacs prd
- New design proposal
- Update rules
- Update skills
- New blog posts (#173)
- Format docs
- Remove old design files
- Remove old
- Skeeper update



### 📦 Build System

- Initial structure
- Commitlint
- Frontend base structure
- Update vscode settings
- Add subagents
- Coderabbit
- Prd and tooling
- Bun lock
- Lint tooling
- Copy.md and tooling adjusts
- Add repoclone rc
- Upgrade skeeper to v0.2.0
- Update go.mod
- Adopt task artifacts into skeeper
- Sync codex plans with skeeper
- Skeeper lock
- Skeeper lock
- New skills
- Skeeper lock
- Skeeper lock
- Skeeper lock
- Update deps and go
- Regenerate daytona sidecar assets for go 1.26.3
- Fix cliff
- Ignore docs on fmt
- Build web assets before goreleaser
- Extend release dry-run timeout



### 🔧 CI/CD

- Lint errors
- Fint release pr
- Fix goreleaser
- Fix release
- Fix release process
- Fix release sync
- Decouple release dry-run npm auth
- Persist web assets git auth



### 🧪 Testing

- Add e2e tests (#27)
- Qa rounds (#78)
- Improve test suite (#138)
- Harden daemon-served restart reloads
- Harden daemon-served readiness waits
- Stabilize dashboard focus assertion
- Stabilize release integration gates
- Stabilize release e2e markers
- Stabilize release e2e flows
- Improve suite speed


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated web assets dependency to a newer version for improved
stability and performance.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/compozy/agh/pull/211?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
pedronauck added a commit that referenced this pull request May 27, 2026
## Release v0.0.2

This PR prepares the release of version v0.0.2.

### Changelog

## 0.0.2 - 2026-05-27



### Other Changes

- Lessons learned



### ♻️ Refactoring

- Project structure (#7)
- Kb improvements (#12)
- Rename spaces to channels (#17)
- Add extensions gaps (#21)
- Improve tool calls ui (#22)
- Remove web app header
- Module improvements (#29)
- Memory improvements (#35)
- Storybook for web and ui (#38)
- Enable AGH network by default for new installs (#57)
- Hermes adjustments (#69)
- Badges design (#84)
- Storybook scenario and logos gallery
- Migrate typescript tests (#114)
- Internal go packages (#120)
- Ui patterns (#127)
- Improve e2e tests (#130)
- Ui redesign
- Workspace isolation across runtime surfaces (#145)
- Prod ready applies (#162)
- Tool card ui (#164)
- Alpha on logo
- Prod ready features (#167)
- Thread sheet (#202)



### 🎉 Features

- Implement config foundation packages
- Implement sqlite store package
- Add ACP client package
- Add session lifecycle manager
- Implement observe package
- Add daemon composition root
- Add uds api server
- Implement cli package
- Add http api server
- Add system design
- Add foundation types, schemas, and layout shell for web client
- Add daemon health polling and agent sidebar systems for web client
- Add session system CRUD, streaming core, and session store for web
client
- Add chat view, messages, and composer tests for web client
- Add tool cards and renderers for web client
- Add file-backed memory store core
- Scaffold memory session seams
- Add memory dream consolidation service
- Wire memory assembler into daemon
- Add memory api and cli
- New skills system (#1)
- Add workspace entity (#5)
- Add new skill capabilities (#8)
- Web ui v2 (#9)
- Improve hooks system (#10)
- Session resilience (#11)
- Add extensability (#13)
- Add automation (#16)
- Add channels (#14)
- Add network implementation (#15)
- Add network, bridges and automations web pages (#18)
- Ext registry (#20)
- Add core tasks (#19)
- Bridge adapters (#23)
- Add site (#26)
- Add ext refac and sandbox (#25)
- Settings ui (#37)
- Tasks ui (#36)
- Harness improvements (#44)
- Agent capabilities (#49)
- Redesign ui (#48)
- Unify capability (#53)
- Redesign network workspace (#59)
- Add task deletion and split session delete from stop (#58)
- Session provider selection (#60)
- Production grade adjustments (#66)
- Autonomous system (#75)
- Add agent session route (#80)
- Tools registry (#85)
- Agents soul (#88)
- Add network threads (#105)
- Orchestration improvements (#106)
- Memory v2 (#108)
- Agent categories (#113)
- Providers model (#118)
- Add canonical AGH bundled skill (#143)
- Onboarding and improvements (#198)
- Onboarding and improvements (#201)



### 🐛 Bug Fixes

- Review round
- Review rounds
- Resolve memory extensibility review batch
- Embed web into daemon
- Defaults agents
- Acp integration (#4)
- Lint errors
- Prd folder
- Remove orphan web actions and dead surfaces (#55)
- Qa testing and fixes (#73)
- New review rounds (#82)
- Security audit (#90)
- Release qa round (#95)
- Add missing tools (#141)
- New qa round (#147)
- Advanced qa round (#149)
- Homebrew tap
- Final review round (#151)
- Daemon healthy
- Reasoning models (#158)
- Lint errors (#160)
- Review round (#168)
- Release adjustments (#171)
- Stabilize release ci fixtures
- Stabilize release integration gate
- Stabilize release verify gates
- Stabilize release integration flows
- Stabilize release verify gates
- Stabilize main verify shutdown
- Ignore stale acpmock cancel
- Marketplace search focus and filtering (#193)
- Website video
- Workspace command select



### 📚 Documentation

- Update agents.md
- Update prd
- Update skills
- Update compozy tasks
- Update compozy
- Update compozy
- Add new skills
- Archive prd
- Update prds
- Update rfc
- Update prds
- Update prds
- Add automation prd
- Channels prd
- Update prd
- Update prd
- New prds
- Archive prds
- Bridges adapters prd
- Sandbox prd
- Update
- Archive prd
- Update
- Add new prd
- New design
- Update prd
- Archive prds
- Update prds
- Tasks-ui prd tasks
- Update prd
- Update design docs
- Agent capabilities prd
- Improve site docs
- Remove old design references
- Udpate
- Autonomous prd
- Update skills
- Blog design
- Agent sould prd
- Final qa plan
- Update
- Remove codex ledgers from gitignore
- Remove not needed files
- Udpate ledger
- Update cy-codex-loop skill
- Orchestration improves prd
- Update prds
- Orch improvs prd
- Memv2 prd
- Providers model prd
- Update refacs prd
- New design proposal
- Update rules
- Update skills
- New blog posts (#173)
- Format docs
- Remove old design files
- Remove old
- Skeeper update



### 📦 Build System

- Initial structure
- Commitlint
- Frontend base structure
- Update vscode settings
- Add subagents
- Coderabbit
- Prd and tooling
- Bun lock
- Lint tooling
- Copy.md and tooling adjusts
- Add repoclone rc
- Upgrade skeeper to v0.2.0
- Update go.mod
- Adopt task artifacts into skeeper
- Sync codex plans with skeeper
- Skeeper lock
- Skeeper lock
- New skills
- Skeeper lock
- Skeeper lock
- Skeeper lock
- Update deps and go
- Regenerate daytona sidecar assets for go 1.26.3
- Fix cliff
- Ignore docs on fmt
- Build web assets before goreleaser
- Extend release dry-run timeout
- Fix release dry-run token contract



### 🔧 CI/CD

- Lint errors
- Fint release pr
- Fix goreleaser
- Fix release
- Fix release process
- Fix release sync
- Decouple release dry-run npm auth
- Persist web assets git auth
- Require npm auth before release merge



### 🧪 Testing

- Add e2e tests (#27)
- Qa rounds (#78)
- Improve test suite (#138)
- Harden daemon-served restart reloads
- Harden daemon-served readiness waits
- Stabilize dashboard focus assertion
- Stabilize release integration gates
- Stabilize release e2e markers
- Stabilize release e2e flows
- Improve suite speed


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
  * Updated dependencies to latest versions.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/compozy/agh/pull/214?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant