{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/generated/mcp-tools-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI MCP tool inventory v1","protocol_version":"2026-07-28","tools":[{"name":"detect_text","description":"Detect AI-written text with Pangram 4.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","minLength":1},"max_billable_units":{"type":"integer","minimum":1},"save":{"type":"boolean","default":false},"public_link":{"type":"boolean","default":false},"include_input":{"type":"boolean","default":false}},"required":["text","max_billable_units"],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"Analysis":{"type":"object","properties":{"id":{"$ref":"#/$defs/AnalysisId"},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"input":{"description":"The canonical input descriptor. Omitted only on a resumed-observation\nread whose remote operation has not yet reached a terminal document\n(contracts.md 4.6); locally submitted commands always carry one.","anyOf":[{"$ref":"#/$defs/AnalysisInput"}]},"checks":{"$ref":"#/$defs/OrderedChecks"},"save_state":{"$ref":"#/$defs/SaveState"},"provenance":{"$ref":"#/$defs/Provenance"},"retry_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"rerun_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"created_at":{"$ref":"#/$defs/UtcTimestamp"},"updated_at":{"$ref":"#/$defs/UtcTimestamp"},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["id","status","submission_outcome","checks","save_state","provenance","created_at","updated_at"],"not":{"required":["retry_of","rerun_of"]},"allOf":[{"type":"object"},{"allOf":[{"if":{"properties":{"status":{"const":"running"}},"required":["status"]},"then":{"properties":{"checks":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}}}},{"if":{"properties":{"status":{"const":"queued"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}]}}}},{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["succeeded"]}}}}]}}}},{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["failed"]}}}}]}}}},{"if":{"properties":{"status":{"const":"partial"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"succeeded"}},"required":["status"]}},{"contains":{"properties":{"status":{"const":"failed"}},"required":["status"]}}]}}}}]},{"if":{"properties":{"submission_outcome":{"const":"not_submitted"}},"required":["submission_outcome"]},"then":{"properties":{"checks":{"not":{"contains":{"properties":{"upstream":{"type":"object","required":["task_id"]}},"required":["upstream"]}}},"provenance":{"not":{"anyOf":[{"required":["upstream_task_ids"]},{"required":["upstream_bulk_id"]},{"required":["submitted_at"]},{"required":["completed_at"]}]}}}}}]},"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"SubmissionOutcome":{"type":"string","enum":["not_submitted","accepted","terminal","acceptance_unknown"]},"AnalysisInput":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"}},"$ref":"#/$defs/TextInput","required":["type"]},{"type":"object","properties":{"type":{"type":"string","const":"file"}},"$ref":"#/$defs/FileInput","required":["type"]}]},"TextOrigin":{"oneOf":[{"type":"string","enum":["literal","stdin","file"]},{"description":"The input of a remotely authored operation the client observes by\nexplicit upstream ID (contracts.md 4.6). Valid only on resumed\nreads; never produced by a locally submitted command.","type":"string","const":"unknown"}]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"TextInput":{"type":"object","properties":{"origin":{"$ref":"#/$defs/TextOrigin"},"name":{"type":["string"]},"sha256":{"$ref":"#/$defs/Sha256Hash"},"byte_count":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"text":{"type":["string"]}},"required":["origin","sha256","byte_count","word_count"]},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"FileInput":{"type":"object","properties":{"filename":{"$ref":"#/$defs/NonEmptyString"},"media_type":{"$ref":"#/$defs/NonEmptyString"},"sha256":{"$ref":"#/$defs/Sha256Hash"},"size_bytes":{"type":"integer","format":"uint64","minimum":0},"path":{"type":["string"]},"extracted_text":{"type":["string"]}},"required":["filename","media_type","sha256","size_bytes"]},"OrderedChecks":{"description":"One or two unique checks in canonical display and serialization order.","type":"array","items":{"$ref":"#/$defs/Check"},"minItems":1,"maxItems":2,"allOf":[{"if":{"minItems":2},"then":{"prefixItems":[{"properties":{"kind":{"const":"ai_detection"}},"required":["kind"]},{"properties":{"kind":{"const":"plagiarism"}},"required":["kind"]}]}}]},"Check":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ai_detection"}},"$ref":"#/$defs/CheckState","required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","const":"plagiarism"}},"$ref":"#/$defs/CheckState2","required":["kind"]}]},"UpstreamIdentity":{"type":"object","properties":{"task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"last_stage":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}}},"UpstreamTaskId":{"type":"string","minLength":1},"AiDetectionResult":{"type":"object","properties":{"classification":{"$ref":"#/$defs/AiClassification"},"headline":{"type":"string"},"prediction":{"type":"string"},"fraction_ai":{"$ref":"#/$defs/Fraction"},"fraction_ai_assisted":{"$ref":"#/$defs/Fraction"},"fraction_human":{"$ref":"#/$defs/Fraction"},"num_ai_segments":{"type":"integer","format":"uint64","minimum":0},"num_ai_assisted_segments":{"type":"integer","format":"uint64","minimum":0},"num_human_segments":{"type":"integer","format":"uint64","minimum":0},"segments":{"type":"array","items":{"$ref":"#/$defs/Segment"}},"dashboard_link":{"type":["string"],"format":"uri"}},"required":["classification","headline","prediction","fraction_ai","fraction_ai_assisted","fraction_human","num_ai_segments","num_ai_assisted_segments","num_human_segments","segments"]},"AiClassification":{"type":"string","enum":["ai","human","mixed"]},"Fraction":{"description":"A finite value from 0.0 through 1.0.","type":"number","format":"double","minimum":0,"maximum":1},"Segment":{"type":"object","properties":{"text":{"type":"string"},"label":{"$ref":"#/$defs/NonEmptyString"},"ai_assistance_score":{"$ref":"#/$defs/Fraction"},"confidence":{"$ref":"#/$defs/Confidence"},"start_index":{"type":"integer","format":"uint64","minimum":0},"end_index":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"token_length":{"type":"integer","format":"uint64","minimum":0},"humanizer_score":{"description":"Pangram's per-segment estimate that a humanizer modified the text.","anyOf":[{"$ref":"#/$defs/Fraction"}]},"is_humanized":{"description":"Pangram's thresholded humanizer decision, preserved without local derivation.","type":["boolean"]}},"required":["text","label","ai_assistance_score","confidence","start_index","end_index","word_count","token_length"]},"Confidence":{"type":"string","enum":["high","medium","low"]},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"CheckState":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/AiDetectionResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"PlagiarismResult":{"type":"object","properties":{"plagiarism_detected":{"type":"boolean"},"total_sentences":{"type":"integer","format":"uint64","minimum":0},"plagiarized_sentence_count":{"type":"integer","format":"uint64","minimum":0},"percent_plagiarized":{"$ref":"#/$defs/Percentage"},"matches":{"type":"array","items":{"$ref":"#/$defs/PlagiarismMatch"}}},"required":["plagiarism_detected","total_sentences","plagiarized_sentence_count","percent_plagiarized","matches"]},"Percentage":{"description":"A finite percentage from 0.0 through 100.0.","type":"number","format":"double","minimum":0,"maximum":100},"PlagiarismMatch":{"type":"object","properties":{"source_url":{"type":"string"},"matched_text":{"type":"string"},"similarity_score":{"$ref":"#/$defs/Fraction"}},"required":["source_url","matched_text","similarity_score"]},"CheckState2":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/PlagiarismResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"SaveState":{"type":"string","enum":["ephemeral","saved_manual","saved_history"]},"Provenance":{"type":"object","properties":{"provider":{"$ref":"#/$defs/Provider"},"upstream_version":{"type":["string"]},"upstream_task_ids":{"type":["array"],"uniqueItems":true,"items":{"$ref":"#/$defs/UpstreamTaskId"}},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"submitted_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["provider"]},"Provider":{"type":"string","enum":["pangram"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"detect"},"data":{"oneOf":[{"$ref":"#/$defs/Analysis"},{"type":"array","minItems":1,"items":{"$ref":"#/$defs/Analysis"}}]},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"detect"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"check_plagiarism","description":"Check text for plagiarism against online sources.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","minLength":1},"max_billable_units":{"type":"integer","minimum":1},"save":{"type":"boolean","default":false},"include_input":{"type":"boolean","default":false}},"required":["text","max_billable_units"],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"Analysis":{"type":"object","properties":{"id":{"$ref":"#/$defs/AnalysisId"},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"input":{"description":"The canonical input descriptor. Omitted only on a resumed-observation\nread whose remote operation has not yet reached a terminal document\n(contracts.md 4.6); locally submitted commands always carry one.","anyOf":[{"$ref":"#/$defs/AnalysisInput"}]},"checks":{"$ref":"#/$defs/OrderedChecks"},"save_state":{"$ref":"#/$defs/SaveState"},"provenance":{"$ref":"#/$defs/Provenance"},"retry_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"rerun_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"created_at":{"$ref":"#/$defs/UtcTimestamp"},"updated_at":{"$ref":"#/$defs/UtcTimestamp"},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["id","status","submission_outcome","checks","save_state","provenance","created_at","updated_at"],"not":{"required":["retry_of","rerun_of"]},"allOf":[{"type":"object"},{"allOf":[{"if":{"properties":{"status":{"const":"running"}},"required":["status"]},"then":{"properties":{"checks":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}}}},{"if":{"properties":{"status":{"const":"queued"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}]}}}},{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["succeeded"]}}}}]}}}},{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["failed"]}}}}]}}}},{"if":{"properties":{"status":{"const":"partial"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"succeeded"}},"required":["status"]}},{"contains":{"properties":{"status":{"const":"failed"}},"required":["status"]}}]}}}}]},{"if":{"properties":{"submission_outcome":{"const":"not_submitted"}},"required":["submission_outcome"]},"then":{"properties":{"checks":{"not":{"contains":{"properties":{"upstream":{"type":"object","required":["task_id"]}},"required":["upstream"]}}},"provenance":{"not":{"anyOf":[{"required":["upstream_task_ids"]},{"required":["upstream_bulk_id"]},{"required":["submitted_at"]},{"required":["completed_at"]}]}}}}}]},"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"SubmissionOutcome":{"type":"string","enum":["not_submitted","accepted","terminal","acceptance_unknown"]},"AnalysisInput":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"}},"$ref":"#/$defs/TextInput","required":["type"]},{"type":"object","properties":{"type":{"type":"string","const":"file"}},"$ref":"#/$defs/FileInput","required":["type"]}]},"TextOrigin":{"oneOf":[{"type":"string","enum":["literal","stdin","file"]},{"description":"The input of a remotely authored operation the client observes by\nexplicit upstream ID (contracts.md 4.6). Valid only on resumed\nreads; never produced by a locally submitted command.","type":"string","const":"unknown"}]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"TextInput":{"type":"object","properties":{"origin":{"$ref":"#/$defs/TextOrigin"},"name":{"type":["string"]},"sha256":{"$ref":"#/$defs/Sha256Hash"},"byte_count":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"text":{"type":["string"]}},"required":["origin","sha256","byte_count","word_count"]},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"FileInput":{"type":"object","properties":{"filename":{"$ref":"#/$defs/NonEmptyString"},"media_type":{"$ref":"#/$defs/NonEmptyString"},"sha256":{"$ref":"#/$defs/Sha256Hash"},"size_bytes":{"type":"integer","format":"uint64","minimum":0},"path":{"type":["string"]},"extracted_text":{"type":["string"]}},"required":["filename","media_type","sha256","size_bytes"]},"OrderedChecks":{"description":"One or two unique checks in canonical display and serialization order.","type":"array","items":{"$ref":"#/$defs/Check"},"minItems":1,"maxItems":2,"allOf":[{"if":{"minItems":2},"then":{"prefixItems":[{"properties":{"kind":{"const":"ai_detection"}},"required":["kind"]},{"properties":{"kind":{"const":"plagiarism"}},"required":["kind"]}]}}]},"Check":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ai_detection"}},"$ref":"#/$defs/CheckState","required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","const":"plagiarism"}},"$ref":"#/$defs/CheckState2","required":["kind"]}]},"UpstreamIdentity":{"type":"object","properties":{"task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"last_stage":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}}},"UpstreamTaskId":{"type":"string","minLength":1},"AiDetectionResult":{"type":"object","properties":{"classification":{"$ref":"#/$defs/AiClassification"},"headline":{"type":"string"},"prediction":{"type":"string"},"fraction_ai":{"$ref":"#/$defs/Fraction"},"fraction_ai_assisted":{"$ref":"#/$defs/Fraction"},"fraction_human":{"$ref":"#/$defs/Fraction"},"num_ai_segments":{"type":"integer","format":"uint64","minimum":0},"num_ai_assisted_segments":{"type":"integer","format":"uint64","minimum":0},"num_human_segments":{"type":"integer","format":"uint64","minimum":0},"segments":{"type":"array","items":{"$ref":"#/$defs/Segment"}},"dashboard_link":{"type":["string"],"format":"uri"}},"required":["classification","headline","prediction","fraction_ai","fraction_ai_assisted","fraction_human","num_ai_segments","num_ai_assisted_segments","num_human_segments","segments"]},"AiClassification":{"type":"string","enum":["ai","human","mixed"]},"Fraction":{"description":"A finite value from 0.0 through 1.0.","type":"number","format":"double","minimum":0,"maximum":1},"Segment":{"type":"object","properties":{"text":{"type":"string"},"label":{"$ref":"#/$defs/NonEmptyString"},"ai_assistance_score":{"$ref":"#/$defs/Fraction"},"confidence":{"$ref":"#/$defs/Confidence"},"start_index":{"type":"integer","format":"uint64","minimum":0},"end_index":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"token_length":{"type":"integer","format":"uint64","minimum":0},"humanizer_score":{"description":"Pangram's per-segment estimate that a humanizer modified the text.","anyOf":[{"$ref":"#/$defs/Fraction"}]},"is_humanized":{"description":"Pangram's thresholded humanizer decision, preserved without local derivation.","type":["boolean"]}},"required":["text","label","ai_assistance_score","confidence","start_index","end_index","word_count","token_length"]},"Confidence":{"type":"string","enum":["high","medium","low"]},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"CheckState":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/AiDetectionResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"PlagiarismResult":{"type":"object","properties":{"plagiarism_detected":{"type":"boolean"},"total_sentences":{"type":"integer","format":"uint64","minimum":0},"plagiarized_sentence_count":{"type":"integer","format":"uint64","minimum":0},"percent_plagiarized":{"$ref":"#/$defs/Percentage"},"matches":{"type":"array","items":{"$ref":"#/$defs/PlagiarismMatch"}}},"required":["plagiarism_detected","total_sentences","plagiarized_sentence_count","percent_plagiarized","matches"]},"Percentage":{"description":"A finite percentage from 0.0 through 100.0.","type":"number","format":"double","minimum":0,"maximum":100},"PlagiarismMatch":{"type":"object","properties":{"source_url":{"type":"string"},"matched_text":{"type":"string"},"similarity_score":{"$ref":"#/$defs/Fraction"}},"required":["source_url","matched_text","similarity_score"]},"CheckState2":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/PlagiarismResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"SaveState":{"type":"string","enum":["ephemeral","saved_manual","saved_history"]},"Provenance":{"type":"object","properties":{"provider":{"$ref":"#/$defs/Provider"},"upstream_version":{"type":["string"]},"upstream_task_ids":{"type":["array"],"uniqueItems":true,"items":{"$ref":"#/$defs/UpstreamTaskId"}},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"submitted_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["provider"]},"Provider":{"type":"string","enum":["pangram"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"plagiarism"},"data":{"oneOf":[{"$ref":"#/$defs/Analysis"},{"type":"array","minItems":1,"items":{"$ref":"#/$defs/Analysis"}}]},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"plagiarism"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"analyze_text","description":"Run Pangram 4 AI detection and plagiarism checks on the same text.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","minLength":1},"max_billable_units":{"type":"integer","minimum":1},"save":{"type":"boolean","default":false},"public_link":{"type":"boolean","default":false},"include_input":{"type":"boolean","default":false}},"required":["text","max_billable_units"],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"Analysis":{"type":"object","properties":{"id":{"$ref":"#/$defs/AnalysisId"},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"input":{"description":"The canonical input descriptor. Omitted only on a resumed-observation\nread whose remote operation has not yet reached a terminal document\n(contracts.md 4.6); locally submitted commands always carry one.","anyOf":[{"$ref":"#/$defs/AnalysisInput"}]},"checks":{"$ref":"#/$defs/OrderedChecks"},"save_state":{"$ref":"#/$defs/SaveState"},"provenance":{"$ref":"#/$defs/Provenance"},"retry_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"rerun_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"created_at":{"$ref":"#/$defs/UtcTimestamp"},"updated_at":{"$ref":"#/$defs/UtcTimestamp"},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["id","status","submission_outcome","checks","save_state","provenance","created_at","updated_at"],"not":{"required":["retry_of","rerun_of"]},"allOf":[{"type":"object"},{"allOf":[{"if":{"properties":{"status":{"const":"running"}},"required":["status"]},"then":{"properties":{"checks":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}}}},{"if":{"properties":{"status":{"const":"queued"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}]}}}},{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["succeeded"]}}}}]}}}},{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["failed"]}}}}]}}}},{"if":{"properties":{"status":{"const":"partial"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"succeeded"}},"required":["status"]}},{"contains":{"properties":{"status":{"const":"failed"}},"required":["status"]}}]}}}}]},{"if":{"properties":{"submission_outcome":{"const":"not_submitted"}},"required":["submission_outcome"]},"then":{"properties":{"checks":{"not":{"contains":{"properties":{"upstream":{"type":"object","required":["task_id"]}},"required":["upstream"]}}},"provenance":{"not":{"anyOf":[{"required":["upstream_task_ids"]},{"required":["upstream_bulk_id"]},{"required":["submitted_at"]},{"required":["completed_at"]}]}}}}}]},"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"SubmissionOutcome":{"type":"string","enum":["not_submitted","accepted","terminal","acceptance_unknown"]},"AnalysisInput":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"}},"$ref":"#/$defs/TextInput","required":["type"]},{"type":"object","properties":{"type":{"type":"string","const":"file"}},"$ref":"#/$defs/FileInput","required":["type"]}]},"TextOrigin":{"oneOf":[{"type":"string","enum":["literal","stdin","file"]},{"description":"The input of a remotely authored operation the client observes by\nexplicit upstream ID (contracts.md 4.6). Valid only on resumed\nreads; never produced by a locally submitted command.","type":"string","const":"unknown"}]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"TextInput":{"type":"object","properties":{"origin":{"$ref":"#/$defs/TextOrigin"},"name":{"type":["string"]},"sha256":{"$ref":"#/$defs/Sha256Hash"},"byte_count":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"text":{"type":["string"]}},"required":["origin","sha256","byte_count","word_count"]},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"FileInput":{"type":"object","properties":{"filename":{"$ref":"#/$defs/NonEmptyString"},"media_type":{"$ref":"#/$defs/NonEmptyString"},"sha256":{"$ref":"#/$defs/Sha256Hash"},"size_bytes":{"type":"integer","format":"uint64","minimum":0},"path":{"type":["string"]},"extracted_text":{"type":["string"]}},"required":["filename","media_type","sha256","size_bytes"]},"OrderedChecks":{"description":"One or two unique checks in canonical display and serialization order.","type":"array","items":{"$ref":"#/$defs/Check"},"minItems":1,"maxItems":2,"allOf":[{"if":{"minItems":2},"then":{"prefixItems":[{"properties":{"kind":{"const":"ai_detection"}},"required":["kind"]},{"properties":{"kind":{"const":"plagiarism"}},"required":["kind"]}]}}]},"Check":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ai_detection"}},"$ref":"#/$defs/CheckState","required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","const":"plagiarism"}},"$ref":"#/$defs/CheckState2","required":["kind"]}]},"UpstreamIdentity":{"type":"object","properties":{"task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"last_stage":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}}},"UpstreamTaskId":{"type":"string","minLength":1},"AiDetectionResult":{"type":"object","properties":{"classification":{"$ref":"#/$defs/AiClassification"},"headline":{"type":"string"},"prediction":{"type":"string"},"fraction_ai":{"$ref":"#/$defs/Fraction"},"fraction_ai_assisted":{"$ref":"#/$defs/Fraction"},"fraction_human":{"$ref":"#/$defs/Fraction"},"num_ai_segments":{"type":"integer","format":"uint64","minimum":0},"num_ai_assisted_segments":{"type":"integer","format":"uint64","minimum":0},"num_human_segments":{"type":"integer","format":"uint64","minimum":0},"segments":{"type":"array","items":{"$ref":"#/$defs/Segment"}},"dashboard_link":{"type":["string"],"format":"uri"}},"required":["classification","headline","prediction","fraction_ai","fraction_ai_assisted","fraction_human","num_ai_segments","num_ai_assisted_segments","num_human_segments","segments"]},"AiClassification":{"type":"string","enum":["ai","human","mixed"]},"Fraction":{"description":"A finite value from 0.0 through 1.0.","type":"number","format":"double","minimum":0,"maximum":1},"Segment":{"type":"object","properties":{"text":{"type":"string"},"label":{"$ref":"#/$defs/NonEmptyString"},"ai_assistance_score":{"$ref":"#/$defs/Fraction"},"confidence":{"$ref":"#/$defs/Confidence"},"start_index":{"type":"integer","format":"uint64","minimum":0},"end_index":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"token_length":{"type":"integer","format":"uint64","minimum":0},"humanizer_score":{"description":"Pangram's per-segment estimate that a humanizer modified the text.","anyOf":[{"$ref":"#/$defs/Fraction"}]},"is_humanized":{"description":"Pangram's thresholded humanizer decision, preserved without local derivation.","type":["boolean"]}},"required":["text","label","ai_assistance_score","confidence","start_index","end_index","word_count","token_length"]},"Confidence":{"type":"string","enum":["high","medium","low"]},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"CheckState":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/AiDetectionResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"PlagiarismResult":{"type":"object","properties":{"plagiarism_detected":{"type":"boolean"},"total_sentences":{"type":"integer","format":"uint64","minimum":0},"plagiarized_sentence_count":{"type":"integer","format":"uint64","minimum":0},"percent_plagiarized":{"$ref":"#/$defs/Percentage"},"matches":{"type":"array","items":{"$ref":"#/$defs/PlagiarismMatch"}}},"required":["plagiarism_detected","total_sentences","plagiarized_sentence_count","percent_plagiarized","matches"]},"Percentage":{"description":"A finite percentage from 0.0 through 100.0.","type":"number","format":"double","minimum":0,"maximum":100},"PlagiarismMatch":{"type":"object","properties":{"source_url":{"type":"string"},"matched_text":{"type":"string"},"similarity_score":{"$ref":"#/$defs/Fraction"}},"required":["source_url","matched_text","similarity_score"]},"CheckState2":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/PlagiarismResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"SaveState":{"type":"string","enum":["ephemeral","saved_manual","saved_history"]},"Provenance":{"type":"object","properties":{"provider":{"$ref":"#/$defs/Provider"},"upstream_version":{"type":["string"]},"upstream_task_ids":{"type":["array"],"uniqueItems":true,"items":{"$ref":"#/$defs/UpstreamTaskId"}},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"submitted_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["provider"]},"Provider":{"type":"string","enum":["pangram"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"analyze"},"data":{"oneOf":[{"$ref":"#/$defs/Analysis"},{"type":"array","minItems":1,"items":{"$ref":"#/$defs/Analysis"}}]},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"analyze"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"get_task","description":"Get one Pangram task without waiting.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"analysis_id":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"upstream_task_id":{"type":"string","minLength":1}},"required":[],"additionalProperties":false,"allOf":[{"oneOf":[{"required":["analysis_id"],"not":{"required":["upstream_task_id"]}},{"required":["upstream_task_id"],"not":{"required":["analysis_id"]}}]}]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"Analysis":{"type":"object","properties":{"id":{"$ref":"#/$defs/AnalysisId"},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"input":{"description":"The canonical input descriptor. Omitted only on a resumed-observation\nread whose remote operation has not yet reached a terminal document\n(contracts.md 4.6); locally submitted commands always carry one.","anyOf":[{"$ref":"#/$defs/AnalysisInput"}]},"checks":{"$ref":"#/$defs/OrderedChecks"},"save_state":{"$ref":"#/$defs/SaveState"},"provenance":{"$ref":"#/$defs/Provenance"},"retry_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"rerun_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"created_at":{"$ref":"#/$defs/UtcTimestamp"},"updated_at":{"$ref":"#/$defs/UtcTimestamp"},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["id","status","submission_outcome","checks","save_state","provenance","created_at","updated_at"],"not":{"required":["retry_of","rerun_of"]},"allOf":[{"type":"object"},{"allOf":[{"if":{"properties":{"status":{"const":"running"}},"required":["status"]},"then":{"properties":{"checks":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}}}},{"if":{"properties":{"status":{"const":"queued"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}]}}}},{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["succeeded"]}}}}]}}}},{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["failed"]}}}}]}}}},{"if":{"properties":{"status":{"const":"partial"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"succeeded"}},"required":["status"]}},{"contains":{"properties":{"status":{"const":"failed"}},"required":["status"]}}]}}}}]},{"if":{"properties":{"submission_outcome":{"const":"not_submitted"}},"required":["submission_outcome"]},"then":{"properties":{"checks":{"not":{"contains":{"properties":{"upstream":{"type":"object","required":["task_id"]}},"required":["upstream"]}}},"provenance":{"not":{"anyOf":[{"required":["upstream_task_ids"]},{"required":["upstream_bulk_id"]},{"required":["submitted_at"]},{"required":["completed_at"]}]}}}}}]},"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"SubmissionOutcome":{"type":"string","enum":["not_submitted","accepted","terminal","acceptance_unknown"]},"AnalysisInput":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"}},"$ref":"#/$defs/TextInput","required":["type"]},{"type":"object","properties":{"type":{"type":"string","const":"file"}},"$ref":"#/$defs/FileInput","required":["type"]}]},"TextOrigin":{"oneOf":[{"type":"string","enum":["literal","stdin","file"]},{"description":"The input of a remotely authored operation the client observes by\nexplicit upstream ID (contracts.md 4.6). Valid only on resumed\nreads; never produced by a locally submitted command.","type":"string","const":"unknown"}]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"TextInput":{"type":"object","properties":{"origin":{"$ref":"#/$defs/TextOrigin"},"name":{"type":["string"]},"sha256":{"$ref":"#/$defs/Sha256Hash"},"byte_count":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"text":{"type":["string"]}},"required":["origin","sha256","byte_count","word_count"]},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"FileInput":{"type":"object","properties":{"filename":{"$ref":"#/$defs/NonEmptyString"},"media_type":{"$ref":"#/$defs/NonEmptyString"},"sha256":{"$ref":"#/$defs/Sha256Hash"},"size_bytes":{"type":"integer","format":"uint64","minimum":0},"path":{"type":["string"]},"extracted_text":{"type":["string"]}},"required":["filename","media_type","sha256","size_bytes"]},"OrderedChecks":{"description":"One or two unique checks in canonical display and serialization order.","type":"array","items":{"$ref":"#/$defs/Check"},"minItems":1,"maxItems":2,"allOf":[{"if":{"minItems":2},"then":{"prefixItems":[{"properties":{"kind":{"const":"ai_detection"}},"required":["kind"]},{"properties":{"kind":{"const":"plagiarism"}},"required":["kind"]}]}}]},"Check":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ai_detection"}},"$ref":"#/$defs/CheckState","required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","const":"plagiarism"}},"$ref":"#/$defs/CheckState2","required":["kind"]}]},"UpstreamIdentity":{"type":"object","properties":{"task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"last_stage":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}}},"UpstreamTaskId":{"type":"string","minLength":1},"AiDetectionResult":{"type":"object","properties":{"classification":{"$ref":"#/$defs/AiClassification"},"headline":{"type":"string"},"prediction":{"type":"string"},"fraction_ai":{"$ref":"#/$defs/Fraction"},"fraction_ai_assisted":{"$ref":"#/$defs/Fraction"},"fraction_human":{"$ref":"#/$defs/Fraction"},"num_ai_segments":{"type":"integer","format":"uint64","minimum":0},"num_ai_assisted_segments":{"type":"integer","format":"uint64","minimum":0},"num_human_segments":{"type":"integer","format":"uint64","minimum":0},"segments":{"type":"array","items":{"$ref":"#/$defs/Segment"}},"dashboard_link":{"type":["string"],"format":"uri"}},"required":["classification","headline","prediction","fraction_ai","fraction_ai_assisted","fraction_human","num_ai_segments","num_ai_assisted_segments","num_human_segments","segments"]},"AiClassification":{"type":"string","enum":["ai","human","mixed"]},"Fraction":{"description":"A finite value from 0.0 through 1.0.","type":"number","format":"double","minimum":0,"maximum":1},"Segment":{"type":"object","properties":{"text":{"type":"string"},"label":{"$ref":"#/$defs/NonEmptyString"},"ai_assistance_score":{"$ref":"#/$defs/Fraction"},"confidence":{"$ref":"#/$defs/Confidence"},"start_index":{"type":"integer","format":"uint64","minimum":0},"end_index":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"token_length":{"type":"integer","format":"uint64","minimum":0},"humanizer_score":{"description":"Pangram's per-segment estimate that a humanizer modified the text.","anyOf":[{"$ref":"#/$defs/Fraction"}]},"is_humanized":{"description":"Pangram's thresholded humanizer decision, preserved without local derivation.","type":["boolean"]}},"required":["text","label","ai_assistance_score","confidence","start_index","end_index","word_count","token_length"]},"Confidence":{"type":"string","enum":["high","medium","low"]},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"CheckState":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/AiDetectionResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"PlagiarismResult":{"type":"object","properties":{"plagiarism_detected":{"type":"boolean"},"total_sentences":{"type":"integer","format":"uint64","minimum":0},"plagiarized_sentence_count":{"type":"integer","format":"uint64","minimum":0},"percent_plagiarized":{"$ref":"#/$defs/Percentage"},"matches":{"type":"array","items":{"$ref":"#/$defs/PlagiarismMatch"}}},"required":["plagiarism_detected","total_sentences","plagiarized_sentence_count","percent_plagiarized","matches"]},"Percentage":{"description":"A finite percentage from 0.0 through 100.0.","type":"number","format":"double","minimum":0,"maximum":100},"PlagiarismMatch":{"type":"object","properties":{"source_url":{"type":"string"},"matched_text":{"type":"string"},"similarity_score":{"$ref":"#/$defs/Fraction"}},"required":["source_url","matched_text","similarity_score"]},"CheckState2":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/PlagiarismResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"SaveState":{"type":"string","enum":["ephemeral","saved_manual","saved_history"]},"Provenance":{"type":"object","properties":{"provider":{"$ref":"#/$defs/Provider"},"upstream_version":{"type":["string"]},"upstream_task_ids":{"type":["array"],"uniqueItems":true,"items":{"$ref":"#/$defs/UpstreamTaskId"}},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"submitted_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["provider"]},"Provider":{"type":"string","enum":["pangram"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"task_status"},"data":{"$ref":"#/$defs/Analysis"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"task_status"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"wait_task","description":"Wait for one Pangram task to reach a terminal state.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"analysis_id":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"upstream_task_id":{"type":"string","minLength":1},"timeout_ms":{"type":"integer","minimum":1}},"required":[],"additionalProperties":false,"allOf":[{"oneOf":[{"required":["analysis_id"],"not":{"required":["upstream_task_id"]}},{"required":["upstream_task_id"],"not":{"required":["analysis_id"]}}]}]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"Analysis":{"type":"object","properties":{"id":{"$ref":"#/$defs/AnalysisId"},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"input":{"description":"The canonical input descriptor. Omitted only on a resumed-observation\nread whose remote operation has not yet reached a terminal document\n(contracts.md 4.6); locally submitted commands always carry one.","anyOf":[{"$ref":"#/$defs/AnalysisInput"}]},"checks":{"$ref":"#/$defs/OrderedChecks"},"save_state":{"$ref":"#/$defs/SaveState"},"provenance":{"$ref":"#/$defs/Provenance"},"retry_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"rerun_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"created_at":{"$ref":"#/$defs/UtcTimestamp"},"updated_at":{"$ref":"#/$defs/UtcTimestamp"},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["id","status","submission_outcome","checks","save_state","provenance","created_at","updated_at"],"not":{"required":["retry_of","rerun_of"]},"allOf":[{"type":"object"},{"allOf":[{"if":{"properties":{"status":{"const":"running"}},"required":["status"]},"then":{"properties":{"checks":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}}}},{"if":{"properties":{"status":{"const":"queued"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}]}}}},{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["succeeded"]}}}}]}}}},{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["failed"]}}}}]}}}},{"if":{"properties":{"status":{"const":"partial"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"succeeded"}},"required":["status"]}},{"contains":{"properties":{"status":{"const":"failed"}},"required":["status"]}}]}}}}]},{"if":{"properties":{"submission_outcome":{"const":"not_submitted"}},"required":["submission_outcome"]},"then":{"properties":{"checks":{"not":{"contains":{"properties":{"upstream":{"type":"object","required":["task_id"]}},"required":["upstream"]}}},"provenance":{"not":{"anyOf":[{"required":["upstream_task_ids"]},{"required":["upstream_bulk_id"]},{"required":["submitted_at"]},{"required":["completed_at"]}]}}}}}]},"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"SubmissionOutcome":{"type":"string","enum":["not_submitted","accepted","terminal","acceptance_unknown"]},"AnalysisInput":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"}},"$ref":"#/$defs/TextInput","required":["type"]},{"type":"object","properties":{"type":{"type":"string","const":"file"}},"$ref":"#/$defs/FileInput","required":["type"]}]},"TextOrigin":{"oneOf":[{"type":"string","enum":["literal","stdin","file"]},{"description":"The input of a remotely authored operation the client observes by\nexplicit upstream ID (contracts.md 4.6). Valid only on resumed\nreads; never produced by a locally submitted command.","type":"string","const":"unknown"}]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"TextInput":{"type":"object","properties":{"origin":{"$ref":"#/$defs/TextOrigin"},"name":{"type":["string"]},"sha256":{"$ref":"#/$defs/Sha256Hash"},"byte_count":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"text":{"type":["string"]}},"required":["origin","sha256","byte_count","word_count"]},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"FileInput":{"type":"object","properties":{"filename":{"$ref":"#/$defs/NonEmptyString"},"media_type":{"$ref":"#/$defs/NonEmptyString"},"sha256":{"$ref":"#/$defs/Sha256Hash"},"size_bytes":{"type":"integer","format":"uint64","minimum":0},"path":{"type":["string"]},"extracted_text":{"type":["string"]}},"required":["filename","media_type","sha256","size_bytes"]},"OrderedChecks":{"description":"One or two unique checks in canonical display and serialization order.","type":"array","items":{"$ref":"#/$defs/Check"},"minItems":1,"maxItems":2,"allOf":[{"if":{"minItems":2},"then":{"prefixItems":[{"properties":{"kind":{"const":"ai_detection"}},"required":["kind"]},{"properties":{"kind":{"const":"plagiarism"}},"required":["kind"]}]}}]},"Check":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ai_detection"}},"$ref":"#/$defs/CheckState","required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","const":"plagiarism"}},"$ref":"#/$defs/CheckState2","required":["kind"]}]},"UpstreamIdentity":{"type":"object","properties":{"task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"last_stage":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}}},"UpstreamTaskId":{"type":"string","minLength":1},"AiDetectionResult":{"type":"object","properties":{"classification":{"$ref":"#/$defs/AiClassification"},"headline":{"type":"string"},"prediction":{"type":"string"},"fraction_ai":{"$ref":"#/$defs/Fraction"},"fraction_ai_assisted":{"$ref":"#/$defs/Fraction"},"fraction_human":{"$ref":"#/$defs/Fraction"},"num_ai_segments":{"type":"integer","format":"uint64","minimum":0},"num_ai_assisted_segments":{"type":"integer","format":"uint64","minimum":0},"num_human_segments":{"type":"integer","format":"uint64","minimum":0},"segments":{"type":"array","items":{"$ref":"#/$defs/Segment"}},"dashboard_link":{"type":["string"],"format":"uri"}},"required":["classification","headline","prediction","fraction_ai","fraction_ai_assisted","fraction_human","num_ai_segments","num_ai_assisted_segments","num_human_segments","segments"]},"AiClassification":{"type":"string","enum":["ai","human","mixed"]},"Fraction":{"description":"A finite value from 0.0 through 1.0.","type":"number","format":"double","minimum":0,"maximum":1},"Segment":{"type":"object","properties":{"text":{"type":"string"},"label":{"$ref":"#/$defs/NonEmptyString"},"ai_assistance_score":{"$ref":"#/$defs/Fraction"},"confidence":{"$ref":"#/$defs/Confidence"},"start_index":{"type":"integer","format":"uint64","minimum":0},"end_index":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"token_length":{"type":"integer","format":"uint64","minimum":0},"humanizer_score":{"description":"Pangram's per-segment estimate that a humanizer modified the text.","anyOf":[{"$ref":"#/$defs/Fraction"}]},"is_humanized":{"description":"Pangram's thresholded humanizer decision, preserved without local derivation.","type":["boolean"]}},"required":["text","label","ai_assistance_score","confidence","start_index","end_index","word_count","token_length"]},"Confidence":{"type":"string","enum":["high","medium","low"]},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"CheckState":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/AiDetectionResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"PlagiarismResult":{"type":"object","properties":{"plagiarism_detected":{"type":"boolean"},"total_sentences":{"type":"integer","format":"uint64","minimum":0},"plagiarized_sentence_count":{"type":"integer","format":"uint64","minimum":0},"percent_plagiarized":{"$ref":"#/$defs/Percentage"},"matches":{"type":"array","items":{"$ref":"#/$defs/PlagiarismMatch"}}},"required":["plagiarism_detected","total_sentences","plagiarized_sentence_count","percent_plagiarized","matches"]},"Percentage":{"description":"A finite percentage from 0.0 through 100.0.","type":"number","format":"double","minimum":0,"maximum":100},"PlagiarismMatch":{"type":"object","properties":{"source_url":{"type":"string"},"matched_text":{"type":"string"},"similarity_score":{"$ref":"#/$defs/Fraction"}},"required":["source_url","matched_text","similarity_score"]},"CheckState2":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/PlagiarismResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"SaveState":{"type":"string","enum":["ephemeral","saved_manual","saved_history"]},"Provenance":{"type":"object","properties":{"provider":{"$ref":"#/$defs/Provider"},"upstream_version":{"type":["string"]},"upstream_task_ids":{"type":["array"],"uniqueItems":true,"items":{"$ref":"#/$defs/UpstreamTaskId"}},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"submitted_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["provider"]},"Provider":{"type":"string","enum":["pangram"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"task_wait"},"data":{"$ref":"#/$defs/Analysis"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"task_wait"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"submit_bulk","description":"Submit inline items or one approved JSONL file to Pangram 4.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"items":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"text":{"type":"string","minLength":1}},"required":["text"],"additionalProperties":false}},"jsonl_path":{"type":"string","minLength":1},"max_billable_units":{"type":"integer","minimum":1,"maximum":1000},"save":{"type":"boolean","default":false}},"required":["max_billable_units"],"additionalProperties":false,"allOf":[{"oneOf":[{"required":["items"],"not":{"required":["jsonl_path"]}},{"required":["jsonl_path"],"not":{"required":["items"]}}]}]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"SubmissionOutcome":{"type":"string","enum":["not_submitted","accepted","terminal","acceptance_unknown"]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"UpstreamTaskId":{"type":"string","minLength":1},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkCollection":{"type":"object","properties":{"id":{"$ref":"#/$defs/BulkId"},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"total_items":{"type":"integer","format":"uint64","minimum":1},"accepted":{"type":"integer","format":"uint64","minimum":0},"succeeded":{"type":"integer","format":"uint64","minimum":0},"failed":{"type":"integer","format":"uint64","minimum":0},"estimated_billable_units":{"description":"The locally computed billing estimate, present only when the caller\nholds the validated local submission plan (contracts.md 4.6): a\nresumed observation of a remotely authored job omits it rather than\nfabricating a charge.","type":["integer"],"format":"uint64","minimum":1},"created_at":{"$ref":"#/$defs/UtcTimestamp"},"updated_at":{"$ref":"#/$defs/UtcTimestamp"},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["id","status","submission_outcome","total_items","accepted","succeeded","failed","created_at","updated_at"],"allOf":[{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"failed":{"const":0},"succeeded":{"minimum":1}}}},{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"succeeded":{"const":0},"failed":{"minimum":1}}}},{"if":{"properties":{"status":{"const":"partial"}},"required":["status"]},"then":{"properties":{"succeeded":{"minimum":1},"failed":{"minimum":1}}}},{"if":{"properties":{"submission_outcome":{"const":"not_submitted"}},"required":["submission_outcome"]},"then":{"properties":{"accepted":{"const":0},"succeeded":{"const":0},"failed":{"const":0}},"not":{"required":["upstream_bulk_id"]}}},{"if":{"properties":{"submission_outcome":{"const":"accepted"}},"required":["submission_outcome"]},"then":{"required":["upstream_bulk_id"]}},{"if":{"properties":{"submission_outcome":{"const":"terminal"}},"required":["submission_outcome"]},"then":{"properties":{"status":{"enum":["succeeded","failed","partial"]}}}}]},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"BulkDryRun":{"description":"The canonical `bulk_submit --dry-run` reconciliation shape (contracts.md\n9.2): the validated plan's identity and pricing, reported without\ncredentials, network, or any remote identity.","type":"object","properties":{"dry":{"$ref":"#/$defs/BulkDryRunMarker"},"id":{"$ref":"#/$defs/BulkId"},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"plan_sha256":{"$ref":"#/$defs/Sha256Hash"},"estimated_billable_units":{"description":"Always at least 1: `text_billable_units` never returns 0 and the plan\nrejects an empty item list (contracts.md 9.2).","type":"integer","format":"uint64","minimum":1},"item_count":{"description":"Always at least 1: `BulkSubmissionPlan::new` rejects an empty list.","type":"integer","format":"uint64","minimum":1}},"required":["dry","id","status","submission_outcome","plan_sha256","estimated_billable_units","item_count"]},"BulkDryRunMarker":{"description":"The dry-run marker object that distinguishes a local preflight from a real\nqueued collection for machine consumers. Fixed sentinel values only.","type":"object","properties":{"noop":{"type":"boolean","const":true},"observed":{"type":"boolean","const":false}},"required":["noop","observed"]},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"bulk_submit"},"data":{"oneOf":[{"$ref":"#/$defs/BulkCollection"},{"$ref":"#/$defs/BulkDryRun"}]},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"bulk_submit"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"get_bulk","description":"Get one Pangram bulk job without waiting.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"bulk_id":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"upstream_bulk_id":{"type":"string","minLength":1}},"required":[],"additionalProperties":false,"allOf":[{"oneOf":[{"required":["bulk_id"],"not":{"required":["upstream_bulk_id"]}},{"required":["upstream_bulk_id"],"not":{"required":["bulk_id"]}}]}]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"SubmissionOutcome":{"type":"string","enum":["not_submitted","accepted","terminal","acceptance_unknown"]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"UpstreamTaskId":{"type":"string","minLength":1},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkCollection":{"type":"object","properties":{"id":{"$ref":"#/$defs/BulkId"},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"total_items":{"type":"integer","format":"uint64","minimum":1},"accepted":{"type":"integer","format":"uint64","minimum":0},"succeeded":{"type":"integer","format":"uint64","minimum":0},"failed":{"type":"integer","format":"uint64","minimum":0},"estimated_billable_units":{"description":"The locally computed billing estimate, present only when the caller\nholds the validated local submission plan (contracts.md 4.6): a\nresumed observation of a remotely authored job omits it rather than\nfabricating a charge.","type":["integer"],"format":"uint64","minimum":1},"created_at":{"$ref":"#/$defs/UtcTimestamp"},"updated_at":{"$ref":"#/$defs/UtcTimestamp"},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["id","status","submission_outcome","total_items","accepted","succeeded","failed","created_at","updated_at"],"allOf":[{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"failed":{"const":0},"succeeded":{"minimum":1}}}},{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"succeeded":{"const":0},"failed":{"minimum":1}}}},{"if":{"properties":{"status":{"const":"partial"}},"required":["status"]},"then":{"properties":{"succeeded":{"minimum":1},"failed":{"minimum":1}}}},{"if":{"properties":{"submission_outcome":{"const":"not_submitted"}},"required":["submission_outcome"]},"then":{"properties":{"accepted":{"const":0},"succeeded":{"const":0},"failed":{"const":0}},"not":{"required":["upstream_bulk_id"]}}},{"if":{"properties":{"submission_outcome":{"const":"accepted"}},"required":["submission_outcome"]},"then":{"required":["upstream_bulk_id"]}},{"if":{"properties":{"submission_outcome":{"const":"terminal"}},"required":["submission_outcome"]},"then":{"properties":{"status":{"enum":["succeeded","failed","partial"]}}}}]},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"bulk_status"},"data":{"$ref":"#/$defs/BulkCollection"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"bulk_status"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"wait_bulk","description":"Wait for one Pangram bulk job to reach a terminal state.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"bulk_id":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"upstream_bulk_id":{"type":"string","minLength":1},"timeout_ms":{"type":"integer","minimum":1}},"required":[],"additionalProperties":false,"allOf":[{"oneOf":[{"required":["bulk_id"],"not":{"required":["upstream_bulk_id"]}},{"required":["upstream_bulk_id"],"not":{"required":["bulk_id"]}}]}]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"SubmissionOutcome":{"type":"string","enum":["not_submitted","accepted","terminal","acceptance_unknown"]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"UpstreamTaskId":{"type":"string","minLength":1},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkCollection":{"type":"object","properties":{"id":{"$ref":"#/$defs/BulkId"},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"total_items":{"type":"integer","format":"uint64","minimum":1},"accepted":{"type":"integer","format":"uint64","minimum":0},"succeeded":{"type":"integer","format":"uint64","minimum":0},"failed":{"type":"integer","format":"uint64","minimum":0},"estimated_billable_units":{"description":"The locally computed billing estimate, present only when the caller\nholds the validated local submission plan (contracts.md 4.6): a\nresumed observation of a remotely authored job omits it rather than\nfabricating a charge.","type":["integer"],"format":"uint64","minimum":1},"created_at":{"$ref":"#/$defs/UtcTimestamp"},"updated_at":{"$ref":"#/$defs/UtcTimestamp"},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["id","status","submission_outcome","total_items","accepted","succeeded","failed","created_at","updated_at"],"allOf":[{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"failed":{"const":0},"succeeded":{"minimum":1}}}},{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"succeeded":{"const":0},"failed":{"minimum":1}}}},{"if":{"properties":{"status":{"const":"partial"}},"required":["status"]},"then":{"properties":{"succeeded":{"minimum":1},"failed":{"minimum":1}}}},{"if":{"properties":{"submission_outcome":{"const":"not_submitted"}},"required":["submission_outcome"]},"then":{"properties":{"accepted":{"const":0},"succeeded":{"const":0},"failed":{"const":0}},"not":{"required":["upstream_bulk_id"]}}},{"if":{"properties":{"submission_outcome":{"const":"accepted"}},"required":["submission_outcome"]},"then":{"required":["upstream_bulk_id"]}},{"if":{"properties":{"submission_outcome":{"const":"terminal"}},"required":["submission_outcome"]},"then":{"properties":{"status":{"enum":["succeeded","failed","partial"]}}}}]},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"bulk_wait"},"data":{"$ref":"#/$defs/BulkCollection"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"bulk_wait"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"get_bulk_results","description":"Get one explicit results page for a Pangram bulk job.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"bulk_id":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"upstream_bulk_id":{"type":"string","minLength":1},"offset":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":1000}},"required":["offset","limit"],"additionalProperties":false,"allOf":[{"oneOf":[{"required":["bulk_id"],"not":{"required":["upstream_bulk_id"]}},{"required":["upstream_bulk_id"],"not":{"required":["bulk_id"]}}]}]},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"Analysis":{"type":"object","properties":{"id":{"$ref":"#/$defs/AnalysisId"},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"input":{"description":"The canonical input descriptor. Omitted only on a resumed-observation\nread whose remote operation has not yet reached a terminal document\n(contracts.md 4.6); locally submitted commands always carry one.","anyOf":[{"$ref":"#/$defs/AnalysisInput"}]},"checks":{"$ref":"#/$defs/OrderedChecks"},"save_state":{"$ref":"#/$defs/SaveState"},"provenance":{"$ref":"#/$defs/Provenance"},"retry_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"rerun_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"created_at":{"$ref":"#/$defs/UtcTimestamp"},"updated_at":{"$ref":"#/$defs/UtcTimestamp"},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["id","status","submission_outcome","checks","save_state","provenance","created_at","updated_at"],"not":{"required":["retry_of","rerun_of"]},"allOf":[{"type":"object"},{"allOf":[{"if":{"properties":{"status":{"const":"running"}},"required":["status"]},"then":{"properties":{"checks":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}}}},{"if":{"properties":{"status":{"const":"queued"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}]}}}},{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["succeeded"]}}}}]}}}},{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["failed"]}}}}]}}}},{"if":{"properties":{"status":{"const":"partial"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"succeeded"}},"required":["status"]}},{"contains":{"properties":{"status":{"const":"failed"}},"required":["status"]}}]}}}}]},{"if":{"properties":{"submission_outcome":{"const":"not_submitted"}},"required":["submission_outcome"]},"then":{"properties":{"checks":{"not":{"contains":{"properties":{"upstream":{"type":"object","required":["task_id"]}},"required":["upstream"]}}},"provenance":{"not":{"anyOf":[{"required":["upstream_task_ids"]},{"required":["upstream_bulk_id"]},{"required":["submitted_at"]},{"required":["completed_at"]}]}}}}}]},"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"SubmissionOutcome":{"type":"string","enum":["not_submitted","accepted","terminal","acceptance_unknown"]},"AnalysisInput":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"}},"$ref":"#/$defs/TextInput","required":["type"]},{"type":"object","properties":{"type":{"type":"string","const":"file"}},"$ref":"#/$defs/FileInput","required":["type"]}]},"TextOrigin":{"oneOf":[{"type":"string","enum":["literal","stdin","file"]},{"description":"The input of a remotely authored operation the client observes by\nexplicit upstream ID (contracts.md 4.6). Valid only on resumed\nreads; never produced by a locally submitted command.","type":"string","const":"unknown"}]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"TextInput":{"type":"object","properties":{"origin":{"$ref":"#/$defs/TextOrigin"},"name":{"type":["string"]},"sha256":{"$ref":"#/$defs/Sha256Hash"},"byte_count":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"text":{"type":["string"]}},"required":["origin","sha256","byte_count","word_count"]},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"FileInput":{"type":"object","properties":{"filename":{"$ref":"#/$defs/NonEmptyString"},"media_type":{"$ref":"#/$defs/NonEmptyString"},"sha256":{"$ref":"#/$defs/Sha256Hash"},"size_bytes":{"type":"integer","format":"uint64","minimum":0},"path":{"type":["string"]},"extracted_text":{"type":["string"]}},"required":["filename","media_type","sha256","size_bytes"]},"OrderedChecks":{"description":"One or two unique checks in canonical display and serialization order.","type":"array","items":{"$ref":"#/$defs/Check"},"minItems":1,"maxItems":2,"allOf":[{"if":{"minItems":2},"then":{"prefixItems":[{"properties":{"kind":{"const":"ai_detection"}},"required":["kind"]},{"properties":{"kind":{"const":"plagiarism"}},"required":["kind"]}]}}]},"Check":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ai_detection"}},"$ref":"#/$defs/CheckState","required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","const":"plagiarism"}},"$ref":"#/$defs/CheckState2","required":["kind"]}]},"UpstreamIdentity":{"type":"object","properties":{"task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"last_stage":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}}},"UpstreamTaskId":{"type":"string","minLength":1},"AiDetectionResult":{"type":"object","properties":{"classification":{"$ref":"#/$defs/AiClassification"},"headline":{"type":"string"},"prediction":{"type":"string"},"fraction_ai":{"$ref":"#/$defs/Fraction"},"fraction_ai_assisted":{"$ref":"#/$defs/Fraction"},"fraction_human":{"$ref":"#/$defs/Fraction"},"num_ai_segments":{"type":"integer","format":"uint64","minimum":0},"num_ai_assisted_segments":{"type":"integer","format":"uint64","minimum":0},"num_human_segments":{"type":"integer","format":"uint64","minimum":0},"segments":{"type":"array","items":{"$ref":"#/$defs/Segment"}},"dashboard_link":{"type":["string"],"format":"uri"}},"required":["classification","headline","prediction","fraction_ai","fraction_ai_assisted","fraction_human","num_ai_segments","num_ai_assisted_segments","num_human_segments","segments"]},"AiClassification":{"type":"string","enum":["ai","human","mixed"]},"Fraction":{"description":"A finite value from 0.0 through 1.0.","type":"number","format":"double","minimum":0,"maximum":1},"Segment":{"type":"object","properties":{"text":{"type":"string"},"label":{"$ref":"#/$defs/NonEmptyString"},"ai_assistance_score":{"$ref":"#/$defs/Fraction"},"confidence":{"$ref":"#/$defs/Confidence"},"start_index":{"type":"integer","format":"uint64","minimum":0},"end_index":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"token_length":{"type":"integer","format":"uint64","minimum":0},"humanizer_score":{"description":"Pangram's per-segment estimate that a humanizer modified the text.","anyOf":[{"$ref":"#/$defs/Fraction"}]},"is_humanized":{"description":"Pangram's thresholded humanizer decision, preserved without local derivation.","type":["boolean"]}},"required":["text","label","ai_assistance_score","confidence","start_index","end_index","word_count","token_length"]},"Confidence":{"type":"string","enum":["high","medium","low"]},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"CheckState":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/AiDetectionResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"PlagiarismResult":{"type":"object","properties":{"plagiarism_detected":{"type":"boolean"},"total_sentences":{"type":"integer","format":"uint64","minimum":0},"plagiarized_sentence_count":{"type":"integer","format":"uint64","minimum":0},"percent_plagiarized":{"$ref":"#/$defs/Percentage"},"matches":{"type":"array","items":{"$ref":"#/$defs/PlagiarismMatch"}}},"required":["plagiarism_detected","total_sentences","plagiarized_sentence_count","percent_plagiarized","matches"]},"Percentage":{"description":"A finite percentage from 0.0 through 100.0.","type":"number","format":"double","minimum":0,"maximum":100},"PlagiarismMatch":{"type":"object","properties":{"source_url":{"type":"string"},"matched_text":{"type":"string"},"similarity_score":{"$ref":"#/$defs/Fraction"}},"required":["source_url","matched_text","similarity_score"]},"CheckState2":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/PlagiarismResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"SaveState":{"type":"string","enum":["ephemeral","saved_manual","saved_history"]},"Provenance":{"type":"object","properties":{"provider":{"$ref":"#/$defs/Provider"},"upstream_version":{"type":["string"]},"upstream_task_ids":{"type":["array"],"uniqueItems":true,"items":{"$ref":"#/$defs/UpstreamTaskId"}},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"submitted_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["provider"]},"Provider":{"type":"string","enum":["pangram"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"BulkPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/$defs/BulkItem"}},"offset":{"type":"integer","format":"uint64","minimum":0},"limit":{"type":"integer","format":"uint64","minimum":1,"maximum":1000},"next_offset":{"type":["integer"],"format":"uint64","minimum":0}},"required":["items","offset","limit"]},"BulkItem":{"type":"object","properties":{"index":{"type":"integer","format":"uint64","minimum":0},"caller_id":{"type":["string"]},"analysis_id":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"last_stage":{"description":"Sanitized provider diagnostic stage for running or failed items.","type":["string"],"minLength":1,"maxLength":200,"pattern":"^[\\x21-\\x7e](?:[\\x20-\\x7e]{0,198}[\\x21-\\x7e])?$"},"status":{"enum":["queued","running","succeeded","failed"],"type":"string"},"analysis":{"$ref":"#/$defs/Analysis"},"error":{"$ref":"#/$defs/CanonicalError"}},"required":["index","status"],"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["analysis"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["analysis"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["analysis"]}}],"allOf":[{"if":{"properties":{"status":{"enum":["queued","succeeded"]}},"required":["status"]},"then":{"not":{"required":["last_stage"]}}}]},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"bulk_results"},"data":{"$ref":"#/$defs/BulkPage"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"bulk_results"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"check_update","description":"Check for a Pangram CLI update without installing it.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"required":[],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"UpstreamTaskId":{"type":"string","minLength":1},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"UpdateStatus":{"type":"object","properties":{"status":{"$ref":"#/$defs/UpdateStatusKind"},"current_version":{"$ref":"#/$defs/ContractVersion"},"available_version":{"anyOf":[{"$ref":"#/$defs/ContractVersion"}]},"manager_command":{"type":["string"]}},"required":["status","current_version"]},"UpdateStatusKind":{"type":"string","enum":["no_update","update_available","updated"]},"ContractVersion":{"type":"string","pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+$"},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"update_check"},"data":{"$ref":"#/$defs/UpdateStatus"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"update_check"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"history_list","description":"List saved local analysis summaries.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","minLength":1},"status":{"enum":["queued","running","succeeded","failed","partial"]},"check":{"enum":["ai_detection","plagiarism"]},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":50}},"required":[],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"UpstreamTaskId":{"type":"string","minLength":1},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"SaveState":{"type":"string","enum":["ephemeral","saved_manual","saved_history"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisSummaryPage":{"description":"Ordered page returned by `history list` and `history search`.","type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/$defs/AnalysisSummary"}}},"required":["items"]},"AnalysisSummary":{"description":"Privacy-bounded history list/search item.\n\nThis is intentionally not an `Analysis`: summary reads never fabricate\ninput descriptors, results, errors, or provenance that were not selected\nfrom the durable record.","type":"object","properties":{"id":{"$ref":"#/$defs/AnalysisId"},"status":{"$ref":"#/$defs/AnalysisStatus"},"checks":{"$ref":"#/$defs/OrderedChecks2"},"save_state":{"$ref":"#/$defs/SaveState"},"input_kind":{"$ref":"#/$defs/AnalysisInputKind"},"display_name":{"type":["string"]},"created_at":{"$ref":"#/$defs/UtcTimestamp"}},"required":["id","status","checks","save_state","input_kind","created_at"]},"OrderedChecks2":{"description":"One or two unique checks in canonical display and serialization order.","type":"array","items":{"$ref":"#/$defs/CheckKind"},"minItems":1,"maxItems":2,"uniqueItems":true,"allOf":[{"if":{"minItems":2},"then":{"prefixItems":[{"const":"ai_detection"},{"const":"plagiarism"}]}}]},"CheckKind":{"type":"string","enum":["ai_detection","plagiarism"]},"AnalysisInputKind":{"description":"Closed input discriminator used by history summaries.","type":"string","enum":["text","file"]},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_list"},"data":{"$ref":"#/$defs/AnalysisSummaryPage"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_list"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"history_search","description":"Search saved local analysis summaries with literal text.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","minLength":1},"status":{"enum":["queued","running","succeeded","failed","partial"]},"check":{"enum":["ai_detection","plagiarism"]},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":50}},"required":["query"],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"UpstreamTaskId":{"type":"string","minLength":1},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"SaveState":{"type":"string","enum":["ephemeral","saved_manual","saved_history"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisSummaryPage":{"description":"Ordered page returned by `history list` and `history search`.","type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/$defs/AnalysisSummary"}}},"required":["items"]},"AnalysisSummary":{"description":"Privacy-bounded history list/search item.\n\nThis is intentionally not an `Analysis`: summary reads never fabricate\ninput descriptors, results, errors, or provenance that were not selected\nfrom the durable record.","type":"object","properties":{"id":{"$ref":"#/$defs/AnalysisId"},"status":{"$ref":"#/$defs/AnalysisStatus"},"checks":{"$ref":"#/$defs/OrderedChecks2"},"save_state":{"$ref":"#/$defs/SaveState"},"input_kind":{"$ref":"#/$defs/AnalysisInputKind"},"display_name":{"type":["string"]},"created_at":{"$ref":"#/$defs/UtcTimestamp"}},"required":["id","status","checks","save_state","input_kind","created_at"]},"OrderedChecks2":{"description":"One or two unique checks in canonical display and serialization order.","type":"array","items":{"$ref":"#/$defs/CheckKind"},"minItems":1,"maxItems":2,"uniqueItems":true,"allOf":[{"if":{"minItems":2},"then":{"prefixItems":[{"const":"ai_detection"},{"const":"plagiarism"}]}}]},"CheckKind":{"type":"string","enum":["ai_detection","plagiarism"]},"AnalysisInputKind":{"description":"Closed input discriminator used by history summaries.","type":"string","enum":["text","file"]},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_search"},"data":{"$ref":"#/$defs/AnalysisSummaryPage"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_search"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"history_get","description":"Get one saved local analysis, redacted by default.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"analysis_id":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"include_content":{"type":"boolean","default":false}},"required":["analysis_id"],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"Analysis":{"type":"object","properties":{"id":{"$ref":"#/$defs/AnalysisId"},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"input":{"description":"The canonical input descriptor. Omitted only on a resumed-observation\nread whose remote operation has not yet reached a terminal document\n(contracts.md 4.6); locally submitted commands always carry one.","anyOf":[{"$ref":"#/$defs/AnalysisInput"}]},"checks":{"$ref":"#/$defs/OrderedChecks"},"save_state":{"$ref":"#/$defs/SaveState"},"provenance":{"$ref":"#/$defs/Provenance"},"retry_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"rerun_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"created_at":{"$ref":"#/$defs/UtcTimestamp"},"updated_at":{"$ref":"#/$defs/UtcTimestamp"},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["id","status","submission_outcome","checks","save_state","provenance","created_at","updated_at"],"not":{"required":["retry_of","rerun_of"]},"allOf":[{"type":"object"},{"allOf":[{"if":{"properties":{"status":{"const":"running"}},"required":["status"]},"then":{"properties":{"checks":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}}}},{"if":{"properties":{"status":{"const":"queued"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}]}}}},{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["succeeded"]}}}}]}}}},{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["failed"]}}}}]}}}},{"if":{"properties":{"status":{"const":"partial"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"succeeded"}},"required":["status"]}},{"contains":{"properties":{"status":{"const":"failed"}},"required":["status"]}}]}}}}]},{"if":{"properties":{"submission_outcome":{"const":"not_submitted"}},"required":["submission_outcome"]},"then":{"properties":{"checks":{"not":{"contains":{"properties":{"upstream":{"type":"object","required":["task_id"]}},"required":["upstream"]}}},"provenance":{"not":{"anyOf":[{"required":["upstream_task_ids"]},{"required":["upstream_bulk_id"]},{"required":["submitted_at"]},{"required":["completed_at"]}]}}}}}]},"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"SubmissionOutcome":{"type":"string","enum":["not_submitted","accepted","terminal","acceptance_unknown"]},"AnalysisInput":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"}},"$ref":"#/$defs/TextInput","required":["type"]},{"type":"object","properties":{"type":{"type":"string","const":"file"}},"$ref":"#/$defs/FileInput","required":["type"]}]},"TextOrigin":{"oneOf":[{"type":"string","enum":["literal","stdin","file"]},{"description":"The input of a remotely authored operation the client observes by\nexplicit upstream ID (contracts.md 4.6). Valid only on resumed\nreads; never produced by a locally submitted command.","type":"string","const":"unknown"}]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"TextInput":{"type":"object","properties":{"origin":{"$ref":"#/$defs/TextOrigin"},"name":{"type":["string"]},"sha256":{"$ref":"#/$defs/Sha256Hash"},"byte_count":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"text":{"type":["string"]}},"required":["origin","sha256","byte_count","word_count"]},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"FileInput":{"type":"object","properties":{"filename":{"$ref":"#/$defs/NonEmptyString"},"media_type":{"$ref":"#/$defs/NonEmptyString"},"sha256":{"$ref":"#/$defs/Sha256Hash"},"size_bytes":{"type":"integer","format":"uint64","minimum":0},"path":{"type":["string"]},"extracted_text":{"type":["string"]}},"required":["filename","media_type","sha256","size_bytes"]},"OrderedChecks":{"description":"One or two unique checks in canonical display and serialization order.","type":"array","items":{"$ref":"#/$defs/Check"},"minItems":1,"maxItems":2,"allOf":[{"if":{"minItems":2},"then":{"prefixItems":[{"properties":{"kind":{"const":"ai_detection"}},"required":["kind"]},{"properties":{"kind":{"const":"plagiarism"}},"required":["kind"]}]}}]},"Check":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ai_detection"}},"$ref":"#/$defs/CheckState","required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","const":"plagiarism"}},"$ref":"#/$defs/CheckState2","required":["kind"]}]},"UpstreamIdentity":{"type":"object","properties":{"task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"last_stage":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}}},"UpstreamTaskId":{"type":"string","minLength":1},"AiDetectionResult":{"type":"object","properties":{"classification":{"$ref":"#/$defs/AiClassification"},"headline":{"type":"string"},"prediction":{"type":"string"},"fraction_ai":{"$ref":"#/$defs/Fraction"},"fraction_ai_assisted":{"$ref":"#/$defs/Fraction"},"fraction_human":{"$ref":"#/$defs/Fraction"},"num_ai_segments":{"type":"integer","format":"uint64","minimum":0},"num_ai_assisted_segments":{"type":"integer","format":"uint64","minimum":0},"num_human_segments":{"type":"integer","format":"uint64","minimum":0},"segments":{"type":"array","items":{"$ref":"#/$defs/Segment"}},"dashboard_link":{"type":["string"],"format":"uri"}},"required":["classification","headline","prediction","fraction_ai","fraction_ai_assisted","fraction_human","num_ai_segments","num_ai_assisted_segments","num_human_segments","segments"]},"AiClassification":{"type":"string","enum":["ai","human","mixed"]},"Fraction":{"description":"A finite value from 0.0 through 1.0.","type":"number","format":"double","minimum":0,"maximum":1},"Segment":{"type":"object","properties":{"text":{"type":"string"},"label":{"$ref":"#/$defs/NonEmptyString"},"ai_assistance_score":{"$ref":"#/$defs/Fraction"},"confidence":{"$ref":"#/$defs/Confidence"},"start_index":{"type":"integer","format":"uint64","minimum":0},"end_index":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"token_length":{"type":"integer","format":"uint64","minimum":0},"humanizer_score":{"description":"Pangram's per-segment estimate that a humanizer modified the text.","anyOf":[{"$ref":"#/$defs/Fraction"}]},"is_humanized":{"description":"Pangram's thresholded humanizer decision, preserved without local derivation.","type":["boolean"]}},"required":["text","label","ai_assistance_score","confidence","start_index","end_index","word_count","token_length"]},"Confidence":{"type":"string","enum":["high","medium","low"]},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"CheckState":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/AiDetectionResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"PlagiarismResult":{"type":"object","properties":{"plagiarism_detected":{"type":"boolean"},"total_sentences":{"type":"integer","format":"uint64","minimum":0},"plagiarized_sentence_count":{"type":"integer","format":"uint64","minimum":0},"percent_plagiarized":{"$ref":"#/$defs/Percentage"},"matches":{"type":"array","items":{"$ref":"#/$defs/PlagiarismMatch"}}},"required":["plagiarism_detected","total_sentences","plagiarized_sentence_count","percent_plagiarized","matches"]},"Percentage":{"description":"A finite percentage from 0.0 through 100.0.","type":"number","format":"double","minimum":0,"maximum":100},"PlagiarismMatch":{"type":"object","properties":{"source_url":{"type":"string"},"matched_text":{"type":"string"},"similarity_score":{"$ref":"#/$defs/Fraction"}},"required":["source_url","matched_text","similarity_score"]},"CheckState2":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/PlagiarismResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"SaveState":{"type":"string","enum":["ephemeral","saved_manual","saved_history"]},"Provenance":{"type":"object","properties":{"provider":{"$ref":"#/$defs/Provider"},"upstream_version":{"type":["string"]},"upstream_task_ids":{"type":["array"],"uniqueItems":true,"items":{"$ref":"#/$defs/UpstreamTaskId"}},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"submitted_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["provider"]},"Provider":{"type":"string","enum":["pangram"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_show"},"data":{"$ref":"#/$defs/Analysis"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_show"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"history_rerun","description":"Submit the saved input from one local analysis again.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"analysis_id":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"max_billable_units":{"type":"integer","minimum":1}},"required":["analysis_id","max_billable_units"],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"Analysis":{"type":"object","properties":{"id":{"$ref":"#/$defs/AnalysisId"},"status":{"$ref":"#/$defs/AnalysisStatus"},"submission_outcome":{"$ref":"#/$defs/SubmissionOutcome"},"input":{"description":"The canonical input descriptor. Omitted only on a resumed-observation\nread whose remote operation has not yet reached a terminal document\n(contracts.md 4.6); locally submitted commands always carry one.","anyOf":[{"$ref":"#/$defs/AnalysisInput"}]},"checks":{"$ref":"#/$defs/OrderedChecks"},"save_state":{"$ref":"#/$defs/SaveState"},"provenance":{"$ref":"#/$defs/Provenance"},"retry_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"rerun_of":{"anyOf":[{"$ref":"#/$defs/AnalysisId"}]},"created_at":{"$ref":"#/$defs/UtcTimestamp"},"updated_at":{"$ref":"#/$defs/UtcTimestamp"},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["id","status","submission_outcome","checks","save_state","provenance","created_at","updated_at"],"not":{"required":["retry_of","rerun_of"]},"allOf":[{"type":"object"},{"allOf":[{"if":{"properties":{"status":{"const":"running"}},"required":["status"]},"then":{"properties":{"checks":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}}}},{"if":{"properties":{"status":{"const":"queued"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}]}}}},{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["succeeded"]}}}}]}}}},{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"items":{"properties":{"status":{"enum":["failed"]}}}}]}}}},{"if":{"properties":{"status":{"const":"partial"}},"required":["status"]},"then":{"properties":{"checks":{"allOf":[{"not":{"contains":{"properties":{"status":{"const":"running"}},"required":["status"]}}},{"not":{"contains":{"properties":{"status":{"const":"queued"}},"required":["status"]}}},{"contains":{"properties":{"status":{"const":"succeeded"}},"required":["status"]}},{"contains":{"properties":{"status":{"const":"failed"}},"required":["status"]}}]}}}}]},{"if":{"properties":{"submission_outcome":{"const":"not_submitted"}},"required":["submission_outcome"]},"then":{"properties":{"checks":{"not":{"contains":{"properties":{"upstream":{"type":"object","required":["task_id"]}},"required":["upstream"]}}},"provenance":{"not":{"anyOf":[{"required":["upstream_task_ids"]},{"required":["upstream_bulk_id"]},{"required":["submitted_at"]},{"required":["completed_at"]}]}}}}}]},"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"AnalysisStatus":{"type":"string","enum":["queued","running","succeeded","failed","partial"]},"SubmissionOutcome":{"type":"string","enum":["not_submitted","accepted","terminal","acceptance_unknown"]},"AnalysisInput":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"}},"$ref":"#/$defs/TextInput","required":["type"]},{"type":"object","properties":{"type":{"type":"string","const":"file"}},"$ref":"#/$defs/FileInput","required":["type"]}]},"TextOrigin":{"oneOf":[{"type":"string","enum":["literal","stdin","file"]},{"description":"The input of a remotely authored operation the client observes by\nexplicit upstream ID (contracts.md 4.6). Valid only on resumed\nreads; never produced by a locally submitted command.","type":"string","const":"unknown"}]},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"TextInput":{"type":"object","properties":{"origin":{"$ref":"#/$defs/TextOrigin"},"name":{"type":["string"]},"sha256":{"$ref":"#/$defs/Sha256Hash"},"byte_count":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"text":{"type":["string"]}},"required":["origin","sha256","byte_count","word_count"]},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"FileInput":{"type":"object","properties":{"filename":{"$ref":"#/$defs/NonEmptyString"},"media_type":{"$ref":"#/$defs/NonEmptyString"},"sha256":{"$ref":"#/$defs/Sha256Hash"},"size_bytes":{"type":"integer","format":"uint64","minimum":0},"path":{"type":["string"]},"extracted_text":{"type":["string"]}},"required":["filename","media_type","sha256","size_bytes"]},"OrderedChecks":{"description":"One or two unique checks in canonical display and serialization order.","type":"array","items":{"$ref":"#/$defs/Check"},"minItems":1,"maxItems":2,"allOf":[{"if":{"minItems":2},"then":{"prefixItems":[{"properties":{"kind":{"const":"ai_detection"}},"required":["kind"]},{"properties":{"kind":{"const":"plagiarism"}},"required":["kind"]}]}}]},"Check":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"ai_detection"}},"$ref":"#/$defs/CheckState","required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","const":"plagiarism"}},"$ref":"#/$defs/CheckState2","required":["kind"]}]},"UpstreamIdentity":{"type":"object","properties":{"task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"last_stage":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}}},"UpstreamTaskId":{"type":"string","minLength":1},"AiDetectionResult":{"type":"object","properties":{"classification":{"$ref":"#/$defs/AiClassification"},"headline":{"type":"string"},"prediction":{"type":"string"},"fraction_ai":{"$ref":"#/$defs/Fraction"},"fraction_ai_assisted":{"$ref":"#/$defs/Fraction"},"fraction_human":{"$ref":"#/$defs/Fraction"},"num_ai_segments":{"type":"integer","format":"uint64","minimum":0},"num_ai_assisted_segments":{"type":"integer","format":"uint64","minimum":0},"num_human_segments":{"type":"integer","format":"uint64","minimum":0},"segments":{"type":"array","items":{"$ref":"#/$defs/Segment"}},"dashboard_link":{"type":["string"],"format":"uri"}},"required":["classification","headline","prediction","fraction_ai","fraction_ai_assisted","fraction_human","num_ai_segments","num_ai_assisted_segments","num_human_segments","segments"]},"AiClassification":{"type":"string","enum":["ai","human","mixed"]},"Fraction":{"description":"A finite value from 0.0 through 1.0.","type":"number","format":"double","minimum":0,"maximum":1},"Segment":{"type":"object","properties":{"text":{"type":"string"},"label":{"$ref":"#/$defs/NonEmptyString"},"ai_assistance_score":{"$ref":"#/$defs/Fraction"},"confidence":{"$ref":"#/$defs/Confidence"},"start_index":{"type":"integer","format":"uint64","minimum":0},"end_index":{"type":"integer","format":"uint64","minimum":0},"word_count":{"type":"integer","format":"uint64","minimum":0},"token_length":{"type":"integer","format":"uint64","minimum":0},"humanizer_score":{"description":"Pangram's per-segment estimate that a humanizer modified the text.","anyOf":[{"$ref":"#/$defs/Fraction"}]},"is_humanized":{"description":"Pangram's thresholded humanizer decision, preserved without local derivation.","type":["boolean"]}},"required":["text","label","ai_assistance_score","confidence","start_index","end_index","word_count","token_length"]},"Confidence":{"type":"string","enum":["high","medium","low"]},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"CheckState":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/AiDetectionResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"PlagiarismResult":{"type":"object","properties":{"plagiarism_detected":{"type":"boolean"},"total_sentences":{"type":"integer","format":"uint64","minimum":0},"plagiarized_sentence_count":{"type":"integer","format":"uint64","minimum":0},"percent_plagiarized":{"$ref":"#/$defs/Percentage"},"matches":{"type":"array","items":{"$ref":"#/$defs/PlagiarismMatch"}}},"required":["plagiarism_detected","total_sentences","plagiarized_sentence_count","percent_plagiarized","matches"]},"Percentage":{"description":"A finite percentage from 0.0 through 100.0.","type":"number","format":"double","minimum":0,"maximum":100},"PlagiarismMatch":{"type":"object","properties":{"source_url":{"type":"string"},"matched_text":{"type":"string"},"similarity_score":{"$ref":"#/$defs/Fraction"}},"required":["source_url","matched_text","similarity_score"]},"CheckState2":{"description":"State variants encode the result/error exclusivity contract directly.","oneOf":[{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"queued"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"result":{"$ref":"#/$defs/PlagiarismResult"},"status":{"type":"string","const":"succeeded"}},"required":["status","result"]},{"type":"object","properties":{"upstream":{"anyOf":[{"$ref":"#/$defs/UpstreamIdentity"}]},"error":{"$ref":"#/$defs/CanonicalError"},"status":{"type":"string","const":"failed"}},"required":["status","error"]}],"allOf":[{"oneOf":[{"properties":{"status":{"enum":["queued","running"]}},"not":{"anyOf":[{"required":["result"]},{"required":["error"]}]}},{"properties":{"status":{"const":"succeeded"}},"required":["result"],"not":{"required":["error"]}},{"properties":{"status":{"const":"failed"}},"required":["error"],"not":{"required":["result"]}}]}]},"SaveState":{"type":"string","enum":["ephemeral","saved_manual","saved_history"]},"Provenance":{"type":"object","properties":{"provider":{"$ref":"#/$defs/Provider"},"upstream_version":{"type":["string"]},"upstream_task_ids":{"type":["array"],"uniqueItems":true,"items":{"$ref":"#/$defs/UpstreamTaskId"}},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"submitted_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]}},"required":["provider"]},"Provider":{"type":"string","enum":["pangram"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_rerun"},"data":{"$ref":"#/$defs/Analysis"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_rerun"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"history_delete","description":"Delete one saved local analysis.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"analysis_id":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"}},"required":["analysis_id"],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"UpstreamTaskId":{"type":"string","minLength":1},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"MutationAcknowledgement":{"description":"A successful command which mutates local state.","type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"]},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_delete"},"data":{"$ref":"#/$defs/MutationAcknowledgement"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_delete"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"history_clear","description":"Delete all saved local analyses.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"required":[],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"UpstreamTaskId":{"type":"string","minLength":1},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"MutationAcknowledgement":{"description":"A successful command which mutates local state.","type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"]},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_clear"},"data":{"$ref":"#/$defs/MutationAcknowledgement"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"history_clear"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"update_config","description":"Set one supported non-secret Pangram CLI configuration key.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"key":{"enum":["history.enabled","tui.intro","tui.keymap","tui.motion","updates.check_on_tui_start","network.max_requests_per_second"]},"value":{"type":"string","minLength":1}},"required":["key","value"],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://pangram.micr.dev/schemas/output-v1.json","x-contract-owner":"rust:microck_pangram_cli::contracts","title":"Pangram CLI output envelope v1","oneOf":[{"$ref":"#/$defs/successEnvelope"},{"$ref":"#/$defs/errorEnvelope"}],"$defs":{"AnalysisId":{"type":"string","pattern":"^anl_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"Sha256Hash":{"description":"A lowercase SHA-256 digest.","type":"string","pattern":"^[0-9a-f]{64}$"},"NonEmptyString":{"description":"A non-empty provider-authored identifier or state string.","type":"string","minLength":1},"UpstreamTaskId":{"type":"string","minLength":1},"CanonicalError":{"description":"The adapter-independent error object used by CLI, TUI, and MCP output.","type":"object","properties":{"code":{"$ref":"#/$defs/ErrorCode"},"category":{"$ref":"#/$defs/ErrorCategory"},"message":{"$ref":"#/$defs/NonEmptyString","minLength":1},"retryable":{"type":"boolean"},"retry_after_ms":{"type":["integer"],"format":"uint64","minimum":0},"recovery":{"anyOf":[{"$ref":"#/$defs/Recovery"}]},"details":{"description":"Callers must remove credentials, submitted text, matches, and raw responses first.","type":["object"],"additionalProperties":true}},"required":["code","category","message","retryable"],"allOf":[{"oneOf":[{"properties":{"code":{"enum":["missing_api_key","invalid_api_key"]},"category":{"const":"authentication"}}},{"properties":{"code":{"enum":["invalid_config","insecure_config_permissions"]},"category":{"const":"local_config"}}},{"properties":{"code":{"enum":["insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable"]},"category":{"const":"local_history"}}},{"properties":{"code":{"enum":["network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown"]},"category":{"const":"network"}}},{"properties":{"code":{"enum":["payment_required"]},"category":{"const":"payment"}}},{"properties":{"code":{"enum":["permission_denied","mcp_capability_required","mcp_root_required","mcp_path_outside_root"]},"category":{"const":"permission"}}},{"properties":{"code":{"enum":["rate_limited"]},"category":{"const":"rate_limit"}}},{"properties":{"code":{"enum":["update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"category":{"const":"update"}}},{"properties":{"code":{"enum":["upstream_error","upstream_analysis_failed","upstream_not_found"]},"category":{"const":"upstream"}}},{"properties":{"code":{"enum":["upstream_contract_changed"]},"category":{"const":"upstream_contract"}}},{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded"]},"category":{"const":"usage"}}}]},{"allOf":[{"if":{"properties":{"code":{"enum":["rate_limited","network_unavailable","wait_timeout"]}}},"then":{"properties":{"retryable":{"const":true}}}},{"if":{"properties":{"code":{"enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","submission_outcome_unknown","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_corrupt","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed"]}}},"then":{"properties":{"retryable":{"const":false}}}}]},{"if":{"properties":{"code":{"const":"submission_outcome_unknown"}}},"then":{"properties":{"retryable":{"const":false},"details":{"$ref":"#/$defs/SubmissionOutcomeUnknownDetails"},"recovery":{"type":"object","properties":{"message":{"const":"A manual retry may create a second billable operation."}},"required":["message"],"additionalProperties":false}},"required":["details","recovery"]}}]},"ErrorCode":{"description":"Stable machine-readable error codes in contract order.","type":"string","enum":["input_required","input_conflict","unsupported_input","unsupported_combination","bulk_limit_exceeded","missing_api_key","invalid_api_key","permission_denied","payment_required","rate_limited","network_unavailable","network_timeout","wait_timeout","submission_outcome_unknown","upstream_error","upstream_analysis_failed","upstream_not_found","upstream_contract_changed","invalid_config","insecure_config_permissions","insecure_history_permissions","history_disabled","history_unavailable","history_corrupt","history_write_failed","local_task_unresolvable","mcp_capability_required","mcp_root_required","mcp_path_outside_root","update_unavailable","update_not_owned","update_verification_failed","update_replace_failed"]},"ErrorCategory":{"description":"The closed error categories exposed by every adapter.","type":"string","enum":["usage","authentication","permission","payment","rate_limit","network","upstream","upstream_contract","local_config","local_history","update"]},"Recovery":{"description":"A safe next step which can be rendered without interpreting shell syntax.","type":"object","properties":{"message":{"$ref":"#/$defs/NonEmptyString"},"command":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"required":["message"]},"UpstreamBulkId":{"type":"string","minLength":1},"UtcTimestamp":{"description":"An absolute UTC timestamp in the canonical `Z` form.","type":"string","format":"date-time","pattern":"Z$"},"BulkId":{"type":"string","pattern":"^bulk_[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"},"MutationAcknowledgement":{"description":"A successful command which mutates local state.","type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"]},"EnvelopeMeta":{"description":"Timing metadata shared by success and failure envelopes.","type":"object","properties":{"started_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"completed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"failed_at":{"anyOf":[{"$ref":"#/$defs/UtcTimestamp"}]},"duration_ms":{"type":["integer"],"format":"uint64","minimum":0}}},"SubmissionOutcomeUnknownDetails":{"type":"object","properties":{"request_sha256":{"$ref":"#/$defs/Sha256Hash"},"upstream_task_id":{"anyOf":[{"$ref":"#/$defs/UpstreamTaskId"}]},"upstream_bulk_id":{"anyOf":[{"$ref":"#/$defs/UpstreamBulkId"}]},"last_status":{"$ref":"#/$defs/NonEmptyString"},"analysis_id":{"$ref":"#/$defs/AnalysisId"},"bulk_id":{"$ref":"#/$defs/BulkId"}},"oneOf":[{"type":"object","properties":{"analysis_id":{"$ref":"#/$defs/AnalysisId"}},"required":["analysis_id"]},{"type":"object","properties":{"bulk_id":{"$ref":"#/$defs/BulkId"}},"required":["bulk_id"]}],"required":["request_sha256","last_status"],"additionalProperties":false},"successEnvelope":{"type":"object","required":["schema_version","command","data","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"config_set"},"data":{"$ref":"#/$defs/MutationAcknowledgement"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"additionalProperties":true,"not":{"required":["error"]}},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"const":"config_set"},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}]}
