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 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 692292@bnt-lap001 Assistant-Session: 89c7d8e8-e1b3-47eb-9411-a0ab227fca2f
This commit is contained in:
parent
e3b92e389c
commit
470b372202
15 changed files with 725 additions and 6 deletions
159
docs/batches/2026-10-04-state-hub-wp0094/DEPLOY-v10.md
Normal file
159
docs/batches/2026-10-04-state-hub-wp0094/DEPLOY-v10.md
Normal file
|
|
@ -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 `<V10_DIGEST>` below. Verify the image carries v10:
|
||||
|
||||
```bash
|
||||
docker run --rm --entrypoint cat forgejo.coulomb.social/coulomb/flex-auth@<V10_DIGEST> \
|
||||
/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: <V10_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 <extracted flex-auth> --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**.
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
@ -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.
|
||||
|
|
@ -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}
|
||||
|
|
@ -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.
|
||||
33
docs/batches/2026-10-04-state-hub-wp0094/bound/index.json
Normal file
33
docs/batches/2026-10-04-state-hub-wp0094/bound/index.json
Normal file
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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}
|
||||
|
|
@ -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.
|
||||
|
|
@ -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}
|
||||
|
|
@ -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:<repo>). 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.
|
||||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
|
|
@ -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))
|
||||
|
|
@ -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"
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue