1065 lines
59 KiB
Markdown
1065 lines
59 KiB
Markdown
---
|
||
id: NK-WP-0048
|
||
type: workplan
|
||
title: "Establish SecurityCaseTypes so that known security cases are light"
|
||
domain: infotech
|
||
repo: net-kingdom
|
||
status: active
|
||
flavor: implementation
|
||
owner: claude-code
|
||
topic_slug: netkingdom
|
||
created: "2026-10-08"
|
||
updated: "2026-10-17"
|
||
depends_on: []
|
||
related_repos:
|
||
- ops-mason
|
||
- ops-warden
|
||
- key-cape
|
||
- railiance-platform
|
||
- informed-decision
|
||
state_hub_workstream_id: "e31f3f9d-0748-5137-b0a3-7b3ca46a66eb"
|
||
---
|
||
|
||
# NK-WP-0048 - Establish SecurityCaseTypes so that known security cases are light
|
||
|
||
## Why
|
||
|
||
The founder's direction (2026-10-08): setting up a security integration of a
|
||
kind that has been done before should be easy, meaning accept the case, then
|
||
ops-mason arranges it and ops-warden follows through. Setting up a new kind
|
||
needs ample documentation and tests and an informed-decision, because its shape
|
||
is part of the security architecture.
|
||
|
||
Today every integration is hand-built: per-client helper scripts, per-lane
|
||
custody, founder checklists. The trigger was KEY-WP-0038 (Forgejo as an OIDC
|
||
client), whose next step was going to be yet another hand-written rollout
|
||
script.
|
||
|
||
This plan continues the pattern work of NK-WP-0008 (pattern infospace),
|
||
NK-WP-0009 (tutorials) and NK-WP-0030 (scenario composition). It turns patterns
|
||
into **SecurityCaseTypes** that ops-mason and ops-warden can execute. Canon:
|
||
`canon/standards/security-case-types_v0.1.md` (proposed).
|
||
|
||
Companion plans: ops-mason `MASON-WP-0010` (materialization) and ops-warden
|
||
`WARDEN-WP-0044` (follow-through).
|
||
|
||
## Tasks
|
||
|
||
```task
|
||
id: NK-WP-0048-T01
|
||
status: done
|
||
priority: high
|
||
state_hub_task_id: "930ac3e9-20ec-5473-98cd-3fe8fddb730f"
|
||
```
|
||
|
||
### T01 — Accept the terminology and the canon
|
||
|
||
Founder review of `canon/standards/security-case-types_v0.1.md`, including its
|
||
section 10 open questions. On acceptance the canon status goes from `proposed`
|
||
to `accepted`.
|
||
|
||
2026-10-08: accepted by the founder (in session). Canon status `accepted`;
|
||
section 10's open questions are carried forward to the first type (T04, T05).
|
||
|
||
```task
|
||
id: NK-WP-0048-T02
|
||
status: done
|
||
priority: high
|
||
state_hub_task_id: "19c25d96-a55c-58f0-9168-3fdbc4955fc2"
|
||
```
|
||
|
||
### T02 — Inventory the de-facto types already built by hand
|
||
|
||
Read-only. List every security integration built so far and group them by shape.
|
||
Known starting points:
|
||
|
||
- browser OIDC relying parties on key-cape: informed-decision-approver,
|
||
coulomb-social, user-engine portal, openbao-admin, and Forgejo (pending)
|
||
- confidential service clients with `client_credentials`: secrets-engine
|
||
approval, requester and openbao clients, approval-engine operator
|
||
- workload KV read lanes on OpenBao: the railiance-platform credential lane
|
||
designs and CCRs, for example `railiance-backup-offsite-lane`
|
||
- short-lived SSH certificates through ops-warden (`warden sign`)
|
||
- tunnelled operator access (ops-bridge)
|
||
|
||
For each: the repositories involved, the hand-built steps, attended human steps,
|
||
custody paths, verification evidence, and rollback (if any). Output
|
||
`docs/security-case-type-inventory.md`, ranking candidate types by how often the
|
||
shape recurs and how much manual work each instance costs today.
|
||
|
||
2026-10-08: done, `docs/security-case-type-inventory.md`. 36 of 37 CCRs are
|
||
already `request_type: workload-kv-read`, a de-facto type reviewed each time as
|
||
if it were new. Browser clients: 5 hand-built plus Forgejo, each with its own
|
||
rollout script. Confidential service clients need a registration plus two or
|
||
three KV-read CCRs each. A forge read identity is needed in bulk by
|
||
ORGREF-WP-0002-T06. Recommendation: oidc-browser-relying-party first (unblocks
|
||
the forge), workload-kv-read second (largest payoff), then forge-read-identity.
|
||
|
||
```task
|
||
id: NK-WP-0048-T03
|
||
status: done
|
||
depends_on: [NK-WP-0048-T01]
|
||
priority: high
|
||
state_hub_task_id: "e487975b-73b1-516c-971d-da4cbbb93063"
|
||
```
|
||
|
||
### T03 — Schema, template and validator
|
||
|
||
- `canon/schemas/security-case-type_v0.1.schema.json` and
|
||
`security-case_v0.1.schema.json`
|
||
- `security-case-types/_template/` with `type.yaml`, `README.md` and tests to copy
|
||
- a validator, extending `tools/security-scenario-composer/`, that checks a type,
|
||
checks a case against its type, and renders the case into the composer's
|
||
deterministic plan (still `execution.permitted: false`)
|
||
|
||
Acceptance: the validator rejects missing sections, secret-shaped parameter
|
||
values, unpinned providers and cases against non-`implemented` types, with tests
|
||
for each.
|
||
|
||
2026-10-08: done. `canon/schemas/security-case-type_v0.1.schema.json` and
|
||
`security-case_v0.1.schema.json`; `tools/security-case-types/security_case_validator.py`
|
||
(`validate-type`, `validate-case`, `render`, reusing the scenario composer);
|
||
`security-case-types/_template/` (a valid, runnable example type over
|
||
`net-kingdom.local-identity`, with README sections, an example case and tests that
|
||
travel with every copy). 31 tests pass, including the composer's existing suite.
|
||
|
||
```task
|
||
id: NK-WP-0048-T04
|
||
status: done
|
||
depends_on: [NK-WP-0048-T02, NK-WP-0048-T03]
|
||
priority: high
|
||
state_hub_task_id: "2fffe112-7d55-5680-9952-78d74f44f87f"
|
||
```
|
||
|
||
### T04 — Define the first type: browser OIDC relying party
|
||
|
||
`security-case-types/oidc-browser-relying-party/`, version 1.0:
|
||
|
||
- parameters: client id, display name, exact redirect URIs, scopes, client type
|
||
(confidential or public), MFA pin, the groups the consuming service maps,
|
||
custody path for the secret (confidential only), consuming service and its
|
||
owner
|
||
- composition: key-cape client registration (key-cape declares it as a playbook
|
||
capability), secret minting into custody (railiance-platform), LLDAP group
|
||
existence and membership (net-kingdom identity-provisioner), handover to the
|
||
consuming service
|
||
- materialization (ops-mason) and follow-through (ops-warden) sections
|
||
- verification: discovery lists the redirect URI; a test sign-in returns the
|
||
expected claims for one human; anonymous access to the custody path is denied
|
||
- rollback: remove exactly this client and its custody path
|
||
- README: threat model, MFA rationale, why redirect URIs are exact, which steps
|
||
still need an attended login and how that is minimised
|
||
- reference instances: informed-decision-approver, coulomb-social, user-engine
|
||
portal, openbao-admin
|
||
|
||
Acceptance: complete per canon section 3, tests green, status `proposed`.
|
||
|
||
2026-10-08: done. `security-case-types/oidc-browser-relying-party/` 1.0 (proposed):
|
||
`type.yaml` with 12 parameters (the custody reference is required only for
|
||
confidential clients), composition over key-cape's new
|
||
`key-cape.oidc-client-registration` declaration (contract PASS, `maturity:
|
||
planned`), materialization and follow-through, verification and rollback, all
|
||
conditional on client type where it matters. One attended step,
|
||
`register-client`, justified by the live registry being a Kubernetes Secret.
|
||
README with threat model, alternatives, an honest fit table (portal and vergabe
|
||
fit; Forgejo is the first confidential case; openbao-admin, coulomb.social and
|
||
informed-decision-approver do not fit 1.0), and known limits. Examples: Forgejo
|
||
(checked against the accepted request) and a public portal. The validator gained
|
||
`when` / `required_when` conditions and provider discovery. 43 tests pass.
|
||
ops-mason's and ops-warden's sections are drafted in the type. Their owners
|
||
review them in MASON-WP-0010-T01 and WARDEN-WP-0044-T01 before acknowledgment
|
||
(T05).
|
||
|
||
```task
|
||
id: NK-WP-0048-T05
|
||
status: done
|
||
depends_on: [NK-WP-0048-T04, MASON-WP-0010-T01, WARDEN-WP-0044-T01]
|
||
priority: high
|
||
state_hub_task_id: "3d987d3d-0797-538b-86e4-51185a327ae2"
|
||
```
|
||
|
||
### T05 — Acknowledge the type through informed-decision
|
||
|
||
Prepare the Decision Memo from the type's README and `type.yaml` and submit it
|
||
through informed-decision's production intake. On acknowledgment the type
|
||
moves to `acknowledged`.
|
||
|
||
2026-10-08: Decision Memo prepared. Hub decision `e418263e-a71f-4f01-a970-c87c9e187c09`.
|
||
`security-case-types/oidc-browser-relying-party/decision/`: `packet.md` (question,
|
||
one act, what acknowledging does not do, the shape, alternatives, attended
|
||
steps, limits, evidence), `build_intake.py` and the built `intake.json` (memo
|
||
class `decision-record`, review group `net-kingdom-admins`, resolves the hub
|
||
decision on answer). The envelope passes informed-decision's own
|
||
`validate_submission`. Queuing it is an attended operator step, a write inside
|
||
the production dispatcher pod:
|
||
|
||
kubectl -n state-hub exec -i deploy/state-hub-memo-dispatch -- \
|
||
python -m api.services.memo_dispatch --queue /data/private enqueue --envelope /dev/stdin \
|
||
< security-case-types/oidc-browser-relying-party/decision/intake.json
|
||
|
||
The answer then appears for review in informed-decision.
|
||
|
||
2026-10-08: queued by the founder (`pending`, `queued`) after one refusal: the
|
||
first envelope's idempotency key was not State Hub's stable
|
||
`state-hub.<decision>.<memo>` form, and the builder now validates against both
|
||
sides. The dispatcher delivered it to informed-decision (ledger 7 → 8
|
||
delivered). T05 waits for the founder's answer in informed-decision, which
|
||
resolves hub decision `e418263e`.
|
||
|
||
2026-10-08: ops-mason's review (MASON-WP-0010-T01) folded into the type, still
|
||
1.0 `proposed`: `secret_ref` is no longer a parameter, the type derives
|
||
`platform/workloads/keycape/{client_id}`; policies are
|
||
`workload-kv-read-keycape-{client_id}-eso` and
|
||
`workload-kv-read-keycape-{client_id}-{consuming_service}`, each with a templated
|
||
body (`read` on that one data path); new `openbao_role`
|
||
`external-secrets-keycape-{client_id}` (Kubernetes auth, ESO service account,
|
||
15m, no default policy); catalog entry `{consuming_service}-keycape-client`;
|
||
the two rollback steps on the KV path collapse into one metadata delete. The
|
||
schema and validator now require a `body` on policy and role items. 105 tests
|
||
pass. Two consequences: the delivered memo describes the type before these
|
||
changes (a case-set custody reference, two differently named policies, no ESO
|
||
role), so the founder answers on a superseded shape unless the memo is
|
||
re-sent; and Forgejo's custody path moves from the accepted request's proposed
|
||
`platform/workloads/forgejo/netkingdom-oidc-client` to
|
||
`platform/workloads/keycape/forgejo`, which key-cape (KEY-WP-0038) and
|
||
railiance-apps (RAPPS-WP-0016-T02) need to adopt in T06. ops-warden's review
|
||
(WARDEN-WP-0044-T01) is still in progress.
|
||
|
||
2026-10-08: revised memo `nk-wp-0048-t05-oidc-browser-relying-party-r2` built
|
||
(`packet.md`, `intake.json`, packet `sha256:af6435e2…`); it states that it
|
||
supersedes the first memo and passes informed-decision's and the dispatcher's
|
||
validation. It needs a new memo id because the dispatcher refuses new content
|
||
under a delivered idempotency key (`idempotency_conflict`). Queuing it is the
|
||
same attended step as above. Both memos serve hub decision `e418263e`; the
|
||
first answer resolves it, so the first memo must not stay open: an accept on it
|
||
would acknowledge the superseded shape, and a decline would resolve the
|
||
decision against r2. Close it with `return` (a reviewer verb that requests a
|
||
new revision and does not resolve the hub decision; only accept and decline
|
||
do), commenting that r2 supersedes it, then answer r2. `withdraw` exists in
|
||
the vocabulary but is not offered to reviewers, and lifecycle `revise` only
|
||
applies to lifecycle-registered memos, not intake-delivered ones.
|
||
|
||
2026-10-09: the founder reports r2 enqueued and the first memo returned. At
|
||
close, hub decision `e418263e` still showed `open` (not verified whether r2
|
||
was answered or the answer is still in transit; the dispatcher ledger was not
|
||
read). ops-warden's review (WARDEN-WP-0044-T01, ops-warden
|
||
`history/2026-10-08-oidc-rp-follow-through-review.md`, d470f2e) arrived at
|
||
21:25, before r2 was built, and is not in r2. Required before WARDEN-WP-0044-T02:
|
||
R1 a per-step `lane` (missing: identity-provisioner caller credential,
|
||
railiance-platform broker grant), R2 canon meaning of `warden_executes: true`
|
||
(caller proxy, caller identity, no standing ops-warden token; ADR-0002), R3 a
|
||
per-step `value_handling`. Refinements R4 (one type-level catalog lane instead
|
||
of a per-case entry, which conflicts with ops-mason's item 5), R5 (ESO Ready gate
|
||
before bind-env), R6 (exact accepted memberships), R7 (mfa-pinned and
|
||
secret-delivered checks). Next: if r2 was accepted, fold R1-R3 and R5-R7 in as
|
||
a follow-up and settle R4 between ops-warden and ops-mason before T06; if not,
|
||
hold r2, fold them in and build r3.
|
||
key-cape and railiance-apps were told about Forgejo's new custody
|
||
path.
|
||
|
||
2026-10-09: r2 was not answered (hub decision `e418263e` open; dispatcher 9
|
||
delivered), so r2 is held and r3 replaces it. ops-warden withdrew R4 for R4′
|
||
(message a66a9204): one catalog entry per case with its body templated in the
|
||
type. Folded in:
|
||
|
||
- Canon section 3: a narrow meaning of `warden_executes: true` (caller proxy,
|
||
caller identity, no standing credential; ops-warden ADR-0002), plus per-step
|
||
`lane`, `value_handling` and an optional `ready_check`. A catalog entry body is
|
||
now required, like policy and role bodies.
|
||
- Schema and validator enforce all of these.
|
||
- The type: lanes `identity-provisioner-groups` and
|
||
`keycape-client-secret-generate` (both new) and `key-cape-oidc-login`;
|
||
`mint-secret` is `generated_in_custody`; a Ready gate on `deliver-secret`;
|
||
`ensure-groups` adds exactly the accepted case's memberships; new checks
|
||
`secret-delivered` and `mfa-pinned`; the catalog-entry body follows R4′.
|
||
- 110 tests pass.
|
||
|
||
Memo r3 (`nk-wp-0048-t05-oidc-browser-relying-party-r3`, packet
|
||
`sha256:726dfc01…`) passes informed-decision's and the dispatcher's validation.
|
||
The founder queues it with the same command, returns r2 with a comment that r3
|
||
supersedes it, then answers r3.
|
||
|
||
Prerequisites for T06, not for T05:
|
||
- the two new lanes, each through its owner;
|
||
- a founder-approved rollout of an identity-provisioner image containing
|
||
630ebfd (the deployed one is main-6c4fcaf from 2026-09-24, without
|
||
`/v1/groups/ensure`).
|
||
|
||
ops-mason's request to create LLDAP group `fluid-telegram-operators` (message
|
||
259ec26d) was answered: not possible from here by that path; the founder creates
|
||
it in the LLDAP admin UI.
|
||
|
||
2026-10-09: ops-warden finished its side of WARDEN-WP-0044-T01 (message
|
||
`58d33f40`, commit 0e7ceb8): the revised type conforms to `warden case
|
||
check-type`, with no further changes asked of the type. This acknowledges that
|
||
review. Its later addendum R8 (message `af274783`, ops-warden
|
||
`history/2026-10-08-oidc-rp-follow-through-review.md`) showed that lane
|
||
`identity-provisioner-groups` cannot exist as declared: the provisioner's only
|
||
HTTP credential is user-engine's runtime token, and its NetworkPolicy admits
|
||
only user-engine pods, so a caller-proxy lane would act as user-engine. Taken
|
||
option 1 (ops-warden's recommendation): `ensure-groups` and its rollback are
|
||
attended, in the `register-client` session on `key-cape-oidc-login`, run inside
|
||
the provisioner pod; no token is read. Option 2 (an operator credential of its
|
||
own on the provisioner) stays open for a later version. `warden case
|
||
check-type` now reports only `keycape-client-secret-generate`
|
||
(railiance-platform) as missing. 89 tests pass.
|
||
|
||
Hub decision `e418263e` was still open, so memo r4
|
||
(`nk-wp-0048-t05-oidc-browser-relying-party-r4`, packet `sha256:452ea421…`)
|
||
replaces r3; it passes informed-decision's and the dispatcher's validation. The
|
||
founder queues it with the same command, returns r2/r3 if still open with a
|
||
comment that r4 supersedes them, then answers r4.
|
||
|
||
Prerequisites for T06 are now: lane `keycape-client-secret-generate`
|
||
(railiance-platform), and a founder-approved rollout of an identity-provisioner
|
||
image containing 630ebfd.
|
||
|
||
2026-10-09: done. The founder queued r4 (`pending`, `queued`), returned r3 as
|
||
superseded and accepted r4 in informed-decision. informed-decision's hub
|
||
write-back is off in production (`INFD_HUB_WRITEBACK` unset), so net-kingdom
|
||
resolved hub decision `e418263e` from the founder's report, naming memo r4 in
|
||
the rationale. The type is `acknowledged`; it becomes `implemented` with T06.
|
||
|
||
```task
|
||
id: NK-WP-0048-T06
|
||
status: wait
|
||
depends_on: [NK-WP-0048-T05, NK-WP-0048-T08, NK-WP-0048-T09, NK-WP-0048-T12, NK-WP-0048-T13, NK-WP-0048-T14, NK-WP-0048-T15, NK-WP-0048-T16, NK-WP-0048-T17, NK-WP-0048-T18, NK-WP-0048-T20, MASON-WP-0010-T03, WARDEN-WP-0044-T03]
|
||
blocking_reason: "Type1.2 architecture has a confirmed source-only founder acknowledgment; canonical1.1 remains unchanged/default and the1.2 reference case stays proposed. Needs explicit version selection/reference-source integration without normal admission bypass, closed owner adapters plus global/native receipt verifier (WARDEN-WP-0044-T03), independently verified six-object structural materialization and CCR42 claims/created-only provenance, exact broker/case/source reconciliation, then separately authorized native mint/delivery and attended registry/consumer verification. Source acknowledgment, a bundle or local tests do not prove implemented/materialized/live status."
|
||
priority: high
|
||
state_hub_task_id: "d9b26bcf-a7c6-59a2-92a0-f913d76a203c"
|
||
```
|
||
|
||
### T06 — First KnownSecurityCase: Forgejo
|
||
|
||
Write `security-cases/forgejo-netkingdom-oidc.yaml` from the parameters the
|
||
founder accepted in KEY-WP-0038-T01 (`key-cape/docs/forgejo-oidc-client-request.yaml`),
|
||
so that acceptance carries over as the case acceptance. ops-mason materializes it;
|
||
ops-warden follows through and verifies it. The type becomes `implemented` once
|
||
this reference case is live.
|
||
|
||
This replaces the hand-built path proposed for KEY-WP-0038-T02.
|
||
|
||
2026-10-09: case written, `security-cases/forgejo-netkingdom-oidc.yaml`, status
|
||
`accepted`: the example's parameters plus the founder's 2026-10-08 acceptance of
|
||
the key-cape request (owner and founder), with the custody-path derivation
|
||
covered by the type's acknowledgment (memo r4). It validates and renders (plan
|
||
`execution.permitted: false`; three attended steps on `key-cape-oidc-login`);
|
||
it needs `--allow-unimplemented` until it is live, since it is the case that
|
||
makes the type `implemented`. A test keeps it equal to the type's example.
|
||
Still open before it runs: ops-mason renders and builds it (MASON-WP-0010-T02,
|
||
T03, unblocked by T05), ops-warden plans and runs it (WARDEN-WP-0044-T02, T03),
|
||
railiance-platform's `keycape-client-secret-generate` lane (asked by ops-mason
|
||
`789feb39` and ops-warden `d9f889b1`, both unread), and a founder-approved
|
||
identity-provisioner rollout containing 630ebfd.
|
||
|
||
2026-10-09: identity-provisioner rolled out, founder-approved in session:
|
||
`main-630ebfd` (`sha256:bafb4860…`, built by the image workflow) replaces
|
||
`main-6c4fcaf` (`sha256:ffacd5d7…`; only change: 630ebfd, additive). Applied
|
||
with `kubectl set image` on the Deployment only (generation 17 → 18, 1/1 Ready);
|
||
the file's Service, NetworkPolicies and Ingress were not reapplied. Verified in
|
||
the pod: `ensure_service_groups` and `revoke_service_groups` present, `/readyz`
|
||
200; no token used, no group changed. Rollback: `kubectl -n sso set image
|
||
deploy/identity-provisioner provisioner=forgejo.coulomb.social/coulomb/identity-provisioner@sha256:ffacd5d790a5b7800e0535f3aa95b7de52c7a68e4f575b9192c3e1622fa672c2`.
|
||
The pin in `sso-mfa/k8s/identity-provisioner/deployment.yaml` follows.
|
||
|
||
2026-10-09: ops-warden closed WARDEN-WP-0044-T01 and shipped `warden case plan`
|
||
(T02, message `06303d1d`); the accepted Forgejo case is refused until ops-mason
|
||
materializes it, and a materialized copy plans cleanly once
|
||
`keycape-client-secret-generate` exists. Its observation that `bind-env` carries
|
||
a literal `KEYCAPE_<CLIENT_ID>_CLIENT_SECRET`: the validator now renders a
|
||
`{param:env}` format spec (upper case, `-` as `_`, as `keycape-client.py`
|
||
derives the name) and rejects unknown specs, and follow-through and rollback
|
||
text is now checked for unknown placeholders too (patch-level, canon section 6).
|
||
The type keeps the literal until ops-warden's planner (`text.format`) renders the
|
||
spec as well; asked of ops-warden. 53 tests pass.
|
||
|
||
2026-10-10: ops-warden rendered `{param:env}` in `warden case plan`
|
||
(23ba584, message `c1df14b7`; other specs and `!conversion` refused). The type
|
||
adopts it as a 1.0 patch (canon section 6): `bind-env` and its rollback now read
|
||
`KEYCAPE_{client_id:env}_CLIENT_SECRET`. ops-mason reports the Forgejo case
|
||
rendered and built (message `1ebddae9`; CCR drafts handed to railiance-platform),
|
||
so T06 now waits on the platform apply, the mint-secret lane and the attended
|
||
register-client session.
|
||
|
||
2026-10-10: key-cape adopted the type's custody path (key-cape ab5cccd, message
|
||
`88a4559c`): `docs/forgejo-oidc-client-request.yaml` and KEY-WP-0038-T02 name
|
||
`platform/workloads/keycape/forgejo`, field `CLIENT_SECRET`, delivered as
|
||
`sso/keycape-forgejo-client` through `external-secrets-keycape-forgejo`, and the
|
||
`forgejo/netkingdom-oidc-client` proposal is withdrawn. This matches the type and
|
||
the Forgejo example; no change needed here.
|
||
|
||
2026-10-10: key-cape's type-composition review (key-cape 6038483, message
|
||
`8e5ed5f6`) found the composition sound with two blocking findings, taken as a
|
||
1.0 patch (stricter validation and documentation, canon section 6):
|
||
R1, redirect URIs now refuse `?` and `#` in the type pattern and in
|
||
`keycape-client.py`'s `REDIRECT` (KeyCape refuses `?` at startup and the single
|
||
replica would stop); R2, `allowed_scopes` always includes `groups`, the renderer
|
||
refuses `access_groups` without it, and `access_groups` now says the consumer
|
||
enforces the gate because KeyCape has none; R3, `mfa_required` "false" means the
|
||
per-user privacyIDEA policy; R4, register-client's justification records the
|
||
restart for every client, the quiet window, and that the rendered registry must
|
||
pass KeyCape's client validation before it. The accepted Forgejo case and both
|
||
examples still validate; 116 tests pass.
|
||
Open, needs a decision: R2's verification step that the consumer enforces the
|
||
group gate is a new verification step, hence 1.1 (minor), and the validator pins
|
||
cases to the exact type version, so the accepted 1.0 Forgejo case would need
|
||
re-pinning. Also open with key-cape: a KeyCape entry point that validates a
|
||
rendered client registry without starting the server; until then
|
||
`keycape-client.py` mirrors the redirect rule.
|
||
|
||
2026-10-10: founder go for 1.1, so no 1.0 run overlaps. The type adds
|
||
verification `consumer-enforces-groups`, and hand-over now requires the consumer
|
||
to enforce `access_groups` (minor, canon section 6; risk class unchanged, no new
|
||
acknowledgment; history in the type README). The accepted Forgejo case and both
|
||
examples are re-pinned to `oidc-browser-relying-party@1.1` before any apply; the
|
||
acknowledgment intake keeps `@1.0` as the record of what was acknowledged.
|
||
ops-mason's build and ops-warden's case-ref digest predate this and need a
|
||
re-render.
|
||
|
||
2026-10-10: ops-mason re-rendered the Forgejo case from `@1.1` (message
|
||
`22c6bba6`; plan digest `af1f4f81…`, no collisions) and rebuilt the bundle. The
|
||
rendered OpenBao objects are identical to 1.0, so the already applied
|
||
CCR-2026-0041 stands; 1.1 changes only consumer-side steps. key-cape shipped
|
||
`keycape check-config` (c528daa, message `a7b0aeff`): KeyCape's startup checks
|
||
without secret values, including the new duplicate-clientId rule.
|
||
`keycape-client.py --check-config <binary>` now runs it on the live and the
|
||
proposed registry, fed on stdin, and apply refuses a proposed registry that
|
||
fails; register-client's entry point names the option (1.1 patch). The deployed
|
||
image predates c528daa, so the binary is built from key-cape source for now.
|
||
Before the next KeyCape rollout (Forgejo register-client or the CCR-2026-0018
|
||
window), the attended operator runs `inspect --check-config` so the live
|
||
registry is checked too.
|
||
|
||
```task
|
||
id: NK-WP-0048-T07
|
||
status: wait
|
||
depends_on: [NK-WP-0048-T06]
|
||
blocking_reason: "The next types follow once the first one is proven end to end."
|
||
priority: medium
|
||
state_hub_task_id: "c3c9c3ae-4f23-5ba7-9e6f-e63bcf29b9f7"
|
||
```
|
||
|
||
### T07 — Queue the next types
|
||
|
||
From the T02 ranking, open the next type drafts (likely the confidential service
|
||
client and the workload KV read lane), each to be acknowledged on its own.
|
||
Record which existing hand-built instances get adopted as cases, without
|
||
rewriting them in place.
|
||
|
||
```task
|
||
id: NK-WP-0048-T08
|
||
status: done
|
||
priority: high
|
||
state_hub_task_id: "8e519082-dc8b-5e46-b660-03d03e55dcf6"
|
||
```
|
||
|
||
### T08 — identity-provisioner: ensure service-access groups
|
||
|
||
The type's `ensure-groups` step calls `identity-provisioner groups ensure --groups
|
||
<list> --members <group=user+user;...>`. The provisioner already has idempotent
|
||
`_ensure_group` and `_add_group`, but exposes only tenant-scoped operations. Add
|
||
the general operation (create if absent, add the listed memberships, never
|
||
remove others), its rollback (remove only this case's memberships), tests, and
|
||
the ops-warden route for its service identity.
|
||
|
||
2026-10-08: done. `identity-provisioner/provisioner.py` gained
|
||
`ensure_service_groups` (`POST /v1/groups/ensure`) and `revoke_service_groups`
|
||
(`POST /v1/groups/revoke`), behind the existing service-token check. Names
|
||
matching `tenant*`, `netkingdom-*` and `lldap_*` are reserved; members must
|
||
already exist; everything is validated before any change; memberships are read
|
||
back before success; nothing else is ever removed; groups are deleted only when
|
||
asked and empty. 7 new tests (39 in the provisioner suite). The type's
|
||
`ensure-groups` step and its rollback now name these endpoints. The ops-warden
|
||
route for the provisioner's service token belongs to WARDEN-WP-0044-T01.
|
||
|
||
```task
|
||
id: NK-WP-0048-T09
|
||
status: done
|
||
priority: high
|
||
state_hub_task_id: "0ee12dfc-8260-5038-bd39-cc7fb4113be0"
|
||
```
|
||
|
||
### T09 — The `keycape-client` entry point and its declaration
|
||
|
||
Planned first as key-cape KEY-WP-0038-T04. Moved here because the machinery a
|
||
live registration needs already lives in net-kingdom, where KeyCape is deployed
|
||
(`sso-mfa/k8s/keycape/`): the contained kubectl, the cluster-identity pin and the
|
||
issuer pin. A copy in key-cape would drift.
|
||
|
||
2026-10-08: done. `sso-mfa/k8s/keycape/keycape-client.py` derives the KeyCape
|
||
client record from a case (`client-from-case`). It adds or removes exactly one
|
||
client with the existing safeguards (byte-preserving merge, exact match or
|
||
refuse, shared-reference refusal, compare-and-swap, read-back, contained errors),
|
||
requires the Deployment env binding first for confidential clients, and requires
|
||
the case acceptance record for `apply` instead of a per-client founder decision
|
||
id. 15 tests, including a regression showing that the vergabe case reproduces
|
||
its hand-built registration exactly; all 71 helper tests pass. Declaration
|
||
`capabilities/playbooks/net-kingdom.keycape-client-registration.yaml` (contract
|
||
PASS, `maturity: implemented`) replaces key-cape's draft. The type now pins it,
|
||
and for confidential clients adds `deliver-secret` (delivery from custody into
|
||
the sso namespace) and `bind-env` (Deployment env), attended in the same session
|
||
as `register-client`. The per-client helpers stay until their clients are
|
||
adopted as cases.
|
||
|
||
2026-10-10 — NetKingdom owner review of the execution seam, source only:
|
||
ops-warden/docs/security-case-execution-proposal.md SHA256 78ab1439e4c5beb205aeccf15b1b2e706511be55ab195c5a3aa682f326c7c77c
|
||
was reviewed against INTENT, SecurityCase canon, acknowledged type1.1, current
|
||
case and owner source. docs/security-case-execution-owner-review.md supports
|
||
the closed adapter/receipt direction with explicit versioned schema, structural
|
||
materialization provenance, unchanged caller/session boundaries, safe CAS
|
||
reconciliation and exact-created-object rollback requirements. This is owner
|
||
review, not approval. Supporting file digests are in the adjacent sources JSON.
|
||
|
||
Current source exposes a circular wait: ops-mason T03 waits on mint while Warden
|
||
and the broker refuse a non-materialized case. Structural acceptance therefore
|
||
needs its own native pinned receipt before mint, not a successful mint before
|
||
materialized. The platform broker additionally pins type1.0 while Forgejo is
|
||
accepted at1.1; platform-owner alignment and tests are required, not an unchecked
|
||
version bypass. T06 remains wait. No case/type lifecycle status, grant, authority
|
||
or live runtime changed by this review. A proposed informed-decision would
|
||
adopt the source contract only; native materialization and execution acceptance
|
||
stay distinct.
|
||
|
||
Final proposal re-review: staged Warden proposal SHA256 78ab1439e4c5beb205aeccf15b1b2e706511be55ab195c5a3aa682f326c7c77c
|
||
adds only the explicitly local reducer appendix, not an accepted wire protocol
|
||
or executor. The exact-final review and sources JSON supersede the earlier
|
||
1035f049... proposal review. Platform staged the exact type1.1 broker correction
|
||
with ten fake-backend subprocess checks (script SHA256
|
||
9576cd211cfc06526ec4cc9bd0a5b06f0f59287a68931bb2d6e3592a951ddc7d).
|
||
The next source work is the versioned closed adapter/receipt/materialization
|
||
contract, not another relaxation of the broker's status gate. Native work still
|
||
requires installed broker provenance, structural reader receipts, exact new
|
||
materialized-case bytes, caller grant/session revocation and verified execution.
|
||
No installed/native acceptance is inferred from that staged correction.
|
||
|
||
2026-10-11 — new source-only type1.2 architecture acknowledgment:
|
||
Confirmed native founder ACCEPT of infd-20261011-forgejo-type12-source-r1@1
|
||
at06:47:39Z, approval8e9332c8-754a-420c-b8b7-445cb4fe6765. Exact frozen packet
|
||
0b377d647ca748cd03c92f9792396412048055d4bde9f7bb06ff6d413f7acd68 and submission
|
||
585cee731de30d2b37883a57abfd9eb32f023ee694e8d911989109d5caf80569; native receipt
|
||
retained in docs/evidence/2026-10-11-forgejo-type12-source-acknowledgment/.
|
||
The complete acknowledged1.2 source package is isolated under
|
||
security-case-type-revisions/1.2/oidc-browser-relying-party; default loader and
|
||
current accepted1.1 case remain untouched because load_type is single-version.
|
||
The new proposed1.2 case is NOT accepted/materialized/live and has no acceptance
|
||
fields. Actual reference-migration design approval is a separate Apps owner
|
||
receipt; no1.1 approval is inherited. Source-recording review/test proof and exact
|
||
next gates are in docs/forgejo-type12-source-acknowledgment-followthrough.md.
|
||
T06 remains wait and T07 remains its existing dependent task; type is NOT
|
||
implemented and no first-case/native grant or broader workplan finish is asserted.
|
||
|
||
2026-10-11 — bounded explicit version selection source preparation for T06:
|
||
The validator now offers optional exact version_roots/--version-root VERSION=PATH
|
||
selection with duplicate/mismatch/traversal/symlink refusal and no fallback. The
|
||
default1.1 source and historicalacceptedcase hashes/ordinaryrefusal/preparation
|
||
render stayunchanged; actual1.1 is acknowledged, not implemented. Acknowledged1.2
|
||
ordinaryadmission also refuses; optionalpreparation remains nonexecuting.43local
|
||
validatorchecks pass and original1.1 CLIrenderbytes match exactly. Makerproof:
|
||
docs/evidence/2026-10-11-explicit-type-version-selection/source-integration-validation.json.
|
||
FormalNetownerreview/reference-source integration and all existing native adapter,
|
||
provenance/broker/materialization/attendedproof gates remain; T06 stayswait, no
|
||
new residual or firstcase/typeimplementation/native grant is inferred.
|
||
|
||
|
||
2026-10-16 — isolated source preparation for T06 (canonical integration pending):
|
||
Added `check-evidence` to the existing validator CLI. It reuses exact version
|
||
selection and ordinary type/case/render admission, checks actual Mason structural
|
||
request source/inventory/projection pins and reads actual Warden journal rows
|
||
read-only. Successful rows require exact type-declared descriptors and attempt/
|
||
revocation fingerprints. Existing acknowledged types without machine descriptors
|
||
remain plan-only. The compatibility result never claims authenticated native
|
||
completion: Request and journal fingerprints are not portable native evidence.
|
||
Owner authentication/status binding and actual native gates remain unresolved;
|
||
T06/T07 statuses and both type/case lifecycles remain unchanged. No dispatch,
|
||
credential access or authority expansion is introduced. See tool README for the
|
||
existing owner protocol boundaries and source integration tests.
|
||
|
||
Concrete next Warden owner integration: current `Executor.admit` refuses every
|
||
case parameter whose sensitivity is not public/operational, so browser
|
||
`redirect_uris`, `allowed_scopes`, `client_type`, `mfa_required` (and 1.2
|
||
`consumer_namespace`) fail after otherwise prepared admission. The sensitive
|
||
classification is a security-change review level, not secret content. The
|
||
Warden owner must validate through NetKingdom's existing exact-version case/type
|
||
validator, then project only descriptor-declared safe target metadata; do not
|
||
remove the credential/value refusal or copy complete parameters into journals.
|
||
Actual owner descriptor acknowledgment and independent evidence admission remain
|
||
prerequisites, with normal admission still refusing unimplemented types.
|
||
|
||
|
||
## T10 — Source compatibility checker for Mason and Warden evidence
|
||
|
||
```task
|
||
id: NK-WP-0048-T10
|
||
status: done
|
||
priority: high
|
||
state_hub_task_id: "4b06ca97-c1e4-5680-bf22-ab75ab1646a4"
|
||
```
|
||
|
||
Completed 2026-10-16 in published source `c31d21ba`. The read-only
|
||
`check-evidence` command checks the actual Mason structural request and Warden
|
||
journal source protocols against an exact version/render. Independent source
|
||
review passed 103 tests at that checkpoint. It always reports native completion
|
||
false and execution prohibited. Fixtures and local journal fingerprints do not
|
||
provide authenticated owner/native evidence. This records completed source scope
|
||
previously described under T06; it does not duplicate native acceptance credit.
|
||
|
||
## T11 — Validate the optional machine-descriptor pin contract
|
||
|
||
```task
|
||
id: NK-WP-0048-T11
|
||
status: done
|
||
priority: high
|
||
state_hub_task_id: "ef2a0119-f59e-5e45-9519-115da9df7b85"
|
||
```
|
||
|
||
Completed 2026-10-16. Reproduced the JSON schema rejecting a valid
|
||
`execution_descriptors` map while the Python validator accepted malformed maps.
|
||
The schema now supports the existing Warden optional exact-byte pin map; semantic
|
||
validation binds keys to declared steps, bounds the map and checks digest shape.
|
||
The direct evidence API refuses malformed maps before accessing them. Twenty-one
|
||
new checks and all 127 affected source checks passed. No current type/case bytes,
|
||
status, owner descriptors or native acceptance changed. Source evidence and
|
||
publication receipt: Custodian
|
||
`docs/changes/netkingdom-target-2026-10-16/browser-acceptance-next/`.
|
||
|
||
## T12 — Prepare NetKingdom-owned attended step adapters
|
||
|
||
```task
|
||
id: NK-WP-0048-T12
|
||
status: todo
|
||
priority: high
|
||
state_hub_task_id: "7ce4eee3-cd47-55a9-bfa5-4f1835d4d6fd"
|
||
```
|
||
|
||
Owner: NetKingdom. Retained scope: prepare bounded attended Deployment env,
|
||
config verification and restart/readiness steps around the existing helpers.
|
||
Next action: identify exact current entry points and their revision/readback
|
||
contracts, then implement fixed source-pinned callbacks or receipt-only attended
|
||
steps. Completion requires positive/refusal checks, exact target/source pins and
|
||
uncertainty behavior without acquiring user-engine runtime identity or exposing
|
||
registry/client secrets. Existing caller/session, cluster/issuer, CAS/readback
|
||
and status-only output boundaries remain mandatory.
|
||
|
||
2026-10-16 task refinement: the original broad adapter scope is split into T13
|
||
(completed registration source candidate), T14 (group creation provenance), T15
|
||
(durable registration recovery) and T16 (descriptor/artifact selection and owner
|
||
review). This preserves T12's task ID and Hub UUID while giving each remaining
|
||
outcome an owner and completion gate. T06 now names every source dependency;
|
||
its native/reference lifecycle acceptance scope remains unchanged. Completion
|
||
of any source task supplies no Warden, Platform or Apps assent and no native
|
||
execution authority.
|
||
|
||
## T13 — Prepare the fixed registration adapter source candidate
|
||
|
||
```task
|
||
id: NK-WP-0048-T13
|
||
status: done
|
||
priority: high
|
||
state_hub_task_id: "b264c10b-565c-5d29-b788-03cf5fbd2883"
|
||
```
|
||
|
||
Completed 2026-10-16, source implementation and synthetic fixture proof only.
|
||
Added an injection-only adapter around actual `keycape-client.run`: fixed
|
||
case/principal/human/lane/source/acceptance binding, existing CAS/readback,
|
||
metadata-only owner evidence and per-attempt parent-session revocation boundary.
|
||
The descriptor source composition pins the exact checker executable digest
|
||
alongside adapter/helper source. Creation-only rollback authenticates its
|
||
creation receipt and refuses changed postcreation UID/resourceVersion;
|
||
pre-existing clients confer no rollback authority. Missing readback, evidence,
|
||
revocation or process-local creation provenance cannot become retry-safe success.
|
||
|
||
Evidence: Custodian `docs/changes/netkingdom-target-2026-10-16/browser-adapter-next/`
|
||
R3 candidate, explicit patch and postimages, retained R1 rejected custody finding
|
||
and R2 revision, and 36 passing source checks (16 new, 20 existing). Three checks
|
||
use actual Warden kernel admission/dispatch/rollback with published Warden
|
||
`d97652a3bb5fa733b063d71a1b74068efcccf572` producer pins unchanged. Owner trust,
|
||
descriptor/type/case and Kubernetes objects remain synthetic fixtures. This
|
||
records a completed source deliverable, not independent review, publication,
|
||
type acknowledgment, exercised procedure, identity admission or native browser
|
||
acceptance. Independent root source review: Custodian browser-adapter-next/coordinator-review-r3.json. Source integration and normal publication/synchronization receipts: Custodian browser-adapter-next/canonical-integration.json. These receipts supply no other-owner assent or native authority.
|
||
|
||
Source publication: `0775c2bfa41af236301155bb5a69bbf088bdf823`, independently
|
||
reviewed by the Custodian coordinator before integration. The required initial
|
||
projection and ordinary UUID writeback both completed with zero failures and
|
||
zero automation errors. Generated-only brief commits were refused by the normal
|
||
hook; exact pre-existing staged/working brief bytes were restored. The separate
|
||
canonical integration receipt retains those refusals and projection evidence.
|
||
Native admission and all other-owner acceptance remain open.
|
||
|
||
## T14 — Admit governed group rollback against native owner boundaries
|
||
|
||
```task
|
||
id: NK-WP-0048-T14
|
||
status: progress
|
||
depends_on: [NK-WP-0048-T20, NK-WP-0048-T21]
|
||
priority: high
|
||
state_hub_task_id: "fce95440-a25b-5f27-8ef3-a3d182099113"
|
||
```
|
||
|
||
Owner: NetKingdom. Next action: bind the completed T21 PostgreSQL journal to
|
||
an admitted dedicated CNPG consumer through the existing `rapp-postgres`
|
||
database-per-consumer contract. Identify the actual deployment/package and
|
||
custody owner, admitted placement/capacity and role/renewable lease/TLS target;
|
||
implement the independently retained exact content checkpoint and authoritative
|
||
tenant/case/source/principal callbacks before enabling governed group operations.
|
||
The injection-only backend and fixture callbacks do not supply production scope
|
||
or authorization. Existing service tokens, caller-supplied JSON and provenance
|
||
receipts confer no new grant. The default production endpoint remains disabled
|
||
without the trusted integration. SQLite remains local/disposable only; any
|
||
production exception requires explicit scoped governance under ADR-0015.
|
||
|
||
2026-10-17 refinement: T20 retains the historical durable SQLite source and
|
||
actual disposable LLDAP proof. T21 extracts the completed PostgreSQL source and
|
||
bounded real disposable SQL compatibility proof. T14 remains `progress` for
|
||
native CNPG admission/recovery, protected owner integration and exclusion of all
|
||
external LDAP writers. Separate source publication/projection and independent
|
||
cleanup receipts belong to coordinator follow-through; no missing native assent
|
||
is represented as received.
|
||
|
||
Completion still requires independently reviewed/admitted ADR-0015-conforming
|
||
CNPG storage (or an explicit governed exception), backup/lost-store recovery and
|
||
migration of legacy requests; a native
|
||
writer-isolation/fencing or provider CAS/version contract that closes external
|
||
writer races and remove/re-add ABA; exact case/source/principal and current
|
||
native object bindings for protected callbacks; and actual per-attempt evidence,
|
||
revocation and readback/refusal verification through the existing owner paths.
|
||
Only independently retained confirmed creations may be undone. Every
|
||
pre-existing/shared group and membership must remain preserved; unresolved
|
||
intents never expire into retry authority. The disposable fixture supplies none
|
||
of these native custody, authorization, owner-acceptance or production claims.
|
||
|
||
## T15 — Define authenticated recovery for lost registration process state
|
||
|
||
```task
|
||
id: NK-WP-0048-T15
|
||
status: todo
|
||
priority: high
|
||
state_hub_task_id: "1b825705-4848-5edc-832f-b1622cd9bdb7"
|
||
```
|
||
|
||
Owner: NetKingdom for registration state, with Warden owning kernel evidence
|
||
admission. Next action: select the exact existing owner evidence holder/readback
|
||
contract and define authenticated lookup for the original creation attempt.
|
||
Completion requires restart/lost-receipt fixtures that bind case/source/principal,
|
||
original created-only provenance and current native revision before any undo;
|
||
uncertain outcomes remain non-replayable. The T13 adapter deliberately refuses
|
||
post-restart rollback and installs no reconciliation callback. A new broker or
|
||
unverified JSON receipt is not a recovery contract. Actual evidence-holder
|
||
acceptance and attended recovery remain separately authorized native work.
|
||
|
||
## T16 — Select and review the actual machine descriptor composition
|
||
|
||
```task
|
||
id: NK-WP-0048-T16
|
||
status: todo
|
||
priority: high
|
||
state_hub_task_id: "200bf500-5084-5ae7-be26-3033fe1f296e"
|
||
```
|
||
|
||
Owner: NetKingdom for descriptor/type source and exact checker artifact; Warden
|
||
independently owns global provenance/admission. Next action: obtain review of the
|
||
exact checker source/artifact proposed by T17 and identify native owner evidence/
|
||
session callback contracts, then assemble the complete step descriptor set and
|
||
a proposed explicit type version selection. T13's historical descriptor retains
|
||
its synthetic checker; T17 supplies an artifact-bound proposal, not admission.
|
||
Completion requires separate owner source review of exact machine descriptors,
|
||
artifact/source/config pins, normal type/version admission and independent
|
||
evidence-verification boundaries. Warden d97652a refreshes producer validator
|
||
pins for NetKingdom 015694ee; it does not attest T13's new adapter. Pinning any
|
||
machine descriptor into an acknowledged type is a separately reviewed source
|
||
change. Platform owns structural/mint/broker/delivery evidence; Apps owns actual
|
||
consumer login/group enforcement. Neither their assent nor native acceptance is
|
||
supplied by this task.
|
||
|
||
2026-10-16 source checkpoint: T19 below extracts the completed per-attempt
|
||
executable snapshot implementation and reviewed fixture proof. T16 retains
|
||
native executable storage/custody, exact owner evidence/session callbacks,
|
||
complete descriptor composition and ordinary type/version admission. The
|
||
successor descriptor/source pins are proposed only; the earlier descriptor
|
||
history is preserved. T14 group provenance and T15 durable restart/recovery
|
||
remain independent open requirements. No native acceptance is counted here.
|
||
|
||
## T17 — Build and exercise the exact offline config-checker artifact
|
||
|
||
```task
|
||
id: NK-WP-0048-T17
|
||
status: done
|
||
priority: high
|
||
state_hub_task_id: "8c3e4baa-a218-5996-af9e-fe1153a46dac"
|
||
```
|
||
|
||
Completed 2026-10-16, isolated artifact/source fixture proof only. Built the
|
||
existing `key-cape/src/cmd/keycape` command from published clean source revision
|
||
`3c71226a1a7b8a2bdb710e9c497e1a1f7f8a3987`, source tree
|
||
`f0010b9cab17dbc3a787628a29657d98b900320f`, with cached Go 1.23.0,
|
||
CGO disabled, Linux/amd64 v1, trimmed paths, disabled VCS stamping and offline
|
||
read-only module selection. The full retained closure pins 108 source files,
|
||
9876 toolchain files and ten used module source directories. Three isolated
|
||
build locations produced identical 13633409-byte artifacts:
|
||
`sha256:be37738fe1c08259fb4f9ca0daf0f9301bfffc237e5bb38435525dfbf11ccff5`.
|
||
|
||
Eight disposable checks use the actual executable and maintained helper/kernel,
|
||
with complete synthetic configs and a minimal environment: add/created-only
|
||
removal, normal pinned producer admission, rollback, lost-readback uncertainty,
|
||
stale revisions, substituted checker refusal, invalid startup config and missing
|
||
secret-env refusal. No checker stub or producer-pin override remains. The
|
||
artifact-bound descriptor proposal is
|
||
`sha256:76b1153d188062ece53fcd5e8d35290fdbfd02a69dd79d4b001fc42781afcdc3`.
|
||
Evidence: Custodian
|
||
`docs/changes/netkingdom-target-2026-10-16/browser-checker-artifact-next/`.
|
||
The first two build attempts succeeded but their closure collection failed;
|
||
both failures are retained, as is refusal of the older incomplete synthetic
|
||
fixture. No production config, credentials or cluster mutation was used.
|
||
|
||
This extracts completed build/fixture scope from T16 without claiming KeyCape
|
||
owner endorsement, native checker selection/storage custody, acknowledged type
|
||
integration, native evidence/session callbacks or attended browser acceptance.
|
||
T16 retains exact owner review and composition/admission scope. The attended
|
||
registration procedure remains unexercised.
|
||
|
||
## T18 — Make checker input and executable selection deterministic
|
||
|
||
```task
|
||
id: NK-WP-0048-T18
|
||
status: done
|
||
priority: high
|
||
state_hub_task_id: "9c45da71-fb4c-5f20-9065-90f448f37c64"
|
||
```
|
||
|
||
Completed 2026-10-16, isolated source correction and real-artifact fixture proof
|
||
only; independent integration/publication remain separately recorded. KeyCape
|
||
source review identified non-secret `KEYCAPE_ACCOUNT_PORTAL_URL` and
|
||
`KEYCAPE_BROWSER_LOGOUT_URL` overrides in config.Load. The original helper
|
||
inherited ambient environment, allowing valid supplied configuration to be
|
||
rejected or invalid supplied URL configuration to be admitted. A bare relative
|
||
checker filename could also be replaced by PATH lookup after the adapter had
|
||
hashed the selected local file. All three counterexamples are retained against
|
||
the unchanged predecessor.
|
||
|
||
The existing helper now resolves the selected checker file to an absolute path
|
||
and passes an explicit empty subprocess environment. Three opt-in real-checker
|
||
regressions verify both URL-verdict directions and relative-file selection under
|
||
a non-checker PATH decoy. All 39 affected checks pass with the exact supplied
|
||
artifact, as do 11 real-artifact helper/kernel scenarios. Source evidence:
|
||
Custodian `docs/changes/netkingdom-target-2026-10-16/browser-checker-environment-r2/`.
|
||
Historical descriptors remain retained; the helper correction changes successor
|
||
source-composition pins and requires their separate review/admission. An absolute
|
||
path is not immutable custody and does not eliminate file replacement races;
|
||
T16 retains native executable storage/custody and callback/type admission.
|
||
No production configuration, credentials or cluster mutation was used.
|
||
|
||
Source integration and publication: `916ba4b33e03179274d03b78bd898a4843e8653f`, following independent
|
||
Custodian source review in browser-checker-environment-r2/coordinator-review.json.
|
||
The ordinary protected projection pass assigned T17/T18 UUIDs with zero failures
|
||
and zero automation errors; generated-only brief commit refusal is retained.
|
||
The exact prior staged/working brief bytes were restored. Final source/publication/
|
||
projection evidence is retained in Custodian browser-checker-environment-r2/
|
||
canonical-integration.json. These source receipts do not admit native executable
|
||
custody, owner callbacks, acknowledged type changes or browser identities.
|
||
|
||
## T19 — Bind checker execution to verified immutable attempt bytes
|
||
|
||
```task
|
||
id: NK-WP-0048-T19
|
||
status: done
|
||
priority: high
|
||
state_hub_task_id: "f50fdcd1-00be-5c3c-be0c-345aa2126032"
|
||
```
|
||
|
||
Completed 2026-10-16, independently reviewed source implementation and synthetic
|
||
fixture proof only. The registration adapter now opens a bounded regular checker
|
||
artifact without following its terminal symlink, verifies the reviewed digest,
|
||
and snapshots the exact bytes into a write/grow/shrink/seal-removal-sealed Linux
|
||
memfd before helper access. Live and proposed config checks execute that same fd
|
||
through procfs with the existing empty environment; the fd closes on completion
|
||
or failure. Unsupported snapshot/seal/exec policy refuses through the existing
|
||
parent-session revocation and uncertainty boundaries. The earlier unbounded
|
||
pre-snapshot path read was removed during independent review; actual adapter
|
||
symlink/FIFO/oversize refusal tests verify helper access never starts.
|
||
|
||
Evidence: Custodian `docs/changes/netkingdom-target-2026-10-16/browser-resume-r1/`,
|
||
including exact base/preimages/postimages/patch, proposed descriptor, coordinator
|
||
source review and canonical integration receipt. Independent Custodian checks
|
||
passed 49 affected source tests and 12 actual Go checker/helper/kernel scenarios;
|
||
the sets overlap and are not separate acceptance counts. Existing published
|
||
Warden d97652a producer pins remain unchanged. The exact KeyCape artifact remains
|
||
`sha256:be37738fe1c08259fb4f9ca0daf0f9301bfffc237e5bb38435525dfbf11ccff5`.
|
||
The predecessor path-replacement refusal and the first expanded reopened-fd test
|
||
failure are retained; the latter fixture was corrected to restore write mode
|
||
before independently proving seals block reopened-fd writes and shared mmap.
|
||
|
||
This source task adds no native owner custody, callback, evidence trust, type
|
||
acknowledgment, credential access, consumer sign-in or rollback acceptance.
|
||
Executable memfds, Linux seals and usable procfs are explicit runtime dependencies
|
||
and still require native admission. This is an extracted source outcome from
|
||
T16, not completion of T16; T12/T14/T15 and all external-owner gates remain open.
|
||
|
||
|
||
Publication verified by the coordinator after the source worker usage limit:
|
||
`8790dd18ae83c4651ef3d1d923312a118a5b436b` is the actual remote main revision.
|
||
All five canonical source hashes match the reviewed packet. Normal synchronization
|
||
completed with zero failures/automation errors; all 19 task statuses match the
|
||
projection. T19's assigned UUID is retained. The original staged and working brief
|
||
bytes were restored and independently compared. The exact source, projection and
|
||
publication checks are in Custodian browser-resume-r1/canonical-integration.json.
|
||
Native acceptance remains open under T16 and the other named owner tasks.
|
||
|
||
|
||
## T20 — Prepare durable group provenance and prove disposable LLDAP compatibility
|
||
|
||
```task
|
||
id: NK-WP-0048-T20
|
||
status: done
|
||
priority: high
|
||
state_hub_task_id: "863fcbdb-e246-51ba-87ca-a2f44d01d6f8"
|
||
```
|
||
|
||
Completed 2026-10-17, source candidate preparation and bounded synthetic
|
||
compatibility proof only. This extracts evidenced implementation/fixture scope
|
||
from T14; T14 retains native storage, writer isolation, protected callback and
|
||
owner-acceptance gates. Source integration/publication and State Hub projection
|
||
are pending the coordinator's separate receipts; no revision or task UUID is
|
||
invented here.
|
||
|
||
The existing identity-provisioner group ensure/revoke interface now has a
|
||
reviewed candidate for a bounded owner-private SQLite journal, proven only in
|
||
local/disposable use. The initial storage instructions wrongly suggested a native
|
||
persistent-volume path; source review against accepted ADR-0015 corrected them
|
||
before publication. Production SQLite-on-a-PVC is not admitted: T14 retains
|
||
CNPG/rapp-postgres storage admission or a separately governed exception.
|
||
The local journal saves
|
||
complete prestate and intent before each attempted directory mutation, inventories
|
||
only confirmed new groups/memberships, binds original ensure idempotency and
|
||
correlation to the exact request digest, and refuses unsigned caller inventories
|
||
or legacy broad revoke requests. Replays never recreate removed state. Missing,
|
||
replaced or untrusted storage and missing intent rows stop execution; definite
|
||
before-mutation refusals retain evidence without stranding unrelated valid work.
|
||
Interrupted writes/readback remain unresolved across reopening. Revoke validates
|
||
all targeted native ids and complete member postimages before destructive work,
|
||
removes only confirmed creations and never deletes a preexisting empty group.
|
||
Server/configuration wiring, image-copy closure and owner storage/request
|
||
migration instructions are included. The existing endpoint's caller
|
||
authentication remains the existing boundary, not a new grant.
|
||
|
||
The candidate was prepared against NetKingdom
|
||
`878abc93588e12b6da1bac055cfbb3abb8d7adf1`; exact source patch digest
|
||
`sha256:1f3f3ca94c46dadac8f24896053d4d23179de795e50a24298a0cfbcc46cca30e`.
|
||
The independent Custodian review passed all 65 provisioner checks. The earlier
|
||
62-check candidate, two independent-review findings and subsequent fixes remain
|
||
retained rather than overwritten. Seven additional fixture-plan checks exercise
|
||
the preparation boundary; these counts overlap the same candidate and do not
|
||
measure task-completion percentage or independent acceptance.
|
||
|
||
A separately reviewed bounded fixture then exercised the exact candidate against
|
||
cached pinned disposable LLDAP and Python images, through actual GraphQL. All 14
|
||
closed compatibility/containment oracles passed: exact creation inventory,
|
||
separate-process SQLite reopening/replay/revoke, complete preexisting directory
|
||
preservation including empty/shared groups and memberships, refusal of shared
|
||
membership drift, retained uncertainty after a lost response following a real
|
||
addition, and refusal of unknown/cross-case receipt bindings. The fixture used
|
||
only newly generated synthetic users/passwords/key material in private tmpfs,
|
||
with a network-none anchor and shared loopback helper, no host ports/mounts,
|
||
no image pulls and no production or actual credential contact. The coordinator's
|
||
safe receipt reports both exact owned containers absent after cleanup; final
|
||
independent cleanup verification remains the coordinator's integration duty.
|
||
|
||
Evidence: Custodian
|
||
`docs/changes/netkingdom-target-2026-10-16/group-provenance-r1/`, including exact
|
||
source base/pre/postimages, patch/manifest, independent review and retained
|
||
refinements. Native fixture manifest
|
||
`sha256:8a0514f5f14137355972400cd4852f48c892316d28e3abd3c86635d7cb81eef2`;
|
||
retained safe result `native-fixture/execution-result.json` (original
|
||
`/tmp/nk48-groups-native-review-5pywb19z/result.json`). The source task supplies
|
||
no native owner assent, production rollout, protected session/evidence callbacks,
|
||
ordinary type admission or consumer login proof. LLDAP has no conditional
|
||
membership mutation or generation token here: exact readback cannot exclude
|
||
ABA or a concurrent external writer, so T14 remains open.
|
||
|
||
2026-10-17 verified source follow-through: source commit `4f65e41` passed normal
|
||
local scanning and all 65 canonical provisioner tests. The actual disposable
|
||
LLDAP receipt passed all 14 oracles; independent verification on the pinned
|
||
daemon found both exact names and the run label absent. Source integration
|
||
includes the ADR-0015 documentation correction; the journal remains local-only.
|
||
|
||
T14 source preparation is underway. Twenty-three pinned public sources identify
|
||
NetKingdom implementation/reconciliation, Platform custody/database governance
|
||
and rapp-postgres consumer provisioning; the inspected runtime binding does not
|
||
assign identity-provisioner a package. The existing User Engine runtime token
|
||
and pod route are not a protected-case caller lane. The native proposal preserves
|
||
the same journal seam on a dedicated CNPG consumer and requires authoritative
|
||
scope binding, admitted role/lease/placement/recovery and all LDAP writers fenced.
|
||
The declared exclusive maintenance window is not mechanical exclusion of WebUI,
|
||
helper or lifecycle writers. Capacity placement and EUR cost/risk remain owner
|
||
decisions. No package, database, credential, rollout or owner assent was created.
|
||
Custodian evidence: group-provenance-r1/native-storage-proposal-r1; final source,
|
||
projection and cleanup review: resume-integration-r1/publication-verification.json.
|
||
|
||
|
||
## T21 — Implement the PostgreSQL journal and prove disposable SQL compatibility
|
||
|
||
```task
|
||
id: NK-WP-0048-T21
|
||
status: done
|
||
depends_on: [NK-WP-0048-T20]
|
||
priority: high
|
||
```
|
||
|
||
Completed 2026-10-17: bounded source preparation and actual disposable PostgreSQL
|
||
compatibility only. T14 retains native storage, custody, callbacks, authorization,
|
||
all-writer isolation and production admission. Coordinator source publication and
|
||
projection remain separate follow-through; no source revision or task UUID is
|
||
invented here. T20 remains the historical local SQLite/actual LLDAP proof.
|
||
|
||
The eight-path source candidate adds an injection-only PostgreSQL implementation
|
||
behind the existing owner journal seam, with explicit trusted tenant/directory/
|
||
case/source/principal/epoch binding and independent continuity callbacks. It
|
||
persists bounded intent/created-only receipts, exact-one version updates, durable
|
||
active fences, and a content-bound journal chain. SQL commits precede independent
|
||
exact-marker acknowledgment; lost replies/checkpoints poison continuation and
|
||
retain uncertainty. A counter-only checkpoint is explicitly insufficient for
|
||
divergent clones. Migration does not create database/schema/credential, admit an
|
||
epoch or clear quarantine; production HTTP activation is absent pending trusted
|
||
callbacks. Pinned psycopg package/image-copy closure is included, without claiming
|
||
an image build or native dependency admission.
|
||
|
||
Candidate base `6cb43c0cc55212363a5406b02db046e2384a7c40`; final eight-path patch
|
||
`sha256:5549d2982b61ff70aba4b3928fecd5639db0f1a732ab2f8630f678e7acf4d34d`.
|
||
All 82 source tests pass, alongside 13 fixture plan/diagnostic checks and two
|
||
source-backed snapshot regressions. Counts overlap the same source and fixture;
|
||
they are not additive native acceptance or completion percentages.
|
||
|
||
The independently reviewed R5 fixture ran the actual SQL migration/backend and
|
||
existing provisioner path against cached pinned disposable PostgreSQL. Directory
|
||
operations deliberately used the existing synthetic LLDAP test double. All
|
||
manifest-declared phase oracles passed: creation-only inventory and DDL refusal;
|
||
separate-process replay/revoke with complete preexisting/shared visible-state
|
||
preservation; foreign-context refusal; concurrent exactly-once reservation and
|
||
stale version refusal; actual database fork with divergent bodies at the same
|
||
counter and fresh-object rejection of the losing exact checkpoint; retained
|
||
uncertainty after checkpoint/directory/SQL response loss; and actual pg_dump/
|
||
pg_restore rollback refusal against the independently retained fixture checkpoint.
|
||
The checkpoint is fixture-only, not an admitted native owner evidence holder.
|
||
|
||
Only generated credentials/state were used, with two nonroot/read-only containers
|
||
on private loopback, bounded tmpfs/CPU/memory/PIDs/lifetimes, no host ports/mounts,
|
||
no pulls and no production contact. The safe receipt reports both exact owned
|
||
containers absent, with no daemon uncertainty. Independent final pinned-daemon
|
||
cleanup verification remains coordinator follow-through.
|
||
|
||
Failed R2/R3/R4 receipts and source revisions remain retained. R2's helper failure
|
||
subphase is unknown; R3 exposed a real backend bug where replacing nested receipt
|
||
objects lost the created ID held by ensure, fixed by acknowledging only the backend
|
||
version after commit/checkpoint. R4 verified that fix through actual SQL bootstrap,
|
||
then exposed fixture snapshot aliasing and empty deleted-group backing entries;
|
||
source-backed regressions corrected the snapshot without weakening complete
|
||
visible-prestate equality, and reject nonempty orphan membership. These refinements
|
||
belong to one trial, not extra native acceptance successes.
|
||
|
||
Custodian evidence: `docs/changes/netkingdom-target-2026-10-16/group-postgres-r1/`;
|
||
exact source/pre/postimages and retained predecessors; native R5 manifest
|
||
`sha256:d51f90816616848b93bcdc482e10a98d07061deb01eeed9e50700fc6e68b6051`;
|
||
`final-integration-r1/typed-execution-evidence.json` and byte-exact safe receipt
|
||
(original `/tmp/nk48-postgres-native-review-sguj7t8p/result.json`). No CNPG native
|
||
storage/HA/backup/lease/TLS/capacity/restore admission, authoritative protected
|
||
callbacks, real LDAP writer fencing/CAS/ABA exclusion, owner assent or production
|
||
endpoint activation is claimed. Those remain live T14 work.
|