| #63 |
FTX-63: MCP tool schema + parity fixes
proposed_action/context as type:object (no JSON-string double-encode); hitl_act_on_task gains reason...
|
closed |
high |
2026-07-23 15:08 |
- |
|
| #62 |
FTX-62: MCP Streamable HTTP transport + per-request auth
StreamableHTTPSessionManager(stateless=True) mounted at /mcp with auth ASGI wrapper (Bearer -> authe...
|
closed |
critical |
2026-07-23 15:08 |
- |
|
| #61 |
FTX-61: Audit coverage sweep
Every UB-AUD-2 event type written: decision lifecycle, actions, delegation changes, escalation hops,...
|
closed |
medium |
2026-07-23 15:08 |
- |
|
| #60 |
FTX-60: /readyz + Prometheus metrics
/readyz probes DB+Redis+circuit states (UB-REST-1); /metrics: request rate/errors/queue depths/webho...
|
closed |
medium |
2026-07-23 15:08 |
- |
|
| #59 |
FTX-59: Cursor pagination + audit filters + missing routes
Cursor pagination default 25 max 100 (UB-API-7) on inbox/audit/policies/delegations/webhooks; /v1/au...
|
closed |
medium |
2026-07-23 15:08 |
- |
|
| #58 |
FTX-58: Terminal outcome envelope (UB-OUT-1)
build_outcome_envelope(): decision_id/tenant/status/policy/context_hash/outcome{result,reasons,justi...
|
closed |
high |
2026-07-23 15:08 |
- |
|
| #57 |
FTX-57: Router/package split
Decompose 987-line app/main.py into app/{config,db,errors,middleware,obs}.py + routers/ + domain/ + ...
|
open |
high |
2026-07-23 15:08 |
- |
|
| #56 |
FTX-56: SLA/escalation worker loop
Tasks past sla_deadline FOR UPDATE SKIP LOCKED; escalation path entries remind/notify_manager/reassi...
|
closed |
high |
2026-07-23 15:08 |
- |
|
| #55 |
FTX-55: Mail drainer with mint-at-send
Tokens minted at send time in drainer - outbox rows carry NO token material (UB-TOK-4); skip obsolet...
|
closed |
critical |
2026-07-23 15:08 |
- |
|
| #54 |
FTX-54: Durable webhook outbox + drainer + subscriptions CRUD
enqueue_webhook writes webhook_deliveries in caller transaction (replaces fire-and-forget asyncio.cr...
|
closed |
critical |
2026-07-23 15:08 |
- |
|
| #53 |
FTX-53: Expiry worker loop
ACTIVE-status decisions past expires_at batch FOR UPDATE SKIP LOCKED -> terminalize(timed_out) or po...
|
closed |
high |
2026-07-23 15:08 |
- |
|
| #52 |
FTX-52: Worker runtime process + futex-worker.service
python -m app.workers.main: N independent asyncio loops (expiry/sla/mail/webhook/token_cleanup/runfl...
|
closed |
critical |
2026-07-23 15:08 |
- |
|
| #51 |
FTX-51: SLA deadlines at creation + delegation caps
tasks.sla_deadline set from step.sla ISO-8601 at instantiation (currently never set -> SLA dead code...
|
closed |
high |
2026-07-23 15:08 |
- |
|
| #50 |
FTX-50: Policy versioning + snapshot + validation
policies version/status(draft|active|disabled)/key columns; decision stores policy_snapshot JSONB at...
|
closed |
high |
2026-07-23 15:08 |
- |
|
| #49 |
FTX-49: Separation of Duties full enforcement
Assignment-time filter + action-time mutual-exclusion vs prior actors from actions table; EV-TSK-2 n...
|
closed |
high |
2026-07-23 15:08 |
- |
|
| #48 |
FTX-48: Idempotency upsert
UNIQUE(tenant_id, idempotency_key) migration (current index non-unique) + INSERT ON CONFLICT DO NOTH...
|
closed |
high |
2026-07-23 15:08 |
- |
|
| #47 |
FTX-47: Multi-stage progression
decisions.current_stage_index + instantiate_stage() in same transaction as stage completion; termina...
|
closed |
critical |
2026-07-23 15:08 |
- |
|
| #46 |
FTX-46: apply_action rewrite with row locking
Single transaction: lock decision FOR UPDATE then task FOR UPDATE (global lock order); guard non-ter...
|
closed |
critical |
2026-07-23 15:08 |
- |
|
| #45 |
FTX-45: Quorum engine fixes
n_of_m reads n_required (schema field, currently reads nonexistent step.n so n=1 always); only persi...
|
closed |
critical |
2026-07-23 15:08 |
- |
|
| #44 |
FTX-44: Decision/task state machine + transition guards
domain/statemachine.py DECISION_TRANSITIONS/TASK_TRANSITIONS/TERMINAL/ACTIVE (UB-SM-1/2); guard_tran...
|
closed |
critical |
2026-07-23 15:08 |
- |
|