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
13 KiB
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:
- Informedness as a measurable property (what was presented, highlighted, opened, attested).
- A disposition vocabulary richer than approve/reject.
- Cryptographic binding of presentation to act (dynamic linking), not only of file to identity.
- 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
- One object, many depths. Login and treaty share a schema.
- Presentation is part of the signed payload.
- Competence before convenience. Routing follows mandate.
- Return is success, not failure.
- Dialogue stays on the object. Side-channel email is an anti-pattern.
- Binding level is explicit. Kenntnisnahme ≠ Mitzeichnung ≠ QES.
- Evidence is an export, not a screenshot.
- Least privilege of attention. Highlights first; full packet available; no dark patterns.
- Identity is imported (SSO, passkeys, eID, EUDI Wallet, QTSP).
- Humans bind. Agents draft.
Later addition that is now first-class:
- 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.
bindingis signed;awarenessis not, unlesspromotecopied named fields intoawareness_promoted.- Hats are not scopes.
requires_new_bindorhat.elevatesmeans 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)ifelevates=false- switching to a tenant with
requires_new_bind=trueopens 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 stamps 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 inavailable_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:
- Shuffling object keys does not change hashes.
- Editing awareness fields does not change
view_hash. - Changing
binding.targetACME → Beta does changeview_hash. - Selecting a hat after login emits
session.hat_selectedand does not rewriteview_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)
- Beachhead buyer: German public-sector Schriftgut, platform-eng ADR+PAM, or mid-market contract?
- Product vs protocol? Long game is both (Decision Memo + Evidence Bundle + Disposition verbs in front of IdP, Git, and e-sign).
- How to evidence “informed” without surveillance theater — hash of presented view + explicit highlight ack, not keystroke analytics.
- Mandate graph: without a living map of who may bind what, escalate is just forwarding.
- Liability of highlights: legally the whole instrument is bound; the UI must make that unmistakable.
- Retention / qualified archive for L4+.
- 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:
- Embeddable L0 login/elevation component in front of an IdP or PAM.
- L2 ADR accept with comment / return / escalate / accept and AES-optional seal.
- 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.