feat(states): add storage-phase config and task-state repository selector - #380
Draft
vineetvora-scale wants to merge 1 commit into
Draft
feat(states): add storage-phase config and task-state repository selector#380vineetvora-scale wants to merge 1 commit into
vineetvora-scale wants to merge 1 commit into
Conversation
…ctor Introduce TASK_STATE_STORAGE_PHASE and TASK_MESSAGE_STORAGE_PHASE settings (mongodb|dual_write|dual_read|postgres, default mongodb) with a derived mongodb_required property, a TaskStateRepositoryProtocol capturing the contract callers rely on through the DTaskStateRepository seam, and a get_task_state_repository() selector that resolves the backend by phase. The DI seam and both Temporal factories (task retention, scheduled agent runs) now construct the repository through the selector, so a phase switch applies to API handlers and workers alike. Phases other than mongodb raise NotImplementedError until the Postgres repository lands, and the mongodb default keeps existing deployments unchanged.
vineetvora-scale
force-pushed
the
vineetvora/task-state-storage-phase-seam
branch
from
July 28, 2026 20:39
6f216c5 to
0be2190
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
First PR in a short series adding an optional PostgreSQL backend for task state storage, selected per deployment by a config flag. This PR lands the configuration and the selection seam only — no behavior change: the default phase is
mongodb, and existing deployments continue to run exactly as before. The dual-write/dual-read phases are reserved for later in the series (enum values exist, selector rejects them).What's in this PR
1. Storage-phase settings (
src/config/environment_variables.py)TASK_STATE_STORAGE_PHASEandTASK_MESSAGE_STORAGE_PHASE:mongodb | dual_write | dual_read | postgres, defaultmongodb.StoragePhaseenum — a typo fails at startup instead of silently routing to a backend the operator didn't choose.mongodb_requiredproperty (true unless every store's phase ispostgres) for later use in conditional Mongo startup/readiness.2.
TaskStateRepositoryProtocol(src/domain/repositories/task_state_repository.py)DTaskStateRepositoryseam — the states use case and authorization shortcuts (create/get/update/delete/list), the retention service (find_by_field/delete_by_field/batch_create), andget_by_task_and_agent.ItemDoesNotExist/DuplicateItemError, the Mongo-shaped$inlist filter). The MongoDB repository satisfies it unchanged.3. Phase selector wired into the seam
get_task_state_repository()resolves the repository for the configured phase;DTaskStateRepositorynow points at it, so every DI consumer follows automatically.mongodbbranch touches a Mongo handle, which is what will allow running without a MongoDB connection once no store needs one.mongodbphases raiseNotImplementedErroruntil the Postgres repository lands in a follow-up.4. Temporal factories routed through the selector (
src/temporal/task_retention_factory.py,src/temporal/scheduled_agent_run_factory.py)TaskStateRepository(mongodb_database)by hand, bypassing DI. Without this change, apostgres-phase deployment's workers would silently keep using MongoDB while the API used Postgres.Plus docker-compose pass-throughs for both variables (defaulting to
mongodb) on the API and worker services.Review focus
find_by_field/delete_by_field/batch_create— these are part of the contract the future Postgres repository must implement.CRUDRepositoryABC): the ABC'slist()takes no filter/pagination arguments and lacks the task-state-specific methods, and a Protocol requires no change to the MongoDB repository's class hierarchy.Testing
mongodb_requiredmatrix; selector resolution for all phases, including a test pinning that non-mongodb branches never touch Mongo wiring; both Temporal factories resolving through the selector.openapi.yamlregenerated with no diff; ruff clean.Follow-ups (separate PRs)
TaskStateORM+ a schema change creating the new (empty)task_statestable — no data is moved.TaskStatePostgresRepository+ repository tests parametrized over both backends; selector'spostgresbranch goes live.