Operational TODO validation¶
The eight deployment issues recorded in the repository-root TODO.yml were implemented
for 0.7.0 and re-audited as release blockers for 0.7.1. Each item now carries
validated_in: 0.7.1 and one or more pytest node IDs in regression_tests.
Acceptance matrix¶
| ID | Verified behavior | Regression evidence |
|---|---|---|
ASYNC-001 |
A slow webhook returns HTTP 200 in under 50 ms, the real ingress → event → rule → action pipeline finishes afterward, background exceptions become failed receipts, and /v1/events/publish remains synchronous. |
test_async_ingress_todos_are_end_to_end_and_publish_stays_synchronous; test_receipt_retention_never_evicts_active_ingress |
ASYNC-002 |
/v1/webhooks/* defaults to async, /v1/ingress/* defaults to sync, and callers can override the mode with ?async=true|false. |
test_async_ingress_todos_are_end_to_end_and_publish_stays_synchronous plus daemon route contract tests |
ASYNC-003 |
Start, completion, and failure logs include receipt identity, payload kind, event source/kind, matched rules, and action statuses. | test_async_ingress_todos_are_end_to_end_and_publish_stays_synchronous |
OPS-001 |
Startup emits one warning for an enabled telegram.updates schedule without an explicit offset or projection database. |
test_telegram_poll_schedule_warns_at_startup_without_offset_persistence |
OPS-002 |
sqlite:///absolute/path.db resolves to and opens that exact path; ambiguous SQLite URI spellings are rejected. |
test_absolute_sqlite_uri_opens_the_requested_database; test_resolve_database_path_rejects_ambiguous_sqlite_uri |
OPS-003 |
${VAR} and ${VAR:-default} are present in CLI help and expand before config validation. |
test_cli_help_documents_environment_expansion; test_runtime_file_config_expands_env_variables |
OPS-004 |
Replacing the mounted config activates a new rule without restart; malformed replacement config is logged and leaves the active rules unchanged. | test_config_file_changes_reload_live_and_invalid_config_is_atomic |
OPS-005 |
The real Uvicorn daemon is started on a Unix socket and reached through call-baxter health; admin authentication succeeds through CALL_BAXTER_API_KEY, while an unauthenticated client gets an HTTP error. |
test_cli_health_reaches_authenticated_daemon_over_real_uds |
Running the acceptance checks¶
Run the focused tests:
(cd packages/call-baxter && \
uv run --extra dev python -m pytest -q tests/test_operational_todo_acceptance.py)
(cd packages/tg-agent-cli && \
uv run --extra dev python -m pytest -q tests/test_cli_settings.py)
Validate that every TODO remains closed and references an existing pytest function:
The repository-wide release gate runs those tests, metadata validation, linting, typing, package builds, Compose validation, documentation builds, and coverage floors:
Scope and durability notes¶
Async receipts are intentionally process-local diagnostic records. They are not a durable queue and do not survive daemon restart. The acceptance requirement is that acknowledged work remains tracked until it completes or fails in the active process; active receipts are therefore excluded from retention trimming.
Automatic reload watches the configured YAML file. Rule-only edits should be followed by
touching or atomically replacing that config file, or by calling POST /v1/reload.