Skip to content

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:

bash scripts/verify-operational-todos.sh

The repository-wide release gate runs those tests, metadata validation, linting, typing, package builds, Compose validation, documentation builds, and coverage floors:

./scripts/verify.sh

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.