← Back to suites
contract-gate zero-budget semantic-index

Contract gate

Multi-actor, op envelope, lock, batch, and persistence contracts. This lane proves cross-client invariants and API/browser parity on the self-hosted runner.

Behaviours 0 Tests 49 Graph 50 nodes · 49 edges Runner corbet/unraid CircleCI browser_contracts Source qa/suites/contract-gate.yaml

Test witnesses

These tests belong to the suite. Missing implementation links stay visible until a code-backed graph claim records them.

TestStatusImplementationOpen
GET /api/keys returns key status shape for a workspace
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
GET /api/notes returns 404 for unknown workspace
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
GET returns { notes: string } for a workspace
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
POST /api/ai-usage records a usage entry
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
PUT /api/notes returns 400 when notes field is missing
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
PUT persists and GET retrieves the saved notes (round-trip)
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
PUT with workspace_id in body (no query param) also works
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
accepts a nanoid-style job_id without 400 integer-validation error
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
chain_overrides is present (not undefined) in every job seed object
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
each iceServer entry (if any) has a urls array
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 200 with address fields for a valid workspace (graceful no-key)
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 200 with an array for a valid workspace
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 200 with entries array for group=recent
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 200 with iceServers array
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 200 with stats array for group=day
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 200 with stats array for group=function
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 200 with stats array for group=provider
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 200 with summary counter shape
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 200 with { success: false } for an obviously invalid API key
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 400 when required fields are missing
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 400 when service and apiKey are both missing
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 400 when url parameter is missing
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 400 when workspace parameter is missing
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 404 for an unknown workspace
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns 404 when workspace_id does not exist
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns { exists: false } for a URL not in the workspace
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns { exists: false } for an unknown workspace (v1 permissive behavior)
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
returns { exists: true, title } for a URL that is in the workspace
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
tailored_cl is present (not undefined) in every job seed object
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
tailored_cv is present (not undefined) in every job seed object
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
when TURN not configured, returns available=false with empty iceServers
@cv/ui · playwright · api-smoke.spec.ts
catalogmissing implementation linkTest
REST writes commit to workspace_sub_doc before best-effort realtime fanout
@cv/ui · playwright · canonical-collaboration.spec.ts
catalogmissing implementation linkTest
preserve-style job patches do not clear workspace jobs subdoc fields
@cv/ui · playwright · canonical-collaboration.spec.ts
catalogmissing implementation linkTest
server-side op path rejects secret fanout and strict pipeline maxCount violations
@cv/ui · playwright · canonical-collaboration.spec.ts
catalogmissing implementation linkTest
L1: Concurrent evaluate requests for the same job: at least one wins the lock; neither returns 5xx; any locked response has locked=true (not an error)
@cv/ui · playwright · compute-lock-cycle.spec.ts
catalogmissing implementation linkTest
L2: After first evaluate completes, lock is released and a subsequent POST succeeds (not locked)
@cv/ui · playwright · compute-lock-cycle.spec.ts
catalogmissing implementation linkTest
L3: TTL cleanup — after lock is released, acquire always wins (expired lock cleanup path is exercised)
@cv/ui · playwright · compute-lock-cycle.spec.ts
catalogmissing implementation linkTest
cv_profile + cl_profile batch advances both clocks together
@cv/ui · playwright · multi-actor-primitives.spec.ts
catalogmissing implementation linkTest
edit lands in IDB and the y-indexeddb store retains the bytes after reload
@cv/ui · playwright · multi-actor-primitives.spec.ts
catalogmissing implementation linkTest
pipeline-class write is dropped over a human title; force=true overrides
@cv/ui · playwright · multi-actor-primitives.spec.ts
catalogmissing implementation linkTest
pipeline-class write with structured actor_id shows up in the cell-origins projection
@cv/ui · playwright · multi-actor-primitives.spec.ts
catalogmissing implementation linkTest
process-request enqueue fires SSE consumer in the browser within ~5s
@cv/ui · playwright · multi-actor-primitives.spec.ts
catalogmissing implementation linkTest
second POST with same opId returns reason=duplicate and does not bump clock
@cv/ui · playwright · multi-actor-primitives.spec.ts
catalogmissing implementation linkTest
solo human on /dashboard stays WS-idle, /cvl opens WS, return to /dashboard closes WS
@cv/ui · playwright · multi-actor-primitives.spec.ts
catalogmissing implementation linkTest
two contexts typing into the same bullet merge both keystroke sets
@cv/ui · playwright · multi-actor-primitives.spec.ts
catalogmissing implementation linkTest
two actors update status_id simultaneously; all converge to one value
@cv/ui · playwright · multi-actor/concurrent-status-updates-converge.spec.ts
catalogmissing implementation linkTest
Tab A creates a job; Tab B sees the same durable state
@cv/ui · playwright · multi-actor/two-tab-job-create-converges.spec.ts
catalogmissing implementation linkTest
a cross-sub-doc batch commits all sub-ops or none
@cv/ui · playwright · persistence/batch-atomicity.spec.ts
catalogmissing implementation linkTest
fresh workspace job.create writes via /ops survive a hard browser reload
@cv/ui · playwright · persistence/reload-survival.spec.ts
catalogmissing implementation linkTest