Skip to content

feat: autonomous system#75

Merged
pedronauck merged 20 commits into
mainfrom
autonomous
Apr 26, 2026
Merged

feat: autonomous system#75
pedronauck merged 20 commits into
mainfrom
autonomous

Conversation

@pedronauck
Copy link
Copy Markdown
Member

@pedronauck pedronauck commented Apr 26, 2026

Summary by CodeRabbit

  • New Features
    • Agent autonomy & coordinator support for workspace orchestration
    • Agent identity auth and context for CLI/UDS with “me” and “context” endpoints
    • Coordination channels: list, recv, send, reply with metadata validation
    • Agent task ops expanded: claim-next, heartbeat, complete, fail, release, and new start/publish/approve returning task+run execution
    • Agent spawn for bounded child sessions and session lineage telemetry
    • CLI: new commands (me, spawn, channel, task), jsonl output mode, and improved output/validation
    • API/OpenAPI updated for agent surfaces and enums

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 26, 2026

Walkthrough

Adds 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

Cohort / File(s) Summary
Agent Identity
internal/agentidentity/identity.go, internal/agentidentity/identity_test.go
New package resolving/validating agent caller credentials, session lookup/snapshot shape, ActorContext derivation, structured Error/ExitCode mapping and JSON payload helpers; tests cover resolve/error mapping and payload serialization.
Agent API Contract & Responses
internal/api/contract/agents.go, internal/api/contract/agents_test.go, internal/api/contract/contract.go, internal/api/contract/contract_test.go, internal/api/contract/responses.go, internal/api/contract/tasks.go
Adds agent-specific contract types, validation (reject raw claim_token), normalization helpers, extends SessionPayload with Type/Lineage, adds response wrappers and TaskExecution request/response fields.
Core HTTP/UDS Handlers (Agent)
internal/api/core/agent_channels.go, internal/api/core/agent_identity.go, internal/api/core/agent_spawn.go, internal/api/core/agent_tasks.go, internal/api/core/agent_channels_internal_test.go, internal/api/core/agent_spawn_test.go
New handlers for agent context/me, channels (send/recv/reply), spawn, and agent task lease operations (claim-next, heartbeat, release, complete, fail) with coordination metadata propagation and authorization; tests exercise flows and validations.
Core Conversions & Interfaces
internal/api/core/conversions.go, internal/api/core/conversions_parsers_test.go, internal/api/core/agent_contracts.go, internal/api/core/agent_contracts_test.go, internal/api/core/interfaces.go
Session lineage conversion, enriched task/session payload mappings, coordinator-config→contract helper, new AgentContextService interface, and NetworkService.WaitInbox addition; tests for conversions and coordinator mapping.
Task Execution Surface
internal/api/core/tasks.go, internal/api/core/tasks_internal_test.go, internal/api/core/tasks_surface_integration_test.go, internal/api/core/tasks_surface_test.go
Introduces TaskExecutionRequest/Response usage: Publish/Approve accept/return execution boundary; adds StartTask handler; updates run payload redaction and related tests.
HTTP/UDS Routing & Spec
internal/api/httpapi/routes.go, internal/api/httpapi/handlers_test.go, internal/api/httpapi/httpapi_integration_test.go, internal/api/udsapi/routes.go, internal/api/udsapi/server.go, internal/api/spec/spec.go, internal/api/spec/spec_test.go
Registers /api/agent/* endpoints and POST /api/tasks/{id}/start; propagates AgentContextService to UDS server; updates OpenAPI schemas and tests to include new agent/task execution routes and enums.
Core Errors / Handler Wiring / Test Utilities
internal/api/core/errors.go, internal/api/core/handlers.go, internal/api/core/handlers_internal_test.go, internal/api/testutil/apitest.go
Redacts claim tokens in error responses, wires AgentContextService into BaseHandlers, extends network test stubs (WaitInbox) and test utilities for task/network stubs.
UDS API Tests
internal/api/udsapi/*.go (agent_channels_test.go,agent_identity_test.go,agent_tasks_test.go,handlers_test.go,udsapi_integration_test.go)
Comprehensive end-to-end tests for agent endpoints (context/channels/send/recv/reply/spawn and task lease flows), including authorization, metadata validation, and WaitInbox behavior.
CLI: agent + task + client
internal/cli/agent_identity.go, internal/cli/agent_identity_test.go, internal/cli/agent_kernel.go, internal/cli/agent_kernel_test.go, internal/cli/client.go, internal/cli/client_test.go, internal/cli/task.go, internal/cli/task_test.go, internal/cli/spawn.go, internal/cli/spawn_test.go, internal/cli/*
CLI identity resolution from env, agent commands (me/context/spawn/channel send/recv/reply), task execution commands (publish/start/approve) and agent lease commands (next/heartbeat/complete/fail/release); client API extensions to call agent endpoints; tests and integration exercising full flows.
CLI UX / Formats / Integration
internal/cli/format.go, internal/cli/docpost/docpost.go, internal/cli/root.go, internal/cli/cli_integration_test.go
Adds jsonl output mode (streaming), docs update, root exit-code mapping to agent exit codes, and a CLI integration test for agent task lease lifecycle.
Coordinator & Autonomy Config
internal/coordinator/coordinator.go, internal/coordinator/coordinator_test.go, internal/config/autonomy.go, internal/config/autonomy_test.go, internal/config/config.go, internal/config/merge.go
New coordinator package for bootstrap decisions, permission policy, lineage generation and prompt overlay; autonomy TOML config and validation plus resolver/merge logic and tests.
Daemon Boot / Coordinator Config Resolver
internal/daemon/boot.go, internal/daemon/composed_assembler.go, internal/daemon/composed_assembler_test.go, internal/daemon/coordinator_config.go, internal/daemon/coordinator_config_test.go
Integrates situation/AgentContext into boot, adds coordinator boot step, provides CoordinatorConfigResolver (workspace-aware) and tests for resolution precedence.

Sequence Diagrams

sequenceDiagram
    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)
Loading
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
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'feat: autonomous system' is vague and overly broad, failing to convey the specific scope or primary changes of this large changeset. Use a more specific title that highlights the main feature or capability being introduced, such as 'feat: add agent identity resolution and coordination APIs' or 'feat: implement autonomous agent framework with task lifecycle'.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 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, or AgentChannelReply would 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 forwarded ExecutionRequest.

These three stubs discard the new taskpkg.ExecutionRequest, so this test still passes if the handlers stop binding idempotency_key or network_channel and 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 handling and Ensure 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_key path. 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 handling and Ensure 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 for POST /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 explicit idempotency_key on 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 TaskExecutionRequest idempotency 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 into t.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 the json.Marshal failure here instead of discarding it.

If contract.AgentMeResponse stops 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 a Validate() method used by peer request types.

The mapper validates NetworkChannel via validateTaskChannel(), but unlike enqueueTaskRunFromRequest (which calls spec.Validate()), taskExecutionRequestFromRequest has no centralized validation for the domain struct. Peer types like EnqueueRun, ClaimRun, and StartRun all define Validate() methods; ExecutionRequest should follow the same pattern for consistency. Downstream normalization handles metadata size validation, but this split responsibility is fragile. Consider adding a Validate() method to ExecutionRequest.

🤖 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 == nil but merged is initialized with make(...) 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.Ext map as coordination metadata if no known key is found. This could incorrectly succeed if Ext happens to contain fields matching CoordinationMessageMetadataPayload, 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 agentChannelInbox which internally calls filterAgentChannelEnvelopes, then line 102 calls agentChannelMessagesFromEnvelopes which also calls filterAgentChannelEnvelopes (line 671). This results in filtering the envelopes twice with the same channel.

♻️ Consider removing redundant filter

In agentChannelMessagesFromEnvelopes, the first line calls filterAgentChannelEnvelopes again. Since agentChannelInbox already filters, either:

  1. Remove the filter call in agentChannelMessagesFromEnvelopes, or
  2. 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 == nil but messages is initialized with make(...) on line 672. Same issue as in mergeCoordinationChannels.

♻️ 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.Config contains pointer or slice fields, modifications to workspaceCfg could affect global. 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.Setenv via prepareAutonomyConfigTestEnv, which Go's test framework handles correctly for parallel tests. Consider adding t.Parallel() after the helper call.

♻️ Suggested improvement
 func TestLoadWorkspaceOverridesAutonomyCoordinatorValues(t *testing.T) {
 	workspaceRoot, homePaths := prepareAutonomyConfigTestEnv(t)
+	t.Parallel()

Note: Since prepareAutonomyConfigTestEnv calls t.Setenv, it must be called before t.Parallel(). However, looking more closely, t.Setenv doesn't work with t.Parallel() if called before it. This test may correctly omit t.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 WaitInbox is called with the correct parameters, but there's no explicit negative test ensuring Inbox (not WaitInbox) is called when wait=false. The InboxFn callback will t.Fatal if called, but only during the wait=true scenario.

Consider adding a separate subtest or case that explicitly verifies wait=false uses Inbox instead of WaitInbox.

🤖 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 activeAgentSessionManager function duplicates similar logic that appears in internal/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.Run for 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 for providerResolver.

The coding guidelines recommend using compile-time interface verification. If *Config is intended to implement providerResolver, 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 to ErrIdentityStale.

A nil context typically indicates a programming error rather than a stale identity. Mapping it to ErrIdentityStale with "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

Comment thread internal/api/core/agent_contracts_test.go
Comment thread internal/api/core/agent_identity.go
Comment thread internal/api/core/conversions_parsers_test.go
Comment thread internal/api/core/tasks_internal_test.go
Comment thread internal/api/spec/spec.go
Comment thread internal/cli/agent_identity.go Outdated
Comment thread internal/cli/agent_kernel.go
Comment thread internal/cli/cli_integration_test.go Outdated
Comment thread internal/cli/spawn.go Outdated
Comment thread internal/cli/task.go
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 11

♻️ Duplicate comments (1)
internal/api/spec/spec.go (1)

1875-1914: ⚠️ Potential issue | 🟠 Major

Mark publishTask and startTask request bodies optional.

Lines 299-304 and 343-349 in internal/api/core/tasks.go decode these bodies with decodeOptionalJSON(...), so an empty POST is valid for both handlers. The spec still marks TaskExecutionRequest as required on both routes, which recreates the same runtime/spec mismatch that was already fixed for approveTask.

🧩 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, and complete. The newly added send, spawn, heartbeat, fail, and release routes can still be wired to the wrong handler while TestRegisterRoutesCoversTechSpecEndpoints passes, 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 capture tt := tt (Go 1.25.4 supports per-iteration scoping).

The tt := tt pattern 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

📥 Commits

Reviewing files that changed from the base of the PR and between dcb8953 and 060729d.

⛔ Files ignored due to path filters (34)
  • .compozy/tasks/autonomous/reviews-001/issue_001.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_002.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_003.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_004.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_005.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_006.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_007.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_008.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_009.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_010.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_011.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_012.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_013.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_014.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_015.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_016.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_017.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_018.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_019.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_020.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_021.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_022.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_023.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_024.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_025.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_026.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_027.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_028.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_029.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_030.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_031.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_032.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_033.md is excluded by !**/*.md
  • .compozy/tasks/autonomous/reviews-001/issue_034.md is excluded by !**/*.md
📒 Files selected for processing (30)
  • internal/agentidentity/identity.go
  • internal/agentidentity/identity_test.go
  • internal/api/core/agent_channels.go
  • internal/api/core/agent_contracts_test.go
  • internal/api/core/agent_identity.go
  • internal/api/core/conversions_parsers_test.go
  • internal/api/core/tasks.go
  • internal/api/core/tasks_internal_test.go
  • internal/api/core/tasks_surface_integration_test.go
  • internal/api/core/tasks_surface_test.go
  • internal/api/httpapi/httpapi_integration_test.go
  • internal/api/spec/spec.go
  • internal/api/spec/spec_test.go
  • internal/api/testutil/apitest.go
  • internal/api/udsapi/agent_channels_test.go
  • internal/api/udsapi/agent_identity_test.go
  • internal/api/udsapi/handlers_test.go
  • internal/api/udsapi/udsapi_integration_test.go
  • internal/cli/agent_identity.go
  • internal/cli/agent_identity_test.go
  • internal/cli/agent_kernel.go
  • internal/cli/agent_kernel_test.go
  • internal/cli/cli_integration_test.go
  • internal/cli/client_test.go
  • internal/cli/spawn.go
  • internal/cli/task.go
  • internal/cli/task_test.go
  • internal/config/autonomy.go
  • internal/daemon/coordinator_config.go
  • internal/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

Comment thread internal/agentidentity/identity.go
Comment thread internal/agentidentity/identity.go
Comment thread internal/api/core/agent_channels.go
Comment thread internal/api/core/agent_channels.go
Comment thread internal/api/core/conversions_parsers_test.go
Comment thread internal/api/core/tasks_surface_integration_test.go
Comment thread internal/api/spec/spec.go
Comment thread internal/api/udsapi/agent_identity_test.go
Comment thread internal/cli/agent_kernel_test.go
Comment thread internal/cli/client_test.go
@pedronauck pedronauck merged commit 205a6dd into main Apr 26, 2026
6 of 7 checks passed
@pedronauck pedronauck deleted the autonomous branch April 26, 2026 19:37
This was referenced Apr 26, 2026
@coderabbitai coderabbitai Bot mentioned this pull request Apr 26, 2026
pedronauck added a commit that referenced this pull request May 26, 2026
## Release v0.0.1

This PR prepares the release of version v0.0.1.

### Changelog

## 0.0.1 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

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



### 🎉 Features

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



### 🐛 Bug Fixes

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



### 📚 Documentation

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



### 📦 Build System

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



### 🔧 CI/CD

- Lint errors
- Fint release pr
- Fix goreleaser



### 🧪 Testing

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

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

This PR prepares the release of version v0.0.1.

### Changelog

## 0.0.1 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

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



### 🎉 Features

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



### 🐛 Bug Fixes

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



### 📚 Documentation

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



### 📦 Build System

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



### 🔧 CI/CD

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



### 🧪 Testing

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

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

This PR prepares the release of version v0.0.2.

### Changelog

## 0.0.2 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

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



### 🎉 Features

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



### 🐛 Bug Fixes

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



### 📚 Documentation

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



### 📦 Build System

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



### 🔧 CI/CD

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



### 🧪 Testing

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

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

This PR prepares the release of version v0.0.2.

### Changelog

## 0.0.2 - 2026-05-26



### Other Changes

- Lessons learned



### ♻️ Refactoring

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



### 🎉 Features

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



### 🐛 Bug Fixes

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



### 📚 Documentation

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



### 📦 Build System

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



### 🔧 CI/CD

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



### 🧪 Testing

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


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

## Summary by CodeRabbit

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

<!-- review_stack_entry_start -->

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

<!-- review_stack_entry_end -->

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

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

This PR prepares the release of version v0.0.2.

### Changelog

## 0.0.2 - 2026-05-27



### Other Changes

- Lessons learned



### ♻️ Refactoring

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



### 🎉 Features

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



### 🐛 Bug Fixes

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



### 📚 Documentation

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



### 📦 Build System

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



### 🔧 CI/CD

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



### 🧪 Testing

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


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

## Summary by CodeRabbit

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

<!-- review_stack_entry_start -->

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

<!-- review_stack_entry_end -->

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant