net-kingdom/docs/evidence/2026-10-03-root-grant-delivery-progress.md
tegwick 0f2e8734e5
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Finish NK-WP-0045 with verified attended custody recovery
Assistant: codex
Assistant-Model: gpt-6.1-sol
Assistant-Session: 01a1029d-2c93-7500-a0e0-e3e089668b29
2026-10-03 21:59:22 +02:00

340 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Root-grant delivery progress — 2026-10-03
Work: NK-WP-0045. Scope: approved OpenBao custody-record delivery. This receipt
records source preparation, safe preflight and verified attended admission/
publication receipts. It is not custody-grant or recovery-readiness evidence.
## Human disposition and initial empty record
Bernd accepted ADR-0017 and the proposed OpenBao design (scoped made decision
`c2cff929-91b9-4018-bfd6-fa04f7da8280`), then approved going forward.
Asked which existing signed ceremony grounds the first grant, he replied:
“i dont think there is one”. No current ceremony reference or exact custodian
issuer/subject was supplied. Historical local bootstrap metadata and the
planned signed escrow roster cannot substitute for a real grant.
Prepared [initial empty record](../../examples/custody-record/initial-empty-record.json)
for review and attended publication: stable record ID `nk-custody:platform-root`,
revision 1, owner `net-kingdom-custody`, 900-second maximum and `entries: []`.
This is an intentionally empty authoritative candidate, not a synthetic grant
fixture. It represents no certified root grants. Schema and semantic validation
passed. It was subsequently published through the attended lane, as recorded
below. Initial publication must use CAS=0 and fail if an
existing document or unresolved retained history is discovered; do not replace
an existing record on the assumption that no ceremony was supplied.
A future real grant requires a human-controlled ceremony naming exact issuer,
subject, actor, action time/reason and evidence reference, introduced in a
strictly newer revision. No identity is inferred from JWT roles or LLDAP groups.
## Source preparation and checks
- NetKingdom validator now emits `expires_at` so consumers can honor cache bounds
tighter than 900 seconds. All 18 focused tests pass, including zero/60-second
bounds. Canon source pin `db319335b27b61b855382ee5af5d690f06eeb010`.
- railiance-platform implemented exact reader admission, whole-document CAS,
independent receipt history, interrupted-publication recovery, replay and
stale-receipt refusal, and restore checks; 14 tests passed. Source baseline
`fa958cc`, attended empty-publication packet `35d326f`, exact-commit primary
synchronization applied.
- rapp-user-engine prepared dedicated openbao-audience JWT projection, scoped
egress and explicit-image release rendering; 7 packaging tests passed. Source
baseline `576f5e7`, pushed with clean working tree; empty-source rollout is
explicitly supported. PostgreSQL baseline uses
the existing DB; no new persistent volume is needed.
- user-engine implements pinned canon, authenticated bounded reads, atomic
PostgreSQL baseline, controlled receipt-bound bootstrap and optional
AccountAuthority mapping. Isolated PostgreSQL checks verified competing CAS
updates, cross-connection persistence and reconnect persistence. Final source
`0d0751d`: suite ran 296 tests with eight skips; layer checks, wheel build and
embedded-resource integrity passed. Published image verified by registry manifest and disposable container:
`sha256:030fe90232e20bb02b372e3d16b8ff659a5407d54f6405eb85754262b9ad7dc6` (source `0d0751d`). Embedded reader, baseline,
bootstrap, canon and AccountAuthority field were checked; owner sync `f85c968`.
## Safe live preflight
OpenBao workstation tunnel `http://127.0.0.1:18200`: initialized true, sealed
false, standby false. Anonymous read of the exact custody data path returned
403; response bodies were discarded. This proves only anonymous denial, not
reader admission, document existence or positive live custody delivery.
## Remaining execution and acceptance
The founder completed OpenBao provisioning and publication in the attended
OIDC/MFA lane; fresh success receipts are recorded below. Existing approval was
sufficient for the reviewed delivery work. The concrete producer packet is in
`railiance-platform/openbao/root-grant/README.md`.
Keep independently retained latest publication history through restore. Its
location and backup receipt must be recorded before recovery readiness closes.
The custody-capable application image is published/pinned and its deployment
passed preflight. Deploy through rapp-user-engine and initialize the
baseline using the authenticated document plus publisher digest. Empty source
acceptance proves no-grant delivery; it cannot prove a real positive grant or
revocation. Positive grant/revocation exercises use isolated synthetic test
sources unless a real human ceremony explicitly introduces a live grant.
No live admission, publication, workload rollout or actual root grant occurred
in this receipt. Source/fixture passes are distinct from live acceptance.
## Exact deployment preflight
rapp-user-engine rendered the published image into
`/tmp/user-engine-custody-release.yaml`, manifest SHA256
`5e21548fc2d23926d167f17795f098f8db5fffafe9bcd3bee43875f7bb51a50e`
(rapp-user-engine release packet commit `13a9c0b`, committed and synced).
Live node `92.205.62.239` Ready; requested CPU 3445m/4000m (86%), memory
9384Mi (58%). Staged Deployment retains single-replica Recreate and requests
50m/64Mi. Server dry-run passed eight objects. Client diff returned expected
changes (exit 1) to Deployment and runtime NetworkPolicy; raw diff output
suppressed. Existing live factor-recovery URL, mounts, volumes and egress
semantics are preserved. This final artifact supersedes the earlier preflight
hash after preserving that live setting. No apply or workload mutation.
Image publication and attended reader/source admission/publication are resolved.
Reviewed runtime rollout, controlled baseline initialization and live
no-grant/denial/outage/restart acceptance remain. Off-host publication history
retention/recovery needs its real receipts before recovery readiness closes.
## Attended execution receipts
Founder executed the reviewed commands and reported success. Both fresh receipts
were independently read and their non-secret fields retained in
[admission receipt](2026-10-03-platform-root-admission-receipt.json) and
[publication receipt](2026-10-03-platform-root-publish-receipt.json), with source
file SHA256 checksums. Both report `ok: true`; admission confirms exact role,
namespace/ServiceAccount, audience, CAS and audit. Publication confirms revision
1, KV version 1 and the reviewed empty-document digest. The independently
persisted publisher baseline matches these fields. This supersedes the earlier
pending-admission/publication state, without claiming runtime or recovery
acceptance. The operator's older OIDC role configuration is not an execution
receipt. Owner rollout and authenticated baseline/read acceptance resumed.
## Live runtime and consumer acceptance
rapp-user-engine applied only the reviewed Deployment and runtime NetworkPolicy.
Bounded apply artifact SHA256
`804400134a705651d12ada05a068543d2f1665a14eec5c3b65898c7560a63a8f`.
Rollout succeeded; Ready/available 1, health/readiness HTTP 200. One initial
restart was safely traced to a transient original runtime PostgreSQL connection
refusal; subsequent restart count remained stable. This is distinct from the
post-baseline restart acceptance exercise.
The consumer's [live acceptance receipt](2026-10-03-user-custody-live-acceptance.json)
reports `ok: true`: baseline initially absent, controlled initialization from a
fresh authenticated owner read matched the publisher digest, empty-source
mapping returns no root grant, wrong tenant returns no grant, and a real
wrong-audience JWT login is denied. Database reconnect preserves baseline.
Injected read failure and same-revision mutation preserve the trusted baseline;
these are injection checks, not claims of an actual OpenBao backend outage.
Post-initialization pod restart, exact-reader negative capabilities/audit and
independent backup/recovery evidence are still being collected. No actual grant
was introduced.
The [final consumer receipt](2026-10-03-user-custody-live-final-acceptance.json)
subsequently verified baseline persistence after an actual controlled pod
restart, a fresh matching owner read and HTTP 403 for the actual reader's
metadata LIST, sibling GET and exact-path POST. The internal fixture service
serialized `root_grant: null` against the actual live empty source; it does not
claim acceptance of the separate external Hub authenticated route. Safe read
and login request IDs were retained for owner audit correlation. USER-WP-0037-T02
is accepted for this delivered no-grant integration; the separate Hub route
task is outside this acceptance. The restarted workload is Ready; its initial
DB connection refusal also occurred on the controlled restart, recovered, and
remained stable. No ongoing CrashLoop or zero-restart claim is made.
The [isolated Raft recovery receipt](2026-10-03-platform-root-isolated-raft.json)
reports actual disposable OpenBao v2.5.5 snapshot/restore checks: an older
snapshot missing the custody source was refused against the independent
baseline, and the latest snapshot restored the matching revision/digest.
Scratch copy/restore of baseline and immutable history verified content and
permissions. Temporary daemon/storage were removed. No production snapshot
or rollback was used. This proves the isolated recovery guard, not current
provider backup coverage or the attended live-source restore check.
## Final audit and recovery handoff
The [safe audit receipt](2026-10-03-root-custody-audit-correlation.json)
independently correlates both consumer read/login request IDs with request and
response audit events and no errors. The bounded lookup inspected only the
latest 64 MiB of the owner audit file; raw audit records were never emitted.
This resolves audit correlation.
USER-WP-0037-T02 is done, synced HEAD `d955cd7`; runtime workplan is finished,
synced HEAD `f108c65`. The remaining T05 gate is the attended producer recovery
finish helper: current retained-baseline/source match plus encrypted history
provider upload/download/decryption through the existing governed Nextcloud
Backup lane. Final producer/finish suite: 19 passed, including actual age crypto
roundtrip against an in-memory disposable provider. It preserves all backups and
uses a unique receipt/object. The surfaced historical backup-share URL is not
repeated or stored here; the helper compares it with the current lane only as a
boolean and stops for owner incident handling if they match. This unresolved
comparison is not represented as a harmless or rotated credential.
Producer synced `b8f8a7ada65f0a86b90a54812365757838102991`, exact commit
applied on primary/railiance01, clean with ahead/behind 0. Non-authoritative
baseline/history recovery copy in owner source `a252447058105eed0931d34f1a906f39ce7c2e5e`
was retrieved through a fresh remote clone and matched byte-for-byte; the owner
retains its safe remote readback receipt. Provider archive generation is
explicitly unverified; the prepared attended direct encrypted history roundtrip
is still required. All authorized source work is implemented and synced.
## Failed recovery finish attempt — 2026-10-03
Founder ran the prepared helper with fresh receipt path
`/tmp/platform-root-finish-20261003T185421Z-333977.json`. Warden reported child
nonzero and session revoked; no receipt was created. Recovery/provider readiness
is not established. The helper's catch-all exit without a safe failure receipt
was an implementation gap and is being repaired before another attended retry.
Independent [bounded audit lookup](2026-10-03-root-custody-finish-failure-audit.json)
confirms successful custody, governed backup-lane and operator backup-bundle
reads at 18:54:37–38 UTC, with no errors. The failure is therefore after those
reads, within the backup roundtrip preparation/execution. Its exact stage cannot
be inferred from suppressed exceptions. No IAM widening is justified. Local
imports, validator/schema pins, retained-state validation and installed age
binaries pass offline preflight. Owner repair adds allowlisted stage/failure
receipts and full-command failure tests while keeping all raw diagnostics private.
Producer repair committed `33ff822`: stdlib entry reserves a fresh mode-0600
receipt before imports, with fixed stage/error codes for expected failures and
safe numeric HTTP/artifact metadata. Foreign exception text is never emitted.
The installed wrapper was independently smoke-checked outside the attended
envelope: it refused before owner reads and created the expected safe failure
receipt, with no raw output. Producer suite passed 32 tests, including full
private attended-HOME command execution with the real validator and age crypto
against disposable owner/provider fixtures, startup/dependency, stale receipt,
auth, quota, crypto, upload/download and incident/escrow failures.
Recovery decryption now verifies the existing independent local escrow recipient
against the governed lane and decrypts downloaded history with that escrow key;
no key is created, reset or printed. A mismatch is a specific recovery blocker.
Corrected attended retry with a new receipt is necessary to prove the actual
provider roundtrip or expose its precise safe failure stage. The original
failure's exact cause is still unknown, and provider readiness remains unproven.
## Provider upload rejection diagnosed — 2026-10-03
Founder retried with fresh receipt
`/tmp/platform-root-finish-20261003T191229Z-333977.json`; the
[safe failure receipt](2026-10-03-root-custody-finish-upload-rejected.json)
reports `stage: provider_upload`, `error_code: new_artifact_upload_failed` and
HTTP 401. Current retained baseline matches revision 1/KV1/digest; existing
independent escrow recipient matches the governed lane. Historical local share
does not match the current lane; its revocation remains separately unverified.
No provider backup success is claimed.
Source review found the custody upload omits `X-Requested-With: XMLHttpRequest`.
[Official Nextcloud WebDAV documentation](https://docs.nextcloud.com/server/stable/developer_manual/client_apis/WebDAV/basic.html)
requires this header on public DAV non-GET requests unless outgoing federation
is enabled; without it, the documented response is 401 Not Authenticated.
This is a concrete client defect and a likely explanation of the observed 401,
not proof that the current share credential is invalid or that header correction
already resolves this live instance. Producer is fixing/testing the protocol
request while retaining existing endpoint, credentials and permissions. A new
attended live result is still required.
Producer protocol repair committed `50da37c`: custody public-DAV upload now sends
the required header, with a real local HTTP wire test verifying its presence and
conditional-create semantics. Shared migration request helper and common upload
client have the same scoped source correction. Forty-one tests passed (19 finish,
14 producer, eight backup credential checks); shell syntax and diff checks pass.
Failure receipts retain the backup lane's KV version. No token, endpoint, policy,
key or account-fallback change was made. Source synchronization does not establish
rollout of older vendored backup clients; owner records that refresh requirement
separately. The corrected custody finish command needs a new attended run and
fresh receipt to prove this live provider path.
## Header-corrected live retry still rejected — 2026-10-03
Founder ran the corrected helper with fresh receipt
`/tmp/platform-root-finish-20261003T192330Z-290055.json`. The
[retained retry receipt](2026-10-03-root-custody-finish-header-retry-rejected.json)
again reports provider upload HTTP 401, now tied to backup lane KV version 3.
Current custody baseline and independent escrow checks pass, and the historical
share remains different from the current lane. The header correction does not
resolve this live rejection; an invalid, protected, expired or mismapped share
cannot be distinguished from client endpoint/auth semantics by 401 alone.
Producer is preparing a bounded read-only attended provider/share inspection:
compare the current protected token with the operator's exact reviewed share,
report owner/path/create-only permissions, password/expiry indicators and safe
endpoint probes. No upload, rotation, provider share mutation or IAM widening
is authorized by diagnosis alone. Another unchanged finish retry is not requested.
The remaining task stays blocked on diagnosed provider delivery and its live
encrypted backup/readback proof; source/consumer/audit readiness is preserved.
Read-only inspection implementation synced at producer
`4dd9646ec21b63a7743dae0ad3273da2f73adefe`. The existing attended wrapper now
accepts `--inspect-share`: current governed OCS share inventory is compared in
protected memory, and fixed provider public routes receive depth-zero PROPFIND
only. Output contains binding booleans and safe status classifications. Full-main
inspection tests forbid entering the backup roundtrip. Twenty-three finish tests
pass. Final review correction synced at
`fee1d339f98d0fd7ec2336d946eea2340d557f8a`: aware expiry offsets are converted
correctly, naive expiry and omitted password remain unknown, and clearly
protected/expired shares skip public authentication probes. Twenty-five finish
tests pass. Exact expected/derived remote projection applied, working tree clean.
Inspection still requires the founder's own attended credential route;
no provider conclusion or actual backup success is inferred from source tests.
## Successful share inspection; recovery remains blocked
The attended read-only receipt at 19:36 UTC is retained in
`2026-10-03-root-custody-share-inspection.json`. The baseline matches live KV1;
backup lane KV3 has neither its token nor the expected labelled share in the
reviewed owner folder inventory. Both authenticated route probes returned 401;
the unauthenticated documented route returned 503. No provider mutation or
encrypted-history roundtrip was performed. Inventory absence is scoped to that
folder; these results do not prove global deletion or successful recovery.
The platform owner is preparing a tested attended repair that proves replacement
share upload/download/decryption before CAS of only the lane's upload coordinates,
preserving all other fields, keys, backups and unknown shares. Activity-core owns
the subsequent consumer refresh: worker environment snapshots and the frozen
Forgejo backup ConfigMap require explicit loaded-client evidence.
Security orientation reloaded after compaction: package 0.2.4, digest
`025aab4f38246219c924bc94954e70ea0e6e7f72bcaf8d4344cd599602d345c3`,
start card withheld/orientation-only because a source changed. Reviewed the local
start card and operative NetKingdom SECURITY-COMPANION directly; this retrieval
does not grant authority or establish live readiness.
Bounded repair source `railiance-platform/f1a780d` passed 33 finish tests, with
55 relevant producer/backup tests total. Exact public DAV and OCS wire shape,
real encryption/decryption, stale-version refusal and partial CAS receipts are
covered. Actual attended provider success is still outstanding.
Activity-core owns the live stale-client refresh in `ACTIVITY-WP-0042-T08`,
task `020d19be-0576-5052-ad35-14b1d5a48fe1`; T07 holds the read-only inspection.
Activity-core final source `42d71fa` is clean and Git-pushed; local consistency
passes and duplicate task blocks were corrected without changing UUIDs.
Its repo-manager remote projection preflight rejects grandfathered historical
`custodian-WP-*` identifiers. Exact remote projection is therefore unproved;
this compatibility blocker is separate from the provider repair and consumer
refresh. Historical identifiers must not be renumbered to bypass the rejection.
## Final attended recovery acceptance — 19:56 UTC
Verified actual local receipt
`2026-10-03-root-custody-recovery-verified.json` against the acceptance fields.
Current custody record revision1/KV1 and digest match the independent baseline.
Encrypted history upload returned201 and owner download200; ciphertext digest
`577498be3c6566e9622fe0d87ea3ad55063941acfab3aeb0accfc4a05dd21200` matched,
and independent escrow decryption produced the exact retained history.
Provider proof preceded backup lane CAS3->4. Only upload coordinates changed;
escrow and unrelated fields, unknown shares and old backups were preserved.
Replacement share23 was created within the reviewed Backup scope.
NK-WP-0045-T05 is done, plan finished (6/6). Actual live consumer, denial/restart,
audit and isolated Raft restore evidence recorded above remain applicable.
Runtime backup consumers were not refreshed; activity-core T08 continues to own
that requirement after its provider prerequisite was met. Historical credential
owner/revocation remains unverified in the separate platform incident. No real
custodian was certified: authoritative entries remain empty.
Root knowledge card reloaded for closure: package0.2.4, digest
`025aab4f38246219c924bc94954e70ea0e6e7f72bcaf8d4344cd599602d345c3`,
verified-files/orientation-only. Actual authority came from the approved design
and founder-attended execution, not the knowledge card.