|
6 | 6 | "app/routers/", |
7 | 7 | "app/schemas/" |
8 | 8 | ], |
9 | | - "last_full_audit": "2026-05-04", |
10 | | - "sdk_version_at_audit": "0.1.3", |
| 9 | + "last_full_audit": "2026-05-07", |
| 10 | + "sdk_version_at_audit": "0.2.x", |
11 | 11 | "audit_methodology": "Walk every endpoint in private cueapi/app/routers/ and check coverage in cueapi/resources/. For each covered endpoint, walk the corresponding schemas/*.py to verify field-level coverage in cueapi/models/. Drift goes in `missing_endpoints` or `missing_fields` keyed by endpoint.", |
12 | 12 | "audit_cadence": "Monthly full sweep. Per-PR diffs handled via the .github/pull_request_template.md `Parity Impact` section in the private repo.", |
13 | 13 |
|
|
20 | 20 | "DELETE /v1/cues/{id}": {"sdk": "client.cues.delete"}, |
21 | 21 | "POST /v1/cues/{id} (pause)": {"sdk": "client.cues.pause"}, |
22 | 22 | "POST /v1/cues/{id} (resume)": {"sdk": "client.cues.resume"}, |
| 23 | + "POST /v1/cues/{id}/fire": {"sdk": "client.cues.fire (PR #23; in-flight kwargs send_at + exit_criteria + idempotency_key in #33)"}, |
23 | 24 | "POST /v1/executions/{id}/outcome": {"sdk": "client.executions.report_outcome"}, |
24 | 25 | "GET /v1/executions": {"sdk": "client.executions.list"}, |
25 | 26 | "GET /v1/executions/{id}": {"sdk": "client.executions.get"}, |
26 | 27 | "POST /v1/executions/{id}/heartbeat": {"sdk": "client.executions.heartbeat"}, |
27 | 28 | "POST /v1/executions/{id}/verification-pending": {"sdk": "client.executions.mark_verification_pending"}, |
28 | | - "POST /v1/executions/{id}/verify": {"sdk": "client.executions.mark_verified"} |
| 29 | + "POST /v1/executions/{id}/verify": {"sdk": "client.executions.mark_verified"}, |
| 30 | + "POST /v1/executions/{id}/replay": {"sdk": "client.executions.replay (PR #25)"}, |
| 31 | + "GET /v1/executions/claimable": {"sdk": "client.executions.list_claimable (PR #23)"}, |
| 32 | + "POST /v1/executions/{id}/claim": {"sdk": "client.executions.claim (PR #23)"}, |
| 33 | + "POST /v1/executions/claim": {"sdk": "client.executions.claim_next (PR #23)"}, |
| 34 | + "GET /v1/workers": {"sdk": "client.workers.list (PR #26)"}, |
| 35 | + "DELETE /v1/workers/{id}": {"sdk": "client.workers.delete (PR #26)"}, |
| 36 | + "GET /v1/usage": {"sdk": "client.usage.get (PR #26)"}, |
| 37 | + "POST /v1/agents": {"sdk": "client.agents.create (PR #27)"}, |
| 38 | + "GET /v1/agents": {"sdk": "client.agents.list (PR #27)"}, |
| 39 | + "GET /v1/agents/{ref}": {"sdk": "client.agents.get (PR #27)"}, |
| 40 | + "PATCH /v1/agents/{ref}": {"sdk": "client.agents.update (PR #27)"}, |
| 41 | + "DELETE /v1/agents/{ref}": {"sdk": "client.agents.delete (PR #27)"}, |
| 42 | + "GET /v1/agents/{ref}/webhook-secret": {"sdk": "client.agents.get_webhook_secret (PR #27)"}, |
| 43 | + "GET /v1/agents/{ref}/inbox": {"sdk": "client.agents.inbox (PR #27)"}, |
| 44 | + "GET /v1/agents/{ref}/sent": {"sdk": "client.agents.sent (PR #27)"}, |
| 45 | + "GET /v1/agents/roster": {"sdk": "client.agents.roster (in-flight PR #35; cueapi #630 parity)"}, |
| 46 | + "GET /v1/agents/{ref}/presence": {"sdk": "client.agents.presence (in-flight PR #35; cueapi #662 parity)"}, |
| 47 | + "POST /v1/messages": {"sdk": "client.messages.send (PR #28; in-flight send_at kwarg in #34)"}, |
| 48 | + "GET /v1/messages/{id}": {"sdk": "client.messages.get (PR #28)"}, |
| 49 | + "POST /v1/messages/{id}/read": {"sdk": "client.messages.mark_read (PR #28)"}, |
| 50 | + "POST /v1/messages/{id}/ack": {"sdk": "client.messages.ack (PR #28)"} |
29 | 51 | }, |
30 | 52 |
|
31 | 53 | "endpoints_missing": { |
32 | | - "POST /v1/cues/{id}/fire": { |
33 | | - "blocker": "Real ergonomic gap. Team-comm convention requires payload_override per fire; SDK users currently fall back to raw httpx.", |
34 | | - "tracking": "Backlog row: priority=now after the audit ships. Should pair with the PR #590 require_payload_override port since cue-fire is the primary surface for that enforcement." |
35 | | - }, |
36 | | - "POST /v1/executions/{id}/replay": {"blocker": "Used for retry-from-failure flows; not in any current SDK release."}, |
37 | | - "GET /v1/executions/claimable": {"blocker": "Worker-pull endpoint; some SDK users want to write Python workers directly without using cueapi-worker."}, |
38 | | - "POST /v1/executions/{id}/claim": {"blocker": "Same as above — worker-pull surface missing."}, |
39 | | - "POST /v1/worker/heartbeat": {"blocker": "Worker registration endpoint; same justification."}, |
40 | | - "GET /v1/workers": {"blocker": "List workers + heartbeat status; useful for fleet visibility."}, |
41 | | - "GET /v1/usage": {"blocker": "Plan, cue count, execution usage, rate limit info. Currently SDK users hit /v1/auth/me only."}, |
| 54 | + "POST /v1/worker/heartbeat": {"blocker": "Worker registration endpoint; users typically run cueapi-worker package which handles this internally."}, |
42 | 55 | "POST /v1/billing/checkout": {"blocker": "Hosted-only — wrap if/when hosted users need programmatic checkout."}, |
43 | 56 | "POST /v1/billing/portal": {"blocker": "Hosted-only."}, |
44 | | - "POST /v1/auth/key/regenerate": {"blocker": "Risky destructive op; intentionally not surfaced. Re-evaluate."}, |
45 | | - "GET /v1/auth/webhook-secret": {"blocker": "Webhook-secret retrieval — SDK users running their own webhook servers want this."}, |
46 | | - "POST /v1/auth/webhook-secret/regenerate": {"blocker": "Destructive; re-evaluate."}, |
47 | | - "Messaging primitive (all of /v1/agents, /v1/messages, /v1/agents/{id}/inbox)": { |
48 | | - "blocker": "Phase 12.1.5 messaging primitive is on prod but not yet exposed in the SDK. Significant new surface — agent identity, send_message, inbox poll, idempotency-keyed sends, reply threading.", |
49 | | - "tracking": "Major SDK extension. Should land before push delivery (v1.5) goes wide." |
50 | | - } |
| 57 | + "POST /v1/auth/key/regenerate": {"blocker": "Risky destructive op; intentionally not surfaced."}, |
| 58 | + "GET /v1/auth/webhook-secret": {"blocker": "Webhook-secret retrieval — could surface if SDK users want to verify signatures programmatically. Re-evaluate."}, |
| 59 | + "POST /v1/auth/webhook-secret/regenerate": {"blocker": "Destructive; intentionally not surfaced."}, |
| 60 | + "POST /v1/agents/{ref}/webhook-secret/regenerate": {"blocker": "Destructive; needs --confirm-destructive pattern. Tracked on Backlog (Drift-audit deferred 2026-05-07)."}, |
| 61 | + "DELETE /v1/messages bulk (cueapi #650)": {"blocker": "Server-side shipped; not yet in cueapi-cli. SDK can port directly. Tracked on Backlog (Drift-audit deferred 2026-05-07)."}, |
| 62 | + "POST /v1/executions/{id}/live-claim (cueapi #664)": {"blocker": "P0 Live-claim attestation endpoint. Handler-runtime concern, not SDK control-plane. Re-evaluate if SDK users build live-attached handlers in Python."} |
| 63 | + }, |
| 64 | + |
| 65 | + "in_flight_ports_2026_05_07": { |
| 66 | + "PR #33 (open)": "client.cues.fire(send_at, exit_criteria, idempotency_key) — covers cueapi #618 + #632 + #683", |
| 67 | + "PR #34 (open)": "client.messages.send(send_at) — covers cueapi #623", |
| 68 | + "PR #35 (open)": "client.agents.roster() + client.agents.presence() — covers cueapi #630 + #662", |
| 69 | + "PR #30 (open, lane-flagged with cueapi-main)": "client.cues.fire(send_at) — narrower scope of #33" |
51 | 70 | }, |
52 | 71 |
|
53 | 72 | "model_drift": { |
|
0 commit comments