changedOutput schema / oneOf
Previous value: -[
- {
- "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 flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
- "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 flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
- "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": "ID963 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": "ID637 6b 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"
- }
-]New value: +[
+ {
+ "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": "ID963 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": "ID637 6b 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"
+ }
+]