6.2 KiB
6.2 KiB
Task 7 report — revision-pinned sessions
Delivered
- New-session requests may carry
workspaceId, provider, model, and thinking. The backend resolves the active operational registry revision, enforces its LLM policy, and persists the workspace ID/revision with the selected LLM settings. - The harness manifest and
tht session newsupport the optional, backward-compatibleworkspace_idandworkspace_revisionfields. - Resume resolves the manifest's retained snapshot, including after later registry publication.
A missing retained revision returns a sanitized
workspace_revision_unavailableresponse. Legacy manifests retain the prior workspace behavior and are marked with a visible warning onGET /sessions/:id. /settingsis now a non-mutating compatibility endpoint: installation defaults remain readable, while anonymous workspace/provider/model/thinking selections are no longer written to backend settings or principal preferences.
TDD evidence
- RED:
npx vitest run test/routes-sessions.test.ts test/routes-settings.test.tsfailed for the new immutable-snapshot and no-settings-mutation assertions; the manifest test failed becausenew_session_manifestdid not accept workspace revision fields. - GREEN:
npx vitest run test/tht-runner.test.ts test/routes-sessions.test.ts test/routes-settings.test.ts && npx tsc --noEmit -p .completed with 97 passing tests and a clean type check. - GREEN:
THT_HOME=/private/tmp/thothii-task7-home .venv/bin/pytest tests/test_session_documents.py tests/test_session_mutations.py -qcompleted with 22 passing tests. git diff --checkcompleted cleanly.
Review fixes — round 3
- The active registry snapshot that located a session now remains the authorization and mutation config for response, steer, events, close/delete, archive/group/rename, documents, and detail. A pruned historical revision cannot block an already-located session's active lifecycle.
- Only Resume resolves the retained pinned descriptor because Pi needs that immutable config to
restart safely. A pruned pin therefore returns the existing sanitized
workspace_revision_unavailable409 solely for Resume.
Round 3 verification
- RED: with a manifest found through an active registry snapshot and
readPinnedforced to fail,POST /sessions/:id/responsereturned 409 instead of forwarding the active gate response. - GREEN:
npx vitest run test/routes-sessions.test.ts test/tht-runner.test.ts test/routes-settings.test.ts && npx tsc --noEmit -p .— 102 tests passed with a clean type check. The regression confirms response, close, and delete use the locating snapshot without callingreadPinned, while Resume returns a sanitized 409. git diff --checkcompleted cleanly.
Review fixes — round 2
- Lifecycle authorization no longer selects the installation-default workspace. The backend now finds each session by querying every operational registry snapshot with the authenticated principal, preserving RLS ownership concealment.
- After locating the manifest, durable pinned sessions resolve their retained descriptor before any lifecycle mutation/reopen. Legacy sessions continue using the locating registry snapshot.
- Session listing aggregates the owner-visible rows from all operational registry snapshots; detail, response, steer, resume, events, documents, and lifecycle mutations use the same server-side locator. No route depends on browser-local workspace state.
Round 2 verification
- RED: the new cross-workspace route integration test created a B session while installation
default A was selected, then demonstrated that
GET /sessionsreturned an empty list. - GREEN:
npx vitest run test/routes-sessions.test.ts test/tht-runner.test.ts test/routes-settings.test.ts && npx tsc --noEmit -p .— 101 tests passed with a clean type check. The integration test covers create B, list, detail, response, and resume through B's pinned descriptor while default A remains configured. - Full backend suite: 342 tests passed. The remaining 7 tests require binding
127.0.0.1and fail in this sandbox withlisten EPERM: operation not permitted; no application assertion failed. The focused typecheck above passed. git diff --checkcompleted cleanly.
Verification note
The unscoped backend suite was also run. The Task 7 code regressions in test/tht-runner.test.ts
were fixed; the remaining failures were existing sandbox restrictions on tests that listen on
127.0.0.1 (listen EPERM: operation not permitted in SSE/e2e health tests), not application
assertions.
Review fixes — round 1
- Every new session now resolves
workspaceIdthrough the registry; an omitted value uses the configured installation default and persists both the resolved ID and revision. Callers cannot bypass revision pinning by supplying a workspace ID. - Browser-local preferences now migrate once from the read-only legacy settings response and hold
workspace, provider, model, and thinking. Session creation includes those selections, including
direct entry points that run before the composer mounts. The frontend no longer
PUTs shared settings. - The settings compatibility endpoint honors a stored installation workspace before falling back to the first workspace configuration.
- Resume rejects finalized and archived sessions before looking up any pinned snapshot, preserving the read-only response even when a historical snapshot is unavailable.
Review verification
- RED: the added backend tests failed for omitted-default pinning, read-only resume ordering, and stored-default precedence; the added frontend preference tests failed because preferences were neither stored nor included in session requests.
- GREEN:
npx vitest run test/tht-runner.test.ts test/routes-sessions.test.ts test/routes-settings.test.ts && npx tsc --noEmit -p .— 100 tests passed with a clean type check. - GREEN:
npx vitest run && npx tsc -b— 332 frontend tests passed with a clean type check. - GREEN:
THT_HOME=/private/tmp/thothii-task7-home .venv/bin/pytest tests/test_session_documents.py tests/test_session_mutations.py -q— 22 tests passed (one existing testcontainers deprecation warning). git diff --checkcompleted cleanly.