Reduced the webhook route to validation and incoming-event persistence; permission checks and command parsing now run asynchronously in receive order.
Reworked the worker into control and single-concurrency jobs queues, persisting JobStarted before workflow effects and preventing replay after interruption.
Routed workflow progress, workflow/session links, and final bodies through JobReporter events instead of unrestricted job updates.
docker compose config — not run successfully: Docker is unavailable on this host (docker: command not found).
Created by Agent CI.
Closes #1
## Implementation
Implemented the explicit persisted webhook state machine.
- Added immutable typed events, `JobState`, pure `next_state()`, transition validation, and pure comment rendering.
- Added migration `003_state_machine.sql` with durable receive sequencing, event inbox, listener outbox, no job version column, and legacy backfills.
- Added transactional `receive()`/`evolve()`, duplicate delivery handling, atomic workflow creation/linking, timestamp ownership, atomic listener claims, and receive-order FIFO blocking.
- Reduced the webhook route to validation and incoming-event persistence; permission checks and command parsing now run asynchronously in receive order.
- Reworked the worker into `control` and single-concurrency `jobs` queues, persisting `JobStarted` before workflow effects and preventing replay after interruption.
- Routed workflow progress, workflow/session links, and final bodies through `JobReporter` events instead of unrestricted job updates.
- Added comment marker recovery, durable cleanup retries, strict idempotent OpenCode abort handling, restart recovery, tests, and README documentation.
No commit or Git metadata changes were made.
## Validation
- `uv sync` — succeeded, but the host-provided `UV_NO_DEV=1` removed development tools.
- `env -u UV_NO_DEV uv sync` — succeeded; installed the 10 development packages required for validation.
- `uv run ruff check .` — passed: `All checks passed!`
- `uv run pyright` — passed: `0 errors, 0 warnings, 0 informations`
- `uv run pytest` — passed: `91 passed in 1.99s`
- `git diff --check` — passed with no output.
- `docker compose config` — not run successfully: Docker is unavailable on this host (`docker: command not found`).
_Created by Agent CI._
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #1
Implementation
Implemented the explicit persisted webhook state machine.
JobState, purenext_state(), transition validation, and pure comment rendering.003_state_machine.sqlwith durable receive sequencing, event inbox, listener outbox, no job version column, and legacy backfills.receive()/evolve(), duplicate delivery handling, atomic workflow creation/linking, timestamp ownership, atomic listener claims, and receive-order FIFO blocking.controland single-concurrencyjobsqueues, persistingJobStartedbefore workflow effects and preventing replay after interruption.JobReporterevents instead of unrestricted job updates.No commit or Git metadata changes were made.
Validation
uv sync— succeeded, but the host-providedUV_NO_DEV=1removed development tools.env -u UV_NO_DEV uv sync— succeeded; installed the 10 development packages required for validation.uv run ruff check .— passed:All checks passed!uv run pyright— passed:0 errors, 0 warnings, 0 informationsuv run pytest— passed:91 passed in 1.99sgit diff --check— passed with no output.docker compose config— not run successfully: Docker is unavailable on this host (docker: command not found).Created by Agent CI.