Inbox — the human side of the decision¶
The third rung: the tenant's recent decision.* events, newest first — what needs a human. And
the disposal gesture: ack.
lm inbox # open decisions (ID, QUAND, PROCESS, MESSAGE, ENTITY_KEY)
lm inbox --limit 100 # 1..200, default 50
lm inbox --all # include disposed ones, marked [traité]
lm inbox ack 42 # dispose of decision 42
In the TUI, :inbox shows the same fold live — a acks, A toggles disposed entries.
API: GET /api/inbox?limit&all, POST /api/inbox/{id}/ack — requires the lm_user role.
An id from another tenant is a plain 404 (no cross-tenant existence leak).
The inbox is tenant-wide, not métier-scope-bound: unlike views, entities, and chat
(which refuse with the uniform 403 {"error":"scope not granted"} outside your scopes),
any lm_user of the tenant sees all its decisions. Per-métier bounding is a known
follow-up — the PWA's Décisions tab says so in its footer.
The ack IS an event¶
Acking does not update a status column — it emits annotation.decision.acked into the same
outbox as everything else. The inbox you read is a fold over the event log: a decision is
"open" if no ack event follows it. There is no separate inbox state to migrate, back up, or
drift.
Idempotent by construction: the ack event carries a dedup key (ack:<id>) with
ON CONFLICT DO NOTHING — re-acking returns the same 200 {"acked": true} and writes zero
new rows. Retry your script freely.
Retention
The inbox reads the outbox log; entries age out with the event retention window
(lumnik.events.retention-days, default 30). The inbox is a work surface, not an archive.
Decision sources¶
Two things emit into the same decision.* outbox, and the inbox does not distinguish their
origin beyond the event type:
decision.<process-name>— akind: Processreacting to a row landing.decision.dormant.<workflow-name>— akind: Workflow's dormancy sweep reacting to a row's absence of movement: a non-terminal document observed unchanged past its declared threshold. See Dormancy for the honesty vocabulary the message carries and why it never asserts a source-absolute duration.
See also¶
- Processes — where decisions come from.
- Workflows — declares what the values behind a decision mean.
- The WOW walkthrough — the whole ladder in one thread: see → react → decide, with declare underneath, grounding all three.