feat: autonomous system#75
Conversation
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
WalkthroughAdds a comprehensive agent autonomy surface: agent identity resolution, agent-facing API contracts and handlers (channels, context, spawn, task lease operations), CLI client/commands for agent workflows, coordinator/autonomy config and boot integration, and related conversions, tests, and OpenAPI updates. Changes
Sequence DiagramssequenceDiagram
actor CLI as CLI/Agent
participant Auth as AgentIdentity.Resolve
participant Session as Session Service
participant Handlers as API Handlers
participant Task as Task Service
CLI->>Auth: Resolve(session_id, agent_name, workspace_id)
Auth->>Session: Lookup(session_id)
Session-->>Auth: SessionSnapshot
Auth->>Auth: Validate active, agent/workspace match
Auth-->>CLI: Caller (ActorContext + Session)
CLI->>Handlers: Call agent task endpoint (claim/heartbeat/complete)
Handlers->>Task: Invoke task manager with ActorContext, claim_token
Task-->>Handlers: Run / lease info
Handlers-->>CLI: Return run/lease response (claim_token redacted)
sequenceDiagram
participant Bootstrap as Daemon Bootstrap
participant CoordRes as CoordinatorConfigResolver
participant Coordinator as Coordinator Actor
participant SessionMgr as Session Manager
participant Queue as Task Queue
Bootstrap->>CoordRes: ResolveCoordinatorConfig(workspace)
CoordRes-->>Bootstrap: CoordinatorConfig
Bootstrap->>Coordinator: Spawn coordinator session (if bootstrap)
Coordinator->>SessionMgr: Create child session + lineage
Queue->>Coordinator: New task arrives
Coordinator->>Queue: ClaimNext + Heartbeat loop
Queue-->>Coordinator: Executable run(s)
Coordinator->>Queue: Complete/Fail run
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
Comment |
There was a problem hiding this comment.
Actionable comments posted: 12
🧹 Nitpick comments (22)
internal/api/udsapi/handlers_test.go (1)
501-517: Add binding assertions for the new/api/agent/...routes.Line 513 extends the shared binding map, but the new agent endpoints added above are still only covered by route presence. A miswire on
AgentTaskClaimNext,AgentTaskComplete, orAgentChannelReplywould still pass this suite.As per coding guidelines, "Focus on critical paths: workflow execution, state management, error handling".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/udsapi/handlers_test.go` around lines 501 - 517, The test's expectedHandlers map is missing bindings for the new /api/agent endpoints; update the map (in the same test that declares expectedHandlers) to include entries for "POST /api/agent/tasks/claim-next" -> "AgentTaskClaimNext", "POST /api/agent/tasks/:id/complete" -> "AgentTaskComplete", and "POST /api/agent/channels/:id/reply" -> "AgentChannelReply" so the suite asserts the route-to-handler bindings rather than only route presence.internal/api/core/tasks_surface_integration_test.go (1)
278-307: Capture and assert the forwardedExecutionRequest.These three stubs discard the new
taskpkg.ExecutionRequest, so this test still passes if the handlers stop bindingidempotency_keyornetwork_channeland forward a zero-value request. Please record the request for at least one publish/start/approve call and assert the handler passed the expected payload through.As per coding guidelines,
Focus on critical paths: workflow execution, state management, error handlingandEnsure tests verify behavior outcomes, not just function calls.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/tasks_surface_integration_test.go` around lines 278 - 307, The three stub handlers PublishTaskFn, StartTaskFn, and ApproveTaskFn ignore the incoming taskpkg.ExecutionRequest so the test won’t catch regressions in forwarded fields; update these handlers to capture and record the request argument (e.g., push the incoming taskpkg.ExecutionRequest into a shared slice/map alongside the existing appendCall) for at least one of publish/start/approve, then add assertions in the test that the recorded ExecutionRequest contains the expected idempotency_key and network_channel values (or other expected fields) to ensure the handler forwards the request payload.internal/api/udsapi/udsapi_integration_test.go (1)
1386-1411: Exercise re-approval with an explicit idempotency key.Both approve calls send an empty body, so this never verifies the new
TaskExecutionRequest.idempotency_keypath. The same run ID could still be returned by an "already approved" fast path, which leaves the actual execution dedupe behavior untested.Minimal change
- approveResp := mustUnixRequest(t, runtime.client, http.MethodPost, "http://unix/api/tasks/"+approvalTask.ID+"/approve", nil, nil) + body := []byte(`{"idempotency_key":"approve-1"}`) + approveResp := mustUnixRequest(t, runtime.client, http.MethodPost, "http://unix/api/tasks/"+approvalTask.ID+"/approve", body, nil) // ... - approveAgainResp := mustUnixRequest(t, runtime.client, http.MethodPost, "http://unix/api/tasks/"+approvalTask.ID+"/approve", nil, nil) + approveAgainResp := mustUnixRequest(t, runtime.client, http.MethodPost, "http://unix/api/tasks/"+approvalTask.ID+"/approve", body, nil)As per coding guidelines,
Focus on critical paths: workflow execution, state management, error handlingandEnsure tests verify behavior outcomes, not just function calls.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/udsapi/udsapi_integration_test.go` around lines 1386 - 1411, The test currently re-posts approval with an empty body, so it never exercises TaskExecutionRequest.idempotency_key handling; change the second approve POST (the mustUnixRequest call that produces approveAgainResp) to send a JSON body with a non-empty idempotency_key (e.g. {"idempotency_key":"reapprove-1"}) and then update the assertion on approvedAgain (the decoded response from approveAgainResp) to verify the run behavior for that explicit key — for example assert approvedAgain.Run.ID != approved.Run.ID if you expect a new run when providing a distinct idempotency key (or assert equality if you intend to test dedupe by sending the same idempotency_key); reference mustUnixRequest, approvalTask.ID, TaskExecutionRequest.idempotency_key, approveAgainResp and approved.Run.ID when making the change.internal/cli/agent_identity_test.go (1)
13-69: Use the repository’s default subtest pattern here.These two cases are independent and would fit better as a small table-driven suite with
t.Run("Should...")subtests instead of separate top-level tests.As per coding guidelines, "Table-driven tests with subtests (t.Run) as default." and "MUST use t.Run("Should...") pattern for ALL test cases".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/agent_identity_test.go` around lines 13 - 69, Combine the two top-level tests into a single table-driven test using t.Run subtests so they follow the repository's default "Should..." subtest pattern: create one TestResolveAgentCallerFromEnv that sets up common deps (using newTestDeps and stubClient) and then t.Run("Should use daemon session lookup") to implement the logic currently in TestResolveAgentCallerFromEnvUsesDaemonSessionLookup (including the client.getSessionFn check and the resolveAgentCallerFromEnv call) and t.Run("Should reject missing identity before lookup") to implement the logic from TestResolveAgentCallerFromEnvRejectsMissingIdentityBeforeLookup (including the client.getSessionFn that must not be called and the ErrIdentityRequired/asserted exit code), keeping the same assertions and using resolveAgentCallerFromEnv, agentidentity.ErrIdentityRequired, and cliExitCodeForError so tests remain functionally identical.internal/api/core/tasks_surface_test.go (1)
657-670: Add a negative-path test forPOST /tasks/{id}/start.This file adds happy-path coverage for the new start endpoint, but the error-path suite never exercises it. A regression in start-specific conflict/not-found mapping would currently slip through.
As per coding guidelines, "Focus on critical paths: workflow execution, state management, error handling".
Also applies to: 855-1058
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/tasks_surface_test.go` around lines 657 - 670, Add a negative-path test exercising POST /tasks/{id}/start that verifies error mapping for not-found and conflict cases; reuse performRequest(t, fixture.Engine, http.MethodPost, "/tasks/task-1/start", nil) and testutil.DecodeJSONResponse to send the request and decode responses, then assert expected HTTP status codes (e.g., 404 for missing task, 409 for start conflict) and validate the decoded error payload (use the existing contract error response type or compare body string) instead of only asserting success via contract.TaskExecutionResponse; ensure you simulate the error conditions (e.g., remove or lock the task in the fixture/state before calling Start) and add assertions parallel to the existing happy-path checks around startPayload/run and startActor to cover start-specific conflict/not-found mapping.internal/api/httpapi/httpapi_integration_test.go (1)
1567-1591: Re-use an explicitidempotency_keyon the second approve call.Right now the repeated approve request has no body, so this only proves the endpoint is re-entrant after approval. It does not verify the new
TaskExecutionRequestidempotency contract, and a handler that ignored idempotency keys entirely would still pass.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/httpapi/httpapi_integration_test.go` around lines 1567 - 1591, The second approve call is sent with no body so the test doesn't verify the idempotency_key behavior; change the second POST to include a JSON TaskExecutionRequest with the same IdempotencyKey used for the first approval request (build a body struct matching TaskExecutionRequest, marshal it, set Content-Type, and call mustHTTPRequest with that body) and then assert approvedAgain.Run.ID == approved.Run.ID to validate the idempotency contract; reference approvalTask.ID, mustHTTPRequest, TaskExecutionRequest, contract.TaskExecutionResponse, approved.Run.ID and approvedAgain.Run.ID when updating the test.internal/cli/cli_integration_test.go (1)
1311-1660: Break this lifecycle coverage into focused subtests.This single test exercises claim, reconnect, coordination messaging, completion, no-work, and stale-token recovery. Splitting those into
t.Run("Should...")cases will make failures actionable and keep the setup/recovery flow easier to maintain.As per coding guidelines,
**/*_test.go: "MUST use t.Run("Should...") pattern for ALL test cases".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/cli_integration_test.go` around lines 1311 - 1660, The TestCLIAgentTaskLeaseLifecycleIntegration test is too large and must be broken into focused t.Run subtests; refactor TestCLIAgentTaskLeaseLifecycleIntegration so the common setup (h := newIntegrationHarness, daemon start/stop, workspace/session creation, created/enqueued run, and agentDeps getenv) remains in the parent function and create separate subtests via t.Run("Should claim run", func(t *testing.T){...}), t.Run("Should reconnect and resume", ...), t.Run("Should heartbeat renew lease", ...), t.Run("Should send coordination message", ...), t.Run("Should complete run and reject stale completions", ...), and t.Run("Should recover and reject stale-token actions", ...); each subtest should only perform the specific actions/assertions (use mustExecuteRoot, executeRootCommand, json.Unmarshal, and the existing token/channel variables from parent scope or return values) so failures are isolated and setup/teardown (daemon stop/start and h.runner.waitForExit) is not duplicated.internal/cli/client_test.go (1)
29-381: Split these new agent client tests intot.Run("Should...")subtests.Each function currently packs several independent request/response paths into one assertion chain, so the first failure hides the rest of the transport coverage and makes regressions harder to localize.
As per coding guidelines,
**/*_test.go: "MUST use t.Run("Should...") pattern for ALL test cases".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/client_test.go` around lines 29 - 381, Each test function bundles multiple independent scenarios so a single failure hides other cases; split each into t.Run subtests that exercise one behavior per subtest. For TestUnixSocketClientAgentMeSendsIdentityHeaders create a t.Run like "Should send identity headers for AgentMe" that calls unixSocketClient.AgentMe and asserts headers; for TestUnixSocketClientAgentChannelMethodsSendIdentityHeaders create separate t.Run cases for AgentChannels, AgentChannelRecv, AgentChannelSend, and AgentChannelReply (calling AgentChannels, AgentChannelRecv, AgentChannelSend, AgentChannelReply respectively) and move the corresponding transport branches/assertions into each subtest; for TestUnixSocketClientAgentTaskMethods create t.Run cases for ClaimNext, ClaimNext_NoWork, Heartbeat, Complete, Fail, and Release (calling AgentTaskClaimNext, AgentTaskHeartbeat, AgentTaskComplete, AgentTaskFail, AgentTaskRelease) with their specific request/response checks; and for TestUnixSocketClientAgentTaskErrorsRedactClaimTokens wrap the error-redaction check in its own t.Run. Ensure each subtest constructs its own unixSocketClient/httpClient mock or isolates the transport handler so failures do not prevent other subtests from running.internal/daemon/coordinator_config.go (1)
22-38: Add a compile-time assertion for the new resolver implementation.This introduces a new exported interface plus one concrete implementation. A
var _ CoordinatorConfigResolver = (*defaultCoordinatorConfigResolver)(nil)guard will catch interface drift at build time instead of at runtime.Proposed fix
type defaultCoordinatorConfigResolver struct { config *aghconfig.Config workspaceResolver workspacepkg.RuntimeResolver agents coordinatorAgentResolver } + +var _ CoordinatorConfigResolver = (*defaultCoordinatorConfigResolver)(nil)As per coding guidelines, "Use compile-time interface verification with
var _ Interface = (*Type)(nil)in Go."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/coordinator_config.go` around lines 22 - 38, Add a compile-time interface assertion to ensure defaultCoordinatorConfigResolver implements CoordinatorConfigResolver by adding the guard `var _ CoordinatorConfigResolver = (*defaultCoordinatorConfigResolver)(nil)` at package scope (near the type or constructor), so any future interface drift is caught at build time; reference the CoordinatorConfigResolver interface and defaultCoordinatorConfigResolver concrete type when adding this assertion.internal/api/udsapi/agent_identity_test.go (1)
145-146: Handle thejson.Marshalfailure here instead of discarding it.If
contract.AgentMeResponsestops serializing cleanly, this failure path will hide the real problem behind_and make the assertion output less trustworthy.Proposed fix
- encoded, _ := json.Marshal(response.Me) - t.Fatalf("response.Me = %s, want active session in workspace ws-1", encoded) + encoded, err := json.Marshal(response.Me) + if err != nil { + t.Fatalf("json.Marshal(response.Me) error = %v", err) + } + t.Fatalf("response.Me = %s, want active session in workspace ws-1", encoded)As per coding guidelines, "Never ignore errors with
_in Go — every error must be handled or have a written justification."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/udsapi/agent_identity_test.go` around lines 145 - 146, The test currently discards the error from json.Marshal(response.Me); change the call to capture the error (e.g., encoded, err := json.Marshal(response.Me)) and if err != nil call t.Fatalf with a message that includes the marshal error (for example "failed to marshal response.Me: %v"), otherwise format encoded into the existing failure message; update the lines that reference encoded and t.Fatalf accordingly so json.Marshal errors are handled instead of ignored.internal/api/core/tasks.go (1)
1471-1479: ExecutionRequest lacks aValidate()method used by peer request types.The mapper validates
NetworkChannelviavalidateTaskChannel(), but unlikeenqueueTaskRunFromRequest(which callsspec.Validate()),taskExecutionRequestFromRequesthas no centralized validation for the domain struct. Peer types likeEnqueueRun,ClaimRun, andStartRunall defineValidate()methods;ExecutionRequestshould follow the same pattern for consistency. Downstream normalization handles metadata size validation, but this split responsibility is fragile. Consider adding aValidate()method toExecutionRequest.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/tasks.go` around lines 1471 - 1479, The taskExecutionRequestFromRequest mapper creates a taskpkg.ExecutionRequest but doesn't provide a Validate() method like peer domain types (e.g., EnqueueRun/ClaimRun/StartRun) and so validation is split; add a Validate() method on the taskpkg.ExecutionRequest type that checks NetworkChannel via validateTaskChannel and validates IdempotencyKey/Metadata invariants (size/format) currently expected downstream, then update taskExecutionRequestFromRequest to construct the ExecutionRequest and call its Validate() (similar to enqueueTaskRunFromRequest calling spec.Validate()), ensuring centralized validation inside the domain type.internal/api/core/agent_channels.go (4)
392-420: mergeCoordinationChannels: Unreachable nil check after make.Line 416 checks
if merged == nilbutmergedis initialized withmake(...)on line 411, so it can never be nil. The slice may be empty but not nil.♻️ Remove unreachable nil check
merged := make([]contract.CoordinationChannelPayload, 0, len(mergedByID)) for _, channel := range mergedByID { merged = append(merged, channel) } sortCoordinationChannels(merged) - if merged == nil { - return []contract.CoordinationChannelPayload{} - } return merged🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/agent_channels.go` around lines 392 - 420, The nil check for merged in mergeCoordinationChannels is unreachable because merged is created with make and therefore never nil; remove the if merged == nil block and simply return merged (after sortCoordinationChannels), keeping the existing behavior of returning an empty slice when there are no entries and preserving use of NormalizeCoordinationChannelPayload and firstNonEmpty as currently implemented.
743-764: coordinationMetadataFromEnvelope: Fallback to entire Ext as metadata is fragile.Lines 754-762 attempt to unmarshal the entire
envelope.Extmap as coordination metadata if no known key is found. This could incorrectly succeed ifExthappens to contain fields matchingCoordinationMessageMetadataPayload, even when it's not actual coordination metadata.Consider whether this fallback is intentional or if it should be removed to avoid false positives.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/agent_channels.go` around lines 743 - 764, The fallback in coordinationMetadataFromEnvelope that marshals the entire envelope.Ext and then unmarshals it into contract.CoordinationMessageMetadataPayload is fragile and can cause false positives; update coordinationMetadataFromEnvelope to remove this broad fallback and only accept coordination metadata when one of the explicit keys (agentCoordinationExtKey, "coordination_metadata", "agh_coordination", "metadata") yields a successful unmarshal, or if you need a fallback add a strict discriminator check (e.g., require a specific "_type" or "coordination" boolean field in envelope.Ext) before attempting the marshal/unmarshal; modify the function to either delete the len(envelope.Ext)>0 block or guard it with an explicit discriminator check so only genuine coordination payloads are returned.
74-104: AgentChannelRecv: Double filtering of envelopes.Line 91-101 calls
agentChannelInboxwhich internally callsfilterAgentChannelEnvelopes, then line 102 callsagentChannelMessagesFromEnvelopeswhich also callsfilterAgentChannelEnvelopes(line 671). This results in filtering the envelopes twice with the same channel.♻️ Consider removing redundant filter
In
agentChannelMessagesFromEnvelopes, the first line callsfilterAgentChannelEnvelopesagain. SinceagentChannelInboxalready filters, either:
- Remove the filter call in
agentChannelMessagesFromEnvelopes, or- Pass an empty channel to skip filtering
func agentChannelMessagesFromEnvelopes( envelopes []network.Envelope, channel string, limit int, ) []contract.AgentChannelMessagePayload { - filtered := filterAgentChannelEnvelopes(envelopes, channel) - messages := make([]contract.AgentChannelMessagePayload, 0, len(filtered)) - for _, envelope := range filtered { + messages := make([]contract.AgentChannelMessagePayload, 0, len(envelopes)) + for _, envelope := range envelopes {🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/agent_channels.go` around lines 74 - 104, AgentChannelRecv is causing envelopes to be filtered twice because agentChannelInbox already calls filterAgentChannelEnvelopes; remove the redundant filtering by deleting the initial call to filterAgentChannelEnvelopes inside agentChannelMessagesFromEnvelopes (or guard it so it only runs when no pre-filtered channel is provided). Update the agentChannelMessagesFromEnvelopes function to assume envelopes are already channel-filtered (or accept an empty channel to skip filtering) and ensure callers like AgentChannelRecv pass the pre-filtered envelopes unchanged.
666-710: agentChannelMessagesFromEnvelopes: Similar unreachable nil check.Line 706 checks
if messages == nilbut messages is initialized withmake(...)on line 672. Same issue as inmergeCoordinationChannels.♻️ Remove unreachable nil check
if limit > 0 && len(messages) > limit { return messages[:limit] } - if messages == nil { - return []contract.AgentChannelMessagePayload{} - } return messages🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/agent_channels.go` around lines 666 - 710, In agentChannelMessagesFromEnvelopes the final nil check for messages is unreachable because messages is created with make(...) at the top; remove the if messages == nil { return []contract.AgentChannelMessagePayload{} } branch and ensure the function simply returns messages (after applying limit), keeping the existing sorting and limit handling and referencing the messages slice and the function agentChannelMessagesFromEnvelopes for locating the change.internal/daemon/coordinator_config_test.go (1)
70-121: Workspace config test copies the entire global config struct.Line 80 performs a shallow copy of the config struct. While this works for value types, if
aghconfig.Configcontains pointer or slice fields, modifications toworkspaceCfgcould affectglobal. This appears safe given the current usage, but the intent would be clearer with explicit field initialization.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/coordinator_config_test.go` around lines 70 - 121, The test TestCoordinatorConfigResolverPrefersWorkspaceConfig currently creates workspaceCfg by assigning workspaceCfg := global which is a shallow copy and can leak mutations if aghconfig.Config later contains pointers/slices; instead construct workspaceCfg explicitly (e.g., call defaultCoordinatorResolverConfig(t) or copy fields) and then set only the Coordinator-related fields you need before passing it into coordinatorWorkspaceResolverStub so changes to workspaceCfg cannot affect global; update references in the test to use workspaceCfg created from defaultCoordinatorResolverConfig or by copying individual fields rather than direct assignment.internal/config/autonomy_test.go (1)
46-94: Missing t.Parallel() for test that can run concurrently.This test uses
t.SetenvviaprepareAutonomyConfigTestEnv, which Go's test framework handles correctly for parallel tests. Consider addingt.Parallel()after the helper call.♻️ Suggested improvement
func TestLoadWorkspaceOverridesAutonomyCoordinatorValues(t *testing.T) { workspaceRoot, homePaths := prepareAutonomyConfigTestEnv(t) + t.Parallel()Note: Since
prepareAutonomyConfigTestEnvcallst.Setenv, it must be called beforet.Parallel(). However, looking more closely,t.Setenvdoesn't work witht.Parallel()if called before it. This test may correctly omitt.Parallel()due to environment variable manipulation. Consider documenting this constraint.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/config/autonomy_test.go` around lines 46 - 94, The test TestLoadWorkspaceOverridesAutonomyCoordinatorValues should be made parallel-safe: either call t.Parallel() immediately after prepareAutonomyConfigTestEnv(t) (ensuring prepareAutonomyConfigTestEnv — which calls t.Setenv — runs before t.Parallel()), or if t.Setenv interactions prevent safe parallelization, add a brief comment inside TestLoadWorkspaceOverridesAutonomyCoordinatorValues explaining why t.Parallel() is intentionally omitted; reference the test name and the prepareAutonomyConfigTestEnv helper when making the change.internal/api/udsapi/agent_channels_test.go (2)
190-233: Verify WaitInbox is correctly invoked only for wait=true.The test validates
WaitInboxis called with the correct parameters, but there's no explicit negative test ensuringInbox(notWaitInbox) is called whenwait=false. TheInboxFncallback willt.Fatalif called, but only during the wait=true scenario.Consider adding a separate subtest or case that explicitly verifies
wait=falseusesInboxinstead ofWaitInbox.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/udsapi/agent_channels_test.go` around lines 190 - 233, Add a new subtest (or a sibling test) to verify the non-wait path: reuse the same pattern in TestAgentChannelRecvWaitUsesNetworkWaitInbox but configure stubNetworkService so InboxFn records the sessionID/channel and returns envelopes while WaitInboxFn calls t.Fatal if invoked; then call performAgentKernelRequest with the same endpoint but "?wait=false&limit=1" (or omit wait) and assert HTTP 200, that the recorded session/channel match "sess-agent"/"builders", and that the returned message(s) come from Inbox (check MessageID/Metadata) ensuring Inbox is used instead of WaitInbox.
302-326: Consider extracting shared session fixture.This
activeAgentSessionManagerfunction duplicates similar logic that appears ininternal/api/core/agent_channels_internal_test.go(agentCoreSessionManager). Consider extracting a shared test fixture to avoid duplication across test packages.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/udsapi/agent_channels_test.go` around lines 302 - 326, The test duplicates session fixture logic from agentCoreSessionManager; create a shared test helper (e.g., session fixture factory) and replace both activeAgentSessionManager and agentCoreSessionManager with calls to that helper: implement a single exported function (name it something like NewActiveAgentSessionManager or SharedActiveSessionManager) that returns the stubSessionManager configured with the same session.Info values (ID "sess-agent", AgentName "coder", Provider "test-provider", WorkspaceID "ws-1", Channel "builders", SessionTypeUser, State Active and the fixed timestamp), then update tests to call the new shared helper instead of duplicating the logic.internal/agentidentity/identity_test.go (1)
334-364: Consider adding test case names for clarity.This test validates multiple fallback scenarios but doesn't use
t.Runfor each case. While the assertions are clear, using subtests would improve test output readability and isolation.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/agentidentity/identity_test.go` around lines 334 - 364, Split TestErrorPayloadFallbacksAndExitCodes into named subtests using t.Run for each scenario (e.g., "nil error", "generic error", "identity required") and move the assertions for each case into those subtests so failures show descriptive names; call t.Parallel() at the start of the top-level test and optionally inside each subtest, and keep using the existing helpers ExitCodeForError and ErrorPayloadFor to perform the same checks so behavior is unchanged but test output is clearer and isolated.internal/config/autonomy.go (1)
27-29: Consider adding compile-time interface verification forproviderResolver.The coding guidelines recommend using compile-time interface verification. If
*Configis intended to implementproviderResolver, add a check to catch implementation drift at compile time.♻️ Proposed fix
type providerResolver interface { ResolveProvider(name string) (ProviderConfig, error) } + +var _ providerResolver = (*Config)(nil)As per coding guidelines: "Use compile-time interface verification with
var _ Interface = (*Type)(nil)in Go".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/config/autonomy.go` around lines 27 - 29, Add a compile-time interface verification to ensure Config implements providerResolver: insert the standard check using the providerResolver interface and the Config type (e.g., the var _ providerResolver = (*Config)(nil) pattern) near the type declarations so any drift in methods on Config vs. providerResolver fails at compile time.internal/agentidentity/identity.go (1)
159-167: Semantic concern: nil context maps toErrIdentityStale.A nil context typically indicates a programming error rather than a stale identity. Mapping it to
ErrIdentityStalewith "identity_lookup_unavailable" may conflate infrastructure bugs with legitimate identity staleness scenarios. Consider whether a distinct error code would better support debugging.That said, the current behavior is safe (fails closed) and the action message "retry after the daemon is reachable" is reasonable for operational recovery.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/agentidentity/identity.go` around lines 159 - 167, In validateResolveInputs, do not map a nil ctx to ErrIdentityStale; instead introduce and return a distinct error code (e.g., ErrIdentityLookupUnavailable or ErrInvalidContext) via identityError when ctx == nil so programming errors are not conflated with stale identities; update the identityError call in validateResolveInputs (and any related docs/tests) to use the new error constant while keeping or clarifying the message key ("identity_lookup_unavailable") and the actionable text.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@internal/api/core/agent_contracts_test.go`:
- Around line 12-40: Replace the single compound assertion in
TestCoordinatorConfigPayloadFromConfig with a table-driven set of t.Run subtests
that each assert one behavior of CoordinatorConfigPayloadFromConfig: trimming of
strings (AgentName/Provider/Model), conversion of DefaultTTL to
DefaultTTLSeconds, handling of Enabled=false (disabled configs),
MaxChildren/MaxActivePerWorkspace mapping, Source/WorkspaceID handling including
empty workspace trimming, etc.; for each table case call t.Run("Should ...") and
run t.Parallel() inside each subtest, construct inputs using
aghconfig.CoordinatorConfig and call core.CoordinatorConfigPayloadFromConfig,
then assert only the one expected property per subtest to make failures clear.
In `@internal/api/core/agent_identity.go`:
- Around line 17-29: StatusForAgentIdentityError currently maps the "session
service not configured" dependency error to 500; update
StatusForAgentIdentityError to return http.StatusServiceUnavailable (503) for
that case by checking the session-service-specific sentinel error (e.g.,
errors.Is(err, agentidentity.ErrSessionServiceNotConfigured) or, if no sentinel
exists, matching err.Error() == "api: session service is not configured"); also
apply the same 503 mapping in the other similar handler referenced (the block
around the other occurrence at lines 64-66).
In `@internal/api/core/conversions_parsers_test.go`:
- Around line 137-188: The test TestRuntimeActivityPayloadFromSessionMeta
bundles multiple scenarios; refactor it into t.Run subtests following the repo
pattern (use descriptive "Should..." names) and convert the similar cases in the
later block (lines 217-292) into table-driven subtests as well; specifically,
create subtests for the nil input, empty SessionLivenessMeta, and the populated
SessionActivityMeta case, using t.Run("Should ...") wrappers and a table for any
repeating assertions so each scenario is its own subtest while keeping the
existing assertions and references to RuntimeActivityPayloadFromSessionMeta,
store.SessionLivenessMeta and store.SessionActivityMeta.
In `@internal/api/core/tasks_internal_test.go`:
- Around line 307-366: Wrap the test body of
TestTaskRunPayloadFromRunExposesLeaseStateWithoutRawClaimToken in a t.Run
subtest named with the "Should..." pattern (e.g. t.Run("Should not expose raw
claim tokens and expose lease state", func(t *testing.T) { ... })), move the
existing t.Parallel() call inside that subtest function, and keep all current
assertions and use of TaskRunPayloadFromRun unchanged so the behavior and checks
remain the same.
In `@internal/api/core/tasks_surface_integration_test.go`:
- Around line 331-347: The table-driven loop over mutation routes should be
converted into named subtests using t.Run so failures are isolated and follow
the "Should..." pattern; for each case in the slice (paths like
"/tasks/task-1/publish", "/tasks/task-1/start", "/tasks/task-1/approve", etc.)
replace the anonymous iteration with t.Run("Should <action or path>", func(t
*testing.T){ resp := performRequest(t, fixture.Engine, http.MethodPost, tc.path,
nil); if resp.Code != tc.want { t.Fatalf("%s status = %d, want %d; body=%s",
tc.path, resp.Code, tc.want, resp.Body.String()) } }) ensuring each test name
describes the expectation (e.g., "Should return 201 for /tasks/task-1/start")
and keep the same performRequest call and assertion logic inside each subtest.
In `@internal/api/spec/spec.go`:
- Around line 2235-2246: The OpenAPI spec currently lists RequestBody:
contract.TaskExecutionRequest{} for the approveTask operation which causes
buildOperation to treat a body as required; change the operation's RequestBody
to be nil/absent or a nil pointer (e.g., set RequestBody to nil or
(*contract.TaskExecutionRequest)(nil)) for the Method "POST" Path
"/api/tasks/{id}/approve" / OperationID "approveTask" so buildOperation will not
mark the body required and the empty-POST test can succeed.
In `@internal/api/testutil/apitest.go`:
- Around line 1023-1032: The StubNetworkService.WaitInbox fallback currently
ignores the channel and returns immediately by delegating to Inbox; change it so
when WaitInboxFn is nil the stub simulates the real "wait" behavior: repeatedly
call s.Inbox(ctx, sessionID) (or otherwise check the underlying inbox) filtering
envelopes by the requested channel, loop with a short sleep or use context-aware
waiting until matching envelopes are found or ctx is done, and return ctx.Err()
on cancellation/timeout; update the StubNetworkService.WaitInbox implementation
(referencing WaitInbox, WaitInboxFn, Inbox, and StubNetworkService) to honor the
channel parameter and context cancellation rather than returning immediately.
In `@internal/cli/agent_identity.go`:
- Around line 43-45: The call to client.GetSession returns errors without
context; update the error return in the function that calls client.GetSession
(returning agentidentity.SessionSnapshot{}) to wrap the original error with the
sessionID for actionable context (use fmt.Errorf with "%s: %w" or similar), e.g.
wrap the error from client.GetSession(ctx, sessionID) so the caller sees which
session lookup failed.
In `@internal/cli/agent_kernel.go`:
- Around line 223-287: newChannelReplyCommand currently sets flags :=
coordinationMetadataFlags{kind: string(contract.CoordinationMessageReply)} and
then calls flags.metadata(...), but if the user explicitly passed --kind (e.g.
"status") that override can be ignored; add an explicit check after parsing
flags (before building the request) that detects whether the user provided a
non-empty kind override (inspect the raw/parsed value on flags) and if that
value != string(contract.CoordinationMessageReply) return an error like "--kind
must be reply for `agh ch reply`"; implement the same explicit-kind validation
in the sibling command that handles other coordination replies (the analogous
command in the same file that covers lines around 311-345) so explicit --kind
flags are never silently ignored.
In `@internal/cli/cli_integration_test.go`:
- Around line 1598-1599: The test uses a hard-coded time.Sleep(1500 *
time.Millisecond) after capturing staleToken (staleNext.Claim.ClaimToken), which
makes the test timing-sensitive; replace this fixed sleep with a polling loop
that repeatedly checks the lease/claim state (for example by calling the same
helper/CLI check used elsewhere in the test suite to assert a claim is expired
or marked stale) until the expected condition is true or a reasonable timeout
elapses; implement the poll using a ticker and context timeout (avoid blocking
the test thread), then proceed once the lease is observed expired/stale instead
of sleeping.
In `@internal/cli/spawn.go`:
- Around line 151-160: The "TTL" label is misleading because renderHumanSection
is printing record.Lineage.TTLExpiresAt (a timestamp) via formatTimePtr; update
the UI to either rename the label to "TTL Expires" (or "Expires At") or compute
and render the remaining TTL duration instead; locate the renderHumanSection
call in spawn.go and change the key/value pair that currently uses Label: "TTL"
and Value: stringOrDash(formatTimePtr(record.Lineage.TTLExpiresAt)) to either
Label: "TTL Expires" with the same formatted timestamp or to a computed
remaining TTL string (e.g., subtract time.Now() from record.Lineage.TTLExpiresAt
and format) using formatTimePtr/utility helpers so the label and value
accurately reflect expiry vs remaining time.
In `@internal/cli/task.go`:
- Around line 1361-1369: The trimAgentTaskCapabilities function currently
preserves whitespace-only entries as empty strings; change it so after calling
strings.TrimSpace on each value you skip any result that is empty (i.e., only
append non-empty trimmed strings), ensuring flags like --capability " " are
dropped locally; update the loop in trimAgentTaskCapabilities to perform
TrimSpace into a local variable and only append when that variable != "" so the
returned slice contains no blank capabilities.
---
Nitpick comments:
In `@internal/agentidentity/identity_test.go`:
- Around line 334-364: Split TestErrorPayloadFallbacksAndExitCodes into named
subtests using t.Run for each scenario (e.g., "nil error", "generic error",
"identity required") and move the assertions for each case into those subtests
so failures show descriptive names; call t.Parallel() at the start of the
top-level test and optionally inside each subtest, and keep using the existing
helpers ExitCodeForError and ErrorPayloadFor to perform the same checks so
behavior is unchanged but test output is clearer and isolated.
In `@internal/agentidentity/identity.go`:
- Around line 159-167: In validateResolveInputs, do not map a nil ctx to
ErrIdentityStale; instead introduce and return a distinct error code (e.g.,
ErrIdentityLookupUnavailable or ErrInvalidContext) via identityError when ctx ==
nil so programming errors are not conflated with stale identities; update the
identityError call in validateResolveInputs (and any related docs/tests) to use
the new error constant while keeping or clarifying the message key
("identity_lookup_unavailable") and the actionable text.
In `@internal/api/core/agent_channels.go`:
- Around line 392-420: The nil check for merged in mergeCoordinationChannels is
unreachable because merged is created with make and therefore never nil; remove
the if merged == nil block and simply return merged (after
sortCoordinationChannels), keeping the existing behavior of returning an empty
slice when there are no entries and preserving use of
NormalizeCoordinationChannelPayload and firstNonEmpty as currently implemented.
- Around line 743-764: The fallback in coordinationMetadataFromEnvelope that
marshals the entire envelope.Ext and then unmarshals it into
contract.CoordinationMessageMetadataPayload is fragile and can cause false
positives; update coordinationMetadataFromEnvelope to remove this broad fallback
and only accept coordination metadata when one of the explicit keys
(agentCoordinationExtKey, "coordination_metadata", "agh_coordination",
"metadata") yields a successful unmarshal, or if you need a fallback add a
strict discriminator check (e.g., require a specific "_type" or "coordination"
boolean field in envelope.Ext) before attempting the marshal/unmarshal; modify
the function to either delete the len(envelope.Ext)>0 block or guard it with an
explicit discriminator check so only genuine coordination payloads are returned.
- Around line 74-104: AgentChannelRecv is causing envelopes to be filtered twice
because agentChannelInbox already calls filterAgentChannelEnvelopes; remove the
redundant filtering by deleting the initial call to filterAgentChannelEnvelopes
inside agentChannelMessagesFromEnvelopes (or guard it so it only runs when no
pre-filtered channel is provided). Update the agentChannelMessagesFromEnvelopes
function to assume envelopes are already channel-filtered (or accept an empty
channel to skip filtering) and ensure callers like AgentChannelRecv pass the
pre-filtered envelopes unchanged.
- Around line 666-710: In agentChannelMessagesFromEnvelopes the final nil check
for messages is unreachable because messages is created with make(...) at the
top; remove the if messages == nil { return
[]contract.AgentChannelMessagePayload{} } branch and ensure the function simply
returns messages (after applying limit), keeping the existing sorting and limit
handling and referencing the messages slice and the function
agentChannelMessagesFromEnvelopes for locating the change.
In `@internal/api/core/tasks_surface_integration_test.go`:
- Around line 278-307: The three stub handlers PublishTaskFn, StartTaskFn, and
ApproveTaskFn ignore the incoming taskpkg.ExecutionRequest so the test won’t
catch regressions in forwarded fields; update these handlers to capture and
record the request argument (e.g., push the incoming taskpkg.ExecutionRequest
into a shared slice/map alongside the existing appendCall) for at least one of
publish/start/approve, then add assertions in the test that the recorded
ExecutionRequest contains the expected idempotency_key and network_channel
values (or other expected fields) to ensure the handler forwards the request
payload.
In `@internal/api/core/tasks_surface_test.go`:
- Around line 657-670: Add a negative-path test exercising POST
/tasks/{id}/start that verifies error mapping for not-found and conflict cases;
reuse performRequest(t, fixture.Engine, http.MethodPost, "/tasks/task-1/start",
nil) and testutil.DecodeJSONResponse to send the request and decode responses,
then assert expected HTTP status codes (e.g., 404 for missing task, 409 for
start conflict) and validate the decoded error payload (use the existing
contract error response type or compare body string) instead of only asserting
success via contract.TaskExecutionResponse; ensure you simulate the error
conditions (e.g., remove or lock the task in the fixture/state before calling
Start) and add assertions parallel to the existing happy-path checks around
startPayload/run and startActor to cover start-specific conflict/not-found
mapping.
In `@internal/api/core/tasks.go`:
- Around line 1471-1479: The taskExecutionRequestFromRequest mapper creates a
taskpkg.ExecutionRequest but doesn't provide a Validate() method like peer
domain types (e.g., EnqueueRun/ClaimRun/StartRun) and so validation is split;
add a Validate() method on the taskpkg.ExecutionRequest type that checks
NetworkChannel via validateTaskChannel and validates IdempotencyKey/Metadata
invariants (size/format) currently expected downstream, then update
taskExecutionRequestFromRequest to construct the ExecutionRequest and call its
Validate() (similar to enqueueTaskRunFromRequest calling spec.Validate()),
ensuring centralized validation inside the domain type.
In `@internal/api/httpapi/httpapi_integration_test.go`:
- Around line 1567-1591: The second approve call is sent with no body so the
test doesn't verify the idempotency_key behavior; change the second POST to
include a JSON TaskExecutionRequest with the same IdempotencyKey used for the
first approval request (build a body struct matching TaskExecutionRequest,
marshal it, set Content-Type, and call mustHTTPRequest with that body) and then
assert approvedAgain.Run.ID == approved.Run.ID to validate the idempotency
contract; reference approvalTask.ID, mustHTTPRequest, TaskExecutionRequest,
contract.TaskExecutionResponse, approved.Run.ID and approvedAgain.Run.ID when
updating the test.
In `@internal/api/udsapi/agent_channels_test.go`:
- Around line 190-233: Add a new subtest (or a sibling test) to verify the
non-wait path: reuse the same pattern in
TestAgentChannelRecvWaitUsesNetworkWaitInbox but configure stubNetworkService so
InboxFn records the sessionID/channel and returns envelopes while WaitInboxFn
calls t.Fatal if invoked; then call performAgentKernelRequest with the same
endpoint but "?wait=false&limit=1" (or omit wait) and assert HTTP 200, that the
recorded session/channel match "sess-agent"/"builders", and that the returned
message(s) come from Inbox (check MessageID/Metadata) ensuring Inbox is used
instead of WaitInbox.
- Around line 302-326: The test duplicates session fixture logic from
agentCoreSessionManager; create a shared test helper (e.g., session fixture
factory) and replace both activeAgentSessionManager and agentCoreSessionManager
with calls to that helper: implement a single exported function (name it
something like NewActiveAgentSessionManager or SharedActiveSessionManager) that
returns the stubSessionManager configured with the same session.Info values (ID
"sess-agent", AgentName "coder", Provider "test-provider", WorkspaceID "ws-1",
Channel "builders", SessionTypeUser, State Active and the fixed timestamp), then
update tests to call the new shared helper instead of duplicating the logic.
In `@internal/api/udsapi/agent_identity_test.go`:
- Around line 145-146: The test currently discards the error from
json.Marshal(response.Me); change the call to capture the error (e.g., encoded,
err := json.Marshal(response.Me)) and if err != nil call t.Fatalf with a message
that includes the marshal error (for example "failed to marshal response.Me:
%v"), otherwise format encoded into the existing failure message; update the
lines that reference encoded and t.Fatalf accordingly so json.Marshal errors are
handled instead of ignored.
In `@internal/api/udsapi/handlers_test.go`:
- Around line 501-517: The test's expectedHandlers map is missing bindings for
the new /api/agent endpoints; update the map (in the same test that declares
expectedHandlers) to include entries for "POST /api/agent/tasks/claim-next" ->
"AgentTaskClaimNext", "POST /api/agent/tasks/:id/complete" ->
"AgentTaskComplete", and "POST /api/agent/channels/:id/reply" ->
"AgentChannelReply" so the suite asserts the route-to-handler bindings rather
than only route presence.
In `@internal/api/udsapi/udsapi_integration_test.go`:
- Around line 1386-1411: The test currently re-posts approval with an empty
body, so it never exercises TaskExecutionRequest.idempotency_key handling;
change the second approve POST (the mustUnixRequest call that produces
approveAgainResp) to send a JSON body with a non-empty idempotency_key (e.g.
{"idempotency_key":"reapprove-1"}) and then update the assertion on
approvedAgain (the decoded response from approveAgainResp) to verify the run
behavior for that explicit key — for example assert approvedAgain.Run.ID !=
approved.Run.ID if you expect a new run when providing a distinct idempotency
key (or assert equality if you intend to test dedupe by sending the same
idempotency_key); reference mustUnixRequest, approvalTask.ID,
TaskExecutionRequest.idempotency_key, approveAgainResp and approved.Run.ID when
making the change.
In `@internal/cli/agent_identity_test.go`:
- Around line 13-69: Combine the two top-level tests into a single table-driven
test using t.Run subtests so they follow the repository's default "Should..."
subtest pattern: create one TestResolveAgentCallerFromEnv that sets up common
deps (using newTestDeps and stubClient) and then t.Run("Should use daemon
session lookup") to implement the logic currently in
TestResolveAgentCallerFromEnvUsesDaemonSessionLookup (including the
client.getSessionFn check and the resolveAgentCallerFromEnv call) and
t.Run("Should reject missing identity before lookup") to implement the logic
from TestResolveAgentCallerFromEnvRejectsMissingIdentityBeforeLookup (including
the client.getSessionFn that must not be called and the
ErrIdentityRequired/asserted exit code), keeping the same assertions and using
resolveAgentCallerFromEnv, agentidentity.ErrIdentityRequired, and
cliExitCodeForError so tests remain functionally identical.
In `@internal/cli/cli_integration_test.go`:
- Around line 1311-1660: The TestCLIAgentTaskLeaseLifecycleIntegration test is
too large and must be broken into focused t.Run subtests; refactor
TestCLIAgentTaskLeaseLifecycleIntegration so the common setup (h :=
newIntegrationHarness, daemon start/stop, workspace/session creation,
created/enqueued run, and agentDeps getenv) remains in the parent function and
create separate subtests via t.Run("Should claim run", func(t *testing.T){...}),
t.Run("Should reconnect and resume", ...), t.Run("Should heartbeat renew lease",
...), t.Run("Should send coordination message", ...), t.Run("Should complete run
and reject stale completions", ...), and t.Run("Should recover and reject
stale-token actions", ...); each subtest should only perform the specific
actions/assertions (use mustExecuteRoot, executeRootCommand, json.Unmarshal, and
the existing token/channel variables from parent scope or return values) so
failures are isolated and setup/teardown (daemon stop/start and
h.runner.waitForExit) is not duplicated.
In `@internal/cli/client_test.go`:
- Around line 29-381: Each test function bundles multiple independent scenarios
so a single failure hides other cases; split each into t.Run subtests that
exercise one behavior per subtest. For
TestUnixSocketClientAgentMeSendsIdentityHeaders create a t.Run like "Should send
identity headers for AgentMe" that calls unixSocketClient.AgentMe and asserts
headers; for TestUnixSocketClientAgentChannelMethodsSendIdentityHeaders create
separate t.Run cases for AgentChannels, AgentChannelRecv, AgentChannelSend, and
AgentChannelReply (calling AgentChannels, AgentChannelRecv, AgentChannelSend,
AgentChannelReply respectively) and move the corresponding transport
branches/assertions into each subtest; for TestUnixSocketClientAgentTaskMethods
create t.Run cases for ClaimNext, ClaimNext_NoWork, Heartbeat, Complete, Fail,
and Release (calling AgentTaskClaimNext, AgentTaskHeartbeat, AgentTaskComplete,
AgentTaskFail, AgentTaskRelease) with their specific request/response checks;
and for TestUnixSocketClientAgentTaskErrorsRedactClaimTokens wrap the
error-redaction check in its own t.Run. Ensure each subtest constructs its own
unixSocketClient/httpClient mock or isolates the transport handler so failures
do not prevent other subtests from running.
In `@internal/config/autonomy_test.go`:
- Around line 46-94: The test
TestLoadWorkspaceOverridesAutonomyCoordinatorValues should be made
parallel-safe: either call t.Parallel() immediately after
prepareAutonomyConfigTestEnv(t) (ensuring prepareAutonomyConfigTestEnv — which
calls t.Setenv — runs before t.Parallel()), or if t.Setenv interactions prevent
safe parallelization, add a brief comment inside
TestLoadWorkspaceOverridesAutonomyCoordinatorValues explaining why t.Parallel()
is intentionally omitted; reference the test name and the
prepareAutonomyConfigTestEnv helper when making the change.
In `@internal/config/autonomy.go`:
- Around line 27-29: Add a compile-time interface verification to ensure Config
implements providerResolver: insert the standard check using the
providerResolver interface and the Config type (e.g., the var _ providerResolver
= (*Config)(nil) pattern) near the type declarations so any drift in methods on
Config vs. providerResolver fails at compile time.
In `@internal/daemon/coordinator_config_test.go`:
- Around line 70-121: The test
TestCoordinatorConfigResolverPrefersWorkspaceConfig currently creates
workspaceCfg by assigning workspaceCfg := global which is a shallow copy and can
leak mutations if aghconfig.Config later contains pointers/slices; instead
construct workspaceCfg explicitly (e.g., call
defaultCoordinatorResolverConfig(t) or copy fields) and then set only the
Coordinator-related fields you need before passing it into
coordinatorWorkspaceResolverStub so changes to workspaceCfg cannot affect
global; update references in the test to use workspaceCfg created from
defaultCoordinatorResolverConfig or by copying individual fields rather than
direct assignment.
In `@internal/daemon/coordinator_config.go`:
- Around line 22-38: Add a compile-time interface assertion to ensure
defaultCoordinatorConfigResolver implements CoordinatorConfigResolver by adding
the guard `var _ CoordinatorConfigResolver =
(*defaultCoordinatorConfigResolver)(nil)` at package scope (near the type or
constructor), so any future interface drift is caught at build time; reference
the CoordinatorConfigResolver interface and defaultCoordinatorConfigResolver
concrete type when adding this assertion.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
There was a problem hiding this comment.
Actionable comments posted: 11
♻️ Duplicate comments (1)
internal/api/spec/spec.go (1)
1875-1914:⚠️ Potential issue | 🟠 MajorMark
publishTaskandstartTaskrequest bodies optional.Lines 299-304 and 343-349 in
internal/api/core/tasks.godecode these bodies withdecodeOptionalJSON(...), so an empty POST is valid for both handlers. The spec still marksTaskExecutionRequestas required on both routes, which recreates the same runtime/spec mismatch that was already fixed forapproveTask.🧩 Suggested spec change
{ Method: "POST", Path: "/api/tasks/{id}/publish", OperationID: "publishTask", Summary: "Publish one draft task and enqueue executable work", Tags: []string{"tasks"}, Transports: []Transport{TransportHTTP, TransportUDS}, Parameters: []ParameterSpec{ pathParam("id", "Task id"), }, - RequestBody: contract.TaskExecutionRequest{}, + RequestBody: contract.TaskExecutionRequest{}, + RequestBodyOptional: true, Responses: []ResponseSpec{ {Status: 200, Description: "OK", Body: contract.TaskExecutionResponse{}}, {Status: 404, Description: "Task not found", Body: contract.ErrorPayload{}}, {Status: 409, Description: "Task publish conflict", Body: contract.ErrorPayload{}}, {Status: 422, Description: "Invalid task publish request", Body: contract.ErrorPayload{}}, {Status: 503, Description: "Task service is not configured", Body: contract.ErrorPayload{}}, {Status: 500, Description: "Internal server error", Body: contract.ErrorPayload{}}, }, }, { Method: "POST", Path: "/api/tasks/{id}/start", OperationID: "startTask", Summary: "Start one task by enqueueing executable work", Tags: []string{"tasks"}, Transports: []Transport{TransportHTTP, TransportUDS}, Parameters: []ParameterSpec{ pathParam("id", "Task id"), }, - RequestBody: contract.TaskExecutionRequest{}, + RequestBody: contract.TaskExecutionRequest{}, + RequestBodyOptional: true, Responses: []ResponseSpec{ {Status: 201, Description: "Created", Body: contract.TaskExecutionResponse{}}, {Status: 404, Description: "Task not found", Body: contract.ErrorPayload{}}, {Status: 409, Description: "Task start conflict", Body: contract.ErrorPayload{}}, {Status: 422, Description: "Invalid task start request", Body: contract.ErrorPayload{}}, {Status: 503, Description: "Task service is not configured", Body: contract.ErrorPayload{}}, {Status: 500, Description: "Internal server error", Body: contract.ErrorPayload{}}, }, },🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/spec/spec.go` around lines 1875 - 1914, The spec currently marks TaskExecutionRequest as required for the publishTask and startTask operations, but the handlers use decodeOptionalJSON (same pattern used by approveTask), so update the spec entries for OperationID "publishTask" and "startTask" to make the request body optional (so an empty POST is valid). Locate the RequestBody fields referencing TaskExecutionRequest for those two operations and change them to the optional-request-body form used elsewhere (matching approveTask) so the runtime and spec no longer disagree.
🧹 Nitpick comments (2)
internal/api/udsapi/handlers_test.go (1)
501-520: Extend the handler-binding map to cover the rest of the new agent routes.This map only asserts bindings for
reply,claim-next, andcomplete. The newly addedsend,spawn,heartbeat,fail, andreleaseroutes can still be wired to the wrong handler whileTestRegisterRoutesCoversTechSpecEndpointspasses, because that test only checks method/path registration.As per coding guidelines,
Focus on critical paths: workflow execution, state management, error handling.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/udsapi/handlers_test.go` around lines 501 - 520, The expectedHandlers map in the test (variable expectedHandlers) is missing assertions for the new agent routes; update the map to include the new routes and their correct handler names (e.g., add entries for "POST /api/agent/channels/send" -> "AgentChannelSend" and for task-related routes "POST /api/agent/tasks/:run_id/spawn" -> "AgentTaskSpawn", "POST /api/agent/tasks/:run_id/heartbeat" -> "AgentTaskHeartbeat", "POST /api/agent/tasks/:run_id/fail" -> "AgentTaskFail", "POST /api/agent/tasks/:run_id/release" -> "AgentTaskRelease") so TestRegisterRoutesCoversTechSpecEndpoints actually verifies these bindings alongside existing ones like AgentChannelReply, AgentTaskComplete, and AgentTaskClaimNext.internal/cli/cli_integration_test.go (1)
1667-1669: Remove unnecessary loop variable capturett := tt(Go 1.25.4 supports per-iteration scoping).The
tt := ttpattern is unnecessary in Go 1.22+ since loop variables are scoped per iteration. This codebase targets Go 1.25.4, so this line can be removed.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/cli_integration_test.go` around lines 1667 - 1669, Remove the redundant per-iteration capture `tt := tt` inside the test loop in cli_integration_test.go: the loop already declares `tt` for each iteration so the extra assignment is unnecessary; update the table-driven test that calls t.Run("Should reject stale "+tt.name+" after recovery", func(t *testing.T) { ... }) by deleting the `tt := tt` line and ensuring the anonymous func uses the existing loop-scoped `tt`.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@internal/agentidentity/identity.go`:
- Around line 272-285: SessionSnapshotFromInfo currently omits copying
info.Model into the returned SessionSnapshot, causing callers (e.g.,
internal/api/core/agent_identity.go that reads caller.Session.Model) to see an
empty model; update the constructor to set the SessionSnapshot's Model field
from info.Model (or clone it if a deep copy is required) so the returned
SessionSnapshot includes the session's model information (reference:
SessionSnapshot, session.Info, info.Model, SessionSnapshotFromInfo).
- Around line 197-206: When lookupSessionSnapshot returns an error, don't always
map it to ErrIdentityStale; instead detect and preserve infrastructure/context
failures by returning ErrIdentityLookupUnavailable (or the original unavailable
reason). In lookupSessionSnapshot (which calls the SessionLookup function),
check the returned err with errors.Is for ErrIdentityLookupUnavailable and for
context.Canceled/context.DeadlineExceeded (or other transient errors) and return
identityError(ErrIdentityLookupUnavailable, ...) in those cases; only translate
genuine not-found/inactive responses to identityError(ErrIdentityStale, ...).
Use the existing symbols lookupSessionSnapshot, SessionLookup, Credentials,
ErrIdentityStale and ErrIdentityLookupUnavailable to locate and implement these
conditional error branches.
In `@internal/api/core/agent_channels.go`:
- Around line 91-103: The handler is currently calling parseBoolQuery and
parsePositiveIntQuery which silently coerce invalid inputs to false/0; update
the recv handler that calls agentChannelInbox (and similarly the other handler
range referenced) to validate query parsing and reject malformed values: call
parseBoolQuery and parsePositiveIntQuery (or their underlying parsing logic) in
a way that returns an error on invalid input, and if parsing fails respond with
h.respondError(c, http.StatusBadRequest, ErrInvalidRequest) (or the project’s
documented invalid-request response) instead of proceeding to agentChannelInbox;
reference the handler that invokes agentChannelInbox and the functions
parseBoolQuery/parsePositiveIntQuery to locate and fix the logic.
- Around line 85-103: AgentChannelRecv currently only checks for empty channel
and calls agentChannelInbox even when wait=false, allowing malformed channel IDs
to return 200 with an empty list; validate the channel path/format (not just
non-empty) before calling agentChannelInbox by adding a proper channel format
validation on the trimmed channel variable and returning a 400 (using
h.respondError) for invalid identifiers, so agentChannelInbox,
agentChannelMessagesFromEnvelopes, parseBoolQuery and parsePositiveIntQuery are
only invoked when the channel has passed validation.
In `@internal/api/core/conversions_parsers_test.go`:
- Around line 319-327: The test fails to assert that Schedule was deep-copied;
add an explicit pointer-inequality check for payload.Schedule to ensure
JobPayloadFromJob doesn't reuse the input Schedule pointer (e.g., assert
payload.Schedule != &job.Schedule or compare to the original schedule variable),
and also optionally verify key fields (like Interval) still equal to confirm
content was copied; update the test near the existing task/owner pointer checks
(which reference payload.Task, jobTask, and owner) to include this Schedule
pointer check.
In `@internal/api/core/tasks_surface_integration_test.go`:
- Around line 335-404: The test currently only checks status codes and the
recorded executionRequests map (via performRequest and
executionRequests[tc.call]) but does not assert the HTTP response body for
publish/start/approve ("/tasks/task-1/publish", "/tasks/task-1/start",
"/tasks/task-1/approve") nor for the triage/reject routes; update the
table-driven test in Test (the loop that uses performRequest, resp and tc) to
decode/inspect resp.Body and add assertions: for calls
"publish","start","approve" assert the returned JSON matches the expected
ExecutionRequest fields (idempotency_key, network_channel, metadata) or the
handler's documented response schema, and for
"reject","read","archive","dismiss" assert either the expected empty body or
specific JSON message; use tc.call and tc.wantMetadata/tc.wantKey/tc.wantChannel
to drive the expected body checks so the assertions fail if handlers return
unexpected payloads.
- Around line 335-404: The tests currently only assert status codes and the
forwarded executionRequests; update each subtest (inside the loop that uses
performRequest and checks executionRequests[tc.call]) to also unmarshal
resp.Body into a TaskExecutionResponse and assert its fields match the expected
values (idempotency key == tc.wantKey, network_channel == tc.wantChannel,
metadata == tc.wantMetadata, and that the response's run references the correct
task ID "task-1" and/or run/task identifier expected for publish/start/approve).
Keep the existing checks against executionRequests[tc.call] but add these
response-body assertions so handlers returning wrong payload shapes or wrong run
targets will fail; reference the performRequest call, the executionRequests map
lookup, and the TaskExecutionResponse type when locating where to add the
additional assertions.
In `@internal/api/spec/spec.go`:
- Around line 1212-1438: The OpenAPI specs for the agent endpoints (OperationIDs
like getAgentMe, getAgentContext, listAgentChannels,
receiveAgentChannelMessages, sendAgentChannelMessage, replyAgentChannelMessage,
claimNextAgentTask, heartbeatAgentTaskRun, completeAgentTaskRun,
failAgentTaskRun, releaseAgentTaskRun, spawnAgentSession,
getAgentCoordinatorConfig) omit real failure modes; update each ResponseSpec to
include 403 (e.g., "Forbidden — workspace or permission mismatch") and 503
(e.g., "Service unavailable — dependent service missing") entries with Body:
contract.ErrorPayload{} so generated clients reflect handlers that return 403
and 503. Ensure /api/agent/me definitely includes 403 and 503 and mirror the
same additions on channel/task/spawn/coordinator endpoints that can return
service-unavailable or permission-denied errors.
In `@internal/api/udsapi/agent_identity_test.go`:
- Around line 16-173: The tests violate the required "Should..." t.Run pattern:
update the table-driven names in TestAgentMeRejectsInvalidCallerIdentity so each
test case's name begins with "Should ..." and is invoked via t.Run(tt.name,
func(t *testing.T) { ... }) (preserve t.Parallel() inside each subtest), and
wrap the standalone TestAgentMeReturnsValidatedCallerIdentity body inside a
t.Run("Should return validated caller identity", func(t *testing.T) { ... })
(keeping the existing t.Parallel and assertions); reference the test functions
TestAgentMeRejectsInvalidCallerIdentity and
TestAgentMeReturnsValidatedCallerIdentity and the table loop that calls t.Run
for the fix.
In `@internal/cli/agent_kernel_test.go`:
- Around line 16-720: Several top-level test functions (e.g.,
TestMeCommandJSONReturnsValidatedIdentity,
TestMeContextCommandJSONKeepsStableSectionOrder,
TestSpawnCommandMapsBoundedChildRequest,
TestChannelSendRejectsMissingInputsAndInvalidIdentity,
TestAgentCommandsRejectMissingIdentityBeforeAgentCalls,
TestChannelListCommandJSONReturnsVisibleChannels,
TestChannelSendPreservesCoordinationMetadataAndRejectsClaimToken,
TestChannelReplySendsOnlyMessageIDAndBodyWhenMetadataIsResolvedServerSide,
TestChannelRecvJSONLOutputEmitsOneObjectPerMessage,
TestAgentCommandsRenderHumanAndToonOutputs) contain assertions directly in the
top-level test; wrap each of these logical cases in t.Run("Should ...") subtests
(use descriptive "Should..." titles) and move any t.Parallel() calls from the
top-level function into the body of each subtest so each subtest calls
t.Parallel() at its start; ensure any per-case setup (stubClient, deps, and
client.fn assignments) is inside the subtest body so tests remain isolated and
still call the same functions (e.g., agentMeFn, agentContextFn, agentSpawnFn,
agentChannelSendFn, agentChannelRecvFn, agentChannelReplyFn) as before.
In `@internal/cli/client_test.go`:
- Around line 29-428: The top-level test functions (e.g.,
TestUnixSocketClientAgentMeSendsIdentityHeaders and
TestUnixSocketClientAgentTaskErrorsRedactClaimTokens) must be converted to use
the repository's required subtest pattern: wrap each test body in a
t.Run("Should ...", func(t *testing.T) { t.Parallel(); ... }) block so the
assertions run as a named "Should..." subtest, keeping t.Parallel() inside the
subtest closure and preserving existing logic (use the same client setup and
assertions inside the new subtest); update any other standalone tests in this
file to the same pattern so all cases follow t.Run("Should...").
---
Duplicate comments:
In `@internal/api/spec/spec.go`:
- Around line 1875-1914: The spec currently marks TaskExecutionRequest as
required for the publishTask and startTask operations, but the handlers use
decodeOptionalJSON (same pattern used by approveTask), so update the spec
entries for OperationID "publishTask" and "startTask" to make the request body
optional (so an empty POST is valid). Locate the RequestBody fields referencing
TaskExecutionRequest for those two operations and change them to the
optional-request-body form used elsewhere (matching approveTask) so the runtime
and spec no longer disagree.
---
Nitpick comments:
In `@internal/api/udsapi/handlers_test.go`:
- Around line 501-520: The expectedHandlers map in the test (variable
expectedHandlers) is missing assertions for the new agent routes; update the map
to include the new routes and their correct handler names (e.g., add entries for
"POST /api/agent/channels/send" -> "AgentChannelSend" and for task-related
routes "POST /api/agent/tasks/:run_id/spawn" -> "AgentTaskSpawn", "POST
/api/agent/tasks/:run_id/heartbeat" -> "AgentTaskHeartbeat", "POST
/api/agent/tasks/:run_id/fail" -> "AgentTaskFail", "POST
/api/agent/tasks/:run_id/release" -> "AgentTaskRelease") so
TestRegisterRoutesCoversTechSpecEndpoints actually verifies these bindings
alongside existing ones like AgentChannelReply, AgentTaskComplete, and
AgentTaskClaimNext.
In `@internal/cli/cli_integration_test.go`:
- Around line 1667-1669: Remove the redundant per-iteration capture `tt := tt`
inside the test loop in cli_integration_test.go: the loop already declares `tt`
for each iteration so the extra assignment is unnecessary; update the
table-driven test that calls t.Run("Should reject stale "+tt.name+" after
recovery", func(t *testing.T) { ... }) by deleting the `tt := tt` line and
ensuring the anonymous func uses the existing loop-scoped `tt`.
🪄 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: 4a7a5e34-6935-47a6-8691-2467ffdbcd16
⛔ Files ignored due to path filters (34)
.compozy/tasks/autonomous/reviews-001/issue_001.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_002.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_003.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_004.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_005.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_006.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_007.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_008.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_009.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_010.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_011.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_012.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_013.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_014.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_015.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_016.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_017.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_018.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_019.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_020.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_021.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_022.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_023.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_024.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_025.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_026.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_027.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_028.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_029.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_030.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_031.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_032.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_033.mdis excluded by!**/*.md.compozy/tasks/autonomous/reviews-001/issue_034.mdis excluded by!**/*.md
📒 Files selected for processing (30)
internal/agentidentity/identity.gointernal/agentidentity/identity_test.gointernal/api/core/agent_channels.gointernal/api/core/agent_contracts_test.gointernal/api/core/agent_identity.gointernal/api/core/conversions_parsers_test.gointernal/api/core/tasks.gointernal/api/core/tasks_internal_test.gointernal/api/core/tasks_surface_integration_test.gointernal/api/core/tasks_surface_test.gointernal/api/httpapi/httpapi_integration_test.gointernal/api/spec/spec.gointernal/api/spec/spec_test.gointernal/api/testutil/apitest.gointernal/api/udsapi/agent_channels_test.gointernal/api/udsapi/agent_identity_test.gointernal/api/udsapi/handlers_test.gointernal/api/udsapi/udsapi_integration_test.gointernal/cli/agent_identity.gointernal/cli/agent_identity_test.gointernal/cli/agent_kernel.gointernal/cli/agent_kernel_test.gointernal/cli/cli_integration_test.gointernal/cli/client_test.gointernal/cli/spawn.gointernal/cli/task.gointernal/cli/task_test.gointernal/config/autonomy.gointernal/daemon/coordinator_config.gointernal/daemon/coordinator_config_test.go
✅ Files skipped from review due to trivial changes (1)
- internal/api/httpapi/httpapi_integration_test.go
🚧 Files skipped from review as they are similar to previous changes (6)
- internal/api/core/agent_contracts_test.go
- internal/cli/agent_kernel.go
- internal/agentidentity/identity_test.go
- internal/cli/agent_identity.go
- internal/api/udsapi/agent_channels_test.go
- internal/api/core/tasks_surface_test.go
## 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>
## 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>
## 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>
## 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 --> [](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>
## 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 --> [](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>
Summary by CodeRabbit