informed-decision/history/20260909-initial-exploration/InitialExploration.md

326 lines
13 KiB
Markdown
Raw Normal View History

Establish INTENT, Stage 1 GOAL, and founding workplan Claim ownership of the browser-facing approver UI that approval-engine deliberately does not contain. approval-engine's INTENT names an approvals inbox under Non-Goals, and docs/keycape-service-registrations.md records that the human approver client's client_id and callback URI "must come from its owner once it exists" — leaving key-cape's KEY-WP-0013-T02 blocked on an unassigned component. - INTENT.md: Decision Memo concept, the binding/awareness split and the two hashes, ownership and non-ownership against the named estate repositories, and a provisional PEP-shaped layer placement flagged for a gate-house ruling rather than asserted. - GOAL.md: Stage 1 is the L3 approval approver surface — the narrowest real consumer with a live blocking dependency — plus the written answer to who owns the approver UI. - workplans/INFD-WP-0001: founding documents, the gate-house layer/ownership ruling, the four specs (PRD, UseCaseCatalog, ArchitectureBlueprint, EvidenceModel), schema and canonicalizer promotion out of history/ with the isolation vectors under test, the key-cape client registration, and a walking skeleton that includes return and discuss. history/ is preserved unmodified as provenance. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V3W1dQG7GFFM9d94jFx7iR Assistant: claude-code Assistant-Model: opus Assistant-Process: 1565372@bnt-lap001 Assistant-Session: 16bb2f25-b34c-49ef-8e94-5fec3567a568
2026-09-09 10:47:36 +02:00
# 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 users 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 202627; 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 principals 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 (I1I13) 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.