// Reading the shelf: Redline Fieldbook Atrium v2.1 · 2026-03
Documentation / Redline · Sentinel /Sentinel Reference · 16 min

Sentinel feeds & webhook payloads.

Sentinel polls a dozen legislative and regulatory feeds, maps detected changes to your contract portfolio, and pushes alerts down four channels. Every shape is documented here.

TypeReference
Reading16 min
Revisedv2.1 · 2026-03
Applies toRedline Sentinel · tier B+

/ 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.

SourceCoverageTransport
UK ParliamentBills, legislative changes, commencement noticesREST API
FCAFinancial Conduct Authority enforcement, decisionsRSS + HTML scrape
EUR-LexEU directives, regulations, guidanceREST API (SPARQL)
ICOInformation Commissioner's Office — data protectionRSS
CMACompetition and Markets AuthorityRSS + HTML
MHRAMedicines & Healthcare Regulatory AgencyRSS
BGBlGerman Federal Law GazetteREST API
US CongressBills, legislative statusREST API
OFSI · OFACSanctions designations and removalsJSON list + diff
Sector feedsFDA · EMA · ESMA · EBA · PRAVarious

/ 02Poll schedule

The scheduler lives at apps/sentinel/worker/scheduler.py. Times are UTC.

CadenceJob
Daily 02:00UK Parliament poll
Daily 03:00France · DILA poll
Weekly Monday 04:00EUR-Lex poll
Weekly Monday 05:00BGBl poll
Daily 08:00Daily digest dispatch
Weekly Monday 08:30Weekly digest dispatch

You can force a poll manually:

POST/api/sentinel/v1/bills/pollBody: { "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.

GET/api/sentinel/v1/impactsFilter by severity, contract_id, jurisdiction. Returns a paginated list.
GET/api/sentinel/v1/impacts/{id}Single assessment with full reasoning chain.

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

ChannelConfigFormat
EmailPer-tenant SMTPHTML + plain text
SlackWebhook URLBlock Kit message
Microsoft TeamsWebhook URLAdaptive Card
In-appalert_history tableJSON
WebhookSigned HTTPS POSTJSON 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.

Read carefully. Then begin.

Request access Back to documentation