feat: unify capability#53
Conversation
Replace the old recipe-era peer-card KindChip row with a unified capability list that merges `peer_card.capabilities` briefs and the typed `capability_catalog` into one view model. Swap `recipe` for `capability` in the protocol-kind registries (channel detail, design showcase, kind-chip story) and refresh fixtures plus route/panel tests to cover the detailed and brief-only fallbacks. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
Important Review skippedReview was skipped as selected files did not have any reviewable changes. 💤 Files selected but had no reviewable changes (4)
⛔ Files ignored due to path filters (270)
⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (270)
📒 Files selected for processing (4)
You can disable this status message by setting the Use the checkbox below for a quick retry:
WalkthroughAdds capability-first networking (replacing recipe), richer capability metadata and discovery, session control endpoints (clear conversation, cancel prompt) with manager implementations, session liveness/stall tracking and recovery classification, transcript UI message migration, OpenAPI TypeScript codegen tooling, many tests, and DB schema additions for session liveness. Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant HTTP_Handler as HTTP Handler
participant SessionMgr as SessionManager
participant Driver
participant Store
Client->>HTTP_Handler: POST /api/sessions/:id/prompt/cancel
HTTP_Handler->>SessionMgr: CancelPrompt(ctx, id)
SessionMgr->>SessionMgr: locate session / load meta
alt session prompting
SessionMgr->>Driver: Cancel(ctx, proc)
Driver-->>SessionMgr: ack
SessionMgr->>Store: writeMeta(liveness update)
Store-->>SessionMgr: ok
SessionMgr-->>HTTP_Handler: success
HTTP_Handler-->>Client: 200 OK
else not prompting
SessionMgr-->>HTTP_Handler: success (no-op)
HTTP_Handler-->>Client: 200 OK
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
|
There was a problem hiding this comment.
Actionable comments posted: 13
Note
Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (4)
internal/observe/reconcile.go (1)
62-81:⚠️ Potential issue | 🟠 MajorPreserve liveness when rebuilding
store.SessionInfo.This path now normalizes recovered
store.SessionMeta, but the appendedstore.SessionInfostill copies only the core fields/environment. That means a reconcile from disk can dropLivenessdata like subprocess PID, last-update time, and stall classification even when it exists in metadata, which undercuts the new recovery/stall reporting.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/observe/reconcile.go` around lines 62 - 81, The code builds a store.SessionInfo from normalized meta but omits the Liveness field, so recovered liveness (subprocess PID, last-update time, stall classification) is lost; update the append to include the Liveness from normalized (e.g., set Liveness: normalized.Liveness or a deep-cloned equivalent) alongside Environment (or use a helper to clone liveness if needed) so that normalizeRecoveredMeta -> store.SessionInfo preserves liveness data during reconcile.internal/daemon/network_e2e_assertions_test.go (1)
45-61:⚠️ Potential issue | 🟠 MajorOnly validate completed message parts to avoid masking split-part regressions.
UIMessageText(message)concatenates all text parts regardless of theirStatefield (streaming vs. done), allowing attributes split across incomplete parts to satisfy all needles. For E2E assertions, only checkmessage.PartswhereType == "text"andState == "done"independently, ensuring the final message state actually contains the expected correlated attributes rather than just their presence across transient parts.Suggested fix
for _, message := range messages { + for _, part := range message.Parts { + if part.Type != "text" || part.State != "done" { + continue + } + content := strings.TrimSpace(part.Text) + if content == "" { + continue + } + allPresent := true for _, check := range checks { if check.needle != "" && !strings.Contains(content, check.needle) { allPresent = false break } } if allPresent { matched = true + break + } + } + if matched { break } }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/network_e2e_assertions_test.go` around lines 45 - 61, Replace the current per-message check that uses transcript.UIMessageText(message) with logic that iterates message.Parts and only considers parts where part.Type == "text" and part.State == "done"; for each such done text part, trim its text and verify that all checks' needles are contained within that single part (rather than across different parts) and mark matched true only when a single done text part satisfies all needles; reference message.Parts, part.Type, part.State, and the checks/needle variables when updating the loop.internal/session/session.go (1)
312-324:⚠️ Potential issue | 🟠 MajorAdd
markExited()tomarkSessionStopped()before persisting metadata.
markSessionStopped()callsclearProcess()andwriteMeta()without clearingLiveness. WhilepersistStopClassification()happens to callmarkExited()earlier in the same flow, this creates an implicit dependency. If the code path changes or diverges, staleSubprocessPID/SubprocessStartedAtwill feed the recovery classifier incorrect evidence.Each teardown path should independently ensure
Livenessis cleared beforewriteMeta()is called:func (m *Manager) markSessionStopped(session *Session) error { now := m.now() session.markExited(now) // Add this session.clearProcess(now) if err := session.markStopped(now); err != nil { return err } return m.writeMeta(session) }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/session/session.go` around lines 312 - 324, markSessionStopped currently clears process and writes metadata without ensuring Liveness is cleared, creating an implicit dependency; update the markSessionStopped function to call session.markExited(now) before session.clearProcess(now) and before invoking session.markStopped(now) and m.writeMeta(session) so SubprocessPID/SubprocessStartedAt/Liveness are cleared locally (referencing markSessionStopped, markExited, clearProcess, markStopped, writeMeta).internal/network/router.go (1)
272-283:⚠️ Potential issue | 🔴 CriticalSend lifecycle validation is now racy.
validateSendLifecycle()only reads the interaction state, then publish happens, and the actual mutation is deferred tosyncSentLifecycle(). Two concurrent sends on the sameinteraction_idcan both pass the preflight and publish, even though the second one should be rejected once the first closes the interaction. The post-publish sync then drops its error, so the caller still sees success.Also applies to: 818-850
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/network/router.go` around lines 272 - 283, The race happens because validateSendLifecycle(envelope) only reads state, publishEnvelope(...) happens, and syncSentLifecycle(envelope, now) mutates state later (and its error is dropped), allowing two concurrent sends to both publish; fix by making the validation + reservation atomic: introduce or use a per-interaction lock or an atomic "reserve send" operation (e.g., a new method like reserveSendLifecycle(interactionID, now) or extend validateSendLifecycle to mutate state) so that the send path performs validate+reserve before calling publishEnvelope; ensure syncSentLifecycle still finalizes state but its error is propagated to the caller and causes the send to fail if the finalize step detects the interaction has closed. Reference validateSendLifecycle, syncSentLifecycle, publishEnvelope, subjectForEnvelope, and the SendResult return path when updating the code.
🟡 Minor comments (9)
cmd/agh-codegen/main_test.go-461-474 (1)
461-474:⚠️ Potential issue | 🟡 MinorWrap
TestMarshalOpenAPIassertions in at.Run("Should...")subtest.This is the only new test case in the file not following the required
Should...subtest pattern.As per coding guidelines, "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 `@cmd/agh-codegen/main_test.go` around lines 461 - 474, Update TestMarshalOpenAPI to use the required t.Run("Should...") subtest pattern by wrapping the current assertions inside a t.Run call; locate the TestMarshalOpenAPI function and call t.Run with a descriptive "Should ..." name (e.g., "Should marshal OpenAPI with version and daemon route"), then move the marshalOpenAPI invocation and the two bytes.Contains checks into that subtest body so the test follows the project's subtest naming convention.internal/codegen/openapits/generate_test.go-47-203 (1)
47-203:⚠️ Potential issue | 🟡 MinorRename subtests to the required
Should...convention.Subtests in this range (for example,
accepts matching generated output,rejects stale generated output) do not follow the requiredt.Run("Should...")pattern.As per coding guidelines, "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/codegen/openapits/generate_test.go` around lines 47 - 203, Rename all t.Run subtest name strings to the "Should ..." convention: change "accepts matching generated output" → "Should accept matching generated output", "rejects stale generated output" → "Should reject stale generated output", "rejects missing generated output" → "Should reject missing generated output" (in the first test group and the same three titles inside TestCheckGeneratedFile), and in TestRunCommand rename "succeeds for zero exit status" → "Should succeed for zero exit status", "prefers stderr details" → "Should prefer stderr details", "falls back to stdout details" → "Should fall back to stdout details", and "reports raw execution errors when the command cannot start" → "Should report raw execution errors when the command cannot start"; update the t.Run string literals only (no logic changes) in the functions and helper tests that call t.Run and keep the existing test bodies (references: checkGeneratedFile, runCommand, writeTestSpec, writeExecutableScript).internal/codegen/openapits/generate.go-49-49 (1)
49-49:⚠️ Potential issue | 🟡 MinorHandle temporary-file cleanup errors in
Check.Line 49 ignores
os.Removeerrors entirely, which can silently leak temp files and violates the project’s error-handling rule.Suggested fix
-func Check(ctx context.Context, artifact Artifact) error { +func Check(ctx context.Context, artifact Artifact) (retErr error) { file, err := os.CreateTemp("", "openapi-types-*.d.ts") if err != nil { return fmt.Errorf("create temporary output for %q: %w", artifact.OutputPath, err) } @@ - defer os.Remove(file.Name()) + defer func() { + if rmErr := os.Remove(file.Name()); rmErr != nil && !errors.Is(rmErr, os.ErrNotExist) { + rmErr = fmt.Errorf("remove temporary output %q: %w", file.Name(), rmErr) + if retErr == nil { + retErr = rmErr + } else { + retErr = errors.Join(retErr, rmErr) + } + } + }()As per coding guidelines, "Never ignore errors with
_— 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/codegen/openapits/generate.go` at line 49, The defer os.Remove(file.Name()) call in Check currently ignores any error; change it to a deferred closure that captures the temp file name and checks the returned error from os.Remove(name), handling it per project rules (e.g., if the function has a named error return, wrap/append the remove error to the Check error; otherwise log the error or ignore only when os.IsNotExist(err) with a comment). Locate this in the Check function and replace the direct os.Remove call with a defer func() { if err := os.Remove(name); err != nil { /* handle: wrap/return/log or ignore only when IsNotExist with justification */ } }(), where name is obtained from file.Name().internal/daemon/daemon_test.go-4196-4220 (1)
4196-4220:⚠️ Potential issue | 🟡 Minor
ClearConversationfallback is currently unreachable for missing sessions.At Line 4201-Line 4203, any
Statuserror returns immediately, so the fallback at Line 4205 never handles not-found cases. This can break tests expecting clear-conversation to succeed for absent sessions.💡 Suggested fix
func (f *fakeSessionManager) ClearConversation( ctx context.Context, id string, ) (*session.Session, error) { info, err := f.Status(ctx, id) if err != nil { + if errors.Is(err, session.ErrSessionNotFound) { + return &session.Session{ID: id, State: session.StateActive}, nil + } return nil, err } if info == nil { return &session.Session{ID: id, State: session.StateActive}, nil }As per coding guidelines, "Use
errors.Is()anderrors.As()for error matching — never compare error strings".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/daemon_test.go` around lines 4196 - 4220, The ClearConversation implementation returns immediately on any Status error, making the intended "missing session" fallback unreachable; update fakeSessionManager.ClearConversation to detect a not-found error from f.Status using errors.Is (or errors.As) and only return the fallback session when the error indicates "not found" (e.g., compare err with the repository/session not-found sentinel), while still returning other errors as before; keep references to f.Status and fakeSessionManager.ClearConversation when making the change.internal/session/manager_test.go-942-1018 (1)
942-1018:⚠️ Potential issue | 🟡 MinorRename subtests to the required
Should...pattern.Coverage is good, but the subtest labels should use the mandated naming convention.
✏️ Suggested subtest label updates
- t.Run("active prompting session cancels driver prompt", func(t *testing.T) { + t.Run("Should cancel driver prompt for an active prompting session", func(t *testing.T) { ... - t.Run("active session without prompt is a no-op", func(t *testing.T) { + t.Run("Should no-op when session is active but not prompting", func(t *testing.T) { ... - t.Run("known stopped session is a no-op", func(t *testing.T) { + t.Run("Should no-op when session is already stopped", func(t *testing.T) { ... - t.Run("unknown session returns ErrSessionNotFound", func(t *testing.T) { + t.Run("Should return ErrSessionNotFound for unknown session", func(t *testing.T) {As per coding guidelines "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/session/manager_test.go` around lines 942 - 1018, Rename the subtest labels to follow the "Should..." pattern: change t.Run("active prompting session cancels driver prompt", ...) to something like t.Run("Should cancel driver prompt for active prompting session", ...); change t.Run("active session without prompt is a no-op", ...) to t.Run("Should be no-op for active session without prompt", ...); change t.Run("known stopped session is a no-op", ...) to t.Run("Should be no-op for known stopped session", ...); and change t.Run("unknown session returns ErrSessionNotFound", ...) to t.Run("Should return ErrSessionNotFound for unknown session", ...). Keep the test bodies unchanged (they exercise manager.CancelPrompt, h.driver.cancelCalls, h.manager.Stop, etc.). Ensure all four t.Run labels in manager_test.go are updated to the new "Should..." phrasing.internal/network/audit_test.go-238-266 (1)
238-266:⚠️ Potential issue | 🟡 MinorWrap this case in a
t.Run("Should...")subtest to match test conventions.The test logic is good, but the new case should follow the project’s required subtest naming pattern.
♻️ Suggested structure change
func TestAuditWriterRecordsCapabilityTransfersAsCapabilityAudits(t *testing.T) { t.Parallel() - - storeSink := &recordingAuditStore{} - writer, err := NewAuditWriter("", storeSink) - if err != nil { - t.Fatalf("NewAuditWriter() error = %v", err) - } - recordedAt := time.Date(2026, 4, 20, 12, 0, 0, 0, time.UTC) - writer.now = func() time.Time { return recordedAt } - - if err := writer.RecordReceived(context.Background(), "sess-audit", testCapabilityAuditEnvelope(t)); err != nil { - t.Fatalf("RecordReceived(capability) error = %v", err) - } - - if got, want := len(storeSink.entries), 1; got != want { - t.Fatalf("len(store entries) = %d, want %d", got, want) - } - entry := storeSink.entries[0] - if got, want := entry.Kind, string(KindCapability); got != want { - t.Fatalf("entry.Kind = %q, want %q", got, want) - } - if got, want := entry.Direction, AuditDirectionReceived; got != want { - t.Fatalf("entry.Direction = %q, want %q", got, want) - } - if got := len(storeSink.messages); got != 0 { - t.Fatalf("len(store timeline messages) = %d, want 0 for capability transfers", got) - } + t.Run("Should record capability transfers as audits without timeline entries", func(t *testing.T) { + storeSink := &recordingAuditStore{} + writer, err := NewAuditWriter("", storeSink) + if err != nil { + t.Fatalf("NewAuditWriter() error = %v", err) + } + recordedAt := time.Date(2026, 4, 20, 12, 0, 0, 0, time.UTC) + writer.now = func() time.Time { return recordedAt } + + if err := writer.RecordReceived(context.Background(), "sess-audit", testCapabilityAuditEnvelope(t)); err != nil { + t.Fatalf("RecordReceived(capability) error = %v", err) + } + + if got, want := len(storeSink.entries), 1; got != want { + t.Fatalf("len(store entries) = %d, want %d", got, want) + } + entry := storeSink.entries[0] + if got, want := entry.Kind, string(KindCapability); got != want { + t.Fatalf("entry.Kind = %q, want %q", got, want) + } + if got, want := entry.Direction, AuditDirectionReceived; got != want { + t.Fatalf("entry.Direction = %q, want %q", got, want) + } + if got := len(storeSink.messages); got != 0 { + t.Fatalf("len(store timeline messages) = %d, want 0 for capability transfers", got) + } + }) }As per coding guidelines "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/network/audit_test.go` around lines 238 - 266, Wrap the existing test body of TestAuditWriterRecordsCapabilityTransfersAsCapabilityAudits in a t.Run subtest using the "Should..." naming pattern (e.g., t.Run("Should record capability transfers as capability audits", func(t *testing.T) { ... })), leaving all assertions and setup (storeSink := &recordingAuditStore{}, NewAuditWriter, writer.now override, writer.RecordReceived call, and the subsequent checks on storeSink.entries, entry.Kind, entry.Direction and storeSink.messages) unchanged but moved inside the t.Run closure; ensure you pass t to the closure and keep t.Parallel() at the top of the parent test if parallelization is still desired.internal/daemon/task_runtime.go-517-532 (1)
517-532:⚠️ Potential issue | 🟡 MinorDon't classify orphaned/stalled sessions from PID liveness alone.
These branches only check
procutil.Alive(liveness.SubprocessPID). After a reboot, PID reuse can make an unrelated process look like the old session subprocess, so the new recovery metadata can reportorphanedorstalledfor the wrong process. You already persistSubprocessStartedAt; use it to confirm process identity before emitting those classifications.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/task_runtime.go` around lines 517 - 532, The code currently classifies stalled/orphaned based solely on procutil.Alive(liveness.SubprocessPID); change it to verify process identity by comparing the live process start time to the persisted liveness.SubprocessStartedAt before returning taskRecoveryClassificationStalled or taskRecoveryClassificationOrphaned. Use procutil (e.g., procutil.StartTime or equivalent API) to fetch the process start time for liveness.SubprocessPID, require that liveness.SubprocessStartedAt is non-nil/non-zero and matches the fetched start time (allowing for appropriate time-zone/precision normalization), and only then emit the stalled/orphaned classification (calling firstTaskRecoveryDetail or fmt.Sprintf as before). If procutil fails or the start times do not match, do not classify based on PID liveness alone.internal/daemon/daemon_network_collaboration_integration_test.go-353-356 (1)
353-356:⚠️ Potential issue | 🟡 MinorThe broadcast assertion only checks the sender transcript.
If fan-out to
curatorSessionregresses, this scenario still passes because every later step is directed. Please add a recipient-side transcript check here so the"capability say delivery"step still validates broadcast delivery.Possible assertion tweak
waitForRuntimeCondition(t, "capability say delivery", 10*time.Second, func() bool { return channelHasMessageID(ctx, harness, "capabilities", "msg_capability_say_01") && - sessionTranscriptHasNeedle(ctx, harness, releaseSession.ID, attributeNeedle("kind", "say")) + sessionTranscriptHasNeedle(ctx, harness, releaseSession.ID, attributeNeedle("id", "msg_capability_say_01")) && + sessionTranscriptHasNeedle(ctx, harness, curatorSession.ID, attributeNeedle("id", "msg_capability_say_01")) })🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/daemon/daemon_network_collaboration_integration_test.go` around lines 353 - 356, The current waitForRuntimeCondition call only verifies the sender transcript and channel ("capability say delivery") using channelHasMessageID and sessionTranscriptHasNeedle(releaseSession.ID,...); add a second transcript check for the recipient (curatorSession) so broadcast fan-out is validated: update the predicate to also require sessionTranscriptHasNeedle(ctx, harness, curatorSession.ID, attributeNeedle("kind","say")) (keeping the existing channelHasMessageID and releaseSession check) so the waitForRuntimeCondition asserts delivery to both sender and recipient transcripts.internal/network/envelope.go-275-288 (1)
275-288:⚠️ Potential issue | 🟡 MinorInconsistent
omitemptyonDigestfield.
Digestat line 281 lacksomitempty, but the correspondingNetworkCapabilityPayloadincontract.go(line 330) usesomitemptyfor the same field. This inconsistency may cause unexpected behavior when capabilities are serialized without a digest.🔧 Suggested fix for consistency
type CapabilityEnvelopePayload struct { ID string `json:"id"` Summary string `json:"summary"` Outcome string `json:"outcome"` Version string `json:"version,omitempty"` - Digest string `json:"digest"` + Digest string `json:"digest,omitempty"` ContextNeeded []string `json:"context_needed,omitempty"`🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/network/envelope.go` around lines 275 - 288, The JSON tag for CapabilityEnvelopePayload.Digest is missing "omitempty", making serialization inconsistent with NetworkCapabilityPayload; update the struct field Digest in CapabilityEnvelopePayload to include `omitempty` in its json tag so it matches NetworkCapabilityPayload (ensure the change is made on the Digest field of the CapabilityEnvelopePayload type).
🧹 Nitpick comments (10)
internal/e2elane/lanes_test.go (1)
163-183: Wrap this new case int.Run("Should...")(table/subtest style).This test is valid functionally, but it bypasses the required subtest pattern used in this repo for Go tests. Please convert it to a table-driven/subtest form (even with one case) and use a
Should...subtest name.As per coding guidelines,
**/*_test.go: "Use table-driven tests with subtests (t.Run) as default pattern for Go tests" 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/e2elane/lanes_test.go` around lines 163 - 183, Wrap TestRuntimeLaneIncludesHarnessPackageCoverage in a table-driven subtest using t.Run with a "Should..." name: convert the body into a test case struct (even a single case) and call t.Run("Should include harness package coverage", func(t *testing.T) { t.Parallel(); ... }) where you invoke PlanForLane(LaneRuntime) and assert against plan.GoSuites and HarnessRuntimeE2EPattern; keep the existing checks for the single-package match and the Run pattern but move them inside the subtest closure so the test follows the repository's table/subtest style and naming conventions while preserving TestRuntimeLaneIncludesHarnessPackageCoverage semantics.internal/extension/host_api_test.go (1)
4849-4863: Consider usingt.Errorfinstead oft.Fatalfin cleanup hooks.Using
t.Fatalfinsidet.Cleanupstops execution of subsequent cleanup hooks and can produce confusing output since the test has already completed. Cleanup errors are typically informational—you want to report them but allow other cleanup hooks to run.♻️ Suggested change
t.Cleanup(func() { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() for _, info := range sessions.List() { if info == nil { continue } if err := sessions.Stop(ctx, info.ID); err != nil && !errors.Is(err, session.ErrSessionNotFound) { - t.Fatalf("sessions.Stop(%q) cleanup error = %v", info.ID, err) + t.Errorf("sessions.Stop(%q) cleanup error = %v", info.ID, err) } } if err := sessions.WaitForFinalizations(ctx); err != nil { - t.Fatalf("sessions.WaitForFinalizations() cleanup error = %v", err) + t.Errorf("sessions.WaitForFinalizations() cleanup error = %v", err) } })🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/extension/host_api_test.go` around lines 4849 - 4863, In the t.Cleanup closure replace calls to t.Fatalf with t.Errorf so cleanup errors are reported without aborting other cleanup hooks: specifically, in the loop that iterates sessions.List() and calls sessions.Stop(ctx, info.ID) (checking !errors.Is(err, session.ErrSessionNotFound)) and in the sessions.WaitForFinalizations(ctx) error check, change the failure reporting to use t.Errorf with the same message text so cleanup can continue.internal/codegen/openapits/generate_test.go (1)
13-42: Uset.Run("Should...")forTestGenerateto match default test structure.
TestGenerateis a single-case top-level test; wrapping it in aShould...subtest keeps this file aligned with the repository’s required test style.As per coding guidelines, "Use table-driven tests with subtests (
t.Run) as default pattern for Go tests."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/codegen/openapits/generate_test.go` around lines 13 - 42, Wrap the existing TestGenerate body in a single subtest using t.Run — keep the TestGenerate function as the top-level test but replace its direct test logic with t.Run("Should generate types from spec", func(t *testing.T) { ... }) and move the current t.Parallel(), temp dir setup, writeTestSpec, call to Generate, file read, and assertions into that subtest; ensure t.Parallel() is called inside the subtest, and retain references to Artifact, Generate, and writeTestSpec so behavior and assertions remain unchanged.internal/store/globaldb/global_db_session_test.go (1)
29-46: Assert the two new liveness timestamps too.This query now includes
subprocess_started_atandlast_update_at, but the test only checks PID/stall fields. A column-order regression can mis-wire either timestamp and still pass, so please assert both parsed values as part of the new scan contract.As per coding guidelines,
Focus on critical paths: workflow execution, state management, error handlingandEnsure tests verify behavior outcomes, not just function calls.Also applies to: 70-81
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/store/globaldb/global_db_session_test.go` around lines 29 - 46, The test in global_db_session_test.go that builds the row with formatTimestamp(...) must also assert the parsed subprocess_started_at and last_update_at values rather than only PID/stall fields; update the relevant test (the one currently asserting PID/stall) to add assertions that the returned session's SubprocessStartedAt and LastUpdateAt (or similarly named struct fields) equal the two formatTimestamp values (2026-04-03T12:03:00Z and 2026-04-03T12:04:00Z / 12:04:30Z as appropriate), ensuring both liveness timestamps are validated alongside existing checks so column-order regressions fail the test.internal/api/httpapi/session-clear_test.go (1)
12-49: Use the repo’s standardt.Run("Should...")subtest pattern here.These are new handler cases, and they look independent enough to be grouped as subtests and run in parallel. That would align this file with the rest of the Go test conventions the repo asks for.
As per coding guidelines,
Use table-driven tests with subtests (\t.Run`) as default pattern for Go tests,Add t.Parallel() for independent subtests in Go, andMUST 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/api/httpapi/session-clear_test.go` around lines 12 - 49, Combine the two independent tests into a single TestClearSessionConversationHandler that uses t.Run("Should return session", func(t *testing.T){ t.Parallel(); ... }) and t.Run("Should return conflict for prompt in progress", func(t *testing.T){ t.Parallel(); ... }) subtests, preserving the existing setup and assertions from TestClearSessionConversationHandlerReturnsSession and TestClearSessionConversationHandlerReturnsConflictForPromptInProgress (keep the stubSessionManager ClearFn behavior, newTestRouter/newTestHandlers usage, performRequest and assertions intact) so each subtest runs in parallel and follows the repo's "Should..." naming convention.internal/store/globaldb/global_db_test.go (1)
991-996: Round-trip the other new liveness fields too.This fixture now populates
LastUpdateAtandStallState, but the assertions only verifySubprocessPIDandStallReason. A regression in thelast_update_atorstall_stateread/write path would still pass this test.Also applies to: 1038-1046
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/store/globaldb/global_db_test.go` around lines 991 - 996, The test populates store.SessionLivenessMeta with LastUpdateAt and StallState but only asserts SubprocessPID and StallReason; update the assertions in the tests that exercise SessionLivenessMeta (the block creating store.SessionLivenessMeta and the other occurrence around the 1038–1046 area) to also verify LastUpdateAt is equal to the original ptrTime value and StallState equals store.SessionStallStateDetected so the LastUpdateAt and StallState read/write paths are round-tripped and validated.internal/session/manager_integration_test.go (1)
164-173: Compute the expected digest instead of reading it from the fixture.
capabilityAgent.Capabilities.Capabilities[0].Digeststarts empty in this literal, so this assertion only verifies digest projection if some earlier helper mutated the catalog in place. Deriving the expected value withaghconfig.CanonicalCapabilityDigest(...)makes the new check deterministic.Example tweak
+ digest, err := aghconfig.CanonicalCapabilityDigest(capabilityAgent.Capabilities.Capabilities[0]) + if err != nil { + t.Fatalf("CanonicalCapabilityDigest() error = %v", err) + } wantCapabilities := []NetworkPeerCapability{{ ID: "review-pr", Summary: "Review pull requests", Outcome: "Deliver actionable pull request feedback", Version: "1.0.0", - Digest: capabilityAgent.Capabilities.Capabilities[0].Digest, + Digest: digest, ContextNeeded: []string{"Pull request diff", "Acceptance criteria"}, ArtifactsExpected: []string{"Review summary"}, Requirements: []string{"review-guidelines", "workspace-write"}, }}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/session/manager_integration_test.go` around lines 164 - 173, The test builds wantCapabilities with an empty Digest pulled from capabilityAgent.Capabilities.Capabilities[0].Digest; instead compute the expected digest deterministically using aghconfig.CanonicalCapabilityDigest on the capability's canonical form and assign that value to the Digest field in wantCapabilities (referencing NetworkPeerCapability, wantCapabilities, and capabilityAgent.Capabilities.Capabilities[0]); this ensures the assertion uses a computed canonical digest rather than relying on a mutated fixture.internal/session/manager_clear_test.go (1)
12-118: Prefert.Run("Should...")subtests for the new clear-conversation coverage.These two scenarios exercise the same API with duplicated harness/prompt setup. Folding them into table-driven subtests would make the new file easier to extend with more clear/reset cases.
As per coding guidelines, "Use table-driven tests with subtests (
t.Run) as default pattern for Go tests" and "**/*_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/session/manager_clear_test.go` around lines 12 - 118, Refactor the two top-level tests TestClearConversationRestartsSameSessionWithFreshContext and TestClearConversationRejectsPromptInProgress into a table-driven test that uses t.Run("Should...") subtests: keep the shared setup (newHarness, createSession) factored once and moved into a per-case setup routine, and for each case set any case-specific state (e.g., set h.driver.promptHook for the "prompt in progress" case, or leave it default for the "restart fresh context" case), call h.manager.ClearConversation and run the existing assertions inside the corresponding t.Run body; factor repeated helpers (collectEvents, readStoredEvents, waitForCondition) into local helper functions and ensure each subtest uses t.Parallel() as appropriate to preserve concurrency semantics.internal/network/router_integration_test.go (1)
119-411: Wrap these new scenarios int.Run("Should...")subtests.Both tests add more capability lifecycle coverage, but they still use standalone test bodies instead of the repo’s required subtest pattern. Moving these into
t.Run("Should ...")blocks will also make the repeated router setup easier to extend for future cases.As per coding guidelines,
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/network/router_integration_test.go` around lines 119 - 411, Both TestRoutersExchangeBroadcastCapabilityTransfers and TestRoutersPreserveCapabilityLifecycleAcrossPeers must be converted to use the repo's required subtest pattern: wrap the existing test bodies in t.Run("Should ...", func(t *testing.T){ ... }) subtests (move t.Parallel() into the subtest if needed) so each scenario becomes a named "Should ..." subtest; update the top-level test functions (TestRoutersExchangeBroadcastCapabilityTransfers and TestRoutersPreserveCapabilityLifecycleAcrossPeers) to call t.Run with descriptive titles (e.g. "Should exchange broadcast capability transfers" and "Should preserve capability lifecycle across peers") and place the current contents inside the corresponding anonymous func(t *testing.T) while preserving all calls to NewTransport, NewPeerRegistry, NewRouter, subscribeRouter, routerA.Send/PublishGreet, waitForRouterCondition, waitForDelivery, and the final errCh select.internal/session/liveness.go (1)
124-138: Consider removing unnecessary cloning in equality check.
CloneSessionLivenessMetacreates copies but only field reads follow—no mutation occurs. The cloning adds allocation overhead without benefit.♻️ Suggested simplification
func sessionLivenessEqual(left *store.SessionLivenessMeta, right *store.SessionLivenessMeta) bool { - lhs := store.CloneSessionLivenessMeta(left) - rhs := store.CloneSessionLivenessMeta(right) switch { - case lhs == nil && rhs == nil: + case left == nil && right == nil: return true - case lhs == nil || rhs == nil: + case left == nil || right == nil: return false } - return lhs.SubprocessPID == rhs.SubprocessPID && - timesEqual(lhs.SubprocessStartedAt, rhs.SubprocessStartedAt) && - timesEqual(lhs.LastUpdateAt, rhs.LastUpdateAt) && - lhs.StallState == rhs.StallState && - lhs.StallReason == rhs.StallReason + return left.SubprocessPID == right.SubprocessPID && + timesEqual(left.SubprocessStartedAt, right.SubprocessStartedAt) && + timesEqual(left.LastUpdateAt, right.LastUpdateAt) && + left.StallState == right.StallState && + left.StallReason == right.StallReason }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/session/liveness.go` around lines 124 - 138, The equality function sessionLivenessEqual currently calls store.CloneSessionLivenessMeta for both inputs but never mutates them; remove those clones and compare the input pointers/fields directly: use left and right (handle nil cases the same way) and then compare SubprocessPID, SubprocessStartedAt, LastUpdateAt, StallState, and StallReason (using timesEqual for time fields) without allocating cloned copies or calling CloneSessionLivenessMeta.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 921adb09-d901-4be1-ba9f-3d89bbc28eeb
⛔ Files ignored due to path filters (109)
.agents/skills/assistant-ui/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/assistant-ui/references/architecture.mdis excluded by!**/*.md,!.agents/**.agents/skills/assistant-ui/references/packages.mdis excluded by!**/*.md,!.agents/**.agents/skills/primitives/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/primitives/references/action-bar.mdis excluded by!**/*.md,!.agents/**.agents/skills/primitives/references/composer.mdis excluded by!**/*.md,!.agents/**.agents/skills/primitives/references/message.mdis excluded by!**/*.md,!.agents/**.agents/skills/primitives/references/thread.mdis excluded by!**/*.md,!.agents/**.agents/skills/runtime/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/runtime/references/external-store.mdis excluded by!**/*.md,!.agents/**.agents/skills/runtime/references/local-runtime.mdis excluded by!**/*.md,!.agents/**.agents/skills/runtime/references/state-hooks.mdis excluded by!**/*.md,!.agents/**.agents/skills/runtime/references/thread-list.mdis excluded by!**/*.md,!.agents/**.agents/skills/runtime/references/types.mdis excluded by!**/*.md,!.agents/**.agents/skills/streaming/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/streaming/references/assistant-transport.mdis excluded by!**/*.md,!.agents/**.agents/skills/streaming/references/data-stream.mdis excluded by!**/*.md,!.agents/**.agents/skills/streaming/references/encoders.mdis excluded by!**/*.md,!.agents/**.agents/skills/tools/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/tools/references/human-in-loop.mdis excluded by!**/*.md,!.agents/**.agents/skills/tools/references/make-tool.mdis excluded by!**/*.md,!.agents/**.agents/skills/tools/references/tool-ui.mdis excluded by!**/*.md,!.agents/**.codex/plans/2026-04-20-prompt-stream-stall.mdis excluded by!**/*.md.codex/plans/2026-04-20-session-chat-production-hardening.mdis excluded by!**/*.md.codex/plans/2026-04-20-session-creation-feedback.mdis excluded by!**/*.md.codex/plans/2026-04-21-assistant-ui-hard-cut.mdis excluded by!**/*.md.compozy/tasks/assistant-ui/_tasks.mdis excluded by!**/*.md.compozy/tasks/assistant-ui/_techspec.mdis excluded by!**/*.md.compozy/tasks/assistant-ui/adrs/adr-001.mdis excluded by!**/*.md.compozy/tasks/assistant-ui/adrs/adr-002.mdis excluded by!**/*.md.compozy/tasks/assistant-ui/adrs/adr-003.mdis excluded by!**/*.md.compozy/tasks/assistant-ui/adrs/adr-004.mdis excluded by!**/*.md.compozy/tasks/assistant-ui/memory/MEMORY.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/_tasks.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/_techspec.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/adrs/adr-001.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/adrs/adr-002.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/adrs/adr-003.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/adrs/adr-004.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/adrs/adr-005.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/task_01.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/task_02.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/task_03.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/task_04.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/task_05.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/task_06.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/task_07.mdis excluded by!**/*.md.compozy/tasks/session-driver-override/task_08.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/_tasks.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/memory/MEMORY.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/memory/task_01.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/memory/task_02.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/memory/task_03.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/memory/task_04.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/memory/task_05.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/memory/task_06.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/memory/task_07.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/memory/task_08.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/memory/task_09.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/memory/task_10.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/issues/BUG-001.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/issues/BUG-002.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/issues/BUG-003.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/test-cases/TC-INT-001.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/test-cases/TC-INT-002.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/test-cases/TC-INT-003.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/test-cases/TC-INT-004.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/test-cases/TC-REG-001.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/test-cases/TC-REG-002.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/test-cases/TC-UI-001.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/test-plans/unified-capabilities-regression.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/test-plans/unified-capabilities-test-plan.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/qa/verification-report.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/task_01.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/task_02.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/task_03.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/task_04.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/task_05.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/task_06.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/task_07.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/task_08.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/task_09.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/task_10.mdis excluded by!**/*.mdbun.lockis excluded by!**/*.lockdocs/agents/capabilities.mdis excluded by!**/*.mddocs/rfcs/003_agh-network-v0.mdis excluded by!**/*.mdopenapi/agh.jsonis excluded by!**/*.jsonopenapi/compozy-daemon.jsonis excluded by!**/*.jsonpackages/site/content/protocol/capability-discovery.mdxis excluded by!**/*.mdxpackages/site/content/protocol/envelope.mdxis excluded by!**/*.mdxpackages/site/content/protocol/examples.mdxis excluded by!**/*.mdxpackages/site/content/protocol/index.mdxis excluded by!**/*.mdxpackages/site/content/protocol/interactions.mdxis excluded by!**/*.mdxpackages/site/content/protocol/message-kinds.mdxis excluded by!**/*.mdxpackages/site/content/protocol/meta.jsonis excluded by!**/*.jsonpackages/site/content/protocol/nats.mdxis excluded by!**/*.mdxpackages/site/content/protocol/overview.mdxis excluded by!**/*.mdxpackages/site/content/protocol/peer-discovery.mdxis excluded by!**/*.mdxpackages/site/content/protocol/recipes.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/agents/capabilities.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/agents/definitions.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/configuration/agent-md.mdxis excluded by!**/*.mdxpackages/site/content/runtime/core/skills/bundled.mdxis excluded by!**/*.mdxpackages/ui/README.mdis excluded by!**/*.mdskills-lock.jsonis excluded by!**/*.jsonturbo.jsonis excluded by!**/*.jsonweb/package.jsonis excluded by!**/*.jsonweb/src/generated/agh-openapi.d.tsis excluded by!**/generated/**web/src/generated/compozy-openapi.d.tsis excluded by!**/generated/**
📒 Files selected for processing (191)
.compozy/tasks/unified-capabilities/qa/issues/.gitkeep.compozy/tasks/unified-capabilities/qa/screenshots/.gitkeepcmd/agh-codegen/main.gocmd/agh-codegen/main_test.gointernal/acp/process_tree_windows.gointernal/api/contract/contract.gointernal/api/contract/contract_test.gointernal/api/contract/responses.gointernal/api/core/error_paths_test.gointernal/api/core/handlers.gointernal/api/core/handlers_internal_test.gointernal/api/core/handlers_test.gointernal/api/core/interfaces.gointernal/api/core/network.gointernal/api/core/network_details.gointernal/api/core/network_test.gointernal/api/core/session_workspace.gointernal/api/httpapi/handlers_test.gointernal/api/httpapi/httpapi_integration_test.gointernal/api/httpapi/prompt.gointernal/api/httpapi/routes.gointernal/api/httpapi/session-clear_test.gointernal/api/httpapi/sessions.gointernal/api/testutil/apitest.gointernal/api/udsapi/handlers_test.gointernal/api/udsapi/network_test.gointernal/api/udsapi/prompt.gointernal/api/udsapi/routes.gointernal/api/udsapi/sessions.gointernal/api/udsapi/transport_parity_integration_test.gointernal/api/udsapi/udsapi_integration_test.gointernal/cli/network_client_test.gointernal/cli/network_test.gointernal/codegen/openapits/generate.gointernal/codegen/openapits/generate_test.gointernal/config/agent_capabilities_test.gointernal/config/capabilities.gointernal/config/capabilities_test.gointernal/daemon/daemon_acpmock_faults_integration_test.gointernal/daemon/daemon_acpmock_helpers_integration_test.gointernal/daemon/daemon_network_collaboration_integration_test.gointernal/daemon/daemon_test.gointernal/daemon/network_e2e_assertions_test.gointernal/daemon/task_runtime.gointernal/daemon/task_runtime_test.gointernal/e2elane/command_wiring_test.gointernal/e2elane/lanes.gointernal/e2elane/lanes_test.gointernal/extension/host_api_test.gointernal/hooks/executor_subprocess_windows.gointernal/network/audit_test.gointernal/network/capability_catalog.gointernal/network/capability_catalog_test.gointernal/network/delivery.gointernal/network/delivery_test.gointernal/network/envelope.gointernal/network/envelope_integration_test.gointernal/network/helpers_test.gointernal/network/lifecycle.gointernal/network/lifecycle_test.gointernal/network/manager.gointernal/network/manager_test.gointernal/network/peer.gointernal/network/peer_test.gointernal/network/perf_bench_test.gointernal/network/router.gointernal/network/router_integration_test.gointernal/network/router_test.gointernal/network/validate.gointernal/network/validate_test.gointernal/observe/observer.gointernal/observe/reconcile.gointernal/session/interfaces.gointernal/session/liveness.gointernal/session/manager.gointernal/session/manager_clear.gointernal/session/manager_clear_test.gointernal/session/manager_integration_test.gointernal/session/manager_lifecycle.gointernal/session/manager_prompt.gointernal/session/manager_test.gointernal/session/network_peer.gointernal/session/network_peer_test.gointernal/session/query.gointernal/session/query_test.gointernal/session/resume_repair.gointernal/session/session.gointernal/session/transcript.gointernal/session/transcript_test.gointernal/store/globaldb/global_db.gointernal/store/globaldb/global_db_extra_test.gointernal/store/globaldb/global_db_session.gointernal/store/globaldb/global_db_session_test.gointernal/store/globaldb/global_db_test.gointernal/store/globaldb/migrate_workspace.gointernal/store/session_liveness.gointernal/store/types.gointernal/subprocess/signals_windows.gointernal/task/manager.gointernal/task/types.gointernal/testutil/e2e/artifacts.gointernal/testutil/e2e/artifacts_test.gointernal/testutil/e2e/config_seed.gointernal/testutil/e2e/config_seed_test.gointernal/testutil/e2e/runtime_harness.gointernal/testutil/e2e/runtime_harness_helpers_test.gointernal/testutil/e2e/runtime_harness_integration_test.gointernal/testutil/e2e/runtime_harness_lifecycle_test.gointernal/testutil/e2e/runtime_harness_test.gointernal/testutil/e2e/transport_parity.gointernal/testutil/e2e/transport_parity_test.gointernal/transcript/ui_messages.gomagefile.gopackages/site/components/landing/__tests__/landing.test.tsxpackages/site/components/landing/network-protocol-visual.tsxpackages/site/components/landing/network-section.tsxpackages/site/components/landing/primitives/kind-chip.tsxpackages/ui/src/components/card.tsxpackages/ui/src/components/dialog.test.tsxpackages/ui/src/components/dialog.tsxpackages/ui/src/components/empty.test.tsxpackages/ui/src/components/empty.tsxpackages/ui/src/components/kind-chip.tsxpackages/ui/src/components/stories/card.stories.tsxpackages/ui/src/components/stories/kind-chip.stories.tsxpackages/ui/src/index.tsweb/.storybook/preview.tsweb/src/components/app-header.test.tsxweb/src/components/app-header.tsxweb/src/components/app-sidebar.test.tsxweb/src/components/app-sidebar.tsxweb/src/components/assistant-ui/hooks/use-session-composer-state.tsweb/src/components/assistant-ui/session-thread.tsxweb/src/components/design-system-showcase.tsxweb/src/hooks/routes/use-app-layout.test.tsxweb/src/hooks/routes/use-app-layout.tsweb/src/hooks/routes/use-session-page-controls.tsweb/src/hooks/routes/use-session-page.tsweb/src/lib/api-client.test.tsweb/src/lib/api-client.tsweb/src/lib/api-contract.tsweb/src/lib/daemon-api-contract.test.tsweb/src/routes/-__root.test.tsxweb/src/routes/-_app.test.tsxweb/src/routes/__root.tsxweb/src/routes/_app.tsxweb/src/routes/_app/-network.test.tsxweb/src/routes/_app/-session.$id.test.tsxweb/src/routes/_app/-tasks.$id.runs.$runId.test.tsxweb/src/routes/_app/-tasks.$id.test.tsxweb/src/routes/_app/session.$id.tsxweb/src/routes/_app/stories/-session.stories.tsxweb/src/routes/_app/tasks.$id.runs.$runId.tsxweb/src/routes/_app/tasks.$id.tsxweb/src/storybook/route-story.tsxweb/src/systems/automation/components/automation-run-history.tsxweb/src/systems/network/components/network-channel-detail-panel.tsxweb/src/systems/network/components/network-peer-detail-panel.test.tsxweb/src/systems/network/components/network-peer-detail-panel.tsxweb/src/systems/network/index.tsweb/src/systems/network/lib/network-formatters.test.tsweb/src/systems/network/lib/network-formatters.tsweb/src/systems/network/mocks/fixtures.tsweb/src/systems/network/types.tsweb/src/systems/session/adapters/session-api.test.tsweb/src/systems/session/adapters/session-api.tsweb/src/systems/session/components/chat-header.test.tsxweb/src/systems/session/components/chat-header.tsxweb/src/systems/session/components/chat-view.integration.test.tsxweb/src/systems/session/components/chat-view.test.tsweb/src/systems/session/components/chat-view.tsxweb/src/systems/session/components/message-bubble.test.tsxweb/src/systems/session/components/message-bubble.tsxweb/src/systems/session/components/message-composer.test.tsxweb/src/systems/session/components/message-composer.tsxweb/src/systems/session/components/permission-prompt.integration.test.tsxweb/src/systems/session/components/permission-prompt.tsxweb/src/systems/session/components/processing-indicator.tsxweb/src/systems/session/components/session-chat-runtime-provider.test.tsxweb/src/systems/session/components/session-chat-runtime-provider.tsxweb/src/systems/session/components/session-inspector.integration.test.tsxweb/src/systems/session/components/session-inspector.test.tsxweb/src/systems/session/components/session-inspector.tsxweb/src/systems/session/components/stories/chat-header.stories.tsxweb/src/systems/session/components/stories/chat-view.stories.tsxweb/src/systems/session/components/stories/message-bubble.stories.tsxweb/src/systems/session/components/stories/message-composer.stories.tsxweb/src/systems/session/components/stories/session-inspector.stories.tsxweb/src/systems/session/components/stories/tool-group-section.stories.tsxweb/src/systems/session/components/tool-group-section.tsxweb/src/systems/session/hooks/use-chat-view-content.ts
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (4)
internal/network/capability_catalog.go (1)
203-205: Consider logging malformed extension data for observability.JSON unmarshal errors are silently converted to "unknown" status. While this is appropriate for defensive handling of external/untrusted extension data, logging at debug level would aid troubleshooting when capability catalogs fail to decode.
💡 Optional: Add debug logging for parse failures
var payload whoisCapabilityCatalogPayload if err := json.Unmarshal(raw, &payload); err != nil { + // Could add: slog.Debug("network: decode whois capability catalog extension", "error", err) return nil, false }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/network/capability_catalog.go` around lines 203 - 205, The json.Unmarshal error is being swallowed when decoding extension payloads (the raw and payload variables), which hampers observability; update the error handling in the block that calls json.Unmarshal(raw, &payload) to log the parse failure at debug level (including the error message and the raw bytes/string) before returning nil, false so malformed extension data is visible for troubleshooting (use the existing logger instance in scope or the package logger and ensure sensitive data is truncated if necessary).internal/codegen/openapits/generate.go (1)
29-34: Avoid hardcoding external codegen command/tool names.
bunx,openapi-typescript, andoxfmtare embedded in code. Consider injecting these via options/config to keep tooling portable and environment-safe.As per coding guidelines, "Never hardcode configuration — use TOML config or functional options."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/codegen/openapits/generate.go` around lines 29 - 34, The calls to runCommand in generate.go currently hardcode tool names ("bunx", "openapi-typescript", "oxfmt") which violates the no-hardcoded-configuration guideline; refactor to accept these tool names via configuration or functional options (e.g., add a CodegenConfig or options struct with fields like BunxCmd, OpenAPITypesCmd, OxfmtCmd and default values) and update the code that invokes runCommand in the generate function to use config.BunxCmd, config.OpenAPITypesCmd and config.OxfmtCmd when running commands against artifact.SpecPath and artifact.OutputPath; ensure callers are updated to pass the config (or load defaults from TOML/env) so behavior remains backward-compatible.internal/daemon/daemon_test.go (1)
4222-4239: Wrap this case in at.Run("Should...")subtest.The scenario is useful, but the new coverage doesn't follow the test shape required for new Go test cases in this repo.
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/daemon/daemon_test.go` around lines 4222 - 4239, Wrap the existing test body of TestFakeSessionManagerClearConversationTreatsMissingSessionAsFreshConversation in a t.Run subtest with a "Should..." description (for example: t.Run("Should treat missing session as fresh conversation", func(t *testing.T) { ... })), move the existing assertions and call to manager.ClearConversation into that subtest, and call t.Parallel() inside the subtest (or keep outer t.Parallel() and also call it inside if desired) so the test conforms to the repo's t.Run("Should...") pattern; refer to the test name TestFakeSessionManagerClearConversationTreatsMissingSessionAsFreshConversation and the fakeSessionManager.ClearConversation call to locate the code to change.internal/api/udsapi/handlers_test.go (1)
1053-1124: Uset.Run("Should...")for the new UDS handler cases.Both added tests are standalone bodies, but new Go test coverage in this repo is expected to use named
Should...subtests.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/api/udsapi/handlers_test.go` around lines 1053 - 1124, Two new tests (TestPromptSessionHandlerCancelsDetachedPromptContextWhenRequestEnds and TestCancelSessionPromptHandlerReturnsOK) must be converted into named subtests using the t.Run("Should...") pattern; wrap the existing test bodies inside t.Run calls with descriptive "Should..." names (e.g. t.Run("Should cancel prompt context when request ends", func(t *testing.T){ ... }) and t.Run("Should return OK when cancelling session prompt", func(t *testing.T){ ... })), keeping all existing setup and assertions intact and only moving their code into the t.Run closures so the tests follow the repository's required test naming convention.
🤖 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/httpapi/prompt.go`:
- Around line 79-80: The code currently treats a forced empty tool input ("{}"
with force=true) as final and immediately marks the tool as ready, which
prevents any later real tool_call from being recorded; update the logic around
toolInputsReady and toolNames so that a forced/empty input does NOT mark the
tool as ready or override existing/non-empty inputs: when receiving a
tool_result with force=true and an empty args payload, do not insert into
toolInputsReady or set toolNames (or, alternatively, store it as a
provisional/forced marker that can be replaced), and ensure the handler that
processes later tool_call events (the same code paths referenced at
toolInputsReady/toolNames and the regions you noted: 117-119, 242-249, 326-352)
will overwrite provisional/forced entries with real arguments and then mark the
tool as ready. Ensure checks reference the force flag (or emptiness) to decide
whether to mark ready or defer.
In `@internal/codegen/openapits/generate_test.go`:
- Around line 103-109: Add a sentinel error and wrap filesystem-not-found
errors, then update tests to use errors.Is: declare a package-level var
ErrMissingGeneratedFile = errors.New("generated file is missing") in the
generate.go file, change the os.IsNotExist(err) return to wrap that sentinel
(e.g., return fmt.Errorf("%s: %w", path, ErrMissingGeneratedFile)) in the code
path used by Check, and update the tests in generate_test.go (the TestCheck...
assertions around Check(context.Background(), artifact) and the
TestCheckGeneratedFile case) to use errors.Is(err, ErrMissingGeneratedFile) (and
remove string-based contains checks) so tests assert the typed wrapped error
instead of matching substrings.
In `@internal/codegen/openapits/generate.go`:
- Around line 72-77: In checkGeneratedFile, replace the os.IsNotExist(err) usage
with errors.Is(err, os.ErrNotExist) and introduce a new sentinel error
ErrMissingGeneratedFile (mirroring ErrStaleGeneratedFile) to represent a missing
generated file; when the file read fails due to not-exist, return a wrapped
error using the sentinel (e.g., fmt.Errorf("%w: %s", ErrMissingGeneratedFile,
path)) so callers can use errors.Is to detect the missing-file case instead of
string matching.
In `@internal/procutil/process_started_at_unix.go`:
- Around line 26-54: The ps output must be forced to the C locale before
parsing; change the execabs.CommandContext invocation that runs "ps -o lstart=
-p strconv.Itoa(pid)" so you create a cmd variable (using
execabs.CommandContext), set cmd.Env = append(os.Environ(), "LC_ALL=C") and then
call cmd.Output(); keep existing error handling and use psStartedAtLayout, pid
and startedAtText as before so parsing remains identical but now deterministic
across locales.
- Around line 23-24: The function in process_started_at_unix.go should accept a
context.Context parameter and use it instead of context.Background(): change the
function signature to take ctx context.Context, replace
context.WithTimeout(context.Background(), 2*time.Second) with
context.WithTimeout(ctx, 2*time.Second), and pass that ctx into
execabs.CommandContext; then update callers (MatchesStartTime,
taskSessionMatchesRecordedSubprocess, classifyRecoveredTaskSession and related
tests) to forward their context (e.g., the context available via
inspectTaskSessionRecovery) so cancellation propagates correctly and tests are
adjusted to provide a context.
In `@internal/procutil/procutil_test.go`:
- Around line 58-86: Wrap TestStartedAtCurrentProcess's assertions inside a
single t.Run subtest (e.g., t.Run("ShouldReturnNonZeroPastStartTime", ...)) and
call StartedAt(os.Getpid()) inside that subtest; convert
TestMatchesStartTimeCurrentProcess into a table-driven test that iterates
scenarios (e.g., {"matches", startedAt, want true}, {"mismatch",
startedAt.Add(-time.Hour), want false}) and run each row as its own t.Run
subtest, invoking MatchesStartTime(os.Getpid(), ...) inside each subtest and
asserting the expected boolean result; keep references to StartedAt and
MatchesStartTime and preserve existing error handling/assert messages within the
new subtests.
---
Nitpick comments:
In `@internal/api/udsapi/handlers_test.go`:
- Around line 1053-1124: Two new tests
(TestPromptSessionHandlerCancelsDetachedPromptContextWhenRequestEnds and
TestCancelSessionPromptHandlerReturnsOK) must be converted into named subtests
using the t.Run("Should...") pattern; wrap the existing test bodies inside t.Run
calls with descriptive "Should..." names (e.g. t.Run("Should cancel prompt
context when request ends", func(t *testing.T){ ... }) and t.Run("Should return
OK when cancelling session prompt", func(t *testing.T){ ... })), keeping all
existing setup and assertions intact and only moving their code into the t.Run
closures so the tests follow the repository's required test naming convention.
In `@internal/codegen/openapits/generate.go`:
- Around line 29-34: The calls to runCommand in generate.go currently hardcode
tool names ("bunx", "openapi-typescript", "oxfmt") which violates the
no-hardcoded-configuration guideline; refactor to accept these tool names via
configuration or functional options (e.g., add a CodegenConfig or options struct
with fields like BunxCmd, OpenAPITypesCmd, OxfmtCmd and default values) and
update the code that invokes runCommand in the generate function to use
config.BunxCmd, config.OpenAPITypesCmd and config.OxfmtCmd when running commands
against artifact.SpecPath and artifact.OutputPath; ensure callers are updated to
pass the config (or load defaults from TOML/env) so behavior remains
backward-compatible.
In `@internal/daemon/daemon_test.go`:
- Around line 4222-4239: Wrap the existing test body of
TestFakeSessionManagerClearConversationTreatsMissingSessionAsFreshConversation
in a t.Run subtest with a "Should..." description (for example: t.Run("Should
treat missing session as fresh conversation", func(t *testing.T) { ... })), move
the existing assertions and call to manager.ClearConversation into that subtest,
and call t.Parallel() inside the subtest (or keep outer t.Parallel() and also
call it inside if desired) so the test conforms to the repo's t.Run("Should...")
pattern; refer to the test name
TestFakeSessionManagerClearConversationTreatsMissingSessionAsFreshConversation
and the fakeSessionManager.ClearConversation call to locate the code to change.
In `@internal/network/capability_catalog.go`:
- Around line 203-205: The json.Unmarshal error is being swallowed when decoding
extension payloads (the raw and payload variables), which hampers observability;
update the error handling in the block that calls json.Unmarshal(raw, &payload)
to log the parse failure at debug level (including the error message and the raw
bytes/string) before returning nil, false so malformed extension data is visible
for troubleshooting (use the existing logger instance in scope or the package
logger and ensure sensitive data is truncated if necessary).
🪄 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: 82747a1a-08a1-4289-b6e9-9dc6e8db6f87
⛔ Files ignored due to path filters (34)
.compozy/tasks/unified-capabilities/reviews-001/_meta.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/_meta.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_001.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_002.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_003.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_004.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_005.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_006.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_007.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_008.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_009.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_010.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_011.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_012.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_013.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_014.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_015.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_016.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_017.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_018.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_019.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_020.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_021.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_022.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_023.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_024.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_025.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_026.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_027.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_028.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_029.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_030.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_031.mdis excluded by!**/*.md.compozy/tasks/unified-capabilities/reviews-002/issue_032.mdis excluded by!**/*.md
📒 Files selected for processing (36)
cmd/agh-codegen/main_test.gointernal/api/core/network.gointernal/api/core/network_test.gointernal/api/httpapi/handlers_test.gointernal/api/httpapi/prompt.gointernal/api/httpapi/session-clear_test.gointernal/api/udsapi/handlers_test.gointernal/api/udsapi/prompt.gointernal/codegen/openapits/generate.gointernal/codegen/openapits/generate_test.gointernal/daemon/daemon_network_collaboration_integration_test.gointernal/daemon/daemon_test.gointernal/daemon/task_runtime.gointernal/daemon/task_runtime_test.gointernal/e2elane/command_wiring_test.gointernal/e2elane/lanes_test.gointernal/extension/host_api_test.gointernal/network/audit_test.gointernal/network/capability_catalog.gointernal/network/capability_catalog_test.gointernal/network/envelope_integration_test.gointernal/network/router_integration_test.gointernal/procutil/process_started_at.gointernal/procutil/process_started_at_unix.gointernal/procutil/process_started_at_windows.gointernal/procutil/procutil_test.gointernal/session/liveness.gointernal/session/manager_clear.gointernal/session/manager_clear_test.gointernal/session/manager_integration_test.gointernal/session/manager_prompt.gointernal/session/manager_test.gointernal/store/globaldb/global_db_session_test.gointernal/store/globaldb/global_db_test.gointernal/store/session_liveness.gointernal/subprocess/signals_windows.go
✅ Files skipped from review due to trivial changes (4)
- internal/api/httpapi/session-clear_test.go
- internal/network/envelope_integration_test.go
- internal/e2elane/command_wiring_test.go
- internal/daemon/daemon_network_collaboration_integration_test.go
🚧 Files skipped from review as they are similar to previous changes (11)
- internal/api/udsapi/prompt.go
- internal/e2elane/lanes_test.go
- internal/network/audit_test.go
- internal/network/capability_catalog_test.go
- internal/api/core/network_test.go
- internal/daemon/task_runtime.go
- internal/api/httpapi/handlers_test.go
- internal/network/router_integration_test.go
- internal/daemon/task_runtime_test.go
- cmd/agh-codegen/main_test.go
- internal/extension/host_api_test.go
## Release v0.0.1 This PR prepares the release of version v0.0.1. ### Changelog ## 0.0.1 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.1 This PR prepares the release of version v0.0.1. ### Changelog ## 0.0.1 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.2 This PR prepares the release of version v0.0.2. ### Changelog ## 0.0.2 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release - Fix release process ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows - Improve suite speed Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.2 This PR prepares the release of version v0.0.2. ### Changelog ## 0.0.2 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release - Fix release process - Fix release sync - Decouple release dry-run npm auth - Persist web assets git auth ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows - Improve suite speed <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Updated web assets dependency to a newer version for improved stability and performance. <!-- review_stack_entry_start --> [](https://app.coderabbit.ai/change-stack/compozy/agh/pull/211?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.2 This PR prepares the release of version v0.0.2. ### Changelog ## 0.0.2 - 2026-05-27 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout - Fix release dry-run token contract ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release - Fix release process - Fix release sync - Decouple release dry-run npm auth - Persist web assets git auth - Require npm auth before release merge ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows - Improve suite speed <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Updated dependencies to latest versions. <!-- review_stack_entry_start --> [](https://app.coderabbit.ai/change-stack/compozy/agh/pull/214?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Summary by CodeRabbit
New Features
Improvements
Tests