Release v3.0.0 / v3.0.1 — state root, singular command_response, WEC rehydrate honesty - #63
Conversation
…+ (fix-lvl) Drop the abandoned speedict/RocksDB dependency in favor of stdlib sqlite3 (WAL, JSON values, float32 BLOB utterance cache). Unblocks Python 3.13 installs, removes pickle-on-disk from first-party stores, and fixes process-exclusive LOCK failures under concurrent writers. requires-python is now >=3.13,<3.15; pre-existing .rdb / cache.db RocksDB dirs are abandoned. Co-authored-by: Cursor <cursoragent@cursor.com>
Stream utterance_cache rows instead of fetchall, prefer context managers at call sites, rely on sqlite3.connect(timeout=) instead of interpolating PRAGMA busy_timeout, and harden concurrency/empty-embedding tests. Co-authored-by: Cursor <cursoragent@cursor.com>
…ess_message removal Breaking release bundling the remaining v3.0 cutovers: - Replace SPEEDDICT_FOLDERNAME with FASTWORKFLOW_STATE_ROOT (default ~/.local/state/fastworkflow), namespaced per workflow under workflows/<id>/; centralize path construction in state_paths.py. - Collapse CommandOutput.command_responses to singular command_response (fix-i0e); legacy list keyword raises ValueError. - Remove deprecated WorkflowExecutionContext.process_message(); use process_turn() / _execute_message(). - Bump session-state schema_version 2→3 with no migrator (fix-4od). - Drop dead LLM_RESPONSE_GEN; relax run's SYNDATA_GEN hard-fail. - Restore empty utterance-cache short-circuit before DistilBERT embed (regression from 5eea8f9 streaming refactor). Co-authored-by: Cursor <cursoragent@cursor.com>
Brings v3.0.0 (state root, command_response collapse, process_message removal) and the post-radiantlogicinc#61 sqlite review fixes onto main. Co-authored-by: Cursor <cursoragent@cursor.com>
…ehydrate (fix-fjh) Declare command_parameters as Any so typed params models dump to dict and round-trip through serialize_state → apply_serialized_state without ValidationError. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Sorry @dharrawal, your pull request is larger than the review limit of 150000 diff characters
Reviewer's GuideImplements the v3.0.0 breaking API/storage changes (singular command_response, removal of process_message, new FASTWORKFLOW_STATE_ROOT-based state layout with schema_version=3) plus the v3.0.1 bugfix for command_parameters rehydration, and updates tests/docs/examples accordingly. Sequence diagram for turn execution with singular command_responsesequenceDiagram
actor User
participant FastAPI as FastAPI_turn_endpoint
participant WEC as WorkflowExecutionContext
participant Executor as CommandExecutor
User->>FastAPI: POST /invoke_agent (message)
FastAPI->>WEC: process_turn(message)
WEC->>WEC: _execute_message(message)
WEC->>Executor: perform_action(workflow, message, command_parameters)
Executor-->>WEC: CommandOutput
note right of Executor: CommandOutput.command_response
WEC->>WEC: _build_turn_result(CommandOutput)
WEC-->>FastAPI: TurnOutput
note right of WEC: TurnOutput.answer
note right of WEC: TurnOutput.command_outputs[*].command_response
FastAPI-->>User: HTTP 200 {answer, command_outputs, success}
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
CVE automation (post-merge of #63)
Multi-scanner refresh completed against main at v3.0.1.
| Tool | Result |
|---|---|
| Syft / Trivy / Grype / osv-scanner | Ran on poetry.lock (141 packages) |
| Dockle / Dive | Ran on proxy image python:3.13-slim-bookworm |
| Snyk / Docker Scout | Skipped (no SNYK_TOKEN / Docker Hub login) |
Easy pyproject.toml fixes: none. Only unfixed PyPI advisory is diskcache==5.6.3 (CVE-2025-69872 / GHSA-w8v5-vhqr-4h9v); no patched release on PyPI. OpenVEX not_affected re-verified (document version 4).
Follow-up PR with HTML reports: #64
security/reports/cve-report.htmlsecurity/reports/human-review.html(all current items recommended IGNORE with rationale)
Sent by Cursor Automation: Untitled


Summary
Brings dharrawal/fastworkflow
main(5 commits ahead of radiantlogicinc/fastworkflowmain) up to v3.0.1.Note for reviewers on commit history: Two of the five commits (
135cdf1,5eea8f9) are the original sqlite/Python>=3.13work that already landed on upstream via squash-merge as #61 (092ea6a, v2.31.0). GitHub will list them as commits on this PR, but the net tree diff vs current upstreammainis essentially the v3.0.0 breaking cutover plus the v3.0.1 cold-rehydrate fix (with a small residual utterance-cache ordering fix that corrects a regression introduced during the sqlite streaming refactor).135cdf1/5eea8f9requires-python >=3.13,<3.1564a82ea(+ mergea145cf5)command_responsecollapse,process_messageremoval, schema bumpe8f885eCommandOutput.command_parameters: Anyso WEC serialize→rehydrate does notValidationErrorCloses / implements beads:
fix-i0e(command_response collapse),fix-4od(schema_version 2→3),fix-fjh(command_parameters honesty). Sqlite epicfix-lvlalready shipped via #61.Breaking changes (v3.0.0) — review focus
1.
CommandOutput.command_responses→command_response(fix-i0e)command_response: CommandResponse.command_responses=[...]raisesValueErrorwith a migration hint (the old forward-compat shim that mapped singular→list is reversed and then removed).TurnOutput/ the turn accumulator — this change is per-command wire/data-model only (design of record:docs/turn_result_design_final.md).2.
WorkflowExecutionContext.process_message()removedprocess_message()is gone; callers must useprocess_turn()(or the internal_execute_message()path).bind_app_workflowonce →process_turnper request).3. State directory:
SPEEDDICT_FOLDERNAME→FASTWORKFLOW_STATE_ROOTfastworkflow/state_paths.pycentralizes path construction.~/.local/state/fastworkflow, namespaced underworkflows/<id>/.SPEEDDICT_FOLDERNAME; documents optionalFASTWORKFLOW_STATE_ROOT.LLM_RESPONSE_GEN; relaxrun's hard-fail on missingLITELLM_API_KEY_SYNDATA_GENwhen Bedrock/proxy is in use.4. Session-state
schema_version2 → 3 (fix-4od)Bug fix (v3.0.1) —
fix-fjhCommandOutput.command_parameterswas declaredstrbutCommandExecutorassigns a typed Pydantic params model. Aftermodel_dump(mode="json")the value is adict, soserialize_state→apply_serialized_state/ turn-accumulatormodel_validateraisedValidationErroron WEC cold rehydrate.Any(typed model in memory; dict in records), matching design note A10.tests/test_turn_and_cme_continuation.py.Other net-diff items worth a look
cache_matching.py): restore “empty cache → returnNonebefore DistilBERT embed”. The sqlite streaming refactor had inverted that order (cold-start cost + behavioral regression vs RocksDB / first sqlite port).kvstore.py/ sqlite cache tests vs the feat: v2.31.0 — replace speedict with sqlite3 and require Python 3.13+ #61 squash tip..beads/issues.jsonl/.beads/interactions.jsonl.Files / surface area (high level)
fastworkflow/state_paths.py,tests/test_state_paths.pyfastworkflow/__init__.py(CommandOutput),workflow_execution_context.py,session_state_store.py,turn.py,workflow_agent.py,command_executor.py,run_fastapi_mcp/*,run/__main__.pycommand_response=), CME_commandspyproject.toml2.31.0→3.0.1Compare: main...dharrawal:main
Test plan
command_responses=orprocess_message(in public API / examples / docsFASTWORKFLOW_STATE_ROOT/state_paths.pylayout and thatSPEEDDICT_FOLDERNAMEis fully gone from runtime + examplescommand_parameterssurviveserialize_state→apply_serialized_state(test added intest_turn_and_cme_continuation.py)___command_infoartifacts present (do not retrain/wipe bundled examples); suite is ~24 min and memory-heavy — do not run two suites concurrentlyfastworkflow run/ FastAPI MCP turn against an example workflow after cold start and after a checkpoint rehydrateMigration notes for downstream consumers
CommandOutput(command_responses=[...])withCommandOutput(command_response=...).wec.process_message(...)withwec.process_turn(...).FASTWORKFLOW_STATE_ROOT(or accept the new default under~/.local/state/fastworkflow); do not expect oldSPEEDDICT_FOLDERNAME/ RocksDB.rdbtrees to be reused.>=3.13,<3.15as established in v2.31.0 / feat: v2.31.0 — replace speedict with sqlite3 and require Python 3.13+ #61.Made with Cursor
Summary by Sourcery
Relocate persistent workflow state to a new FASTWORKFLOW_STATE_ROOT layout, collapse CommandOutput to a singular command_response shape across core and FastAPI surfaces, and finalize the v3.0+ turn/result and storage contracts with schema and documentation updates.
New Features:
Bug Fixes:
Enhancements:
Documentation:
Tests: