informed-decision/workplans/INFD-WP-0010-present-existing-and-proportionate-decisions.md
tegwick 83fd105465 INFD-WP-0010-T02: record the founder-run present-existing release (2026-11-01)
The founder ran the release:
- access-engine compact-sitting v14 (Helm revision 14) first, then Argo
  005709a: image ca75f0be, runtime ConfigMap b488b96a0953
- backup ed4469e7, held off-cluster
- health and readiness 200; private routes 404 on the public origin
- store counts unchanged, and an existing memo loaded under v14
- executor-identity probe 503 approval_unreadable; sso/default probe 403
  submitter_unknown

T02 stays open until the executor's present-existing memo is accepted at aal2 and
consumed (NK-WP-0056 pilot).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 5502@bnt-lap001
Assistant-Session: 68b3b02f-5d0f-4e71-8421-796f62e50196
2026-11-01 14:40:35 +01:00

12 KiB
Raw Blame History

id type title domain repo status owner topic_slug created updated flavor depends_on related state_hub_workstream_id
INFD-WP-0010 workplan Present existing approvals, proportionate C1 confirm and hub write-back infotech informed-decision active claude-code netkingdom 2026-10-31 2026-11-01 implementation
NK-WP-0056
INFD-WP-0005
APPROVAL-WP-0007
STATE-WP-0096
STATE-WP-0101
d1363acf-35c2-56ce-be1b-ecebd15b5253

INFD-WP-0010: present existing approvals, proportionate decisions

Owner answer to net-kingdom's decision services alignment review (2026-10-31): see docs/decision-services-alignment-answer.md. Founder direction: informed-decision is the one human-facing decision surface. It should be light for simple decisions and complete for risky ones, and its split with approval-engine should be explicit: approval-engine holds the object, created by the actor who uses it, and informed-decision presents it and records the human's act.

Founder decisions, 2026-11-01

Relayed by the net-kingdom coordinator on 2026-11-01 (quoted as relayed):

  1. gate-house GH-DEC-2026-026 accepted as drafted. Decision classes C0–C3; a decision is at least C2 when anyone relies on it as authority for an act its standing mandate doesn't cover; C3 reserved; the actor that files a C2 approval may never approve it; agents never approve at C1+. Unblocks: S4's doctrine dependency (T03) and the founder's answer on class cuts. Consequences here: informed-decision still does not decide a class (the poser declares it, gate-house owns the doctrine); a C1 confirm is never authority for an unmandated act, because such reliance makes the decision C2 by definition, so a C1 confirm needs no approval object; only human dispositions bind (already enforced: agent and service actors cannot resolve). S1 already satisfies "filer never approves": the executor files the approval as service:nk-bind-executor and only a human enters it.
  2. State Hub write-back is a pull. State Hub's existing STATE-WP-0096 dispatch worker fetches decision outcomes from informed-decision; informed-decision gets no hub credential. state-hub needs an outcome read returning informed-decision.decision-outcome v1 (fields: state-hub docs/decision-services-alignment-answer.md §5.2). informed-decision's hub write-back is switched on once STATE-WP-0101 lands. Unblocks / re-scopes: S3 (T04 re-scoped to the outcome read; T05 enablement; T06 retirement of the push path). INFD_HUB_WRITEBACK (push) stays off: it has no credential to use under this decision.
  3. access-engine (review policy for requester service:nk-bind-executor) and key-cape (approval:read for informed-decision-sitting-requester) are being asked by separate workers. Affects T02 and T03; nothing changes here until they answer.

S1: present_existing intake profile

id: INFD-WP-0010-T01
status: done
priority: high
state_hub_task_id: "6e5fe18d-c59f-5abd-ab2d-4e0b738743a9"

A registered submitter's profile present_existing (approval_actor, actions) lets it pose a memo that pins an approval it created itself. Intake GETs the approval and verifies: status requested, no entries, human_control, actor == profile actor, digest == memo, binding == intent, required_count 1, not expired, one memo per approval. It never creates, enters or consumes. The recorded requester flows to review and to the access-engine context. Existing submitters are unchanged.

Done 2026-10-31 (local): code in intake.py, intake_service.py, intake_approval.py, requester.py, store.py; tests in tests/test_intake_present_existing.py. Not deployed.

S1 live enablement for nk-bind-executor

id: INFD-WP-0010-T02
status: wait
priority: high
depends_on: [INFD-WP-0010-T01]
state_hub_task_id: "6c522bcb-5581-5062-a1e4-7e2af6dabcfd"

Waiting on owners outside this repository:

  • access-engine: a compact-sitting version that admits approval_requester service:nk-bind-executor for submitter nk-bind-executor and class bounded-execution, at aal2 (v13 requires informed-decision);
  • key-cape: approval:read on informed-decision-sitting-requester;
  • net-kingdom: an executor projected token with audience informed-decision-intake, and a NetworkPolicy to the private listener.

2026-11-01: access-engine prepared compact-sitting v14 (2de0f86, sha256:8911458f36f1a60598aa19592a2d752a74dffe2617fd86238407ac87bc300fde); informed-decision now sends approval_action for present-existing memos and rechecks the live binding.action (commit 80ef840). key-cape prepared approval:read (82b471f, source only); the sitting-requester checks here now refuse only approve and consume (commit 12311d1). The v14 pin is not in the candidate files: by this repo's release convention the pin moves together with the image in the founder-run release commit.

2026-11-01, release candidate (founder approval relayed by the net-kingdom coordinator). KeyCape approval:read is live (key-cape 82b471f, hub decision 21a557a9). Candidate files now carry the v14 pin (admission.candidate.json, re-rendered service.candidate.json; runtime ConfigMap …b488b96a0953), the system:serviceaccount:sso:nk-bind-executor present_existing row (bounded-execution, net-kingdom-admins, daily limit 10), and an 8081 ingress peer for exactly sso + app.kubernetes.io/name=bounded-executor. The state-hub row is unchanged and outcome_read stays off (T05). The founder runbook covers the order relative to access-engine v14, verification (including the side-effect-free tools/present_existing_probe.py) and rollback to Argo 312ab97 / Helm revision 13: deploy/lifecycle/RELEASE-INFD-WP-0010-T02.md. Tests: 704 passed, 83 skipped (.venv). Blocked on the image: no owner CI workflow builds the full service image. Only the policy.py and zlib overlay workflows exist; purpose-overlay run 5 failed by design on the changed policy.py hash. The image pin is therefore still the live f5588f49…, and the candidate must not be synced until the pin is replaced by an owner-CI full image that keeps zlib ≥ 1.3.2-r1. Nothing applied. Same day, step 0 in source: .forgejo/workflows/service-image.yaml builds the full image from the pushed commit and publishes main-<short sha>. The Containerfile builds the wheel in-image and installs the overlay's hash-pinned zlib-1.3.2-r1 offline, failing the build below 1.3.2-r1. A local build passed 13/13 container checks. The image pin waits for the digest from CI. Image pinned (2026-11-01): CI run 6 published main-c228583 = sha256:ca75f0be03af0bd96a66b08d2949bdc2d16365a93ffabcd6593074b565e8f01b. Verified read-only:

  • zlib 1.3.2-r1 (and the floor check passes)
  • installed modules equal the source at c228583
  • 13/13 container checks
  • Trivy 0 HIGH/CRITICAL; 2 UNKNOWN in musl, the same as live

It is pinned in admission.candidate.json and service.candidate.json. The runtime ConfigMap is unchanged (…b488b96a0953). The pin commit is RELEASE_SHA. The release itself is founder-run. Released 2026-11-01 (founder-run).

  • access-engine compact-sitting v14 (Helm revision 14) went first, then Argo 005709a: image ca75f0be…, ConfigMap …b488b96a0953.
  • The backup is sha256 ed4469e7…, held off-cluster.
  • healthz and readyz return 200, and the private routes return 404 on the public origin.
  • The counts are unchanged (20/70/0, 472, 48), and an existing memo loaded for the founder under v14.
  • The executor-identity probe returned 503 approval_unreadable (random id); the sso/default probe returned 403 submitter_unknown.
  • The executor's egress to 8081 is live.

