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")