/ 01Supported feeds
Sentinel is a collection of source-specific pollers driving a unified change feed. The poller knows the source's authentication, pagination, and document shape; the rest of the pipeline operates on a canonical LegislativeChange.
| Source | Coverage | Transport |
|---|---|---|
| UK Parliament | Bills, legislative changes, commencement notices | REST API |
| FCA | Financial Conduct Authority enforcement, decisions | RSS + HTML scrape |
| EUR-Lex | EU directives, regulations, guidance | REST API (SPARQL) |
| ICO | Information Commissioner's Office — data protection | RSS |
| CMA | Competition and Markets Authority | RSS + HTML |
| MHRA | Medicines & Healthcare Regulatory Agency | RSS |
| BGBl | German Federal Law Gazette | REST API |
| US Congress | Bills, legislative status | REST API |
| OFSI · OFAC | Sanctions designations and removals | JSON list + diff |
| Sector feeds | FDA · EMA · ESMA · EBA · PRA | Various |
/ 02Poll schedule
The scheduler lives at apps/sentinel/worker/scheduler.py. Times are UTC.
| Cadence | Job |
|---|---|
| Daily 02:00 | UK Parliament poll |
| Daily 03:00 | France · DILA poll |
| Weekly Monday 04:00 | EUR-Lex poll |
| Weekly Monday 05:00 | BGBl poll |
| Daily 08:00 | Daily digest dispatch |
| Weekly Monday 08:30 | Weekly digest dispatch |
You can force a poll manually:
{ "source": "uk_parliament", "since": "2026-04-01" }/ 03LegislativeChange shape
The canonical event:
@dataclass class LegislativeChange: jurisdiction: str # eng | eu | de | us_federal … source: str # uk_parliament | eur_lex | fca … provision: str # e.g. "UCTA 1977 s.3" change_type: ChangeType # enacted | amended | repealed | commenced | guidance effective_date: date | None previous_text: str | None new_text: str summary: str # LLM-generated plain English affected_concepts: list[str] # keyword tags for portfolio matching
/ 04Impact assessment
For each detected change, Sentinel runs an impact assessment against your contract portfolio. Per-clause matching, severity classification, plain-English summary, suggested remediation.
severity, contract_id, jurisdiction. Returns a paginated list.Severity levels mirror Review's:
- Critical — regulatory non-compliance; immediate action
- Major — significant impact; action within days
- Minor — informational; monitoring only
- Informational — FYI
/ 05Webhook payload & signing
Webhook delivery uses HMAC-SHA256 signing. The signature is in the X-Parelion-Signature header, computed over the raw request body with the shared webhook secret.
{
"id": "evt_a1b2c3d4",
"type": "sentinel.impact.detected",
"created": "2026-04-25T13:14:15Z",
"data": {
"impact_id": "imp_...",
"contract_id": "con_...",
"clause_reference": "11.3",
"severity": "major",
"regulation": "UCTA 1977 s.3",
"change_type": "amended",
"summary": "The liability cap clause may need revision...",
"suggested_remediation": "Raise the cap to 100% of fees..."
}
}
Verification (Python):
import hmac, hashlib def verify(body: bytes, signature: str, secret: str) -> bool: expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest() return hmac.compare_digest(expected, signature)
/ 06Channels & delivery
| Channel | Config | Format |
|---|---|---|
| Per-tenant SMTP | HTML + plain text | |
| Slack | Webhook URL | Block Kit message |
| Microsoft Teams | Webhook URL | Adaptive Card |
| In-app | alert_history table | JSON |
| Webhook | Signed HTTPS POST | JSON envelope (above) |
Delivery modes are immediate, daily digest (08:00 UTC), or weekly digest (Monday 08:30 UTC). Per-user severity threshold applies before delivery.
