|
|
@@ -0,0 +1,47 @@
|
|
|
+# Todo 49.1 Session Mode and Atomic Transcript Safety Plan
|
|
|
+
|
|
|
+**Status:** in_progress
|
|
|
+
|
|
|
+## Goal
|
|
|
+
|
|
|
+Prevent session restoration from changing architecture semantics or persisting invalid provider transcripts.
|
|
|
+
|
|
|
+## Scope
|
|
|
+
|
|
|
+- Before updating an existing session config, read its persisted `tool_invocation_mode` (default `dual_agent` for legacy config) and reject an incoming mismatch with a stable error; do not overwrite config.
|
|
|
+- Add `SessionStore.append_messages()` and implement one SQLite transaction for a direct assistant tool-call message plus all matching tool replies.
|
|
|
+- In direct mode with tool calls:
|
|
|
+ - keep the assistant/tool transcript in active memory immediately;
|
|
|
+ - persist the complete protocol group only after batch execution returns all replies;
|
|
|
+ - cancellation/disconnect before completion leaves no partial protocol group.
|
|
|
+- Restore defensively from sessions created by earlier experimental code: drop an incomplete trailing assistant tool-call group or orphan tool replies rather than sending an invalid transcript.
|
|
|
+- Make SQLite column migration safe across concurrent store/process initialization using serialized migration and/or duplicate-column recheck.
|
|
|
+- UI replay skips assistant records whose content is empty and whose only purpose is tool protocol; tool rows retain existing tool styling.
|
|
|
+
|
|
|
+## Files
|
|
|
+
|
|
|
+- Modify: `src/agent_lab/application/session_store.py`
|
|
|
+- Modify: `src/agent_lab/infrastructure/sqlite_store.py`
|
|
|
+- Modify: `src/agent_lab/application/runtime.py`
|
|
|
+- Modify: `src/agent_lab/presentation/static/app.js`
|
|
|
+- Modify: `tests/test_sqlite_store.py`
|
|
|
+- Modify: `tests/test_debug_runtime.py`
|
|
|
+- Modify: `tests/test_websocket_api.py`
|
|
|
+
|
|
|
+## Requirement Execution Loop
|
|
|
+
|
|
|
+### Plan
|
|
|
+
|
|
|
+1. Add RED mode-mismatch tests proving config/history remain unchanged.
|
|
|
+2. Add RED cancellation tests proving no partial assistant/tool group is stored and reconnect remains valid.
|
|
|
+3. Add RED incomplete-tail repair and concurrent migration stress tests.
|
|
|
+4. Add RED static replay test for tool-call-only assistant suppression.
|
|
|
+5. Implement atomic persistence, restore repair, migration serialization, and UI filtering.
|
|
|
+6. Run focused/node/full verification and final reviews.
|
|
|
+
|
|
|
+## Verification
|
|
|
+
|
|
|
+- `UV_CACHE_DIR=.uv-cache uv run pytest tests/test_sqlite_store.py tests/test_debug_runtime.py tests/test_websocket_api.py -q`
|
|
|
+- `node --check src/agent_lab/presentation/static/app.js`
|
|
|
+- `UV_CACHE_DIR=.uv-cache uv run pytest`
|
|
|
+- `git diff --check`
|