{"$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$"},"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"]},"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"]}}}]},"AnalysisPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/$defs/Analysis"}}},"required":["items"]},"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"]},"MutationAcknowledgement":{"description":"A successful command which mutates local state.","type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"]},"McpMutationReport":{"description":"Successful MCP installer output. Target order is part of the public\ncontract, so this type preserves the caller-selected order without sorting.","type":"object","properties":{"dry_run":{"type":"boolean"},"targets":{"type":"array","items":{"$ref":"#/$defs/McpMutationTarget"},"minItems":1}},"additionalProperties":false,"required":["dry_run","targets"]},"McpMutationTarget":{"description":"One ordered MCP client configuration result.","type":"object","properties":{"client":{"$ref":"#/$defs/NonEmptyString"},"path":{"$ref":"#/$defs/NonEmptyString"},"action":{"$ref":"#/$defs/McpMutationAction"},"reason":{"anyOf":[{"$ref":"#/$defs/NonEmptyString"}]}},"additionalProperties":false,"required":["client","path","action"]},"McpMutationAction":{"description":"The exact filesystem change made, or planned by a dry run, for one MCP\nclient configuration.","type":"string","enum":["create","update","remove","unchanged"]},"AuthStatus":{"type":"object","properties":{"configured":{"type":"boolean"},"source":{"$ref":"#/$defs/AuthSource"},"masked_suffix":{"anyOf":[{"$ref":"#/$defs/AuthSuffix"}]}},"required":["configured","source"]},"AuthSource":{"type":"string","enum":["none","environment","stored"]},"AuthSuffix":{"type":"string","maxLength":8},"ConfigListStatus":{"type":"object","properties":{"config":{"type":"object","additionalProperties":true}},"required":["config"]},"ConfigGetStatus":{"type":"object","properties":{"key":{"$ref":"#/$defs/NonEmptyString"},"value":true},"required":["key","value"]},"ConfigPathStatus":{"type":"object","properties":{"path":{"$ref":"#/$defs/NonEmptyString"}},"required":["path"]},"DoctorStatus":{"type":"object","properties":{"checks":{"type":"array","items":{"$ref":"#/$defs/DoctorCheck"}}},"required":["checks"]},"DoctorCheck":{"type":"object","properties":{"name":{"$ref":"#/$defs/NonEmptyString"},"status":{"$ref":"#/$defs/DoctorCheckStatus"},"message":{"type":["string"]}},"required":["name","status"]},"DoctorCheckStatus":{"type":"string","enum":["pass","warn","fail"]},"McpStatus":{"type":"object","properties":{"clients":{"type":"array","items":{"$ref":"#/$defs/McpClientStatus"}}},"required":["clients"]},"McpClientStatus":{"type":"object","properties":{"client":{"$ref":"#/$defs/NonEmptyString"},"installed":{"type":"boolean"},"path":{"type":["string"]}},"required":["client","installed"]},"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":{"enum":["detect","plagiarism","analyze","bulk_submit","bulk_status","bulk_wait","bulk_results","task_status","task_wait","history_list","history_search","history_show","history_rerun","history_delete","history_clear","auth_set","auth_status","auth_logout","config_list","config_get","config_set","config_path","doctor","mcp_install","mcp_uninstall","mcp_status","update_check","update_install"]},"data":{"oneOf":[{"type":"object"},{"type":"array"}]},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"allOf":[{"if":{"properties":{"command":{"enum":["detect","plagiarism","analyze"]}},"required":["command"]},"then":{"properties":{"data":{"oneOf":[{"$ref":"#/$defs/Analysis"},{"type":"array","minItems":1,"items":{"$ref":"#/$defs/Analysis"}}]}}}},{"if":{"properties":{"command":{"enum":["task_status","task_wait","history_show","history_rerun"]}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/Analysis"}}}},{"if":{"properties":{"command":{"const":"bulk_submit"}},"required":["command"]},"then":{"properties":{"data":{"oneOf":[{"$ref":"#/$defs/BulkCollection"},{"$ref":"#/$defs/BulkDryRun"}]}}}},{"if":{"properties":{"command":{"enum":["bulk_status","bulk_wait"]}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/BulkCollection"}}}},{"if":{"properties":{"command":{"const":"bulk_results"}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/BulkPage"}}}},{"if":{"properties":{"command":{"enum":["history_list","history_search"]}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/AnalysisSummaryPage"}}}},{"if":{"properties":{"command":{"enum":["history_delete","history_clear","auth_set","auth_logout","config_set"]}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/MutationAcknowledgement"}}}},{"if":{"properties":{"command":{"enum":["mcp_install","mcp_uninstall"]}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/McpMutationReport"}}}},{"if":{"properties":{"command":{"const":"auth_status"}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/AuthStatus"}}}},{"if":{"properties":{"command":{"const":"config_list"}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/ConfigListStatus"}}}},{"if":{"properties":{"command":{"const":"config_get"}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/ConfigGetStatus"}}}},{"if":{"properties":{"command":{"const":"config_path"}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/ConfigPathStatus"}}}},{"if":{"properties":{"command":{"const":"doctor"}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/DoctorStatus"}}}},{"if":{"properties":{"command":{"const":"mcp_status"}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/McpStatus"}}}},{"if":{"properties":{"command":{"enum":["update_check","update_install"]}},"required":["command"]},"then":{"properties":{"data":{"$ref":"#/$defs/UpdateStatus"}}}}],"not":{"required":["error"]},"additionalProperties":true},"errorEnvelope":{"type":"object","required":["schema_version","command","error","meta"],"properties":{"schema_version":{"const":"1"},"command":{"enum":["detect","plagiarism","analyze","bulk_submit","bulk_status","bulk_wait","bulk_results","task_status","task_wait","history_list","history_search","history_show","history_rerun","history_delete","history_clear","history_export","auth_set","auth_status","auth_logout","config_list","config_get","config_set","config_path","doctor","mcp_serve","mcp_install","mcp_uninstall","mcp_status","agent","skills_list","skills_get","skills_path","completions","update_check","update_install"]},"error":{"$ref":"#/$defs/CanonicalError"},"meta":{"$ref":"#/$defs/EnvelopeMeta"}},"not":{"required":["data"]},"additionalProperties":true}}}
