You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: HANDOVER.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
# ONEVibe — Agent Handover Document
2
2
3
3
> **Date**: 2026-07-17
4
-
> **Status**: Local phases 1–3 are implemented and the professional UI has crossed the Zustand and ordinary-collection TanStack Query boundaries. Governed MCP declarations, a tested opt-in MCP capability facade, truthful demo skill status, a GitHub-catalog skill marketplace boundary, feature-gated Better Auth, authenticated owner scoping, and a reviewed Drizzle/Postgres import proof are present. LiteLLM-only enforcement remains mandatory. The running application is still SQLite-backed; protected Claude/provider acceptance, production auth, the Postgres repository/runtime switch, deployment, cloud sandbox attestation, MCP secret brokering/health, and the final active-task Query mutation boundary remain open.
4
+
> **Status**: Local phases 1–3 are implemented and the professional UI has crossed the Zustand and ordinary-collection TanStack Query boundaries. Governed MCP declarations, a tested opt-in MCP capability facade, truthful demo skill status, a GitHub-catalog skill marketplace boundary, feature-gated Better Auth, authenticated owner scoping, and a reviewed Drizzle/Postgres import proof are present. LiteLLM-only enforcement remains mandatory. The running application is still SQLite-backed; protected Claude/provider acceptance, production auth, the Postgres repository/runtime switch, deployment, cloud sandbox attestation, and MCP secret brokering/health remain open.
5
5
> **For**: The next agent (or human) picking this up cold.
6
6
> **Read this entire document before touching any code.**
7
7
@@ -53,7 +53,7 @@ The abstraction that enforces this: `server/runtime-adapter.ts` — the `Runtime
53
53
3.**The running app is not Postgres-backed** — local user scoping is proven, and the Drizzle schema/import/restart proof exists; the TaskStore repository adapter, idempotent application-level proof, and `DATABASE_URL` runtime switch remain Phase 4 work
54
54
4.**No managed deploy path** — a non-root Docker image and local Compose smoke path now exist, but Railway/Fly configuration, secrets, auth, and production operations remain open
55
55
5.**No production sandbox attestation** — local host and development-provider paths must not be described as microVM isolation or default-deny egress
56
-
6.**The active task remains an intentional state boundary** — durable SSE replay and the active snapshot are still owned by `useTask`; remaining active-task mutations must not create a second client authority
56
+
6.**The active task remains an intentional state boundary** — durable SSE replay and the active snapshot are still owned by `useTask`; active-task mutations use Query mutation lifecycle/pending state and reconcile server-derived caches without creating a second client authority
57
57
7.**Remaining extension/release gaps** — protected provider-backed marketplace materialization, production MCP secret/health controls, dependency advisory resolution, and browser evidence remain open in `TODO.md`
-[x]**P5-01** Migrate state management — `useUiStore`, `useComposerStore`, and `useSessionStore` own navigation/inspector, composer, and auth state; all ordinary server-backed collections are now Query-owned. Active task snapshots remain intentionally isolated in `useTask` because they are durable SSE projections, not generic client state.
82
-
-[]**P5-02** Adopt TanStack Query — QueryClient is mounted at the app root; Skills, runtime readiness, MCP declarations, Projects, Schedules, Library, paginated Conversations, and task inventory now use cached queries, and active-task stop/retry/follow-up/branch/share/guidance/project/tag actions now use mutation hooks. The active task/SSE snapshot remains intentionally on `useTask`; close only after mutation-level pending/error UX and active-task cache reconciliation are covered without duplicating server authority.
82
+
-[x]**P5-02** Adopt TanStack Query — QueryClient is mounted at the app root; Skills, runtime readiness, MCP declarations, Projects, Schedules, Library, paginated Conversations, and task inventory use cached queries, and active-task stop/retry/follow-up/branch/share/guidance/project/tag actions use mutation hooks with explicit pending controls and toast errors. The active task/SSE snapshot remains intentionally on `useTask`; successful mutations reconcile server-derived caches or refresh that snapshot without duplicating stream authority.
83
83
-[x]**P5-03** Add toast system — Sonner is mounted globally; task/project/schedule/MCP/share/runtime failures now surface as user-visible notifications, and the duplicate schedule confirmation was removed. Deliberately remains a client error-surface slice, not a replacement for server evidence.
84
84
-[x]**P5-04** Fix all dead controls — removed the two decorative Settings controls, made workspace refresh reload task files, and replaced the hardcoded skills count with the live catalog size
85
85
-[x]**P5-05** Add conversation search UI — sidebar search debounces against the server-backed `/api/conversations?q=...` contract and retains the loaded-history fallback for short queries
Copy file name to clipboardExpand all lines: docs/IMPLEMENTATION-LOG.md
+5Lines changed: 5 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -13,6 +13,11 @@
13
13
- Integrated the facade into non-chat Claude Agent SDK tasks behind `ONEVIBE_MCP_FACADE_ENABLED=true`. When enabled, raw configured MCP servers are not exposed to the SDK; only `search_capabilities` and `execute_capability` are registered. It does not grant approval authority or bypass LiteLLM.
14
14
- Added a deterministic child-process fixture test covering search, exact-ID execution, unknown-capability rejection, and abort handling. `npm run lint`, `npm run test` (50 files / 247 tests), `npm run build`, `npm run db:check`, and `npm run check:e2e-harness` pass. Production MCP health, secret brokering, authenticated ownership, and protected provider acceptance remain open.
15
15
16
+
## 2026-07-17 — active-task Query mutation gate
17
+
18
+
- Closed the remaining local P5-02 boundary. Active task stop/retry/follow-up/branch/share/guidance/project/tag actions already use TanStack Query mutation hooks; this pass makes share requests and queued-guidance removal visibly pending, keeps the composer disabled during active mutation requests, and preserves toast-based mutation errors.
19
+
-`useTask` remains the sole server-authoritative SSE/replay snapshot. Successful mutations either refresh that snapshot or reconcile server-derived task/conversation/library caches; no second browser-owned transcript store was introduced. `npm run lint`, `npm run test` (50 files / 247 tests), and `npm run build` pass.
20
+
16
21
## 2026-07-17 — handover evidence reconciliation
17
22
18
23
- Reconciled the phase checklist against the current implementation and regression evidence: P1-01 backend-offline recovery, P1-08 permanent simulation disclosure, and P2-07 durable guidance queueing are complete and now marked as such in `TODO.md`.
@@ -388,7 +388,7 @@ export default function App() {
388
388
{backendOffline&&<divclassName="backend-offline-banner"role="alert"><div><TriangleAlertsize={15}/><span><strong>Backend offline</strong><small>Run <code>npm run dev</code> in the ONEVibe project root to connect the workspace.</small></span></div><buttontype="button"onClick={()=>voidretryBackend()}disabled={retryingBackend}>{retryingBackend ? 'Checking…' : 'Retry'}</button></div>}
{snapshot.provider==='demo'&&<divclassName="demo-mode-banner"role="status"><div><Sparklessize={14}/><span><strong>Simulation only</strong><small>No model call is made in this task. Use a configured LiteLLM-backed runtime for real provider execution.</small></span></div>{preferredProvider!=='demo'&&<buttontype="button"onClick={()=>navigateToTask(null)}>Start a new governed task</button>}</div>}
{snapshot.queuedGuidance.length>0&&<sectionclassName="guidance-queue"><header><div><ShieldChecksize={13}/><strong>Queued guidance</strong></div><span>Applies after this provider turn</span></header>{snapshot.queuedGuidance.map((guidance,index)=><articlekey={guidance.id}><div><span>Next {index+1}</span><p>{guidance.prompt}</p></div><buttontype="button"onClick={()=>voidretractQueuedGuidance(snapshot.id,guidance.id)}aria-label={`Remove queued guidance ${index+1}`}title="Remove before it reaches the provider"><Xsize={13}/></button></article>)}<footer>Removing a message keeps only cancellation metadata in the evidence ledger.</footer></section>}
{snapshot.queuedGuidance.length>0&&<sectionclassName="guidance-queue"><header><div><ShieldChecksize={13}/><strong>Queued guidance</strong></div><span>Applies after this provider turn</span></header>{snapshot.queuedGuidance.map((guidance,index)=>{constremoving=cancelGuidanceMutation.isPending&&cancelGuidanceMutation.variables?.guidanceId===guidance.id;return<articlekey={guidance.id}><div><span>Next {index+1}</span><p>{guidance.prompt}</p></div><buttontype="button"disabled={removing}onClick={()=>voidretractQueuedGuidance(snapshot.id,guidance.id)}aria-label={`Remove queued guidance ${index+1}`}title={removing ? 'Removing queued guidance…' : 'Remove before it reaches the provider'}>{removing ? <LoaderCircleclassName="spin"size={13}/> : <Xsize={13}/>}</button></article>})}<footer>Removing a message keeps only cancellation metadata in the evidence ledger.</footer></section>}
418
418
</div>
419
419
<divclassName="workspace-pane"><divclassName="mobile-inspector-bar"><span><Monitorsize={13}/> Computer inspector</span><buttontype="button"onClick={()=>setMobileInspectorOpen(false)}>Back to conversation</button></div><Workspacetask={snapshot}projects={projects}runtime={runtime}onMoveProject={moveTaskProject}onUpdateTags={setTaskTags}/></div>
0 commit comments