fix: qa testing and fixes#73
Conversation
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (26)
📒 Files selected for processing (29)
WalkthroughAdds network presence metrics and UI toggles, separates presence from conversation in timelines, refactors automation fire-limit errors with scheduler deferral, adds child-task creation, migrates knowledge to key-based identity, enables custom migration tables, removes motion-based route transitions, and strips raw session event payloads. Changes
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
Comment |
There was a problem hiding this comment.
Actionable comments posted: 16
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
web/src/hooks/routes/use-task-create-route-state.ts (1)
6-16:⚠️ Potential issue | 🟠 MajorImport task APIs through
@/systems/tasksinstead of@/systems/tasks/lib/*.This route hook reaches into another system’s internals. Please re-export the required task-editor/template APIs from the tasks public barrel and import them from
@/systems/tasks.Suggested direction
-import { - buildCreateChildTaskRequest, - buildCreateTaskRequest, - createTaskEditorDraft, - type TaskEditorDraft, -} from "@/systems/tasks/lib/task-editor"; -import { - DEFAULT_TASK_TEMPLATE_ID, - getTaskTemplate, - type TaskTemplateId, -} from "@/systems/tasks/lib/task-templates"; +import { + buildCreateChildTaskRequest, + buildCreateTaskRequest, + createTaskEditorDraft, + DEFAULT_TASK_TEMPLATE_ID, + getTaskTemplate, + type TaskEditorDraft, + type TaskTemplateId, + useCreateChildTask, + useCreateTask, + useEnqueueTaskRun, +} from "@/systems/tasks";As per coding guidelines, "Cross-system imports: Only through the public barrel (
@/systems/<domain>). Never reach into another system's internals".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@web/src/hooks/routes/use-task-create-route-state.ts` around lines 6 - 16, The hook imports task-editor and task-templates internals directly; replace those imports to use the public tasks barrel by importing buildCreateChildTaskRequest, buildCreateTaskRequest, createTaskEditorDraft, TaskEditorDraft, DEFAULT_TASK_TEMPLATE_ID, getTaskTemplate and TaskTemplateId from "@/systems/tasks" instead of "@/systems/tasks/lib/task-editor" and "@/systems/tasks/lib/task-templates"; update the import statement(s) in use-task-create-route-state.ts to reference the public barrel so the hook no longer reaches into another system’s internals.web/src/systems/network/lib/network-formatters.ts (1)
25-42:⚠️ Potential issue | 🟡 MinorKeep the accepted route kinds aligned with the visible filter set.
toNetworkKindFilter()still accepts"greet", butNETWORK_KIND_FILTERSno longer exposes it. That means?kind=greetremains a valid route state while the UI has no matching filter control, leaving the page in a hidden filtered state.Also applies to: 359-365
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@web/src/systems/network/lib/network-formatters.ts` around lines 25 - 42, NETWORK_SUPPORTED_KINDS includes "greet" but NETWORK_KIND_FILTERS does not, and toNetworkKindFilter still accepts "greet", causing ?kind=greet to produce a hidden filter; fix by making the visible filter list and accepted kinds consistent: either add "greet" back into NETWORK_KIND_FILTERS (so the UI exposes that filter) or remove "greet" from NETWORK_SUPPORTED_KINDS and update toNetworkKindFilter to stop accepting it; ensure the same canonical set of kinds is used across NETWORK_SUPPORTED_KINDS, NETWORK_KIND_FILTERS, and toNetworkKindFilter.internal/automation/dispatch.go (1)
478-499:⚠️ Potential issue | 🔴 CriticalMake fire-limit admission atomic with run reservation.
This is still a read-then-write flow:
evaluateFireLimit()checks the window, thenCreateRun()persists the new run afterward. Two concurrent dispatches can both observecount < maxbefore either write lands, so the limit is still exceedable under load. The dispatcher-local mutex does not close that gap because it is released before persistence and does not coordinate multiple dispatcher instances.Also applies to: 539-597
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/automation/dispatch.go` around lines 478 - 499, The current flow calls evaluateFireLimit(...) then separately persists a Run via d.runs.CreateRun(...), which allows a race where concurrent dispatchers both see room under the limit and both create runs; make the admission atomic by moving the fire-limit check and reservation into a single database operation or transaction: implement a new repository method (e.g. ReserveRunWithFireLimit or CreateRunWithLimit) on d.runs that checks the current active count and inserts the Run in one DB transaction or using a conditional/upsert/row lock so the count cannot be exceeded, and replace the evaluateFireLimit()+CreateRun() sequence with that single atomic call (apply the same change to the similar block around the 539-597 region).
🧹 Nitpick comments (9)
web/src/systems/tasks/lib/task-editor.ts (1)
134-159: Extract shared base payload mapping to avoid builder drift.
buildCreateChildTaskRequestnow mirrorsbuildCreateTaskRequestfield-for-field. Consider moving shared mapping into a single helper so future field changes remain consistent across both paths.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@web/src/systems/tasks/lib/task-editor.ts` around lines 134 - 159, buildCreateChildTaskRequest duplicates the field-by-field mapping that's already in buildCreateTaskRequest; extract the shared mapping into a single helper (e.g., buildBaseCreatePayload or mapDraftToCreatePayload) that accepts a TaskEditorDraft and options { activeWorkspaceId?, templateId?, asDraft? } and returns the common CreateChildTaskRequest-like base payload, then have both buildCreateChildTaskRequest and buildCreateTaskRequest call that helper before applying template-specific logic (keep references to resolveOwnerInput, applyTemplateToCreatePayload, and fields like title, description, scope, workspace, priority, max_attempts, draft, owner, approval_policy, network_channel, identifier to ensure exact parity).web/src/components/app-sidebar.test.tsx (1)
299-340: Always restore console spies, even if the test fails early.
mockRestore()is currently happy-path only. If an assertion throws first, the console mocks can leak into later tests. Usetry/finally.Proposed patch
- const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => undefined); - const errorSpy = vi.spyOn(console, "error").mockImplementation(() => undefined); + const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => undefined); + const errorSpy = vi.spyOn(console, "error").mockImplementation(() => undefined); const agent = { name: "coder", provider: "claude", prompt: "code" }; const initialProps = makeProps({ agents: [agent], sessions: [], }); - const { rerender } = render( - <UIProvider reducedMotion="always"> - <AppSidebar {...initialProps} /> - </UIProvider> - ); - - rerender( - <UIProvider reducedMotion="always"> - <AppSidebar - {...makeProps({ - agents: [agent], - sessions: [ - { - id: "sess_new", - name: "New session", - agent_name: "coder", - provider: "claude", - workspace_id: "ws_alpha", - workspace_path: "/workspace/alpha", - state: "active", - updated_at: "2026-04-06T11:00:00Z", - created_at: "2026-04-06T11:00:00Z", - }, - ], - })} - /> - </UIProvider> - ); - - expect(screen.getByRole("link", { name: "New session" })).toBeInTheDocument(); - expect(warnSpy).not.toHaveBeenCalled(); - expect(errorSpy).not.toHaveBeenCalled(); - - warnSpy.mockRestore(); - errorSpy.mockRestore(); + try { + const { rerender } = render( + <UIProvider reducedMotion="always"> + <AppSidebar {...initialProps} /> + </UIProvider> + ); + + rerender( + <UIProvider reducedMotion="always"> + <AppSidebar + {...makeProps({ + agents: [agent], + sessions: [ + { + id: "sess_new", + name: "New session", + agent_name: "coder", + provider: "claude", + workspace_id: "ws_alpha", + workspace_path: "/workspace/alpha", + state: "active", + updated_at: "2026-04-06T11:00:00Z", + created_at: "2026-04-06T11:00:00Z", + }, + ], + })} + /> + </UIProvider> + ); + + expect(screen.getByRole("link", { name: "New session" })).toBeInTheDocument(); + expect(warnSpy).not.toHaveBeenCalled(); + expect(errorSpy).not.toHaveBeenCalled(); + } finally { + warnSpy.mockRestore(); + errorSpy.mockRestore(); + }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@web/src/components/app-sidebar.test.tsx` around lines 299 - 340, Wrap the console spy setup and assertions in a try/finally so the spies are always restored: create warnSpy and errorSpy before rendering (as shown), run the render/rerender and expectations inside the try block, and call warnSpy.mockRestore() and errorSpy.mockRestore() in the finally block; update the test around render/rerender/AppSidebar (and the makeProps usage) to ensure mockRestore() is executed even if an assertion throws.web/src/systems/knowledge/components/stories/knowledge-list-panel.stories.tsx (1)
201-201: Use the shared key helper for story test-id construction.This keeps stories resilient if fallback key derivation rules evolve.
♻️ Proposed refactor
+import { knowledgeMemoryKey } from "@/systems/knowledge/lib/knowledge-formatters"; ... - const row = await canvas.findByTestId(`memory-item-${defaultMemories[2].key}`); + const row = await canvas.findByTestId(`memory-item-${knowledgeMemoryKey(defaultMemories[2])}`);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@web/src/systems/knowledge/components/stories/knowledge-list-panel.stories.tsx` at line 201, Replace the inline key access used to build the test-id string (`memory-item-${defaultMemories[2].key}`) with the shared key helper used across the codebase: import the helper (e.g., getMemoryKey/memoryKey) and call it with the same memory object (defaultMemories[2]) so the test-id is constructed via the shared derivation function rather than accessing .key directly, ensuring story tests remain resilient to key-derivation changes.web/src/systems/knowledge/components/knowledge-list-panel.tsx (1)
44-45: Use one canonicalmemoryKeyfor row identity.
data-testidusesmemory.key ?? memory.filename, while selection/callback/key useknowledgeMemoryKey(memory). Keeping a single key source avoids drift and duplicate IDs in fallback scenarios.Suggested refactor
function KnowledgeListItem({ memory, isSelected, onSelect }: KnowledgeListItemProps) { const scope = resolveKnowledgeScope(memory); + const memoryKey = knowledgeMemoryKey(memory); return ( <button @@ - data-testid={`memory-item-${memory.key ?? memory.filename}`} + data-testid={`memory-item-${memoryKey}`} onClick={onSelect} type="button" > @@ {group.memories.map(memory => ( + // single identity source for key, selection and callback payload + // avoids divergence between `memory.key` and formatter-derived key <KnowledgeListItem - isSelected={knowledgeMemoryKey(memory) === selectedMemoryKey} - key={knowledgeMemoryKey(memory)} + isSelected={knowledgeMemoryKey(memory) === selectedMemoryKey} + key={knowledgeMemoryKey(memory)} memory={memory} - onSelect={() => onSelectMemory(knowledgeMemoryKey(memory))} + onSelect={() => onSelectMemory(knowledgeMemoryKey(memory))} /> ))}Also applies to: 162-166
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@web/src/systems/knowledge/components/knowledge-list-panel.tsx` around lines 44 - 45, The data-testid and any other identity attributes should use the single canonical key produced by knowledgeMemoryKey(memory) instead of memory.key ?? memory.filename; update the JSX in KnowledgeListPanel (where data-testid is set and the other occurrence around the selection/key handling) to call knowledgeMemoryKey(memory) for row identity and selection callbacks so all places use the same unique identifier and avoid duplicate/falling-back IDs.web/src/hooks/routes/use-knowledge-page.ts (1)
18-22: Don’t overwrite incomingmemory.keyduring decoration.Always re-synthesizing the key risks divergence from backend/canonical identity. Prefer preserving provided keys and only backfilling when absent.
Suggested fix
return (memories ?? []).map(memory => ({ ...memory, scope, - key: `${scope}:${memory.filename}`, + key: memory.key ?? `${scope}:${memory.filename}`, }));🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@web/src/hooks/routes/use-knowledge-page.ts` around lines 18 - 22, The map is overwriting any incoming memory.key; preserve the canonical key when provided and only synthesize one when missing. In the mapping for memories (the arrow mapping over memories in use-knowledge-page.ts), keep ...memory and set key to memory.key if present, otherwise set it to a fallback like `${scope}:${memory.filename}`; ensure scope is still attached via scope property but do not unconditionally replace memory.key.internal/store/globaldb/global_db_task_test.go (1)
725-804: Cover the other persisted open-run states here as subtests.This validates the queued case against SQLite, but the storage guard rejects any non-terminal stored status. Adding claimed/running/starting variants here would catch SQL-level status normalization regressions that the in-memory manager tests would miss.
As per coding guidelines, "Use table-driven tests with subtests (
t.Run) as default pattern" and "Focus on critical paths: workflow execution, state management, error handling."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/store/globaldb/global_db_task_test.go` around lines 725 - 804, Add table-driven subtests inside TestGlobalDBReserveQueuedRunRejectsConcurrentOpenRun that persist a pre-existing run with each non-terminal open status (e.g., taskpkg.RunStatusClaimed, RunStatusRunning, RunStatusStarting) and then call globalDB.ReserveQueuedRun again to assert the storage guard behavior: ReserveQueuedRun must not create a new run (returned run ID is zero/empty), must return the appropriate rejection error (taskpkg.ErrInvalidStatusTransition or mark existing=true where applicable), and ListTaskRuns still shows only the original persisted run; implement using t.Run per status and reuse the existing setup (taskRecord, origin, queuedAt) and functions ReserveQueuedRun and ListTaskRuns to validate each case.internal/api/core/network_test.go (1)
930-1038: Wrap these new cases int.Run("Should...")subtests.These scenarios are added as top-level tests, which breaks the test shape the rest of this file already follows. As per coding guidelines,
**/*_test.go: MUST uset.Run("Should...")pattern for ALL test cases.Also applies to: 1040-1184, 1186-1285
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/api/core/network_test.go` around lines 930 - 1038, The test body in TestBaseHandlersNetworkChannelsSeparatePresenceFromConversation must be wrapped as a t.Run("Should ...") subtest to match the file's required pattern; move the current assertions and HTTP call logic into a t.Run block (keeping t.Parallel() at the top-level test) and give the subtest a descriptive "Should ..." name, e.g., t.Run("Should separate presence from conversation", func(t *testing.T) { ... }); apply the same refactor to the other new top-level test cases called out (the blocks at the other affected ranges) so all new cases use the t.Run("Should...") subtest pattern.internal/automation/dispatch_test.go (1)
563-627: Use the required subtest shape for this new fire-limit case.This new scenario is another standalone top-level test. Please move it under a table-driven parent with
t.Run("Should...")to stay consistent with the repo’s Go test pattern.As per coding guidelines, "
**/*_test.go: Table-driven tests with subtests (t.Run) as default." and "MUST use t.Run("Should...") pattern for ALL test cases".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/automation/dispatch_test.go` around lines 563 - 627, This test function TestDispatchScheduledReservedRunCancelsOnFireLimit is a standalone top-level test but must follow the repo's table-driven subtest pattern; wrap its body as a subtest under a parent test using t.Run("Should cancel reserved run when fire limit reached", func(t *testing.T) { ... }) (preserve the existing assertions and setup including calls to newTestDispatcher, store.CreateRun, and dispatcher.Dispatch) and rename or replace the top-level TestDispatchScheduledReservedRunCancelsOnFireLimit to a parent test (e.g., TestDispatchScheduledReservedFireLimit) that calls t.Parallel() and then invokes t.Run with the existing code moved inside the subtest closure so the scenario uses the required t.Run("Should...") shape.internal/automation/schedule_test.go (1)
183-232: Use the required subtest pattern for this new scheduler case.This coverage was added as a standalone top-level test. Please fold it under a table-driven parent with
t.Run("Should...")so new fire-limit scheduler scenarios can extend the same harness cleanly.As per coding guidelines, "
**/*_test.go: Table-driven tests with subtests (t.Run) as default." and "MUST use t.Run("Should...") pattern for ALL test cases".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/automation/schedule_test.go` around lines 183 - 232, The test TestSchedulerDefersNextRunAfterFireLimit is a top-level standalone test but must follow the repository's table-driven subtest pattern; wrap its existing body (everything inside TestSchedulerDefersNextRunAfterFireLimit) in a t.Run("Should defer next run after fire limit", func(t *testing.T) { ... }) subtest and move t.Parallel() into that subtest (or keep at top-level and call t.Run in a loop if you later add cases) so future fire-limit scenarios can reuse the same harness; keep references to symbols unchanged (TestSchedulerDefersNextRunAfterFireLimit, waitForTimers, newTestScheduler, dispatcher.dispatchResult, store.GetSchedulerState, scheduler.State) and ensure the assertions and setup remain inside the subtest block.
🤖 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/automation/dispatch.go`:
- Around line 521-529: evaluateFireLimit() is currently counting runs returned
by ListRuns() regardless of status, so when reserveExistingRun() persists a
fire-limit hit as RunCancelled it still consumes a slot; update
evaluateFireLimit() (and any other fire-limit counting logic) to filter out
cancelled runs (e.g., exclude status RunCancelled or any cancel-by-fire-limit
marker) or only count runs that have entered execution
(started/running/completed states that should count toward the window) when
computing the fire-limit; ensure ListRuns() is called with the adjusted status
filter and that logic in reserveExistingRun()/finishRun()/fireLimitRunStatus()
remains consistent with the new exclusion so cancellations no longer decrement
available slots.
In `@internal/network/audit_test.go`:
- Around line 334-385: The test functions (e.g.,
TestAuditWriterCoalescesRepeatedGreetHeartbeatsInTimeline and the other test at
387-414) are not using the required t.Run("Should...") subtest pattern; wrap
each test body in a t.Run call with a descriptive "Should..." name, move
t.Parallel() inside the subtest (call t.Parallel() at the start of the t.Run
closure), and keep the existing assertions and helper calls (e.g.,
NewAuditWriter, writer.now override, RecordSent, and checks against storeSink)
unchanged inside the subtest closure so the tests conform to the suite pattern.
In `@internal/network/audit.go`:
- Around line 251-279: shouldWriteTimelineMessage currently only inserts/updates
w.presence.lastSeen and never removes old keys, causing an unbounded map growth;
modify FileAuditWriter.shouldWriteTimelineMessage (and/or the presence struct)
to prune stale entries from w.presence.lastSeen when holding the lock: iterate
the map and delete any entries where at.Now().UTC().Sub(t) > w.presence.duration
(or t.Add(w.presence.duration).Before(at)), and perform this pruning
opportunistically (e.g., each call that updates lastSeen or when the map exceeds
a threshold) to avoid locking cost spikes while ensuring entries older than
presence.duration are removed. Ensure you keep the existing logic that updates
lastSeen[key] = at and that pruning is protected by the same presence.mu lock.
In `@internal/network/greet_summary.go`:
- Around line 52-55: The code in the loop over card.Capabilities returns the
first non-empty trimmed capability but computes the remaining count using the
raw slice length, which overstates N when there are blank entries; update the
return to compute remaining as the number of non-empty (after TrimSpace) entries
after the found index by iterating the tail of card.Capabilities (or using a
helper that filters empties) and counting only trimmed != "" so the returned
tuple gives the correct first non-empty capability and the correct remaining
non-empty count.
In `@internal/session/manager_hooks.go`:
- Around line 215-222: postLifecycleHookContext creates a root context with
context.Background() when ctx is nil; instead, avoid creating root contexts —
use the Manager's lifecycleCtx as the fallback or propagate a non-nil context
from the caller. Modify postLifecycleHookContext to use
session.Manager.lifecycleCtx (or accept a Manager/lifecycleCtx parameter) when
ctx == nil and remove the context.Background() creation, and mirror the same
change in warnHookDispatch so neither function ever constructs a root context;
keep using context.WithoutCancel only on non-root contexts as appropriate and
ensure finalizeStopped still guarantees callers supply or can derive a non-nil
context.
In `@internal/store/globaldb/global_db_task_aux.go`:
- Around line 729-735: The current code calls listTaskRunsWithExecutor and
validateNoOpenRunForQueuedRunReservation while holding the SQLite write lock,
which loads the full run history; instead add a new helper
findOpenRunIDForQueuedRunReservation(ctx, exec, taskID) that runs a targeted
SELECT id ... WHERE task_id = ? AND status NOT IN (...) ORDER BY queued_at DESC,
id DESC LIMIT 1 (using exec.QueryRowContext) and returns the run ID or empty
string, and then replace the existing call to
listTaskRunsWithExecutor/validateNoOpenRunForQueuedRunReservation with a call to
findOpenRunIDForQueuedRunReservation; if it returns a non-empty run ID, pass
that ID into a lightweight validation branch (or adapt
validateNoOpenRunForQueuedRunReservation to accept a run ID instead of a full
slice) so you preserve the run ID for the error message while avoiding scanning
all runs inside BEGIN IMMEDIATE.
In `@internal/store/schema_test.go`:
- Around line 64-65: The two new test cases were added as top-level tests
instead of using the repo’s required t.Run("Should...") subtest pattern; update
TestRunMigrationsUsesIndependentMigrationTables (and the other top-level cases
around the 116-117 area) to wrap each scenario in t.Run("Should ...", func(t
*testing.T) { ... }) subtests (preserve t.Parallel where appropriate inside each
subtest) so every test case follows the "Should..." naming convention and uses
t.Run rather than being standalone top-level tests.
In `@internal/store/sessiondb/session_db_test.go`:
- Around line 92-93: The test function
TestOpenSessionDBStripsCanonicalRawPayloadsAndVacuumsOldRows must be converted
into a subtest using t.Run("Should ...") to comply with test conventions: wrap
the existing body of
TestOpenSessionDBStripsCanonicalRawPayloadsAndVacuumsOldRows inside t.Run with a
descriptive "Should ..." name and move t.Parallel() into the subtest (or keep it
at the top-level if desired) so the test logic and assertions remain identical
but execute as a properly named subtest; update any references to local
variables accordingly within the t.Run closure.
In `@internal/store/sessiondb/session_db.go`:
- Around line 756-760: OpenSessionDB currently runs vacuumSessionSQLite inside
the store.OpenSQLiteDatabase critical path and returns its error, causing open
to fail on transient VACUUM issues; change the logic so that after
RunMigrations(ctx, db, sessionSchemaMigrations) succeeds you call
vacuumSessionSQLite(ctx, db) but do not propagate its error—log the error (with
context) and continue returning nil so the DB opens even if vacuum fails. Apply
the same change for the other similar block that calls vacuumSessionSQLite (the
one around the 792-804 region) so both OpenSQLiteDatabase callbacks never fail
due to vacuumSessionSQLite errors.
In `@internal/transcript/transcript_test.go`:
- Around line 679-680: The test function
TestMarshalAgentEventExtractsToolResultShapeWithoutPersistingRaw currently
contains standalone scenarios; wrap each scenario in a t.Run("Should...")
subtest (e.g., t.Run("Should extract tool result shape without persisting raw",
func(t *testing.T){...})) so it follows the repo rule; apply the same change to
the other failing test cases referenced in the file (the other test functions
that currently have standalone scenarios around those lines) by converting their
scenario blocks into t.Run("Should...") subtests with descriptive names and
moving assertions inside each subtest closure.
In `@web/src/components/app-sidebar.tsx`:
- Around line 231-241: The component currently copies the derived boolean
shouldAutoOpen into local state via useEffect; remove that effect and instead
keep only a user override state (e.g., replace useState(shouldAutoOpen) with
const [openOverride, setOpenOverride] = useState<boolean | null>(null) or
similar), compute the actual open value as const open = openOverride !== null ?
openOverride : shouldAutoOpen, remove the useEffect block that sets open from
shouldAutoOpen, and pass the computed open and the setter (setOpenOverride or a
wrapper that toggles the override) into <Collapsible open={open}
onOpenChange={...}> so the component uses the derived shouldAutoOpen unless the
user has explicitly overridden it; reference symbols: shouldAutoOpen, open,
setOpen (replace with openOverride/setOpenOverride), useState, useEffect,
Collapsible.
In `@web/src/hooks/routes/use-app-layout.ts`:
- Around line 59-65: The hook currently mixes global useAgents state with
workspace-scoped agents causing false loading/error states; update the
agentsLoading and agentsError expressions to prefer workspaceAgents when
present: set agentsLoading to true only if workspaceAgents === undefined and
(agentsLoading || (activeWorkspaceId !== null &&
activeWorkspaceDetail.isLoading)), and set agentsError only if workspaceAgents
=== undefined and (agentsError || (activeWorkspaceId !== null &&
activeWorkspaceDetail.isError)); this ensures workspaceAgents (from
activeWorkspaceDetail) short-circuits global useAgents loading/error
propagation.
In `@web/src/hooks/routes/use-knowledge-page.ts`:
- Around line 101-113: Remove the effect block that watches
deleteTargetKey/isDeletePending and instead clear the delete state in the
explicit event handlers; delete the useEffect that references deleteTargetKey,
isDeletePending, resetDeleteMutation, setDeleteTargetKey, selectedMemory and
knowledgeMemoryKey, and call resetDeleteMutation() and setDeleteTargetKey(null)
directly from the tab switch handler, search-reset handler, and any
selection/mutation handlers (where selectedMemory changes or a memory is
removed) so the reset happens as part of those event paths rather than via an
effect.
- Around line 4-8: The hook imports internal symbols knowledgeMemoryKey,
filterKnowledgeMemories, and sortKnowledgeMemories directly from
"@/systems/knowledge/lib/*"; update the imports to consume these APIs from the
knowledge public barrel (import from "@/systems/knowledge") instead to respect
module boundaries, or if those symbols are not yet exported from the public
barrel, add/export them (or small wrapper functions) from the public barrel so
use-knowledge-page.ts can import knowledgeMemoryKey, filterKnowledgeMemories,
and sortKnowledgeMemories via "@/systems/knowledge" instead of reaching into
internal lib files.
In `@web/src/hooks/routes/use-network-page.ts`:
- Around line 496-498: The current presenceCount calculation counts greet rows
instead of summing presence episodes; update the presenceCount logic in the
rawMessages handling (the code that uses rawMessages.filter(message =>
message.kind === "greet").length) to sum each greet item's presence_count field
(e.g., use a reduce over rawMessages that adds Number(message.presence_count)
when message.kind === "greet", falling back to 0 if missing) while preserving
the showPresence conditional.
In `@web/src/styles.css`:
- Around line 16-20: The view-transition pseudo-elements
(::view-transition-old(root) and ::view-transition-new(root)) currently hardcode
animation-duration: 140ms and animation-timing-function: ease-out; replace those
literals with the design-system motion tokens defined in DESIGN.md (use the
repo's CSS token variables for duration and easing, e.g. the appropriate
--motion-duration-... and --motion-ease-... tokens) by updating the
animation-duration and animation-timing-function properties to reference those
CSS variables so motion values are centralized and consistent across the app.
---
Outside diff comments:
In `@internal/automation/dispatch.go`:
- Around line 478-499: The current flow calls evaluateFireLimit(...) then
separately persists a Run via d.runs.CreateRun(...), which allows a race where
concurrent dispatchers both see room under the limit and both create runs; make
the admission atomic by moving the fire-limit check and reservation into a
single database operation or transaction: implement a new repository method
(e.g. ReserveRunWithFireLimit or CreateRunWithLimit) on d.runs that checks the
current active count and inserts the Run in one DB transaction or using a
conditional/upsert/row lock so the count cannot be exceeded, and replace the
evaluateFireLimit()+CreateRun() sequence with that single atomic call (apply the
same change to the similar block around the 539-597 region).
In `@web/src/hooks/routes/use-task-create-route-state.ts`:
- Around line 6-16: The hook imports task-editor and task-templates internals
directly; replace those imports to use the public tasks barrel by importing
buildCreateChildTaskRequest, buildCreateTaskRequest, createTaskEditorDraft,
TaskEditorDraft, DEFAULT_TASK_TEMPLATE_ID, getTaskTemplate and TaskTemplateId
from "@/systems/tasks" instead of "@/systems/tasks/lib/task-editor" and
"@/systems/tasks/lib/task-templates"; update the import statement(s) in
use-task-create-route-state.ts to reference the public barrel so the hook no
longer reaches into another system’s internals.
In `@web/src/systems/network/lib/network-formatters.ts`:
- Around line 25-42: NETWORK_SUPPORTED_KINDS includes "greet" but
NETWORK_KIND_FILTERS does not, and toNetworkKindFilter still accepts "greet",
causing ?kind=greet to produce a hidden filter; fix by making the visible filter
list and accepted kinds consistent: either add "greet" back into
NETWORK_KIND_FILTERS (so the UI exposes that filter) or remove "greet" from
NETWORK_SUPPORTED_KINDS and update toNetworkKindFilter to stop accepting it;
ensure the same canonical set of kinds is used across NETWORK_SUPPORTED_KINDS,
NETWORK_KIND_FILTERS, and toNetworkKindFilter.
---
Nitpick comments:
In `@internal/api/core/network_test.go`:
- Around line 930-1038: The test body in
TestBaseHandlersNetworkChannelsSeparatePresenceFromConversation must be wrapped
as a t.Run("Should ...") subtest to match the file's required pattern; move the
current assertions and HTTP call logic into a t.Run block (keeping t.Parallel()
at the top-level test) and give the subtest a descriptive "Should ..." name,
e.g., t.Run("Should separate presence from conversation", func(t *testing.T) {
... }); apply the same refactor to the other new top-level test cases called out
(the blocks at the other affected ranges) so all new cases use the
t.Run("Should...") subtest pattern.
In `@internal/automation/dispatch_test.go`:
- Around line 563-627: This test function
TestDispatchScheduledReservedRunCancelsOnFireLimit is a standalone top-level
test but must follow the repo's table-driven subtest pattern; wrap its body as a
subtest under a parent test using t.Run("Should cancel reserved run when fire
limit reached", func(t *testing.T) { ... }) (preserve the existing assertions
and setup including calls to newTestDispatcher, store.CreateRun, and
dispatcher.Dispatch) and rename or replace the top-level
TestDispatchScheduledReservedRunCancelsOnFireLimit to a parent test (e.g.,
TestDispatchScheduledReservedFireLimit) that calls t.Parallel() and then invokes
t.Run with the existing code moved inside the subtest closure so the scenario
uses the required t.Run("Should...") shape.
In `@internal/automation/schedule_test.go`:
- Around line 183-232: The test TestSchedulerDefersNextRunAfterFireLimit is a
top-level standalone test but must follow the repository's table-driven subtest
pattern; wrap its existing body (everything inside
TestSchedulerDefersNextRunAfterFireLimit) in a t.Run("Should defer next run
after fire limit", func(t *testing.T) { ... }) subtest and move t.Parallel()
into that subtest (or keep at top-level and call t.Run in a loop if you later
add cases) so future fire-limit scenarios can reuse the same harness; keep
references to symbols unchanged (TestSchedulerDefersNextRunAfterFireLimit,
waitForTimers, newTestScheduler, dispatcher.dispatchResult,
store.GetSchedulerState, scheduler.State) and ensure the assertions and setup
remain inside the subtest block.
In `@internal/store/globaldb/global_db_task_test.go`:
- Around line 725-804: Add table-driven subtests inside
TestGlobalDBReserveQueuedRunRejectsConcurrentOpenRun that persist a pre-existing
run with each non-terminal open status (e.g., taskpkg.RunStatusClaimed,
RunStatusRunning, RunStatusStarting) and then call globalDB.ReserveQueuedRun
again to assert the storage guard behavior: ReserveQueuedRun must not create a
new run (returned run ID is zero/empty), must return the appropriate rejection
error (taskpkg.ErrInvalidStatusTransition or mark existing=true where
applicable), and ListTaskRuns still shows only the original persisted run;
implement using t.Run per status and reuse the existing setup (taskRecord,
origin, queuedAt) and functions ReserveQueuedRun and ListTaskRuns to validate
each case.
In `@web/src/components/app-sidebar.test.tsx`:
- Around line 299-340: Wrap the console spy setup and assertions in a
try/finally so the spies are always restored: create warnSpy and errorSpy before
rendering (as shown), run the render/rerender and expectations inside the try
block, and call warnSpy.mockRestore() and errorSpy.mockRestore() in the finally
block; update the test around render/rerender/AppSidebar (and the makeProps
usage) to ensure mockRestore() is executed even if an assertion throws.
In `@web/src/hooks/routes/use-knowledge-page.ts`:
- Around line 18-22: The map is overwriting any incoming memory.key; preserve
the canonical key when provided and only synthesize one when missing. In the
mapping for memories (the arrow mapping over memories in use-knowledge-page.ts),
keep ...memory and set key to memory.key if present, otherwise set it to a
fallback like `${scope}:${memory.filename}`; ensure scope is still attached via
scope property but do not unconditionally replace memory.key.
In `@web/src/systems/knowledge/components/knowledge-list-panel.tsx`:
- Around line 44-45: The data-testid and any other identity attributes should
use the single canonical key produced by knowledgeMemoryKey(memory) instead of
memory.key ?? memory.filename; update the JSX in KnowledgeListPanel (where
data-testid is set and the other occurrence around the selection/key handling)
to call knowledgeMemoryKey(memory) for row identity and selection callbacks so
all places use the same unique identifier and avoid duplicate/falling-back IDs.
In
`@web/src/systems/knowledge/components/stories/knowledge-list-panel.stories.tsx`:
- Line 201: Replace the inline key access used to build the test-id string
(`memory-item-${defaultMemories[2].key}`) with the shared key helper used across
the codebase: import the helper (e.g., getMemoryKey/memoryKey) and call it with
the same memory object (defaultMemories[2]) so the test-id is constructed via
the shared derivation function rather than accessing .key directly, ensuring
story tests remain resilient to key-derivation changes.
In `@web/src/systems/tasks/lib/task-editor.ts`:
- Around line 134-159: buildCreateChildTaskRequest duplicates the field-by-field
mapping that's already in buildCreateTaskRequest; extract the shared mapping
into a single helper (e.g., buildBaseCreatePayload or mapDraftToCreatePayload)
that accepts a TaskEditorDraft and options { activeWorkspaceId?, templateId?,
asDraft? } and returns the common CreateChildTaskRequest-like base payload, then
have both buildCreateChildTaskRequest and buildCreateTaskRequest call that
helper before applying template-specific logic (keep references to
resolveOwnerInput, applyTemplateToCreatePayload, and fields like title,
description, scope, workspace, priority, max_attempts, draft, owner,
approval_policy, network_channel, identifier to ensure exact parity).
🪄 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: 16b9a4db-47e4-4609-bdb5-f944da71ceda
⛔ Files ignored due to path filters (2)
openapi/agh.jsonis excluded by!**/*.jsonweb/src/generated/agh-openapi.d.tsis excluded by!**/generated/**
📒 Files selected for processing (78)
internal/api/contract/contract.gointernal/api/core/coverage_helpers_test.gointernal/api/core/network_details.gointernal/api/core/network_test.gointernal/api/spec/spec.gointernal/automation/dispatch.gointernal/automation/dispatch_test.gointernal/automation/schedule.gointernal/automation/schedule_test.gointernal/memory/catalog.gointernal/memory/store_test.gointernal/network/audit.gointernal/network/audit_test.gointernal/network/delivery.gointernal/network/greet_summary.gointernal/network/manager.gointernal/network/manager_integration_test.gointernal/network/router.gointernal/session/additional_test.gointernal/session/interfaces.gointernal/session/manager_helpers.gointernal/session/manager_hooks.gointernal/session/manager_hooks_test.gointernal/session/network_peer.gointernal/store/globaldb/global_db_task_aux.gointernal/store/globaldb/global_db_task_test.gointernal/store/schema.gointernal/store/schema_test.gointernal/store/sessiondb/session_db.gointernal/store/sessiondb/session_db_test.gointernal/store/types.gointernal/task/manager_test.gointernal/transcript/transcript.gointernal/transcript/transcript_test.goweb/src/components/app-sidebar.test.tsxweb/src/components/app-sidebar.tsxweb/src/hooks/routes/use-app-layout.test.tsxweb/src/hooks/routes/use-app-layout.tsweb/src/hooks/routes/use-automation-page.tsweb/src/hooks/routes/use-home-page.test.tsxweb/src/hooks/routes/use-home-page.tsweb/src/hooks/routes/use-knowledge-page.test.tsxweb/src/hooks/routes/use-knowledge-page.tsweb/src/hooks/routes/use-network-page.tsweb/src/hooks/routes/use-task-create-route-state.tsweb/src/main.tsxweb/src/routes/-_app.test.tsxweb/src/routes/_app.tsxweb/src/routes/_app/-knowledge.test.tsxweb/src/routes/_app/-tasks.new.test.tsxweb/src/routes/_app/knowledge.tsxweb/src/routes/_app/network.tsxweb/src/styles.cssweb/src/systems/automation/components/automation-editor-dialog.test.tsxweb/src/systems/automation/components/automation-editor-dialog.tsxweb/src/systems/automation/index.tsweb/src/systems/automation/lib/dialog-handle.tsweb/src/systems/knowledge/components/knowledge-detail-panel.test.tsxweb/src/systems/knowledge/components/knowledge-detail-panel.tsxweb/src/systems/knowledge/components/knowledge-list-panel.test.tsxweb/src/systems/knowledge/components/knowledge-list-panel.tsxweb/src/systems/knowledge/components/stories/knowledge-list-panel.stories.tsxweb/src/systems/knowledge/hooks/use-knowledge.tsweb/src/systems/knowledge/index.tsweb/src/systems/knowledge/lib/knowledge-formatters.tsweb/src/systems/knowledge/lib/knowledge-list.tsweb/src/systems/knowledge/types.tsweb/src/systems/network/components/network-workspace-shell.test.tsxweb/src/systems/network/components/network-workspace-shell.tsxweb/src/systems/network/index.tsweb/src/systems/network/lib/network-formatters.test.tsweb/src/systems/network/lib/network-formatters.tsweb/src/systems/network/lib/query-keys.tsweb/src/systems/network/lib/query-options.test.tsweb/src/systems/network/types.tsweb/src/systems/tasks/lib/task-editor.test.tsweb/src/systems/tasks/lib/task-editor.tsweb/src/systems/tasks/lib/task-templates.ts
💤 Files with no reviewable changes (1)
- internal/transcript/transcript.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
Bug Fixes