Where cases come from
Every case is opened by code, from what the bridge already knows.
A case carries its
key (one open case per key), source, category,
risk, title, subject (the partner, Regelzone, delivery day, message
reference the finding is about), evidence (references into what the
bridge holds already: event ids, ledger entries - never copies),
explanation (the warning’s own words), an empty proposals list (an
agent’s, from PR 4 on), a timeline, and once closed its outcome.
The outcome taxonomy
Every case closes as exactly one of five outcomes (design rule D7). The operator picks one in the inbox; code picks one when it closes a case.
A case open for more than 7 days is stale; the inbox and the summary
count them.
The inbox
The console tab Fälle shows the cases in six views, with a count per view on each button: Offen (everything not done), Freigabe (an agent’s proposal waits for a person - empty until PR 4), Für eine Person, Verbesserungen (proposed rules and corrections - empty until PR 5), Fehlgeschlagen, Erledigt. Open views sort by risk, then age; every row shows the age and marks a stale case. Per case: a note, a move to or from Für eine Person, and Erledigt with the outcome. The same over the API (scope: process):
The caller’s key name is recorded as
who on every timeline entry; cases
opened or closed by code say bridge.
Events and storage
case_opened, case_updated and case_closed go to the event log like
everything else, so the console stream shows them; they stay out of the
Slack interaction log, which already carries the warning or interaction
behind each. case_sync_failed (warning) says the partner overview could
not be read for the reconciliation; the next run tries again.
The ledger is cases.json on the audit share, next to the ledgers it
references (wiedervorlage, vertragsbefunde_gemeldet, …). It is never
pruned: closed cases are the measurement.