{
  "study_id": "AM-RP-001",
  "plan_version": "0.1.0",
  "prepared_date": "2026-10-30",
  "author": "Anant Mishra",
  "synthetic": true,
  "status": "preparation_only_not_executed",
  "extends_quality_cases": [
    "AM-RP-001-Q05",
    "AM-RP-001-Q06"
  ],
  "evidence_template": "permission-evidence.template.json",
  "scope": "Proposed integration evaluation of a read-only knowledge assistant. Plan validation is not scenario execution or evidence of security effectiveness.",
  "consistency_contract": "Carry principal/tenant and relevant membership, source and ACL revisions through retrieval. Check current authorization before any model context and again before delivery. A relevant revision change abandons the affected response. Reauthorize cached answers and source downloads.",
  "principals": [
    {
      "id": "alpha_staff",
      "tenant": "alpha",
      "groups": [
        "staff"
      ]
    },
    {
      "id": "alpha_finance",
      "tenant": "alpha",
      "groups": [
        "staff",
        "finance"
      ]
    },
    {
      "id": "beta_finance",
      "tenant": "beta",
      "groups": [
        "staff",
        "finance"
      ]
    }
  ],
  "documents": [
    {
      "id": "alpha_handbook",
      "tenant": "alpha",
      "allowed_groups": [
        "staff"
      ],
      "document_version": "fictional-v1",
      "permission_version": "fictional-acl-v1",
      "marker": "SYNTHETIC-ALPHA-HANDBOOK"
    },
    {
      "id": "alpha_budget",
      "tenant": "alpha",
      "allowed_groups": [
        "finance"
      ],
      "document_version": "fictional-v1",
      "permission_version": "fictional-acl-v1",
      "marker": "SYNTHETIC-ALPHA-BUDGET"
    },
    {
      "id": "beta_budget",
      "tenant": "beta",
      "allowed_groups": [
        "finance"
      ],
      "document_version": "fictional-v1",
      "permission_version": "fictional-acl-v1",
      "marker": "SYNTHETIC-BETA-BUDGET"
    },
    {
      "id": "alpha_unclassified",
      "tenant": "alpha",
      "allowed_groups": null,
      "document_version": "fictional-v1",
      "permission_version": null,
      "marker": "SYNTHETIC-UNCLASSIFIED"
    }
  ],
  "scenarios": [
    {
      "id": "AM-RP-001-ACL01",
      "synthetic": true,
      "category": "allowed_staff_retrieval",
      "principal_id": "alpha_staff",
      "requested_document_ids": [
        "alpha_handbook"
      ],
      "operation": "retrieval",
      "fixture_setup": "Use the initial matrix and an empty answer cache.",
      "expected_result": "allow",
      "expected_model_source_ids": [
        "alpha_handbook"
      ],
      "expected_delivery_source_ids": [
        "alpha_handbook"
      ],
      "boundary_assertions": [
        "Only alpha_handbook may enter the reranker and generator.",
        "The delivered answer and citations may use only alpha_handbook."
      ],
      "execution_status": "not_run"
    },
    {
      "id": "AM-RP-001-ACL02",
      "synthetic": true,
      "category": "restricted_group_denial",
      "principal_id": "alpha_staff",
      "requested_document_ids": [
        "alpha_budget"
      ],
      "operation": "retrieval",
      "fixture_setup": "Ask specifically for Alpha's restricted budget using the staff principal.",
      "expected_result": "deny",
      "expected_model_source_ids": [],
      "expected_delivery_source_ids": [],
      "boundary_assertions": [
        "No alpha_budget text or marker enters any model context.",
        "Do not reveal a restricted title, excerpt, similarity score or citation to the principal."
      ],
      "execution_status": "not_run"
    },
    {
      "id": "AM-RP-001-ACL03",
      "synthetic": true,
      "category": "allowed_finance_retrieval",
      "principal_id": "alpha_finance",
      "requested_document_ids": [
        "alpha_budget"
      ],
      "operation": "retrieval",
      "fixture_setup": "Use the initial matrix and an empty answer cache.",
      "expected_result": "allow",
      "expected_model_source_ids": [
        "alpha_budget"
      ],
      "expected_delivery_source_ids": [
        "alpha_budget"
      ],
      "boundary_assertions": [
        "The Alpha finance principal may use alpha_budget.",
        "The reply must retain the source and permission versions used."
      ],
      "execution_status": "not_run"
    },
    {
      "id": "AM-RP-001-ACL04",
      "synthetic": true,
      "category": "cross_tenant_denial",
      "principal_id": "beta_finance",
      "requested_document_ids": [
        "alpha_budget"
      ],
      "operation": "retrieval",
      "fixture_setup": "Use Beta's finance principal; both tenants deliberately have a group named finance.",
      "expected_result": "deny",
      "expected_model_source_ids": [],
      "expected_delivery_source_ids": [],
      "boundary_assertions": [
        "The matching group name must not override the tenant boundary.",
        "No Alpha budget text, marker or citation reaches the Beta principal."
      ],
      "execution_status": "not_run"
    },
    {
      "id": "AM-RP-001-ACL05",
      "synthetic": true,
      "category": "missing_identity",
      "principal_id": null,
      "requested_document_ids": [
        "alpha_handbook"
      ],
      "operation": "retrieval",
      "fixture_setup": "Remove the verified identity from the request; a tenant named in user text supplies no authority.",
      "expected_result": "deny",
      "expected_model_source_ids": [],
      "expected_delivery_source_ids": [],
      "boundary_assertions": [
        "Do not perform retrieval under a guessed or service identity.",
        "No affected model call or answer-cache delivery occurs."
      ],
      "execution_status": "not_run"
    },
    {
      "id": "AM-RP-001-ACL06",
      "synthetic": true,
      "category": "missing_permission_metadata",
      "principal_id": "alpha_finance",
      "requested_document_ids": [
        "alpha_unclassified"
      ],
      "operation": "retrieval",
      "fixture_setup": "The document has no accepted permission metadata.",
      "expected_result": "deny",
      "expected_model_source_ids": [],
      "expected_delivery_source_ids": [],
      "boundary_assertions": [
        "Exclude the unclassified document pending policy resolution.",
        "Do not treat missing permissions as public access."
      ],
      "execution_status": "not_run"
    },
    {
      "id": "AM-RP-001-ACL07",
      "synthetic": true,
      "category": "revoked_cache_access",
      "principal_id": "alpha_finance",
      "requested_document_ids": [
        "alpha_budget"
      ],
      "operation": "answer_delivery",
      "fixture_setup": "Warm a cached budget answer while access is allowed, then remove the principal's finance membership before repeating the request.",
      "expected_result": "deny",
      "expected_model_source_ids": [],
      "expected_delivery_source_ids": [],
      "boundary_assertions": [
        "Re-evaluate current access before cached delivery.",
        "Do not deliver the prior answer, its marker or its source citations after revocation."
      ],
      "execution_status": "not_run"
    },
    {
      "id": "AM-RP-001-ACL08",
      "synthetic": true,
      "category": "mid_request_revocation",
      "principal_id": "alpha_finance",
      "requested_document_ids": [
        "alpha_budget"
      ],
      "operation": "answer_delivery",
      "fixture_setup": "Retrieve while authorized, then revoke relevant access after context assembly and before publishing the response.",
      "expected_result": "abandon",
      "expected_model_source_ids": [
        "alpha_budget"
      ],
      "expected_delivery_source_ids": [],
      "boundary_assertions": [
        "The initial context may contain alpha_budget only while access is valid.",
        "A changed authorization version abandons delivery and prevents an affected answer-cache write."
      ],
      "execution_status": "not_run"
    },
    {
      "id": "AM-RP-001-ACL09",
      "synthetic": true,
      "category": "cache_different_principal",
      "principal_id": "alpha_staff",
      "requested_document_ids": [
        "alpha_budget"
      ],
      "operation": "answer_delivery",
      "fixture_setup": "Warm the same-question answer cache as alpha_finance, then ask as alpha_staff.",
      "expected_result": "deny",
      "expected_model_source_ids": [],
      "expected_delivery_source_ids": [],
      "boundary_assertions": [
        "Prior cache generation under a different principal conveys no access.",
        "Current source permissions must block delivery to alpha_staff."
      ],
      "execution_status": "not_run"
    },
    {
      "id": "AM-RP-001-ACL10",
      "synthetic": true,
      "category": "revoked_source_download",
      "principal_id": "alpha_finance",
      "requested_document_ids": [
        "alpha_budget"
      ],
      "operation": "source_download",
      "fixture_setup": "Issue a source citation while authorized; revoke membership before opening that link or requesting the file.",
      "expected_result": "deny",
      "expected_model_source_ids": [],
      "expected_delivery_source_ids": [],
      "boundary_assertions": [
        "Reauthorize the download operation and reject it under the changed policy.",
        "Do not rely solely on the fact that a source URL was previously issued."
      ],
      "execution_status": "not_run"
    },
    {
      "id": "AM-RP-001-ACL11",
      "synthetic": true,
      "category": "authorization_unavailable",
      "principal_id": "alpha_finance",
      "requested_document_ids": [
        "alpha_budget"
      ],
      "operation": "retrieval",
      "fixture_setup": "Make the authoritative permission service unavailable in the controlled test environment.",
      "expected_result": "unavailable",
      "expected_model_source_ids": [],
      "expected_delivery_source_ids": [],
      "boundary_assertions": [
        "Return a clear access-check failure and no affected answer.",
        "No restricted retrieval, model fallback or cached delivery is permitted on an unknown decision."
      ],
      "execution_status": "not_run"
    },
    {
      "id": "AM-RP-001-ACL12",
      "synthetic": true,
      "category": "stale_index_permissions",
      "principal_id": "alpha_staff",
      "requested_document_ids": [
        "alpha_budget"
      ],
      "operation": "retrieval",
      "fixture_setup": "Give the index an old ACL that permits staff while the authoritative current policy permits finance only.",
      "expected_result": "deny",
      "expected_model_source_ids": [],
      "expected_delivery_source_ids": [],
      "boundary_assertions": [
        "A current authorization check blocks the stale candidate before any model sees its text.",
        "Do not emit the restricted candidate or similarity score in user-visible diagnostics."
      ],
      "execution_status": "not_run"
    }
  ],
  "required_evidence": [
    "application_revision",
    "fixture_hashes",
    "identity_snapshot",
    "document_and_policy_versions",
    "cache_state",
    "transition_timestamps",
    "authorization_decisions",
    "reranker_source_ids",
    "generator_source_ids",
    "answer_cache_write",
    "delivered_output_and_citations",
    "download_decision",
    "restricted_marker_observations",
    "trace_locations",
    "reviewer",
    "limitations"
  ],
  "sources": [
    "https://csrc.nist.gov/pubs/sp/800/207/final",
    "https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html",
    "https://cheatsheetseries.owasp.org/cheatsheets/RAG_Security_Cheat_Sheet.html"
  ],
  "execution_dependencies": [
    "Implemented test assistant and controlled test identities",
    "Authoritative permissions and repeatable revocation transitions",
    "Synthetic document ingestion and cache reset controls",
    "Trace capture at every relevant boundary",
    "Actual execution records and accountable review"
  ],
  "limitations": [
    "Fictional policies and expected behaviour only",
    "No identity provider, retrieval engine or model was connected",
    "No scenario has run or passed",
    "Revocation cannot recall information already read or copied",
    "No certification, production readiness or general security-effectiveness claim"
  ]
}
