[
  {
    "id": "act_llm_extractor",
    "name": "LLM extractor",
    "fixture": "llm_extractor",
    "status": "EST",
    "glossary": "claim",
    "summary": "Fallback extraction. Reads one artifact slice; writes proposed claims and diagnostics only. Prompt extract-listing@5 in fixtures.",
    "responsibilities": [
      "EST|Fallback when no deterministic adapter supports the capture or it fails",
      "PROP|Every proposed claim cites a locator inside the supplied slice"
    ],
    "ownedData": [
      "PROP|None; outputs are stored by mod_extraction_normalization"
    ],
    "invariants": [
      "PROP|Output rejected unless it validates against the claim schema and each claim cites the supplied slice"
    ],
    "allowedWrites": [
      "PROP|Proposed claims + diagnostics (via mod_extraction_normalization)"
    ],
    "publicInterfaces": [],
    "internalInterfaces": [
      "PROP|ModelProvider.complete(promptId@version, input) behind an adapter"
    ],
    "sync": [],
    "async": [
      "PROP|Runs inside a fallback job"
    ],
    "tx": [
      "PROP|No database access; the calling module persists validated output"
    ],
    "failure": [
      "PROP|Invalid or uncited output → discarded, diagnostic recorded, attempt counted"
    ],
    "scaling": [
      "OPEN|Measure fallback rate and tokens per capture"
    ]
  },
  {
    "id": "act_llm_reviewer",
    "name": "LLM reviewer",
    "fixture": "llm_reviewer",
    "status": "EST",
    "glossary": "review-case",
    "summary": "Separate advisory actor attached to a durable review case. Reads case evidence, claims and candidates; writes a recommendation only. Prompt review-case@3 in fixtures.",
    "responsibilities": [
      "EST|Separate from the extractor; attached to the durable review case",
      "EST|Recommends; never decides"
    ],
    "ownedData": [
      "PROP|None; recommendation stored by mod_review"
    ],
    "invariants": [
      "EST|Its agreement with the extractor is not independent evidence"
    ],
    "allowedWrites": [
      "PROP|One recommendation + rationale per case revision attempt"
    ],
    "publicInterfaces": [],
    "internalInterfaces": [
      "PROP|ModelProvider.complete(review-case@3, caseBundle)"
    ],
    "sync": [],
    "async": [
      "PROP|Runs inside a review job"
    ],
    "tx": [
      "PROP|No database access"
    ],
    "failure": [
      "PROP|Timeout or invalid output → case stays awaiting human"
    ],
    "scaling": [
      "OPEN|Measure recommendation usefulness (human agreement is not a target metric for acceptance)"
    ]
  }
]