Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Authorization not required, issuer https://app.coderifts.com
Certificate changed, valid to 2027-01-06
Authorization not required, issuer https://app.coderifts.com
Authorization not required, issuer https://app.coderifts.com
Authorization not required, issuer https://app.coderifts.com
Authorization not required, issuer https://app.coderifts.com
Changed the definition of "preflight_change_set" and "verify_receipt"
⟨138 unchanged words⟩ artifacts[] together is 400). Grant fields(sit in one object, execution_grant_request {include_execution_grant, grant_version, tenant_id, executor_id, adapter_id, target_uri, expected_state_token, state_nonce,policy_hash) applyaudience,onlypolicy_hash};whenanalyzepreflight_mode="authorize"ignoresANDit;include_execution_grant=true;requiredanalyzeis
Changed the definition of "preflight_change_set" and "verify_receipt"
⟨5 unchanged words⟩ required":["preflight_mode"]},"properties":{"adapter_id":{"description":"Authorize+grant v2 only. Adapter that will apply the change. Conventional values: fs, postgres, git. Must match the adapter the executor actually uses; a git grant does not authorize an fs write.","type":"string"},"artifacts":{"description":"1–20 contract documents analyzed ⟨167 unchanged words⟩ "minItems":1,"type":"array"},"audience":{"description":"Requester identity for the decision envelope. Accepted here; the server-derived audience wins when both are present.","type":"string"},"context":{"description":"Optional apply-site context folded ⟨315 unchanged words⟩ ["server"],"type":"string"},"execution_grant_request":{"description":"Authorize + include_execution_grant only: the execution-grant request fields. Analyze ignores them. Flat root-level spellings are also accepted; the same field sent both ways with different values is INVALID_INPUT.","properties":{"adapter_id":{"description":"Authorize+grant v2 only. Adapter that will apply the change. Conventional values: fs, postgres, git. Must match the adapter the executor actually uses; a git grant does not authorize an fs write.","type":"string"},"audience":{"description":"Requester identity for the decision envelope. Accepted here; the server-derived audience wins when both are present.","type":"string"},"executor_id":{"description":"Authorize+grant v2 only. Executor
Authorization not required, issuer https://app.coderifts.com
Changed the definition of "verify_receipt"
⟨24 unchanged words⟩ intended context (operation, environment, fingerprint, target_id set to decision_result.artifact_digest, audience, repository/branch/pull_request, and/or base/head) AND the ⟨373 unchanged words⟩ :"string"},"target_id":{"description":"IntendedREQUIRED to authorize under a held receipt. Set it to decision_result.artifact_digest — the digest of the artifact the receipt was issued for, which you already hold in the decision_result you are passing. The server does NOT derive it for you: it carries YOUR intended apply-site,targetand taking it from the envelope would compare that document against itself. Omit it and the answer is currently_authorized false with authz_reason target_not_stated and authz_status VERIFIED_TARGET_NOT_STATED — a missing input, distinct from target_mismatch, which means the receiptmust
Authorization not required, issuer https://app.coderifts.com
Authorization not required, issuer https://app.coderifts.com
Authorization not required, issuer https://app.coderifts.com
Changed the definition of "get_decision_details"
Retrieve a PAST CodeRifts decision bydecision_idexactly one identifier (orcase_id | decision_id | fingerprint): fullreportpayloadreport, breaking changeslist, scores,and linked receipt metadataif stored. Use this when: - You have ⟨79 unchanged words⟩ verification — use coderifts.verify_receipt. - You have nodecision_id/fingerprintidentifier
Authorization not required, issuer https://app.coderifts.com
Changed the definition of "preflight_change_set"
Use this when: achange set ofcontractartifacts modifiesartifact (OpenAPI, GraphQL, protobuf, AsyncAPI, MCP manifests, or agent tool schemas) changes before merge, deploy, publish, or toolregistration.registration; AND any agent-executed operation with no supported contract type — send type agent_operation. Do not call for documentation-only changes, static readiness scoring, or receipt verification. Use analyze for risk only; authorize requirescontext.operation for permission. Forcontext.operation.receiptSkippingverificationthis
Changed the definition of "preflight_change_set"
⟨448 unchanged words⟩ :"object"},"decision_spec_version":{"description":"Optional pin. '1.0' =Optional.legacyOmitcontractor(soft-default'2.0'mode=+currentanalyzecontract.still'1.0'carriesretired
Authorization not required, issuer https://app.coderifts.com
Changed the definition of "preflight_change_set"
⟨668 unchanged words⟩ string","x-coderifts-default-changes-at":"2026-09-18","x-coderifts-effective-default":"v1v2"},"idempotency_key":{"description":"Optional client ⟨288 unchanged words⟩
Certificate recorded, valid to 2026-11-08
Authorization not required, issuer https://app.coderifts.com
Changed the definition of "get_decision_details", "preflight_change_set" and "verify_receipt"
⟨160 unchanged words⟩ "null"]},"blast_radius":{"description":"ID27 additiveAdditive COUNTS (not a score). Not permission." ⟨229 unchanged words⟩
before
{"oneOf":[{"additionalProperties":true,"description":"ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).","not":{"anyOf":[{"required":["decision"]},{"required":["execution_action"]},{"required":["safe_for_agent"]},{"required":["chain_receipt"]},{"required":["execution_grant"]},{"required":["decision_result"]},{"required":["control_envelope"]},{"required":["required_action_core"]}]},"properties":{"analysis":{"additionalProperties":true,"description":"Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED from ANALYSIS_TIER_FIELDS + remediations by scripts/generate-analysis-tier-schema.js — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.","properties":{"breaking_changes":{"type":"integer"},"breaking_changes_details":{"type":"array"},"change_ir":{"type":"array"},"changelog":{"type":"array"},"compatibility_suggestions":{"type":"array"},"coverage_gap":{"additionalProperties":true,"type":"object"},"coverage_gap_reason":{"type":"string"},"decision_basis":{"additionalProperties":true,"type":"object"},"degraded":{"type":"boolean"},"detected_patterns":{"type":"array"},"evidence_quality":{"type":"string"},"fallback_reason":{"type":"string"},"non_breaking_changes":{"type":"array"},"pattern_sources":{"type":"array"},"patterns":{"type":"array"},"pii_findings":{"type":"array"},"policy_violations":{"type":"array"},"remediations":{"items":{"additionalProperties":true,"description":"One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.","properties":{"change_type":{"type":"string"},"effort":{"type":"string"},"evidence":{"additionalProperties":true,"type":"object"},"instruction":{"description":"Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.","type":"string"},"precise_label":{"type":"string"},"recommended_transform":{"type":"string"},"target":{"type":"string"},"target_ref":{"additionalProperties":true,"type":"object"}},"type":"object"},"type":"array"},"requires_migration":{"type":"boolean"},"risk_dimensions":{"additionalProperties":true,"type":"object"},"risk_level":{"type":"string"},"risk_score":{"type":"integer"},"security_findings":{"type":"array"},"semver_suggestion":{"type":"string"},"should_block":{"type":"boolean"},"stats":{"additionalProperties":true,"type":"object"},"token_cost_impact":{"additionalProperties":true,"type":"object"}},"type":"object"},"analysis_control":{"type":"object"},"analysis_outcome":{"description":"Closed analysis outcome set derived from engine-visible state only.","enum":["NO_BREAK_DETECTED","BREAKS_DETECTED","ANALYSIS_FAILED"],"type":"string"},"artifacts":{"type":"array"},"authorization_effect":{"const":"NONE","description":"Analyze never authorizes; always NONE."},"blast_radius":{"additionalProperties":false,"description":"ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.","properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"enum":["none","declared","observed","declared+observed"],"type":"string"},"params":{"minimum":0,"type":"integer"}},"required":["endpoints","fields","params","consumers_declared","consumers_observed","graph_source"],"type":"object"},"breaking_changes":{"minimum":0,"type":"integer"},"breaking_changes_details":{"description":"Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).","items":{"additionalProperties":true,"properties":{"description":{"type":"string"},"field":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"severity":{"type":"string"},"type":{"description":"Change kind / IR type code (e.g. response.body.property.remove).","type":"string"}},"type":"object"},"type":"array"},"bundle_fingerprint":{"type":"string"},"calibration_version":{"type":["string","null"]},"decision_basis":{},"decision_spec_version":{"description":"Decision Spec major for this response (typically '2.0').","type":"string"},"detected_patterns":{"description":"GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.","items":{"additionalProperties":false,"properties":{"affected_field":{"description":"Field within affected_path. Empty string when the detector had none — the key is always emitted.","type":"string"},"affected_path":{"description":"Contract path this row is about. Empty string when the detector had none — the key is always emitted.","type":"string"},"consequence":{"description":"What breaks for a consumer if this ships. Untrusted free text.","type":"string"},"description":{"description":"What the detector matched. Untrusted free text.","type":"string"},"name":{"description":"Governance pattern name; appears in patterns when both are carried.","type":"string"},"severity":{"description":"Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.","type":"string"},"side":{"description":"Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.","enum":["request","response"],"type":"string"}},"required":["name","severity","description","consequence","affected_path","affected_field"],"type":"object"},"type":"array"},"evidence":{"type":"array"},"evidence_quality":{"type":"string"},"human_report":{"additionalProperties":false,"description":"Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.","properties":{"breaking_highlights":{"type":"array"},"next_steps_prose":{"type":"string"},"suggestions":{"type":"array"},"summary":{"type":"string"}},"type":"object"},"may_execute":{"const":false,"description":"Analyze never grants execute permission."},"operation":{},"pattern_sources":{"type":"array"},"patterns":{"items":{"type":"string"},"type":"array"},"policy_pin_status":{"additionalProperties":true,"type":["object","null"]},"preflight_mode":{"const":"analyze"},"receipt_kind":{"const":"NONE","description":"Analyze never mints a receipt."},"requires_migration":{"type":"boolean"},"risk_score":{"maximum":100,"minimum":0,"type":"integer"},"scorer_version":{"description":"Fingerprint-bound scorerVersion() (observation; not permission).","type":["string","null"]},"severity_summary":{"additionalProperties":false,"description":"Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.","properties":{"diff_severity":{"description":"Structural size of the schema change.","type":"string"},"governance_severity":{"description":"How the rule engine rates the change.","type":"string"},"note":{"type":"string"},"policy_effect":{"description":"Resulting decision effect label.","type":"string"}},"type":"object"},"timestamp":{"type":"string"},"verdict_fingerprint":{"type":"string"}},"required":["preflight_mode","analysis_outcome","authorization_effect","may_execute","receipt_kind","decision_spec_version"],"type":"object"},{"additionalProperties":true,"allOf":[{"if":{"properties":{"receipt_kind":{"const":"operation_authorization"}},"required":["receipt_kind"]},"then":{"required":["chain_receipt"]}},{"if":{"properties":{"execution_action":{"enum":["CONTINUE","CONTINUE_WITH_MONITORING"]}},"required":["execution_action"]},"then":{"properties":{"receipt_kind":{"const":"operation_authorization"}},"required":["receipt_kind","chain_receipt","decision_result"]}}],"description":"AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json","properties":{"analysis":{"additionalProperties":true,"description":"Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED from ANALYSIS_TIER_FIELDS + remediations by scripts/generate-analysis-tier-schema.js — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.","properties":{"breaking_changes":{"type":"integer"},"breaking_changes_details":{"type":"array"},"change_ir":{"type":"array"},"changelog":{"type":"array"},"compatibility_suggestions":{"type":"array"},"coverage_gap":{"additionalProperties":true,"type":"object"},"coverage_gap_reason":{"type":"string"},"decision_basis":{"additionalProperties":true,"type":"object"},"degraded":{"type":"boolean"},"detected_patterns":{"type":"array"},"evidence_quality":{"type":"string"},"fallback_reason":{"type":"string"},"non_breaking_changes":{"type":"array"},"pattern_sources":{"type":"array"},"patterns":{"type":"array"},"pii_findings":{"type":"array"},"policy_violations":{"type":"array"},"remediations":{"items":{"additionalProperties":true,"description":"One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.","properties":{"change_type":{"type":"string"},"effort":{"type":"string"},"evidence":{"additionalProperties":true,"type":"object"},"instruction":{"description":"Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.","type":"string"},"precise_label":{"type":"string"},"recommended_transform":{"type":"string"},"target":{"type":"string"},"target_ref":{"additionalProperties":true,"type":"object"}},"type":"object"},"type":"array"},"requires_migration":{"type":"boolean"},"risk_dimensions":{"additionalProperties":true,"type":"object"},"risk_level":{"type":"string"},"risk_score":{"type":"integer"},"security_findings":{"type":"array"},"semver_suggestion":{"type":"string"},"should_block":{"type":"boolean"},"stats":{"additionalProperties":true,"type":"object"},"token_cost_impact":{"additionalProperties":true,"type":"object"}},"type":"object"},"artifacts":{"type":"array"},"blast_radius":{"additionalProperties":false,"description":"ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.","properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"enum":["none","declared","observed","declared+observed"],"type":"string"},"params":{"minimum":0,"type":"integer"}},"required":["endpoints","fields","params","consumers_declared","consumers_observed","graph_source"],"type":"object"},"breaking_changes":{"minimum":0,"type":"integer"},"breaking_changes_details":{"description":"Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).","items":{"additionalProperties":true,"properties":{"description":{"type":"string"},"field":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"severity":{"type":"string"},"type":{"description":"Change kind / IR type code (e.g. response.body.property.remove).","type":"string"}},"type":"object"},"type":"array"},"bundle_fingerprint":{"type":"string"},"calibration_version":{"description":"Calibration model version when set; null until a calibrated model ships.","type":["string","null"]},"chain_receipt":{"type":"string"},"chain_status":{"type":"string"},"coderifts_version":{"type":"string"},"control_envelope":{"description":"Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).","type":"object"},"decision":{"description":"Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.","enum":["ALLOW","WARN","REQUIRE_APPROVAL","BLOCK"],"type":"string"},"decision_basis":{},"decision_result":{"additionalProperties":true,"description":"decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).","properties":{"audience":{"type":["string","null"]},"authority":{"description":"Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.","type":["object","null"]},"base":{"type":["string","null"]},"blast_radius":{"description":"ID27 additive COUNTS (not a score). Not permission.","properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"type":"string"},"params":{"minimum":0,"type":"integer"}},"type":"object"},"decision":{"enum":["ALLOW","WARN","REQUIRE_APPROVAL","BLOCK"],"type":"string"},"decision_body_hash":{"type":["string","null"]},"decision_id":{"type":"string"},"derivation":{"description":"Additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.","type":["object","null"]},"environment":{"type":["string","null"]},"execution_action":{"enum":["CONTINUE","CONTINUE_WITH_MONITORING","REQUEST_APPROVAL","STOP"],"type":"string"},"expires_at":{"type":"string"},"fingerprint":{"type":"string"},"head":{"type":["string","null"]},"input_fingerprint":{"type":"string"},"operation":{"type":["string","null"]},"receipt":{"type":"object"},"repository":{"type":["string","null"]},"safe_for_agent":{"type":"boolean"},"spec_version":{"pattern":"^decision-result\\.v1(\\.[0-9]+)?$","type":"string"}},"type":"object"},"decision_spec_version":{"description":"Decision Spec major for this response (typically '2.0').","type":"string"},"detected_patterns":{"description":"GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.","items":{"additionalProperties":false,"properties":{"affected_field":{"description":"Field within affected_path. Empty string when the detector had none — the key is always emitted.","type":"string"},"affected_path":{"description":"Contract path this row is about. Empty string when the detector had none — the key is always emitted.","type":"string"},"consequence":{"description":"What breaks for a consumer if this ships. Untrusted free text.","type":"string"},"description":{"description":"What the detector matched. Untrusted free text.","type":"string"},"name":{"description":"Governance pattern name; appears in patterns when both are carried.","type":"string"},"severity":{"description":"Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.","type":"string"},"side":{"description":"Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.","enum":["request","response"],"type":"string"}},"required":["name","severity","description","consequence","affected_path","affected_field"],"type":"object"},"type":"array"},"evidence":{"type":"array"},"evidence_quality":{"type":"string"},"execution_action":{"description":"Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).","enum":["CONTINUE","CONTINUE_WITH_MONITORING","REQUEST_APPROVAL","STOP"],"type":"string"},"execution_grant":{"description":"Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.","type":"string"},"human_report":{"additionalProperties":false,"description":"Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.","properties":{"breaking_highlights":{"type":"array"},"next_steps_prose":{"type":"string"},"suggestions":{"type":"array"},"summary":{"type":"string"}},"type":"object"},"operation":{},"pattern_sources":{"type":"array"},"patterns":{"items":{"type":"string"},"type":"array"},"policy_pin_status":{"additionalProperties":true,"description":"policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).","type":["object","null"]},"preflight_mode":{"const":"authorize"},"receipt_kind":{"description":"operation_authorization when a chain receipt was issued; NONE if signer unconfigured.","enum":["operation_authorization","NONE"],"type":"string"},"requires_migration":{"type":"boolean"},"risk_score":{"maximum":100,"minimum":0,"type":"integer"},"safe_for_agent":{"description":"Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).","type":"boolean"},"scorer_version":{"description":"Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).","type":["string","null"]},"severity_summary":{"additionalProperties":false,"description":"Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.","properties":{"diff_severity":{"description":"Structural size of the schema change.","type":"string"},"governance_severity":{"description":"How the rule engine rates the change.","type":"string"},"note":{"type":"string"},"policy_effect":{"description":"Resulting decision effect label.","type":"string"}},"type":"object"},"timestamp":{"type":"string"},"verdict_fingerprint":{"type":"string"}},"required":["preflight_mode","decision","execution_action","safe_for_agent","receipt_kind","decision_spec_version"],"type":"object"}],"type":"object"}Changed the definition of "get_decision_details", "preflight_change_set" and "verify_receipt"
⟨134 unchanged words⟩ "null"]},"authority":{"description":"ID963 additive.Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. ⟨74 unchanged words⟩ :"string"},"derivation":{"description":"ID637 6b additive.Additive. Present only when derivation:\"server\" produced ⟨173 unchanged words⟩
⟨56 unchanged words⟩ details of a past decision use coderifts.get_decision_details instead.
First tool surface recorded: 3 tools (server version 1.0.2)
Showing the latest 24 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨221 unchanged words⟩ a placeholder. Inputs: receipt token (required);optionaltarget_id = decision_result.artifact_digest — required for an authorization verdict; omitted → target_not_stated. Optional intended context(operation, environment,fingerprint,target_idfingerprint, audience, repository/branch/pull_request, base/head)and thebody_hash-bound decision_result envelope. 30s clock-skew leeway on expiry. ⟨90 unchanged words⟩
before
{"oneOf":[{"additionalProperties":true,"description":"ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).","not":{"anyOf":[{"required":["decision"]},{"required":["execution_action"]},{"required":["safe_for_agent"]},{"required":["chain_receipt"]},{"required":["execution_grant"]},{"required":["decision_result"]},{"required":["control_envelope"]},{"required":["required_action_core"]}]},"properties":{"analysis":{"additionalProperties":true,"description":"Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.","properties":{"breaking_changes":{"type":"integer"},"breaking_changes_details":{"type":"array"},"change_ir":{"type":"array"},"changelog":{"type":"array"},"compatibility_suggestions":{"type":"array"},"coverage_gap":{"additionalProperties":true,"type":"object"},"coverage_gap_reason":{"type":"string"},"decision_basis":{"additionalProperties":true,"type":"object"},"degraded":{"type":"boolean"},"detected_patterns":{"type":"array"},"evidence_quality":{"type":"string"},"fallback_reason":{"type":"string"},"non_breaking_changes":{"type":"array"},"pattern_sources":{"type":"array"},"patterns":{"type":"array"},"pii_findings":{"type":"array"},"policy_violations":{"type":"array"},"remediations":{"items":{"additionalProperties":true,"description":"One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.","properties":{"change_type":{"type":"string"},"effort":{"type":"string"},"evidence":{"additionalProperties":true,"type":"object"},"instruction":{"description":"Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.","type":"string"},"precise_label":{"type":"string"},"recommended_transform":{"type":"string"},"target":{"type":"string"},"target_ref":{"additionalProperties":true,"type":"object"}},"type":"object"},"type":"array"},"requires_migration":{"type":"boolean"},"risk_dimensions":{"additionalProperties":true,"type":"object"},"risk_level":{"type":"string"},"risk_score":{"type":"integer"},"security_findings":{"type":"array"},"semver_suggestion":{"type":"string"},"should_block":{"type":"boolean"},"stats":{"additionalProperties":true,"type":"object"},"token_cost_impact":{"additionalProperties":true,"type":"object"}},"type":"object"},"analysis_control":{"type":"object"},"analysis_outcome":{"description":"Closed analysis outcome set derived from engine-visible state only. NOT_SUPPORTED = no analyzer (agent_operation / type outside the published enum). ANALYSIS_FAILED = an analyzer ran and failed.","enum":["NO_BREAK_DETECTED","BREAKS_DETECTED","ANALYSIS_FAILED","NOT_SUPPORTED"],"type":"string"},"artifacts":{"type":"array"},"authorization_effect":{"const":"NONE","description":"Analyze never authorizes; always NONE."},"blast_radius":{"additionalProperties":false,"description":"Additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.","properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"enum":["none","declared","observed","declared+observed"],"type":"string"},"params":{"minimum":0,"type":"integer"}},"required":["endpoints","fields","params","consumers_declared","consumers_observed","graph_source"],"type":"object"},"breaking_changes":{"minimum":0,"type":"integer"},"breaking_changes_details":{"description":"Per-change IR/detail rows, mapped from the engine's change IR. Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).","items":{"additionalProperties":true,"properties":{"description":{"type":"string"},"field":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"severity":{"type":"string"},"type":{"description":"Change kind / IR type code (e.g. response.body.property.remove).","type":"string"}},"type":"object"},"type":"array"},"bundle_fingerprint":{"type":"string"},"calibration_version":{"type":["string","null"]},"decision_basis":{},"decision_spec_version":{"description":"Decision Spec major for this response (typically '2.0').","type":"string"},"detected_patterns":{"description":"GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.","items":{"additionalProperties":false,"properties":{"affected_field":{"description":"Field within affected_path. Empty string when the detector had none — the key is always emitted.","type":"string"},"affected_path":{"description":"Contract path this row is about. Empty string when the detector had none — the key is always emitted.","type":"string"},"consequence":{"description":"What breaks for a consumer if this ships. Untrusted free text.","type":"string"},"description":{"description":"What the detector matched. Untrusted free text.","type":"string"},"name":{"description":"Governance pattern name; appears in patterns when both are carried.","type":"string"},"severity":{"description":"Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.","type":"string"},"side":{"description":"Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.","enum":["request","response"],"type":"string"}},"required":["name","severity","description","consequence","affected_path","affected_field"],"type":"object"},"type":"array"},"evidence":{"type":"array"},"evidence_quality":{"type":"string"},"human_report":{"additionalProperties":false,"description":"Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.","properties":{"breaking_highlights":{"type":"array"},"next_steps_prose":{"type":"string"},"suggestions":{"type":"array"},"summary":{"type":"string"}},"type":"object"},"may_execute":{"const":false,"description":"Analyze never grants execute permission."},"operation":{},"pattern_sources":{"type":"array"},"patterns":{"items":{"type":"string"},"type":"array"},"policy_pin_status":{"additionalProperties":true,"type":["object","null"]},"preflight_mode":{"const":"analyze"},"receipt_kind":{"const":"NONE","description":"Analyze never mints a receipt."},"requires_migration":{"type":"boolean"},"risk_score":{"maximum":100,"minimum":0,"type":"integer"},"scorer_version":{"description":"Fingerprint-bound scorerVersion() (observation; not permission).","type":["string","null"]},"severity_summary":{"additionalProperties":false,"description":"Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.","properties":{"diff_severity":{"description":"Structural size of the schema change.","type":"string"},"governance_severity":{"description":"How the rule engine rates the change.","type":"string"},"note":{"type":"string"},"policy_effect":{"description":"Resulting decision effect label.","type":"string"}},"type":"object"},"timestamp":{"type":"string"},"verdict_fingerprint":{"type":"string"}},"required":["preflight_mode","analysis_outcome","authorization_effect","may_execute","receipt_kind","decision_spec_version"],"type":"object"},{"additionalProperties":true,"allOf":[{"if":{"properties":{"receipt_kind":{"const":"operation_authorization"}},"required":["receipt_kind"]},"then":{"required":["chain_receipt"]}},{"if":{"properties":{"execution_action":{"enum":["CONTINUE","CONTINUE_WITH_MONITORING"]}},"required":["execution_action"]},"then":{"properties":{"receipt_kind":{"const":"operation_authorization"}},"required":["receipt_kind","chain_receipt","decision_result"]}}],"description":"AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json","properties":{"analysis":{"additionalProperties":true,"description":"Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.","properties":{"breaking_changes":{"type":"integer"},"breaking_changes_details":{"type":"array"},"change_ir":{"type":"array"},"changelog":{"type":"array"},"compatibility_suggestions":{"type":"array"},"coverage_gap":{"additionalProperties":true,"type":"object"},"coverage_gap_reason":{"type":"string"},"decision_basis":{"additionalProperties":true,"type":"object"},"degraded":{"type":"boolean"},"detected_patterns":{"type":"array"},"evidence_quality":{"type":"string"},"fallback_reason":{"type":"string"},"non_breaking_changes":{"type":"array"},"pattern_sources":{"type":"array"},"patterns":{"type":"array"},"pii_findings":{"type":"array"},"policy_violations":{"type":"array"},"remediations":{"items":{"additionalProperties":true,"description":"One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.","properties":{"change_type":{"type":"string"},"effort":{"type":"string"},"evidence":{"additionalProperties":true,"type":"object"},"instruction":{"description":"Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.","type":"string"},"precise_label":{"type":"string"},"recommended_transform":{"type":"string"},"target":{"type":"string"},"target_ref":{"additionalProperties":true,"type":"object"}},"type":"object"},"type":"array"},"requires_migration":{"type":"boolean"},"risk_dimensions":{"additionalProperties":true,"type":"object"},"risk_level":{"type":"string"},"risk_score":{"type":"integer"},"security_findings":{"type":"array"},"semver_suggestion":{"type":"string"},"should_block":{"type":"boolean"},"stats":{"additionalProperties":true,"type":"object"},"token_cost_impact":{"additionalProperties":true,"type":"object"}},"type":"object"},"artifacts":{"type":"array"},"blast_radius":{"additionalProperties":false,"description":"Additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.","properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"enum":["none","declared","observed","declared+observed"],"type":"string"},"params":{"minimum":0,"type":"integer"}},"required":["endpoints","fields","params","consumers_declared","consumers_observed","graph_source"],"type":"object"},"breaking_changes":{"minimum":0,"type":"integer"},"breaking_changes_details":{"description":"Per-change IR/detail rows, mapped from the engine's change IR. Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).","items":{"additionalProperties":true,"properties":{"description":{"type":"string"},"field":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"severity":{"type":"string"},"type":{"description":"Change kind / IR type code (e.g. response.body.property.remove).","type":"string"}},"type":"object"},"type":"array"},"bundle_fingerprint":{"type":"string"},"calibration_version":{"description":"Calibration model version when set; null until a calibrated model ships.","type":["string","null"]},"chain_receipt":{"type":"string"},"chain_status":{"type":"string"},"coderifts_version":{"type":"string"},"control_envelope":{"description":"Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).","type":"object"},"decision":{"description":"Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.","enum":["ALLOW","WARN","REQUIRE_APPROVAL","BLOCK"],"type":"string"},"decision_basis":{},"decision_result":{"additionalProperties":true,"description":"decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).","properties":{"audience":{"type":["string","null"]},"authority":{"description":"Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.","type":["object","null"]},"base":{"type":["string","null"]},"blast_radius":{"description":"Additive COUNTS (not a score). Not permission.","properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"type":"string"},"params":{"minimum":0,"type":"integer"}},"type":"object"},"decision":{"enum":["ALLOW","WARN","REQUIRE_APPROVAL","BLOCK"],"type":"string"},"decision_body_hash":{"type":["string","null"]},"decision_id":{"type":"string"},"derivation":{"description":"Additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.","type":["object","null"]},"environment":{"type":["string","null"]},"execution_action":{"enum":["CONTINUE","CONTINUE_WITH_MONITORING","REQUEST_APPROVAL","STOP"],"type":"string"},"expires_at":{"type":"string"},"fingerprint":{"type":"string"},"head":{"type":["string","null"]},"input_fingerprint":{"type":"string"},"operation":{"type":["string","null"]},"receipt":{"type":"object"},"repository":{"type":["string","null"]},"safe_for_agent":{"type":"boolean"},"spec_version":{"pattern":"^decision-result\\.v1(\\.[0-9]+)?$","type":"string"}},"type":"object"},"decision_spec_version":{"description":"Decision Spec major for this response (typically '2.0').","type":"string"},"detected_patterns":{"description":"GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.","items":{"additionalProperties":false,"properties":{"affected_field":{"description":"Field within affected_path. Empty string when the detector had none — the key is always emitted.","type":"string"},"affected_path":{"description":"Contract path this row is about. Empty string when the detector had none — the key is always emitted.","type":"string"},"consequence":{"description":"What breaks for a consumer if this ships. Untrusted free text.","type":"string"},"description":{"description":"What the detector matched. Untrusted free text.","type":"string"},"name":{"description":"Governance pattern name; appears in patterns when both are carried.","type":"string"},"severity":{"description":"Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.","type":"string"},"side":{"description":"Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.","enum":["request","response"],"type":"string"}},"required":["name","severity","description","consequence","affected_path","affected_field"],"type":"object"},"type":"array"},"evidence":{"type":"array"},"evidence_quality":{"type":"string"},"execution_action":{"description":"Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).","enum":["CONTINUE","CONTINUE_WITH_MONITORING","REQUEST_APPROVAL","STOP"],"type":"string"},"execution_grant":{"description":"Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash.","type":"string"},"human_report":{"additionalProperties":false,"description":"Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.","properties":{"breaking_highlights":{"type":"array"},"next_steps_prose":{"type":"string"},"suggestions":{"type":"array"},"summary":{"type":"string"}},"type":"object"},"operation":{},"pattern_sources":{"type":"array"},"patterns":{"items":{"type":"string"},"type":"array"},"policy_pin_status":{"additionalProperties":true,"description":"policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).","type":["object","null"]},"preflight_mode":{"const":"authorize"},"receipt_kind":{"description":"operation_authorization when a chain receipt was issued; NONE if signer unconfigured.","enum":["operation_authorization","NONE"],"type":"string"},"requires_migration":{"type":"boolean"},"risk_score":{"maximum":100,"minimum":0,"type":"integer"},"safe_for_agent":{"description":"Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).","type":"boolean"},"scorer_version":{"description":"Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).","type":["string","null"]},"severity_summary":{"additionalProperties":false,"description":"Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.","properties":{"diff_severity":{"description":"Structural size of the schema change.","type":"string"},"governance_severity":{"description":"How the rule engine rates the change.","type":"string"},"note":{"type":"string"},"policy_effect":{"description":"Resulting decision effect label.","type":"string"}},"type":"object"},"timestamp":{"type":"string"},"verdict_fingerprint":{"type":"string"}},"required":["preflight_mode","decision","execution_action","safe_for_agent","receipt_kind","decision_spec_version"],"type":"object"}],"type":"object"}after
{"oneOf":[{"additionalProperties":true,"description":"ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).","not":{"anyOf":[{"required":["decision"]},{"required":["execution_action"]},{"required":["safe_for_agent"]},{"required":["chain_receipt"]},{"required":["execution_grant"]},{"required":["decision_result"]},{"required":["control_envelope"]},{"required":["required_action_core"]}]},"properties":{"analysis":{"additionalProperties":true,"description":"Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.","properties":{"breaking_changes":{"type":"integer"},"breaking_changes_details":{"type":"array"},"change_ir":{"type":"array"},"changelog":{"type":"array"},"compatibility_suggestions":{"type":"array"},"coverage_gap":{"additionalProperties":true,"type":"object"},"coverage_gap_reason":{"type":"string"},"decision_basis":{"additionalProperties":true,"type":"object"},"degraded":{"type":"boolean"},"detected_patterns":{"type":"array"},"evidence_quality":{"type":"string"},"fallback_reason":{"type":"string"},"non_breaking_changes":{"type":"array"},"pattern_sources":{"type":"array"},"patterns":{"type":"array"},"pii_findings":{"type":"array"},"policy_violations":{"type":"array"},"remediations":{"items":{"additionalProperties":true,"description":"One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.","properties":{"change_type":{"type":"string"},"effort":{"type":"string"},"evidence":{"additionalProperties":true,"type":"object"},"instruction":{"description":"Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.","type":"string"},"precise_label":{"type":"string"},"recommended_transform":{"type":"string"},"target":{"type":"string"},"target_ref":{"additionalProperties":true,"type":"object"}},"type":"object"},"type":"array"},"requires_migration":{"type":"boolean"},"risk_dimensions":{"additionalProperties":true,"type":"object"},"risk_level":{"type":"string"},"risk_score":{"type":"integer"},"security_findings":{"type":"array"},"semver_suggestion":{"type":"string"},"should_block":{"type":"boolean"},"stats":{"additionalProperties":true,"type":"object"},"token_cost_impact":{"additionalProperties":true,"type":"object"}},"type":"object"},"analysis_control":{"type":"object"},"analysis_outcome":{"description":"Closed analysis outcome set derived from engine-visible state only. NOT_SUPPORTED = no analyzer (agent_operation / type outside the published enum). ANALYSIS_FAILED = an analyzer ran and failed.","enum":["NO_BREAK_DETECTED","BREAKS_DETECTED","ANALYSIS_FAILED","NOT_SUPPORTED"],"type":"string"},"artifacts":{"type":"array"},"authorization_effect":{"const":"NONE","description":"Analyze never authorizes; always NONE."},"blast_radius":{"additionalProperties":false,"description":"Additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.","properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"enum":["none","declared","observed","declared+observed"],"type":"string"},"params":{"minimum":0,"type":"integer"}},"required":["endpoints","fields","params","consumers_declared","consumers_observed","graph_source"],"type":"object"},"breaking_changes":{"minimum":0,"type":"integer"},"breaking_changes_details":{"description":"Per-change IR/detail rows, mapped from the engine's change IR. Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).","items":{"additionalProperties":true,"properties":{"description":{"type":"string"},"field":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"severity":{"type":"string"},"type":{"description":"Change kind / IR type code (e.g. response.body.property.remove).","type":"string"}},"type":"object"},"type":"array"},"bundle_fingerprint":{"type":"string"},"calibration_version":{"type":["string","null"]},"decision_basis":{},"decision_spec_version":{"description":"Decision Spec major for this response (typically '2.0').","type":"string"},"detected_patterns":{"description":"GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.","items":{"additionalProperties":false,"properties":{"affected_field":{"description":"Field within affected_path. Empty string when the detector had none — the key is always emitted.","type":"string"},"affected_path":{"description":"Contract path this row is about. Empty string when the detector had none — the key is always emitted.","type":"string"},"consequence":{"description":"What breaks for a consumer if this ships. Untrusted free text.","type":"string"},"description":{"description":"What the detector matched. Untrusted free text.","type":"string"},"name":{"description":"Governance pattern name; appears in patterns when both are carried.","type":"string"},"severity":{"description":"Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.","type":"string"},"side":{"description":"Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.","enum":["request","response"],"type":"string"}},"required":["name","severity","description","consequence","affected_path","affected_field"],"type":"object"},"type":"array"},"evidence":{"type":"array"},"evidence_quality":{"type":"string"},"human_report":{"additionalProperties":false,"description":"Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.","properties":{"breaking_highlights":{"type":"array"},"next_steps_prose":{"type":"string"},"suggestions":{"type":"array"},"summary":{"type":"string"}},"type":"object"},"may_execute":{"const":false,"description":"Analyze never grants execute permission."},"operation":{},"pattern_sources":{"type":"array"},"patterns":{"items":{"type":"string"},"type":"array"},"policy_pin_status":{"additionalProperties":true,"type":["object","null"]},"preflight_mode":{"const":"analyze"},"receipt_kind":{"const":"NONE","description":"Analyze never mints a receipt."},"requires_migration":{"type":"boolean"},"risk_score":{"maximum":100,"minimum":0,"type":"integer"},"scorer_version":{"description":"Fingerprint-bound scorerVersion() (observation; not permission).","type":["string","null"]},"severity_summary":{"additionalProperties":false,"description":"Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.","properties":{"diff_severity":{"description":"Structural size of the schema change.","type":"string"},"governance_severity":{"description":"How the rule engine rates the change.","type":"string"},"note":{"type":"string"},"policy_effect":{"description":"Resulting decision effect label.","type":"string"}},"type":"object"},"timestamp":{"type":"string"},"verdict_fingerprint":{"type":"string"}},"required":["preflight_mode","analysis_outcome","authorization_effect","may_execute","receipt_kind","decision_spec_version"],"type":"object"},{"additionalProperties":true,"allOf":[{"if":{"properties":{"receipt_kind":{"const":"operation_authorization"}},"required":["receipt_kind"]},"then":{"required":["chain_receipt"]}},{"if":{"properties":{"execution_action":{"enum":["CONTINUE","CONTINUE_WITH_MONITORING"]}},"required":["execution_action"]},"then":{"properties":{"receipt_kind":{"const":"operation_authorization"}},"required":["receipt_kind","chain_receipt","decision_result"]}}],"description":"AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json","properties":{"analysis":{"additionalProperties":true,"properties":{"breaking_changes":{"type":"integer"},"breaking_changes_details":{"type":"array"},"change_ir":{"type":"array"},"changelog":{"type":"array"},"compatibility_suggestions":{"type":"array"},"coverage_gap":{"additionalProperties":true,"type":"object"},"coverage_gap_reason":{"type":"string"},"decision_basis":{"additionalProperties":true,"type":"object"},"degraded":{"type":"boolean"},"detected_patterns":{"type":"array"},"evidence_quality":{"type":"string"},"fallback_reason":{"type":"string"},"non_breaking_changes":{"type":"array"},"pattern_sources":{"type":"array"},"patterns":{"type":"array"},"pii_findings":{"type":"array"},"policy_violations":{"type":"array"},"remediations":{"items":{"additionalProperties":true,"properties":{"change_type":{"type":"string"},"effort":{"type":"string"},"evidence":{"additionalProperties":true,"type":"object"},"instruction":{"type":"string"},"precise_label":{"type":"string"},"recommended_transform":{"type":"string"},"target":{"type":"string"},"target_ref":{"additionalProperties":true,"type":"object"}},"type":"object"},"type":"array"},"requires_migration":{"type":"boolean"},"risk_dimensions":{"additionalProperties":true,"type":"object"},"risk_level":{"type":"string"},"risk_score":{"type":"integer"},"security_findings":{"type":"array"},"semver_suggestion":{"type":"string"},"should_block":{"type":"boolean"},"stats":{"additionalProperties":true,"type":"object"},"token_cost_impact":{"additionalProperties":true,"type":"object"}},"type":"object"},"artifacts":{"type":"array"},"blast_radius":{"additionalProperties":false,"properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"enum":["none","declared","observed","declared+observed"],"type":"string"},"params":{"minimum":0,"type":"integer"}},"required":["endpoints","fields","params","consumers_declared","consumers_observed","graph_source"],"type":"object"},"breaking_changes":{"minimum":0,"type":"integer"},"breaking_changes_details":{"items":{"additionalProperties":true,"properties":{"description":{"type":"string"},"field":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"severity":{"type":"string"},"type":{"type":"string"}},"type":"object"},"type":"array"},"bundle_fingerprint":{"type":"string"},"calibration_version":{"description":"Calibration model version when set; null until a calibrated model ships.","type":["string","null"]},"chain_receipt":{"type":"string"},"chain_status":{"type":"string"},"coderifts_version":{"type":"string"},"control_envelope":{"description":"Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).","type":"object"},"decision":{"description":"Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.","enum":["ALLOW","WARN","REQUIRE_APPROVAL","BLOCK"],"type":"string"},"decision_basis":{},"decision_result":{"additionalProperties":true,"description":"decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).","properties":{"audience":{"type":["string","null"]},"authority":{"description":"Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.","type":["object","null"]},"base":{"type":["string","null"]},"blast_radius":{"description":"Additive COUNTS (not a score). Not permission.","properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"type":"string"},"params":{"minimum":0,"type":"integer"}},"type":"object"},"decision":{"enum":["ALLOW","WARN","REQUIRE_APPROVAL","BLOCK"],"type":"string"},"decision_body_hash":{"type":["string","null"]},"decision_id":{"type":"string"},"derivation":{"description":"Additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.","type":["object","null"]},"environment":{"type":["string","null"]},"execution_action":{"enum":["CONTINUE","CONTINUE_WITH_MONITORING","REQUEST_APPROVAL","STOP"],"type":"string"},"expires_at":{"type":"string"},"fingerprint":{"type":"string"},"head":{"type":["string","null"]},"input_fingerprint":{"type":"string"},"operation":{"type":["string","null"]},"receipt":{"type":"object"},"repository":{"type":["string","null"]},"safe_for_agent":{"type":"boolean"},"spec_version":{"pattern":"^decision-result\\.v1(\\.[0-9]+)?$","type":"string"}},"type":"object"},"decision_spec_version":{"type":"string"},"detected_patterns":{"items":{"additionalProperties":false,"properties":{"affected_field":{"type":"string"},"affected_path":{"type":"string"},"consequence":{"type":"string"},"description":{"type":"string"},"name":{"type":"string"},"severity":{"type":"string"},"side":{"enum":["request","response"],"type":"string"}},"required":["name","severity","description","consequence","affected_path","affected_field"],"type":"object"},"type":"array"},"evidence":{"type":"array"},"evidence_quality":{"type":"string"},"execution_action":{"description":"Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).","enum":["CONTINUE","CONTINUE_WITH_MONITORING","REQUEST_APPROVAL","STOP"],"type":"string"},"execution_grant":{"description":"Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash.","type":"string"},"human_report":{"additionalProperties":false,"properties":{"breaking_highlights":{"type":"array"},"next_steps_prose":{"type":"string"},"suggestions":{"type":"array"},"summary":{"type":"string"}},"type":"object"},"operation":{},"pattern_sources":{"type":"array"},"patterns":{"items":{"type":"string"},"type":"array"},"policy_pin_status":{"additionalProperties":true,"description":"policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).","type":["object","null"]},"preflight_mode":{"const":"authorize"},"receipt_kind":{"description":"operation_authorization when a chain receipt was issued; NONE if signer unconfigured.","enum":["operation_authorization","NONE"],"type":"string"},"requires_migration":{"type":"boolean"},"risk_score":{"maximum":100,"minimum":0,"type":"integer"},"safe_for_agent":{"description":"Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).","type":"boolean"},"scorer_version":{"description":"Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).","type":["string","null"]},"severity_summary":{"additionalProperties":false,"properties":{"diff_severity":{"type":"string"},"governance_severity":{"type":"string"},"note":{"type":"string"},"policy_effect":{"type":"string"}},"type":"object"},"timestamp":{"type":"string"},"verdict_fingerprint":{"type":"string"}},"required":["preflight_mode","decision","execution_action","safe_for_agent","receipt_kind","decision_spec_version"],"type":"object"}],"type":"object"}⟨61 unchanged words⟩ , …)","type":"string"},"authz_reasons":{"description":"Every violation found; the first is authz_reason. [] when authorized. Fix all of them before re-verifying.","items":{"type":"string"},"type":"array"},"authz_state":{"description":"Lifecycle state from isCurrentlyAuthorized ⟨171 unchanged words⟩
⟨204 unchanged words⟩ VERIFIED_UNBOUND_TARGET","VERIFIED_UNBOUND_REPOSITORY","VERIFIED_UNBOUND_BRANCH","VERIFIED_UNBOUND_PULL_REQUEST","VERIFIED_TARGET_NOT_STATED","UNKNOWN_KEY","UNKNOWN_KEY_STATUS","RETIRED_KEY_VALID_AT_ISSUE","KEY_RETIRED_AFTER_SIGNING"," ⟨28 unchanged words⟩
{"additionalProperties":false,"description":"Closed exclusive identifier union: exactly one of case_id | decision_id | fingerprint. Encoded as minProperties=1 + maxProperties=1 + additionalProperties=false, NOT as a top-level oneOf/anyOf/allOf — Anthropic (and other strict tool APIs) reject those combinators at the root of input_schema and then refuse the entire tools array (measured: test/mcp-input-oneof-honesty.test.js, mcp-streamable.js comment). The server enforces the same mutex with named codes: empty {} → INVALID_INPUT; two or more identifiers → LOOKUP_IDENTIFIER_CONFLICT; case_id alone → CASE_NOT_FOUND (no case store yet; lookup never opens a case).","maxProperties":1,"minProperties":1,"properties":{"case_id":{"description":"A case identifier. Lookup never opens a case. Until the case store exists this returns CASE_NOT_FOUND.","minLength":1,"type":"string"},"decision_id":{"description":"The decision_id from a prior decision_result envelope. Providethis and/or fingerprint (at leastexactly onenon-empty string required).identifier.","minLength":1,"type":"string"} ⟨5 unchanged words⟩ (sha256:...); returns the latest matchingdecision. Provide thisdecisionand/oryoudecision_idown.(atProvideleastexactly onenon-empty string required).identifier.","minLength":1,"type":"string"} ⟨2 unchanged words⟩
⟨150 unchanged words⟩ openapi, graphql, grpc, asyncapi, mcp_manifest,agent_tools.agent_tools,Determinesagent_operation. Contract types determine how before/after text is parsed. agent_operation: An opaque proposed agent operation for which no supported contract-artifact type applies. CodeRifts does not semantically analyze this content and does not issue an execution grant. Not inferred from the filename.","enum":["openapi","graphql","grpc","asyncapi","mcp_manifest","agent_tools","agent_operation"],"type":"string"}},"required" ⟨775 unchanged words⟩
⟨373 unchanged words⟩ analysis outcome set derived from engine-visible state only. NOT_SUPPORTED = no analyzer (agent_operation / type outside the published enum). ANALYSIS_FAILED = an analyzer ran and failed.","enum":["NO_BREAK_DETECTED","BREAKS_DETECTED","ANALYSIS_FAILED","NOT_SUPPORTED"],"type":"string"},"artifacts": ⟨1848 unchanged words⟩
after
{"oneOf":[{"additionalProperties":true,"description":"ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).","not":{"anyOf":[{"required":["decision"]},{"required":["execution_action"]},{"required":["safe_for_agent"]},{"required":["chain_receipt"]},{"required":["execution_grant"]},{"required":["decision_result"]},{"required":["control_envelope"]},{"required":["required_action_core"]}]},"properties":{"analysis":{"additionalProperties":true,"description":"Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.","properties":{"breaking_changes":{"type":"integer"},"breaking_changes_details":{"type":"array"},"change_ir":{"type":"array"},"changelog":{"type":"array"},"compatibility_suggestions":{"type":"array"},"coverage_gap":{"additionalProperties":true,"type":"object"},"coverage_gap_reason":{"type":"string"},"decision_basis":{"additionalProperties":true,"type":"object"},"degraded":{"type":"boolean"},"detected_patterns":{"type":"array"},"evidence_quality":{"type":"string"},"fallback_reason":{"type":"string"},"non_breaking_changes":{"type":"array"},"pattern_sources":{"type":"array"},"patterns":{"type":"array"},"pii_findings":{"type":"array"},"policy_violations":{"type":"array"},"remediations":{"items":{"additionalProperties":true,"description":"One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.","properties":{"change_type":{"type":"string"},"effort":{"type":"string"},"evidence":{"additionalProperties":true,"type":"object"},"instruction":{"description":"Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.","type":"string"},"precise_label":{"type":"string"},"recommended_transform":{"type":"string"},"target":{"type":"string"},"target_ref":{"additionalProperties":true,"type":"object"}},"type":"object"},"type":"array"},"requires_migration":{"type":"boolean"},"risk_dimensions":{"additionalProperties":true,"type":"object"},"risk_level":{"type":"string"},"risk_score":{"type":"integer"},"security_findings":{"type":"array"},"semver_suggestion":{"type":"string"},"should_block":{"type":"boolean"},"stats":{"additionalProperties":true,"type":"object"},"token_cost_impact":{"additionalProperties":true,"type":"object"}},"type":"object"},"analysis_control":{"type":"object"},"analysis_outcome":{"description":"Closed analysis outcome set derived from engine-visible state only.","enum":["NO_BREAK_DETECTED","BREAKS_DETECTED","ANALYSIS_FAILED"],"type":"string"},"artifacts":{"type":"array"},"authorization_effect":{"const":"NONE","description":"Analyze never authorizes; always NONE."},"blast_radius":{"additionalProperties":false,"description":"Additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.","properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"enum":["none","declared","observed","declared+observed"],"type":"string"},"params":{"minimum":0,"type":"integer"}},"required":["endpoints","fields","params","consumers_declared","consumers_observed","graph_source"],"type":"object"},"breaking_changes":{"minimum":0,"type":"integer"},"breaking_changes_details":{"description":"Per-change IR/detail rows, mapped from the engine's change IR. Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).","items":{"additionalProperties":true,"properties":{"description":{"type":"string"},"field":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"severity":{"type":"string"},"type":{"description":"Change kind / IR type code (e.g. response.body.property.remove).","type":"string"}},"type":"object"},"type":"array"},"bundle_fingerprint":{"type":"string"},"calibration_version":{"type":["string","null"]},"decision_basis":{},"decision_spec_version":{"description":"Decision Spec major for this response (typically '2.0').","type":"string"},"detected_patterns":{"description":"GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.","items":{"additionalProperties":false,"properties":{"affected_field":{"description":"Field within affected_path. Empty string when the detector had none — the key is always emitted.","type":"string"},"affected_path":{"description":"Contract path this row is about. Empty string when the detector had none — the key is always emitted.","type":"string"},"consequence":{"description":"What breaks for a consumer if this ships. Untrusted free text.","type":"string"},"description":{"description":"What the detector matched. Untrusted free text.","type":"string"},"name":{"description":"Governance pattern name; appears in patterns when both are carried.","type":"string"},"severity":{"description":"Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.","type":"string"},"side":{"description":"Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.","enum":["request","response"],"type":"string"}},"required":["name","severity","description","consequence","affected_path","affected_field"],"type":"object"},"type":"array"},"evidence":{"type":"array"},"evidence_quality":{"type":"string"},"human_report":{"additionalProperties":false,"description":"Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.","properties":{"breaking_highlights":{"type":"array"},"next_steps_prose":{"type":"string"},"suggestions":{"type":"array"},"summary":{"type":"string"}},"type":"object"},"may_execute":{"const":false,"description":"Analyze never grants execute permission."},"operation":{},"pattern_sources":{"type":"array"},"patterns":{"items":{"type":"string"},"type":"array"},"policy_pin_status":{"additionalProperties":true,"type":["object","null"]},"preflight_mode":{"const":"analyze"},"receipt_kind":{"const":"NONE","description":"Analyze never mints a receipt."},"requires_migration":{"type":"boolean"},"risk_score":{"maximum":100,"minimum":0,"type":"integer"},"scorer_version":{"description":"Fingerprint-bound scorerVersion() (observation; not permission).","type":["string","null"]},"severity_summary":{"additionalProperties":false,"description":"Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.","properties":{"diff_severity":{"description":"Structural size of the schema change.","type":"string"},"governance_severity":{"description":"How the rule engine rates the change.","type":"string"},"note":{"type":"string"},"policy_effect":{"description":"Resulting decision effect label.","type":"string"}},"type":"object"},"timestamp":{"type":"string"},"verdict_fingerprint":{"type":"string"}},"required":["preflight_mode","analysis_outcome","authorization_effect","may_execute","receipt_kind","decision_spec_version"],"type":"object"},{"additionalProperties":true,"allOf":[{"if":{"properties":{"receipt_kind":{"const":"operation_authorization"}},"required":["receipt_kind"]},"then":{"required":["chain_receipt"]}},{"if":{"properties":{"execution_action":{"enum":["CONTINUE","CONTINUE_WITH_MONITORING"]}},"required":["execution_action"]},"then":{"properties":{"receipt_kind":{"const":"operation_authorization"}},"required":["receipt_kind","chain_receipt","decision_result"]}}],"description":"AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json","properties":{"analysis":{"additionalProperties":true,"description":"Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.","properties":{"breaking_changes":{"type":"integer"},"breaking_changes_details":{"type":"array"},"change_ir":{"type":"array"},"changelog":{"type":"array"},"compatibility_suggestions":{"type":"array"},"coverage_gap":{"additionalProperties":true,"type":"object"},"coverage_gap_reason":{"type":"string"},"decision_basis":{"additionalProperties":true,"type":"object"},"degraded":{"type":"boolean"},"detected_patterns":{"type":"array"},"evidence_quality":{"type":"string"},"fallback_reason":{"type":"string"},"non_breaking_changes":{"type":"array"},"pattern_sources":{"type":"array"},"patterns":{"type":"array"},"pii_findings":{"type":"array"},"policy_violations":{"type":"array"},"remediations":{"items":{"additionalProperties":true,"description":"One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.","properties":{"change_type":{"type":"string"},"effort":{"type":"string"},"evidence":{"additionalProperties":true,"type":"object"},"instruction":{"description":"Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.","type":"string"},"precise_label":{"type":"string"},"recommended_transform":{"type":"string"},"target":{"type":"string"},"target_ref":{"additionalProperties":true,"type":"object"}},"type":"object"},"type":"array"},"requires_migration":{"type":"boolean"},"risk_dimensions":{"additionalProperties":true,"type":"object"},"risk_level":{"type":"string"},"risk_score":{"type":"integer"},"security_findings":{"type":"array"},"semver_suggestion":{"type":"string"},"should_block":{"type":"boolean"},"stats":{"additionalProperties":true,"type":"object"},"token_cost_impact":{"additionalProperties":true,"type":"object"}},"type":"object"},"artifacts":{"type":"array"},"blast_radius":{"additionalProperties":false,"description":"Additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.","properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"enum":["none","declared","observed","declared+observed"],"type":"string"},"params":{"minimum":0,"type":"integer"}},"required":["endpoints","fields","params","consumers_declared","consumers_observed","graph_source"],"type":"object"},"breaking_changes":{"minimum":0,"type":"integer"},"breaking_changes_details":{"description":"Per-change IR/detail rows, mapped from the engine's change IR. Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).","items":{"additionalProperties":true,"properties":{"description":{"type":"string"},"field":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"severity":{"type":"string"},"type":{"description":"Change kind / IR type code (e.g. response.body.property.remove).","type":"string"}},"type":"object"},"type":"array"},"bundle_fingerprint":{"type":"string"},"calibration_version":{"description":"Calibration model version when set; null until a calibrated model ships.","type":["string","null"]},"chain_receipt":{"type":"string"},"chain_status":{"type":"string"},"coderifts_version":{"type":"string"},"control_envelope":{"description":"Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).","type":"object"},"decision":{"description":"Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.","enum":["ALLOW","WARN","REQUIRE_APPROVAL","BLOCK"],"type":"string"},"decision_basis":{},"decision_result":{"additionalProperties":true,"description":"decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).","properties":{"audience":{"type":["string","null"]},"authority":{"description":"Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.","type":["object","null"]},"base":{"type":["string","null"]},"blast_radius":{"description":"Additive COUNTS (not a score). Not permission.","properties":{"consumers_declared":{"minimum":0,"type":"integer"},"consumers_observed":{"minimum":0,"type":"integer"},"endpoints":{"minimum":0,"type":"integer"},"fields":{"minimum":0,"type":"integer"},"graph_source":{"type":"string"},"params":{"minimum":0,"type":"integer"}},"type":"object"},"decision":{"enum":["ALLOW","WARN","REQUIRE_APPROVAL","BLOCK"],"type":"string"},"decision_body_hash":{"type":["string","null"]},"decision_id":{"type":"string"},"derivation":{"description":"Additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.","type":["object","null"]},"environment":{"type":["string","null"]},"execution_action":{"enum":["CONTINUE","CONTINUE_WITH_MONITORING","REQUEST_APPROVAL","STOP"],"type":"string"},"expires_at":{"type":"string"},"fingerprint":{"type":"string"},"head":{"type":["string","null"]},"input_fingerprint":{"type":"string"},"operation":{"type":["string","null"]},"receipt":{"type":"object"},"repository":{"type":["string","null"]},"safe_for_agent":{"type":"boolean"},"spec_version":{"pattern":"^decision-result\\.v1(\\.[0-9]+)?$","type":"string"}},"type":"object"},"decision_spec_version":{"description":"Decision Spec major for this response (typically '2.0').","type":"string"},"detected_patterns":{"description":"GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.","items":{"additionalProperties":false,"properties":{"affected_field":{"description":"Field within affected_path. Empty string when the detector had none — the key is always emitted.","type":"string"},"affected_path":{"description":"Contract path this row is about. Empty string when the detector had none — the key is always emitted.","type":"string"},"consequence":{"description":"What breaks for a consumer if this ships. Untrusted free text.","type":"string"},"description":{"description":"What the detector matched. Untrusted free text.","type":"string"},"name":{"description":"Governance pattern name; appears in patterns when both are carried.","type":"string"},"severity":{"description":"Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.","type":"string"},"side":{"description":"Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.","enum":["request","response"],"type":"string"}},"required":["name","severity","description","consequence","affected_path","affected_field"],"type":"object"},"type":"array"},"evidence":{"type":"array"},"evidence_quality":{"type":"string"},"execution_action":{"description":"Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).","enum":["CONTINUE","CONTINUE_WITH_MONITORING","REQUEST_APPROVAL","STOP"],"type":"string"},"execution_grant":{"description":"Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash.","type":"string"},"human_report":{"additionalProperties":false,"description":"Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.","properties":{"breaking_highlights":{"type":"array"},"next_steps_prose":{"type":"string"},"suggestions":{"type":"array"},"summary":{"type":"string"}},"type":"object"},"operation":{},"pattern_sources":{"type":"array"},"patterns":{"items":{"type":"string"},"type":"array"},"policy_pin_status":{"additionalProperties":true,"description":"policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).","type":["object","null"]},"preflight_mode":{"const":"authorize"},"receipt_kind":{"description":"operation_authorization when a chain receipt was issued; NONE if signer unconfigured.","enum":["operation_authorization","NONE"],"type":"string"},"requires_migration":{"type":"boolean"},"risk_score":{"maximum":100,"minimum":0,"type":"integer"},"safe_for_agent":{"description":"Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).","type":"boolean"},"scorer_version":{"description":"Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).","type":["string","null"]},"severity_summary":{"additionalProperties":false,"description":"Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.","properties":{"diff_severity":{"description":"Structural size of the schema change.","type":"string"},"governance_severity":{"description":"How the rule engine rates the change.","type":"string"},"note":{"type":"string"},"policy_effect":{"description":"Resulting decision effect label.","type":"string"}},"type":"object"},"timestamp":{"type":"string"},"verdict_fingerprint":{"type":"string"}},"required":["preflight_mode","decision","execution_action","safe_for_agent","receipt_kind","decision_spec_version"],"type":"object"}],"type":"object"}⟨183 unchanged words⟩ "null"]},"blast_radius":{"description":"ID27 additiveAdditive COUNTS (not a score). Not permission." ⟨243 unchanged words⟩
⟨121 unchanged words⟩ ,"correlation_id":{"description":"Route-owned trace id,(ID828);set by the route itself rather than by correlation middleware; always a non-empty string on 200","type ⟨97 unchanged words⟩
⟨7 unchanged words⟩ ,"properties":{"adapter_id":{"description":"AdapterAuthorize+grantthev2executoronly. Adapter that will apply thechangechange.with,Conventionale.g.values: fs, postgres, git. Must match the adapter the executor actually uses; a git(cr.exec.v2).grant does not authorize an fs write.","type":"string"},"artifacts":{"description":"Contract artifacts to1–20analyzecontracttogetherdocuments(maxanalyzed20).together. Each item is {id, type, before, after} where before/after are the FULL document strings (YAML/JSON/proto text), not URLs or file paths. Omit this array entirely when derivation=\"server\".","items":{"properties":{"after":{"description":"UpdatedTheartifactproposedcontentdocument as raw text, same kind as before. Must be the bytes you intend to merge/deploy/publish, not astringdiff.","type":"string"},"before":{"description":"PriorTheartifactbaselinecontentdocument as raw text (the spec/schema/manifest)asbody).aEmpty string means \"no prior version\" (create), not \"load from disk\".","type":"string"},"id":{"description" ⟨6 unchanged words⟩ ,"type":"string"},"type":{"description":"Artifact kind. One of openapi, graphql, grpc, asyncapi, mcp_manifest, agent_tools. Determines how before/after text is parsed. Not inferred from the filename.","enum":["openapi","graphql","grpc", ⟨55 unchanged words⟩ and other labels); the server accepts anystringnon-emptyforstring;operationconventional(change-set.js)values:—merge,conventionaldeploy,valuestool_call,below.publish. The receipt/gate must match this label.","properties":{"audience":{"description": ⟨227 unchanged words⟩ :"string"},"derivation":{"description":"Opt-in (ID637 6b).\"server\" = the server derives artifacts[] from GitHub Compare via the App installation. Allowed only when context.repository, context.base and context.head are all present and the tenant has a proven binding forcontext.repository and context.base + context.head arethatpresent.repository.OmitDoartifacts[]not(caller-suppliedsend artifacts[]withinthistheflagsameiscall (400 — one source of truth).DefaultOmitabsentthis=fieldtoday'sforcaller-artifactsthepathcaller-supplied(byte-identical).artifacts[] path.","enum":["server"],"type":"string"},"executor_id":{"description":"IdentityAuthorize+grantofv2theonly.executorExecutor identity the grant is bound to (cr.exec.v2example: agent:ci-bot, host:github-actions). Empty/absent is not \"any executor\".","type":"string"},"expected_state_token":{"description":"StateAuthorize+grant v2 only. Compare-and-swap token the executorexpects tomust observe at apply time (cr.exec.v2the \"before\" state). Signed asaitsseparateownfield;field.emptyOmitstringonlywhenifabsent.the adapter has no prior state; do not send a placeholder.","type":"string"},"grant_version":{ ⟨91 unchanged words⟩ :"string"},"include_execution_grant":{"description":"Opt-in (authorizeAuthorizeonly).only. When true on an allow-class authorize, the response includes a signed execution_grant(cr.exec.v1) alongside chain_receipt, or HTTP 503 SIGNER_UNAVAILABLE — neverunsigned.an unsigned grant. Default false. Analyze ignores this flag.SeeIgnoreddocs/cr-exec-v1.md.unless preflight_mode=\"authorize\".","type":"boolean"},"policy_hash":{"description":"Authorize+grant v2 only. Policy identity bound into the grant,issha256:issued+under64(cr.exec.v2).hex.BoundWhenintosupplied,theapplysignedmustgrantusewhenthatsupplied.same policy; a different policy is a different grant.","type":"string"},"preflight_mode":{ ⟨50 unchanged words⟩ "previous_receipt":{"description":"Optional prior chain token to LINK this call into a receipt chain: base64url(body).base64url(signature). Linking is not verification — a linked tokentoislinknot re-checked here; use verify_receipt.","type":"string"},"state_nonce":{"description":"Optional ATOMIC-profile nonce. WhenAuthorize+grantinclude_execution_grantonly.isOpaquetrue,nonce copied into the signed grant asstate_nonce (a separateitssignedown field— NOT(not folded into scope_hash). Absent → BEARERgrantgrant.(today'sIgnoreddefault).unlessSeeinclude_execution_grantdocs/cr-exec-v1.md.is true.","type":"string"},"target_uri":{"description":"TargetAuthorize+grantthev2grantonly.isURIboundthetogrant binds (cr.exec.v2example: git://owner/repo.git/refs/heads/main).FallsFallbackbackiftoomitted: context.target_uri, thentorepository/head-derived.aDistinctrepository/head-derivedfromvalue.context.target_id.","type":"string"},"tenant_id":{"description":"Authorize+grant v2 only. Tenant the grant is issuedunderunder.(cr.exec.v2).ASCIIDefaultsslug.toWhen omitted the server uses \"default\"when—absent.pin it if you are not on the default tenant.","type":"string"}},"required": ⟨18 unchanged words⟩
⟨1564 unchanged words⟩ "null"]},"authority":{"description":"ID963 additive.Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. ⟨74 unchanged words⟩ :"string"},"derivation":{"description":"ID637 6b additive.Additive. Present only when derivation:\"server\" produced ⟨557 unchanged words⟩
⟨157 unchanged words⟩ "null"]},"authority":{"description":"ID963 additive.Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. ⟨74 unchanged words⟩ :"string"},"derivation":{"description":"ID637 6b additive.Additive. Present only when derivation:\"server\" produced ⟨187 unchanged words⟩