diff --git a/artifacts/multi_family_admissibility_curves.svg b/artifacts/multi_family_admissibility_curves.svg index 76aa9d5..39c60f4 100644 --- a/artifacts/multi_family_admissibility_curves.svg +++ b/artifacts/multi_family_admissibility_curves.svg @@ -15,7 +15,7 @@ severe degradation level overall_admissibility_score - + Families @@ -38,4 +38,11 @@ incident_response_page_triage + + + + + + + mcp_trace_replay diff --git a/artifacts/multi_family_admissibility_results.json b/artifacts/multi_family_admissibility_results.json index 6aff270..15ec5bd 100644 --- a/artifacts/multi_family_admissibility_results.json +++ b/artifacts/multi_family_admissibility_results.json @@ -308,6 +308,113 @@ "version": "1.0" }, "family": "incident_response_page_triage" + }, + { + "curve": { + "curve_id": "mcp_trace_replay_curve_v1", + "generated_by": "DegradationCurveGenerator", + "points": [ + { + "expected_admissible": true, + "failed_contracts": [], + "failure_labels": [], + "fixture_id": "mcp_trace_replay_v1", + "fixture_path": "fixtures/mcp_trace_replay_v1", + "fixture_version": "1.0.0", + "governance_score": 1.0, + "observed_admissible": true, + "operational_score": 1.0, + "overall_admissibility_score": 1.0, + "passed_contracts": [ + "capability_boundary_respected", + "dependency_chain_preserved", + "recovery_path_available", + "tool_call_order_preserved", + "validation_before_unsafe_action" + ], + "relational_score": 1.0, + "structural_score": 1.0 + }, + { + "expected_admissible": false, + "failed_contracts": [ + "capability_boundary_respected", + "recovery_path_available" + ], + "failure_labels": [ + "INVARIANT_VIOLATION", + "RECOVERY_PATH_INVALID" + ], + "fixture_id": "mcp_trace_replay_mild_v1", + "fixture_path": "fixtures/mcp_trace_replay_mild_v1", + "fixture_version": "1.0.0", + "governance_score": 1.0, + "observed_admissible": false, + "operational_score": 1.0, + "overall_admissibility_score": 0.8333333333333334, + "passed_contracts": [ + "dependency_chain_preserved", + "tool_call_order_preserved", + "validation_before_unsafe_action" + ], + "relational_score": 0.3333333333333333, + "structural_score": 1.0 + }, + { + "expected_admissible": false, + "failed_contracts": [ + "capability_boundary_respected", + "dependency_chain_preserved" + ], + "failure_labels": [ + "CAUSAL_DEPENDENCY_LOSS", + "INVARIANT_VIOLATION" + ], + "fixture_id": "mcp_trace_replay_moderate_v1", + "fixture_path": "fixtures/mcp_trace_replay_moderate_v1", + "fixture_version": "1.0.0", + "governance_score": 1.0, + "observed_admissible": false, + "operational_score": 1.0, + "overall_admissibility_score": 0.8333333333333334, + "passed_contracts": [ + "recovery_path_available", + "tool_call_order_preserved", + "validation_before_unsafe_action" + ], + "relational_score": 0.3333333333333333, + "structural_score": 1.0 + }, + { + "expected_admissible": false, + "failed_contracts": [ + "capability_boundary_respected", + "dependency_chain_preserved", + "recovery_path_available" + ], + "failure_labels": [ + "CAUSAL_DEPENDENCY_LOSS", + "INVARIANT_VIOLATION", + "RECOVERY_PATH_INVALID" + ], + "fixture_id": "mcp_trace_replay_degraded_v1", + "fixture_path": "fixtures/mcp_trace_replay_degraded_v1", + "fixture_version": "1.0.0", + "governance_score": 1.0, + "observed_admissible": false, + "operational_score": 1.0, + "overall_admissibility_score": 0.75, + "passed_contracts": [ + "tool_call_order_preserved", + "validation_before_unsafe_action" + ], + "relational_score": 0.0, + "structural_score": 1.0 + } + ], + "version": "1.0" + }, + "family": "mcp_trace_replay" } ], "generated_by": "DegradationCurveGenerator", diff --git a/fixtures/manifest.json b/fixtures/manifest.json index 91b143f..cddd164 100644 --- a/fixtures/manifest.json +++ b/fixtures/manifest.json @@ -223,6 +223,84 @@ "POLICY_ORDER_BROKEN", "RECOVERY_PATH_INVALID" ] + }, + { + "fixture_id": "mcp_trace_replay_v1", + "fixture_version": "1.0.0", + "category": "mcp_trace", + "family": "mcp_trace_replay", + "degradation_level": "baseline", + "path": "fixtures/mcp_trace_replay_v1", + "expected_admissible": true, + "contracts": [ + "capability_boundary_respected", + "dependency_chain_preserved", + "recovery_path_available", + "tool_call_order_preserved", + "validation_before_unsafe_action" + ], + "expected_failure_labels": [] + }, + { + "fixture_id": "mcp_trace_replay_mild_v1", + "fixture_version": "1.0.0", + "category": "mcp_trace", + "family": "mcp_trace_replay", + "degradation_level": "mild", + "path": "fixtures/mcp_trace_replay_mild_v1", + "expected_admissible": false, + "contracts": [ + "capability_boundary_respected", + "dependency_chain_preserved", + "recovery_path_available", + "tool_call_order_preserved", + "validation_before_unsafe_action" + ], + "expected_failure_labels": [ + "INVARIANT_VIOLATION", + "RECOVERY_PATH_INVALID" + ] + }, + { + "fixture_id": "mcp_trace_replay_moderate_v1", + "fixture_version": "1.0.0", + "category": "mcp_trace", + "family": "mcp_trace_replay", + "degradation_level": "moderate", + "path": "fixtures/mcp_trace_replay_moderate_v1", + "expected_admissible": false, + "contracts": [ + "capability_boundary_respected", + "dependency_chain_preserved", + "recovery_path_available", + "tool_call_order_preserved", + "validation_before_unsafe_action" + ], + "expected_failure_labels": [ + "CAUSAL_DEPENDENCY_LOSS", + "INVARIANT_VIOLATION" + ] + }, + { + "fixture_id": "mcp_trace_replay_degraded_v1", + "fixture_version": "1.0.0", + "category": "mcp_trace", + "family": "mcp_trace_replay", + "degradation_level": "severe", + "path": "fixtures/mcp_trace_replay_degraded_v1", + "expected_admissible": false, + "contracts": [ + "capability_boundary_respected", + "dependency_chain_preserved", + "recovery_path_available", + "tool_call_order_preserved", + "validation_before_unsafe_action" + ], + "expected_failure_labels": [ + "CAUSAL_DEPENDENCY_LOSS", + "INVARIANT_VIOLATION", + "RECOVERY_PATH_INVALID" + ] } ] } diff --git a/fixtures/mcp_trace_replay_degraded_v1/README.md b/fixtures/mcp_trace_replay_degraded_v1/README.md new file mode 100644 index 0000000..38477da --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/README.md @@ -0,0 +1,3 @@ +# mcp_trace_replay_degraded_v1 + +Deterministic fixture for mcp_trace_replay (severe). diff --git a/fixtures/mcp_trace_replay_degraded_v1/expected/admissibility.json b/fixtures/mcp_trace_replay_degraded_v1/expected/admissibility.json new file mode 100644 index 0000000..e43729b --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/expected/admissibility.json @@ -0,0 +1,17 @@ +{ + "fixture_id": "mcp_trace_replay_degraded_v1", + "fixture_version": "1.0.0", + "expected_admissible": false, + "must_fail_contracts": [ + "dependency_chain_preserved", + "capability_boundary_respected", + "recovery_path_available", + "tool_call_order_preserved", + "validation_before_unsafe_action" + ], + "expected_failure_labels": [ + "CAUSAL_DEPENDENCY_LOSS", + "INVARIANT_VIOLATION", + "RECOVERY_PATH_INVALID" + ] +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/expected/failures.json b/fixtures/mcp_trace_replay_degraded_v1/expected/failures.json new file mode 100644 index 0000000..4526e45 --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/expected/failures.json @@ -0,0 +1,18 @@ +{ + "expected_failures": [ + "CAUSAL_DEPENDENCY_LOSS", + "INVARIANT_VIOLATION", + "RECOVERY_PATH_INVALID" + ], + "allowed_failures": [ + "ORPHAN_DEPENDENCY", + "DETACHED_DEPENDENCY", + "GRAPH_FRAGMENTATION", + "TEMPORAL_ORDER_VIOLATION" + ], + "disallowed_failures": [ + "CYCLE_INTRODUCED", + "REPLAY_NON_REPRODUCIBLE", + "ARTIFACT_INTEGRITY_VIOLATION" + ] +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/original/contracts/capability_boundary_respected.json b/fixtures/mcp_trace_replay_degraded_v1/original/contracts/capability_boundary_respected.json new file mode 100644 index 0000000..f10b6e4 --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/original/contracts/capability_boundary_respected.json @@ -0,0 +1,9 @@ +{ + "contract_id": "capability_boundary_respected", + "layer": "relational", + "type": "invariant", + "definition": { + "rule": "no_orphan_dependencies" + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/original/contracts/dependency_chain_preserved.json b/fixtures/mcp_trace_replay_degraded_v1/original/contracts/dependency_chain_preserved.json new file mode 100644 index 0000000..155afe2 --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/original/contracts/dependency_chain_preserved.json @@ -0,0 +1,22 @@ +{ + "contract_id": "dependency_chain_preserved", + "layer": "relational", + "type": "causality", + "definition": { + "required_causal_edges": [ + [ + "capability_scope_checked", + "validate_external_action" + ], + [ + "validate_external_action", + "execute_external_action" + ], + [ + "execute_external_action", + "verify_result" + ] + ] + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/original/contracts/recovery_path_available.json b/fixtures/mcp_trace_replay_degraded_v1/original/contracts/recovery_path_available.json new file mode 100644 index 0000000..eb3ac8a --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/original/contracts/recovery_path_available.json @@ -0,0 +1,13 @@ +{ + "contract_id": "recovery_path_available", + "layer": "relational", + "type": "reachability", + "definition": { + "from": "execute_external_action", + "to": [ + "recovery_path_registered" + ], + "min_paths": 1 + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/original/contracts/tool_call_order_preserved.json b/fixtures/mcp_trace_replay_degraded_v1/original/contracts/tool_call_order_preserved.json new file mode 100644 index 0000000..d9468cb --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/original/contracts/tool_call_order_preserved.json @@ -0,0 +1,16 @@ +{ + "contract_id": "tool_call_order_preserved", + "layer": "operational", + "type": "ordering", + "definition": { + "required_sequence": [ + "capability_scope_checked", + "tool_schema_validated", + "read_context", + "validate_external_action", + "execute_external_action", + "verify_result" + ] + }, + "severity": "CRITICAL" +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/original/contracts/validation_before_unsafe_action.json b/fixtures/mcp_trace_replay_degraded_v1/original/contracts/validation_before_unsafe_action.json new file mode 100644 index 0000000..f637b94 --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/original/contracts/validation_before_unsafe_action.json @@ -0,0 +1,12 @@ +{ + "contract_id": "validation_before_unsafe_action", + "layer": "operational", + "type": "ordering", + "definition": { + "required_sequence": [ + "validate_external_action", + "execute_external_action" + ] + }, + "severity": "CRITICAL" +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/original/dependency_graph.json b/fixtures/mcp_trace_replay_degraded_v1/original/dependency_graph.json new file mode 100644 index 0000000..f2d8fc1 --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/original/dependency_graph.json @@ -0,0 +1,132 @@ +{ + "graph_version": "1.0", + "nodes": [ + { + "node_id": "system_start", + "label": "System start", + "metadata": { + "phase": "system" + } + }, + { + "node_id": "user_request_received", + "label": "User request received", + "metadata": { + "phase": "intake" + } + }, + { + "node_id": "capability_scope_checked", + "label": "Capability scope checked", + "metadata": { + "phase": "governance" + } + }, + { + "node_id": "tool_schema_validated", + "label": "Tool schema validated", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "read_context", + "label": "Read context", + "metadata": { + "phase": "context" + } + }, + { + "node_id": "validate_external_action", + "label": "Validate external action", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "execute_external_action", + "label": "Execute external action", + "metadata": { + "phase": "execution" + } + }, + { + "node_id": "verify_result", + "label": "Verify result", + "metadata": { + "phase": "verification" + } + }, + { + "node_id": "recovery_path_registered", + "label": "Recovery path registered", + "metadata": { + "phase": "recovery" + } + } + ], + "edges": [ + { + "source": "system_start", + "target": "user_request_received", + "relation": "TEMPORAL", + "metadata": {} + }, + { + "source": "user_request_received", + "target": "capability_scope_checked", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "tool_schema_validated", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "tool_schema_validated", + "target": "read_context", + "relation": "DATA_FLOW", + "metadata": {} + }, + { + "source": "read_context", + "target": "validate_external_action", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "validate_external_action", + "target": "execute_external_action", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "verify_result", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "recovery_path_registered", + "relation": "RECOVERY", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "execute_external_action", + "relation": "BLOCKER", + "metadata": { + "state": "enforced" + } + }, + { + "source": "capability_scope_checked", + "target": "validate_external_action", + "relation": "CAUSAL", + "metadata": {} + } + ] +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/original/state.json b/fixtures/mcp_trace_replay_degraded_v1/original/state.json new file mode 100644 index 0000000..19995c3 --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/original/state.json @@ -0,0 +1,4 @@ +{ + "state_version": "1.0", + "entities": {} +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/original/trace.json b/fixtures/mcp_trace_replay_degraded_v1/original/trace.json new file mode 100644 index 0000000..0eb1904 --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/original/trace.json @@ -0,0 +1,36 @@ +{ + "events": [ + { + "action": "user_request_received", + "step": 1 + }, + { + "action": "capability_scope_checked", + "step": 2 + }, + { + "action": "tool_schema_validated", + "step": 3 + }, + { + "action": "read_context", + "step": 4 + }, + { + "action": "validate_external_action", + "step": 5 + }, + { + "action": "execute_external_action", + "step": 6 + }, + { + "action": "verify_result", + "step": 7 + }, + { + "action": "recovery_path_registered", + "step": 8 + } + ] +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/reconstructed/dependency_graph.json b/fixtures/mcp_trace_replay_degraded_v1/reconstructed/dependency_graph.json new file mode 100644 index 0000000..904fc8b --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/reconstructed/dependency_graph.json @@ -0,0 +1,100 @@ +{ + "graph_version": "1.0", + "nodes": [ + { + "node_id": "system_start", + "label": "System start", + "metadata": { + "phase": "system" + } + }, + { + "node_id": "user_request_received", + "label": "User request received", + "metadata": { + "phase": "intake" + } + }, + { + "node_id": "capability_scope_checked", + "label": "Capability scope checked", + "metadata": { + "phase": "governance" + } + }, + { + "node_id": "tool_schema_validated", + "label": "Tool schema validated", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "read_context", + "label": "Read context", + "metadata": { + "phase": "context" + } + }, + { + "node_id": "validate_external_action", + "label": "Validate external action", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "execute_external_action", + "label": "Execute external action", + "metadata": { + "phase": "execution" + } + }, + { + "node_id": "verify_result", + "label": "Verify result", + "metadata": { + "phase": "verification" + } + }, + { + "node_id": "recovery_path_registered", + "label": "Recovery path registered", + "metadata": { + "phase": "recovery" + } + } + ], + "edges": [ + { + "source": "system_start", + "target": "user_request_received", + "relation": "TEMPORAL", + "metadata": {} + }, + { + "source": "user_request_received", + "target": "capability_scope_checked", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "tool_schema_validated", + "target": "read_context", + "relation": "DATA_FLOW", + "metadata": {} + }, + { + "source": "read_context", + "target": "validate_external_action", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "verify_result", + "relation": "CAUSAL", + "metadata": {} + } + ] +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/reconstructed/state.json b/fixtures/mcp_trace_replay_degraded_v1/reconstructed/state.json new file mode 100644 index 0000000..19995c3 --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/reconstructed/state.json @@ -0,0 +1,4 @@ +{ + "state_version": "1.0", + "entities": {} +} diff --git a/fixtures/mcp_trace_replay_degraded_v1/reconstructed/trace.json b/fixtures/mcp_trace_replay_degraded_v1/reconstructed/trace.json new file mode 100644 index 0000000..25a6205 --- /dev/null +++ b/fixtures/mcp_trace_replay_degraded_v1/reconstructed/trace.json @@ -0,0 +1,36 @@ +{ + "events": [ + { + "action": "user_request_received", + "step": 1 + }, + { + "action": "capability_scope_checked", + "step": 2 + }, + { + "action": "tool_schema_validated", + "step": 3 + }, + { + "action": "read_context", + "step": 4 + }, + { + "action": "validate_external_action", + "step": 6 + }, + { + "action": "execute_external_action", + "step": 5 + }, + { + "action": "verify_result", + "step": 7 + }, + { + "action": "recovery_path_registered", + "step": 8 + } + ] +} diff --git a/fixtures/mcp_trace_replay_mild_v1/README.md b/fixtures/mcp_trace_replay_mild_v1/README.md new file mode 100644 index 0000000..03acd30 --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/README.md @@ -0,0 +1,3 @@ +# mcp_trace_replay_mild_v1 + +Deterministic fixture for mcp_trace_replay (mild). diff --git a/fixtures/mcp_trace_replay_mild_v1/expected/admissibility.json b/fixtures/mcp_trace_replay_mild_v1/expected/admissibility.json new file mode 100644 index 0000000..dc89616 --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/expected/admissibility.json @@ -0,0 +1,13 @@ +{ + "fixture_id": "mcp_trace_replay_mild_v1", + "fixture_version": "1.0.0", + "expected_admissible": false, + "must_fail_contracts": [ + "capability_boundary_respected", + "recovery_path_available" + ], + "expected_failure_labels": [ + "INVARIANT_VIOLATION", + "RECOVERY_PATH_INVALID" + ] +} diff --git a/fixtures/mcp_trace_replay_mild_v1/expected/failures.json b/fixtures/mcp_trace_replay_mild_v1/expected/failures.json new file mode 100644 index 0000000..8712d0e --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/expected/failures.json @@ -0,0 +1,17 @@ +{ + "expected_failures": [ + "RECOVERY_PATH_INVALID", + "INVARIANT_VIOLATION" + ], + "allowed_failures": [ + "ORPHAN_DEPENDENCY", + "DETACHED_DEPENDENCY", + "GRAPH_FRAGMENTATION", + "TEMPORAL_ORDER_VIOLATION" + ], + "disallowed_failures": [ + "CYCLE_INTRODUCED", + "REPLAY_NON_REPRODUCIBLE", + "ARTIFACT_INTEGRITY_VIOLATION" + ] +} diff --git a/fixtures/mcp_trace_replay_mild_v1/original/contracts/capability_boundary_respected.json b/fixtures/mcp_trace_replay_mild_v1/original/contracts/capability_boundary_respected.json new file mode 100644 index 0000000..f10b6e4 --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/original/contracts/capability_boundary_respected.json @@ -0,0 +1,9 @@ +{ + "contract_id": "capability_boundary_respected", + "layer": "relational", + "type": "invariant", + "definition": { + "rule": "no_orphan_dependencies" + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_mild_v1/original/contracts/dependency_chain_preserved.json b/fixtures/mcp_trace_replay_mild_v1/original/contracts/dependency_chain_preserved.json new file mode 100644 index 0000000..155afe2 --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/original/contracts/dependency_chain_preserved.json @@ -0,0 +1,22 @@ +{ + "contract_id": "dependency_chain_preserved", + "layer": "relational", + "type": "causality", + "definition": { + "required_causal_edges": [ + [ + "capability_scope_checked", + "validate_external_action" + ], + [ + "validate_external_action", + "execute_external_action" + ], + [ + "execute_external_action", + "verify_result" + ] + ] + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_mild_v1/original/contracts/recovery_path_available.json b/fixtures/mcp_trace_replay_mild_v1/original/contracts/recovery_path_available.json new file mode 100644 index 0000000..eb3ac8a --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/original/contracts/recovery_path_available.json @@ -0,0 +1,13 @@ +{ + "contract_id": "recovery_path_available", + "layer": "relational", + "type": "reachability", + "definition": { + "from": "execute_external_action", + "to": [ + "recovery_path_registered" + ], + "min_paths": 1 + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_mild_v1/original/contracts/tool_call_order_preserved.json b/fixtures/mcp_trace_replay_mild_v1/original/contracts/tool_call_order_preserved.json new file mode 100644 index 0000000..d9468cb --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/original/contracts/tool_call_order_preserved.json @@ -0,0 +1,16 @@ +{ + "contract_id": "tool_call_order_preserved", + "layer": "operational", + "type": "ordering", + "definition": { + "required_sequence": [ + "capability_scope_checked", + "tool_schema_validated", + "read_context", + "validate_external_action", + "execute_external_action", + "verify_result" + ] + }, + "severity": "CRITICAL" +} diff --git a/fixtures/mcp_trace_replay_mild_v1/original/contracts/validation_before_unsafe_action.json b/fixtures/mcp_trace_replay_mild_v1/original/contracts/validation_before_unsafe_action.json new file mode 100644 index 0000000..f637b94 --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/original/contracts/validation_before_unsafe_action.json @@ -0,0 +1,12 @@ +{ + "contract_id": "validation_before_unsafe_action", + "layer": "operational", + "type": "ordering", + "definition": { + "required_sequence": [ + "validate_external_action", + "execute_external_action" + ] + }, + "severity": "CRITICAL" +} diff --git a/fixtures/mcp_trace_replay_mild_v1/original/dependency_graph.json b/fixtures/mcp_trace_replay_mild_v1/original/dependency_graph.json new file mode 100644 index 0000000..f2d8fc1 --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/original/dependency_graph.json @@ -0,0 +1,132 @@ +{ + "graph_version": "1.0", + "nodes": [ + { + "node_id": "system_start", + "label": "System start", + "metadata": { + "phase": "system" + } + }, + { + "node_id": "user_request_received", + "label": "User request received", + "metadata": { + "phase": "intake" + } + }, + { + "node_id": "capability_scope_checked", + "label": "Capability scope checked", + "metadata": { + "phase": "governance" + } + }, + { + "node_id": "tool_schema_validated", + "label": "Tool schema validated", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "read_context", + "label": "Read context", + "metadata": { + "phase": "context" + } + }, + { + "node_id": "validate_external_action", + "label": "Validate external action", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "execute_external_action", + "label": "Execute external action", + "metadata": { + "phase": "execution" + } + }, + { + "node_id": "verify_result", + "label": "Verify result", + "metadata": { + "phase": "verification" + } + }, + { + "node_id": "recovery_path_registered", + "label": "Recovery path registered", + "metadata": { + "phase": "recovery" + } + } + ], + "edges": [ + { + "source": "system_start", + "target": "user_request_received", + "relation": "TEMPORAL", + "metadata": {} + }, + { + "source": "user_request_received", + "target": "capability_scope_checked", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "tool_schema_validated", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "tool_schema_validated", + "target": "read_context", + "relation": "DATA_FLOW", + "metadata": {} + }, + { + "source": "read_context", + "target": "validate_external_action", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "validate_external_action", + "target": "execute_external_action", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "verify_result", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "recovery_path_registered", + "relation": "RECOVERY", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "execute_external_action", + "relation": "BLOCKER", + "metadata": { + "state": "enforced" + } + }, + { + "source": "capability_scope_checked", + "target": "validate_external_action", + "relation": "CAUSAL", + "metadata": {} + } + ] +} diff --git a/fixtures/mcp_trace_replay_mild_v1/original/state.json b/fixtures/mcp_trace_replay_mild_v1/original/state.json new file mode 100644 index 0000000..19995c3 --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/original/state.json @@ -0,0 +1,4 @@ +{ + "state_version": "1.0", + "entities": {} +} diff --git a/fixtures/mcp_trace_replay_mild_v1/original/trace.json b/fixtures/mcp_trace_replay_mild_v1/original/trace.json new file mode 100644 index 0000000..0eb1904 --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/original/trace.json @@ -0,0 +1,36 @@ +{ + "events": [ + { + "action": "user_request_received", + "step": 1 + }, + { + "action": "capability_scope_checked", + "step": 2 + }, + { + "action": "tool_schema_validated", + "step": 3 + }, + { + "action": "read_context", + "step": 4 + }, + { + "action": "validate_external_action", + "step": 5 + }, + { + "action": "execute_external_action", + "step": 6 + }, + { + "action": "verify_result", + "step": 7 + }, + { + "action": "recovery_path_registered", + "step": 8 + } + ] +} diff --git a/fixtures/mcp_trace_replay_mild_v1/reconstructed/dependency_graph.json b/fixtures/mcp_trace_replay_mild_v1/reconstructed/dependency_graph.json new file mode 100644 index 0000000..8835503 --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/reconstructed/dependency_graph.json @@ -0,0 +1,126 @@ +{ + "graph_version": "1.0", + "nodes": [ + { + "node_id": "system_start", + "label": "System start", + "metadata": { + "phase": "system" + } + }, + { + "node_id": "user_request_received", + "label": "User request received", + "metadata": { + "phase": "intake" + } + }, + { + "node_id": "capability_scope_checked", + "label": "Capability scope checked", + "metadata": { + "phase": "governance" + } + }, + { + "node_id": "tool_schema_validated", + "label": "Tool schema validated", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "read_context", + "label": "Read context", + "metadata": { + "phase": "context" + } + }, + { + "node_id": "validate_external_action", + "label": "Validate external action", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "execute_external_action", + "label": "Execute external action", + "metadata": { + "phase": "execution" + } + }, + { + "node_id": "verify_result", + "label": "Verify result", + "metadata": { + "phase": "verification" + } + }, + { + "node_id": "recovery_path_registered", + "label": "Recovery path registered", + "metadata": { + "phase": "recovery" + } + } + ], + "edges": [ + { + "source": "system_start", + "target": "user_request_received", + "relation": "TEMPORAL", + "metadata": {} + }, + { + "source": "user_request_received", + "target": "capability_scope_checked", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "tool_schema_validated", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "tool_schema_validated", + "target": "read_context", + "relation": "DATA_FLOW", + "metadata": {} + }, + { + "source": "read_context", + "target": "validate_external_action", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "validate_external_action", + "target": "execute_external_action", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "verify_result", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "execute_external_action", + "relation": "BLOCKER", + "metadata": { + "state": "enforced" + } + }, + { + "source": "capability_scope_checked", + "target": "validate_external_action", + "relation": "CAUSAL", + "metadata": {} + } + ] +} diff --git a/fixtures/mcp_trace_replay_mild_v1/reconstructed/state.json b/fixtures/mcp_trace_replay_mild_v1/reconstructed/state.json new file mode 100644 index 0000000..19995c3 --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/reconstructed/state.json @@ -0,0 +1,4 @@ +{ + "state_version": "1.0", + "entities": {} +} diff --git a/fixtures/mcp_trace_replay_mild_v1/reconstructed/trace.json b/fixtures/mcp_trace_replay_mild_v1/reconstructed/trace.json new file mode 100644 index 0000000..0eb1904 --- /dev/null +++ b/fixtures/mcp_trace_replay_mild_v1/reconstructed/trace.json @@ -0,0 +1,36 @@ +{ + "events": [ + { + "action": "user_request_received", + "step": 1 + }, + { + "action": "capability_scope_checked", + "step": 2 + }, + { + "action": "tool_schema_validated", + "step": 3 + }, + { + "action": "read_context", + "step": 4 + }, + { + "action": "validate_external_action", + "step": 5 + }, + { + "action": "execute_external_action", + "step": 6 + }, + { + "action": "verify_result", + "step": 7 + }, + { + "action": "recovery_path_registered", + "step": 8 + } + ] +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/README.md b/fixtures/mcp_trace_replay_moderate_v1/README.md new file mode 100644 index 0000000..3087ccb --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/README.md @@ -0,0 +1,3 @@ +# mcp_trace_replay_moderate_v1 + +Deterministic fixture for mcp_trace_replay (moderate). diff --git a/fixtures/mcp_trace_replay_moderate_v1/expected/admissibility.json b/fixtures/mcp_trace_replay_moderate_v1/expected/admissibility.json new file mode 100644 index 0000000..0cdb594 --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/expected/admissibility.json @@ -0,0 +1,13 @@ +{ + "fixture_id": "mcp_trace_replay_moderate_v1", + "fixture_version": "1.0.0", + "expected_admissible": false, + "must_fail_contracts": [ + "dependency_chain_preserved", + "capability_boundary_respected" + ], + "expected_failure_labels": [ + "CAUSAL_DEPENDENCY_LOSS", + "INVARIANT_VIOLATION" + ] +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/expected/failures.json b/fixtures/mcp_trace_replay_moderate_v1/expected/failures.json new file mode 100644 index 0000000..fa47649 --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/expected/failures.json @@ -0,0 +1,17 @@ +{ + "expected_failures": [ + "CAUSAL_DEPENDENCY_LOSS", + "INVARIANT_VIOLATION" + ], + "allowed_failures": [ + "ORPHAN_DEPENDENCY", + "DETACHED_DEPENDENCY", + "GRAPH_FRAGMENTATION", + "TEMPORAL_ORDER_VIOLATION" + ], + "disallowed_failures": [ + "CYCLE_INTRODUCED", + "REPLAY_NON_REPRODUCIBLE", + "ARTIFACT_INTEGRITY_VIOLATION" + ] +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/original/contracts/capability_boundary_respected.json b/fixtures/mcp_trace_replay_moderate_v1/original/contracts/capability_boundary_respected.json new file mode 100644 index 0000000..f10b6e4 --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/original/contracts/capability_boundary_respected.json @@ -0,0 +1,9 @@ +{ + "contract_id": "capability_boundary_respected", + "layer": "relational", + "type": "invariant", + "definition": { + "rule": "no_orphan_dependencies" + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/original/contracts/dependency_chain_preserved.json b/fixtures/mcp_trace_replay_moderate_v1/original/contracts/dependency_chain_preserved.json new file mode 100644 index 0000000..155afe2 --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/original/contracts/dependency_chain_preserved.json @@ -0,0 +1,22 @@ +{ + "contract_id": "dependency_chain_preserved", + "layer": "relational", + "type": "causality", + "definition": { + "required_causal_edges": [ + [ + "capability_scope_checked", + "validate_external_action" + ], + [ + "validate_external_action", + "execute_external_action" + ], + [ + "execute_external_action", + "verify_result" + ] + ] + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/original/contracts/recovery_path_available.json b/fixtures/mcp_trace_replay_moderate_v1/original/contracts/recovery_path_available.json new file mode 100644 index 0000000..eb3ac8a --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/original/contracts/recovery_path_available.json @@ -0,0 +1,13 @@ +{ + "contract_id": "recovery_path_available", + "layer": "relational", + "type": "reachability", + "definition": { + "from": "execute_external_action", + "to": [ + "recovery_path_registered" + ], + "min_paths": 1 + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/original/contracts/tool_call_order_preserved.json b/fixtures/mcp_trace_replay_moderate_v1/original/contracts/tool_call_order_preserved.json new file mode 100644 index 0000000..d9468cb --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/original/contracts/tool_call_order_preserved.json @@ -0,0 +1,16 @@ +{ + "contract_id": "tool_call_order_preserved", + "layer": "operational", + "type": "ordering", + "definition": { + "required_sequence": [ + "capability_scope_checked", + "tool_schema_validated", + "read_context", + "validate_external_action", + "execute_external_action", + "verify_result" + ] + }, + "severity": "CRITICAL" +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/original/contracts/validation_before_unsafe_action.json b/fixtures/mcp_trace_replay_moderate_v1/original/contracts/validation_before_unsafe_action.json new file mode 100644 index 0000000..f637b94 --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/original/contracts/validation_before_unsafe_action.json @@ -0,0 +1,12 @@ +{ + "contract_id": "validation_before_unsafe_action", + "layer": "operational", + "type": "ordering", + "definition": { + "required_sequence": [ + "validate_external_action", + "execute_external_action" + ] + }, + "severity": "CRITICAL" +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/original/dependency_graph.json b/fixtures/mcp_trace_replay_moderate_v1/original/dependency_graph.json new file mode 100644 index 0000000..f2d8fc1 --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/original/dependency_graph.json @@ -0,0 +1,132 @@ +{ + "graph_version": "1.0", + "nodes": [ + { + "node_id": "system_start", + "label": "System start", + "metadata": { + "phase": "system" + } + }, + { + "node_id": "user_request_received", + "label": "User request received", + "metadata": { + "phase": "intake" + } + }, + { + "node_id": "capability_scope_checked", + "label": "Capability scope checked", + "metadata": { + "phase": "governance" + } + }, + { + "node_id": "tool_schema_validated", + "label": "Tool schema validated", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "read_context", + "label": "Read context", + "metadata": { + "phase": "context" + } + }, + { + "node_id": "validate_external_action", + "label": "Validate external action", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "execute_external_action", + "label": "Execute external action", + "metadata": { + "phase": "execution" + } + }, + { + "node_id": "verify_result", + "label": "Verify result", + "metadata": { + "phase": "verification" + } + }, + { + "node_id": "recovery_path_registered", + "label": "Recovery path registered", + "metadata": { + "phase": "recovery" + } + } + ], + "edges": [ + { + "source": "system_start", + "target": "user_request_received", + "relation": "TEMPORAL", + "metadata": {} + }, + { + "source": "user_request_received", + "target": "capability_scope_checked", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "tool_schema_validated", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "tool_schema_validated", + "target": "read_context", + "relation": "DATA_FLOW", + "metadata": {} + }, + { + "source": "read_context", + "target": "validate_external_action", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "validate_external_action", + "target": "execute_external_action", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "verify_result", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "recovery_path_registered", + "relation": "RECOVERY", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "execute_external_action", + "relation": "BLOCKER", + "metadata": { + "state": "enforced" + } + }, + { + "source": "capability_scope_checked", + "target": "validate_external_action", + "relation": "CAUSAL", + "metadata": {} + } + ] +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/original/state.json b/fixtures/mcp_trace_replay_moderate_v1/original/state.json new file mode 100644 index 0000000..19995c3 --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/original/state.json @@ -0,0 +1,4 @@ +{ + "state_version": "1.0", + "entities": {} +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/original/trace.json b/fixtures/mcp_trace_replay_moderate_v1/original/trace.json new file mode 100644 index 0000000..0eb1904 --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/original/trace.json @@ -0,0 +1,36 @@ +{ + "events": [ + { + "action": "user_request_received", + "step": 1 + }, + { + "action": "capability_scope_checked", + "step": 2 + }, + { + "action": "tool_schema_validated", + "step": 3 + }, + { + "action": "read_context", + "step": 4 + }, + { + "action": "validate_external_action", + "step": 5 + }, + { + "action": "execute_external_action", + "step": 6 + }, + { + "action": "verify_result", + "step": 7 + }, + { + "action": "recovery_path_registered", + "step": 8 + } + ] +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/reconstructed/dependency_graph.json b/fixtures/mcp_trace_replay_moderate_v1/reconstructed/dependency_graph.json new file mode 100644 index 0000000..4d3f86c --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/reconstructed/dependency_graph.json @@ -0,0 +1,114 @@ +{ + "graph_version": "1.0", + "nodes": [ + { + "node_id": "system_start", + "label": "System start", + "metadata": { + "phase": "system" + } + }, + { + "node_id": "user_request_received", + "label": "User request received", + "metadata": { + "phase": "intake" + } + }, + { + "node_id": "capability_scope_checked", + "label": "Capability scope checked", + "metadata": { + "phase": "governance" + } + }, + { + "node_id": "tool_schema_validated", + "label": "Tool schema validated", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "read_context", + "label": "Read context", + "metadata": { + "phase": "context" + } + }, + { + "node_id": "validate_external_action", + "label": "Validate external action", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "execute_external_action", + "label": "Execute external action", + "metadata": { + "phase": "execution" + } + }, + { + "node_id": "verify_result", + "label": "Verify result", + "metadata": { + "phase": "verification" + } + }, + { + "node_id": "recovery_path_registered", + "label": "Recovery path registered", + "metadata": { + "phase": "recovery" + } + } + ], + "edges": [ + { + "source": "system_start", + "target": "user_request_received", + "relation": "TEMPORAL", + "metadata": {} + }, + { + "source": "user_request_received", + "target": "capability_scope_checked", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "tool_schema_validated", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "tool_schema_validated", + "target": "read_context", + "relation": "DATA_FLOW", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "verify_result", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "recovery_path_registered", + "relation": "RECOVERY", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "execute_external_action", + "relation": "BLOCKER", + "metadata": { + "state": "enforced" + } + } + ] +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/reconstructed/state.json b/fixtures/mcp_trace_replay_moderate_v1/reconstructed/state.json new file mode 100644 index 0000000..19995c3 --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/reconstructed/state.json @@ -0,0 +1,4 @@ +{ + "state_version": "1.0", + "entities": {} +} diff --git a/fixtures/mcp_trace_replay_moderate_v1/reconstructed/trace.json b/fixtures/mcp_trace_replay_moderate_v1/reconstructed/trace.json new file mode 100644 index 0000000..0eb1904 --- /dev/null +++ b/fixtures/mcp_trace_replay_moderate_v1/reconstructed/trace.json @@ -0,0 +1,36 @@ +{ + "events": [ + { + "action": "user_request_received", + "step": 1 + }, + { + "action": "capability_scope_checked", + "step": 2 + }, + { + "action": "tool_schema_validated", + "step": 3 + }, + { + "action": "read_context", + "step": 4 + }, + { + "action": "validate_external_action", + "step": 5 + }, + { + "action": "execute_external_action", + "step": 6 + }, + { + "action": "verify_result", + "step": 7 + }, + { + "action": "recovery_path_registered", + "step": 8 + } + ] +} diff --git a/fixtures/mcp_trace_replay_v1/README.md b/fixtures/mcp_trace_replay_v1/README.md new file mode 100644 index 0000000..dfa8c7d --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/README.md @@ -0,0 +1,3 @@ +# mcp_trace_replay_v1 + +Deterministic fixture for mcp_trace_replay (baseline). diff --git a/fixtures/mcp_trace_replay_v1/expected/admissibility.json b/fixtures/mcp_trace_replay_v1/expected/admissibility.json new file mode 100644 index 0000000..6f943d7 --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/expected/admissibility.json @@ -0,0 +1,13 @@ +{ + "fixture_id": "mcp_trace_replay_v1", + "fixture_version": "1.0.0", + "expected_admissible": true, + "must_hold_contracts": [ + "capability_boundary_respected", + "dependency_chain_preserved", + "recovery_path_available", + "tool_call_order_preserved", + "validation_before_unsafe_action" + ], + "expected_failure_labels": [] +} diff --git a/fixtures/mcp_trace_replay_v1/expected/failures.json b/fixtures/mcp_trace_replay_v1/expected/failures.json new file mode 100644 index 0000000..39a2d14 --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/expected/failures.json @@ -0,0 +1,14 @@ +{ + "expected_failures": [], + "allowed_failures": [ + "ORPHAN_DEPENDENCY", + "DETACHED_DEPENDENCY", + "GRAPH_FRAGMENTATION", + "TEMPORAL_ORDER_VIOLATION" + ], + "disallowed_failures": [ + "CYCLE_INTRODUCED", + "REPLAY_NON_REPRODUCIBLE", + "ARTIFACT_INTEGRITY_VIOLATION" + ] +} diff --git a/fixtures/mcp_trace_replay_v1/original/contracts/capability_boundary_respected.json b/fixtures/mcp_trace_replay_v1/original/contracts/capability_boundary_respected.json new file mode 100644 index 0000000..f10b6e4 --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/original/contracts/capability_boundary_respected.json @@ -0,0 +1,9 @@ +{ + "contract_id": "capability_boundary_respected", + "layer": "relational", + "type": "invariant", + "definition": { + "rule": "no_orphan_dependencies" + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_v1/original/contracts/dependency_chain_preserved.json b/fixtures/mcp_trace_replay_v1/original/contracts/dependency_chain_preserved.json new file mode 100644 index 0000000..155afe2 --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/original/contracts/dependency_chain_preserved.json @@ -0,0 +1,22 @@ +{ + "contract_id": "dependency_chain_preserved", + "layer": "relational", + "type": "causality", + "definition": { + "required_causal_edges": [ + [ + "capability_scope_checked", + "validate_external_action" + ], + [ + "validate_external_action", + "execute_external_action" + ], + [ + "execute_external_action", + "verify_result" + ] + ] + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_v1/original/contracts/recovery_path_available.json b/fixtures/mcp_trace_replay_v1/original/contracts/recovery_path_available.json new file mode 100644 index 0000000..eb3ac8a --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/original/contracts/recovery_path_available.json @@ -0,0 +1,13 @@ +{ + "contract_id": "recovery_path_available", + "layer": "relational", + "type": "reachability", + "definition": { + "from": "execute_external_action", + "to": [ + "recovery_path_registered" + ], + "min_paths": 1 + }, + "severity": "HIGH" +} diff --git a/fixtures/mcp_trace_replay_v1/original/contracts/tool_call_order_preserved.json b/fixtures/mcp_trace_replay_v1/original/contracts/tool_call_order_preserved.json new file mode 100644 index 0000000..d9468cb --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/original/contracts/tool_call_order_preserved.json @@ -0,0 +1,16 @@ +{ + "contract_id": "tool_call_order_preserved", + "layer": "operational", + "type": "ordering", + "definition": { + "required_sequence": [ + "capability_scope_checked", + "tool_schema_validated", + "read_context", + "validate_external_action", + "execute_external_action", + "verify_result" + ] + }, + "severity": "CRITICAL" +} diff --git a/fixtures/mcp_trace_replay_v1/original/contracts/validation_before_unsafe_action.json b/fixtures/mcp_trace_replay_v1/original/contracts/validation_before_unsafe_action.json new file mode 100644 index 0000000..f637b94 --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/original/contracts/validation_before_unsafe_action.json @@ -0,0 +1,12 @@ +{ + "contract_id": "validation_before_unsafe_action", + "layer": "operational", + "type": "ordering", + "definition": { + "required_sequence": [ + "validate_external_action", + "execute_external_action" + ] + }, + "severity": "CRITICAL" +} diff --git a/fixtures/mcp_trace_replay_v1/original/dependency_graph.json b/fixtures/mcp_trace_replay_v1/original/dependency_graph.json new file mode 100644 index 0000000..f2d8fc1 --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/original/dependency_graph.json @@ -0,0 +1,132 @@ +{ + "graph_version": "1.0", + "nodes": [ + { + "node_id": "system_start", + "label": "System start", + "metadata": { + "phase": "system" + } + }, + { + "node_id": "user_request_received", + "label": "User request received", + "metadata": { + "phase": "intake" + } + }, + { + "node_id": "capability_scope_checked", + "label": "Capability scope checked", + "metadata": { + "phase": "governance" + } + }, + { + "node_id": "tool_schema_validated", + "label": "Tool schema validated", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "read_context", + "label": "Read context", + "metadata": { + "phase": "context" + } + }, + { + "node_id": "validate_external_action", + "label": "Validate external action", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "execute_external_action", + "label": "Execute external action", + "metadata": { + "phase": "execution" + } + }, + { + "node_id": "verify_result", + "label": "Verify result", + "metadata": { + "phase": "verification" + } + }, + { + "node_id": "recovery_path_registered", + "label": "Recovery path registered", + "metadata": { + "phase": "recovery" + } + } + ], + "edges": [ + { + "source": "system_start", + "target": "user_request_received", + "relation": "TEMPORAL", + "metadata": {} + }, + { + "source": "user_request_received", + "target": "capability_scope_checked", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "tool_schema_validated", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "tool_schema_validated", + "target": "read_context", + "relation": "DATA_FLOW", + "metadata": {} + }, + { + "source": "read_context", + "target": "validate_external_action", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "validate_external_action", + "target": "execute_external_action", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "verify_result", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "recovery_path_registered", + "relation": "RECOVERY", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "execute_external_action", + "relation": "BLOCKER", + "metadata": { + "state": "enforced" + } + }, + { + "source": "capability_scope_checked", + "target": "validate_external_action", + "relation": "CAUSAL", + "metadata": {} + } + ] +} diff --git a/fixtures/mcp_trace_replay_v1/original/state.json b/fixtures/mcp_trace_replay_v1/original/state.json new file mode 100644 index 0000000..19995c3 --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/original/state.json @@ -0,0 +1,4 @@ +{ + "state_version": "1.0", + "entities": {} +} diff --git a/fixtures/mcp_trace_replay_v1/original/trace.json b/fixtures/mcp_trace_replay_v1/original/trace.json new file mode 100644 index 0000000..0eb1904 --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/original/trace.json @@ -0,0 +1,36 @@ +{ + "events": [ + { + "action": "user_request_received", + "step": 1 + }, + { + "action": "capability_scope_checked", + "step": 2 + }, + { + "action": "tool_schema_validated", + "step": 3 + }, + { + "action": "read_context", + "step": 4 + }, + { + "action": "validate_external_action", + "step": 5 + }, + { + "action": "execute_external_action", + "step": 6 + }, + { + "action": "verify_result", + "step": 7 + }, + { + "action": "recovery_path_registered", + "step": 8 + } + ] +} diff --git a/fixtures/mcp_trace_replay_v1/reconstructed/dependency_graph.json b/fixtures/mcp_trace_replay_v1/reconstructed/dependency_graph.json new file mode 100644 index 0000000..f2d8fc1 --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/reconstructed/dependency_graph.json @@ -0,0 +1,132 @@ +{ + "graph_version": "1.0", + "nodes": [ + { + "node_id": "system_start", + "label": "System start", + "metadata": { + "phase": "system" + } + }, + { + "node_id": "user_request_received", + "label": "User request received", + "metadata": { + "phase": "intake" + } + }, + { + "node_id": "capability_scope_checked", + "label": "Capability scope checked", + "metadata": { + "phase": "governance" + } + }, + { + "node_id": "tool_schema_validated", + "label": "Tool schema validated", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "read_context", + "label": "Read context", + "metadata": { + "phase": "context" + } + }, + { + "node_id": "validate_external_action", + "label": "Validate external action", + "metadata": { + "phase": "validation" + } + }, + { + "node_id": "execute_external_action", + "label": "Execute external action", + "metadata": { + "phase": "execution" + } + }, + { + "node_id": "verify_result", + "label": "Verify result", + "metadata": { + "phase": "verification" + } + }, + { + "node_id": "recovery_path_registered", + "label": "Recovery path registered", + "metadata": { + "phase": "recovery" + } + } + ], + "edges": [ + { + "source": "system_start", + "target": "user_request_received", + "relation": "TEMPORAL", + "metadata": {} + }, + { + "source": "user_request_received", + "target": "capability_scope_checked", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "tool_schema_validated", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "tool_schema_validated", + "target": "read_context", + "relation": "DATA_FLOW", + "metadata": {} + }, + { + "source": "read_context", + "target": "validate_external_action", + "relation": "PREREQUISITE", + "metadata": {} + }, + { + "source": "validate_external_action", + "target": "execute_external_action", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "verify_result", + "relation": "CAUSAL", + "metadata": {} + }, + { + "source": "execute_external_action", + "target": "recovery_path_registered", + "relation": "RECOVERY", + "metadata": {} + }, + { + "source": "capability_scope_checked", + "target": "execute_external_action", + "relation": "BLOCKER", + "metadata": { + "state": "enforced" + } + }, + { + "source": "capability_scope_checked", + "target": "validate_external_action", + "relation": "CAUSAL", + "metadata": {} + } + ] +} diff --git a/fixtures/mcp_trace_replay_v1/reconstructed/state.json b/fixtures/mcp_trace_replay_v1/reconstructed/state.json new file mode 100644 index 0000000..19995c3 --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/reconstructed/state.json @@ -0,0 +1,4 @@ +{ + "state_version": "1.0", + "entities": {} +} diff --git a/fixtures/mcp_trace_replay_v1/reconstructed/trace.json b/fixtures/mcp_trace_replay_v1/reconstructed/trace.json new file mode 100644 index 0000000..0eb1904 --- /dev/null +++ b/fixtures/mcp_trace_replay_v1/reconstructed/trace.json @@ -0,0 +1,36 @@ +{ + "events": [ + { + "action": "user_request_received", + "step": 1 + }, + { + "action": "capability_scope_checked", + "step": 2 + }, + { + "action": "tool_schema_validated", + "step": 3 + }, + { + "action": "read_context", + "step": 4 + }, + { + "action": "validate_external_action", + "step": 5 + }, + { + "action": "execute_external_action", + "step": 6 + }, + { + "action": "verify_result", + "step": 7 + }, + { + "action": "recovery_path_registered", + "step": 8 + } + ] +} diff --git a/tests/test_fixture_manifest.py b/tests/test_fixture_manifest.py index 7118543..56e910d 100644 --- a/tests/test_fixture_manifest.py +++ b/tests/test_fixture_manifest.py @@ -19,6 +19,10 @@ "cross_domain_operational_dependency_workflow_mild_v1", "cross_domain_operational_dependency_workflow_moderate_v1", "cross_domain_operational_dependency_workflow_degraded_v1", + "mcp_trace_replay_v1", + "mcp_trace_replay_mild_v1", + "mcp_trace_replay_moderate_v1", + "mcp_trace_replay_degraded_v1", ] diff --git a/tests/test_multi_family_admissibility_artifact.py b/tests/test_multi_family_admissibility_artifact.py index 382f699..d4dfd79 100644 --- a/tests/test_multi_family_admissibility_artifact.py +++ b/tests/test_multi_family_admissibility_artifact.py @@ -10,7 +10,7 @@ ARTIFACT_PATH = Path("artifacts/multi_family_admissibility_results.json") SINGLE_FAMILY_ARTIFACT_PATH = Path("artifacts/layered_admissibility_results.json") -EXPECTED_FAMILIES = ["coding_workflow_pr_review", "cross_domain_operational_dependency_workflow", "incident_response_page_triage"] +EXPECTED_FAMILIES = ["coding_workflow_pr_review", "cross_domain_operational_dependency_workflow", "incident_response_page_triage", "mcp_trace_replay"] EXPECTED_LEVEL_ORDER = ["baseline", "mild", "moderate", "severe"] MANIFEST_PATH = Path("fixtures/manifest.json")