|
| 1 | +{ |
| 2 | + "manifest_version": 1, |
| 3 | + "description": "Parity tracking for cueapi-sdk against the hosted CueAPI API. Enumerates which API surfaces this SDK covers and which it doesn't, so drift becomes visible at audit time. Per the 3-layer parity discipline (PR template + this manifest + Backlog rows for each port).", |
| 4 | + "private_source_repo": "https://github.com/cueapi/cueapi", |
| 5 | + "private_source_paths": [ |
| 6 | + "app/routers/", |
| 7 | + "app/schemas/" |
| 8 | + ], |
| 9 | + "last_full_audit": "2026-05-04", |
| 10 | + "sdk_version_at_audit": "0.1.3", |
| 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 | + "audit_cadence": "Monthly full sweep. Per-PR diffs handled via the .github/pull_request_template.md `Parity Impact` section in the private repo.", |
| 13 | + |
| 14 | + "endpoints_covered": { |
| 15 | + "POST /v1/auth/register": {"sdk": "client.register (utility, not on a resource)"}, |
| 16 | + "POST /v1/cues": {"sdk": "client.cues.create"}, |
| 17 | + "GET /v1/cues": {"sdk": "client.cues.list"}, |
| 18 | + "GET /v1/cues/{id}": {"sdk": "client.cues.get"}, |
| 19 | + "PATCH /v1/cues/{id}": {"sdk": "client.cues.update"}, |
| 20 | + "DELETE /v1/cues/{id}": {"sdk": "client.cues.delete"}, |
| 21 | + "POST /v1/cues/{id} (pause)": {"sdk": "client.cues.pause"}, |
| 22 | + "POST /v1/cues/{id} (resume)": {"sdk": "client.cues.resume"}, |
| 23 | + "POST /v1/executions/{id}/outcome": {"sdk": "client.executions.report_outcome"}, |
| 24 | + "GET /v1/executions": {"sdk": "client.executions.list"}, |
| 25 | + "GET /v1/executions/{id}": {"sdk": "client.executions.get"}, |
| 26 | + "POST /v1/executions/{id}/heartbeat": {"sdk": "client.executions.heartbeat"}, |
| 27 | + "POST /v1/executions/{id}/verification-pending": {"sdk": "client.executions.mark_verification_pending"}, |
| 28 | + "POST /v1/executions/{id}/verify": {"sdk": "client.executions.mark_verified"} |
| 29 | + }, |
| 30 | + |
| 31 | + "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."}, |
| 42 | + "POST /v1/billing/checkout": {"blocker": "Hosted-only — wrap if/when hosted users need programmatic checkout."}, |
| 43 | + "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 | + } |
| 51 | + }, |
| 52 | + |
| 53 | + "model_drift": { |
| 54 | + "Cue": { |
| 55 | + "sdk_class": "cueapi.models.Cue", |
| 56 | + "covered_fields": [ |
| 57 | + "id", "name", "description", "status", "transport", "schedule", |
| 58 | + "callback", "payload", "retry", "next_run", "last_run", "run_count", |
| 59 | + "fired_count", "on_failure", "warning", "created_at", "updated_at" |
| 60 | + ], |
| 61 | + "missing_fields": [ |
| 62 | + "delivery", "alerts", "catch_up", "verification", "on_success_fire", |
| 63 | + "require_payload_override", "required_payload_keys", "stats" |
| 64 | + ], |
| 65 | + "missing_response_shape": "CueDetailResponse (cue + executions[] + execution_total/limit/offset)" |
| 66 | + }, |
| 67 | + "Execution": { |
| 68 | + "sdk_class": "no dedicated model; SDK returns dicts from executions.get/list", |
| 69 | + "needs_dedicated_class": true, |
| 70 | + "missing_fields": [ |
| 71 | + "payload (PR #589, just shipped)", |
| 72 | + "outcome", |
| 73 | + "outcome_state", |
| 74 | + "triggered_by", |
| 75 | + "evidence_external_id, evidence_result_url, evidence_result_type, evidence_summary, evidence_validation_state, evidence_assertions", |
| 76 | + "claimed_by_worker, claimed_at, last_heartbeat_at", |
| 77 | + "chain_parent_id, chain_depth" |
| 78 | + ] |
| 79 | + }, |
| 80 | + "Worker": { |
| 81 | + "sdk_class": "missing entirely", |
| 82 | + "missing_fields": ["worker_id", "user_id", "handlers", "last_heartbeat", "heartbeat_status (active/stale/dead)"] |
| 83 | + }, |
| 84 | + "Agent (messaging)": {"sdk_class": "missing entirely (Phase 12.1.5)"}, |
| 85 | + "Message (messaging)": {"sdk_class": "missing entirely (Phase 12.1.5)"} |
| 86 | + }, |
| 87 | + |
| 88 | + "ported_pr_history": [ |
| 89 | + "PR #589 (expose payload on GET /v1/executions): NOT YET PORTED — Backlog row 'Parity port: PR #589 → cueapi-python SDK' priority=now.", |
| 90 | + "PR #590 (require_payload_override + required_payload_keys + cue.fire enforcement): NOT YET PORTED — Backlog row 'Parity port: PR #590 → cueapi-python SDK' priority=now." |
| 91 | + ], |
| 92 | + |
| 93 | + "notes": "First seeded 2026-05-04 as Layer 2 of parity discipline (PR template + this manifest + Backlog rows). Schema may evolve based on what auditors actually need. The `endpoints_missing` and `model_drift` sections are deliberately verbose — they are the audit checklist for catching up the SDK to the hosted API." |
| 94 | +} |
0 commit comments