{"openapi":"3.1.0","info":{"title":"Copyroom","version":"0.1.0"},"servers":[{"url":"/"}],"paths":{"/":{"get":{"operationId":"landing","summary":"Agent-readable landing page","security":[],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/llms.txt":{"get":{"operationId":"llms","summary":"Compact agent instructions","security":[],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/openapi.json":{"get":{"operationId":"openapi","summary":"OpenAPI contract","security":[],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/help":{"get":{"operationId":"help","summary":"Machine-readable operation help","security":[],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/examples.json":{"get":{"operationId":"examples","summary":"Synthetic request examples","security":[],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/engagements":{"post":{"operationId":"createEngagement","summary":"Create a writing engagement","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StructuredBrief"},"example":{"instructions":"Describe the writing objective","knowledge":["Synthetic supporting fact"],"voice_samples":[],"constraints":["State a concrete length or policy constraint"],"desired_reader_effect":"Describe the intended effect","posture":"balanced","client_capabilities":{"polling":true,"structured_actions":true}}}}}}},"/api/v1/engagements/{id}":{"get":{"operationId":"getEngagement","summary":"Read an engagement","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/engagements/{id}/runs":{"post":{"operationId":"createRun","summary":"Create an engagement run","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartRun"},"example":{"brief_ref":"brief:durable-reference","profile_version_id":"active-profile-version-id","budget":{"max_calls":3,"max_drafts":3}}}}}}},"/api/v1/runs/{id}":{"get":{"operationId":"getRun","summary":"Read a run","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/actions":{"get":{"operationId":"listActions","summary":"List assigned actions","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/actions/{id}/{transition}":{"post":{"operationId":"respondToAction","summary":"Acknowledge, fulfill, decline, or cancel an action","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/evidence-batches":{"post":{"operationId":"submitEvidence","summary":"Submit provenance-rich evidence","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/evidence-batches/{id}":{"get":{"operationId":"getEvidenceBatch","summary":"Read a submitted evidence batch","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/evidence-items/{id}/review":{"post":{"operationId":"reviewEvidenceItem","summary":"Review evidence acceptance separately from authorship","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/engagements/{id}/resolve":{"post":{"operationId":"resolveEngagement","summary":"Return settled, rejected, or abandoned outcome","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Outcome"},"example":{"action_id":"return-final-copy-action-id","resolution":"settled","final_copy":"Exact synthetic copy accepted after local iteration.","draft_id":"optional-source-draft-id"}}}}}},"/api/v1/styles/{id}/coverage":{"get":{"operationId":"getStyleCoverage","summary":"Inspect eligible evidence coverage","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/styles/{id}/profile-candidates":{"post":{"operationId":"requestProfileCandidate","summary":"Explicitly compile an immutable candidate","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/learning/rules":{"get":{"operationId":"listLearningRules","summary":"List reviewable learning rules","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/outcomes/{id}/learning":{"post":{"operationId":"startOutcomeLearning","summary":"Derive reviewable learning from a settled outcome","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/learning/rules/{id}/review":{"post":{"operationId":"reviewLearningRule","summary":"Edit, scope, approve, or change a learning rule","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/learning/rules/{id}/replays":{"post":{"operationId":"recordLearningReplay","summary":"Attach a sealed evaluation replay to a rule","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/outcomes/{id}/delete-learning":{"post":{"operationId":"deleteOutcomeLearning","summary":"Remove outcome content from learning","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/profiles/{id}/activate":{"post":{"operationId":"activateProfile","summary":"Activate an owner-approved candidate after sealed replay","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/evaluations/{id}/open-sealed":{"post":{"operationId":"openSealedEvaluation","summary":"Start a frozen sealed evaluation within its cost budget","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/evaluations/{id}/review":{"get":{"operationId":"reviewDevelopmentEvaluation","summary":"Review one blinded development comparison","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/evaluations/{id}/judgments":{"post":{"operationId":"judgeDevelopmentEvaluation","summary":"Record a blinded development preference","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}},"/api/v1/evaluations/{id}/feedback":{"get":{"operationId":"reviewDevelopmentFeedback","summary":"Clarify ambiguous blinded development judgments","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}},"post":{"operationId":"recordDevelopmentFeedback","summary":"Record private owner feedback for a development judgment","security":[{"cloudflareAccess":[]}],"responses":{"200":{"description":"Success"},"4XX":{"description":"Actionable error envelope"}}}}},"components":{"securitySchemes":{"cloudflareAccess":{"type":"apiKey","in":"header","name":"CF-Access-Jwt-Assertion","description":"JWT injected by Cloudflare Access after browser or service-token authentication."}},"schemas":{"StructuredBrief":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"instructions":{"type":"string","minLength":1,"maxLength":20000},"knowledge":{"maxItems":100,"type":"array","items":{"type":"string","maxLength":20000}},"voice_samples":{"maxItems":100,"type":"array","items":{"type":"string","maxLength":20000}},"constraints":{"maxItems":50,"type":"array","items":{"type":"string","maxLength":2000}},"desired_reader_effect":{"type":"string","maxLength":2000},"posture":{"type":"string","enum":["fast","balanced","quality"]},"client_capabilities":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"boolean"}}},"required":["instructions","knowledge","voice_samples","constraints","desired_reader_effect","posture","client_capabilities"],"additionalProperties":false},"StartRun":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"brief_ref":{"type":"string","minLength":1},"profile_version_id":{"type":"string","minLength":1},"budget":{"type":"object","properties":{"max_calls":{"type":"integer","minimum":1,"maximum":6},"max_drafts":{"type":"integer","minimum":1,"maximum":6}},"required":["max_calls","max_drafts"],"additionalProperties":false}},"required":["brief_ref","profile_version_id","budget"],"additionalProperties":false},"Outcome":{"$schema":"http://json-schema.org/draft-07/schema#","oneOf":[{"type":"object","properties":{"action_id":{"type":"string","minLength":1},"resolution":{"type":"string","const":"settled"},"final_copy":{"type":"string","minLength":1},"draft_id":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["action_id","resolution","final_copy"],"additionalProperties":false},{"type":"object","properties":{"action_id":{"type":"string","minLength":1},"resolution":{"type":"string","const":"rejected"},"feedback":{"type":"string"}},"required":["action_id","resolution"],"additionalProperties":false},{"type":"object","properties":{"action_id":{"type":"string","minLength":1},"resolution":{"type":"string","const":"abandoned"},"reason":{"type":"string"}},"required":["action_id","resolution"],"additionalProperties":false}]}}}}