- Extended `AuthorityFrontier.DISCOVERY_STATE_CHOICES` (`opencontractserver/annotations/models.py`) with three Phase-4 gate outcomes: `"blocked_license"` (license not public-domain), `"unlocated"` (fetched text did not verify against the requested key), and `"pending_approval"` (found, awaiting human approval). All fit within the existing `max_length=32`.
- Generated migration `0088_authorityfrontier_gate_states` (choices-only AlterField, DB no-op).
- Extended `AuthorityFrontierService.mark()` (`opencontractserver/enrichment/services/authority_frontier_service.py`) with a `candidate_record: dict | None = None` keyword argument. When provided, it appends the record to `row.candidate_sources` (append-only audit trail; earlier attempts are never overwritten) and includes `"candidate_sources"` in `update_fields`.
- Added tests in `opencontractserver/tests/test_authority_frontier.py`: append-only audit trail, no-op when `candidate_record` is omitted, and acceptance of the three new `discovery_state` values.
