326 lines
13 KiB
Markdown
326 lines
13 KiB
Markdown
|
|
# informed-decision — Initial exploration
|
|||
|
|
|
|||
|
|
Working notes from the founding conversation (9 September 2026).
|
|||
|
|
Use this file plus the sibling artefacts as the project starting point.
|
|||
|
|
|
|||
|
|
Companion files:
|
|||
|
|
|
|||
|
|
| File | What it is |
|
|||
|
|
|---|---|
|
|||
|
|
| `decision-memo.schema.json` | JSON Schema draft 2020-12, object model v0.2 |
|
|||
|
|
| `decision-memo-schema.md` | Human commentary on the schema and invariants |
|
|||
|
|
| `decision-memo.example.json` | ADR accept example (L2) |
|
|||
|
|
| `decision-memo.login.example.json` | Login banner example (L0) with binding vs awareness |
|
|||
|
|
| `state-transitions.md` | Verb × status × step-kind tables |
|
|||
|
|
| `canonicalize.md` | `view_hash` / `awareness_hash` algorithm |
|
|||
|
|
| `canonicalize.py` | Reference canonicalizer |
|
|||
|
|
| `vectors/` | Binding and awareness fixtures plus expected hashes |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. Intent
|
|||
|
|
|
|||
|
|
Build **informed-decision**: a user interface for executive (and everyday) decisions modelled as a *sign-and-return book*.
|
|||
|
|
|
|||
|
|
Use cases named in the brief:
|
|||
|
|
|
|||
|
|
- logging into a system
|
|||
|
|
- authorizing an action that needs elevated privileges
|
|||
|
|
- formally accepting an ADR
|
|||
|
|
- approving a management decision you are responsible for
|
|||
|
|
- signing a business contract
|
|||
|
|
- at greatest depth: multi-party sign-off of complex international instruments
|
|||
|
|
|
|||
|
|
Required verbs on the book:
|
|||
|
|
|
|||
|
|
- present necessary context
|
|||
|
|
- add comments
|
|||
|
|
- contact the requester
|
|||
|
|
- return the memo for improvement
|
|||
|
|
- forward or escalate
|
|||
|
|
- accept electronically on the user’s identity
|
|||
|
|
- document what happened with auditability
|
|||
|
|
- establish cryptographic proof (sign the decision, stamp relevant files)
|
|||
|
|
|
|||
|
|
Spectrum:
|
|||
|
|
|
|||
|
|
- **Simplest:** commentary on a login mask — which system, which identity, which privileges.
|
|||
|
|
- **Deepest:** complex decision memos with multiple documents, highlight pointers to critical sections, multi-party sign-off.
|
|||
|
|
|
|||
|
|
The German administrative metaphor is the right one: *Umlaufmappe*, *Zeichnungsleiste*, *Mitzeichnung*, *Schlusszeichnung*, *Kenntnisnahme*, *Rücksprache*, *Bitte um Berücksichtigung*.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. Unifying insight
|
|||
|
|
|
|||
|
|
A sign-and-return book is not a document folder. It is a **portable decision object** that travels with:
|
|||
|
|
|
|||
|
|
- a question that must be answered
|
|||
|
|
- the context a reasonable decision-maker needs
|
|||
|
|
- a requested act (login, elevate, approve, accept, sign, escalate)
|
|||
|
|
- a record of what happened
|
|||
|
|
- a cryptographic binding between *identity*, *what was shown*, and *what was bound*
|
|||
|
|
|
|||
|
|
Existing product categories split that object:
|
|||
|
|
|
|||
|
|
| Category | Strength | Gap |
|
|||
|
|
|---|---|---|
|
|||
|
|
| PAM / JIT access | time-bound elevation, justification | almost no work-object context |
|
|||
|
|
| E-sign / CLM | ceremony, sealed PDFs, routing | weak “why this is on your desk” |
|
|||
|
|
| ADR tools | context / decision / consequences | “accepted” is a Git status, not an identity act |
|
|||
|
|
| Board portals | packs, votes, elite audience | too heavy for daily operational acts |
|
|||
|
|
| Digital *Umlaufmappe* (SAP, enaio, M-Files) | circulation + protocol | weak proof of *informedness*; not login-scale |
|
|||
|
|
| Decision intelligence | recommendation and policy | not the binding act |
|
|||
|
|
|
|||
|
|
White space: one object model, one evidence model, one UX grammar, from a 10-second login to a treaty.
|
|||
|
|
|
|||
|
|
The differentiator is not another workflow engine. It is:
|
|||
|
|
|
|||
|
|
1. **Informedness as a measurable property** (what was presented, highlighted, opened, attested).
|
|||
|
|
2. **A disposition vocabulary richer than approve/reject.**
|
|||
|
|
3. **Cryptographic binding of presentation to act** (dynamic linking), not only of file to identity.
|
|||
|
|
4. **Scale invariance.**
|
|||
|
|
|
|||
|
|
Research notes that belong in the backlog:
|
|||
|
|
|
|||
|
|
- eIDAS / eIDAS 2.0 / EUDI Wallet: QES becomes a mass wallet capability around 2026–27; identity should be imported, not invented.
|
|||
|
|
- Dynamic linking: the human-readable content actually presented must be bound into the signature.
|
|||
|
|
- Accountability UI (identifiability, evaluation, social presence) reduces abuse of access — relevant to the login end of the spectrum.
|
|||
|
|
- Agents may draft memos; they must not be able to complete the binding act on the principal’s surface.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. Vision and mission drafts
|
|||
|
|
|
|||
|
|
**Working vision**
|
|||
|
|
|
|||
|
|
People should never have to bind an identity to an action they could not reasonably understand. Informed-decision is the book in which that understanding is presented, contested, returned, escalated, and sealed.
|
|||
|
|
|
|||
|
|
Alternates kept:
|
|||
|
|
|
|||
|
|
- Every binding act is an informed act: the person who decides sees what matters, can send the question back, and leaves cryptographic proof of what they bound themselves to.
|
|||
|
|
- Replace the circulating folder, the login banner, and the signature page with one governed surface.
|
|||
|
|
- Make European identity useful at the moment of judgment: wallet-grade identity, qualified signatures, and an evidence pack that still answers *who decided what, having seen what*.
|
|||
|
|
|
|||
|
|
**Working mission**
|
|||
|
|
|
|||
|
|
Give every organization a reusable Decision Memo: assemble the minimum necessary context, route it to the person who actually holds the mandate, let them comment, discuss, return or escalate, and — when they accept — bind identity, presentation, and outcome into a verifiable evidence bundle.
|
|||
|
|
|
|||
|
|
**Promise**
|
|||
|
|
|
|||
|
|
Not “the file was signed.”
|
|||
|
|
“This person, in this role, was shown this view, and bound this act.”
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. Design principles
|
|||
|
|
|
|||
|
|
1. One object, many depths. Login and treaty share a schema.
|
|||
|
|
2. Presentation is part of the signed payload.
|
|||
|
|
3. Competence before convenience. Routing follows mandate.
|
|||
|
|
4. Return is success, not failure.
|
|||
|
|
5. Dialogue stays on the object. Side-channel email is an anti-pattern.
|
|||
|
|
6. Binding level is explicit. Kenntnisnahme ≠ Mitzeichnung ≠ QES.
|
|||
|
|
7. Evidence is an export, not a screenshot.
|
|||
|
|
8. Least privilege of attention. Highlights first; full packet available; no dark patterns.
|
|||
|
|
9. Identity is imported (SSO, passkeys, eID, EUDI Wallet, QTSP).
|
|||
|
|
10. Humans bind. Agents draft.
|
|||
|
|
|
|||
|
|
Later addition that is now first-class:
|
|||
|
|
|
|||
|
|
11. **Pre-sign and post-sign information are different objects.** Identity and bind-scope are committed. Hats, last-used role, and other-tenant orientation are awareness unless promoted.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. Depth spectrum
|
|||
|
|
|
|||
|
|
| Level | Act | Typical binding |
|
|||
|
|
|---|---|---|
|
|||
|
|
| L0 | Informed login / session | acknowledgment / organizational |
|
|||
|
|
| L1 | Privileged authorization (JIT) | organizational |
|
|||
|
|
| L2 | Formal ADR / decision-record accept | organizational / AES |
|
|||
|
|
| L3 | Management approval | organizational / AES |
|
|||
|
|
| L4 | Contract / instrument | AES / QES |
|
|||
|
|
| L5 | Multi-party international instrument | QES per party (horizon, not v1) |
|
|||
|
|
|
|||
|
|
v1 should prove the thesis on A+B+C sharing one object: informed login/elevation, formal ADR, one real contract type.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. Decision Memo object (v0.2)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
DecisionMemo
|
|||
|
|
├── requester / subject / parties[] + mandate
|
|||
|
|
├── question + requested_act + binding_level
|
|||
|
|
├── brief + consequences
|
|||
|
|
├── identity_context.binding PRE-SIGN identity + scope → view_hash
|
|||
|
|
├── identity_context.awareness hats, last-used, tenants → awareness_hash
|
|||
|
|
├── session POST-SIGN live hat
|
|||
|
|
├── packet[] hashed files
|
|||
|
|
├── highlights[] pointers into packet
|
|||
|
|
├── route.steps[] Laufweg / Zeichnungsleiste
|
|||
|
|
├── thread[]
|
|||
|
|
├── presentations[]
|
|||
|
|
├── dispositions[]
|
|||
|
|
├── relations[]
|
|||
|
|
└── evidence append-only hash chain
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Lifecycle:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
draft → submitted → circulating | awaiting_actor | in_discussion
|
|||
|
|
↘ returned —new version→ submitted
|
|||
|
|
↘ completed (outcome set)
|
|||
|
|
↘ withdrawn | expired
|
|||
|
|
completed —new memo→ superseded
|
|||
|
|
|
|||
|
|
L0/L1 extra: completed login/elevate → session.active → configure hats → session.ended
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Core invariants (I1–I13) live in `decision-memo-schema.md`. The ones that must not be bargained away:
|
|||
|
|
|
|||
|
|
- One question per memo.
|
|||
|
|
- Binding acts reference a presentation of the same version.
|
|||
|
|
- AES/QES dynamically links `view_hash`.
|
|||
|
|
- Required highlights must be acked before bind.
|
|||
|
|
- Agents may draft, not bind.
|
|||
|
|
- Return always carries structured reasons.
|
|||
|
|
- Highlights never shrink the legal object.
|
|||
|
|
- `binding` is signed; `awareness` is not, unless `promote` copied named fields into `awareness_promoted`.
|
|||
|
|
- Hats are not scopes. `requires_new_bind` or `hat.elevates` means a new memo (or promote + new version).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. Pre-sign vs post-sign (login / multi-tenant)
|
|||
|
|
|
|||
|
|
The login case forced a split that applies everywhere.
|
|||
|
|
|
|||
|
|
**Pre-sign / binding slice** (editable, signed)
|
|||
|
|
|
|||
|
|
- which identity you log in as (ordinary vs break-glass)
|
|||
|
|
- which scope/tenant/system you enter
|
|||
|
|
- privileges granted *at the gate*
|
|||
|
|
- monitoring and consent terms
|
|||
|
|
|
|||
|
|
**Awareness slice** (shown on the same surface, hashed separately, not signed)
|
|||
|
|
|
|||
|
|
- proposed hat after login (`last_used` | `system_default` | `policy` | `explicit`)
|
|||
|
|
- other hats available inside that bound scope
|
|||
|
|
- other tenants you support (orientation)
|
|||
|
|
- last session summary
|
|||
|
|
|
|||
|
|
**Post-sign / session**
|
|||
|
|
|
|||
|
|
- `configure(hat)` if `elevates=false`
|
|||
|
|
- switching to a tenant with `requires_new_bind=true` opens a child memo
|
|||
|
|
- an elevating hat (`Payroll Admin`) cannot be configured; it must be promoted into binding or issued as its own elevation memo
|
|||
|
|
|
|||
|
|
Banner sketch:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
PRE-SIGN (bound)
|
|||
|
|
Identity [ Bernd Worsch ▾ ]
|
|||
|
|
Scope [ ACME Corp / Payroll-Prod ▾ ]
|
|||
|
|
|
|||
|
|
AWARENESS (not signed)
|
|||
|
|
After login you will wear Finance Controller
|
|||
|
|
source: last used, Tue 18:12 CEST
|
|||
|
|
Other hats: Auditor · Payroll Admin (needs new bind)
|
|||
|
|
Other tenants: Beta GmbH (needs new bind)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Defaulting the hat to last-used is required for situational awareness and forbidden from silently entering `view_hash`.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. State transitions (summary)
|
|||
|
|
|
|||
|
|
Actors: requester, current-step assignee, any party, session subject, system, agent.
|
|||
|
|
|
|||
|
|
Overlay verbs always available in circulation: `comment`, `discuss`. Requester may `withdraw` before terminal. System `stamp`s evidence.
|
|||
|
|
|
|||
|
|
| Verb | Weak step (`inform`/`review`) | Co-sign | Bind step |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| return / forward / escalate | yes | yes | yes |
|
|||
|
|
| acknowledge | completes step | completes step | overlay |
|
|||
|
|
| accept | **illegal** | completes step | may complete memo |
|
|||
|
|
| decline | illegal | completes step/memo | completes memo `declined` |
|
|||
|
|
| configure | illegal until `session.active` | same | same |
|
|||
|
|
|
|||
|
|
`accept` on Kenntnisnahme is illegal on purpose.
|
|||
|
|
|
|||
|
|
After login/elevate bind:
|
|||
|
|
|
|||
|
|
- `configure(hat)` allowed only for non-elevating hats in `available_hats`
|
|||
|
|
- other-tenant with `requires_new_bind` → `scope.rebind_required` + child memo
|
|||
|
|
- binding verbs on a sealed version are illegal
|
|||
|
|
|
|||
|
|
Full tables, guards (`G_PRES`, `G_ACK`, `G_MAND`, `G_HAT`, …), and illegal combinations: `state-transitions.md`.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9. Canonicalization (summary)
|
|||
|
|
|
|||
|
|
Two hashes on every presentation.
|
|||
|
|
|
|||
|
|
| Hash | Input | Signed? |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `view_hash` | binding document | yes, from organizational level up |
|
|||
|
|
| `awareness_hash` | awareness document | no, unless promote ran |
|
|||
|
|
|
|||
|
|
Profile: JCS-inspired restricted JSON — UTF-8, sorted keys, no insignificant whitespace, integers only, unknown keys stripped, nulls dropped.
|
|||
|
|
|
|||
|
|
`view_hash` allow-list: `memo_id`, `memo_version`, `question`, `requested_act`, `binding_level`, `brief`, `locale`, `ui_release`, normalized `packet`, normalized `highlights`, `binding`, optional `awareness_promoted`.
|
|||
|
|
|
|||
|
|
`awareness_hash` allow-list: proposed hat + source, available hats/scopes, last session, situation note.
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
canonical = dumps(document)
|
|||
|
|
hash = SHA-256(UTF-8(canonical))
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Reference: `canonicalize.py`. Spec: `canonicalize.md`.
|
|||
|
|
|
|||
|
|
Computed vectors (`vectors/expected.json`):
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
login view_hash 492d9d311bf44ec9de0d0abef28abac7d31df2781527e8fe276a3186ee1b06b8
|
|||
|
|
login awareness_hash 2be7742970a01e7a879ae5040660659fb8c9a5c024e6c7fb338f3944a4fe05d1
|
|||
|
|
ADR-0042 view_hash 1c89ec07c3cc9d16f85a1ba1be5169456b3c55d21161f64037787779ae91f202
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Isolation that must stay green:
|
|||
|
|
|
|||
|
|
1. Shuffling object keys does not change hashes.
|
|||
|
|
2. Editing awareness fields does not change `view_hash`.
|
|||
|
|
3. Changing `binding.target` ACME → Beta does change `view_hash`.
|
|||
|
|
4. Selecting a hat after login emits `session.hat_selected` and does not rewrite `view_hash`.
|
|||
|
|
|
|||
|
|
AES/QES signed attributes carry `memo_id`, `memo_version`, `disposition.verb`, `presentation.view_hash`. They do not carry `awareness_hash` unless promote ran.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 10. Open questions (still open)
|
|||
|
|
|
|||
|
|
1. Beachhead buyer: German public-sector *Schriftgut*, platform-eng ADR+PAM, or mid-market contract?
|
|||
|
|
2. Product vs protocol? Long game is both (Decision Memo + Evidence Bundle + Disposition verbs in front of IdP, Git, and e-sign).
|
|||
|
|
3. How to evidence “informed” without surveillance theater — hash of presented view + explicit highlight ack, not keystroke analytics.
|
|||
|
|
4. Mandate graph: without a living map of who may bind what, escalate is just forwarding.
|
|||
|
|
5. Liability of highlights: legally the whole instrument is bound; the UI must make that unmistakable.
|
|||
|
|
6. Retention / qualified archive for L4+.
|
|||
|
|
7. Name: keep `informed-decision`; use *Umlaufmappe* / *Zeichnungsbuch* in DACH language.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 11. Suggested next build slice
|
|||
|
|
|
|||
|
|
Do not start at L5. Ship a thin Decision Memo runtime that already has the split hashes:
|
|||
|
|
|
|||
|
|
1. Embeddable L0 login/elevation component in front of an IdP or PAM.
|
|||
|
|
2. L2 ADR accept with comment / return / escalate / accept and AES-optional seal.
|
|||
|
|
3. One single-jurisdiction contract path.
|
|||
|
|
|
|||
|
|
If those three share this schema, the transitions, and the two hashes, the vision is real. If they fork, it is not.
|