Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
e60fb75
Add Reflex Workflows MVP slice: durable events, kernel, and test harness
Alek99 Aug 18, 2026
9c576d8
Fence workflow claims with renewable leases
Alek99 Aug 18, 2026
cfccb5a
Make workflow retries mean what they say
Alek99 Aug 18, 2026
3ed7ecc
Stop redeploys from stranding in-flight workflow runs
Alek99 Aug 18, 2026
34d8caf
Reject handler bodies that silently break durability
Alek99 Aug 18, 2026
d55c9ba
Add run listing and label filtering
Alek99 Aug 18, 2026
ce7aea1
Serve webhook-triggered workflow roots over HTTP
Alek99 Aug 18, 2026
3586943
Fire cron schedule triggers
Alek99 Aug 18, 2026
91a75c2
Add durable waits and typed signals
Alek99 Aug 18, 2026
6fbb731
Add an end-to-end test covering the whole workflow surface
Alek99 Aug 18, 2026
b5c0fe0
Document workflows
Alek99 Aug 18, 2026
9914990
Add parallel fan-out with child runs and joins
Alek99 Aug 18, 2026
7bf839c
Add start policies: singleton, debounce, rate limit, throttle
Alek99 Aug 18, 2026
2b36be4
Ship the RunStore contract as runnable checks
Alek99 Aug 18, 2026
f6b88bc
Add the reflex workflows CLI
Alek99 Aug 18, 2026
5f18842
Add a workflow observer hook
Alek99 Aug 18, 2026
ac6ade3
Fix three defects found by adversarial audit
Alek99 Aug 18, 2026
a7c0b15
Fix four defects a deeper audit reproduced
Alek99 Aug 18, 2026
68bc1d8
Run every workflow test against the durable store too
Alek99 Aug 18, 2026
ab9cecd
Fix six more audit findings
Alek99 Aug 18, 2026
ef18d09
Abandon a lease that cannot be renewed, and gate fan-out branches
Alek99 Aug 18, 2026
560c9e3
Bound SQLite contention so it cannot freeze the app
Alek99 Aug 18, 2026
5d3cb73
Run workflow attempts concurrently
Alek99 Aug 19, 2026
6716046
Race parallel branches with mode="first"
Alek99 Aug 19, 2026
386a5fc
Space a throttled backlog instead of bunching it
Alek99 Aug 19, 2026
5692517
Add a Postgres run store, and run the suite against it
Alek99 Aug 19, 2026
8940546
Approve from an email: signed links plus a per-attempt run context
Alek99 Aug 19, 2026
83a3e96
Record substeps with rx.step, and route steps to worker queues
Alek99 Aug 19, 2026
2f40a7e
Run SQLite store calls on a worker thread
Alek99 Aug 19, 2026
37892e8
Let policy keys reach into model payloads; let the harness start any …
Alek99 Aug 19, 2026
fed56ec
Add reflex workflows check, the generation-loop validator
Alek99 Aug 19, 2026
6c7d5f8
Close the Postgres test fixture's pool on the loop that opened it
Alek99 Aug 19, 2026
5c2de07
Never swallow a task's own cancellation while releasing a lease
Alek99 Aug 19, 2026
5b7c53a
Resolve the workflow store from the deployment's environment
Alek99 Aug 19, 2026
1f758a8
Prove the engine inside a real server with integration tests
Alek99 Aug 19, 2026
21a98b4
Resolve dotted check targets from the project root
Alek99 Aug 19, 2026
ef82d7f
Run the workflow integration tests in prod mode too
Alek99 Aug 19, 2026
fc0716f
Freeze the execution contract, and close the two gaps it exposed
Alek99 Aug 19, 2026
5085113
Add the operator actions the contract promises
Alek99 Aug 19, 2026
073968e
Add a headless worker: reflex workflows worker
Alek99 Aug 19, 2026
a2309de
Add a metrics observer for the numbers a deployment alerts on
Alek99 Aug 19, 2026
ef2113e
Never let a schedule cursor move backwards
Alek99 Aug 19, 2026
827f9a9
Tell a worker's operator why their workflows will not load
Alek99 Aug 19, 2026
4d46b23
State the one rule rx.step puts on your code
Alek99 Aug 19, 2026
eb8dd63
Make every terminal path deliver its arrival atomically
Alek99 Aug 19, 2026
3ed4b28
Pin two more contract clauses with conformance checks
Alek99 Aug 19, 2026
b78da78
Pin the compiler guards a generator hits first
Alek99 Aug 19, 2026
b785e3c
Fix force_complete and force_fail raising NameError from rx.workflows
Alek99 Aug 19, 2026
518004c
Make the type-only-import bug class impossible to ship again
Alek99 Aug 19, 2026
5554dd6
Have the worker name the workflows it cannot start
Alek99 Aug 19, 2026
c11823e
Refuse an approval token that can never expire
Alek99 Aug 19, 2026
60dd7ad
Refuse a webhook body that cannot fill the root's parameters
Alek99 Aug 19, 2026
6e987e5
Refuse run state that JSON cannot represent
Alek99 Aug 19, 2026
48cee24
Assert the scheduling predicates directly
Alek99 Aug 19, 2026
d925e85
Write down the runtime's lifecycle rules
Alek99 Aug 19, 2026
ee56d1d
Validate the instrument the whole suite measures with
Alek99 Aug 19, 2026
049941b
Add the skip operator action
Alek99 Aug 19, 2026
659446e
Enforce a singleton's limit inside the admitting transaction
Alek99 Aug 19, 2026
74e76d4
Walk the crash matrix as a conformance check
Alek99 Aug 19, 2026
30466f0
Add reflex workflows dev and a typed run handle
Alek99 Aug 19, 2026
44b3fc4
Scaffold a runnable workflow with reflex workflows init
Alek99 Aug 19, 2026
fadaaf8
Add an authenticated HTTP API for starting and reading runs
Alek99 Aug 19, 2026
03f1b20
Document tenancy and who runs the workers
Alek99 Aug 19, 2026
a4017df
Show what starts each workflow with reflex workflows triggers
Alek99 Aug 19, 2026
0d23a36
Cover the wait's crash and delivery-refusal semantics
Alek99 Aug 19, 2026
7f50286
workflows: add a preflight doctor for deployment configuration
Alek99 Aug 19, 2026
96ec413
workflows: make the dev loop show what a durable run is doing
Alek99 Aug 19, 2026
64746e9
workflows: report attempts an operator would recognize
Alek99 Aug 19, 2026
d9d000e
workflows: drain a stopping worker instead of dropping its attempts
Alek99 Aug 19, 2026
548ebbc
workflows: take the drain budget from the deployment
Alek99 Aug 19, 2026
2ae6773
workflows: let a process start runs without becoming a worker
Alek99 Aug 19, 2026
9d5b9f3
workflows: answer 'is this healthy' without opening the database
Alek99 Aug 19, 2026
c6216fa
workflows: make a process's counters scrapeable
Alek99 Aug 19, 2026
e421ef8
workflows: finish the operator actions on the command line
Alek99 Aug 19, 2026
752511b
workflows: stop retrying code bugs, and make a release's runs findable
Alek99 Aug 19, 2026
3eaa987
workflows: document the failures that are not crashes, and pin them
Alek99 Aug 19, 2026
9fa81ab
workflows: fix client isolation, store leaks, and admission binding
Alek99 Aug 19, 2026
f4c102e
workflows: hand join results over in declaration order
Alek99 Aug 19, 2026
ce4f51f
workflows: turn the two open report defects into executable specs
Alek99 Aug 19, 2026
1359a84
workflows: make one approval's choices mutually exclusive
Alek99 Aug 19, 2026
c234309
workflows: say what losing a race does not protect you from
Alek99 Aug 19, 2026
59c7b89
workflows: close the two gaps the second review found
Alek99 Aug 19, 2026
94152c9
workflows: stop a cancelled parent from cancelling its branches
Alek99 Aug 19, 2026
a82d099
workflows: pin the retry-loses-the-chain defect as a spec
Alek99 Aug 19, 2026
890b0ed
workflows: scope webhook dedupe keys to the root they start
Alek99 Aug 19, 2026
a3228a1
workflows: scope the legacy webhook key lookup to the same root
Alek99 Aug 19, 2026
7b25195
workflows: make start policies atomic across processes
Alek99 Aug 19, 2026
a188b42
workflows: retry and skip restore the chain the failure tombstoned
Alek99 Aug 19, 2026
d115684
workflows: answer SQLite scheduling from an index, not a Python loop
Alek99 Aug 19, 2026
3bcabd4
workflows: give webhook identity the shapes providers actually use
Alek99 Aug 19, 2026
fef3f88
workflows: close the review's operability batch
Alek99 Aug 19, 2026
10f08b1
workflows: accept GitHub's form-encoded webhook mode
Alek99 Aug 19, 2026
7130537
workflows: fix what the adversarial review of tonight's fixes found
Alek99 Aug 19, 2026
208b607
workflows: say that operator repair overrides start policies
Alek99 Aug 19, 2026
4b413ae
workflows: a duplicate admission must leave with zero side effects
Alek99 Aug 19, 2026
e67ee05
workflows: durations must be finite
Alek99 Aug 19, 2026
53b05fd
workflows: workers on the default clock derive time from the store
Alek99 Aug 20, 2026
7b6001e
workflows: fence run deadlines at the store, in both directions
Alek99 Aug 20, 2026
8757199
workflows: close the bounded time edges
Alek99 Aug 20, 2026
738e54b
workflows: refuse lossy run data, type-check the HTTP boundary
Alek99 Aug 20, 2026
5843481
workflows: branches close with their parent
Alek99 Aug 20, 2026
dc9c79a
workflows: operator-action helpers on the test harness
Alek99 Aug 20, 2026
0ce143c
workflows: say where release pinning belongs
Alek99 Aug 20, 2026
53779a3
workflows: kill a real worker at real boundaries
Alek99 Aug 20, 2026
e5e80ba
workflows: make the contract's vocabulary complete and self-checking
Alek99 Aug 20, 2026
399277b
workflows: typed run results, and run-id prefixes in the CLI
Alek99 Aug 20, 2026
9f02f27
workflows: an OpenTelemetry observer
Alek99 Aug 20, 2026
20273f6
workflows: audit composition against the graduation dimensions
Alek99 Aug 20, 2026
fab1232
workflows: stop reflex deploy misdirecting a workflow-only project
Alek99 Aug 20, 2026
c9d0948
workflows: three Postgres blockers from the review
Alek99 Aug 20, 2026
439c425
workflows: the rest of the review's findings
Alek99 Aug 20, 2026
45ba1c7
workflows: second review round
Alek99 Aug 20, 2026
be95a02
workflows: terminal transitions close completely, everywhere
Alek99 Aug 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .github/workflows/unit_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,22 @@ jobs:
ports:
# Maps port 6379 on service container to the host
- 6379:6379
# The workflow store conformance suite runs against every implementation
# it can reach. Without a server the Postgres rows silently skip, and a
# divergence that only Postgres has -- hand-written SQL, real row locks,
# real deadlock detection -- merges green.
postgres:
image: ${{ matrix.os == 'ubuntu-latest' && 'postgres:16-alpine' || '' }}
env:
POSTGRES_PASSWORD: workflow
POSTGRES_DB: workflow
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
Expand All @@ -66,6 +82,12 @@ jobs:
run: |
export PYTHONUNBUFFERED=1
uv run pytest tests/units --cov --no-cov-on-fail --cov-report=
- name: Run workflow tests against Postgres
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
export PYTHONUNBUFFERED=1
export REFLEX_TEST_POSTGRES=postgresql://postgres:workflow@localhost:5432/workflow
uv run pytest tests/units/workflow --no-cov -q
- name: Run unit tests w/ redis
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,7 @@ CLAUDE.local.md

# Backups written by scripts/delete_automated_releases.sh
automated-releases-backup-*.json

# Workflow run stores created by `reflex workflows` commands.
workflow.db
workflow.db-*
Loading