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
12 KiB
| 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 |
|
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):
- 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-executorand only a human enters it. - 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-outcomev1 (fields: state-hubdocs/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. - access-engine (review policy for requester
service:nk-bind-executor) and key-cape (approval:readforinformed-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_requesterservice:nk-bind-executorfor submitternk-bind-executorand classbounded-execution, at aal2 (v13 requiresinformed-decision); - key-cape:
approval:readoninformed-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: imageca75f0be…, 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); thesso/defaultprobe returned 403submitter_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.