Jurisdiction Gate¶
Regulated advisory domains (medical, pharmaceutical, law, finance, tax) carry a shared jurisdiction capability layer so the system does not silently answer a location-sensitive question using the wrong country's rules. It lives in components/mvp/job_framework/jurisdiction.py and generalises the proven, test-pinned job_trades jurisdiction gate into one surface every regulated domain reuses.
Why this exists
A tax, medical, legal, or financial answer that is correct in the United States can be wrong — or harmful — in Australia. Treating a missing jurisdiction as a minor detail is value-destroying for these domains, so the gate routes an under-specified regulated request to review rather than answering it confidently.
What the layer provides¶
- Country normalisation.
normalise_countrymaps free-text ("Australia", "USA") and theUS-FED/US-NY/AUstylejob_taxalready uses onto a canonical code. Recognised codes:AU,US,UK,CA,NZ,IE,EU— multi-country support is preserved; the system does not assume one locale. - Per-domain AU support level (
domain_support_level). - AU authoritative sources (
au_sources_for) — reuses the grounding routing tables (no fork); returns only AU-specific corpora, or an empty tuple when there is no AU grounding to cite yet (honest, not fabricated). - "Not professional advice" disclaimers per domain family, with AU-relevant escalation references (AHPRA, practising certificate, Tax Practitioners Board, AFS licence).
- A graceful gate (
evaluate_jurisdiction) that returns aJurisdictionDecisionand never raises.
AU support levels (verified 2026-06-15 baseline)¶
| Domain | AU support | Meaning |
|---|---|---|
| tax / accounting | first_class | ATO data + AU/US switch + AU corpus |
| law / compliance / duty_of_care | partial | AU corpus routed; primary AU sources not yet wired (connectors US-only) |
| finance | partial | jurisdiction carried via attestation; US default |
| medical_surgical / pharmaceutical / psychologist / allied_health | unsupported | no AU jurisdiction layer yet |
partial and unsupported are stated honestly: a partial domain serves but flags for review and attaches AU sources; an unsupported AU request is routed to review, not answered as if AU-grounded.
Decision flow¶
evaluate_jurisdiction(domain, country, *, strict=False) mirrors the job_trades contract:
- Non-regulated domain →
allow(nothing to gate). - Missing jurisdiction on a regulated domain →
require_review(degraded=True,requires_human_review=True). - Unrecognised / unsupported jurisdiction →
require_review. - AU on an
unsupporteddomain →require_review. - AU on a
partialdomain →require_review, with AU sources attached. - AU
first_class, or any recognised non-AU country →allow(existing, e.g. US, behaviour preserved).
The decision is surfaced on the caller's existing degraded / requires_human_review / warning_card channels — it is advisory data, never an authority grant.
Operator controls¶
| Control | Env var | Behaviour |
|---|---|---|
| Gate kill switch | G6_REGULATED_JURISDICTION_GATE | Default-ON (M1/M4-activated 2026-06-15). Set to 0 / false / no / off to fully disable (byte-identical to pre-gate behaviour). |
| Default jurisdiction (Location) | G6_DEFAULT_JURISDICTION | The block-level resolution of the global Location Setting. The GUI/API layer bridges the saved Setting into this var; a regulated block falls back to it when no per-request jurisdiction is supplied. Unset → caller falls through. |
When the gate is enabled and a caller opts into strict=True, the soft require_review escalates to a hard refuse — for callers that must block rather than flag.
Not a compliance guarantee
The jurisdiction gate reduces the risk of cross-jurisdiction errors in regulated advisory output; it is not a substitute for a qualified professional, and partial / unsupported levels mean the underlying AU grounding is incomplete. Output remains general information, not professional advice.