Evidence: docs/evidence/2026-11-01-present-existing-release/release.json. Still open, per done-when: the founder's aal2 accept of an executor-created approval and the executor's consume (NK-WP-0056 pilot). T02 stays wait.

Then here: the policy pin, a registry row, a release, and a native proof with synthetic BEA content. Optional: for bounded-execution, require a packet item whose digest equals target.admission_digest, once the admission digest's canonical form is confirmed.

Done when: a founder aal2 accept of an executor-created approval is recorded, and the executor consumes it.

S4: C1 single-screen confirm

id: INFD-WP-0010-T03
status: wait
priority: medium
state_hub_task_id: "0b3750f5-47c3-5874-bebb-7ebab385a3df"

A lighter memo profile with one question, one packet item, one required highlight and options. It needs a fresh aal1 session and creates no approval object. It records view_hash and disposition and resolves the served hub decision (through T04's outcome read).

Blockers after the 2026-11-01 founder decisions: the gate-house doctrine (GH-DEC-2026-026) and the class cuts are settled. The only remaining external blocker is access-engine policy work: a review-policy action for a confirm without an approval object (today review refuses missing_act_binding), at aal1 for C1. The C1 profile's own design (how the poser declares the class at intake, and refusing C2+ on this profile) is in-repo work for when the task starts. Not started by decision: implement after access-engine answers.

Done when: a C1 decision is confirmed in the browser and resolves its hub decision with evidence. No approval object is created.

S3: decision outcome read for State Hub's pull (re-scoped 2026-11-01)

id: INFD-WP-0010-T04
status: done
priority: medium
state_hub_task_id: "8c649193-f274-5463-9897-7010a5bb4a9d"

Re-scoped by founder decision 2 (2026-11-01): the hub fetches, so informed-decision provides a read of the outcome of its own memos to the hub's existing intake identity, instead of pushing.

GET /v1/memos/{memo_id}/outcome on the private workload listener (same TokenReview, audience informed-decision-intake). Admitted only for a submitter row with outcome_read: true (reviewed deployment data; never combined with present_existing), and only for memos that submitter posed (others: 404, no existence oracle). The memo must serve a hub decision with resolves: on-answer. Responses: 202 pending (no terminal human answer yet, or an accept whose approval entry is not yet confirmed); 200 the informed-decision.decision-outcome v1 record; 409 approval_entry_unresolved, assurance_unrecorded, memo_does_not_resolve. Read-only, spends no budget, writes nothing.

Done 2026-11-01 (local): informed_decision/outcome.py, routing in intake_service.py / workload.py, issuer wiring in requester.py; tests in tests/test_decision_outcome.py. Not deployed.

S3 enablement: hub write-back on via the pull

id: INFD-WP-0010-T05
status: wait
priority: medium
depends_on: [INFD-WP-0010-T04]
state_hub_task_id: "d2e10ea8-4b3e-57f3-8b61-6839158d8117"

Waits on state-hub STATE-WP-0101 (decision columns, resolve-evidence route, worker pull). Then here: set outcome_read: true on the system:serviceaccount:state-hub:state-hub row of intake-submitters.json and ship a release (founder runs). The worker's egress to the private listener (8081) already exists.

Done when: a served C1/C2 hub decision is resolved in production from an outcome record this service returned.

S3 cleanup: retire the push write-back

id: INFD-WP-0010-T06
status: wait
priority: low
depends_on: [INFD-WP-0010-T05]
state_hub_task_id: "a11a865e-705f-51c2-a4eb-b3198e3ce7bd"

Once T05 is live, remove the push path (hub_writeback.py, the hub-resolution delivery kind and INFD_HUB_WRITEBACK), keeping already-queued rows readable. It must never be switched on under decision 2.

Done when: no code path in informed-decision can write to State Hub's decision routes.