Skip to content

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_country maps free-text ("Australia", "USA") and the US-FED / US-NY / AU style job_tax already 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 a JurisdictionDecision and 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 domainallow (nothing to gate).
  • Missing jurisdiction on a regulated domain → require_review (degraded=True, requires_human_review=True).
  • Unrecognised / unsupported jurisdictionrequire_review.
  • AU on an unsupported domainrequire_review.
  • AU on a partial domainrequire_review, with AU sources attached.
  • AU first_class, or any recognised non-AU countryallow (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.