|
6 | 6 | "app/routers/", |
7 | 7 | "app/schemas/" |
8 | 8 | ], |
9 | | - "last_full_audit": "2026-05-07", |
10 | | - "sdk_version_at_audit": "0.2.x", |
| 9 | + "last_full_audit": "2026-05-12", |
| 10 | + "sdk_version_at_audit": "0.2.x (head; pre-0.3.0 cut — heavy PR-1b + body-verify + inline_body activity 2026-05-09 → 2026-05-12)", |
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 | + "POST /v1/cues/{id}/fire": {"sdk": "client.cues.fire (PR #23; send_at + exit_criteria + idempotency_key shipped in #33 on 2026-05-09)"}, |
24 | 24 | "POST /v1/executions/{id}/outcome": {"sdk": "client.executions.report_outcome"}, |
25 | 25 | "GET /v1/executions": {"sdk": "client.executions.list"}, |
26 | 26 | "GET /v1/executions/{id}": {"sdk": "client.executions.get"}, |
|
42 | 42 | "GET /v1/agents/{ref}/webhook-secret": {"sdk": "client.agents.get_webhook_secret (PR #27)"}, |
43 | 43 | "GET /v1/agents/{ref}/inbox": {"sdk": "client.agents.inbox (PR #27)"}, |
44 | 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)"}, |
| 45 | + "GET /v1/agents/roster": {"sdk": "client.agents.roster (PR #35; cueapi #630 parity, shipped 2026-05-09)"}, |
| 46 | + "GET /v1/agents/{ref}/presence": {"sdk": "client.agents.presence (PR #35; cueapi #662 parity, shipped 2026-05-09)"}, |
| 47 | + "POST /v1/messages": {"sdk": "client.messages.send (PR #28; send_at shipped in #34 on 2026-05-09; auto_verify body-verify Phase 2 shipped in #39 + #40 on 2026-05-11 — defense against caller-side shell expansion, cueapi/cueapi#795 + #798 parity)"}, |
48 | 48 | "GET /v1/messages/{id}": {"sdk": "client.messages.get (PR #28)"}, |
49 | 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)"} |
| 50 | + "POST /v1/messages/{id}/ack": {"sdk": "client.messages.ack (PR #28)"}, |
| 51 | + "POST /v1/agents/{ref}/subscriptions": {"sdk": "client.agents.subscriptions_create (PR #38, PR-1b event-emit primitive, shipped 2026-05-11; inline_body kwarg shipped in PR #42 on 2026-05-12, cueapi/cueapi#791 / Item 1 parity)"}, |
| 52 | + "GET /v1/agents/{ref}/subscriptions": {"sdk": "client.agents.subscriptions_list (PR #38, shipped 2026-05-11)"}, |
| 53 | + "DELETE /v1/agents/{ref}/subscriptions/{sub_id}": {"sdk": "client.agents.subscriptions_delete (PR #38, shipped 2026-05-11)"}, |
| 54 | + "GET /v1/agents/{ref}/events": {"sdk": "client.agents.events_pull (PR #38, shipped 2026-05-11)"} |
51 | 55 | }, |
52 | 56 |
|
53 | 57 | "endpoints_missing": { |
|
62 | 66 | "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 | 67 | }, |
64 | 68 |
|
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" |
| 69 | + "ports_shipped_2026_05_08_to_2026_05_12": { |
| 70 | + "PR #30 (closed superseded by #33)": "client.cues.fire(send_at) — closed unmerged in favor of #33's broader scope", |
| 71 | + "PR #31 (merged 2026-05-11)": "Execution + Worker + Agent + Message additive Pydantic model classes (drift backfill)", |
| 72 | + "PR #33 (merged 2026-05-09)": "client.cues.fire(send_at, exit_criteria, idempotency_key) — covers cueapi #618 + #632 + #683", |
| 73 | + "PR #34 (merged 2026-05-09)": "client.messages.send(send_at) — covers cueapi #623", |
| 74 | + "PR #35 (merged 2026-05-09)": "client.agents.roster() + client.agents.presence() — covers cueapi #630 + #662", |
| 75 | + "PR #38 (merged 2026-05-11)": "client.agents.subscriptions_create/list/delete + events_pull — PR-1b event-emit primitive, covers cueapi/cueapi #731 (substrate ports as cueapi-core #71)", |
| 76 | + "PR #39 (merged 2026-05-11)": "client.messages.send(auto_verify=True default) — Phase 2 body-verify defense-in-depth, covers cueapi/cueapi #795", |
| 77 | + "PR #40 (merged 2026-05-11)": "messages.send body_received-is-dict isinstance fix — cueapi/cueapi #797 dict-shape window", |
| 78 | + "PR #42 (merged 2026-05-12)": "client.agents.subscriptions_create(inline_body=...) — covers cueapi/cueapi #791 (Item 1)" |
| 79 | + }, |
| 80 | + |
| 81 | + "ports_in_flight_2026_05_12": { |
| 82 | + "comment": "Empty as of audit time. Future port candidates (already filed as Backlog rows): cueapi-action Phase 2 verify wiring (might already be in by #14/#15 ports); cueapi-mcp body-verify Phase 2 just shipped as cueapi-mcp#35." |
70 | 83 | }, |
71 | 84 |
|
72 | 85 | "model_drift": { |
|
0 commit comments