From 470b3722024ecec4f500105045148b2ba4eba779 Mon Sep 17 00:00:00 2001 From: tegwick Date: Sun, 4 Oct 2026 14:47:02 +0200 Subject: [PATCH] Prepare the STATE-WP-0094 exact-record admission and store load (v10, not executed). Bound copies of the four memos carry the receipt's approval ids and engine-computed binding digests. DEPLOY-v10.md proposes the flex-auth v10 upgrade, the review ConfigMap informed-decision-runtime-75ab117cc787, a self-contained store load and recovery to revision 9. Nothing is deployed, admitted or loaded. Approvals expire 2026-10-05T12:19:09Z. Co-Authored-By: Claude Opus 5.5 Assistant: claude-code Assistant-Model: opus Assistant-Process: 692292@bnt-lap001 Assistant-Session: 89c7d8e8-e1b3-47eb-9411-a0ab227fca2f --- .../2026-10-04-state-hub-wp0094/DEPLOY-v10.md | 159 +++++++++++++ .../2026-10-04-state-hub-wp0094/OPERATOR.md | 11 +- ...ness-runner-deploy-trial-e77f8b4.memo.json | 1 + ...ness-runner-deploy-trial-e77f8b4.packet.md | 39 ++++ ...ess-schedule-enable-retire-sweep.memo.json | 1 + ...ess-schedule-enable-retire-sweep.packet.md | 33 +++ .../bound/index.json | 33 +++ ...owner-return-pickup-plan-b6222af.memo.json | 1 + ...owner-return-pickup-plan-b6222af.packet.md | 55 +++++ ...b-edge-receiving-rollout-c287ed8.memo.json | 1 + ...b-edge-receiving-rollout-c287ed8.packet.md | 43 ++++ .../proposed/review-rollout-v10.json | 219 ++++++++++++++++++ .../proposed/sitting-admission-v10.json | 19 ++ .../proposed/store-load-v10.py | 85 +++++++ .../2026-10-04-state-hub-wp0094/sitting.json | 31 ++- 15 files changed, 725 insertions(+), 6 deletions(-) create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/DEPLOY-v10.md create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-runner-deploy-trial-e77f8b4.memo.json create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-runner-deploy-trial-e77f8b4.packet.md create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-schedule-enable-retire-sweep.memo.json create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-schedule-enable-retire-sweep.packet.md create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/bound/index.json create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/bound/owner-return-pickup-plan-b6222af.memo.json create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/bound/owner-return-pickup-plan-b6222af.packet.md create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/bound/state-hub-edge-receiving-rollout-c287ed8.memo.json create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/bound/state-hub-edge-receiving-rollout-c287ed8.packet.md create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/proposed/review-rollout-v10.json create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/proposed/sitting-admission-v10.json create mode 100644 docs/batches/2026-10-04-state-hub-wp0094/proposed/store-load-v10.py diff --git a/docs/batches/2026-10-04-state-hub-wp0094/DEPLOY-v10.md b/docs/batches/2026-10-04-state-hub-wp0094/DEPLOY-v10.md new file mode 100644 index 0000000..1c48f43 --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/DEPLOY-v10.md @@ -0,0 +1,159 @@ +# STATE-WP-0094 memo admission — PROPOSED, NOT EXECUTED + +> **Approvals expire `2026-10-05T12:19:09Z`.** All four (`974eae4d`, `77993081`, +> `4ae04c8e`, `b75752d1`) must be answered before then. If they lapse, none of +> this package applies: new approvals mean new digests, new bound memos and a +> new policy version. + +Status: prepared by an agent on 2026-10-04. Nothing below has been run. It needs +the founder's separate "yes, deploy it". It admits four exact records and loads +four unanswered memos. It does not accept, decline or seal any memo, and it +does not resolve hub decision `7b19de6c-72a1-409e-89a9-ec3ac09c03fd`. + +## Live state read before preparation (read-only, 2026-10-04) + +- Helm release `flex-auth-informed-decision-sitting`, namespace `flex-auth`: + **revision 9**, `deployed` 2026-10-04T02:06:18+02:00, chart `flex-auth-0.2.0`. + Image `forgejo.coulomb.social/coulomb/flex-auth@sha256:aa7ccbafb2a8f884c97119e295fd168fa4e67e974682a8c30b35149201469eff` + (v9, CI build of access-engine `103d8b6`). `helm get values` equals + access-engine `values/informed-decision-sitting.yaml` at `58e33d2`. +- Deployment `informed-decision` (ns `informed-decision`): volume + `configuration` → ConfigMap `informed-decision-runtime-35b00b8608e0` (v9 pin; + `tools/render_deployment.py` on `deploy/sitting-admission.json` reproduces + it byte for byte). Image + `forgejo.coulomb.social/coulomb/informed-decision@sha256:ccca0b377bb8ba6af52a37edc453b5b51c96e380840ec8243ffaab3ac2170885`, unchanged by this package. + +## Inputs prepared + +| Item | Value | +|---|---| +| Receipt | `docs/evidence/2026-10-04-state-hub-wp0094-approval-create.json` | +| Bound memos | `bound/` (4 memos + packets + `index.json`), principal `uid=platform-root,ou=people,dc=netkingdom,dc=local` | +| Policy source | access-engine `58026ea34a13f0bef103957e10818ea3b1d4458a` (local, **not pushed**) | +| Policy version / digest | `v10` / `sha256:ede11f888d57809dfce1b04d2323708c7244f36187fd5a58dd738437a05e7e91` (computed with `policy.Package.Digest()`; the same method reproduces live v9 `sha256:28fcb6c0…e148f`) | +| Runtime input | `proposed/sitting-admission-v10.json` (only `policy.version` and `policy.package_digest` differ from `deploy/sitting-admission.json`) | +| New ConfigMap | `informed-decision-runtime-75ab117cc787` in `proposed/review-rollout-v10.json` | +| Store load | `proposed/store-load-v10.py` (self-contained, embeds `bound/`; tested on a scratch store only) | + +| Memo | Approval | Binding digest | +|---|---|---| +| `state-hub-edge-receiving-rollout-c287ed8` | `974eae4d-782d-41ed-93be-e34433b5fe59` | `sha256:84735b88b2db20d9445af369e28a8d40bd495dd20c0303ff3a764666ec976dde` | +| `owner-return-pickup-plan-b6222af` | `77993081-1db2-4bba-99f2-74ca1f8652b1` | `sha256:e745ef64658e77e41b2a5ef569ec0f6986e120d338656d75749425f5f29b7ca0` | +| `freshness-runner-deploy-trial-e77f8b4` | `4ae04c8e-d604-4d8b-b166-693eef855da8` | `sha256:f8ff89dd353c1d2006622c45996c0f05f050865f8c203373dc74da1ba3f05e24` | +| `freshness-schedule-enable-retire-sweep` | `b75752d1-bab6-4cf3-9308-5368c1d5aa91` | `sha256:cc3e8fe6ace5438f19d647d3de226407c8b009985c82ad9a993e81226e6f316f` | + +## Steps (in order) + +**0. Build the v10 image.** Push access-engine `58026ea` through its normal sync +(`statehub fix-consistency --repo access-engine`, which pushes main). The +change touches `examples/**` and `internal/**`, so `.forgejo/workflows/image.yaml` +builds `forgejo.coulomb.social/coulomb/flex-auth:main-58026ea`. Obtain the +digest from the CI step "Report immutable digest" (`docker inspect` RepoDigests +line), and confirm it independently: + +```bash +docker pull forgejo.coulomb.social/coulomb/flex-auth:main-58026ea +docker inspect --format='{{index .RepoDigests 0}}' forgejo.coulomb.social/coulomb/flex-auth:main-58026ea +``` + +Both must agree. Call it `` below. Verify the image carries v10: + +```bash +docker run --rm --entrypoint cat forgejo.coulomb.social/coulomb/flex-auth@ \ + /opt/flex-auth/examples/informed-decision-sitting/policy.md | grep -E '^version: v10$|974eae4d|b75752d1' +``` + +**1. Pin and upgrade the policy release.** In access-engine set +`values/informed-decision-sitting.yaml` `image.digest: ` (comment: +"CI image of 58026ea (v10 adds the four STATE-WP-0094 memos)") and update +`TestSittingImagePinMatchesRecordedBuild` to the same digest; commit. Checked on 2026-10-04: `helm template` of the current chart +(access-engine `charts/flex-auth`, changed in `3cb1cfa` after v9) with these values +renders identical to the live revision-9 manifest, so the upgrade changes only the +image digest. Re-run that comparison against the edited values before upgrading: + +```bash +cd /home/worsch/access-engine +diff <(helm -n flex-auth get manifest flex-auth-informed-decision-sitting) \ + <(helm template flex-auth-informed-decision-sitting charts/flex-auth -n flex-auth \ + -f values/informed-decision-sitting.yaml) # expect only the image line +``` + +Then: + +```bash +helm upgrade flex-auth-informed-decision-sitting /home/worsch/access-engine/charts/flex-auth \ + -n flex-auth -f /home/worsch/access-engine/values/informed-decision-sitting.yaml +helm -n flex-auth history flex-auth-informed-decision-sitting # expect revision 10 deployed +kubectl -n flex-auth rollout status deploy/flex-auth-informed-decision-sitting +``` + +**2. Policy checks.** +- Published image (offline, mirrors v9): extract the binary and run + `python3 tools/exercise_sitting_review_policy.py --binary --receipt /tmp/v10-image-exercise.json` + in access-engine. Expected: every check passes (the source build gave 1005). + This covers, for each of the four records, exact read allow + `operator_admitted_compact_sitting`; wrong binding digest deny; and the + `TestWP0094ExactRecords` cases (foreign approval id deny, v9 record still + allowed, attribute-shaped unlisted memo deny `unknown_class`). +- Live service, from inside the review pod with the image's policy client as + for v9: the v10 pin (`v10`, `sha256:ede11f88…7e91`) returns allow; the old v9 + pin returns `invalid_decision`. Until step 3 the review pod still holds the + v9 pin, so live reads fail closed in that window — keep it short. + +**3. Swap the review runtime ConfigMap.** + +```bash +cd /home/worsch/informed-decision +python3 - <<'EOF' > /tmp/cm-v10.json +import json; l=json.load(open('docs/batches/2026-10-04-state-hub-wp0094/proposed/review-rollout-v10.json')) +print(json.dumps([i for i in l['items'] if i['kind']=='ConfigMap'][0])) +EOF +kubectl -n informed-decision create -f /tmp/cm-v10.json # immutable informed-decision-runtime-75ab117cc787 +kubectl -n informed-decision patch deploy informed-decision --type strategic -p \ + '{"spec":{"template":{"spec":{"volumes":[{"name":"configuration","configMap":{"name":"informed-decision-runtime-75ab117cc787","defaultMode":292}}]}}}}' +kubectl -n informed-decision rollout status deploy/informed-decision +``` + +The rendered Deployment in `review-rollout-v10.json` differs from live only in +that volume. Keep `informed-decision-runtime-35b00b8608e0`. Then in this repo set +`deploy/sitting-admission.json` to the contents of +`proposed/sitting-admission-v10.json` and commit. + +**4. Back up the store, then load.** + +```bash +kubectl -n informed-decision exec deploy/informed-decision -- \ + informed-decision-admin backup --db /data/private/review.sqlite \ + --output /data/private/review-20261004-pre-wp0094.sqlite +kubectl -n informed-decision exec -i deploy/informed-decision -- \ + /opt/venv/bin/python - --db /data/private/review.sqlite \ + < docs/batches/2026-10-04-state-hub-wp0094/proposed/store-load-v10.py +``` + +Expected output: `"status": "loaded"`, the four memo ids, memos +4, and +`presentations`, `acknowledgments`, `dispositions` unchanged +(`no_presentation_or_disposition_created: true`). The script refuses, changing +nothing, if any memo id is already stored, a packet hash differs, or the store's +presentations are not exactly the bound principal. Do not retry a refusal +without reading it. + +**5. Record.** Write `docs/evidence/2026-10-04-state-hub-wp0094-v10-rollout.json` +(shape of `2026-10-04-emergent-profile-v9-rollout.json`, one row per memo), +set `sitting.json` status `loaded` with `policy_version: v10` and the digest, and +rewrite this file's header as deployed. + +## Recovery + +```bash +helm rollback flex-auth-informed-decision-sitting 9 -n flex-auth +kubectl -n informed-decision patch deploy informed-decision --type strategic -p \ + '{"spec":{"template":{"spec":{"volumes":[{"name":"configuration","configMap":{"name":"informed-decision-runtime-35b00b8608e0","defaultMode":292}}]}}}}' +``` + +and revert `deploy/sitting-admission.json` to v9. The v9 profile memo keeps +working under v9. The four loaded memos would then fail the v9 exact-record rule +until v10 is restored; they stay unanswered. The pre-load backup restores the +store per `deploy/README.md` if ever needed. No automatic approval recreation. + +The founder answers each memo at https://decisions.coulomb.social/ with fresh +MFA, before **2026-10-05T12:19:09Z**. diff --git a/docs/batches/2026-10-04-state-hub-wp0094/OPERATOR.md b/docs/batches/2026-10-04-state-hub-wp0094/OPERATOR.md index 057c567..a9a6bdc 100644 --- a/docs/batches/2026-10-04-state-hub-wp0094/OPERATOR.md +++ b/docs/batches/2026-10-04-state-hub-wp0094/OPERATOR.md @@ -39,10 +39,13 @@ admitted or loaded. ``` Read warden's printed line, not its exit code. Do not retry when a receipt was not retained. -3. Exact-record admission and store load: a new access-engine policy version - that admits exactly these four memos, plus the review runtime ConfigMap, - following the v9 pattern in `../2026-10-04-emergent-profile/DEPLOY-v9.md`. - This is its own deploy and needs your separate "yes, deploy it". +3. Exact-record admission and store load: **prepared, not executed** in + `DEPLOY-v10.md`. Policy v10 (access-engine `58026ea`) admits exactly these + four memos; review runtime pin `informed-decision-runtime-75ab117cc787`; + bound memos in `bound/`. Approvals `974eae4d`, `77993081`, `4ae04c8e`, + `b75752d1` (receipt `docs/evidence/2026-10-04-state-hub-wp0094-approval-create.json`) + expire **2026-10-05T12:19:09Z**. This is its own deploy and needs your + separate "yes, deploy it". 4. Answer each memo at the surface with fresh MFA. ## After an answer diff --git a/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-runner-deploy-trial-e77f8b4.memo.json b/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-runner-deploy-trial-e77f8b4.memo.json new file mode 100644 index 0000000..8345257 --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-runner-deploy-trial-e77f8b4.memo.json @@ -0,0 +1 @@ +{"approval_binding_digest":"sha256:f8ff89dd353c1d2006622c45996c0f05f050865f8c203373dc74da1ba3f05e24","approval_id":"4ae04c8e-d604-4d8b-b166-693eef855da8","binding":{"justification":null,"principal":{"display_name":"uid=platform-root,ou=people,dc=netkingdom,dc=local","id":"uid=platform-root,ou=people,dc=netkingdom,dc=local","identifiers":[],"kind":"person","role":"reviewer"},"target":{"environment":"production","id":"repo-manager:source:e77f8b457647ff23697e45a74615edde5f42d39d","kind":"service-release","label":"rmgr freshness runner","requires_new_bind":true},"terms":null},"binding_level":"organizational","brief":"Deployment and limited data-writing trials; no schedule.","highlights":[{"id":"no-schedule","item_id":"freshness-runner-deploy-trial-e77f8b4-packet","locator":{"kind":"work_record","task":"RMGR-WP-0020-T04","workplan":"RMGR-WP-0020"},"note":"Trial fires write projections through the normal reconcile endpoint; no schedule is enabled by this answer and packaging is shown before execution.","required_ack":true,"severity":"critical"}],"id":"freshness-runner-deploy-trial-e77f8b4","locale":"en","packet":[{"hash":"sha256:2873f6deadd938ec07e1a4d5f314f8dbf456a00893d06cf89ce7eecb14bf9985","item_id":"freshness-runner-deploy-trial-e77f8b4-packet","label":"Change, evidence, rollback and limits"}],"question":"Deploy the repo-manager bounded freshness runner (e77f8b4) to the Activity Core worker and run up to three --limit 3 trial fires?","requested_act":"approve","sealed":false,"step_kind":"approve","ui_release":"informed-decision@0.2.0","version":1} diff --git a/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-runner-deploy-trial-e77f8b4.packet.md b/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-runner-deploy-trial-e77f8b4.packet.md new file mode 100644 index 0000000..f647205 --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-runner-deploy-trial-e77f8b4.packet.md @@ -0,0 +1,39 @@ +# Deploy the bounded freshness runner and run limited trials (RMGR-WP-0020-T04) + +Approve deploying repo-manager e77f8b457647ff23697e45a74615edde5f42d39d +(rmgr freshness run) for use by the Activity Core worker, and up to three +operator-triggered fires with --limit 3, plus dry runs. + +What the runner does: picks the stalest repositories, skips repositories whose +Forge HEAD equals their last successful receipt, and calls the existing +POST /repos/{slug}/work-record-projection/reconcile for the immutable Forge +commit. It never reads a checkout, never uses --all --remote or the sweep +endpoints, never forces past a refusal, and writes no receipt unless the hub is +verified as the primary on railiance01. Receipts are an append-only JSON Lines +file (repo-manager.freshness-receipt.v1). + +What deployment includes: +- Packaging rmgr onto the Activity Core worker (method still to be chosen and + shown in the rollout document before execution). +- A persistent volume for the receipt file. +- A read-only Forgejo token routed through warden route/OpenBao; no secret is + placed in Git, the hub or this memo. +- The code-reviewed Activity Core bounded operation repo_manager_freshness + (activity-core b2c6c5613218dea9dbaef303aff22a8d1b07f074): fixed command line, + limit 1 to 12, max_seconds 1 to 270, no retry, 300 s timeout, stores counts only. + +Evidence: 226 repo-manager tests pass; ruff clean on changed files. A read-only +dry run against the primary verified the hub, saw 141 repositories and planned +clay-borg, python-snake, repo-scoping, shard-wiki, tele-mcp, citation-work. +Activity Core reads the runner's results[] (fixed in b2c6c56; 35 tests pass). + +Stop conditions: a receipt from an unverified primary, any checkout read, a fire +exceeding max_seconds twice, or any refusal pattern not explained by known holes +(RMGR-WP-0019-T03 duplicate projections, RMGR-WP-0014/0015 refusals). + +Rollback: remove the operation from the worker; receipts are kept; projections +are idempotent per commit, so no data rollback is needed. + +Alternatives: approve deploy and trials; approve dry runs only; return; decline. +This answer does not enable any schedule and does not resolve hub decision +7b19de6c-72a1-409e-89a9-ec3ac09c03fd. diff --git a/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-schedule-enable-retire-sweep.memo.json b/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-schedule-enable-retire-sweep.memo.json new file mode 100644 index 0000000..42c02ee --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-schedule-enable-retire-sweep.memo.json @@ -0,0 +1 @@ +{"approval_binding_digest":"sha256:cc3e8fe6ace5438f19d647d3de226407c8b009985c82ad9a993e81226e6f316f","approval_id":"b75752d1-bab6-4cf3-9308-5368c1d5aa91","binding":{"justification":null,"principal":{"display_name":"uid=platform-root,ou=people,dc=netkingdom,dc=local","id":"uid=platform-root,ou=people,dc=netkingdom,dc=local","identifiers":[],"kind":"person","role":"reviewer"},"target":{"environment":"production","id":"activity-core:definition:repo-manager-bounded-freshness:b2c6c5613218dea9dbaef303aff22a8d1b07f074","kind":"activity-schedule","label":"Bounded freshness schedule","requires_new_bind":true},"terms":null},"binding_level":"organizational","brief":"Recurring schedule activation after clean trials, and permanent retirement of the legacy sweep.","highlights":[{"id":"after-clean-trials","item_id":"freshness-schedule-enable-retire-sweep-packet","locator":{"kind":"work_record","task":"RMGR-WP-0020-T04","workplan":"RMGR-WP-0020"},"note":"Only after memo 3 trials completed without a stop condition; retirement removes the legacy --all --remote path.","required_ack":true,"severity":"critical"}],"id":"freshness-schedule-enable-retire-sweep","locale":"en","packet":[{"hash":"sha256:8389b3fbf7b4b5267b7ed9f8ad0381c88600181f112148736e9e81a4df579c5c","item_id":"freshness-schedule-enable-retire-sweep-packet","label":"Change, evidence, rollback and limits"}],"question":"Enable the repo-manager-bounded-freshness schedule and retire the paused state-hub-consistency-sweep definition?","requested_act":"approve","sealed":false,"step_kind":"approve","ui_release":"informed-decision@0.2.0","version":1} diff --git a/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-schedule-enable-retire-sweep.packet.md b/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-schedule-enable-retire-sweep.packet.md new file mode 100644 index 0000000..18130bb --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/bound/freshness-schedule-enable-retire-sweep.packet.md @@ -0,0 +1,33 @@ +# Enable the bounded freshness schedule and retire the legacy sweep (RMGR-WP-0020-T04/T05) + +Approve setting the Activity Core definition repo-manager-bounded-freshness +(activity-core b2c6c5613218dea9dbaef303aff22a8d1b07f074, ACTIVITY-WP-0044-T03) +to enabled: true, and formally retiring the paused state-hub-consistency-sweep +definition (enabled: false since RMGR-WP-0005-T11). + +Only after memo 3's trial fires completed without hitting a stop condition and +their receipts are recorded as evidence. + +Schedule: cron 40 */2 * * * UTC, misfire skip, limit 6, max_seconds 240. This +rotates the 141 active repositories in about two days, against a 48 h target. + +Why: on 2026-10-04 only 35 of 141 repositories (25 %) had synced within 24 h; +median age 109 h, p90 292 h, maximum about 39.5 days. No supported schedule +exists and nothing records per-repository source commits or failures +(repo-manager docs/evidence/2026-10-04-freshness-coverage.md). + +After two days, the evidence is re-measured and handed back to STATE-WP-0094-T05: +runner revision, active definition, per-repository commit, last successful and +failed receipts, measured freshness window. Coverage holes stay listed. + +Stop and disable conditions: as in memo 3, plus any fire overlapping the next. + +Rollback: set enabled: false; nothing else to undo. + +Retiring the legacy sweep means its definition is removed or marked retired, so +the --all --remote path cannot be re-enabled by a values change. ADR-002 already +forbids its checkout reads. + +Alternatives: approve both; approve the schedule but keep the legacy definition +paused; return; decline. This answer does not resolve hub decision +7b19de6c-72a1-409e-89a9-ec3ac09c03fd. diff --git a/docs/batches/2026-10-04-state-hub-wp0094/bound/index.json b/docs/batches/2026-10-04-state-hub-wp0094/bound/index.json new file mode 100644 index 0000000..8b96014 --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/bound/index.json @@ -0,0 +1,33 @@ +{ + "kind": "informed-decision-bound-sitting", + "sitting_id": "infd-sitting-2026-10-04-state-hub-wp0094", + "principal": "uid=platform-root,ou=people,dc=netkingdom,dc=local", + "submitted": false, + "agent_disposition_forbidden": true, + "memos": [ + { + "memo_id": "state-hub-edge-receiving-rollout-c287ed8", + "approval_id": "974eae4d-782d-41ed-93be-e34433b5fe59", + "memo": "state-hub-edge-receiving-rollout-c287ed8.memo.json", + "packet": "state-hub-edge-receiving-rollout-c287ed8.packet.md" + }, + { + "memo_id": "owner-return-pickup-plan-b6222af", + "approval_id": "77993081-1db2-4bba-99f2-74ca1f8652b1", + "memo": "owner-return-pickup-plan-b6222af.memo.json", + "packet": "owner-return-pickup-plan-b6222af.packet.md" + }, + { + "memo_id": "freshness-runner-deploy-trial-e77f8b4", + "approval_id": "4ae04c8e-d604-4d8b-b166-693eef855da8", + "memo": "freshness-runner-deploy-trial-e77f8b4.memo.json", + "packet": "freshness-runner-deploy-trial-e77f8b4.packet.md" + }, + { + "memo_id": "freshness-schedule-enable-retire-sweep", + "approval_id": "b75752d1-bab6-4cf3-9308-5368c1d5aa91", + "memo": "freshness-schedule-enable-retire-sweep.memo.json", + "packet": "freshness-schedule-enable-retire-sweep.packet.md" + } + ] +} diff --git a/docs/batches/2026-10-04-state-hub-wp0094/bound/owner-return-pickup-plan-b6222af.memo.json b/docs/batches/2026-10-04-state-hub-wp0094/bound/owner-return-pickup-plan-b6222af.memo.json new file mode 100644 index 0000000..e719448 --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/bound/owner-return-pickup-plan-b6222af.memo.json @@ -0,0 +1 @@ +{"approval_binding_digest":"sha256:e745ef64658e77e41b2a5ef569ec0f6986e120d338656d75749425f5f29b7ca0","approval_id":"77993081-1db2-4bba-99f2-74ca1f8652b1","binding":{"justification":null,"principal":{"display_name":"uid=platform-root,ou=people,dc=netkingdom,dc=local","id":"uid=platform-root,ou=people,dc=netkingdom,dc=local","identifiers":[],"kind":"person","role":"reviewer"},"target":{"environment":"production","id":"activity-core:source:b6222af2cfd1094360a0d430e3907e8788a3acf9:owner-return-pickup","kind":"activity-plan","label":"Owner-return pickup","requires_new_bind":true},"terms":null},"binding_level":"organizational","brief":"Plan approval plus a gated single-repo trial; the definition stays disabled and wakeups never clear waits.","highlights":[{"id":"preconditions-open","item_id":"owner-return-pickup-plan-b6222af-packet","locator":{"kind":"work_record","task":"ACTIVITY-WP-0043-T04","workplan":"ACTIVITY-WP-0043"},"note":"submit: true only after memo 1 is deployed and a plan-only run was reviewed; the C-25 report is operator-produced and only public repositories can be targeted.","required_ack":true,"severity":"critical"}],"id":"owner-return-pickup-plan-b6222af","locale":"en","packet":[{"hash":"sha256:dacfb39b22a578d8c6ce3bdf7bd90a6ba8f1612a500b8336355ca5ec02816b9d","item_id":"owner-return-pickup-plan-b6222af-packet","label":"Change, evidence, rollback and limits"}],"question":"Approve the owner-return pickup plan, definition, grant and worker operation, and one single-repository trial (plan-only, then submit)?","requested_act":"approve","sealed":false,"step_kind":"approve","ui_release":"informed-decision@0.2.0","version":1} diff --git a/docs/batches/2026-10-04-state-hub-wp0094/bound/owner-return-pickup-plan-b6222af.packet.md b/docs/batches/2026-10-04-state-hub-wp0094/bound/owner-return-pickup-plan-b6222af.packet.md new file mode 100644 index 0000000..58a092d --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/bound/owner-return-pickup-plan-b6222af.packet.md @@ -0,0 +1,55 @@ +# Approve the owner-return pickup plan and a gated trial (STATE-WP-0094-T03, ACTIVITY-WP-0043) + +Approve, at activity-core b6222af2cfd1094360a0d430e3907e8788a3acf9, the +owner-return pickup activation plan (docs/owner-return-pickup-activation-plan.md), +its ActivityDefinition owner-return-pickup (stays enabled: false), harness +profile harness.agent-dev-local@1.0.0, repository grant v1 (workplans path only, +exactly one commit, no publish), and the worker operation owner_return_pickup. +Also approve one operator-triggered trial for a single public repository: first +with submit: false (plan only, no writes), then once with submit: true. + +What this does: when an agent replied to a task that waits on it, the owner is +woken once through an Activity Core ops run. The wakeup ID is a sha256 of repo, +task and message; the database unique key stops duplicates. A wakeup never +clears a wait, task status, human gate or any other field. Tasks needing a +human, unresolved or unknown decisions, residual work, nonterminal or unknown +predecessors and future wait windows are stopped. + +How a run is bound (built and tested at source level): +- The operator runs the State Hub checker (state-hub 150cb0b or later) for the + target repository on a clean tree and supplies its JSON, pinned by sha256. +- The report and every C-25 finding must carry the same full commit SHA; a null + revision refuses with its reason (for example dirty_workplans). +- Task state is read through Forge at exactly that commit, which must still be + the default-branch HEAD. Unknown predecessors and decisions stop the task. +- The State Hub planner runs as a drift-checked vendored copy; only reviewable + candidates are submitted, and only when ACTIVITY_CORE_OWNER_RETURN_PICKUP_ENABLED + is set. Evidence holds IDs and counts only, never message bodies. +- Triggered by POST /ops/automations/{id}/trigger with confirm_side_effect: true. + No schedule. + +Preconditions before submit: true: +1. State Hub with paginated C-25 is deployed (memo 1). +2. A read-only plan run (submit: false) has produced reviewed evidence. + +Gaps you accept with this answer: +- The C-25 report is produced by the operator on the workstation, not in the + cluster; no Forge-reading C-25 exists yet. +- Reply-collection completeness is inferred from the absence of the checker's + incomplete-collection warning; there is no structured per-agent page count. +- Forge reads are unauthenticated, so only public repositories can be targeted. + +Trial evidence: planner input and output, receipts, and a re-run of the same +input showing every insert becomes duplicate; stored as activity-core +docs/evidence/ACTIVITY-WP-0043-*.md with a hub progress event. + +Rollback: unset the flag (the operation refuses before any read); close open +rows through the normal ops-run close path, never delete them. + +Evidence so far: 27 runner tests, 91 focused tests, full activity-core suite +764 passed, 1 skipped; State Hub C-25 binding 214 tests passed. No dispatch has +happened. + +Alternatives: approve plan and both trial steps; approve plan and the plan-only +run; return for changes; decline. This answer does not enable the definition, +add a schedule, or resolve hub decision 7b19de6c-72a1-409e-89a9-ec3ac09c03fd. diff --git a/docs/batches/2026-10-04-state-hub-wp0094/bound/state-hub-edge-receiving-rollout-c287ed8.memo.json b/docs/batches/2026-10-04-state-hub-wp0094/bound/state-hub-edge-receiving-rollout-c287ed8.memo.json new file mode 100644 index 0000000..f203c5b --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/bound/state-hub-edge-receiving-rollout-c287ed8.memo.json @@ -0,0 +1 @@ +{"approval_binding_digest":"sha256:84735b88b2db20d9445af369e28a8d40bd495dd20c0303ff3a764666ec976dde","approval_id":"974eae4d-782d-41ed-93be-e34433b5fe59","binding":{"justification":null,"principal":{"display_name":"uid=platform-root,ou=people,dc=netkingdom,dc=local","id":"uid=platform-root,ou=people,dc=netkingdom,dc=local","identifiers":[],"kind":"person","role":"reviewer"},"target":{"environment":"production","id":"state-hub:source:c287ed82594313394ca8e67ce40714c90e744af6","kind":"service-release","label":"State Hub main-c287ed8","requires_new_bind":true},"terms":null},"binding_level":"organizational","brief":"Production rollout of tested source; rollback is helm rollback to revision 72 without schema downgrade.","highlights":[{"id":"deploy-only","item_id":"state-hub-edge-receiving-rollout-c287ed8-packet","locator":{"kind":"work_record","task":"STATE-WP-0094-T05","workplan":"STATE-WP-0094"},"note":"Approves this deployment and its post-deploy proof only; it does not mark T05 done, schedule freshness, or adopt existing C-20/API edges.","required_ack":true,"severity":"critical"}],"id":"state-hub-edge-receiving-rollout-c287ed8","locale":"en","packet":[{"hash":"sha256:7fbc4b37d513e711cf1b62e393f2f060df378975efab4d11473fd8b1567cd0dd","item_id":"state-hub-edge-receiving-rollout-c287ed8-packet","label":"Change, evidence, rollback and limits"}],"question":"Deploy State Hub c287ed8 (source-owned dependency-edge receiving, paginated C-25, additive migration) to railiance01?","requested_act":"approve","sealed":false,"step_kind":"approve","ui_release":"informed-decision@0.2.0","version":1} diff --git a/docs/batches/2026-10-04-state-hub-wp0094/bound/state-hub-edge-receiving-rollout-c287ed8.packet.md b/docs/batches/2026-10-04-state-hub-wp0094/bound/state-hub-edge-receiving-rollout-c287ed8.packet.md new file mode 100644 index 0000000..64383bd --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/bound/state-hub-edge-receiving-rollout-c287ed8.packet.md @@ -0,0 +1,43 @@ +# Deploy State Hub dependency-edge receiving (STATE-WP-0094-T05) + +Deploy State Hub source c287ed82594313394ca8e67ce40714c90e744af6 (CI image +main-c287ed8, digest verified before use) to railiance01, replacing Helm +revision 72 (main-5dd3df9). + +What ships: +- Forge receiving derives depends_on edges from the immutable source commit and + reconciles only rows it owns (source_owner = forge:). Rows created by + the API, MCP or the C-20 fix are never changed or adopted. Missing, ambiguous + or self targets are listed as unresolved, never dropped. One transaction per + receive; a repeat receive of the same commit is a noop. +- The projection dry run previews edge create/remove/unresolved/external. +- C-25 owner-reply collection pages through all replies (200 per page, at most + 50 pages); GET /messages/ gains a stable offset. +- Additive migration b3c4d5e6f7a8: two nullable columns and one index on + workplan_dependencies. Upgrade, downgrade and re-upgrade verified on a scratch + PostgreSQL database; existing rows keep owner NULL. + +Evidence: full suite 1018 passed; 138 passed in the projection suites; the +consistency checker gives byte-identical findings before and after these commits +(27 C-03 failures are pre-existing). Ruff was not available; no lint claim. + +Procedure: state-hub docs/rollout-dependency-edge-receiving.md. Helm upgrade +with --reuse-values --set image.tag --atomic --timeout 3m; migration in the +pre-upgrade hook. Proof: a normal immutable receive of state-hub must create the +STATE-WP-0095-T04 edges and list ACTIVITY-WP-0026 as unresolved, then a repeat +receive must return noop. No task PATCH or direct consistency repair counts as proof. + +Rollback: helm rollback to revision 72. The schema is not downgraded: the +columns are additive and nullable, and dropping source_owner would orphan the +ownership marker. + +Known limits you accept with this answer: +- Edges created earlier by C-20 or the API are never adopted, so deleting their + line from a workplan file does not remove them. +- The dry-run preview does not model receiving's refusal when a commit has no + workplans/ directory. +- This schedules nothing. Freshness stays manual until memos 3 and 4. + +Alternatives: approve this rollout; return it for changes; decline it. +Approving this does not resolve hub decision 7b19de6c-72a1-409e-89a9-ec3ac09c03fd +and does not mark STATE-WP-0094-T05 done. diff --git a/docs/batches/2026-10-04-state-hub-wp0094/proposed/review-rollout-v10.json b/docs/batches/2026-10-04-state-hub-wp0094/proposed/review-rollout-v10.json new file mode 100644 index 0000000..a9737f4 --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/proposed/review-rollout-v10.json @@ -0,0 +1,219 @@ +{ + "apiVersion": "v1", + "kind": "List", + "items": [ + { + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "informed-decision-runtime-75ab117cc787", + "namespace": "informed-decision", + "annotations": { + "informed-decision.coulomb.social/admission": "review-only; INFD-WP-0001-T08" + } + }, + "immutable": true, + "data": { + "runtime.json": "{\"approval_origin\":\"http://approval-engine.approval-engine.svc.cluster.local:8080\",\"audit\":{\"origin\":\"http://audit-core.audit-core.svc.cluster.local:8080\",\"sender_token_file\":\"/var/run/secrets/informed-decision/audit/token\"},\"evidence_db\":\"/data/private/review.sqlite\",\"ordinary_approval_ids\":[\"2ce76d7f-01c3-4b63-8476-8d1230679769\",\"c2af4bcf-15b4-4305-aac1-acc7e4dcb099\",\"dc22666a-d5d7-46bc-9490-ebe9fe09dc38\"],\"policy\":{\"caller_token_file\":\"/var/run/secrets/informed-decision/policy/token\",\"origin\":\"http://flex-auth-informed-decision-sitting.flex-auth.svc.cluster.local:8080\",\"package\":\"informed-decision.compact-sitting\",\"package_digest\":\"sha256:ede11f888d57809dfce1b04d2323708c7244f36187fd5a58dd738437a05e7e91\",\"version\":\"v10\"},\"schema\":\"informed-decision.review-runtime.v1\"}" + } + }, + { + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "informed-decision", + "namespace": "informed-decision", + "annotations": { + "informed-decision.coulomb.social/admission": "review-only; INFD-WP-0001-T08" + } + }, + "spec": { + "replicas": 1, + "strategy": { + "type": "Recreate" + }, + "progressDeadlineSeconds": 600, + "selector": { + "matchLabels": { + "app.kubernetes.io/name": "informed-decision" + } + }, + "template": { + "metadata": { + "labels": { + "app.kubernetes.io/name": "informed-decision", + "app.kubernetes.io/component": "review" + } + }, + "spec": { + "automountServiceAccountToken": false, + "serviceAccountName": "review", + "terminationGracePeriodSeconds": 45, + "securityContext": { + "runAsNonRoot": true, + "runAsUser": 10001, + "runAsGroup": 10001, + "fsGroup": 10001, + "fsGroupChangePolicy": "OnRootMismatch", + "seccompProfile": { + "type": "RuntimeDefault" + } + }, + "containers": [ + { + "name": "informed-decision", + "image": "forgejo.coulomb.social/coulomb/informed-decision@sha256:ccca0b377bb8ba6af52a37edc453b5b51c96e380840ec8243ffaab3ac2170885", + "securityContext": { + "allowPrivilegeEscalation": false, + "readOnlyRootFilesystem": true, + "capabilities": { + "drop": [ + "ALL" + ] + } + }, + "env": [ + { + "name": "INFD_KEYCAPE_ISSUER", + "value": "https://kc.coulomb.social" + }, + { + "name": "INFD_CONTAINER_CONFIG", + "value": "/configuration/runtime.json" + } + ], + "ports": [ + { + "name": "http", + "containerPort": 8080 + } + ], + "startupProbe": { + "httpGet": { + "path": "/healthz", + "port": "http" + }, + "periodSeconds": 10, + "timeoutSeconds": 2, + "failureThreshold": 12 + }, + "readinessProbe": { + "httpGet": { + "path": "/healthz", + "port": "http" + }, + "periodSeconds": 10, + "timeoutSeconds": 2 + }, + "livenessProbe": { + "httpGet": { + "path": "/healthz", + "port": "http" + }, + "periodSeconds": 10, + "timeoutSeconds": 2 + }, + "resources": { + "requests": { + "cpu": "5m", + "memory": "64Mi" + }, + "limits": { + "cpu": "500m", + "memory": "256Mi" + } + }, + "volumeMounts": [ + { + "name": "data", + "mountPath": "/data" + }, + { + "name": "runtime", + "mountPath": "/run/informed-decision" + }, + { + "name": "tmp", + "mountPath": "/tmp" + }, + { + "name": "configuration", + "mountPath": "/configuration", + "readOnly": true + }, + { + "name": "caller", + "mountPath": "/var/run/secrets/informed-decision/policy", + "readOnly": true + }, + { + "name": "audit", + "mountPath": "/var/run/secrets/informed-decision/audit", + "readOnly": true + } + ] + } + ], + "volumes": [ + { + "name": "data", + "persistentVolumeClaim": { + "claimName": "informed-decision-data" + } + }, + { + "name": "runtime", + "emptyDir": { + "medium": "Memory", + "sizeLimit": "16Mi" + } + }, + { + "name": "tmp", + "emptyDir": { + "medium": "Memory", + "sizeLimit": "16Mi" + } + }, + { + "name": "configuration", + "configMap": { + "name": "informed-decision-runtime-75ab117cc787", + "defaultMode": 292 + } + }, + { + "name": "caller", + "projected": { + "defaultMode": 288, + "sources": [ + { + "serviceAccountToken": { + "path": "token", + "audience": "flex-auth", + "expirationSeconds": 3600 + } + } + ] + } + }, + { + "name": "audit", + "secret": { + "secretName": "informed-decision-audit", + "defaultMode": 288, + "items": [ + { + "key": "token", + "path": "token" + } + ] + } + } + ] + } + } + } + } + ] +} diff --git a/docs/batches/2026-10-04-state-hub-wp0094/proposed/sitting-admission-v10.json b/docs/batches/2026-10-04-state-hub-wp0094/proposed/sitting-admission-v10.json new file mode 100644 index 0000000..d6af160 --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/proposed/sitting-admission-v10.json @@ -0,0 +1,19 @@ +{ + "image": "forgejo.coulomb.social/coulomb/informed-decision@sha256:ccca0b377bb8ba6af52a37edc453b5b51c96e380840ec8243ffaab3ac2170885", + "policy": { + "origin": "http://flex-auth-informed-decision-sitting.flex-auth.svc.cluster.local:8080", + "package": "informed-decision.compact-sitting", + "version": "v10", + "package_digest": "sha256:ede11f888d57809dfce1b04d2323708c7244f36187fd5a58dd738437a05e7e91", + "pod_name": "flex-auth-informed-decision-sitting" + }, + "keycape_egress_ips": [ + "92.205.62.239" + ], + "storage_class": "local-path", + "ordinary_approval_ids": [ + "2ce76d7f-01c3-4b63-8476-8d1230679769", + "c2af4bcf-15b4-4305-aac1-acc7e4dcb099", + "dc22666a-d5d7-46bc-9490-ebe9fe09dc38" + ] +} diff --git a/docs/batches/2026-10-04-state-hub-wp0094/proposed/store-load-v10.py b/docs/batches/2026-10-04-state-hub-wp0094/proposed/store-load-v10.py new file mode 100644 index 0000000..f0a5d4f --- /dev/null +++ b/docs/batches/2026-10-04-state-hub-wp0094/proposed/store-load-v10.py @@ -0,0 +1,85 @@ +"""PROPOSED store load for infd-sitting-2026-10-04-state-hub-wp0094 (DEPLOY-v10.md step 5). NOT RUN. + +Generated from bound/ by an agent. Runs inside the informed-decision review pod +with the image's own package: + kubectl -n informed-decision exec -i deploy/informed-decision -- \ + /opt/venv/bin/python - --db /data/private/review.sqlite < proposed/store-load-v10.py +Saves four memos and their packets. Creates no presentation, acknowledgement, +disposition or approval entry. Refuses if a memo id is already in the store, +if a packet hash differs from the memo, or if the store's presentations do not +belong to exactly the bound principal. +""" +import argparse, base64, json, sys +from informed_decision.records import memo_from +from informed_decision.store import Store + +PAYLOAD = json.loads(r"""{ + "principal": "uid=platform-root,ou=people,dc=netkingdom,dc=local", + "sitting_id": "infd-sitting-2026-10-04-state-hub-wp0094", + "memos": [ + { + "memo_id": "state-hub-edge-receiving-rollout-c287ed8", + "approval_id": "974eae4d-782d-41ed-93be-e34433b5fe59", + "memo": "{\"approval_binding_digest\":\"sha256:84735b88b2db20d9445af369e28a8d40bd495dd20c0303ff3a764666ec976dde\",\"approval_id\":\"974eae4d-782d-41ed-93be-e34433b5fe59\",\"binding\":{\"justification\":null,\"principal\":{\"display_name\":\"uid=platform-root,ou=people,dc=netkingdom,dc=local\",\"id\":\"uid=platform-root,ou=people,dc=netkingdom,dc=local\",\"identifiers\":[],\"kind\":\"person\",\"role\":\"reviewer\"},\"target\":{\"environment\":\"production\",\"id\":\"state-hub:source:c287ed82594313394ca8e67ce40714c90e744af6\",\"kind\":\"service-release\",\"label\":\"State Hub main-c287ed8\",\"requires_new_bind\":true},\"terms\":null},\"binding_level\":\"organizational\",\"brief\":\"Production rollout of tested source; rollback is helm rollback to revision 72 without schema downgrade.\",\"highlights\":[{\"id\":\"deploy-only\",\"item_id\":\"state-hub-edge-receiving-rollout-c287ed8-packet\",\"locator\":{\"kind\":\"work_record\",\"task\":\"STATE-WP-0094-T05\",\"workplan\":\"STATE-WP-0094\"},\"note\":\"Approves this deployment and its post-deploy proof only; it does not mark T05 done, schedule freshness, or adopt existing C-20/API edges.\",\"required_ack\":true,\"severity\":\"critical\"}],\"id\":\"state-hub-edge-receiving-rollout-c287ed8\",\"locale\":\"en\",\"packet\":[{\"hash\":\"sha256:7fbc4b37d513e711cf1b62e393f2f060df378975efab4d11473fd8b1567cd0dd\",\"item_id\":\"state-hub-edge-receiving-rollout-c287ed8-packet\",\"label\":\"Change, evidence, rollback and limits\"}],\"question\":\"Deploy State Hub c287ed8 (source-owned dependency-edge receiving, paginated C-25, additive migration) to railiance01?\",\"requested_act\":\"approve\",\"sealed\":false,\"step_kind\":\"approve\",\"ui_release\":\"informed-decision@0.2.0\",\"version\":1}\n", + "packet_b64": "IyBEZXBsb3kgU3RhdGUgSHViIGRlcGVuZGVuY3ktZWRnZSByZWNlaXZpbmcgKFNUQVRFLVdQLTAwOTQtVDA1KQoKRGVwbG95IFN0YXRlIEh1YiBzb3VyY2UgYzI4N2VkODI1OTQzMTMzOTRjYThlNjdjZTQwNzE0YzkwZTc0NGFmNiAoQ0kgaW1hZ2UKbWFpbi1jMjg3ZWQ4LCBkaWdlc3QgdmVyaWZpZWQgYmVmb3JlIHVzZSkgdG8gcmFpbGlhbmNlMDEsIHJlcGxhY2luZyBIZWxtCnJldmlzaW9uIDcyIChtYWluLTVkZDNkZjkpLgoKV2hhdCBzaGlwczoKLSBGb3JnZSByZWNlaXZpbmcgZGVyaXZlcyBkZXBlbmRzX29uIGVkZ2VzIGZyb20gdGhlIGltbXV0YWJsZSBzb3VyY2UgY29tbWl0IGFuZAogIHJlY29uY2lsZXMgb25seSByb3dzIGl0IG93bnMgKHNvdXJjZV9vd25lciA9IGZvcmdlOjxyZXBvPikuIFJvd3MgY3JlYXRlZCBieQogIHRoZSBBUEksIE1DUCBvciB0aGUgQy0yMCBmaXggYXJlIG5ldmVyIGNoYW5nZWQgb3IgYWRvcHRlZC4gTWlzc2luZywgYW1iaWd1b3VzCiAgb3Igc2VsZiB0YXJnZXRzIGFyZSBsaXN0ZWQgYXMgdW5yZXNvbHZlZCwgbmV2ZXIgZHJvcHBlZC4gT25lIHRyYW5zYWN0aW9uIHBlcgogIHJlY2VpdmU7IGEgcmVwZWF0IHJlY2VpdmUgb2YgdGhlIHNhbWUgY29tbWl0IGlzIGEgbm9vcC4KLSBUaGUgcHJvamVjdGlvbiBkcnkgcnVuIHByZXZpZXdzIGVkZ2UgY3JlYXRlL3JlbW92ZS91bnJlc29sdmVkL2V4dGVybmFsLgotIEMtMjUgb3duZXItcmVwbHkgY29sbGVjdGlvbiBwYWdlcyB0aHJvdWdoIGFsbCByZXBsaWVzICgyMDAgcGVyIHBhZ2UsIGF0IG1vc3QKICA1MCBwYWdlcyk7IEdFVCAvbWVzc2FnZXMvIGdhaW5zIGEgc3RhYmxlIG9mZnNldC4KLSBBZGRpdGl2ZSBtaWdyYXRpb24gYjNjNGQ1ZTZmN2E4OiB0d28gbnVsbGFibGUgY29sdW1ucyBhbmQgb25lIGluZGV4IG9uCiAgd29ya3BsYW5fZGVwZW5kZW5jaWVzLiBVcGdyYWRlLCBkb3duZ3JhZGUgYW5kIHJlLXVwZ3JhZGUgdmVyaWZpZWQgb24gYSBzY3JhdGNoCiAgUG9zdGdyZVNRTCBkYXRhYmFzZTsgZXhpc3Rpbmcgcm93cyBrZWVwIG93bmVyIE5VTEwuCgpFdmlkZW5jZTogZnVsbCBzdWl0ZSAxMDE4IHBhc3NlZDsgMTM4IHBhc3NlZCBpbiB0aGUgcHJvamVjdGlvbiBzdWl0ZXM7IHRoZQpjb25zaXN0ZW5jeSBjaGVja2VyIGdpdmVzIGJ5dGUtaWRlbnRpY2FsIGZpbmRpbmdzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlc2UgY29tbWl0cwooMjcgQy0wMyBmYWlsdXJlcyBhcmUgcHJlLWV4aXN0aW5nKS4gUnVmZiB3YXMgbm90IGF2YWlsYWJsZTsgbm8gbGludCBjbGFpbS4KClByb2NlZHVyZTogc3RhdGUtaHViIGRvY3Mvcm9sbG91dC1kZXBlbmRlbmN5LWVkZ2UtcmVjZWl2aW5nLm1kLiBIZWxtIHVwZ3JhZGUKd2l0aCAtLXJldXNlLXZhbHVlcyAtLXNldCBpbWFnZS50YWcgLS1hdG9taWMgLS10aW1lb3V0IDNtOyBtaWdyYXRpb24gaW4gdGhlCnByZS11cGdyYWRlIGhvb2suIFByb29mOiBhIG5vcm1hbCBpbW11dGFibGUgcmVjZWl2ZSBvZiBzdGF0ZS1odWIgbXVzdCBjcmVhdGUgdGhlClNUQVRFLVdQLTAwOTUtVDA0IGVkZ2VzIGFuZCBsaXN0IEFDVElWSVRZLVdQLTAwMjYgYXMgdW5yZXNvbHZlZCwgdGhlbiBhIHJlcGVhdApyZWNlaXZlIG11c3QgcmV0dXJuIG5vb3AuIE5vIHRhc2sgUEFUQ0ggb3IgZGlyZWN0IGNvbnNpc3RlbmN5IHJlcGFpciBjb3VudHMgYXMgcHJvb2YuCgpSb2xsYmFjazogaGVsbSByb2xsYmFjayB0byByZXZpc2lvbiA3Mi4gVGhlIHNjaGVtYSBpcyBub3QgZG93bmdyYWRlZDogdGhlCmNvbHVtbnMgYXJlIGFkZGl0aXZlIGFuZCBudWxsYWJsZSwgYW5kIGRyb3BwaW5nIHNvdXJjZV9vd25lciB3b3VsZCBvcnBoYW4gdGhlCm93bmVyc2hpcCBtYXJrZXIuCgpLbm93biBsaW1pdHMgeW91IGFjY2VwdCB3aXRoIHRoaXMgYW5zd2VyOgotIEVkZ2VzIGNyZWF0ZWQgZWFybGllciBieSBDLTIwIG9yIHRoZSBBUEkgYXJlIG5ldmVyIGFkb3B0ZWQsIHNvIGRlbGV0aW5nIHRoZWlyCiAgbGluZSBmcm9tIGEgd29ya3BsYW4gZmlsZSBkb2VzIG5vdCByZW1vdmUgdGhlbS4KLSBUaGUgZHJ5LXJ1biBwcmV2aWV3IGRvZXMgbm90IG1vZGVsIHJlY2VpdmluZydzIHJlZnVzYWwgd2hlbiBhIGNvbW1pdCBoYXMgbm8KICB3b3JrcGxhbnMvIGRpcmVjdG9yeS4KLSBUaGlzIHNjaGVkdWxlcyBub3RoaW5nLiBGcmVzaG5lc3Mgc3RheXMgbWFudWFsIHVudGlsIG1lbW9zIDMgYW5kIDQuCgpBbHRlcm5hdGl2ZXM6IGFwcHJvdmUgdGhpcyByb2xsb3V0OyByZXR1cm4gaXQgZm9yIGNoYW5nZXM7IGRlY2xpbmUgaXQuCkFwcHJvdmluZyB0aGlzIGRvZXMgbm90IHJlc29sdmUgaHViIGRlY2lzaW9uIDdiMTlkZTZjLTcyYTEtNDA5ZS04OWE5LWVjM2FjMDljMDNmZAphbmQgZG9lcyBub3QgbWFyayBTVEFURS1XUC0wMDk0LVQwNSBkb25lLgo=" + }, + { + "memo_id": "owner-return-pickup-plan-b6222af", + "approval_id": "77993081-1db2-4bba-99f2-74ca1f8652b1", + "memo": "{\"approval_binding_digest\":\"sha256:e745ef64658e77e41b2a5ef569ec0f6986e120d338656d75749425f5f29b7ca0\",\"approval_id\":\"77993081-1db2-4bba-99f2-74ca1f8652b1\",\"binding\":{\"justification\":null,\"principal\":{\"display_name\":\"uid=platform-root,ou=people,dc=netkingdom,dc=local\",\"id\":\"uid=platform-root,ou=people,dc=netkingdom,dc=local\",\"identifiers\":[],\"kind\":\"person\",\"role\":\"reviewer\"},\"target\":{\"environment\":\"production\",\"id\":\"activity-core:source:b6222af2cfd1094360a0d430e3907e8788a3acf9:owner-return-pickup\",\"kind\":\"activity-plan\",\"label\":\"Owner-return pickup\",\"requires_new_bind\":true},\"terms\":null},\"binding_level\":\"organizational\",\"brief\":\"Plan approval plus a gated single-repo trial; the definition stays disabled and wakeups never clear waits.\",\"highlights\":[{\"id\":\"preconditions-open\",\"item_id\":\"owner-return-pickup-plan-b6222af-packet\",\"locator\":{\"kind\":\"work_record\",\"task\":\"ACTIVITY-WP-0043-T04\",\"workplan\":\"ACTIVITY-WP-0043\"},\"note\":\"submit: true only after memo 1 is deployed and a plan-only run was reviewed; the C-25 report is operator-produced and only public repositories can be targeted.\",\"required_ack\":true,\"severity\":\"critical\"}],\"id\":\"owner-return-pickup-plan-b6222af\",\"locale\":\"en\",\"packet\":[{\"hash\":\"sha256:dacfb39b22a578d8c6ce3bdf7bd90a6ba8f1612a500b8336355ca5ec02816b9d\",\"item_id\":\"owner-return-pickup-plan-b6222af-packet\",\"label\":\"Change, evidence, rollback and limits\"}],\"question\":\"Approve the owner-return pickup plan, definition, grant and worker operation, and one single-repository trial (plan-only, then submit)?\",\"requested_act\":\"approve\",\"sealed\":false,\"step_kind\":\"approve\",\"ui_release\":\"informed-decision@0.2.0\",\"version\":1}\n", + "packet_b64": "IyBBcHByb3ZlIHRoZSBvd25lci1yZXR1cm4gcGlja3VwIHBsYW4gYW5kIGEgZ2F0ZWQgdHJpYWwgKFNUQVRFLVdQLTAwOTQtVDAzLCBBQ1RJVklUWS1XUC0wMDQzKQoKQXBwcm92ZSwgYXQgYWN0aXZpdHktY29yZSBiNjIyMmFmMmNmZDEwOTQzNjBhMGQ0MzBlMzkwN2U4Nzg4YTNhY2Y5LCB0aGUKb3duZXItcmV0dXJuIHBpY2t1cCBhY3RpdmF0aW9uIHBsYW4gKGRvY3Mvb3duZXItcmV0dXJuLXBpY2t1cC1hY3RpdmF0aW9uLXBsYW4ubWQpLAppdHMgQWN0aXZpdHlEZWZpbml0aW9uIG93bmVyLXJldHVybi1waWNrdXAgKHN0YXlzIGVuYWJsZWQ6IGZhbHNlKSwgaGFybmVzcwpwcm9maWxlIGhhcm5lc3MuYWdlbnQtZGV2LWxvY2FsQDEuMC4wLCByZXBvc2l0b3J5IGdyYW50IHYxICh3b3JrcGxhbnMgcGF0aCBvbmx5LApleGFjdGx5IG9uZSBjb21taXQsIG5vIHB1Ymxpc2gpLCBhbmQgdGhlIHdvcmtlciBvcGVyYXRpb24gb3duZXJfcmV0dXJuX3BpY2t1cC4KQWxzbyBhcHByb3ZlIG9uZSBvcGVyYXRvci10cmlnZ2VyZWQgdHJpYWwgZm9yIGEgc2luZ2xlIHB1YmxpYyByZXBvc2l0b3J5OiBmaXJzdAp3aXRoIHN1Ym1pdDogZmFsc2UgKHBsYW4gb25seSwgbm8gd3JpdGVzKSwgdGhlbiBvbmNlIHdpdGggc3VibWl0OiB0cnVlLgoKV2hhdCB0aGlzIGRvZXM6IHdoZW4gYW4gYWdlbnQgcmVwbGllZCB0byBhIHRhc2sgdGhhdCB3YWl0cyBvbiBpdCwgdGhlIG93bmVyIGlzCndva2VuIG9uY2UgdGhyb3VnaCBhbiBBY3Rpdml0eSBDb3JlIG9wcyBydW4uIFRoZSB3YWtldXAgSUQgaXMgYSBzaGEyNTYgb2YgcmVwbywKdGFzayBhbmQgbWVzc2FnZTsgdGhlIGRhdGFiYXNlIHVuaXF1ZSBrZXkgc3RvcHMgZHVwbGljYXRlcy4gQSB3YWtldXAgbmV2ZXIKY2xlYXJzIGEgd2FpdCwgdGFzayBzdGF0dXMsIGh1bWFuIGdhdGUgb3IgYW55IG90aGVyIGZpZWxkLiBUYXNrcyBuZWVkaW5nIGEKaHVtYW4sIHVucmVzb2x2ZWQgb3IgdW5rbm93biBkZWNpc2lvbnMsIHJlc2lkdWFsIHdvcmssIG5vbnRlcm1pbmFsIG9yIHVua25vd24KcHJlZGVjZXNzb3JzIGFuZCBmdXR1cmUgd2FpdCB3aW5kb3dzIGFyZSBzdG9wcGVkLgoKSG93IGEgcnVuIGlzIGJvdW5kIChidWlsdCBhbmQgdGVzdGVkIGF0IHNvdXJjZSBsZXZlbCk6Ci0gVGhlIG9wZXJhdG9yIHJ1bnMgdGhlIFN0YXRlIEh1YiBjaGVja2VyIChzdGF0ZS1odWIgMTUwY2IwYiBvciBsYXRlcikgZm9yIHRoZQogIHRhcmdldCByZXBvc2l0b3J5IG9uIGEgY2xlYW4gdHJlZSBhbmQgc3VwcGxpZXMgaXRzIEpTT04sIHBpbm5lZCBieSBzaGEyNTYuCi0gVGhlIHJlcG9ydCBhbmQgZXZlcnkgQy0yNSBmaW5kaW5nIG11c3QgY2FycnkgdGhlIHNhbWUgZnVsbCBjb21taXQgU0hBOyBhIG51bGwKICByZXZpc2lvbiByZWZ1c2VzIHdpdGggaXRzIHJlYXNvbiAoZm9yIGV4YW1wbGUgZGlydHlfd29ya3BsYW5zKS4KLSBUYXNrIHN0YXRlIGlzIHJlYWQgdGhyb3VnaCBGb3JnZSBhdCBleGFjdGx5IHRoYXQgY29tbWl0LCB3aGljaCBtdXN0IHN0aWxsIGJlCiAgdGhlIGRlZmF1bHQtYnJhbmNoIEhFQUQuIFVua25vd24gcHJlZGVjZXNzb3JzIGFuZCBkZWNpc2lvbnMgc3RvcCB0aGUgdGFzay4KLSBUaGUgU3RhdGUgSHViIHBsYW5uZXIgcnVucyBhcyBhIGRyaWZ0LWNoZWNrZWQgdmVuZG9yZWQgY29weTsgb25seSByZXZpZXdhYmxlCiAgY2FuZGlkYXRlcyBhcmUgc3VibWl0dGVkLCBhbmQgb25seSB3aGVuIEFDVElWSVRZX0NPUkVfT1dORVJfUkVUVVJOX1BJQ0tVUF9FTkFCTEVECiAgaXMgc2V0LiBFdmlkZW5jZSBob2xkcyBJRHMgYW5kIGNvdW50cyBvbmx5LCBuZXZlciBtZXNzYWdlIGJvZGllcy4KLSBUcmlnZ2VyZWQgYnkgUE9TVCAvb3BzL2F1dG9tYXRpb25zL3tpZH0vdHJpZ2dlciB3aXRoIGNvbmZpcm1fc2lkZV9lZmZlY3Q6IHRydWUuCiAgTm8gc2NoZWR1bGUuCgpQcmVjb25kaXRpb25zIGJlZm9yZSBzdWJtaXQ6IHRydWU6CjEuIFN0YXRlIEh1YiB3aXRoIHBhZ2luYXRlZCBDLTI1IGlzIGRlcGxveWVkIChtZW1vIDEpLgoyLiBBIHJlYWQtb25seSBwbGFuIHJ1biAoc3VibWl0OiBmYWxzZSkgaGFzIHByb2R1Y2VkIHJldmlld2VkIGV2aWRlbmNlLgoKR2FwcyB5b3UgYWNjZXB0IHdpdGggdGhpcyBhbnN3ZXI6Ci0gVGhlIEMtMjUgcmVwb3J0IGlzIHByb2R1Y2VkIGJ5IHRoZSBvcGVyYXRvciBvbiB0aGUgd29ya3N0YXRpb24sIG5vdCBpbiB0aGUKICBjbHVzdGVyOyBubyBGb3JnZS1yZWFkaW5nIEMtMjUgZXhpc3RzIHlldC4KLSBSZXBseS1jb2xsZWN0aW9uIGNvbXBsZXRlbmVzcyBpcyBpbmZlcnJlZCBmcm9tIHRoZSBhYnNlbmNlIG9mIHRoZSBjaGVja2VyJ3MKICBpbmNvbXBsZXRlLWNvbGxlY3Rpb24gd2FybmluZzsgdGhlcmUgaXMgbm8gc3RydWN0dXJlZCBwZXItYWdlbnQgcGFnZSBjb3VudC4KLSBGb3JnZSByZWFkcyBhcmUgdW5hdXRoZW50aWNhdGVkLCBzbyBvbmx5IHB1YmxpYyByZXBvc2l0b3JpZXMgY2FuIGJlIHRhcmdldGVkLgoKVHJpYWwgZXZpZGVuY2U6IHBsYW5uZXIgaW5wdXQgYW5kIG91dHB1dCwgcmVjZWlwdHMsIGFuZCBhIHJlLXJ1biBvZiB0aGUgc2FtZQppbnB1dCBzaG93aW5nIGV2ZXJ5IGluc2VydCBiZWNvbWVzIGR1cGxpY2F0ZTsgc3RvcmVkIGFzIGFjdGl2aXR5LWNvcmUKZG9jcy9ldmlkZW5jZS9BQ1RJVklUWS1XUC0wMDQzLSoubWQgd2l0aCBhIGh1YiBwcm9ncmVzcyBldmVudC4KClJvbGxiYWNrOiB1bnNldCB0aGUgZmxhZyAodGhlIG9wZXJhdGlvbiByZWZ1c2VzIGJlZm9yZSBhbnkgcmVhZCk7IGNsb3NlIG9wZW4Kcm93cyB0aHJvdWdoIHRoZSBub3JtYWwgb3BzLXJ1biBjbG9zZSBwYXRoLCBuZXZlciBkZWxldGUgdGhlbS4KCkV2aWRlbmNlIHNvIGZhcjogMjcgcnVubmVyIHRlc3RzLCA5MSBmb2N1c2VkIHRlc3RzLCBmdWxsIGFjdGl2aXR5LWNvcmUgc3VpdGUKNzY0IHBhc3NlZCwgMSBza2lwcGVkOyBTdGF0ZSBIdWIgQy0yNSBiaW5kaW5nIDIxNCB0ZXN0cyBwYXNzZWQuIE5vIGRpc3BhdGNoIGhhcwpoYXBwZW5lZC4KCkFsdGVybmF0aXZlczogYXBwcm92ZSBwbGFuIGFuZCBib3RoIHRyaWFsIHN0ZXBzOyBhcHByb3ZlIHBsYW4gYW5kIHRoZSBwbGFuLW9ubHkKcnVuOyByZXR1cm4gZm9yIGNoYW5nZXM7IGRlY2xpbmUuIFRoaXMgYW5zd2VyIGRvZXMgbm90IGVuYWJsZSB0aGUgZGVmaW5pdGlvbiwKYWRkIGEgc2NoZWR1bGUsIG9yIHJlc29sdmUgaHViIGRlY2lzaW9uIDdiMTlkZTZjLTcyYTEtNDA5ZS04OWE5LWVjM2FjMDljMDNmZC4K" + }, + { + "memo_id": "freshness-runner-deploy-trial-e77f8b4", + "approval_id": "4ae04c8e-d604-4d8b-b166-693eef855da8", + "memo": "{\"approval_binding_digest\":\"sha256:f8ff89dd353c1d2006622c45996c0f05f050865f8c203373dc74da1ba3f05e24\",\"approval_id\":\"4ae04c8e-d604-4d8b-b166-693eef855da8\",\"binding\":{\"justification\":null,\"principal\":{\"display_name\":\"uid=platform-root,ou=people,dc=netkingdom,dc=local\",\"id\":\"uid=platform-root,ou=people,dc=netkingdom,dc=local\",\"identifiers\":[],\"kind\":\"person\",\"role\":\"reviewer\"},\"target\":{\"environment\":\"production\",\"id\":\"repo-manager:source:e77f8b457647ff23697e45a74615edde5f42d39d\",\"kind\":\"service-release\",\"label\":\"rmgr freshness runner\",\"requires_new_bind\":true},\"terms\":null},\"binding_level\":\"organizational\",\"brief\":\"Deployment and limited data-writing trials; no schedule.\",\"highlights\":[{\"id\":\"no-schedule\",\"item_id\":\"freshness-runner-deploy-trial-e77f8b4-packet\",\"locator\":{\"kind\":\"work_record\",\"task\":\"RMGR-WP-0020-T04\",\"workplan\":\"RMGR-WP-0020\"},\"note\":\"Trial fires write projections through the normal reconcile endpoint; no schedule is enabled by this answer and packaging is shown before execution.\",\"required_ack\":true,\"severity\":\"critical\"}],\"id\":\"freshness-runner-deploy-trial-e77f8b4\",\"locale\":\"en\",\"packet\":[{\"hash\":\"sha256:2873f6deadd938ec07e1a4d5f314f8dbf456a00893d06cf89ce7eecb14bf9985\",\"item_id\":\"freshness-runner-deploy-trial-e77f8b4-packet\",\"label\":\"Change, evidence, rollback and limits\"}],\"question\":\"Deploy the repo-manager bounded freshness runner (e77f8b4) to the Activity Core worker and run up to three --limit 3 trial fires?\",\"requested_act\":\"approve\",\"sealed\":false,\"step_kind\":\"approve\",\"ui_release\":\"informed-decision@0.2.0\",\"version\":1}\n", + "packet_b64": "IyBEZXBsb3kgdGhlIGJvdW5kZWQgZnJlc2huZXNzIHJ1bm5lciBhbmQgcnVuIGxpbWl0ZWQgdHJpYWxzIChSTUdSLVdQLTAwMjAtVDA0KQoKQXBwcm92ZSBkZXBsb3lpbmcgcmVwby1tYW5hZ2VyIGU3N2Y4YjQ1NzY0N2ZmMjM2OTdlNDVhNzQ2MTVlZGRlNWY0MmQzOWQKKHJtZ3IgZnJlc2huZXNzIHJ1bikgZm9yIHVzZSBieSB0aGUgQWN0aXZpdHkgQ29yZSB3b3JrZXIsIGFuZCB1cCB0byB0aHJlZQpvcGVyYXRvci10cmlnZ2VyZWQgZmlyZXMgd2l0aCAtLWxpbWl0IDMsIHBsdXMgZHJ5IHJ1bnMuCgpXaGF0IHRoZSBydW5uZXIgZG9lczogcGlja3MgdGhlIHN0YWxlc3QgcmVwb3NpdG9yaWVzLCBza2lwcyByZXBvc2l0b3JpZXMgd2hvc2UKRm9yZ2UgSEVBRCBlcXVhbHMgdGhlaXIgbGFzdCBzdWNjZXNzZnVsIHJlY2VpcHQsIGFuZCBjYWxscyB0aGUgZXhpc3RpbmcKUE9TVCAvcmVwb3Mve3NsdWd9L3dvcmstcmVjb3JkLXByb2plY3Rpb24vcmVjb25jaWxlIGZvciB0aGUgaW1tdXRhYmxlIEZvcmdlCmNvbW1pdC4gSXQgbmV2ZXIgcmVhZHMgYSBjaGVja291dCwgbmV2ZXIgdXNlcyAtLWFsbCAtLXJlbW90ZSBvciB0aGUgc3dlZXAKZW5kcG9pbnRzLCBuZXZlciBmb3JjZXMgcGFzdCBhIHJlZnVzYWwsIGFuZCB3cml0ZXMgbm8gcmVjZWlwdCB1bmxlc3MgdGhlIGh1YiBpcwp2ZXJpZmllZCBhcyB0aGUgcHJpbWFyeSBvbiByYWlsaWFuY2UwMS4gUmVjZWlwdHMgYXJlIGFuIGFwcGVuZC1vbmx5IEpTT04gTGluZXMKZmlsZSAocmVwby1tYW5hZ2VyLmZyZXNobmVzcy1yZWNlaXB0LnYxKS4KCldoYXQgZGVwbG95bWVudCBpbmNsdWRlczoKLSBQYWNrYWdpbmcgcm1nciBvbnRvIHRoZSBBY3Rpdml0eSBDb3JlIHdvcmtlciAobWV0aG9kIHN0aWxsIHRvIGJlIGNob3NlbiBhbmQKICBzaG93biBpbiB0aGUgcm9sbG91dCBkb2N1bWVudCBiZWZvcmUgZXhlY3V0aW9uKS4KLSBBIHBlcnNpc3RlbnQgdm9sdW1lIGZvciB0aGUgcmVjZWlwdCBmaWxlLgotIEEgcmVhZC1vbmx5IEZvcmdlam8gdG9rZW4gcm91dGVkIHRocm91Z2ggd2FyZGVuIHJvdXRlL09wZW5CYW87IG5vIHNlY3JldCBpcwogIHBsYWNlZCBpbiBHaXQsIHRoZSBodWIgb3IgdGhpcyBtZW1vLgotIFRoZSBjb2RlLXJldmlld2VkIEFjdGl2aXR5IENvcmUgYm91bmRlZCBvcGVyYXRpb24gcmVwb19tYW5hZ2VyX2ZyZXNobmVzcwogIChhY3Rpdml0eS1jb3JlIGIyYzZjNTYxMzIxOGRlYTlkYmFlZjMwM2FmZjIyYThkMWIwN2YwNzQpOiBmaXhlZCBjb21tYW5kIGxpbmUsCiAgbGltaXQgMSB0byAxMiwgbWF4X3NlY29uZHMgMSB0byAyNzAsIG5vIHJldHJ5LCAzMDAgcyB0aW1lb3V0LCBzdG9yZXMgY291bnRzIG9ubHkuCgpFdmlkZW5jZTogMjI2IHJlcG8tbWFuYWdlciB0ZXN0cyBwYXNzOyBydWZmIGNsZWFuIG9uIGNoYW5nZWQgZmlsZXMuIEEgcmVhZC1vbmx5CmRyeSBydW4gYWdhaW5zdCB0aGUgcHJpbWFyeSB2ZXJpZmllZCB0aGUgaHViLCBzYXcgMTQxIHJlcG9zaXRvcmllcyBhbmQgcGxhbm5lZApjbGF5LWJvcmcsIHB5dGhvbi1zbmFrZSwgcmVwby1zY29waW5nLCBzaGFyZC13aWtpLCB0ZWxlLW1jcCwgY2l0YXRpb24td29yay4KQWN0aXZpdHkgQ29yZSByZWFkcyB0aGUgcnVubmVyJ3MgcmVzdWx0c1tdIChmaXhlZCBpbiBiMmM2YzU2OyAzNSB0ZXN0cyBwYXNzKS4KClN0b3AgY29uZGl0aW9uczogYSByZWNlaXB0IGZyb20gYW4gdW52ZXJpZmllZCBwcmltYXJ5LCBhbnkgY2hlY2tvdXQgcmVhZCwgYSBmaXJlCmV4Y2VlZGluZyBtYXhfc2Vjb25kcyB0d2ljZSwgb3IgYW55IHJlZnVzYWwgcGF0dGVybiBub3QgZXhwbGFpbmVkIGJ5IGtub3duIGhvbGVzCihSTUdSLVdQLTAwMTktVDAzIGR1cGxpY2F0ZSBwcm9qZWN0aW9ucywgUk1HUi1XUC0wMDE0LzAwMTUgcmVmdXNhbHMpLgoKUm9sbGJhY2s6IHJlbW92ZSB0aGUgb3BlcmF0aW9uIGZyb20gdGhlIHdvcmtlcjsgcmVjZWlwdHMgYXJlIGtlcHQ7IHByb2plY3Rpb25zCmFyZSBpZGVtcG90ZW50IHBlciBjb21taXQsIHNvIG5vIGRhdGEgcm9sbGJhY2sgaXMgbmVlZGVkLgoKQWx0ZXJuYXRpdmVzOiBhcHByb3ZlIGRlcGxveSBhbmQgdHJpYWxzOyBhcHByb3ZlIGRyeSBydW5zIG9ubHk7IHJldHVybjsgZGVjbGluZS4KVGhpcyBhbnN3ZXIgZG9lcyBub3QgZW5hYmxlIGFueSBzY2hlZHVsZSBhbmQgZG9lcyBub3QgcmVzb2x2ZSBodWIgZGVjaXNpb24KN2IxOWRlNmMtNzJhMS00MDllLTg5YTktZWMzYWMwOWMwM2ZkLgo=" + }, + { + "memo_id": "freshness-schedule-enable-retire-sweep", + "approval_id": "b75752d1-bab6-4cf3-9308-5368c1d5aa91", + "memo": "{\"approval_binding_digest\":\"sha256:cc3e8fe6ace5438f19d647d3de226407c8b009985c82ad9a993e81226e6f316f\",\"approval_id\":\"b75752d1-bab6-4cf3-9308-5368c1d5aa91\",\"binding\":{\"justification\":null,\"principal\":{\"display_name\":\"uid=platform-root,ou=people,dc=netkingdom,dc=local\",\"id\":\"uid=platform-root,ou=people,dc=netkingdom,dc=local\",\"identifiers\":[],\"kind\":\"person\",\"role\":\"reviewer\"},\"target\":{\"environment\":\"production\",\"id\":\"activity-core:definition:repo-manager-bounded-freshness:b2c6c5613218dea9dbaef303aff22a8d1b07f074\",\"kind\":\"activity-schedule\",\"label\":\"Bounded freshness schedule\",\"requires_new_bind\":true},\"terms\":null},\"binding_level\":\"organizational\",\"brief\":\"Recurring schedule activation after clean trials, and permanent retirement of the legacy sweep.\",\"highlights\":[{\"id\":\"after-clean-trials\",\"item_id\":\"freshness-schedule-enable-retire-sweep-packet\",\"locator\":{\"kind\":\"work_record\",\"task\":\"RMGR-WP-0020-T04\",\"workplan\":\"RMGR-WP-0020\"},\"note\":\"Only after memo 3 trials completed without a stop condition; retirement removes the legacy --all --remote path.\",\"required_ack\":true,\"severity\":\"critical\"}],\"id\":\"freshness-schedule-enable-retire-sweep\",\"locale\":\"en\",\"packet\":[{\"hash\":\"sha256:8389b3fbf7b4b5267b7ed9f8ad0381c88600181f112148736e9e81a4df579c5c\",\"item_id\":\"freshness-schedule-enable-retire-sweep-packet\",\"label\":\"Change, evidence, rollback and limits\"}],\"question\":\"Enable the repo-manager-bounded-freshness schedule and retire the paused state-hub-consistency-sweep definition?\",\"requested_act\":\"approve\",\"sealed\":false,\"step_kind\":\"approve\",\"ui_release\":\"informed-decision@0.2.0\",\"version\":1}\n", + "packet_b64": "IyBFbmFibGUgdGhlIGJvdW5kZWQgZnJlc2huZXNzIHNjaGVkdWxlIGFuZCByZXRpcmUgdGhlIGxlZ2FjeSBzd2VlcCAoUk1HUi1XUC0wMDIwLVQwNC9UMDUpCgpBcHByb3ZlIHNldHRpbmcgdGhlIEFjdGl2aXR5IENvcmUgZGVmaW5pdGlvbiByZXBvLW1hbmFnZXItYm91bmRlZC1mcmVzaG5lc3MKKGFjdGl2aXR5LWNvcmUgYjJjNmM1NjEzMjE4ZGVhOWRiYWVmMzAzYWZmMjJhOGQxYjA3ZjA3NCwgQUNUSVZJVFktV1AtMDA0NC1UMDMpCnRvIGVuYWJsZWQ6IHRydWUsIGFuZCBmb3JtYWxseSByZXRpcmluZyB0aGUgcGF1c2VkIHN0YXRlLWh1Yi1jb25zaXN0ZW5jeS1zd2VlcApkZWZpbml0aW9uIChlbmFibGVkOiBmYWxzZSBzaW5jZSBSTUdSLVdQLTAwMDUtVDExKS4KCk9ubHkgYWZ0ZXIgbWVtbyAzJ3MgdHJpYWwgZmlyZXMgY29tcGxldGVkIHdpdGhvdXQgaGl0dGluZyBhIHN0b3AgY29uZGl0aW9uIGFuZAp0aGVpciByZWNlaXB0cyBhcmUgcmVjb3JkZWQgYXMgZXZpZGVuY2UuCgpTY2hlZHVsZTogY3JvbiA0MCAqLzIgKiAqICogVVRDLCBtaXNmaXJlIHNraXAsIGxpbWl0IDYsIG1heF9zZWNvbmRzIDI0MC4gVGhpcwpyb3RhdGVzIHRoZSAxNDEgYWN0aXZlIHJlcG9zaXRvcmllcyBpbiBhYm91dCB0d28gZGF5cywgYWdhaW5zdCBhIDQ4IGggdGFyZ2V0LgoKV2h5OiBvbiAyMDI2LTEwLTA0IG9ubHkgMzUgb2YgMTQxIHJlcG9zaXRvcmllcyAoMjUgJSkgaGFkIHN5bmNlZCB3aXRoaW4gMjQgaDsKbWVkaWFuIGFnZSAxMDkgaCwgcDkwIDI5MiBoLCBtYXhpbXVtIGFib3V0IDM5LjUgZGF5cy4gTm8gc3VwcG9ydGVkIHNjaGVkdWxlCmV4aXN0cyBhbmQgbm90aGluZyByZWNvcmRzIHBlci1yZXBvc2l0b3J5IHNvdXJjZSBjb21taXRzIG9yIGZhaWx1cmVzCihyZXBvLW1hbmFnZXIgZG9jcy9ldmlkZW5jZS8yMDI2LTEwLTA0LWZyZXNobmVzcy1jb3ZlcmFnZS5tZCkuCgpBZnRlciB0d28gZGF5cywgdGhlIGV2aWRlbmNlIGlzIHJlLW1lYXN1cmVkIGFuZCBoYW5kZWQgYmFjayB0byBTVEFURS1XUC0wMDk0LVQwNToKcnVubmVyIHJldmlzaW9uLCBhY3RpdmUgZGVmaW5pdGlvbiwgcGVyLXJlcG9zaXRvcnkgY29tbWl0LCBsYXN0IHN1Y2Nlc3NmdWwgYW5kCmZhaWxlZCByZWNlaXB0cywgbWVhc3VyZWQgZnJlc2huZXNzIHdpbmRvdy4gQ292ZXJhZ2UgaG9sZXMgc3RheSBsaXN0ZWQuCgpTdG9wIGFuZCBkaXNhYmxlIGNvbmRpdGlvbnM6IGFzIGluIG1lbW8gMywgcGx1cyBhbnkgZmlyZSBvdmVybGFwcGluZyB0aGUgbmV4dC4KClJvbGxiYWNrOiBzZXQgZW5hYmxlZDogZmFsc2U7IG5vdGhpbmcgZWxzZSB0byB1bmRvLgoKUmV0aXJpbmcgdGhlIGxlZ2FjeSBzd2VlcCBtZWFucyBpdHMgZGVmaW5pdGlvbiBpcyByZW1vdmVkIG9yIG1hcmtlZCByZXRpcmVkLCBzbwp0aGUgLS1hbGwgLS1yZW1vdGUgcGF0aCBjYW5ub3QgYmUgcmUtZW5hYmxlZCBieSBhIHZhbHVlcyBjaGFuZ2UuIEFEUi0wMDIgYWxyZWFkeQpmb3JiaWRzIGl0cyBjaGVja291dCByZWFkcy4KCkFsdGVybmF0aXZlczogYXBwcm92ZSBib3RoOyBhcHByb3ZlIHRoZSBzY2hlZHVsZSBidXQga2VlcCB0aGUgbGVnYWN5IGRlZmluaXRpb24KcGF1c2VkOyByZXR1cm47IGRlY2xpbmUuIFRoaXMgYW5zd2VyIGRvZXMgbm90IHJlc29sdmUgaHViIGRlY2lzaW9uCjdiMTlkZTZjLTcyYTEtNDA5ZS04OWE5LWVjM2FjMDljMDNmZC4K" + } + ] +}""") + + +def counts(store): + with store._connection() as db: + return {t: db.execute(f"SELECT count(*) FROM {t}").fetchone()[0] + for t in ("memos", "presentations", "acknowledgments", "dispositions")} + + +def load(db_path): + store = Store(db_path) + with store._connection() as db: + subs = {json.loads(b)["principal_sub"] for (b,) in db.execute("SELECT body FROM presentations")} + present = {m for (m,) in db.execute("SELECT id FROM memos")} + if subs != {PAYLOAD["principal"]}: + raise SystemExit("refused: store presentations are not exactly the bound principal") + memos = [] + for row in PAYLOAD["memos"]: + memo = memo_from(json.loads(row["memo"])) + if memo.id != row["memo_id"] or memo.approval_id != row["approval_id"]: + raise SystemExit(f"refused: payload mismatch for {row['memo_id']}") + if memo.id in present: + raise SystemExit(f"refused: {memo.id} already in store") + memos.append((memo, base64.b64decode(row["packet_b64"]))) + before = counts(store) + for memo, packet in memos: + if store.put_document(packet) != memo.packet[0].hash: + raise SystemExit(f"refused: packet digest mismatch for {memo.id}") + store.save_memo(memo) + after = counts(store) + unchanged = all(after[k] == before[k] for k in ("presentations", "acknowledgments", "dispositions")) + report = {"status": "loaded", "sitting_id": PAYLOAD["sitting_id"], "memo_ids": [m.id for m, _ in memos], + "before": before, "after": after, "no_presentation_or_disposition_created": unchanged} + print(json.dumps(report, indent=2)) + return 0 if unchanged and after["memos"] == before["memos"] + len(memos) else 1 + + +if __name__ == "__main__": + p = argparse.ArgumentParser() + p.add_argument("--db", required=True) + sys.exit(load(p.parse_args().db)) diff --git a/docs/batches/2026-10-04-state-hub-wp0094/sitting.json b/docs/batches/2026-10-04-state-hub-wp0094/sitting.json index 7b35cb9..a694c6f 100644 --- a/docs/batches/2026-10-04-state-hub-wp0094/sitting.json +++ b/docs/batches/2026-10-04-state-hub-wp0094/sitting.json @@ -3,7 +3,7 @@ "id": "infd-sitting-2026-10-04-state-hub-wp0094", "review_group": "net-kingdom-admins", "principal": "uid=platform-root,ou=people,dc=netkingdom,dc=local", - "status": "prepared", + "status": "approval-created", "hub_decision": "7b19de6c-72a1-409e-89a9-ec3ac09c03fd", "resolves_hub_decision": "never", "batches": [ @@ -17,5 +17,32 @@ "freshness-schedule-enable-retire-sweep" ], "bind_path": "founder creates the approvals in an attended terminal, then exact-record admission, store load, and the founder's own answer per memo", - "note": "Prepared by an agent. Not posted, not admitted, not loaded. No answer exists." + "note": "Four native approvals are requested with no human entry. Bound copies are in bound/. Policy v10 and the store load are prepared in DEPLOY-v10.md and not executed. Nothing is admitted or loaded; no answer exists. The hub decision is not resolved.", + "approvals": [ + { + "memo_id": "state-hub-edge-receiving-rollout-c287ed8", + "approval_id": "974eae4d-782d-41ed-93be-e34433b5fe59", + "approval_binding_digest": "sha256:84735b88b2db20d9445af369e28a8d40bd495dd20c0303ff3a764666ec976dde" + }, + { + "memo_id": "owner-return-pickup-plan-b6222af", + "approval_id": "77993081-1db2-4bba-99f2-74ca1f8652b1", + "approval_binding_digest": "sha256:e745ef64658e77e41b2a5ef569ec0f6986e120d338656d75749425f5f29b7ca0" + }, + { + "memo_id": "freshness-runner-deploy-trial-e77f8b4", + "approval_id": "4ae04c8e-d604-4d8b-b166-693eef855da8", + "approval_binding_digest": "sha256:f8ff89dd353c1d2006622c45996c0f05f050865f8c203373dc74da1ba3f05e24" + }, + { + "memo_id": "freshness-schedule-enable-retire-sweep", + "approval_id": "b75752d1-bab6-4cf3-9308-5368c1d5aa91", + "approval_binding_digest": "sha256:cc3e8fe6ace5438f19d647d3de226407c8b009985c82ad9a993e81226e6f316f" + } + ], + "approval_expires_at": "2026-10-05T12:19:09.106500+00:00", + "receipt": "docs/evidence/2026-10-04-state-hub-wp0094-approval-create.json", + "proposed_policy_version": "v10", + "proposed_policy_package_digest": "sha256:ede11f888d57809dfce1b04d2323708c7244f36187fd5a58dd738437a05e7e91", + "proposed_review_configmap": "informed-decision-runtime-75ab117cc787" }