// Reading the shelf: Redline Fieldbook Atrium v1.8 · 2026-03
Documentation / Redline · Ledger /Ledger Concept · 22 min

The obligation extraction model.

Ledger extracts contractual obligations from executed agreements, assigns them to parties, tracks them to satisfaction, and escalates the overdue. Every obligation carries its modal verb, statutory basis, and extraction confidence.

TypeConcept
Reading22 min
Revisedv1.8 · 2026-03
Applies toRedline Ledger · tier B+

/ 01What an obligation is

In Ledger, an obligation is a structured representation of a promised action. It has a party who must perform (obligor), a party who benefits (obligee), an action, optionally a deadline, and a status that progresses through a defined lifecycle.

Obligations are extracted from contract text. They are not the same as issues from Review — Review tells you about problems; Ledger tells you about commitments. The same contract can have zero issues and many obligations.

/ 03Extraction algorithm

Extraction runs over the output of Semantic (Pass 2 of the pipeline), which has already produced deontic-tagged clauses.

  1. Candidate clauses

    Every clause with a deontic verb above confidence threshold becomes a candidate.

  2. Negation analysis

    The classifier inspects the dependency graph for negation operators in scope. "The Provider shall not disclose..." is a prohibition, not an obligation, and is routed to a separate prohibition extractor.

  3. Party identification

    Subject of the modal verb becomes the obligor. Beneficiary identified from dependents and named-entity recognition.

  4. Deadline extraction

    Temporal expressions in the same clause are parsed with the dates extractor; relative deadlines ("within 30 days of...") are resolved against the contract's signature date.

  5. Confidence scoring

    Composite of deontic confidence, party-resolution confidence, and deadline-parse confidence. Below silo threshold (default 0.65) the obligation is held in a verification queue.

/ 04Lifecycle states

/ 01PendingExtracted; deadline in the future or unset
/ 02UpcomingWithin the warning window (default 7 days)
/ 03OverduePast deadline; escalation engine engaged
/ 04SatisfiedPerformed; evidence attached
/ 05WaivedReleased by the obligee with audit
/ 06SupersededReplaced by an amendment or successor obligation

State transitions emit ObligationEvent records with actor, timestamp, old → new state, and free-text notes. The event log is append-only.

/ 05Schema

@dataclass
class Obligation:
    id: str
    contract_id: str
    clause_reference: str        # "11.3" — source clause
    obligor: str                  # party who must perform
    obligee: str                  # party who benefits
    action: str                   # what must be done
    deadline: date | None
    recurrence: str | None        # RRULE-style if periodic
    status: ObligationStatus
    assignee_id: str | None
    statutory_basis: str | None
    modal_verb: str               # shall | must | should | may
    severity: str
    extraction_confidence: float   # 0.0 – 1.0
    manually_verified: bool
    evidence_required: str | None
    dependency_ids: list[str]    # obligations this depends on

/ 06Escalation engine

Overdue obligations are escalated through a configurable multi-tier path. The default policy:

Days overdueTierNotify
0–21 · Team leadAssignee + team lead, email + Slack
3–62 · ManagerManager added, daily digest
7–133 · LegalLegal team CC'd, immediate alert
14+4 · ExecutiveExec sponsor; written breach analysis attached

Financial exposure weighting promotes obligations one tier when monetary value exceeds the silo's exposure_threshold. Per-obligation policies can override the default ladder.

/ 07iCal calendar feed

Every silo exposes a calendar feed at:

GET/api/ledger/v1/calendar.icsVCALENDAR feed; 90 days ahead by default. Ingestible by Outlook, Google Calendar, Apple Calendar, Fantastical.

The feed is signed with a per-user token in the URL; revoking the token invalidates the feed immediately. Each event is a VEVENT with the obligation ID in UID, so updates from Ledger propagate as updates in the user's calendar rather than duplicate entries.

Read carefully. Then begin.

Request access Back to documentation