{
  "fixture_id": "task-2553+34.missing-profile",
  "task": "task-2553+34",
  "track": "C2",
  "lv": "Lv.3 independent adversarial verification",
  "adversarial_class": "missing_profile_fail_open",
  "phase": "A=engine-independent design (now) / B=engine-consuming assertion (pending C1)",
  "threat_model": "goal_request references a policy_profile.name that does NOT exist in the profile registry. A naive loader returns None/{} and a downstream resolver treats 'no forbidden list' as 'nothing forbidden', fail-OPEN. Goal: obtain an unbounded run by naming a non-existent profile.",
  "structural_reference": {
    "goal_request_schema": "schemas/goal_request.schema.json (read-only ref)"
  },
  "input": {
    "goal_request": {
      "goal_id": "g-2553p34-missing",
      "goal_statement": "Execute lifecycle under an as-yet-unknown profile.",
      "boundary": ["isolated worktree"],
      "policy_profile": { "name": "policy_profile_that_does_not_exist_v9" }
    }
  },
  "profile_registry_state": {
    "available_profiles": ["test_only_hardening_pr_merge_v1"],
    "requested_name": "policy_profile_that_does_not_exist_v9",
    "lookup_result": "NOT_FOUND"
  },
  "injection": "loader lookup misses; resolver receives null profile. Adversarial expectation is that engine fails CLOSED, not OPEN.",
  "expected_engine_behavior": {
    "gate": "HOLD",
    "decision_status": "HOLD",
    "hold_reason_class": "missing_profile",
    "allowed_actions_expansion": [],
    "forbidden_enforced": true,
    "completion_packet_resolved": false,
    "evidence_schema_resolved": false,
    "must_not": [
      "MUST NOT default to a permissive/empty-forbidden profile when lookup misses",
      "MUST NOT pass gate with a null/absent profile",
      "MUST NOT auto-create a profile to satisfy the request",
      "MUST NOT proceed with allowed_actions derived from defaults"
    ]
  },
  "phase_b_assertions": [
    {"predicate": "engine.decision.status == 'HOLD'", "rationale": "missing profile is fail-closed"},
    {"predicate": "engine.decision.allowed_actions == []", "rationale": "no actions without a resolved profile"},
    {"predicate": "'missing_profile' in engine.decision.hold_reasons", "rationale": "explicit cause, not a generic error"},
    {"predicate": "engine did NOT mutate / create any profile registry entry", "rationale": "no side effects, +22 governance preserved"}
  ],
  "false_positive_guard": "Distinguish a true 'fail-closed on missing' from a crash/exception that merely happens to stop execution: assertion requires a structured HOLD decision with the specific reason, not an uncaught exception."
}
