Record verified receiver rollout and frozen-binding guard successor

This commit is contained in:
codex 2026-10-17 02:52:03 +02:00
parent f8c7dfa2a9
commit 5596185e71
221 changed files with 63582 additions and 9 deletions

View file

@ -0,0 +1,30 @@
{
"schema": "statehub.conditional-T07-completion-overlay.v1",
"status": "prepared_not_applied_no_completion_claim",
"source_preimage": {
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"sha256": "146caec8f37833d9cd0b509750e5131640725b5617f4b2eede989185e1869d5c"
},
"guards": [
"Actual normal cluster owner publication and central receiving status applied, with exact pushed commit receipt",
"RMGR-WP-0019-T06 actually done and source status/UUID projection verified",
"All three exact archived source SHA256 bytes remain equal to frozen manifest",
"All three historical parents/15 tasks full DB row hashes unchanged after normal receiving",
"No missing/unresolved/foreign-holder identity or retirement refusal hidden as success"
],
"edits_after_guards_only": [
{
"task_id": "STATE-WP-0095-T07",
"state_hub_task_id": "cfd1ea99-e75b-542e-a434-acefb62f3c7d",
"status": "done",
"evidence": "insert exact actual cluster commit/publication/receiving and preservation receipt refs at activation"
},
{
"workplan_id": "STATE-WP-0095",
"frontmatter_status": "finished",
"only_if": "all eight retained task IDs done and no unresolved retained work remains"
}
],
"preserve_all_IDs_UUIDs_history": true,
"normal_owner_commit_push_projection_required": true
}

View file

@ -0,0 +1,53 @@
{
"schema": "statehub.source-owner-followthrough.v1",
"status": "isolated_source_candidate_not_applied",
"base_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
"files": [
{
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"base_sha256": "ef10359cc5974283b5bdbfc602adf14e3c24362adf00640698d2937c6538483a",
"candidate_sha256": "146caec8f37833d9cd0b509750e5131640725b5617f4b2eede989185e1869d5c",
"action": "modify"
},
{
"path": "Makefile",
"base_sha256": "5584ef94071044cca8215141ecd8aee8d6ae5cfe73e8f5719358c680eb8af0d4",
"candidate_sha256": "c5b70e8d4b8ae70380e0ade1c35f9e7fe80038de10080a4723b21ef07a98001e",
"action": "modify"
},
{
"path": "deploy/railiance/apps/charts/state-hub/Chart.yaml",
"base_sha256": "7fe02b390ffd2ba4ce6f82bd62df900826826401e31bdc2138dd5bf36b51a6ae",
"candidate_sha256": "61a989fcf277d05ffbececb7332ee3ca1d8f369c72f960ab1bc4dbc6815536b8",
"action": "modify"
},
{
"path": "deploy/railiance/apps/helm/state-hub-values.yaml",
"base_sha256": "f7cc0e9968598f6ce0faa0d56f62d6817845c3570c18b6ac39ed6561b952b197",
"candidate_sha256": "b51296fc937450f4ecf0ae43243262a631b551389c0d09c8bfe58fa10e2f3ee9",
"action": "modify"
},
{
"path": "docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json",
"base_sha256": null,
"candidate_sha256": "db6cd6931c5763ff390e54c6eb9430aad2c4c7c9f42dd6652f436e549e6f6297",
"action": "add"
}
],
"patch_sha256": "sha256:3a2f8446262062a9183aff6f219fd6c300ed447624355cb778bb050cdb14a2b9",
"live_effects": false,
"new_runtime_image": false,
"T06": "done_actual_approved_verified_rollout",
"T07": "wait_until_actual_RMGR19T06_cluster_publication_and_preservation_return",
"T08": "done_source_readiness_preserved",
"generic_chart_default_tag": "empty_required_explicit_pin_unchanged",
"declared_production_image": "main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
"preserve_preexisting_dirty": [
".custodian-brief.md",
"WORK-RECORDS.md",
"docs/evidence/legacy-meter-weekly-review-20261014.json",
"docs/evidence/legacy-meter-weekly-review-20261015.json",
"docs/evidence/legacy-meter-weekly-review-20261016.json",
"docs/evidence/legacy-meter-weekly-review-20261017.json"
]
}

View file

@ -0,0 +1,199 @@
--- a/workplans/STATE-WP-0095-historical-source-receiving.md
+++ b/workplans/STATE-WP-0095-historical-source-receiving.md
@@ -199,27 +199,37 @@
```task
id: STATE-WP-0095-T06
-status: wait
+status: done
priority: high
depends_on: [STATE-WP-0095-T05]
-needs_human: true
-intervention_note: "Review exact committed source, CI image and owner deployment proposal before rollout."
+needs_human: false
+intervention_note: "Exact revision 4 approved and verified; no pending rollout intervention."
state_hub_task_id: "6af973b4-1964-5d4d-a2f8-8dbd4c01fda4"
```
-Use the normal CI image and Helm owner path after exact revision/image pin,
-fresh headroom and reviewed dry-run/diff. API/MCP currently run main-7d99282;
-Helm revision75 is the observed rollback baseline, requiring freshness before
-execution. No deployment assent exists for this successor. Verify delivered
-module hash, health, both readiness checks and expected migrated schema
-c4d5e6f7a8b9; verify exact
-three parents/15 tasks and rejection behavior without committed probe changes.
-Only the verified return unblocks RMGR-WP-0019-T05. The full current image also carries inbox-feed migration c4d5e6f7a8b9,
-although this receiver patch adds none. Helm rollback leaves that migration in
-place; unrelated migration acceptance and old-image compatibility need normal
-owner evidence before rollout approval. Do not run destructive default local
-DB tests; use only exact disposable DB containment. Costs and monetary risk are
-unknown pending exact rollout proposal; no zero-cost or autonomy grant is inferred.
+Completed 2026-10-17 on the founder's approval of exact revision 4 of stable
+proposal STATE-WP-0095-T06-cluster-frozen-receiving-r1 (decision
+ e3798419-8aa9-5425-8c08-20df6bd82a19; approved digest
+ sha256:63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32).
+The ordinary owner Helm path delivered revision 76, runtime source 51bc70d and
+exact image manifest sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015.
+API/MCP Ready and primary/railiance01 health report expected schema
+c4d5e6f7a8b9; delivered historical module sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2 matches.
+All three parent and 15 task full DB row hashes/columns/UUIDs remained unchanged.
+Five actual native probes passed: preserve, actual foreign-parent holder move,
+nonterminal task, nonterminal parent and missing task. Every probe rolled back;
+a fresh transaction confirmed complete row restoration. The foreign-holder
+case precisely verified historical binding refusal, not the separate global
+UUID-holder creation branch. No committed probe writes were made.
+
+Evidence: [verified receiving rollout](../docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json).
+This actual receiving return satisfies the prerequisite of RMGR-WP-0019-T05.
+Normal cluster publication and its immutable-source/row return remain T07;
+source readiness and this deployment do not count that later acceptance twice.
+The additive inbox migration is retained; Helm rollback does not downgrade
+schema or stop an active migration Job. Original failures and exact-UID recovery
+limits remain in the referenced approved packet. No TLS recovery/native private
+admission or new autonomy/cost grant is inferred.
## Verify ordinary cluster receiving and immutable historical rows
@@ -256,6 +266,6 @@
Command-fixture tests verify both requests and preserve other dry-run phases.
Evidence and original refusal remain in the Custodian cluster historical
publication packet, revisions/r2 and r3-readiness. This is completed source
-preparation; T06 remains the explicit native rollout gate. The runtime image
+preparation; T06 separately records the verified actual rollout. The runtime image
continues to be main-51bc70d; Makefile/workplan changes do not create a new
application image or native acceptance.
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@
RAILIANCE_STATE_HUB_NAMESPACE ?= state-hub
RAILIANCE_STATE_HUB_CHART ?= deploy/railiance/apps/charts/state-hub
RAILIANCE_STATE_HUB_VALUES ?= deploy/railiance/apps/helm/state-hub-values.yaml
-RAILIANCE_STATE_HUB_IMAGE_TAG ?= main-0747b4d
+RAILIANCE_STATE_HUB_IMAGE_TAG ?= main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015
RAILIANCE_STATE_HUB_PLATFORM_DIR ?= deploy/railiance/platform
RAILIANCE_STATE_HUB_APP_MANIFESTS ?= deploy/railiance/apps/manifests
# Codex/WSL non-login shells may not source ~/.profile; keep uv discoverable.
--- a/deploy/railiance/apps/charts/state-hub/Chart.yaml
+++ b/deploy/railiance/apps/charts/state-hub/Chart.yaml
@@ -3,4 +3,4 @@
description: State Hub API service for private Railiance operation
type: application
version: 0.1.0
-appVersion: "main-5dd3df9"
+appVersion: "main-51bc70d"
--- a/deploy/railiance/apps/helm/state-hub-values.yaml
+++ b/deploy/railiance/apps/helm/state-hub-values.yaml
@@ -6,7 +6,7 @@
image:
repository: forgejo.coulomb.social/coulomb/state-hub
- tag: "main-0747b4d"
+ tag: "main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015"
ingress:
enabled: false
--- /dev/null
+++ b/docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json
@@ -0,0 +1,102 @@
+{
+ "schema": "statehub.cluster-historical-receiving-delivered.v1",
+ "status": "verified",
+ "proposal_id": "STATE-WP-0095-T06-cluster-frozen-receiving-r1",
+ "approved_revision": 4,
+ "approved_digest_sha256": "sha256:63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32",
+ "approval_decision_id": "e3798419-8aa9-5425-8c08-20df6bd82a19",
+ "source_revision": "51bc70d1ff8f25450a8650d8e50caf053093a02e",
+ "readiness_source_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
+ "helm_revision": 76,
+ "image_reference": "forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
+ "expected_schema": "c4d5e6f7a8b9",
+ "health": {
+ "status": "ok",
+ "instance_role": "primary",
+ "instance_label": "railiance01",
+ "schema": {
+ "status": "ok",
+ "applied": "c4d5e6f7a8b9",
+ "expected": "c4d5e6f7a8b9"
+ }
+ },
+ "pods_ready": true,
+ "historical_module_sha256": "sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2",
+ "historical_preservation_verified": true,
+ "parents": 3,
+ "tasks": 15,
+ "full_historical_rows_equal": true,
+ "native_rollback_probes": {
+ "foreign-holder": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "missing-task": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "nonterminal-parent": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "nonterminal-task": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "preserve": {
+ "full_historical_rows_equal": true,
+ "full_historical_rows_restored": true,
+ "native_outcome_status": "applied",
+ "rolled_back": true,
+ "status": "passed"
+ }
+ },
+ "native_probe_commits": 0,
+ "fresh_transaction_full_rows_equal": true,
+ "source_receiving_gate_delivered": true,
+ "normal_cluster_publication_verified": false,
+ "registrar_admission_or_cluster_publication_not_inferred": true,
+ "authority_limits": [
+ "Rollback probe SQL effects rolled back; foreign-holder case is historical-binding refusal, not separate global holder branch.",
+ "Actual historical native receiving is verified; owner-native TLS/private admission remains unresolved.",
+ "Migration schema remains additive; Helm rollback does not downgrade schema or stop an active hook Job."
+ ],
+ "evidence": [
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/approval-decision.json",
+ "sha256": "sha256:b51554c004daa882f3709f67bdae7f2e939d611120383e61be04ec6969878134"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/helm-return.json",
+ "sha256": "sha256:61727deacf22d37da2d28cbaf04f5a3ddee0f9ff7571c77f1e85dba97963b572"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/delivered-runtime.json",
+ "sha256": "sha256:89681066e8fe139456163ebfafa3efe77ffae8534ea167219230b0a74367f129"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/native-refusal-probes.json",
+ "sha256": "sha256:673ccef965c820704dc310a1bf7832b583c30c3edfeb814528cf892555199172"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/before-full-row-hashes.json",
+ "sha256": "sha256:75cdd87eef79059ff3f484ed24ca69e285899cdf8d851cc4e472653c417eb0ee"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/after-full-row-hashes.json",
+ "sha256": "sha256:2156aad18f190384838c27e792706a156a7423391408afbc6107e6c28c5872d8"
+ }
+ ]
+}

View file

@ -0,0 +1,21 @@
{
"schema": "statehub-followthrough-source-validation.v1",
"patch_apply_check_exit": 0,
"direct_local_helm_render_exit": 0,
"all3runtime_images_match_promoted_digest": true,
"appVersion": "main-51bc70d",
"cluster_contacted": false,
"production_mutations": false,
"normal_make_render": {
"status": "refused_preexisting_canon_copy_drift",
"guard_not_bypassed": true,
"chart_copy_version": "1.0",
"canon_version": "1.1",
"differences": [
"category publication",
"purpose history",
"purpose participation"
],
"scope": "No classification copy edit/guard relaxation included in followthrough."
}
}

View file

@ -0,0 +1,30 @@
{
"schema": "statehub.conditional-T07-completion-overlay.v1",
"status": "prepared_not_applied_no_completion_claim",
"source_preimage": {
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"sha256": "921716ab00993a79917ae5b4750e5b61ae22af4c4fd410b9ccf2be9ec54560df"
},
"guards": [
"Actual normal cluster owner publication and central receiving status applied, with exact pushed commit receipt",
"RMGR-WP-0019-T06 actually done and source status/UUID projection verified",
"All three exact archived source SHA256 bytes remain equal to frozen manifest",
"All three historical parents/15 tasks full DB row hashes unchanged after normal receiving",
"No missing/unresolved/foreign-holder identity or retirement refusal hidden as success"
],
"edits_after_guards_only": [
{
"task_id": "STATE-WP-0095-T07",
"state_hub_task_id": "cfd1ea99-e75b-542e-a434-acefb62f3c7d",
"status": "done",
"evidence": "insert exact actual cluster commit/publication/receiving and preservation receipt refs at activation"
},
{
"workplan_id": "STATE-WP-0095",
"frontmatter_status": "finished",
"only_if": "all eight retained task IDs done and no unresolved retained work remains"
}
],
"preserve_all_IDs_UUIDs_history": true,
"normal_owner_commit_push_projection_required": true
}

View file

@ -0,0 +1,28 @@
--- prior-chart-copy
+++ generated-canon-copy
@@ -13,7 +13,7 @@
# to match the standard version. CUST-WP-0050 T01.
standard: "Repo Classification Standard"
-version: "1.0"
+version: "1.1"
canon_id: "canon-repo-classification"
# category — exactly 1 required (§5)
@@ -24,6 +24,7 @@
- tooling
- product
- business
+ - publication
# domain / secondary_domains — primary exactly 1; secondaries 0..n (§6)
domains:
@@ -85,6 +86,8 @@
- traceability
- documentation
- decision-support
+ - history
+ - participation
platform_and_operations:
- platform
- deployment

View file

@ -0,0 +1,61 @@
{
"schema": "statehub.source-owner-followthrough.v1",
"status": "isolated_six_path_source_refinement_not_applied",
"base_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
"files": [
{
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"action": "modify",
"base_sha256": "ef10359cc5974283b5bdbfc602adf14e3c24362adf00640698d2937c6538483a",
"candidate_sha256": "921716ab00993a79917ae5b4750e5b61ae22af4c4fd410b9ccf2be9ec54560df"
},
{
"path": "Makefile",
"action": "modify",
"base_sha256": "5584ef94071044cca8215141ecd8aee8d6ae5cfe73e8f5719358c680eb8af0d4",
"candidate_sha256": "c5b70e8d4b8ae70380e0ade1c35f9e7fe80038de10080a4723b21ef07a98001e"
},
{
"path": "deploy/railiance/apps/charts/state-hub/Chart.yaml",
"action": "modify",
"base_sha256": "7fe02b390ffd2ba4ce6f82bd62df900826826401e31bdc2138dd5bf36b51a6ae",
"candidate_sha256": "61a989fcf277d05ffbececb7332ee3ca1d8f369c72f960ab1bc4dbc6815536b8"
},
{
"path": "deploy/railiance/apps/helm/state-hub-values.yaml",
"action": "modify",
"base_sha256": "f7cc0e9968598f6ce0faa0d56f62d6817845c3570c18b6ac39ed6561b952b197",
"candidate_sha256": "b51296fc937450f4ecf0ae43243262a631b551389c0d09c8bfe58fa10e2f3ee9"
},
{
"path": "docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json",
"action": "add",
"base_sha256": null,
"candidate_sha256": "db6cd6931c5763ff390e54c6eb9430aad2c4c7c9f42dd6652f436e549e6f6297"
},
{
"path": "deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml",
"action": "modify",
"base_sha256": "9c36fbd5308b19695f9f05d86f8e315bbeccdd267575ce4e2fccf6fb2ea82e32",
"candidate_sha256": "f53c651bb4329c09c04c66f906e2462fe4339ab51ef0ec3da9f942c3016f5bed"
}
],
"patch_sha256": "sha256:12ee2ab6f4cc45ff8cfcb4c03ef84a7e207eff13fdaa194a7281734f5cbc4021",
"live_effects": false,
"new_runtime_image": false,
"T06": "done_actual_approved_verified_rollout",
"T07": "wait_until_actual_RMGR19T06_cluster_publication_and_preservation_return",
"T08": "done_source_readiness_preserved",
"generic_chart_default_tag": "empty_required_explicit_pin_unchanged",
"declared_production_image": "main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
"preserve_preexisting_dirty": [
".custodian-brief.md",
"WORK-RECORDS.md",
"docs/evidence/legacy-meter-weekly-review-20261014.json",
"docs/evidence/legacy-meter-weekly-review-20261015.json",
"docs/evidence/legacy-meter-weekly-review-20261016.json",
"docs/evidence/legacy-meter-weekly-review-20261017.json"
],
"revision": 2,
"source_repair": "Existing generator refreshes chart classification copy to unchanged authoritative canon; no live ConfigMap apply or new runtime image."
}

View file

@ -0,0 +1,238 @@
--- a/workplans/STATE-WP-0095-historical-source-receiving.md
+++ b/workplans/STATE-WP-0095-historical-source-receiving.md
@@ -199,27 +199,37 @@
```task
id: STATE-WP-0095-T06
-status: wait
+status: done
priority: high
depends_on: [STATE-WP-0095-T05]
-needs_human: true
-intervention_note: "Review exact committed source, CI image and owner deployment proposal before rollout."
+needs_human: false
+intervention_note: "Exact revision 4 approved and verified; no pending rollout intervention."
state_hub_task_id: "6af973b4-1964-5d4d-a2f8-8dbd4c01fda4"
```
-Use the normal CI image and Helm owner path after exact revision/image pin,
-fresh headroom and reviewed dry-run/diff. API/MCP currently run main-7d99282;
-Helm revision75 is the observed rollback baseline, requiring freshness before
-execution. No deployment assent exists for this successor. Verify delivered
-module hash, health, both readiness checks and expected migrated schema
-c4d5e6f7a8b9; verify exact
-three parents/15 tasks and rejection behavior without committed probe changes.
-Only the verified return unblocks RMGR-WP-0019-T05. The full current image also carries inbox-feed migration c4d5e6f7a8b9,
-although this receiver patch adds none. Helm rollback leaves that migration in
-place; unrelated migration acceptance and old-image compatibility need normal
-owner evidence before rollout approval. Do not run destructive default local
-DB tests; use only exact disposable DB containment. Costs and monetary risk are
-unknown pending exact rollout proposal; no zero-cost or autonomy grant is inferred.
+Completed 2026-10-17 on the founder's approval of exact revision 4 of stable
+proposal STATE-WP-0095-T06-cluster-frozen-receiving-r1 (decision
+ e3798419-8aa9-5425-8c08-20df6bd82a19; approved digest
+ sha256:63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32).
+The ordinary owner Helm path delivered revision 76, runtime source 51bc70d and
+exact image manifest sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015.
+API/MCP Ready and primary/railiance01 health report expected schema
+c4d5e6f7a8b9; delivered historical module sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2 matches.
+All three parent and 15 task full DB row hashes/columns/UUIDs remained unchanged.
+Five actual native probes passed: preserve, actual foreign-parent holder move,
+nonterminal task, nonterminal parent and missing task. Every probe rolled back;
+a fresh transaction confirmed complete row restoration. The foreign-holder
+case precisely verified historical binding refusal, not the separate global
+UUID-holder creation branch. No committed probe writes were made.
+
+Evidence: [verified receiving rollout](../docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json).
+This actual receiving return satisfies the prerequisite of RMGR-WP-0019-T05.
+Normal cluster publication and its immutable-source/row return remain T07;
+source readiness and this deployment do not count that later acceptance twice.
+The additive inbox migration is retained; Helm rollback does not downgrade
+schema or stop an active migration Job. Original failures and exact-UID recovery
+limits remain in the referenced approved packet. No TLS recovery/native private
+admission or new autonomy/cost grant is inferred.
## Verify ordinary cluster receiving and immutable historical rows
@@ -256,6 +266,17 @@
Command-fixture tests verify both requests and preserve other dry-run phases.
Evidence and original refusal remain in the Custodian cluster historical
publication packet, revisions/r2 and r3-readiness. This is completed source
-preparation; T06 remains the explicit native rollout gate. The runtime image
+preparation; T06 separately records the verified actual rollout. The runtime image
continues to be main-51bc70d; Makefile/workplan changes do not create a new
application image or native acceptance.
+
+
+T08 source repair refinement, 2026-10-17: the required normal Make render
+correctly refused a pre-existing generated chart classification copy at v1.0
+after authoritative canon reached v1.1. Regenerated only through the existing
+scripts/sync_classification_allowed.py, preserving canon and strict check.
+The exact source diff is version 1.0→1.1 plus publication/history/participation.
+Normal Make rendering and the focused classification check passed in an
+isolated owner-layout copy. The original refusal is retained in the Custodian
+owner-followthrough-r1 validation receipt. This is source repair only: no live
+ConfigMap apply, new runtime image, policy relaxation or T07 completion.
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@
RAILIANCE_STATE_HUB_NAMESPACE ?= state-hub
RAILIANCE_STATE_HUB_CHART ?= deploy/railiance/apps/charts/state-hub
RAILIANCE_STATE_HUB_VALUES ?= deploy/railiance/apps/helm/state-hub-values.yaml
-RAILIANCE_STATE_HUB_IMAGE_TAG ?= main-0747b4d
+RAILIANCE_STATE_HUB_IMAGE_TAG ?= main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015
RAILIANCE_STATE_HUB_PLATFORM_DIR ?= deploy/railiance/platform
RAILIANCE_STATE_HUB_APP_MANIFESTS ?= deploy/railiance/apps/manifests
# Codex/WSL non-login shells may not source ~/.profile; keep uv discoverable.
--- a/deploy/railiance/apps/charts/state-hub/Chart.yaml
+++ b/deploy/railiance/apps/charts/state-hub/Chart.yaml
@@ -3,4 +3,4 @@
description: State Hub API service for private Railiance operation
type: application
version: 0.1.0
-appVersion: "main-5dd3df9"
+appVersion: "main-51bc70d"
--- a/deploy/railiance/apps/helm/state-hub-values.yaml
+++ b/deploy/railiance/apps/helm/state-hub-values.yaml
@@ -6,7 +6,7 @@
image:
repository: forgejo.coulomb.social/coulomb/state-hub
- tag: "main-0747b4d"
+ tag: "main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015"
ingress:
enabled: false
--- /dev/null
+++ b/docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json
@@ -0,0 +1,102 @@
+{
+ "schema": "statehub.cluster-historical-receiving-delivered.v1",
+ "status": "verified",
+ "proposal_id": "STATE-WP-0095-T06-cluster-frozen-receiving-r1",
+ "approved_revision": 4,
+ "approved_digest_sha256": "sha256:63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32",
+ "approval_decision_id": "e3798419-8aa9-5425-8c08-20df6bd82a19",
+ "source_revision": "51bc70d1ff8f25450a8650d8e50caf053093a02e",
+ "readiness_source_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
+ "helm_revision": 76,
+ "image_reference": "forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
+ "expected_schema": "c4d5e6f7a8b9",
+ "health": {
+ "status": "ok",
+ "instance_role": "primary",
+ "instance_label": "railiance01",
+ "schema": {
+ "status": "ok",
+ "applied": "c4d5e6f7a8b9",
+ "expected": "c4d5e6f7a8b9"
+ }
+ },
+ "pods_ready": true,
+ "historical_module_sha256": "sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2",
+ "historical_preservation_verified": true,
+ "parents": 3,
+ "tasks": 15,
+ "full_historical_rows_equal": true,
+ "native_rollback_probes": {
+ "foreign-holder": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "missing-task": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "nonterminal-parent": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "nonterminal-task": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "preserve": {
+ "full_historical_rows_equal": true,
+ "full_historical_rows_restored": true,
+ "native_outcome_status": "applied",
+ "rolled_back": true,
+ "status": "passed"
+ }
+ },
+ "native_probe_commits": 0,
+ "fresh_transaction_full_rows_equal": true,
+ "source_receiving_gate_delivered": true,
+ "normal_cluster_publication_verified": false,
+ "registrar_admission_or_cluster_publication_not_inferred": true,
+ "authority_limits": [
+ "Rollback probe SQL effects rolled back; foreign-holder case is historical-binding refusal, not separate global holder branch.",
+ "Actual historical native receiving is verified; owner-native TLS/private admission remains unresolved.",
+ "Migration schema remains additive; Helm rollback does not downgrade schema or stop an active hook Job."
+ ],
+ "evidence": [
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/approval-decision.json",
+ "sha256": "sha256:b51554c004daa882f3709f67bdae7f2e939d611120383e61be04ec6969878134"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/helm-return.json",
+ "sha256": "sha256:61727deacf22d37da2d28cbaf04f5a3ddee0f9ff7571c77f1e85dba97963b572"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/delivered-runtime.json",
+ "sha256": "sha256:89681066e8fe139456163ebfafa3efe77ffae8534ea167219230b0a74367f129"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/native-refusal-probes.json",
+ "sha256": "sha256:673ccef965c820704dc310a1bf7832b583c30c3edfeb814528cf892555199172"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/before-full-row-hashes.json",
+ "sha256": "sha256:75cdd87eef79059ff3f484ed24ca69e285899cdf8d851cc4e472653c417eb0ee"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/after-full-row-hashes.json",
+ "sha256": "sha256:2156aad18f190384838c27e792706a156a7423391408afbc6107e6c28c5872d8"
+ }
+ ]
+}
--- a/deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml
+++ b/deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml
@@ -13,7 +13,7 @@
# to match the standard version. CUST-WP-0050 T01.
standard: "Repo Classification Standard"
-version: "1.0"
+version: "1.1"
canon_id: "canon-repo-classification"
# category — exactly 1 required (§5)
@@ -24,6 +24,7 @@
- tooling
- product
- business
+ - publication
# domain / secondary_domains — primary exactly 1; secondaries 0..n (§6)
domains:
@@ -85,6 +86,8 @@
- traceability
- documentation
- decision-support
+ - history
+ - participation
platform_and_operations:
- platform
- deployment

View file

@ -0,0 +1,25 @@
{
"schema": "statehub-source-refinement-validation.v1",
"normal_owner_make_render_exit": 0,
"focused_classification_check_exit": 0,
"sync_script_sha256": "sha256:b1c06691843d15ac4e82c0eba59d566c754aa5163337ed4ee8644c3dc9283bcd",
"canon_sha256": "sha256:c0e0452bb08fe1700f2672b5b019da08c3d70737fa5b00bdfeab14ef32cb6477",
"exact_copy_diff": {
"removed": [
"version: \"1.0\""
],
"added": [
"version: \"1.1\"",
" - publication",
" - history",
" - participation"
]
},
"all3runtime_images_exact_promoted_digest": true,
"original_failed_render_receipt": "../owner-followthrough-r1/validation.json",
"canon_edited": false,
"guard_changed": false,
"cluster_contacted": false,
"new_runtime_image": false,
"canonical_mutations": false
}

View file

@ -0,0 +1,17 @@
# Immutable ordinary-binding repair, source revision 3
Canonical base: 086d79a2736e34b916bd7de3c8a65e2ea38a3d64. The ten-path patch includes the previously reviewed six-path followthrough and four guard/test paths. Originals and the actual failed publication receipt remain untouched.
The approved revision-4 receiving rollout preserved all 18 rows at its verification stage. A later ordinary Cluster publication changed exactly three parent full-row hashes; all 15 task hashes remained unchanged. The binding endpoint assigns a new backing sync timestamp unconditionally, providing a concrete mutation path. Hash-only snapshots do not establish the exact changed columns or supply original preimages. This patch does not restore them.
Only the three existing task-bound railiance-cluster registry entries receive this guard. The CLI requires all three scan members, validates their exact source bytes and metadata, and omits valid immutable bindings before contacting any receiver. A refused batch becomes C-44 FAIL and returns a nonzero exit even in remote-all mode. The API independently validates all request metadata before any assignment, locks and refreshes parent/task rows, checks actual repo ownership and existing terminal required-bound tasks, and skips every setter for valid frozen rows. Additional children retain existing Forge receiving semantics; no new child-set invariant is introduced. The ordinary binding response retains updated/received and adds preserved. Frozen-only requests perform no commit or cache invalidation. Existing get_session uses an async-session context manager, which closes the read transaction and releases locks on exit.
Validation: 40 isolated tests pass with --noconftest. Tests extract actual source functions/classes without importing owner app configuration or opening a DB. They verify all three exact sources, missing scan member/UUID, changed source and metadata, foreign names, complete mixed-batch refusal, API ownership and terminal-state refusal, no frozen setters/commit, ordinary compatibility, lock/refresh query intent and actual CLI exit criteria. The full tracked chart plus overlay passes normal Make render/classification check: eight objects, three unchanged digest-qualified images. No concurrency/native DB behavior is claimed by these source tests.
T06 remains done for the approved delivery at its verification stage; T07 remains wait for failed whole-pipeline preservation. T09 is progress until source publication. T10 is wait/needs_human for a separate exact new runtime approval. New task UUIDs are intentionally unallocated pending root review and normal managed allocation. Preserve the original dirty brief/index/weekly evidence and index state.
## Next runtime proposal preparation
After reviewed source integration and normal publication, obtain normal CI status and resolve the resulting exact immutable image manifest. Inspect selected delivered source hashes, including historical_projection.py, workstreams.py and the installed closure; do not reuse the prior main-51bc70d runtime for the new API guard. Prepare digest-qualified packaged-chart reuse-values server dry-run, compare intended object identities/spec hashes, collect fresh release/headroom/schema and full-row hash baseline, then record a new scoped proposal and supervisor disposition. Current known prior baseline was Helm 76/schema c4d5e6f7a8b9; refresh rather than assume it remains current. CI revision, new image digest, final chart package hash and exact execution digest remain unresolved until publication.
No new rollout is authorized by the prior revision-4 approval. A new rollout must retain migration closure and rollback limits: Helm rollback does not downgrade schema, and timeout/atomic does not necessarily stop an active hook Job. Cancellation may address only the exact owned trial Job UID/image after identity verification. Unknown migration recovery or connection/lock quiescence stops for attended owner handling; no credential grant or invented DB-session mapping. EUR cost and risk are unknown until reviewed; no bounded-outage assertion. New baseline preservation and rollback-only refusal probes prove the new stage, never restoration of the unavailable original parent preimages. T07/RMGR19T06 cannot close on source publication alone.

View file

@ -0,0 +1,77 @@
{
"schema": "statehub.source-owner-followthrough.v1",
"revision": 3,
"status": "isolated_source_candidate_not_published",
"base_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
"files": [
{
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"action": "modify",
"base_sha256": "ef10359cc5974283b5bdbfc602adf14e3c24362adf00640698d2937c6538483a",
"candidate_sha256": "287001ec92d5a9b851b0d70e56747730a9bb150fcda09e97d6e6e9ddf39c7b5c"
},
{
"path": "Makefile",
"action": "modify",
"base_sha256": "5584ef94071044cca8215141ecd8aee8d6ae5cfe73e8f5719358c680eb8af0d4",
"candidate_sha256": "c5b70e8d4b8ae70380e0ade1c35f9e7fe80038de10080a4723b21ef07a98001e"
},
{
"path": "deploy/railiance/apps/charts/state-hub/Chart.yaml",
"action": "modify",
"base_sha256": "7fe02b390ffd2ba4ce6f82bd62df900826826401e31bdc2138dd5bf36b51a6ae",
"candidate_sha256": "61a989fcf277d05ffbececb7332ee3ca1d8f369c72f960ab1bc4dbc6815536b8"
},
{
"path": "deploy/railiance/apps/helm/state-hub-values.yaml",
"action": "modify",
"base_sha256": "f7cc0e9968598f6ce0faa0d56f62d6817845c3570c18b6ac39ed6561b952b197",
"candidate_sha256": "b51296fc937450f4ecf0ae43243262a631b551389c0d09c8bfe58fa10e2f3ee9"
},
{
"path": "docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json",
"action": "add",
"base_sha256": null,
"candidate_sha256": "fb0b59ba3558e084fb4ae2c36c556f3cfbb2a889f6fd86d4e803c52f483b26fd"
},
{
"path": "deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml",
"action": "modify",
"base_sha256": "9c36fbd5308b19695f9f05d86f8e315bbeccdd267575ce4e2fccf6fb2ea82e32",
"candidate_sha256": "f53c651bb4329c09c04c66f906e2462fe4339ab51ef0ec3da9f942c3016f5bed"
},
{
"path": "api/services/historical_projection.py",
"action": "modify",
"base_sha256": "e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2",
"candidate_sha256": "e24e57c58f4aaa4ec9d9bf088009ac69006e53f75b9477ee53dc26c4e850b975"
},
{
"path": "api/routers/workstreams.py",
"action": "modify",
"base_sha256": "61e7a0ab638b155e9e0b2a72fe8e0ddd2edf5bc6c2d3ca7f6c3ff51e8868910b",
"candidate_sha256": "9c9bf4376dd323b52109912bb3f615949e89ac02c8b88b4720f569f8565ad1d6"
},
{
"path": "scripts/consistency_check.py",
"action": "modify",
"base_sha256": "1827921c79b476bee823c2ddf9896aeb83f3efca6548427e17b3244216bbc6b5",
"candidate_sha256": "ae96d6260f6c88d35bc2d3f22f2a6061367621fd0416387d25d8683c8e804e06"
},
{
"path": "tests/test_frozen_binding_guard_isolated.py",
"action": "add",
"base_sha256": null,
"candidate_sha256": "78eb62178fdecf9b5f6c40d398f8c44e93ff740abaf86557ab51ceb708d2ed65"
}
],
"patch_sha256": "sha256:e9bc2ba9f81b6290945b6de6e0a00ba4c995478b17da786605f5a0466e300b3d",
"T06": "done_verified_approved_rollout_at_stage",
"T07": "wait_actual_later_parent_row_preservation_failure",
"T08": "done_source_repair_pending_publication",
"T09": "progress_until_source_published",
"T10": "wait_needs_human_new_runtime",
"live_effects": false,
"original_parent_preimages": "unknown_do_not_restore_guesses",
"managed_UUIDs": "T09_T10_not_allocated_pending_review"
}

View file

@ -0,0 +1,650 @@
--- a/workplans/STATE-WP-0095-historical-source-receiving.md
+++ b/workplans/STATE-WP-0095-historical-source-receiving.md
@@ -199,27 +199,37 @@
```task
id: STATE-WP-0095-T06
-status: wait
+status: done
priority: high
depends_on: [STATE-WP-0095-T05]
-needs_human: true
-intervention_note: "Review exact committed source, CI image and owner deployment proposal before rollout."
+needs_human: false
+intervention_note: "Exact revision 4 approved and verified; no pending rollout intervention."
state_hub_task_id: "6af973b4-1964-5d4d-a2f8-8dbd4c01fda4"
```
-Use the normal CI image and Helm owner path after exact revision/image pin,
-fresh headroom and reviewed dry-run/diff. API/MCP currently run main-7d99282;
-Helm revision75 is the observed rollback baseline, requiring freshness before
-execution. No deployment assent exists for this successor. Verify delivered
-module hash, health, both readiness checks and expected migrated schema
-c4d5e6f7a8b9; verify exact
-three parents/15 tasks and rejection behavior without committed probe changes.
-Only the verified return unblocks RMGR-WP-0019-T05. The full current image also carries inbox-feed migration c4d5e6f7a8b9,
-although this receiver patch adds none. Helm rollback leaves that migration in
-place; unrelated migration acceptance and old-image compatibility need normal
-owner evidence before rollout approval. Do not run destructive default local
-DB tests; use only exact disposable DB containment. Costs and monetary risk are
-unknown pending exact rollout proposal; no zero-cost or autonomy grant is inferred.
+Completed 2026-10-17 on the founder's approval of exact revision 4 of stable
+proposal STATE-WP-0095-T06-cluster-frozen-receiving-r1 (decision
+ e3798419-8aa9-5425-8c08-20df6bd82a19; approved digest
+ sha256:63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32).
+The ordinary owner Helm path delivered revision 76, runtime source 51bc70d and
+exact image manifest sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015.
+API/MCP Ready and primary/railiance01 health report expected schema
+c4d5e6f7a8b9; delivered historical module sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2 matches.
+All three parent and 15 task full DB row hashes/columns/UUIDs remained unchanged.
+Five actual native probes passed: preserve, actual foreign-parent holder move,
+nonterminal task, nonterminal parent and missing task. Every probe rolled back;
+a fresh transaction confirmed complete row restoration. The foreign-holder
+case precisely verified historical binding refusal, not the separate global
+UUID-holder creation branch. No committed probe writes were made.
+
+Evidence: [verified receiving rollout](../docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json).
+This actual receiving return satisfies the prerequisite of RMGR-WP-0019-T05.
+Normal cluster publication and its immutable-source/row return remain T07;
+source readiness and this deployment do not count that later acceptance twice.
+The additive inbox migration is retained; Helm rollback does not downgrade
+schema or stop an active migration Job. Original failures and exact-UID recovery
+limits remain in the referenced approved packet. No TLS recovery/native private
+admission or new autonomy/cost grant is inferred.
## Verify ordinary cluster receiving and immutable historical rows
@@ -256,6 +266,70 @@
Command-fixture tests verify both requests and preserve other dry-run phases.
Evidence and original refusal remain in the Custodian cluster historical
publication packet, revisions/r2 and r3-readiness. This is completed source
-preparation; T06 remains the explicit native rollout gate. The runtime image
+preparation; T06 separately records the verified actual rollout. The runtime image
continues to be main-51bc70d; Makefile/workplan changes do not create a new
application image or native acceptance.
+
+
+T08 source repair refinement, 2026-10-17: the required normal Make render
+correctly refused a pre-existing generated chart classification copy at v1.0
+after authoritative canon reached v1.1. Regenerated only through the existing
+scripts/sync_classification_allowed.py, preserving canon and strict check.
+The exact source diff is version 1.0→1.1 plus publication/history/participation.
+Normal Make rendering and the focused classification check passed in an
+isolated owner-layout copy. The original refusal is retained in the Custodian
+owner-followthrough-r1 validation receipt. This is source repair only: no live
+ConfigMap apply, new runtime image, policy relaxation or T07 completion.
+
+
+T07 actual ordinary-publication return, 2026-10-17: cluster owner deep consistency
+and normal fast projection completed, exact archived source bytes and all 15
+historical task full-row hashes remained unchanged. The later full-row check
+FAILED for exactly the three parent rows. The earlier approved T06 rollout had
+preserved all 18 rows at its verification stage; that success is not the later
+whole-pipeline acceptance. The original snapshots retain hashes only, so exact
+changed columns and original field preimages are not established. No guessed
+DB repair or claim that all 18 original row hashes are restored is authorized.
+T07 and RMGR-WP-0019-T06 remain waiting pending T09/T10 and a reviewed return.
+
+## Guard immutable historical index bindings in CLI and receiving API
+
+```task
+id: STATE-WP-0095-T09
+status: progress
+priority: high
+depends_on: [STATE-WP-0095-T06]
+```
+
+Prepare and publish the narrowly scoped ordinary-binding repair for the three
+existing task-bound Cluster registry entries. The CLI verifies exact frozen
+source metadata/bytes and omits those bindings, including on old receivers.
+The API independently validates the complete batch before any mutation, checks
+actual repo ownership and the existing terminal parent/task closure, and
+preserves valid frozen rows without field or timestamp assignments. Invalid
+metadata, missing/foreign/nonterminal rows refuse the batch. Unknown ordinary
+bindings retain existing behavior; historical IDs, UUIDs and source bytes stay
+unchanged. Isolated regression tests and normal owner rendering are required.
+Mark done only after reviewed source publication and normal owner projection;
+source preparation does not establish delivered runtime or T07 acceptance.
+
+## Deliver and verify the ordinary-binding guard successor
+
+```task
+id: STATE-WP-0095-T10
+status: wait
+priority: high
+depends_on: [STATE-WP-0095-T09]
+needs_human: true
+intervention_note: "New API runtime requires its own exact image, reviewed preflight and scoped rollout approval; prior revision-4 approval does not cover it."
+```
+
+After source publication, resolve normal CI status and immutable image identity,
+verify delivered guard source closure, prepare exact chart/reuse-values dry-run,
+full closure/headroom/schema baseline and conditional recovery. Retain additive
+migration and active-Job cancellation limitations; no Helm schema downgrade or
+bounded-outage claim. Obtain scoped approval before live rollout. Then verify
+new full-row baseline preservation and actual rollback-only refusal probes,
+and only then return to T07 ordinary-pipeline acceptance. This prevents future
+binding mutation; it does not reconstruct or restore original parent hashes.
+No production changes, new autonomy or credential authority are granted here.
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@
RAILIANCE_STATE_HUB_NAMESPACE ?= state-hub
RAILIANCE_STATE_HUB_CHART ?= deploy/railiance/apps/charts/state-hub
RAILIANCE_STATE_HUB_VALUES ?= deploy/railiance/apps/helm/state-hub-values.yaml
-RAILIANCE_STATE_HUB_IMAGE_TAG ?= main-0747b4d
+RAILIANCE_STATE_HUB_IMAGE_TAG ?= main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015
RAILIANCE_STATE_HUB_PLATFORM_DIR ?= deploy/railiance/platform
RAILIANCE_STATE_HUB_APP_MANIFESTS ?= deploy/railiance/apps/manifests
# Codex/WSL non-login shells may not source ~/.profile; keep uv discoverable.
--- a/deploy/railiance/apps/charts/state-hub/Chart.yaml
+++ b/deploy/railiance/apps/charts/state-hub/Chart.yaml
@@ -3,4 +3,4 @@
description: State Hub API service for private Railiance operation
type: application
version: 0.1.0
-appVersion: "main-5dd3df9"
+appVersion: "main-51bc70d"
--- a/deploy/railiance/apps/helm/state-hub-values.yaml
+++ b/deploy/railiance/apps/helm/state-hub-values.yaml
@@ -6,7 +6,7 @@
image:
repository: forgejo.coulomb.social/coulomb/state-hub
- tag: "main-0747b4d"
+ tag: "main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015"
ingress:
enabled: false
--- /dev/null
+++ b/docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json
@@ -0,0 +1,116 @@
+{
+ "schema": "statehub.cluster-historical-receiving-delivered.v1",
+ "status": "verified",
+ "proposal_id": "STATE-WP-0095-T06-cluster-frozen-receiving-r1",
+ "approved_revision": 4,
+ "approved_digest_sha256": "sha256:63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32",
+ "approval_decision_id": "e3798419-8aa9-5425-8c08-20df6bd82a19",
+ "source_revision": "51bc70d1ff8f25450a8650d8e50caf053093a02e",
+ "readiness_source_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
+ "helm_revision": 76,
+ "image_reference": "forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
+ "expected_schema": "c4d5e6f7a8b9",
+ "health": {
+ "status": "ok",
+ "instance_role": "primary",
+ "instance_label": "railiance01",
+ "schema": {
+ "status": "ok",
+ "applied": "c4d5e6f7a8b9",
+ "expected": "c4d5e6f7a8b9"
+ }
+ },
+ "pods_ready": true,
+ "historical_module_sha256": "sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2",
+ "historical_preservation_verified": true,
+ "parents": 3,
+ "tasks": 15,
+ "full_historical_rows_equal": true,
+ "native_rollback_probes": {
+ "foreign-holder": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "missing-task": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "nonterminal-parent": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "nonterminal-task": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "preserve": {
+ "full_historical_rows_equal": true,
+ "full_historical_rows_restored": true,
+ "native_outcome_status": "applied",
+ "rolled_back": true,
+ "status": "passed"
+ }
+ },
+ "native_probe_commits": 0,
+ "fresh_transaction_full_rows_equal": true,
+ "source_receiving_gate_delivered": true,
+ "normal_cluster_publication_verified": false,
+ "registrar_admission_or_cluster_publication_not_inferred": true,
+ "authority_limits": [
+ "Rollback probe SQL effects rolled back; foreign-holder case is historical-binding refusal, not separate global holder branch.",
+ "Actual historical native receiving is verified; owner-native TLS/private admission remains unresolved.",
+ "Migration schema remains additive; Helm rollback does not downgrade schema or stop an active hook Job."
+ ],
+ "evidence": [
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/approval-decision.json",
+ "sha256": "sha256:b51554c004daa882f3709f67bdae7f2e939d611120383e61be04ec6969878134"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/helm-return.json",
+ "sha256": "sha256:61727deacf22d37da2d28cbaf04f5a3ddee0f9ff7571c77f1e85dba97963b572"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/delivered-runtime.json",
+ "sha256": "sha256:89681066e8fe139456163ebfafa3efe77ffae8534ea167219230b0a74367f129"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/native-refusal-probes.json",
+ "sha256": "sha256:673ccef965c820704dc310a1bf7832b583c30c3edfeb814528cf892555199172"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/before-full-row-hashes.json",
+ "sha256": "sha256:75cdd87eef79059ff3f484ed24ca69e285899cdf8d851cc4e472653c417eb0ee"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/after-full-row-hashes.json",
+ "sha256": "sha256:2156aad18f190384838c27e792706a156a7423391408afbc6107e6c28c5872d8"
+ }
+ ],
+ "later_ordinary_cluster_publication": {
+ "status": "failed_full_parent_row_preservation",
+ "changed_parent_hashes": 3,
+ "unchanged_task_hashes": 15,
+ "exact_changed_columns": "unknown_hash_only_baseline",
+ "original_parent_preimages": "unavailable_no_guessed_restoration",
+ "receipt": "the-custodian/docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/post-publication-full-row-hashes-FAILED.json",
+ "T07": "wait",
+ "RMGR_WP_0019_T06": "wait",
+ "followup": [
+ "STATE-WP-0095-T09",
+ "STATE-WP-0095-T10"
+ ]
+ }
+}
--- a/deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml
+++ b/deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml
@@ -13,7 +13,7 @@
# to match the standard version. CUST-WP-0050 T01.
standard: "Repo Classification Standard"
-version: "1.0"
+version: "1.1"
canon_id: "canon-repo-classification"
# category — exactly 1 required (§5)
@@ -24,6 +24,7 @@
- tooling
- product
- business
+ - publication
# domain / secondary_domains — primary exactly 1; secondaries 0..n (§6)
domains:
@@ -85,6 +86,8 @@
- traceability
- documentation
- decision-support
+ - history
+ - participation
platform_and_operations:
- platform
- deployment
--- a/api/services/historical_projection.py
+++ b/api/services/historical_projection.py
@@ -193,3 +193,46 @@
raise ValueError("Historical source binding changed: " + entry["path"])
result.append((entry, data.decode("utf-8")))
return result
+
+
+# Only the three existing full-task Cluster bindings have immutable DB rows.
+# Other historical views retain their existing compatibility behavior.
+FROZEN_CLUSTER_BINDINGS = tuple(
+ entry for entry in BINDINGS
+ if entry["repo"] == "railiance-cluster" and "tasks" in entry
+)
+
+
+def frozen_cluster_binding(binding):
+ """Validate a claimed frozen binding; unrelated requests remain ordinary."""
+ matches = [entry for entry in FROZEN_CLUSTER_BINDINGS
+ if str(binding["workplan_id"]) == entry["uuid"]
+ or (binding["repo_slug"] == "railiance-cluster"
+ and (binding["relative_path"] == entry["path"]
+ or binding["filename"] == Path(entry["path"]).name))]
+ if not matches:
+ return None
+ if len(matches) != 1:
+ raise ValueError("frozen historical binding is ambiguous")
+ entry = matches[0]
+ expected = {
+ "workplan_id": entry["uuid"], "repo_slug": entry["repo"],
+ "filename": Path(entry["path"]).name, "relative_path": entry["path"],
+ "archived": True, "status": "finished",
+ }
+ if any((str(binding[key]) if key == "workplan_id" else binding[key]) != value
+ for key, value in expected.items()):
+ raise ValueError("frozen historical binding metadata changed")
+ return entry
+
+
+def validate_frozen_cluster_rows(entry, parent, tasks, repo_id):
+ """Receiving requires the exact existing terminal closure, never repair."""
+ if (parent is None or str(parent.id) != entry["uuid"]
+ or repo_id is None or parent.repo_id != repo_id
+ or parent.status not in {"done", "finished", "archived", "completed"}):
+ raise ValueError("frozen historical parent missing, foreign or nonterminal")
+ local = {str(task.id): task for task in tasks if task.workplan_id == parent.id}
+ if any(task["uuid"] not in local or local[task["uuid"]].status not in {"done", "cancel"}
+ for task in entry["tasks"]):
+ raise ValueError("frozen historical task missing, foreign or nonterminal")
--- a/api/routers/workstreams.py
+++ b/api/routers/workstreams.py
@@ -16,6 +16,8 @@
from api.events import EventEnvelope, publish_event
from api.models.managed_repo import ManagedRepo
from api.models.workplan import Workplan
+from api.models.task import Task
+from api.services.historical_projection import frozen_cluster_binding, validate_frozen_cluster_rows
from api.schemas.workplan import (
WorkplanBindingsSync,
WorkplanCreate,
@@ -435,12 +437,42 @@
session: AsyncSession = Depends(get_session),
) -> dict[str, int]:
"""Upsert workstation workplan file bindings for remote API index fallback."""
+ # Preflight the complete batch before assigning even an ordinary row.
+ try:
+ frozen = {entry.workplan_id: bound for entry in body.bindings
+ if (bound := frozen_cluster_binding(entry.model_dump())) is not None}
+ except ValueError as exc:
+ raise HTTPException(status_code=409, detail=str(exc)) from exc
+ requested_ids = {entry.workplan_id for entry in body.bindings}
+ rows = await session.execute(
+ select(Workplan).where(Workplan.id.in_(requested_ids))
+ .order_by(Workplan.id).with_for_update().execution_options(populate_existing=True)
+ )
+ workplans = {workplan.id: workplan for workplan in rows.scalars().all()}
+ if frozen:
+ repo_rows = await session.execute(
+ select(ManagedRepo).where(ManagedRepo.slug == "railiance-cluster")
+ )
+ repo = repo_rows.scalar_one_or_none()
+ task_rows = await session.execute(
+ select(Task).where(Task.workplan_id.in_(frozen))
+ .order_by(Task.id).with_for_update().execution_options(populate_existing=True)
+ )
+ tasks = task_rows.scalars().all()
+ try:
+ for workplan_id, bound in frozen.items():
+ validate_frozen_cluster_rows(
+ bound, workplans.get(workplan_id), tasks, repo.id if repo else None
+ )
+ except ValueError as exc:
+ raise HTTPException(status_code=409, detail=str(exc)) from exc
synced_at = datetime.now(timezone.utc)
updated = 0
- requested_ids = {entry.workplan_id for entry in body.bindings}
- rows = await session.execute(select(Workplan).where(Workplan.id.in_(requested_ids)))
- workplans = {workplan.id: workplan for workplan in rows.scalars().all()}
+ preserved = 0
for entry in body.bindings:
+ if entry.workplan_id in frozen:
+ preserved += 1
+ continue # No setters, including backing_synced_at/updated_at.
wp = workplans.get(entry.workplan_id)
if wp is None:
continue
@@ -449,9 +481,10 @@
wp.backing_archived = entry.archived
wp.backing_synced_at = synced_at
updated += 1
- await session.commit()
- _invalidate_workplan_index_cache()
- return {"updated": updated, "received": len(body.bindings)}
+ if updated:
+ await session.commit()
+ _invalidate_workplan_index_cache()
+ return {"updated": updated, "received": len(body.bindings), "preserved": preserved}
@router.post("/", status_code=status.HTTP_410_GONE)
--- a/scripts/consistency_check.py
+++ b/scripts/consistency_check.py
@@ -120,7 +120,9 @@
resolve_topic_domain_slug,
)
from api.services.lifecycle import should_activate_parent_for_active_tasks # noqa: E402
-from api.services.historical_projection import BINDINGS as _HISTORICAL_BINDINGS # noqa: E402
+from api.services.historical_projection import ( # noqa: E402
+ BINDINGS as _HISTORICAL_BINDINGS, FROZEN_CLUSTER_BINDINGS, frozen_cluster_binding,
+)
from api.task_status import ( # noqa: E402
CANONICAL_TASK_STATUSES,
OPEN_TASK_STATUSES,
@@ -318,7 +320,7 @@
# C-00 marks infrastructure/automation faults (API down, repo missing in DB).
# All other FAIL severities are assessment findings for follow-up.
-_AUTOMATION_ERROR_CHECKS: frozenset[str] = frozenset({"C-00"})
+_AUTOMATION_ERROR_CHECKS: frozenset[str] = frozenset({"C-00", "C-44"})
_NON_WORKPLAN_WORKPLAN_FILES: frozenset[str] = frozenset({"README.md"})
@@ -2496,23 +2498,44 @@
repo_dir: Path,
report: ConsistencyReport,
) -> None:
+ if repo_slug == "railiance-cluster":
+ scanned_paths = {workplan_display_path(repo_dir, path) for path, _, _ in workplan_infos}
+ missing = [entry["path"] for entry in FROZEN_CLUSTER_BINDINGS
+ if entry["path"] not in scanned_paths]
+ if missing:
+ report.add(severity="FAIL", check_id="C-44",
+ message="Frozen binding batch refused: bound source missing from scan",
+ fixable=False)
+ return
bindings: list[dict[str, Any]] = []
for wp_file, meta, _ in workplan_infos:
ws_id = str(meta.get("state_hub_workstream_id", "")).strip().strip('"')
+ archived = wp_file.parent.name == "archived"
+ file_status = normalise_workstream_status(str(meta.get("status", "")).strip())
+ binding = {
+ "workplan_id": ws_id, "filename": wp_file.name,
+ "relative_path": workplan_display_path(repo_dir, wp_file),
+ "repo_slug": repo_slug, "archived": archived,
+ "status": file_status or None,
+ }
+ try:
+ frozen = frozen_cluster_binding(binding)
+ if frozen is not None:
+ # Verify exact source before omitting the immutable binding.
+ # This is safe even against a receiver predating the API guard.
+ from hashlib import sha256
+ if (wp_file.is_symlink() or not wp_file.is_file()
+ or sha256(wp_file.read_bytes()).hexdigest() != frozen["sha256"]):
+ raise ValueError("frozen historical source missing or changed")
+ continue
+ except ValueError as exc:
+ report.add(severity="FAIL", check_id="C-44",
+ message=f"Frozen binding batch refused: {exc}",
+ file_path=str(wp_file), fixable=False)
+ return # Never send a partial batch after a frozen-source refusal.
if not ws_id:
continue
- archived = wp_file.parent.name == "archived"
- file_status = normalise_workstream_status(str(meta.get("status", "")).strip())
- bindings.append(
- {
- "workplan_id": ws_id,
- "filename": wp_file.name,
- "relative_path": workplan_display_path(repo_dir, wp_file),
- "repo_slug": repo_slug,
- "archived": archived,
- "status": file_status or None,
- }
- )
+ bindings.append(binding)
if not bindings:
return
result = _api_put(api_base, "/workplans/index/bindings", {"bindings": bindings})
--- /dev/null
+++ b/tests/test_frozen_binding_guard_isolated.py
@@ -0,0 +1,143 @@
+from pathlib import Path
+import ast, asyncio, importlib.util, types, uuid
+from dataclasses import dataclass, field
+from datetime import datetime, timezone
+import pytest
+
+ROOT = Path(__file__).resolve().parents[1]
+spec=importlib.util.spec_from_file_location('historical',ROOT/'api/services/historical_projection.py')
+h=importlib.util.module_from_spec(spec);spec.loader.exec_module(h)
+B=h.FROZEN_CLUSTER_BINDINGS[0]
+def binding(**changes):
+ d=dict(workplan_id=uuid.UUID(B['uuid']),repo_slug=B['repo'],filename=Path(B['path']).name,relative_path=B['path'],archived=True,status='finished');d.update(changes);return d
+class Obj:
+ def __init__(self,**kw):self.__dict__.update(kw);self.writes=[]
+ def __setattr__(self,k,v):
+ if 'writes' in self.__dict__:self.writes.append(k)
+ object.__setattr__(self,k,v)
+class Entry(Obj):
+ def model_dump(self):return {k:v for k,v in self.__dict__.items() if k!='writes'}
+class Col:
+ def in_(self,x):return self
+ def __eq__(self,x):return self
+class Query:
+ def __init__(self):self.locked=False;self.refreshed=False;self.ordered=False
+ def where(self,*a):return self
+ def order_by(self,*a):self.ordered=True;return self
+ def with_for_update(self):self.locked=True;return self
+ def execution_options(self,**kw):self.refreshed=kw.get("populate_existing") is True;return self
+class Model: id=Col();slug=Col();workplan_id=Col()
+class Result:
+ def __init__(self,values):self.values=values
+ def scalars(self):return self
+ def all(self):return self.values
+ def scalar_one_or_none(self):return self.values[0] if self.values else None
+class Session:
+ def __init__(self,rows):self.results=iter(rows);self.commits=0;self.queries=[]
+ async def execute(self,q):self.queries.append(q);return Result(next(self.results))
+ async def commit(self):self.commits+=1
+class HTTPException(Exception):
+ def __init__(self,status_code,detail):self.status_code=status_code;super().__init__(detail)
+def extracted(path,name,extra):
+ tree=ast.parse((ROOT/path).read_text());node=next(n for n in tree.body if isinstance(n,(ast.FunctionDef,ast.AsyncFunctionDef)) and n.name==name)
+ node.decorator_list=[];node.returns=None
+ for a in node.args.args + node.args.kwonlyargs:a.annotation=None
+ node.args.defaults=[]
+ ns=dict(Path=Path,datetime=datetime,timezone=timezone,**extra)
+ exec(compile(ast.Module(body=[node],type_ignores=[]),str(path),'exec'),ns);return ns[name]
+def actual_report():
+ tree=ast.parse((ROOT/'scripts/consistency_check.py').read_text())
+ nodes=[n for n in tree.body if (isinstance(n,ast.ClassDef) and n.name in {'Issue','ConsistencyReport'}) or (isinstance(n,ast.AnnAssign) and isinstance(n.target,ast.Name) and n.target.id=='_AUTOMATION_ERROR_CHECKS')]
+ ns=dict(dataclass=dataclass,field=field,_AUTOMATION_ERROR_CHECKS=frozenset({'C-00','C-44'}))
+ exec(compile(ast.Module(body=nodes,type_ignores=[]),'actual_report','exec'),ns)
+ return ns['ConsistencyReport']('railiance-cluster','/unused')
+
+def closure():
+ repo=Obj(id=uuid.uuid4());parent=Obj(id=uuid.UUID(B['uuid']),repo_id=repo.id,status='finished')
+ tasks=[Obj(id=uuid.UUID(t['uuid']),workplan_id=parent.id,status='done') for t in B['tasks']]
+ return repo,parent,tasks
+async def run_api(entries,repo,parent,tasks,ordinary=None):
+ rows=([parent] if parent else [])+([ordinary] if ordinary else [])
+ session=Session([rows,[repo] if repo else [],tasks])
+ fn=extracted('api/routers/workstreams.py','sync_workplan_bindings',dict(frozen_cluster_binding=h.frozen_cluster_binding,validate_frozen_cluster_rows=h.validate_frozen_cluster_rows,HTTPException=HTTPException,select=lambda *_:Query(),Workplan=Model,Task=Model,ManagedRepo=Model,_invalidate_workplan_index_cache=lambda:None))
+ result=await fn(Obj(bindings=[Entry(**e) for e in entries]),session)
+ return result,session
+@pytest.mark.parametrize('change',[dict(repo_slug='foreign'),dict(workplan_id=uuid.uuid4()),dict(relative_path='workplans/other.md'),dict(filename='other.md'),dict(archived=False),dict(status='active')])
+def test_metadata_refuses(change):
+ with pytest.raises(ValueError):h.frozen_cluster_binding(binding(**change))
+def test_unrelated_binding_unchanged():assert h.frozen_cluster_binding(binding(workplan_id=uuid.uuid4(),filename='ordinary.md',relative_path='workplans/ordinary.md',repo_slug='other')) is None
+@pytest.mark.parametrize('fault',['parent_missing','foreign_repo','parent_active','task_missing','task_active','task_foreign','repo_missing'])
+def test_mixed_batch_refusal_precedes_all_writes(fault):
+ repo,parent,tasks=closure();ordinary=Obj(id=uuid.uuid4())
+ if fault=='repo_missing':repo=None
+ if fault=='parent_missing':parent=None
+ if fault=='foreign_repo':parent.repo_id=uuid.uuid4()
+ if fault=='parent_active':parent.status='active'
+ if fault=='task_missing':tasks.pop()
+ if fault=='task_active':tasks[0].status='progress'
+ if fault=='task_foreign':tasks[0].workplan_id=uuid.uuid4()
+ if parent:parent.writes.clear()
+ for t in tasks:t.writes.clear()
+ normal=binding(workplan_id=ordinary.id,repo_slug='ordinary',filename='ordinary.md',relative_path='workplans/ordinary.md')
+ with pytest.raises(HTTPException):asyncio.run(run_api([normal,binding()],repo,parent,tasks,ordinary))
+ assert ordinary.writes==[]
+ if parent:assert parent.writes==[]
+ assert all(t.writes==[] for t in tasks)
+def test_exact_frozen_no_setters_or_commit():
+ repo,parent,tasks=closure();result,session=asyncio.run(run_api([binding()],repo,parent,tasks))
+ assert result==dict(updated=0,received=1,preserved=1);assert session.commits==0;assert parent.writes==[]
+ assert all(q.locked and q.refreshed and q.ordered for q in (session.queries[0],session.queries[2]))
+def test_mixed_valid_preserves_frozen_and_updates_ordinary():
+ repo,parent,tasks=closure();ordinary=Obj(id=uuid.uuid4())
+ normal=binding(workplan_id=ordinary.id,repo_slug='ordinary',filename='ordinary.md',relative_path='workplans/ordinary.md')
+ result,session=asyncio.run(run_api([normal,binding()],repo,parent,tasks,ordinary))
+ assert result==dict(updated=1,received=2,preserved=1);assert session.commits==1;assert parent.writes==[]
+ assert ordinary.writes==['backing_filename','backing_relative_path','backing_archived','backing_synced_at']
+@pytest.mark.parametrize('tamper',['metadata','bytes','symlink','missing_scan','missing_uuid','valid'])
+@pytest.mark.parametrize("bound_index", range(3))
+def test_cli_exact_source_omission_or_whole_batch_refusal(tmp_path,tamper,bound_index):
+ bound=h.FROZEN_CLUSTER_BINDINGS[bound_index]
+ import shutil
+ infos=[]
+ for entry in h.FROZEN_CLUSTER_BINDINGS:
+ target=tmp_path/entry['path'];target.parent.mkdir(parents=True,exist_ok=True)
+ shutil.copyfile(Path('/home/worsch/railiance-cluster')/entry['path'],target)
+ infos.append((target,dict(state_hub_workstream_id=entry['uuid'],status='finished'),''))
+ path=tmp_path/bound['path']
+ meta=dict(state_hub_workstream_id=bound['uuid'],status='finished')
+ if tamper=='metadata':meta['status']='active'
+ if tamper=='missing_uuid':meta.pop('state_hub_workstream_id')
+ if tamper=='bytes':path.write_text(path.read_text()+'\n')
+ if tamper=='symlink':path.unlink();path.symlink_to(Path('/home/worsch/railiance-cluster')/bound['path'])
+ ordinary=tmp_path/'workplans/ordinary.md';ordinary.write_text('ordinary')
+ if tamper=='missing_scan':infos.pop(bound_index)
+ else:infos[bound_index]=(path,meta,'')
+ calls=[];report=actual_report()
+ fn=extracted('scripts/consistency_check.py','_sync_workplan_bindings',dict(FROZEN_CLUSTER_BINDINGS=h.FROZEN_CLUSTER_BINDINGS,frozen_cluster_binding=h.frozen_cluster_binding,normalise_workstream_status=lambda s:s,workplan_display_path=lambda root,p:p.relative_to(root).as_posix(),_api_put=lambda *a:calls.append(a) or dict(updated=1,received=1)))
+ fn('http://unused','railiance-cluster',[(ordinary,dict(state_hub_workstream_id=str(uuid.uuid4()),status='active'),''),*infos],tmp_path,report)
+ if tamper=='valid':assert len(calls)==1 and len(calls[0][2]['bindings'])==1
+ else:assert calls==[] and report.failures[0].check_id=='C-44' and report.automation_errors
+
+
+def test_api_tampered_mixed_batch_refuses_before_queries_or_assignments():
+ repo,parent,tasks=closure();ordinary=Obj(id=uuid.uuid4())
+ with pytest.raises(HTTPException):
+ asyncio.run(run_api([binding(workplan_id=ordinary.id,repo_slug='ordinary',filename='ordinary.md',relative_path='workplans/ordinary.md'),binding(archived=False)],repo,parent,tasks,ordinary))
+ assert ordinary.writes==[] and parent.writes==[]
+
+
+def test_foreign_repo_same_filename_path_is_ordinary():
+ assert h.frozen_cluster_binding(binding(workplan_id=uuid.uuid4(),repo_slug='foreign')) is None
+
+
+@pytest.mark.parametrize('entry',h.FROZEN_CLUSTER_BINDINGS)
+def test_all_three_registry_bindings_are_guarded(entry):
+ good=dict(workplan_id=entry['uuid'],repo_slug=entry['repo'],filename=Path(entry['path']).name,relative_path=entry['path'],archived=True,status='finished')
+ assert h.frozen_cluster_binding(good) is entry
+ with pytest.raises(ValueError):h.frozen_cluster_binding(dict(good,status='active'))
+
+
+def test_real_cli_exit_criterion_is_nonzero_including_remote_all():
+ report=actual_report();report.add(severity='FAIL',check_id='C-44',message='refused')
+ fn=extracted('scripts/consistency_check.py','consistency_exit_code',{})
+ assert fn([report])==1 and fn([report],remote_all=True)==1

View file

@ -0,0 +1,17 @@
{
"isolated_regression_tests": 40,
"pytest_exit": 0,
"pytest_command": "python3 -m pytest --noconftest -q state-hub/tests/test_frozen_binding_guard_isolated.py",
"normal_make_render_exit": 0,
"render_complete_tracked_chart": true,
"rendered_objects": 8,
"runtime_images": [
"forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
"forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
"forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015"
],
"classification_check_exit": 0,
"no_DB_or_cluster_access": true,
"no_canonical_mutations": true,
"original_r1_r2_receipts_preserved": true
}

View file

@ -0,0 +1,43 @@
# Immutable ordinary-binding repair, source revision 4
Canonical base: 086d79a2736e34b916bd7de3c8a65e2ea38a3d64. The ten-path patch includes the previously reviewed six-path followthrough and four guard/test paths. Originals and the actual failed publication receipt remain untouched.
The approved revision-4 receiving rollout preserved all 18 rows at its verification stage. A later ordinary Cluster publication changed exactly three parent full-row hashes; all 15 task hashes remained unchanged. The binding endpoint assigns a new backing sync timestamp unconditionally, providing a concrete mutation path. Hash-only snapshots do not establish the exact changed columns or supply original preimages. This patch does not restore them.
Only the three existing task-bound railiance-cluster registry entries receive this guard. The CLI requires all three scan members, validates their exact source bytes and metadata, and omits valid immutable bindings before contacting any receiver. A refused batch becomes C-44 FAIL and returns a nonzero exit even in remote-all mode. The API independently validates all request metadata before any assignment, locks and refreshes parent/task rows, checks actual repo ownership and existing terminal required-bound tasks, and skips every setter for valid frozen rows. Additional children retain existing Forge receiving semantics; no new child-set invariant is introduced. The ordinary binding response retains updated/received and adds preserved. Frozen-only requests perform no commit or cache invalidation. Existing get_session uses an async-session context manager, which closes the read transaction and releases locks on exit.
Validation: 75 isolated tests pass with --noconftest. Tests extract actual source functions/classes without importing owner app configuration or opening a DB. They verify all three exact sources, missing scan member/UUID, changed source and metadata, foreign names, complete mixed-batch refusal, API ownership and terminal-state refusal, no frozen setters/commit, ordinary compatibility, lock/refresh query intent and actual CLI exit criteria. The full tracked chart plus overlay passes normal Make render/classification check: eight objects, three unchanged digest-qualified images. No concurrency/native DB behavior is claimed by these source tests.
T06 remains done for the approved delivery at its verification stage; T07 remains wait for failed whole-pipeline preservation. T09 is progress until source publication. T10 is wait/needs_human for a separate exact new runtime approval. New task UUIDs are intentionally unallocated pending root review and normal managed allocation. Preserve the original dirty brief/index/weekly evidence and index state.
## Next runtime proposal preparation
After reviewed source integration and normal publication, obtain normal CI status and resolve the resulting exact immutable image manifest. Inspect selected delivered source hashes, including historical_projection.py, workstreams.py and the installed closure; do not reuse the prior main-51bc70d runtime for the new API guard. Prepare digest-qualified packaged-chart reuse-values server dry-run, compare intended object identities/spec hashes, collect fresh release/headroom/schema and full-row hash baseline, then record a new scoped proposal and supervisor disposition. Current known prior baseline was Helm 76/schema c4d5e6f7a8b9; refresh rather than assume it remains current. CI revision, new image digest, final chart package hash and exact execution digest remain unresolved until publication.
No new rollout is authorized by the prior revision-4 approval. A new rollout must retain migration closure and rollback limits: Helm rollback does not downgrade schema, and timeout/atomic does not necessarily stop an active hook Job. Cancellation may address only the exact owned trial Job UID/image after identity verification. Unknown migration recovery or connection/lock quiescence stops for attended owner handling; no credential grant or invented DB-session mapping. EUR cost and risk are unknown until reviewed; no bounded-outage assertion. New baseline preservation and rollback-only refusal probes prove the new stage, never restoration of the unavailable original parent preimages. T07/RMGR19T06 cannot close on source publication alone.
Revision 4 retains frozen revision 3 and adds central consistency repair-batch
refusal. The same helper checks exact registered parent/task UUIDs and source
paths before check_repo can issue an index binding PUT and again before
fix_repo can invoke reconcile, push, metadata registration or individual fixes.
A protected repair finding refuses the complete batch with C-44, including
when an ordinary fix appears first. Existing C-44 refusal is not duplicated.
This prevents generic C-04/C-10/C-22 and related fixes from modifying frozen
rows through other APIs. It does not disable ordinary checks or silently
accept source/DB drift: owner review and the waiting live records remain.
Tests invoke the actual fix engine with mixed fix lists for all three parents,
exercise bound task/source contexts, and verify unchanged ordinary behavior.
API preservation/refusal simulations now exercise all three parent closures.
The post-publication client regression can compare fresh CURRENT full-row hashes
before/after the fixed normal Cluster deep consistency and fast projection.
That is a separate stage from the preserved original failure; equal fresh
hashes do not restore or accept the unavailable original parent preimages.
For T10 prefer the exact originally approved b5c chart archive with only the
newly verified immutable guard image changed, after artifact identity and
server dry-run comparison. Do not infer authority to roll out the source chart's
v1.1 classification ConfigMap or other chart metadata changes. Source Make
pins continue to declare the actually delivered 51bc70d@c802 artifact until a
new exact runtime is approved and verified.

View file

@ -0,0 +1,77 @@
{
"schema": "statehub.source-owner-followthrough.v1",
"revision": 4,
"status": "isolated_source_candidate_not_published",
"base_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
"files": [
{
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"action": "modify",
"base_sha256": "ef10359cc5974283b5bdbfc602adf14e3c24362adf00640698d2937c6538483a",
"candidate_sha256": "5671189ee87f2d4dff08979f6243e5eb7888b140955899642a74d569496b71c7"
},
{
"path": "Makefile",
"action": "modify",
"base_sha256": "5584ef94071044cca8215141ecd8aee8d6ae5cfe73e8f5719358c680eb8af0d4",
"candidate_sha256": "c5b70e8d4b8ae70380e0ade1c35f9e7fe80038de10080a4723b21ef07a98001e"
},
{
"path": "deploy/railiance/apps/charts/state-hub/Chart.yaml",
"action": "modify",
"base_sha256": "7fe02b390ffd2ba4ce6f82bd62df900826826401e31bdc2138dd5bf36b51a6ae",
"candidate_sha256": "61a989fcf277d05ffbececb7332ee3ca1d8f369c72f960ab1bc4dbc6815536b8"
},
{
"path": "deploy/railiance/apps/helm/state-hub-values.yaml",
"action": "modify",
"base_sha256": "f7cc0e9968598f6ce0faa0d56f62d6817845c3570c18b6ac39ed6561b952b197",
"candidate_sha256": "b51296fc937450f4ecf0ae43243262a631b551389c0d09c8bfe58fa10e2f3ee9"
},
{
"path": "docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json",
"action": "add",
"base_sha256": null,
"candidate_sha256": "fb0b59ba3558e084fb4ae2c36c556f3cfbb2a889f6fd86d4e803c52f483b26fd"
},
{
"path": "deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml",
"action": "modify",
"base_sha256": "9c36fbd5308b19695f9f05d86f8e315bbeccdd267575ce4e2fccf6fb2ea82e32",
"candidate_sha256": "f53c651bb4329c09c04c66f906e2462fe4339ab51ef0ec3da9f942c3016f5bed"
},
{
"path": "api/services/historical_projection.py",
"action": "modify",
"base_sha256": "e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2",
"candidate_sha256": "e24e57c58f4aaa4ec9d9bf088009ac69006e53f75b9477ee53dc26c4e850b975"
},
{
"path": "api/routers/workstreams.py",
"action": "modify",
"base_sha256": "61e7a0ab638b155e9e0b2a72fe8e0ddd2edf5bc6c2d3ca7f6c3ff51e8868910b",
"candidate_sha256": "9c9bf4376dd323b52109912bb3f615949e89ac02c8b88b4720f569f8565ad1d6"
},
{
"path": "scripts/consistency_check.py",
"action": "modify",
"base_sha256": "1827921c79b476bee823c2ddf9896aeb83f3efca6548427e17b3244216bbc6b5",
"candidate_sha256": "c2dc6e1b930198ae8352de05573fc6d3b58709996a8499cec4e3f5217546c543"
},
{
"path": "tests/test_frozen_binding_guard_isolated.py",
"action": "add",
"base_sha256": null,
"candidate_sha256": "17dfc4733dce5da4195556d1b0b87eca4783f8760b40c74220c331edfcef32f5"
}
],
"patch_sha256": "sha256:c06bc0a3e667e9ae6407f60887ba8feddc66d19a2c21dfc86d1bbe3718361708",
"T06": "done_verified_approved_rollout_at_stage",
"T07": "wait_actual_later_parent_row_preservation_failure",
"T08": "done_source_repair_pending_publication",
"T09": "progress_until_source_published",
"T10": "wait_needs_human_new_runtime",
"live_effects": false,
"original_parent_preimages": "unknown_do_not_restore_guesses",
"managed_UUIDs": "T09_T10_not_allocated_pending_review"
}

View file

@ -0,0 +1,756 @@
--- a/workplans/STATE-WP-0095-historical-source-receiving.md
+++ b/workplans/STATE-WP-0095-historical-source-receiving.md
@@ -199,27 +199,37 @@
```task
id: STATE-WP-0095-T06
-status: wait
+status: done
priority: high
depends_on: [STATE-WP-0095-T05]
-needs_human: true
-intervention_note: "Review exact committed source, CI image and owner deployment proposal before rollout."
+needs_human: false
+intervention_note: "Exact revision 4 approved and verified; no pending rollout intervention."
state_hub_task_id: "6af973b4-1964-5d4d-a2f8-8dbd4c01fda4"
```
-Use the normal CI image and Helm owner path after exact revision/image pin,
-fresh headroom and reviewed dry-run/diff. API/MCP currently run main-7d99282;
-Helm revision75 is the observed rollback baseline, requiring freshness before
-execution. No deployment assent exists for this successor. Verify delivered
-module hash, health, both readiness checks and expected migrated schema
-c4d5e6f7a8b9; verify exact
-three parents/15 tasks and rejection behavior without committed probe changes.
-Only the verified return unblocks RMGR-WP-0019-T05. The full current image also carries inbox-feed migration c4d5e6f7a8b9,
-although this receiver patch adds none. Helm rollback leaves that migration in
-place; unrelated migration acceptance and old-image compatibility need normal
-owner evidence before rollout approval. Do not run destructive default local
-DB tests; use only exact disposable DB containment. Costs and monetary risk are
-unknown pending exact rollout proposal; no zero-cost or autonomy grant is inferred.
+Completed 2026-10-17 on the founder's approval of exact revision 4 of stable
+proposal STATE-WP-0095-T06-cluster-frozen-receiving-r1 (decision
+ e3798419-8aa9-5425-8c08-20df6bd82a19; approved digest
+ sha256:63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32).
+The ordinary owner Helm path delivered revision 76, runtime source 51bc70d and
+exact image manifest sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015.
+API/MCP Ready and primary/railiance01 health report expected schema
+c4d5e6f7a8b9; delivered historical module sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2 matches.
+All three parent and 15 task full DB row hashes/columns/UUIDs remained unchanged.
+Five actual native probes passed: preserve, actual foreign-parent holder move,
+nonterminal task, nonterminal parent and missing task. Every probe rolled back;
+a fresh transaction confirmed complete row restoration. The foreign-holder
+case precisely verified historical binding refusal, not the separate global
+UUID-holder creation branch. No committed probe writes were made.
+
+Evidence: [verified receiving rollout](../docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json).
+This actual receiving return satisfies the prerequisite of RMGR-WP-0019-T05.
+Normal cluster publication and its immutable-source/row return remain T07;
+source readiness and this deployment do not count that later acceptance twice.
+The additive inbox migration is retained; Helm rollback does not downgrade
+schema or stop an active migration Job. Original failures and exact-UID recovery
+limits remain in the referenced approved packet. No TLS recovery/native private
+admission or new autonomy/cost grant is inferred.
## Verify ordinary cluster receiving and immutable historical rows
@@ -256,6 +266,74 @@
Command-fixture tests verify both requests and preserve other dry-run phases.
Evidence and original refusal remain in the Custodian cluster historical
publication packet, revisions/r2 and r3-readiness. This is completed source
-preparation; T06 remains the explicit native rollout gate. The runtime image
+preparation; T06 separately records the verified actual rollout. The runtime image
continues to be main-51bc70d; Makefile/workplan changes do not create a new
application image or native acceptance.
+
+
+T08 source repair refinement, 2026-10-17: the required normal Make render
+correctly refused a pre-existing generated chart classification copy at v1.0
+after authoritative canon reached v1.1. Regenerated only through the existing
+scripts/sync_classification_allowed.py, preserving canon and strict check.
+The exact source diff is version 1.0→1.1 plus publication/history/participation.
+Normal Make rendering and the focused classification check passed in an
+isolated owner-layout copy. The original refusal is retained in the Custodian
+owner-followthrough-r1 validation receipt. This is source repair only: no live
+ConfigMap apply, new runtime image, policy relaxation or T07 completion.
+
+
+T07 actual ordinary-publication return, 2026-10-17: cluster owner deep consistency
+and normal fast projection completed, exact archived source bytes and all 15
+historical task full-row hashes remained unchanged. The later full-row check
+FAILED for exactly the three parent rows. The earlier approved T06 rollout had
+preserved all 18 rows at its verification stage; that success is not the later
+whole-pipeline acceptance. The original snapshots retain hashes only, so exact
+changed columns and original field preimages are not established. No guessed
+DB repair or claim that all 18 original row hashes are restored is authorized.
+T07 and RMGR-WP-0019-T06 remain waiting pending T09/T10 and a reviewed return.
+
+## Guard immutable historical index bindings in CLI and receiving API
+
+```task
+id: STATE-WP-0095-T09
+status: progress
+priority: high
+depends_on: [STATE-WP-0095-T06]
+```
+
+Prepare and publish the narrowly scoped ordinary-binding repair for the three
+existing task-bound Cluster registry entries. The CLI verifies exact frozen
+source metadata/bytes and omits those bindings, including on old receivers.
+The API independently validates the complete batch before any mutation, checks
+actual repo ownership and the existing terminal parent/task closure, and
+preserves valid frozen rows without field or timestamp assignments. Invalid
+metadata, missing/foreign/nonterminal rows refuse the batch. Unknown ordinary
+bindings retain existing behavior; historical IDs, UUIDs and source bytes stay
+unchanged. Isolated regression tests and normal owner rendering are required.
+Mark done only after reviewed source publication and normal owner projection;
+source preparation does not establish delivered runtime or T07 acceptance.
+Central check/fix engines also refuse the complete repair batch if any fixable
+context touches an exact registered parent/task UUID or frozen source path.
+This runs before index bindings and before reconcile/push/individual fixes;
+ordinary earlier fixes cannot partially execute before a later frozen refusal.
+
+## Deliver and verify the ordinary-binding guard successor
+
+```task
+id: STATE-WP-0095-T10
+status: wait
+priority: high
+depends_on: [STATE-WP-0095-T09]
+needs_human: true
+intervention_note: "New API runtime requires its own exact image, reviewed preflight and scoped rollout approval; prior revision-4 approval does not cover it."
+```
+
+After source publication, resolve normal CI status and immutable image identity,
+verify delivered guard source closure, prepare exact chart/reuse-values dry-run,
+full closure/headroom/schema baseline and conditional recovery. Retain additive
+migration and active-Job cancellation limitations; no Helm schema downgrade or
+bounded-outage claim. Obtain scoped approval before live rollout. Then verify
+new full-row baseline preservation and actual rollback-only refusal probes,
+and only then return to T07 ordinary-pipeline acceptance. This prevents future
+binding mutation; it does not reconstruct or restore original parent hashes.
+No production changes, new autonomy or credential authority are granted here.
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@
RAILIANCE_STATE_HUB_NAMESPACE ?= state-hub
RAILIANCE_STATE_HUB_CHART ?= deploy/railiance/apps/charts/state-hub
RAILIANCE_STATE_HUB_VALUES ?= deploy/railiance/apps/helm/state-hub-values.yaml
-RAILIANCE_STATE_HUB_IMAGE_TAG ?= main-0747b4d
+RAILIANCE_STATE_HUB_IMAGE_TAG ?= main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015
RAILIANCE_STATE_HUB_PLATFORM_DIR ?= deploy/railiance/platform
RAILIANCE_STATE_HUB_APP_MANIFESTS ?= deploy/railiance/apps/manifests
# Codex/WSL non-login shells may not source ~/.profile; keep uv discoverable.
--- a/deploy/railiance/apps/charts/state-hub/Chart.yaml
+++ b/deploy/railiance/apps/charts/state-hub/Chart.yaml
@@ -3,4 +3,4 @@
description: State Hub API service for private Railiance operation
type: application
version: 0.1.0
-appVersion: "main-5dd3df9"
+appVersion: "main-51bc70d"
--- a/deploy/railiance/apps/helm/state-hub-values.yaml
+++ b/deploy/railiance/apps/helm/state-hub-values.yaml
@@ -6,7 +6,7 @@
image:
repository: forgejo.coulomb.social/coulomb/state-hub
- tag: "main-0747b4d"
+ tag: "main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015"
ingress:
enabled: false
--- /dev/null
+++ b/docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json
@@ -0,0 +1,116 @@
+{
+ "schema": "statehub.cluster-historical-receiving-delivered.v1",
+ "status": "verified",
+ "proposal_id": "STATE-WP-0095-T06-cluster-frozen-receiving-r1",
+ "approved_revision": 4,
+ "approved_digest_sha256": "sha256:63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32",
+ "approval_decision_id": "e3798419-8aa9-5425-8c08-20df6bd82a19",
+ "source_revision": "51bc70d1ff8f25450a8650d8e50caf053093a02e",
+ "readiness_source_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
+ "helm_revision": 76,
+ "image_reference": "forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
+ "expected_schema": "c4d5e6f7a8b9",
+ "health": {
+ "status": "ok",
+ "instance_role": "primary",
+ "instance_label": "railiance01",
+ "schema": {
+ "status": "ok",
+ "applied": "c4d5e6f7a8b9",
+ "expected": "c4d5e6f7a8b9"
+ }
+ },
+ "pods_ready": true,
+ "historical_module_sha256": "sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2",
+ "historical_preservation_verified": true,
+ "parents": 3,
+ "tasks": 15,
+ "full_historical_rows_equal": true,
+ "native_rollback_probes": {
+ "foreign-holder": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "missing-task": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "nonterminal-parent": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "nonterminal-task": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "preserve": {
+ "full_historical_rows_equal": true,
+ "full_historical_rows_restored": true,
+ "native_outcome_status": "applied",
+ "rolled_back": true,
+ "status": "passed"
+ }
+ },
+ "native_probe_commits": 0,
+ "fresh_transaction_full_rows_equal": true,
+ "source_receiving_gate_delivered": true,
+ "normal_cluster_publication_verified": false,
+ "registrar_admission_or_cluster_publication_not_inferred": true,
+ "authority_limits": [
+ "Rollback probe SQL effects rolled back; foreign-holder case is historical-binding refusal, not separate global holder branch.",
+ "Actual historical native receiving is verified; owner-native TLS/private admission remains unresolved.",
+ "Migration schema remains additive; Helm rollback does not downgrade schema or stop an active hook Job."
+ ],
+ "evidence": [
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/approval-decision.json",
+ "sha256": "sha256:b51554c004daa882f3709f67bdae7f2e939d611120383e61be04ec6969878134"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/helm-return.json",
+ "sha256": "sha256:61727deacf22d37da2d28cbaf04f5a3ddee0f9ff7571c77f1e85dba97963b572"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/delivered-runtime.json",
+ "sha256": "sha256:89681066e8fe139456163ebfafa3efe77ffae8534ea167219230b0a74367f129"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/native-refusal-probes.json",
+ "sha256": "sha256:673ccef965c820704dc310a1bf7832b583c30c3edfeb814528cf892555199172"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/before-full-row-hashes.json",
+ "sha256": "sha256:75cdd87eef79059ff3f484ed24ca69e285899cdf8d851cc4e472653c417eb0ee"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/after-full-row-hashes.json",
+ "sha256": "sha256:2156aad18f190384838c27e792706a156a7423391408afbc6107e6c28c5872d8"
+ }
+ ],
+ "later_ordinary_cluster_publication": {
+ "status": "failed_full_parent_row_preservation",
+ "changed_parent_hashes": 3,
+ "unchanged_task_hashes": 15,
+ "exact_changed_columns": "unknown_hash_only_baseline",
+ "original_parent_preimages": "unavailable_no_guessed_restoration",
+ "receipt": "the-custodian/docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/post-publication-full-row-hashes-FAILED.json",
+ "T07": "wait",
+ "RMGR_WP_0019_T06": "wait",
+ "followup": [
+ "STATE-WP-0095-T09",
+ "STATE-WP-0095-T10"
+ ]
+ }
+}
--- a/deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml
+++ b/deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml
@@ -13,7 +13,7 @@
# to match the standard version. CUST-WP-0050 T01.
standard: "Repo Classification Standard"
-version: "1.0"
+version: "1.1"
canon_id: "canon-repo-classification"
# category — exactly 1 required (§5)
@@ -24,6 +24,7 @@
- tooling
- product
- business
+ - publication
# domain / secondary_domains — primary exactly 1; secondaries 0..n (§6)
domains:
@@ -85,6 +86,8 @@
- traceability
- documentation
- decision-support
+ - history
+ - participation
platform_and_operations:
- platform
- deployment
--- a/api/services/historical_projection.py
+++ b/api/services/historical_projection.py
@@ -193,3 +193,46 @@
raise ValueError("Historical source binding changed: " + entry["path"])
result.append((entry, data.decode("utf-8")))
return result
+
+
+# Only the three existing full-task Cluster bindings have immutable DB rows.
+# Other historical views retain their existing compatibility behavior.
+FROZEN_CLUSTER_BINDINGS = tuple(
+ entry for entry in BINDINGS
+ if entry["repo"] == "railiance-cluster" and "tasks" in entry
+)
+
+
+def frozen_cluster_binding(binding):
+ """Validate a claimed frozen binding; unrelated requests remain ordinary."""
+ matches = [entry for entry in FROZEN_CLUSTER_BINDINGS
+ if str(binding["workplan_id"]) == entry["uuid"]
+ or (binding["repo_slug"] == "railiance-cluster"
+ and (binding["relative_path"] == entry["path"]
+ or binding["filename"] == Path(entry["path"]).name))]
+ if not matches:
+ return None
+ if len(matches) != 1:
+ raise ValueError("frozen historical binding is ambiguous")
+ entry = matches[0]
+ expected = {
+ "workplan_id": entry["uuid"], "repo_slug": entry["repo"],
+ "filename": Path(entry["path"]).name, "relative_path": entry["path"],
+ "archived": True, "status": "finished",
+ }
+ if any((str(binding[key]) if key == "workplan_id" else binding[key]) != value
+ for key, value in expected.items()):
+ raise ValueError("frozen historical binding metadata changed")
+ return entry
+
+
+def validate_frozen_cluster_rows(entry, parent, tasks, repo_id):
+ """Receiving requires the exact existing terminal closure, never repair."""
+ if (parent is None or str(parent.id) != entry["uuid"]
+ or repo_id is None or parent.repo_id != repo_id
+ or parent.status not in {"done", "finished", "archived", "completed"}):
+ raise ValueError("frozen historical parent missing, foreign or nonterminal")
+ local = {str(task.id): task for task in tasks if task.workplan_id == parent.id}
+ if any(task["uuid"] not in local or local[task["uuid"]].status not in {"done", "cancel"}
+ for task in entry["tasks"]):
+ raise ValueError("frozen historical task missing, foreign or nonterminal")
--- a/api/routers/workstreams.py
+++ b/api/routers/workstreams.py
@@ -16,6 +16,8 @@
from api.events import EventEnvelope, publish_event
from api.models.managed_repo import ManagedRepo
from api.models.workplan import Workplan
+from api.models.task import Task
+from api.services.historical_projection import frozen_cluster_binding, validate_frozen_cluster_rows
from api.schemas.workplan import (
WorkplanBindingsSync,
WorkplanCreate,
@@ -435,12 +437,42 @@
session: AsyncSession = Depends(get_session),
) -> dict[str, int]:
"""Upsert workstation workplan file bindings for remote API index fallback."""
+ # Preflight the complete batch before assigning even an ordinary row.
+ try:
+ frozen = {entry.workplan_id: bound for entry in body.bindings
+ if (bound := frozen_cluster_binding(entry.model_dump())) is not None}
+ except ValueError as exc:
+ raise HTTPException(status_code=409, detail=str(exc)) from exc
+ requested_ids = {entry.workplan_id for entry in body.bindings}
+ rows = await session.execute(
+ select(Workplan).where(Workplan.id.in_(requested_ids))
+ .order_by(Workplan.id).with_for_update().execution_options(populate_existing=True)
+ )
+ workplans = {workplan.id: workplan for workplan in rows.scalars().all()}
+ if frozen:
+ repo_rows = await session.execute(
+ select(ManagedRepo).where(ManagedRepo.slug == "railiance-cluster")
+ )
+ repo = repo_rows.scalar_one_or_none()
+ task_rows = await session.execute(
+ select(Task).where(Task.workplan_id.in_(frozen))
+ .order_by(Task.id).with_for_update().execution_options(populate_existing=True)
+ )
+ tasks = task_rows.scalars().all()
+ try:
+ for workplan_id, bound in frozen.items():
+ validate_frozen_cluster_rows(
+ bound, workplans.get(workplan_id), tasks, repo.id if repo else None
+ )
+ except ValueError as exc:
+ raise HTTPException(status_code=409, detail=str(exc)) from exc
synced_at = datetime.now(timezone.utc)
updated = 0
- requested_ids = {entry.workplan_id for entry in body.bindings}
- rows = await session.execute(select(Workplan).where(Workplan.id.in_(requested_ids)))
- workplans = {workplan.id: workplan for workplan in rows.scalars().all()}
+ preserved = 0
for entry in body.bindings:
+ if entry.workplan_id in frozen:
+ preserved += 1
+ continue # No setters, including backing_synced_at/updated_at.
wp = workplans.get(entry.workplan_id)
if wp is None:
continue
@@ -449,9 +481,10 @@
wp.backing_archived = entry.archived
wp.backing_synced_at = synced_at
updated += 1
- await session.commit()
- _invalidate_workplan_index_cache()
- return {"updated": updated, "received": len(body.bindings)}
+ if updated:
+ await session.commit()
+ _invalidate_workplan_index_cache()
+ return {"updated": updated, "received": len(body.bindings), "preserved": preserved}
@router.post("/", status_code=status.HTTP_410_GONE)
--- a/scripts/consistency_check.py
+++ b/scripts/consistency_check.py
@@ -120,7 +120,9 @@
resolve_topic_domain_slug,
)
from api.services.lifecycle import should_activate_parent_for_active_tasks # noqa: E402
-from api.services.historical_projection import BINDINGS as _HISTORICAL_BINDINGS # noqa: E402
+from api.services.historical_projection import ( # noqa: E402
+ BINDINGS as _HISTORICAL_BINDINGS, FROZEN_CLUSTER_BINDINGS, frozen_cluster_binding,
+)
from api.task_status import ( # noqa: E402
CANONICAL_TASK_STATUSES,
OPEN_TASK_STATUSES,
@@ -318,7 +320,7 @@
# C-00 marks infrastructure/automation faults (API down, repo missing in DB).
# All other FAIL severities are assessment findings for follow-up.
-_AUTOMATION_ERROR_CHECKS: frozenset[str] = frozenset({"C-00"})
+_AUTOMATION_ERROR_CHECKS: frozenset[str] = frozenset({"C-00", "C-44"})
_NON_WORKPLAN_WORKPLAN_FILES: frozenset[str] = frozenset({"README.md"})
@@ -2484,6 +2486,8 @@
_check_workplan_id_collisions(api_base, repo_slug, repo_dir, workplan_infos, report)
_check_scope_freshness(repo_dir, workplan_infos, report)
+ if _refuse_frozen_fix_batch(report, repo_slug):
+ return report
_sync_workplan_bindings(api_base, repo_slug, workplan_infos, repo_dir, report)
return report
@@ -2496,23 +2500,44 @@
repo_dir: Path,
report: ConsistencyReport,
) -> None:
+ if repo_slug == "railiance-cluster":
+ scanned_paths = {workplan_display_path(repo_dir, path) for path, _, _ in workplan_infos}
+ missing = [entry["path"] for entry in FROZEN_CLUSTER_BINDINGS
+ if entry["path"] not in scanned_paths]
+ if missing:
+ report.add(severity="FAIL", check_id="C-44",
+ message="Frozen binding batch refused: bound source missing from scan",
+ fixable=False)
+ return
bindings: list[dict[str, Any]] = []
for wp_file, meta, _ in workplan_infos:
ws_id = str(meta.get("state_hub_workstream_id", "")).strip().strip('"')
+ archived = wp_file.parent.name == "archived"
+ file_status = normalise_workstream_status(str(meta.get("status", "")).strip())
+ binding = {
+ "workplan_id": ws_id, "filename": wp_file.name,
+ "relative_path": workplan_display_path(repo_dir, wp_file),
+ "repo_slug": repo_slug, "archived": archived,
+ "status": file_status or None,
+ }
+ try:
+ frozen = frozen_cluster_binding(binding)
+ if frozen is not None:
+ # Verify exact source before omitting the immutable binding.
+ # This is safe even against a receiver predating the API guard.
+ from hashlib import sha256
+ if (wp_file.is_symlink() or not wp_file.is_file()
+ or sha256(wp_file.read_bytes()).hexdigest() != frozen["sha256"]):
+ raise ValueError("frozen historical source missing or changed")
+ continue
+ except ValueError as exc:
+ report.add(severity="FAIL", check_id="C-44",
+ message=f"Frozen binding batch refused: {exc}",
+ file_path=str(wp_file), fixable=False)
+ return # Never send a partial batch after a frozen-source refusal.
if not ws_id:
continue
- archived = wp_file.parent.name == "archived"
- file_status = normalise_workstream_status(str(meta.get("status", "")).strip())
- bindings.append(
- {
- "workplan_id": ws_id,
- "filename": wp_file.name,
- "relative_path": workplan_display_path(repo_dir, wp_file),
- "repo_slug": repo_slug,
- "archived": archived,
- "status": file_status or None,
- }
- )
+ bindings.append(binding)
if not bindings:
return
result = _api_put(api_base, "/workplans/index/bindings", {"bindings": bindings})
@@ -3610,6 +3635,44 @@
# Fix engine
# ---------------------------------------------------------------------------
+def _refuse_frozen_fix_batch(report: ConsistencyReport, repo_slug: str) -> bool:
+ """Refuse a complete repair batch touching the exact bound histories."""
+ if any(issue.check_id == "C-44" and issue.severity == "FAIL" for issue in report.issues):
+ return True
+ protected_ids = {entry["uuid"] for entry in FROZEN_CLUSTER_BINDINGS}
+ protected_ids.update(task["uuid"] for entry in FROZEN_CLUSTER_BINDINGS
+ for task in entry["tasks"])
+ paths = {entry["path"] for entry in FROZEN_CLUSTER_BINDINGS}
+ root = Path(report.repo_path).absolute() if report.repo_path else None
+
+ def protected(value, key=""):
+ if isinstance(value, dict):
+ return any(protected(item, name) for name, item in value.items())
+ if isinstance(value, (list, tuple)):
+ return any(protected(item, key) for item in value)
+ text = str(value)
+ if (key in {"id", "db_id", "ws_id", "task_id"}
+ or key.endswith(("_id", "_uuid"))):
+ if text in protected_ids:
+ return True
+ if key in {"file_path", "wp_file", "md_path", "path"} and text:
+ candidate = Path(text)
+ if candidate.is_absolute():
+ return root is not None and any(candidate.absolute() == root / path for path in paths)
+ return repo_slug == "railiance-cluster" and candidate.as_posix() in paths
+ return False
+
+ for issue in report.issues:
+ if issue.fixable and (protected(issue.db_id, "db_id")
+ or protected(issue.file_path, "file_path")
+ or protected(issue._fix_context)):
+ report.add(severity="FAIL", check_id="C-44",
+ message="Frozen historical repair batch refused; owner review required",
+ fixable=False)
+ return True
+ return False
+
+
def fix_repo(
api_base: str,
repo_slug: str,
@@ -3624,7 +3687,9 @@
repo_path_override,
bootstrap_empty_projection=bootstrap_empty_projection,
)
- if any(i.check_id in {"C-00", "C-36"} for i in report.failures):
+ if _refuse_frozen_fix_batch(report, repo_slug):
+ return report
+ if any(i.check_id in {"C-00", "C-36", "C-44"} for i in report.failures):
return report
# RMGR-WP-0002: optional repo-manager reconcile proxy (index rebuild) for pilots
--- /dev/null
+++ b/tests/test_frozen_binding_guard_isolated.py
@@ -0,0 +1,180 @@
+from pathlib import Path
+import ast, asyncio, importlib.util, types, uuid
+from dataclasses import dataclass, field
+from datetime import datetime, timezone
+import pytest
+
+ROOT = Path(__file__).resolve().parents[1]
+spec=importlib.util.spec_from_file_location('historical',ROOT/'api/services/historical_projection.py')
+h=importlib.util.module_from_spec(spec);spec.loader.exec_module(h)
+B=h.FROZEN_CLUSTER_BINDINGS[0]
+def binding(_bound=B,**changes):
+ B=_bound
+ d=dict(workplan_id=uuid.UUID(B['uuid']),repo_slug=B['repo'],filename=Path(B['path']).name,relative_path=B['path'],archived=True,status='finished');d.update(changes);return d
+class Obj:
+ def __init__(self,**kw):self.__dict__.update(kw);self.writes=[]
+ def __setattr__(self,k,v):
+ if 'writes' in self.__dict__:self.writes.append(k)
+ object.__setattr__(self,k,v)
+class Entry(Obj):
+ def model_dump(self):return {k:v for k,v in self.__dict__.items() if k!='writes'}
+class Col:
+ def in_(self,x):return self
+ def __eq__(self,x):return self
+class Query:
+ def __init__(self):self.locked=False;self.refreshed=False;self.ordered=False
+ def where(self,*a):return self
+ def order_by(self,*a):self.ordered=True;return self
+ def with_for_update(self):self.locked=True;return self
+ def execution_options(self,**kw):self.refreshed=kw.get("populate_existing") is True;return self
+class Model: id=Col();slug=Col();workplan_id=Col()
+class Result:
+ def __init__(self,values):self.values=values
+ def scalars(self):return self
+ def all(self):return self.values
+ def scalar_one_or_none(self):return self.values[0] if self.values else None
+class Session:
+ def __init__(self,rows):self.results=iter(rows);self.commits=0;self.queries=[]
+ async def execute(self,q):self.queries.append(q);return Result(next(self.results))
+ async def commit(self):self.commits+=1
+class HTTPException(Exception):
+ def __init__(self,status_code,detail):self.status_code=status_code;super().__init__(detail)
+def extracted(path,name,extra):
+ tree=ast.parse((ROOT/path).read_text());node=next(n for n in tree.body if isinstance(n,(ast.FunctionDef,ast.AsyncFunctionDef)) and n.name==name)
+ node.decorator_list=[];node.returns=None
+ for a in node.args.args + node.args.kwonlyargs:a.annotation=None
+ node.args.defaults=[]
+ ns=dict(Path=Path,datetime=datetime,timezone=timezone,**extra)
+ exec(compile(ast.Module(body=[node],type_ignores=[]),str(path),'exec'),ns);return ns[name]
+def actual_report():
+ tree=ast.parse((ROOT/'scripts/consistency_check.py').read_text())
+ nodes=[n for n in tree.body if (isinstance(n,ast.ClassDef) and n.name in {'Issue','ConsistencyReport'}) or (isinstance(n,ast.AnnAssign) and isinstance(n.target,ast.Name) and n.target.id=='_AUTOMATION_ERROR_CHECKS')]
+ ns=dict(dataclass=dataclass,field=field,_AUTOMATION_ERROR_CHECKS=frozenset({'C-00','C-44'}))
+ exec(compile(ast.Module(body=nodes,type_ignores=[]),'actual_report','exec'),ns)
+ return ns['ConsistencyReport']('railiance-cluster','/unused')
+
+def closure(B=B):
+ repo=Obj(id=uuid.uuid4());parent=Obj(id=uuid.UUID(B['uuid']),repo_id=repo.id,status='finished')
+ tasks=[Obj(id=uuid.UUID(t['uuid']),workplan_id=parent.id,status='done') for t in B['tasks']]
+ return repo,parent,tasks
+async def run_api(entries,repo,parent,tasks,ordinary=None):
+ rows=([parent] if parent else [])+([ordinary] if ordinary else [])
+ session=Session([rows,[repo] if repo else [],tasks])
+ fn=extracted('api/routers/workstreams.py','sync_workplan_bindings',dict(frozen_cluster_binding=h.frozen_cluster_binding,validate_frozen_cluster_rows=h.validate_frozen_cluster_rows,HTTPException=HTTPException,select=lambda *_:Query(),Workplan=Model,Task=Model,ManagedRepo=Model,_invalidate_workplan_index_cache=lambda:None))
+ result=await fn(Obj(bindings=[Entry(**e) for e in entries]),session)
+ return result,session
+@pytest.mark.parametrize('change',[dict(repo_slug='foreign'),dict(workplan_id=uuid.uuid4()),dict(relative_path='workplans/other.md'),dict(filename='other.md'),dict(archived=False),dict(status='active')])
+def test_metadata_refuses(change):
+ with pytest.raises(ValueError):h.frozen_cluster_binding(binding(**change))
+def test_unrelated_binding_unchanged():assert h.frozen_cluster_binding(binding(workplan_id=uuid.uuid4(),filename='ordinary.md',relative_path='workplans/ordinary.md',repo_slug='other')) is None
+@pytest.mark.parametrize('fault',['parent_missing','foreign_repo','parent_active','task_missing','task_active','task_foreign','repo_missing'])
+@pytest.mark.parametrize("bound",h.FROZEN_CLUSTER_BINDINGS)
+def test_mixed_batch_refusal_precedes_all_writes(fault,bound):
+ repo,parent,tasks=closure(bound);ordinary=Obj(id=uuid.uuid4())
+ if fault=='repo_missing':repo=None
+ if fault=='parent_missing':parent=None
+ if fault=='foreign_repo':parent.repo_id=uuid.uuid4()
+ if fault=='parent_active':parent.status='active'
+ if fault=='task_missing':tasks.pop()
+ if fault=='task_active':tasks[0].status='progress'
+ if fault=='task_foreign':tasks[0].workplan_id=uuid.uuid4()
+ if parent:parent.writes.clear()
+ for t in tasks:t.writes.clear()
+ normal=binding(workplan_id=ordinary.id,repo_slug='ordinary',filename='ordinary.md',relative_path='workplans/ordinary.md')
+ with pytest.raises(HTTPException):asyncio.run(run_api([normal,binding(_bound=bound)],repo,parent,tasks,ordinary))
+ assert ordinary.writes==[]
+ if parent:assert parent.writes==[]
+ assert all(t.writes==[] for t in tasks)
+@pytest.mark.parametrize("bound",h.FROZEN_CLUSTER_BINDINGS)
+def test_exact_frozen_no_setters_or_commit(bound):
+ repo,parent,tasks=closure(bound);result,session=asyncio.run(run_api([binding(_bound=bound)],repo,parent,tasks))
+ assert result==dict(updated=0,received=1,preserved=1);assert session.commits==0;assert parent.writes==[]
+ assert all(q.locked and q.refreshed and q.ordered for q in (session.queries[0],session.queries[2]))
+@pytest.mark.parametrize("bound",h.FROZEN_CLUSTER_BINDINGS)
+def test_mixed_valid_preserves_frozen_and_updates_ordinary(bound):
+ repo,parent,tasks=closure(bound);ordinary=Obj(id=uuid.uuid4())
+ normal=binding(workplan_id=ordinary.id,repo_slug='ordinary',filename='ordinary.md',relative_path='workplans/ordinary.md')
+ result,session=asyncio.run(run_api([normal,binding(_bound=bound)],repo,parent,tasks,ordinary))
+ assert result==dict(updated=1,received=2,preserved=1);assert session.commits==1;assert parent.writes==[]
+ assert ordinary.writes==['backing_filename','backing_relative_path','backing_archived','backing_synced_at']
+@pytest.mark.parametrize('tamper',['metadata','bytes','symlink','missing_scan','missing_uuid','valid'])
+@pytest.mark.parametrize("bound_index", range(3))
+def test_cli_exact_source_omission_or_whole_batch_refusal(tmp_path,tamper,bound_index):
+ bound=h.FROZEN_CLUSTER_BINDINGS[bound_index]
+ import shutil
+ infos=[]
+ for entry in h.FROZEN_CLUSTER_BINDINGS:
+ target=tmp_path/entry['path'];target.parent.mkdir(parents=True,exist_ok=True)
+ shutil.copyfile(Path('/home/worsch/railiance-cluster')/entry['path'],target)
+ infos.append((target,dict(state_hub_workstream_id=entry['uuid'],status='finished'),''))
+ path=tmp_path/bound['path']
+ meta=dict(state_hub_workstream_id=bound['uuid'],status='finished')
+ if tamper=='metadata':meta['status']='active'
+ if tamper=='missing_uuid':meta.pop('state_hub_workstream_id')
+ if tamper=='bytes':path.write_text(path.read_text()+'\n')
+ if tamper=='symlink':path.unlink();path.symlink_to(Path('/home/worsch/railiance-cluster')/bound['path'])
+ ordinary=tmp_path/'workplans/ordinary.md';ordinary.write_text('ordinary')
+ if tamper=='missing_scan':infos.pop(bound_index)
+ else:infos[bound_index]=(path,meta,'')
+ calls=[];report=actual_report()
+ fn=extracted('scripts/consistency_check.py','_sync_workplan_bindings',dict(FROZEN_CLUSTER_BINDINGS=h.FROZEN_CLUSTER_BINDINGS,frozen_cluster_binding=h.frozen_cluster_binding,normalise_workstream_status=lambda s:s,workplan_display_path=lambda root,p:p.relative_to(root).as_posix(),_api_put=lambda *a:calls.append(a) or dict(updated=1,received=1)))
+ fn('http://unused','railiance-cluster',[(ordinary,dict(state_hub_workstream_id=str(uuid.uuid4()),status='active'),''),*infos],tmp_path,report)
+ if tamper=='valid':assert len(calls)==1 and len(calls[0][2]['bindings'])==1
+ else:assert calls==[] and report.failures[0].check_id=='C-44' and report.automation_errors
+
+
+def test_api_tampered_mixed_batch_refuses_before_queries_or_assignments():
+ repo,parent,tasks=closure();ordinary=Obj(id=uuid.uuid4())
+ with pytest.raises(HTTPException):
+ asyncio.run(run_api([binding(workplan_id=ordinary.id,repo_slug='ordinary',filename='ordinary.md',relative_path='workplans/ordinary.md'),binding(archived=False)],repo,parent,tasks,ordinary))
+ assert ordinary.writes==[] and parent.writes==[]
+
+
+def test_foreign_repo_same_filename_path_is_ordinary():
+ assert h.frozen_cluster_binding(binding(workplan_id=uuid.uuid4(),repo_slug='foreign')) is None
+
+
+@pytest.mark.parametrize('entry',h.FROZEN_CLUSTER_BINDINGS)
+def test_all_three_registry_bindings_are_guarded(entry):
+ good=dict(workplan_id=entry['uuid'],repo_slug=entry['repo'],filename=Path(entry['path']).name,relative_path=entry['path'],archived=True,status='finished')
+ assert h.frozen_cluster_binding(good) is entry
+ with pytest.raises(ValueError):h.frozen_cluster_binding(dict(good,status='active'))
+
+
+def test_real_cli_exit_criterion_is_nonzero_including_remote_all():
+ report=actual_report();report.add(severity='FAIL',check_id='C-44',message='refused')
+ fn=extracted('scripts/consistency_check.py','consistency_exit_code',{})
+ assert fn([report])==1 and fn([report],remote_all=True)==1
+
+
+@pytest.mark.parametrize('check,key,protected_kind',[
+ ('C-04','ws_id','parent'),('C-10','task_id','task'),('C-22','task_id','task'),
+ ('C-09','db_id','parent'),('C-23','wp_file','path'),
+])
+@pytest.mark.parametrize('bound',h.FROZEN_CLUSTER_BINDINGS)
+def test_complete_fix_batch_preflight_before_ordinary_writes(check,key,protected_kind,bound):
+ report=actual_report();report.repo_path='/tmp/fixture-cluster'
+ report.add(severity='WARN',check_id='C-05',message='ordinary first',fixable=True,_fix_context={'ws_id':str(uuid.uuid4()),'field':'title','value':'ordinary'})
+ value=bound['uuid'] if protected_kind=='parent' else bound['tasks'][0]['uuid'] if protected_kind=='task' else str(Path(report.repo_path)/bound['path'])
+ report.add(severity='WARN',check_id=check,message='protected later',fixable=True,db_id=value if key=='db_id' else '',_fix_context={key:value})
+ guard=extracted('scripts/consistency_check.py','_refuse_frozen_fix_batch',dict(FROZEN_CLUSTER_BINDINGS=h.FROZEN_CLUSTER_BINDINGS))
+ assert guard(report,'railiance-cluster') and report.automation_errors
+ calls=[]
+ fn=extracted('scripts/consistency_check.py','fix_repo',dict(check_repo=lambda *a,**kw:report,_refuse_frozen_fix_batch=guard,_api_post=lambda *a:calls.append(a),_api_patch=lambda *a:calls.append(a)))
+ assert fn('http://unused','railiance-cluster',None,False,False) is report and calls==[]
+
+def test_unrelated_fix_context_not_refused():
+ report=actual_report();report.add(severity='WARN',check_id='C-05',message='ordinary',fixable=True,_fix_context={'ws_id':str(uuid.uuid4())})
+ guard=extracted('scripts/consistency_check.py','_refuse_frozen_fix_batch',dict(FROZEN_CLUSTER_BINDINGS=h.FROZEN_CLUSTER_BINDINGS))
+ assert not guard(report,'other')
+
+
+def test_check_repo_guard_precedes_binding_sync_and_does_not_duplicate():
+ tree=ast.parse((ROOT/'scripts/consistency_check.py').read_text())
+ node=next(n for n in tree.body if isinstance(n,ast.FunctionDef) and n.name=='check_repo')
+ guard_lines=[n.lineno for n in ast.walk(node) if isinstance(n,ast.Call) and isinstance(n.func,ast.Name) and n.func.id=='_refuse_frozen_fix_batch']
+ sync_lines=[n.lineno for n in ast.walk(node) if isinstance(n,ast.Call) and isinstance(n.func,ast.Name) and n.func.id=='_sync_workplan_bindings']
+ assert len(guard_lines)==len(sync_lines)==1 and guard_lines[0]<sync_lines[0]
+ report=actual_report();report.add(severity='FAIL',check_id='C-44',message='already refused')
+ guard=extracted('scripts/consistency_check.py','_refuse_frozen_fix_batch',dict(FROZEN_CLUSTER_BINDINGS=h.FROZEN_CLUSTER_BINDINGS))
+ assert guard(report,'railiance-cluster') and len(report.issues)==1

View file

@ -0,0 +1,17 @@
{
"isolated_regression_tests": 75,
"pytest_exit": 0,
"pytest_command": "python3 -m pytest --noconftest -q state-hub/tests/test_frozen_binding_guard_isolated.py",
"normal_make_render_exit": 0,
"render_complete_tracked_chart": true,
"rendered_objects": 8,
"runtime_images": [
"forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
"forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
"forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015"
],
"classification_check_exit": 0,
"no_DB_or_cluster_access": true,
"no_canonical_mutations": true,
"original_r1_r2_receipts_preserved": true
}

View file

@ -0,0 +1,31 @@
# Prepared publication sequence (do not execute until root go)
The publisher refuses until publication-manifest.json exists with the reviewed
exact ten path hashes, canonical base and publication_stage
root_reviewed_UUIDs_and_T09_completion. Root must first review/integrate R5,
assign only the two normal managed T09/T10 UUID fields, and review the T09 done
source-proof overlay. Do not copy the preparation manifest to satisfy this gate.
T07 remains wait; T10 remains wait/needs_human. No new image or live apply.
Run the canonical normal Make render in a private temporary output directory,
emit only object count/identity/image hashes and reject other changes. Then:
python3 publish_followthrough_source.py
python3 publish_followthrough_source.py --execute-source-commit
The helper hashes/preserves unrelated index entries and dirty files, stages only
the ten reviewed paths, runs the normal scanner, commits with --only and normal
hooks, verifies exact committed paths; normal sync below publishes remote main. It never stashes/resets
or adds unrelated dirty brief/index/weekly evidence. Scanner/hook/push refusal
stops; no bypass or blind retry.
After source publication, use the required repo-local normal fast sync:
make sync SYNC_PATH=. SYNC_PUSH=1 STATE_HUB_API_BASE=http://127.0.0.1:8000
Verify explicit applied primary/railiance01 receipt, exact expected/derived
revision and read back all ten STATE95 tasks with exact UUIDs/status. Retain
original failure and compare fresh CURRENT historical full-row hashes around
fixed normal Cluster consistency/projection separately; never claim original
preimages restored. Root performs this authorized owner sync, not this helper.
New runtime CI/image inspection and scoped approval remain T10.

View file

@ -0,0 +1,53 @@
# Immutable ordinary-binding repair, source revision 5
Canonical base: 086d79a2736e34b916bd7de3c8a65e2ea38a3d64. The ten-path patch includes the previously reviewed six-path followthrough and four guard/test paths. Originals and the actual failed publication receipt remain untouched.
The approved revision-4 receiving rollout preserved all 18 rows at its verification stage. A later ordinary Cluster publication changed exactly three parent full-row hashes; all 15 task hashes remained unchanged. The binding endpoint assigns a new backing sync timestamp unconditionally, providing a concrete mutation path. Hash-only snapshots do not establish the exact changed columns or supply original preimages. This patch does not restore them.
Only the three existing task-bound railiance-cluster registry entries receive this guard. The CLI requires all three scan members, validates their exact source bytes and metadata, and omits valid immutable bindings before contacting any receiver. A refused batch becomes C-44 FAIL and returns a nonzero exit even in remote-all mode. The API independently validates all request metadata before any assignment, locks and refreshes parent/task rows, checks actual repo ownership and existing terminal required-bound tasks, and skips every setter for valid frozen rows. Additional children retain existing Forge receiving semantics; no new child-set invariant is introduced. The ordinary binding response retains updated/received and adds preserved. Frozen-only requests perform no commit or cache invalidation. Existing get_session uses an async-session context manager, which closes the read transaction and releases locks on exit.
Validation: 102 isolated tests pass with --noconftest. Tests extract actual source functions/classes without importing owner app configuration or opening a DB. They verify all three exact sources, missing scan member/UUID, changed source and metadata, foreign names, complete mixed-batch refusal, API ownership and terminal-state refusal, no frozen setters/commit, ordinary compatibility, lock/refresh query intent and actual CLI exit criteria. The full tracked chart plus overlay passes normal Make render/classification check: eight objects, three unchanged digest-qualified images. No concurrency/native DB behavior is claimed by these source tests.
T06 remains done for the approved delivery at its verification stage; T07 remains wait for failed whole-pipeline preservation. T09 is progress until source publication. T10 is wait/needs_human for a separate exact new runtime approval. New task UUIDs are intentionally unallocated pending root review and normal managed allocation. Preserve the original dirty brief/index/weekly evidence and index state.
## Next runtime proposal preparation
After reviewed source integration and normal publication, obtain normal CI status and resolve the resulting exact immutable image manifest. Inspect selected delivered source hashes, including historical_projection.py, workstreams.py and the installed closure; do not reuse the prior main-51bc70d runtime for the new API guard. Prepare digest-qualified packaged-chart reuse-values server dry-run, compare intended object identities/spec hashes, collect fresh release/headroom/schema and full-row hash baseline, then record a new scoped proposal and supervisor disposition. Current known prior baseline was Helm 76/schema c4d5e6f7a8b9; refresh rather than assume it remains current. CI revision, new image digest, final chart package hash and exact execution digest remain unresolved until publication.
No new rollout is authorized by the prior revision-4 approval. A new rollout must retain migration closure and rollback limits: Helm rollback does not downgrade schema, and timeout/atomic does not necessarily stop an active hook Job. Cancellation may address only the exact owned trial Job UID/image after identity verification. Unknown migration recovery or connection/lock quiescence stops for attended owner handling; no credential grant or invented DB-session mapping. EUR cost and risk are unknown until reviewed; no bounded-outage assertion. New baseline preservation and rollback-only refusal probes prove the new stage, never restoration of the unavailable original parent preimages. T07/RMGR19T06 cannot close on source publication alone.
Revision 4 retains frozen revision 3 and adds central consistency repair-batch
refusal. The same helper checks exact registered parent/task UUIDs and source
paths before check_repo can issue an index binding PUT and again before
fix_repo can invoke reconcile, push, metadata registration or individual fixes.
A protected repair finding refuses the complete batch with C-44, including
when an ordinary fix appears first. Existing C-44 refusal is not duplicated.
This prevents generic C-04/C-10/C-22 and related fixes from modifying frozen
rows through other APIs. It does not disable ordinary checks or silently
accept source/DB drift: owner review and the waiting live records remain.
Tests invoke the actual fix engine with mixed fix lists for all three parents,
exercise bound task/source contexts, and verify unchanged ordinary behavior.
API preservation/refusal simulations now exercise all three parent closures.
The post-publication client regression can compare fresh CURRENT full-row hashes
before/after the fixed normal Cluster deep consistency and fast projection.
That is a separate stage from the preserved original failure; equal fresh
hashes do not restore or accept the unavailable original parent preimages.
For T10 prefer the exact originally approved b5c chart archive with only the
newly verified immutable guard image changed, after artifact identity and
server dry-run comparison. Do not infer authority to roll out the source chart's
v1.1 classification ConfigMap or other chart metadata changes. Source Make
pins continue to declare the actually delivered 51bc70d@c802 artifact until a
new exact runtime is approved and verified.
Revision 5 retains revision 4 and narrows scalar identity detection to actual
mutation targets: issue.db_id, ws_id/task_id, from-workplan/workstream/task,
desired creation identities and nested state_hub bindings. Incoming dependency
targets to_workstream_id/to_workplan_id/to_task_id remain legitimate references;
they do not mutate a protected row. Exact protected source paths still refuse.
The real C-20 engine posts against from_workstream_id and uses its to IDs only
as dependency body references. Tests cover incoming ordinary edges and protected
origins for all three histories, including nested binding metadata.

View file

@ -0,0 +1,344 @@
---
id: STATE-WP-0095
type: workplan
title: "Preserve exact closed historical source bindings in Forge receiving"
domain: infotech
repo: state-hub
status: active
owner: codex
created: "2026-10-04"
updated: "2026-10-17"
flavor: implementation
depends_on: []
state_hub_workstream_id: "79579572-8120-5d3b-aca5-dd4aff60d058"
---
## Goal
Normal Forge receiving must preserve the seven bound Activity legacy source
views and the Custodian retired ADHOC source without new identities, source
rewrites, task movement, deletion, relabeling or unretirement. This implements
receiving support before RMGR-WP-0019 registrar admission. CUST-WP-0077 owns
cross-owner coordination; deployment and replay remain explicit owner returns.
## Verify source bindings and shared views
```task
id: STATE-WP-0095-T01
status: done
priority: high
state_hub_task_id: "6a5f87bb-e63d-5e20-b9fc-c1b5cd403ff7"
```
Reviewed seven exact Activity files: four existing workplans and 64 UUID-bound
closed tasks. The archived custodian-WP-0003 parent and three split_from views
share one existing parent UUID; every repeated task binding/content agrees.
Custodian ADHOC-2026-08-25-retired retains parent
1c53d3db-6633-5e2d-987f-10706d73be9e and task
d8af3e6b-26ae-580c-bbeb-caa8ad419bec. No identity migration is authorized.
## Implement preservation receiving and global collision refusal
```task
id: STATE-WP-0095-T02
status: done
priority: high
state_hub_task_id: "ebb24194-e4cc-5130-aaa6-663f2ea2c822"
```
Prepared exact source digest manifest, existing-parent/task verification,
immutable receiving and UUID-based historical diff. Ordinary canonical sources
continue deriving their identities. Missing/changed/symlinked source, absent
bound rows or nonterminal hub histories refuse. Check task UUID holders globally,
including retired and acknowledged-stale parent workplans, before INSERT.
Offline preview tests and snapshot proof are evidence of source behavior only;
finish after applying reviewed source and its focused tests to the owning repo.
## Deliver receiving through normal deployment and verify owner return
```task
id: STATE-WP-0095-T03
status: done
priority: high
depends_on: [STATE-WP-0095-T02]
state_hub_task_id: "e8566341-cf6e-5b9c-ad80-8564d14cd52a"
decision_id: "36772026-f43d-4331-b466-5f4b1afe4eca"
```
No direct live code patch. This task is a deployment return, not policy authority
or permission to resolve identity decisions. Exact receiving fixture acceptance
and global collision rejection must hold in the delivered version.
## Verify normal historical replay preserves existing identities
```task
id: STATE-WP-0095-T04
status: done
priority: high
depends_on: [STATE-WP-0095-T03, RMGR-WP-0019-T03]
state_hub_task_id: "3bbb311f-194e-5862-8aed-358a580f22b4"
```
Verify Activity four historical parent UUIDs/64 task UUIDs and Custodian retired
parent/task unchanged; no historical row creation, movement, deletion,
relabeling or unretirement. Unrelated stale projections remain separate decisions.
2026-10-05: Source exact-set retirement support now exists. Repository projection
reconcile accepts `expected_retirement_uuids`; that set must equal the stale
projections, and any task or dependency edge on a stale row refuses the call.
Live apply still needs a reviewed rollout. On 2026-10-05 the founder accepted
review `review-1ece4f3e-d0e3-4fd6-abc8-272f1b1876f4`, which names only the three
empty projections and preserves parent `b4eb45a9-69e3-4ab0-b00c-67a53c3117c5`.
That acceptance is not a live retirement and does not resolve
`91b7c633-a66f-5d43-9f4b-6565aefb9356`.
## Offline evidence, 2026-10-04
Prepared receiver suite: Forge projection regression plus historical preservation,
missing/changed source, terminality, immutable UUID diff, and global holder query.
Real-source offline snapshot proof preserves four Activity parents/64 tasks and
one Custodian parent/task without mutations; no API writes or deployment occurred.
Exact original bindings are maintained in api/services/historical_projection.py.
2026-10-04 actual owning-source validation: 155 focused receiver/qualifier/planner
cases passed; the independent offline current-source/current-hub-snapshot proof
retained five existing parents and 65 task UUIDs, no mutations, clean historical
diff. T02 is source-complete; T03/T04 remain wait for reviewed deployment and
normal registrar/replay receiving, respectively. Evidence: docs/evidence/2026-10-04-historical-receiving-source.json.
## Verified receiving rollout and remaining replay gate, 2026-10-04
T03 is done on actual founder approval of proposal
STATE-WP-0095-T03-historical-receiving revision 1, SHA256
`d6789359b3fe7988a6201fff6f367cb46948aa197e1cc0ca66c31f45e1ea9981`,
approval receipt reference `user_reply:call_o87uEfFs3AtXfxO5YqUnSpcg:0`.
The normal owner Helm path delivered `main-5dd3df9`, commit
`5dd3df9c69eb564af10ea5ea01e349786212501a`, revision 72; API and MCP are Ready,
primary/railiance01 health and schema a0b1c2d3e4f5 verified, running source
hashes match. Rollback remains revision 71; no receipt-table downgrade is needed.
Actual historical preservation and global task-holder refusal were verified in
the delivered version. Durable receipt:
[verified historical receiving rollout](../docs/evidence/2026-10-04-historical-receiving-rollout.json).
Custodian immutable replay applied while preserving the retired historical
parent/task UUIDs. Activity immutable replay retained all four historical parent
and 64 task UUIDs and historical row contents, but refused transactionally on
three unrelated stale projections: custodian-wp-0003 (archived),
custodian-wp-0003a (done), custodian-wp-0003b (done). No retirement acknowledgement
was issued and that refusal is not represented as normal replay success.
Registrar source `c41d36c2` has 38 actual passing tests and Repo Manager's own
normal sync succeeded; registrar admission does not authorize retiring Activity
projections. T04 therefore remains wait, retaining RMGR-WP-0019-T03 and awaiting
Activity Core's precise reviewed disposition of those three stale rows. No
rename, identity migration, new paid native trial or further live action is
included in this source status update.
## Activity Core return, 2026-10-06
Activity Core returned the exact disposition (message
`cf2d5847-8b3f-4653-9d9f-d5fcfbe3f1e4`, ACTIVITY-WP-0045, activity-core commit
`941fac0`). `expected_retirement_uuids`:
`683724d9-4249-5e0e-88e0-7baff4330d58` (custodian-wp-0003),
`644017c7-c5f2-5a64-81c3-d8ee806f8251` (custodian-wp-0003a),
`a5806df9-5b9a-50da-81c1-7e606076bed9` (custodian-wp-0003b). Each has zero
tasks and zero dependency edges. None is preserved parent
`b4eb45a9-69e3-4ab0-b00c-67a53c3117c5`. Repo Manager independently verified the
set (message `916841f6`, repo-manager commit `498682c`). Nothing was retired.
T04 now waits on decision `91b7c633` and a reviewed live rollout. After that,
Repo Manager re-runs the Activity owner sync and closes RMGR-WP-0019-T03.
## Retirement rollout and T04 verification, 2026-10-06
The founder resolved decision `91b7c633` (retire exactly the three projections)
and approved the rollout. The founder ran the normal Helm upgrade to
`main-968a811` (revision 74; rollback revision 73, `main-fad9b3f`). API and MCP
are Ready, health is ok on primary/railiance01, and schema `b3c4d5e6f7a8` is
unchanged; no migrations. The activity-core reconcile at commit
`67a92d2ff8e033baf2c36998d24187fe83edec84` with `expected_retirement_uuids` set
to the three UUIDs applied: 0 created, 3 retired (tombstoned with an
`@retired-20261006` slug; UUIDs and statuses kept), 0 refused, 0 tasks
cancelled. All 7 bound Activity source files still match their digests. The four
historical parents and 64 task UUIDs are present under their bound parents with
unchanged fields. The Custodian retired parent and task are unchanged. Activity
had 54 workplans and 288 tasks before and after. Evidence:
[activity stale retirement rollout](../docs/evidence/2026-10-06-activity-stale-retirement-rollout.json).
Repo Manager's re-run of the Activity owner sync (RMGR-WP-0019-T03) and
ACTIVITY-WP-0045-T02 remain with their owners.
## Cluster exact historical receiving successor, 2026-10-17
This scoped extension retains the completed Activity/Custodian outcomes above.
Three frozen cluster archives contain three existing parent UUIDs and 15 existing
closed task UUIDs. Extend the existing exact historical receiving path before
registrar admission; never derive replacement identities or modify those
sources. Cross-owner observation attaches to existing SHR-WP-0001, with
RMGR-WP-0019 as obligor/beneficiary and NK-WP-0049-T35 benefiting indirectly.
The local derived case is waiting; no live worker injection is authorized.
## Prepare exact cluster source preservation and refusal cases
```task
id: STATE-WP-0095-T05
status: done
priority: high
state_hub_task_id: "339b9a37-181c-5599-9a89-0393e199bd4b"
```
Prepared the same full-file SHA256 and 15 task binding manifest as Repo Manager.
Candidate receiving tests pass 26: existing rows remain entirely unchanged;
missing/foreign/nonterminal rows and unknown, changed, missing or symlinked
source refuse. Read-only public metadata confirms all 18 existing rows have the
expected ownership and terminal status. These are source and metadata checks,
not delivered receiving or a committed native trial.
## Deliver reviewed cluster receiving successor before registrar admission
```task
id: STATE-WP-0095-T06
status: done
priority: high
depends_on: [STATE-WP-0095-T05]
needs_human: false
intervention_note: "Exact revision 4 approved and verified; no pending rollout intervention."
state_hub_task_id: "6af973b4-1964-5d4d-a2f8-8dbd4c01fda4"
```
Completed 2026-10-17 on the founder's approval of exact revision 4 of stable
proposal STATE-WP-0095-T06-cluster-frozen-receiving-r1 (decision
e3798419-8aa9-5425-8c08-20df6bd82a19; approved digest
sha256:63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32).
The ordinary owner Helm path delivered revision 76, runtime source 51bc70d and
exact image manifest sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015.
API/MCP Ready and primary/railiance01 health report expected schema
c4d5e6f7a8b9; delivered historical module sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2 matches.
All three parent and 15 task full DB row hashes/columns/UUIDs remained unchanged.
Five actual native probes passed: preserve, actual foreign-parent holder move,
nonterminal task, nonterminal parent and missing task. Every probe rolled back;
a fresh transaction confirmed complete row restoration. The foreign-holder
case precisely verified historical binding refusal, not the separate global
UUID-holder creation branch. No committed probe writes were made.
Evidence: [verified receiving rollout](../docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json).
This actual receiving return satisfies the prerequisite of RMGR-WP-0019-T05.
Normal cluster publication and its immutable-source/row return remain T07;
source readiness and this deployment do not count that later acceptance twice.
The additive inbox migration is retained; Helm rollback does not downgrade
schema or stop an active migration Job. Original failures and exact-UID recovery
limits remain in the referenced approved packet. No TLS recovery/native private
admission or new autonomy/cost grant is inferred.
## Verify ordinary cluster receiving and immutable historical rows
```task
id: STATE-WP-0095-T07
status: wait
priority: high
depends_on: [STATE-WP-0095-T06, RMGR-WP-0019-T06]
state_hub_task_id: "cfd1ea99-e75b-542e-a434-acefb62f3c7d"
```
Capture normal cluster owner publication/receiving receipts and compare entire
existing row snapshots and exact source bytes. No creation, movement, relabel,
unretirement or retirement is authorized for these histories. A rollback first
fences cluster sync and restores registrar refusal before removing receiving
support; it never rewrites archived IDs or UUIDs. This work does not establish
original TLS recovery or owner-native admission.
## Fix policy-compatible Secret-template server dry-run preparation
```task
id: STATE-WP-0095-T08
status: done
priority: high
state_hub_task_id: "2dd9b04f-2250-5a8a-b5bc-c8a009872858"
```
Prepared the narrow Makefile successor after the existing readiness command
refused its first Secret-template phase. Ordinary client-side apply adds the
last-applied annotation, correctly denied by the existing Platform
reject-secret-last-applied policy. Only the two Secret-template server
dry-run requests now use server-side apply with dry-run; no force-conflicts,
Secret value change, policy relaxation or actual Secret write is introduced.
Command-fixture tests verify both requests and preserve other dry-run phases.
Evidence and original refusal remain in the Custodian cluster historical
publication packet, revisions/r2 and r3-readiness. This is completed source
preparation; T06 separately records the verified actual rollout. The runtime image
continues to be main-51bc70d; Makefile/workplan changes do not create a new
application image or native acceptance.
T08 source repair refinement, 2026-10-17: the required normal Make render
correctly refused a pre-existing generated chart classification copy at v1.0
after authoritative canon reached v1.1. Regenerated only through the existing
scripts/sync_classification_allowed.py, preserving canon and strict check.
The exact source diff is version 1.0→1.1 plus publication/history/participation.
Normal Make rendering and the focused classification check passed in an
isolated owner-layout copy. The original refusal is retained in the Custodian
owner-followthrough-r1 validation receipt. This is source repair only: no live
ConfigMap apply, new runtime image, policy relaxation or T07 completion.
T07 actual ordinary-publication return, 2026-10-17: cluster owner deep consistency
and normal fast projection completed, exact archived source bytes and all 15
historical task full-row hashes remained unchanged. The later full-row check
FAILED for exactly the three parent rows. The earlier approved T06 rollout had
preserved all 18 rows at its verification stage; that success is not the later
whole-pipeline acceptance. The original snapshots retain hashes only, so exact
changed columns and original field preimages are not established. No guessed
DB repair or claim that all 18 original row hashes are restored is authorized.
T07 and RMGR-WP-0019-T06 remain waiting pending T09/T10 and a reviewed return.
## Guard immutable historical index bindings in CLI and receiving API
```task
id: STATE-WP-0095-T09
status: done
priority: high
depends_on: [STATE-WP-0095-T06]
state_hub_task_id: "8be8f13b-6352-5295-9755-de6fbfb13593"
```
Prepare and publish the narrowly scoped ordinary-binding repair for the three
existing task-bound Cluster registry entries. The CLI verifies exact frozen
source metadata/bytes and omits those bindings, including on old receivers.
The API independently validates the complete batch before any mutation, checks
actual repo ownership and the existing terminal parent/task closure, and
preserves valid frozen rows without field or timestamp assignments. Invalid
metadata, missing/foreign/nonterminal rows refuse the batch. Unknown ordinary
bindings retain existing behavior; historical IDs, UUIDs and source bytes stay
unchanged. Isolated regression tests and normal owner rendering are required.
Reviewed source preparation and canonical regression proof completed on
2026-10-17: 102 isolated tests pass and normal Make render/classification
check passes (eight objects, three unchanged delivered runtime images).
This completion record accompanies the same source publication/projection;
source preparation does not establish delivered runtime or T07 acceptance.
Central check/fix engines also refuse the complete repair batch if any fixable
context touches an exact registered parent/task UUID or frozen source path.
This runs before index bindings and before reconcile/push/individual fixes;
ordinary earlier fixes cannot partially execute before a later frozen refusal.
## Deliver and verify the ordinary-binding guard successor
```task
id: STATE-WP-0095-T10
status: wait
priority: high
depends_on: [STATE-WP-0095-T09]
needs_human: true
intervention_note: "New API runtime requires its own exact image, reviewed preflight and scoped rollout approval; prior revision-4 approval does not cover it."
state_hub_task_id: "88585c69-d9b9-5e1f-a256-6416ff71e824"
```
After source publication, resolve normal CI status and immutable image identity,
verify delivered guard source closure, prepare exact chart/reuse-values dry-run,
full closure/headroom/schema baseline and conditional recovery. Retain additive
migration and active-Job cancellation limitations; no Helm schema downgrade or
bounded-outage claim. Obtain scoped approval before live rollout. Then verify
new full-row baseline preservation and actual rollback-only refusal probes,
and only then return to T07 ordinary-pipeline acceptance. This prevents future
binding mutation; it does not reconstruct or restore original parent hashes.
No production changes, new autonomy or credential authority are granted here.

View file

@ -0,0 +1,23 @@
--- a/workplans/STATE-WP-0095-historical-source-receiving.md
+++ b/workplans/STATE-WP-0095-historical-source-receiving.md
@@ -296,7 +296,7 @@
```task
id: STATE-WP-0095-T09
-status: progress
+status: done
priority: high
depends_on: [STATE-WP-0095-T06]
state_hub_task_id: "8be8f13b-6352-5295-9755-de6fbfb13593"
@@ -311,7 +311,10 @@
metadata, missing/foreign/nonterminal rows refuse the batch. Unknown ordinary
bindings retain existing behavior; historical IDs, UUIDs and source bytes stay
unchanged. Isolated regression tests and normal owner rendering are required.
-Mark done only after reviewed source publication and normal owner projection;
+Reviewed source preparation and canonical regression proof completed on
+2026-10-17: 102 isolated tests pass and normal Make render/classification
+check passes (eight objects, three unchanged delivered runtime images).
+This completion record accompanies the same source publication/projection;
source preparation does not establish delivered runtime or T07 acceptance.
Central check/fix engines also refuse the complete repair batch if any fixable
context touches an exact registered parent/task UUID or frozen source path.

View file

@ -0,0 +1,12 @@
from pathlib import Path
import hashlib,json
p=Path("/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-16/cluster-historical-publication-r1/owner-followthrough-r5")
wp=Path("/home/worsch/state-hub/workplans/STATE-WP-0095-historical-source-receiving.md")
assert hashlib.sha256(wp.read_bytes()).hexdigest()=="5d250bcf89c7bc3b3dd81a8b24f57dfbeef69a04f5722f3e76cc3527f143c77c"
new=(p/"STATE95-final-reviewed-overlay.md").read_bytes()
assert hashlib.sha256(new).hexdigest()=="a9aa50f5772ac985dcee9b1b65228e5f909ab25209f80dea9d6f0248029855ca"
wp.write_bytes(new)
d=json.loads((p/"publication-manifest.json").read_text());assert d["publication_stage"]=="pending_root_review_UUIDs_and_T09_completion"
d["publication_stage"]="root_reviewed_UUIDs_and_T09_completion"
(p/"publication-manifest.json").write_text(json.dumps(d,indent=2)+"\n")
print("Reviewed T09 completion overlay applied; no commit yet")

View file

@ -0,0 +1,13 @@
{
"canonical_base": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
"tests_passed": 102,
"tests_seconds": 9.49,
"pytest_warning": "system pytest lacks asyncio plugin option; isolated tests use asyncio.run and passed",
"normal_make_render_exit": 0,
"objects": 8,
"existing_digest_images": 3,
"whole_unrelated_index_and_dirty_state_preserved": true,
"canonical_commit": false,
"Hub_projection": false,
"runtime_changed": false
}

View file

@ -0,0 +1,42 @@
#!/usr/bin/env python3
"""Exact reviewed local source integration and two normal managed UUIDs only."""
import argparse, hashlib, importlib.util, json, sys
from pathlib import Path
BASE=Path(__file__).resolve().parent
OWNER=Path('/home/worsch/state-hub')
EXPECTED_PATCH='ad3d49b83435dd026118ee1e4a25779b5a7739473619bbda256f160c4eb0e56a'
def sha(b):return hashlib.sha256(b).hexdigest()
def main():
ap=argparse.ArgumentParser();ap.add_argument('--execute',action='store_true');args=ap.parse_args()
spec=importlib.util.spec_from_file_location('publisher',BASE/'publish_followthrough_source.py');pub=importlib.util.module_from_spec(spec);spec.loader.exec_module(pub)
expected=json.loads((BASE/'manifest.json').read_text());names={x['path'] for x in expected['files']}
assert len(names)==10 and sha((BASE/'state-hub-followthrough.patch').read_bytes())==EXPECTED_PATCH
assert pub.git(OWNER,'rev-parse','HEAD').stdout.decode().strip()==expected['base_revision']
for entry in expected['files']:
target=OWNER/entry['path'];source=BASE/'state-hub'/entry['path']
assert not target.is_symlink() and not source.is_symlink()
assert sha(source.read_bytes())==entry['candidate_sha256']
assert (sha(target.read_bytes()) if target.exists() else None)==entry['base_sha256']
assert entry['path'] not in pub.index_entries(OWNER) or not pub.git(OWNER,'diff','--cached','--',entry['path']).stdout
before=pub.preserved_state(OWNER,names)
receipt=dict(schema='state95.local-source-integration.v1',status='preflight_only',canonical_revision=expected['base_revision'],patch_sha256='sha256:'+EXPECTED_PATCH,preserved_before=before,live_effects=False)
if args.execute:
for entry in expected['files']:
target=OWNER/entry['path'];target.parent.mkdir(parents=True,exist_ok=True);target.write_bytes((BASE/'state-hub'/entry['path']).read_bytes())
sys.path.insert(0,'/home/worsch/repo-manager/src')
from repo_manager.identifiers import ensure_missing_work_record_identifiers
preview=ensure_missing_work_record_identifiers(OWNER,execute=False)
allowed={'STATE-WP-0095-T09','STATE-WP-0095-T10'}
assert len(preview['assignments'])==2 and {a['record_id'] for a in preview['assignments']}==allowed
assert all(a['path']=='workplans/STATE-WP-0095-historical-source-receiving.md' and a['kind']=='task' for a in preview['assignments'])
assigned=ensure_missing_work_record_identifiers(OWNER,execute=True)
assert assigned['assignments']==preview['assignments']
wp='workplans/STATE-WP-0095-historical-source-receiving.md'
source=(BASE/'state-hub'/wp).read_text();actual=(OWNER/wp).read_text()
for a in assigned['assignments']:actual=actual.replace('state_hub_task_id: "'+a['uuid']+'"\n','')
assert actual==source
assert pub.preserved_state(OWNER,names)==before
receipt.update(status='integrated_managed_UUIDs_not_committed',managed_assignment=assigned,preserved_after=before)
(BASE/'local-integration-result.json').write_text(json.dumps(receipt,indent=2)+'\n')
print(json.dumps({k:v for k,v in receipt.items() if k not in {'preserved_before','preserved_after'}}))
if __name__=='__main__':main()

View file

@ -0,0 +1,77 @@
{
"schema": "statehub.source-owner-followthrough.v1",
"revision": 5,
"status": "isolated_source_candidate_not_published",
"base_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
"files": [
{
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"action": "modify",
"base_sha256": "ef10359cc5974283b5bdbfc602adf14e3c24362adf00640698d2937c6538483a",
"candidate_sha256": "5671189ee87f2d4dff08979f6243e5eb7888b140955899642a74d569496b71c7"
},
{
"path": "Makefile",
"action": "modify",
"base_sha256": "5584ef94071044cca8215141ecd8aee8d6ae5cfe73e8f5719358c680eb8af0d4",
"candidate_sha256": "c5b70e8d4b8ae70380e0ade1c35f9e7fe80038de10080a4723b21ef07a98001e"
},
{
"path": "deploy/railiance/apps/charts/state-hub/Chart.yaml",
"action": "modify",
"base_sha256": "7fe02b390ffd2ba4ce6f82bd62df900826826401e31bdc2138dd5bf36b51a6ae",
"candidate_sha256": "61a989fcf277d05ffbececb7332ee3ca1d8f369c72f960ab1bc4dbc6815536b8"
},
{
"path": "deploy/railiance/apps/helm/state-hub-values.yaml",
"action": "modify",
"base_sha256": "f7cc0e9968598f6ce0faa0d56f62d6817845c3570c18b6ac39ed6561b952b197",
"candidate_sha256": "b51296fc937450f4ecf0ae43243262a631b551389c0d09c8bfe58fa10e2f3ee9"
},
{
"path": "docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json",
"action": "add",
"base_sha256": null,
"candidate_sha256": "fb0b59ba3558e084fb4ae2c36c556f3cfbb2a889f6fd86d4e803c52f483b26fd"
},
{
"path": "deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml",
"action": "modify",
"base_sha256": "9c36fbd5308b19695f9f05d86f8e315bbeccdd267575ce4e2fccf6fb2ea82e32",
"candidate_sha256": "f53c651bb4329c09c04c66f906e2462fe4339ab51ef0ec3da9f942c3016f5bed"
},
{
"path": "api/services/historical_projection.py",
"action": "modify",
"base_sha256": "e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2",
"candidate_sha256": "e24e57c58f4aaa4ec9d9bf088009ac69006e53f75b9477ee53dc26c4e850b975"
},
{
"path": "api/routers/workstreams.py",
"action": "modify",
"base_sha256": "61e7a0ab638b155e9e0b2a72fe8e0ddd2edf5bc6c2d3ca7f6c3ff51e8868910b",
"candidate_sha256": "9c9bf4376dd323b52109912bb3f615949e89ac02c8b88b4720f569f8565ad1d6"
},
{
"path": "scripts/consistency_check.py",
"action": "modify",
"base_sha256": "1827921c79b476bee823c2ddf9896aeb83f3efca6548427e17b3244216bbc6b5",
"candidate_sha256": "eaee916f46a11f49d2621fc9386717d73b7fd517acbe4b695e7b551d67bfa8f7"
},
{
"path": "tests/test_frozen_binding_guard_isolated.py",
"action": "add",
"base_sha256": null,
"candidate_sha256": "4dc64df78a02dc633e5744d0277afe5d350fbb0637196e78dec992f91135bded"
}
],
"patch_sha256": "sha256:ad3d49b83435dd026118ee1e4a25779b5a7739473619bbda256f160c4eb0e56a",
"T06": "done_verified_approved_rollout_at_stage",
"T07": "wait_actual_later_parent_row_preservation_failure",
"T08": "done_source_repair_pending_publication",
"T09": "progress_until_source_published",
"T10": "wait_needs_human_new_runtime",
"live_effects": false,
"original_parent_preimages": "unknown_do_not_restore_guesses",
"managed_UUIDs": "T09_T10_not_allocated_pending_review"
}

View file

@ -0,0 +1,93 @@
{
"schema": "statehub.source-owner-followthrough.v1",
"revision": 5,
"status": "isolated_source_candidate_not_published",
"base_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
"files": [
{
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"action": "modify",
"base_sha256": "ef10359cc5974283b5bdbfc602adf14e3c24362adf00640698d2937c6538483a",
"candidate_sha256": "a9aa50f5772ac985dcee9b1b65228e5f909ab25209f80dea9d6f0248029855ca"
},
{
"path": "Makefile",
"action": "modify",
"base_sha256": "5584ef94071044cca8215141ecd8aee8d6ae5cfe73e8f5719358c680eb8af0d4",
"candidate_sha256": "c5b70e8d4b8ae70380e0ade1c35f9e7fe80038de10080a4723b21ef07a98001e"
},
{
"path": "deploy/railiance/apps/charts/state-hub/Chart.yaml",
"action": "modify",
"base_sha256": "7fe02b390ffd2ba4ce6f82bd62df900826826401e31bdc2138dd5bf36b51a6ae",
"candidate_sha256": "61a989fcf277d05ffbececb7332ee3ca1d8f369c72f960ab1bc4dbc6815536b8"
},
{
"path": "deploy/railiance/apps/helm/state-hub-values.yaml",
"action": "modify",
"base_sha256": "f7cc0e9968598f6ce0faa0d56f62d6817845c3570c18b6ac39ed6561b952b197",
"candidate_sha256": "b51296fc937450f4ecf0ae43243262a631b551389c0d09c8bfe58fa10e2f3ee9"
},
{
"path": "docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json",
"action": "add",
"base_sha256": null,
"candidate_sha256": "fb0b59ba3558e084fb4ae2c36c556f3cfbb2a889f6fd86d4e803c52f483b26fd"
},
{
"path": "deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml",
"action": "modify",
"base_sha256": "9c36fbd5308b19695f9f05d86f8e315bbeccdd267575ce4e2fccf6fb2ea82e32",
"candidate_sha256": "f53c651bb4329c09c04c66f906e2462fe4339ab51ef0ec3da9f942c3016f5bed"
},
{
"path": "api/services/historical_projection.py",
"action": "modify",
"base_sha256": "e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2",
"candidate_sha256": "e24e57c58f4aaa4ec9d9bf088009ac69006e53f75b9477ee53dc26c4e850b975"
},
{
"path": "api/routers/workstreams.py",
"action": "modify",
"base_sha256": "61e7a0ab638b155e9e0b2a72fe8e0ddd2edf5bc6c2d3ca7f6c3ff51e8868910b",
"candidate_sha256": "9c9bf4376dd323b52109912bb3f615949e89ac02c8b88b4720f569f8565ad1d6"
},
{
"path": "scripts/consistency_check.py",
"action": "modify",
"base_sha256": "1827921c79b476bee823c2ddf9896aeb83f3efca6548427e17b3244216bbc6b5",
"candidate_sha256": "eaee916f46a11f49d2621fc9386717d73b7fd517acbe4b695e7b551d67bfa8f7"
},
{
"path": "tests/test_frozen_binding_guard_isolated.py",
"action": "add",
"base_sha256": null,
"candidate_sha256": "4dc64df78a02dc633e5744d0277afe5d350fbb0637196e78dec992f91135bded"
}
],
"patch_sha256": "sha256:ad3d49b83435dd026118ee1e4a25779b5a7739473619bbda256f160c4eb0e56a",
"T06": "done_verified_approved_rollout_at_stage",
"T07": "wait_actual_later_parent_row_preservation_failure",
"T08": "done_source_repair_pending_publication",
"T09": "progress_until_source_published",
"T10": "wait_needs_human_new_runtime",
"live_effects": false,
"original_parent_preimages": "unknown_do_not_restore_guesses",
"managed_UUIDs": "T09_T10_not_allocated_pending_review",
"publication_stage": "root_reviewed_UUIDs_and_T09_completion",
"managed_UUID_assignments": [
{
"kind": "task",
"record_id": "STATE-WP-0095-T09",
"uuid": "8be8f13b-6352-5295-9755-de6fbfb13593",
"path": "workplans/STATE-WP-0095-historical-source-receiving.md"
},
{
"kind": "task",
"record_id": "STATE-WP-0095-T10",
"uuid": "88585c69-d9b9-5e1f-a256-6416ff71e824",
"path": "workplans/STATE-WP-0095-historical-source-receiving.md"
}
],
"final_workplan_sha256": "sha256:a9aa50f5772ac985dcee9b1b65228e5f909ab25209f80dea9d6f0248029855ca"
}

View file

@ -0,0 +1,129 @@
#!/usr/bin/env python3
"""Prepared exact-ten-path source publisher; requires final reviewed overlay. No deploy/sync."""
from __future__ import annotations
import argparse
import hashlib
import json
from pathlib import Path
import subprocess
BASE = Path(__file__).resolve().parent
OWNER = Path('/home/worsch/state-hub')
SCANNER = ['/usr/bin/python3', '/home/worsch/repo-manager/src/repo_manager/secret_scan.py',
'--path', str(OWNER), '--binary', '/home/worsch/.local/lib/repo-manager/gitleaks/8.30.1/gitleaks']
class Refusal(RuntimeError):
pass
def sha(raw):
return hashlib.sha256(raw).hexdigest()
def git(owner, *args, check=True):
p = subprocess.run(['git', '-C', str(owner), *args], capture_output=True, timeout=150)
if check and p.returncode:
raise Refusal('git_' + args[0] + '_refused_' + str(p.returncode))
return p
def index_entries(owner):
# Stage bytes remain private to this process. Receipts expose hashes only.
return dict((entry.split(b'\t', 1)[1].decode(), entry.split(b'\t', 1)[0])
for entry in git(owner, 'ls-files', '--stage', '-z').stdout.split(b'\0') if entry)
def dirty_files(owner):
tracked = git(owner, 'diff', '--name-only', 'HEAD', '-z').stdout.split(b'\0')
untracked = git(owner, 'ls-files', '--others', '--exclude-standard', '-z').stdout.split(b'\0')
return sorted({p.decode() for p in tracked + untracked if p})
def preserved_state(owner, owned):
indices = {p: sha(v) for p, v in index_entries(owner).items() if p not in owned}
worktree = {}
for p in dirty_files(owner):
if p in owned:
continue
file = owner / p
if file.is_symlink():
raise Refusal('unrelated_symlink_requires_review')
worktree[p] = sha(file.read_bytes()) if file.exists() else None
return {'index_entries': indices, 'dirty_worktree': worktree}
def validate(owner, expected):
if git(owner, 'rev-parse', 'HEAD').stdout.decode().strip() != expected['base_revision']:
raise Refusal('source_base_drift')
files = expected['files']
names = {f['path'] for f in files}
if len(names) != len(files):
raise Refusal('duplicate_expected_path')
for f in files:
p = owner / f['path']
if p.is_symlink() or not p.is_file() or sha(p.read_bytes()) != f['candidate_sha256']:
raise Refusal('reviewed_source_drift')
# Every unrelated worktree/index entry is retained. No stash/reset/clean.
return names, preserved_state(owner, names)
def commit_source(owner, expected, scanner, execute=False, push=False):
names, before = validate(owner, expected)
result = {'schema': 'receiver-source-publication.v1', 'scope': 'source_only',
'deployed': False,
'base_revision': expected['base_revision'], 'files': sorted(names),
'preserved_before': before, 'status': 'validated_not_executed'}
if not execute:
return result
# Stage exact reviewed paths first so the normal scanner inspects them.
# A refusal retains reviewed source/staging for inspection; unrelated state stays intact.
git(owner, 'add', '--', *sorted(names))
scan = subprocess.run(scanner, cwd=owner, capture_output=True, timeout=150)
result['scanner_exit'] = scan.returncode
if scan.returncode:
raise Refusal('normal_source_scanner_refused')
# --only preserves unrelated staged content while committing exact paths.
git(owner, 'commit', '--only', '-m',
'fix(consistency): preserve immutable historical binding rows', '--', *sorted(names))
commit = git(owner, 'rev-parse', 'HEAD').stdout.decode().strip()
changed = set(git(owner, 'diff-tree', '--no-commit-id', '--name-only', '-r', commit).stdout.decode().splitlines())
if changed != names:
raise Refusal('committed_path_set_mismatch_stop')
if preserved_state(owner, names) != before:
raise Refusal('unrelated_state_changed_stop')
result.update(status='committed_not_pushed', source_revision=commit,
preserved_after=before)
if push:
# Explicit ref and bounded push. A nonzero or timeout never triggers retry.
try:
p = git(owner, 'push', 'origin', 'HEAD:refs/heads/main', check=False)
result['push_exit'] = p.returncode
except subprocess.TimeoutExpired:
result.update(status='push_timeout_remote_unverified')
return result
remote = git(owner, 'ls-remote', '--exit-code', 'origin', 'refs/heads/main', check=False)
actual = remote.stdout.split()[0].decode() if remote.returncode == 0 and remote.stdout else None
result['observed_remote_revision'] = actual
result['status'] = 'source_published_verified' if actual == commit else 'push_remote_unverified'
return result
def main():
ap = argparse.ArgumentParser()
ap.add_argument('--execute-source-commit', action='store_true')
ap.add_argument('--push-source', action='store_true')
args = ap.parse_args()
if args.push_source:
ap.error('direct push disabled; use normal repo-local make sync after exact source commit')
publication_manifest = BASE / 'publication-manifest.json'
if not publication_manifest.is_file():
print(json.dumps({'status':'refused','reason':'reviewed_managed_UUID_T09_completion_manifest_not_ready','scope':'source_only'}))
return 1
expected = json.loads(publication_manifest.read_text())
if expected.get('publication_stage') != 'root_reviewed_UUIDs_and_T09_completion':
raise Refusal('publication_review_overlay_missing')
if len(expected['files']) != 10:
raise Refusal('expected_exact_ten_paths')
try:
result = commit_source(OWNER, expected, SCANNER, args.execute_source_commit, args.push_source)
except (Refusal, subprocess.TimeoutExpired) as exc:
result = {'schema': 'receiver-source-publication.v1', 'status': 'refused_or_unverified',
'reason': str(exc) if isinstance(exc, Refusal) else 'bounded_command_timeout',
'deployed': False}
print(json.dumps(result, indent=2))
return 0 if result['status'] in {'validated_not_executed','committed_not_pushed','source_published_verified'} else 1
if __name__ == '__main__':
raise SystemExit(main())

View file

@ -0,0 +1,9 @@
from pathlib import Path
import subprocess,json
p=Path(__file__).resolve().parent
r=subprocess.run(['/home/worsch/repo-manager/.venv/bin/python',str(p/'publish_followthrough_source.py'),'--execute-source-commit'],capture_output=True,text=True,timeout=240)
try:d=json.loads(r.stdout)
except Exception:d={'status':'refused_or_unverified','reason':'publisher_output_unparseable','exit':r.returncode}
(p/'source-commit-result.json').write_text(json.dumps(d,indent=2)+'\n')
print(json.dumps({k:v for k,v in d.items() if k not in {'preserved_before','preserved_after'}}))
raise SystemExit(r.returncode)

View file

@ -0,0 +1,78 @@
{
"schema": "state95.source-publication-readback.v1",
"status": "applied",
"instance_role": "primary",
"instance_label": "railiance01",
"expected_commit": "a25b62f75aab6165ee9872ee53ac90c679ec746a",
"derived_commit": "a25b62f75aab6165ee9872ee53ac90c679ec746a",
"sync_receipt_evidence": "actual make sync tool return session68995 exit0; normalized selected metadata retained here",
"identifier_assignments_during_sync": [],
"remote_commit": "a25b62f75aab6165ee9872ee53ac90c679ec746a",
"task_count": 10,
"tasks": [
{
"uuid": "6a5f87bb-e63d-5e20-b9fc-c1b5cd403ff7",
"record_id": "STATE-WP-0095-T01",
"status": "done",
"needs_human": false
},
{
"uuid": "ebb24194-e4cc-5130-aaa6-663f2ea2c822",
"record_id": "STATE-WP-0095-T02",
"status": "done",
"needs_human": false
},
{
"uuid": "e8566341-cf6e-5b9c-ad80-8564d14cd52a",
"record_id": "STATE-WP-0095-T03",
"status": "done",
"needs_human": false
},
{
"uuid": "3bbb311f-194e-5862-8aed-358a580f22b4",
"record_id": "STATE-WP-0095-T04",
"status": "done",
"needs_human": false
},
{
"uuid": "339b9a37-181c-5599-9a89-0393e199bd4b",
"record_id": "STATE-WP-0095-T05",
"status": "done",
"needs_human": false
},
{
"uuid": "6af973b4-1964-5d4d-a2f8-8dbd4c01fda4",
"record_id": "STATE-WP-0095-T06",
"status": "done",
"needs_human": false
},
{
"uuid": "cfd1ea99-e75b-542e-a434-acefb62f3c7d",
"record_id": "STATE-WP-0095-T07",
"status": "wait",
"needs_human": false
},
{
"uuid": "2dd9b04f-2250-5a8a-b5bc-c8a009872858",
"record_id": "STATE-WP-0095-T08",
"status": "done",
"needs_human": false
},
{
"uuid": "8be8f13b-6352-5295-9755-de6fbfb13593",
"record_id": "STATE-WP-0095-T09",
"status": "done",
"needs_human": false
},
{
"uuid": "88585c69-d9b9-5e1f-a256-6416ff71e824",
"record_id": "STATE-WP-0095-T10",
"status": "wait",
"needs_human": true
}
],
"unrelated_whole_index_and_dirty_preserved": true,
"runtime_changed": false,
"T07": "wait_later_pipeline_failure_retained",
"T10": "wait_needs_human"
}

View file

@ -0,0 +1,777 @@
--- a/workplans/STATE-WP-0095-historical-source-receiving.md
+++ b/workplans/STATE-WP-0095-historical-source-receiving.md
@@ -199,27 +199,37 @@
```task
id: STATE-WP-0095-T06
-status: wait
+status: done
priority: high
depends_on: [STATE-WP-0095-T05]
-needs_human: true
-intervention_note: "Review exact committed source, CI image and owner deployment proposal before rollout."
+needs_human: false
+intervention_note: "Exact revision 4 approved and verified; no pending rollout intervention."
state_hub_task_id: "6af973b4-1964-5d4d-a2f8-8dbd4c01fda4"
```
-Use the normal CI image and Helm owner path after exact revision/image pin,
-fresh headroom and reviewed dry-run/diff. API/MCP currently run main-7d99282;
-Helm revision75 is the observed rollback baseline, requiring freshness before
-execution. No deployment assent exists for this successor. Verify delivered
-module hash, health, both readiness checks and expected migrated schema
-c4d5e6f7a8b9; verify exact
-three parents/15 tasks and rejection behavior without committed probe changes.
-Only the verified return unblocks RMGR-WP-0019-T05. The full current image also carries inbox-feed migration c4d5e6f7a8b9,
-although this receiver patch adds none. Helm rollback leaves that migration in
-place; unrelated migration acceptance and old-image compatibility need normal
-owner evidence before rollout approval. Do not run destructive default local
-DB tests; use only exact disposable DB containment. Costs and monetary risk are
-unknown pending exact rollout proposal; no zero-cost or autonomy grant is inferred.
+Completed 2026-10-17 on the founder's approval of exact revision 4 of stable
+proposal STATE-WP-0095-T06-cluster-frozen-receiving-r1 (decision
+ e3798419-8aa9-5425-8c08-20df6bd82a19; approved digest
+ sha256:63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32).
+The ordinary owner Helm path delivered revision 76, runtime source 51bc70d and
+exact image manifest sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015.
+API/MCP Ready and primary/railiance01 health report expected schema
+c4d5e6f7a8b9; delivered historical module sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2 matches.
+All three parent and 15 task full DB row hashes/columns/UUIDs remained unchanged.
+Five actual native probes passed: preserve, actual foreign-parent holder move,
+nonterminal task, nonterminal parent and missing task. Every probe rolled back;
+a fresh transaction confirmed complete row restoration. The foreign-holder
+case precisely verified historical binding refusal, not the separate global
+UUID-holder creation branch. No committed probe writes were made.
+
+Evidence: [verified receiving rollout](../docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json).
+This actual receiving return satisfies the prerequisite of RMGR-WP-0019-T05.
+Normal cluster publication and its immutable-source/row return remain T07;
+source readiness and this deployment do not count that later acceptance twice.
+The additive inbox migration is retained; Helm rollback does not downgrade
+schema or stop an active migration Job. Original failures and exact-UID recovery
+limits remain in the referenced approved packet. No TLS recovery/native private
+admission or new autonomy/cost grant is inferred.
## Verify ordinary cluster receiving and immutable historical rows
@@ -256,6 +266,74 @@
Command-fixture tests verify both requests and preserve other dry-run phases.
Evidence and original refusal remain in the Custodian cluster historical
publication packet, revisions/r2 and r3-readiness. This is completed source
-preparation; T06 remains the explicit native rollout gate. The runtime image
+preparation; T06 separately records the verified actual rollout. The runtime image
continues to be main-51bc70d; Makefile/workplan changes do not create a new
application image or native acceptance.
+
+
+T08 source repair refinement, 2026-10-17: the required normal Make render
+correctly refused a pre-existing generated chart classification copy at v1.0
+after authoritative canon reached v1.1. Regenerated only through the existing
+scripts/sync_classification_allowed.py, preserving canon and strict check.
+The exact source diff is version 1.0→1.1 plus publication/history/participation.
+Normal Make rendering and the focused classification check passed in an
+isolated owner-layout copy. The original refusal is retained in the Custodian
+owner-followthrough-r1 validation receipt. This is source repair only: no live
+ConfigMap apply, new runtime image, policy relaxation or T07 completion.
+
+
+T07 actual ordinary-publication return, 2026-10-17: cluster owner deep consistency
+and normal fast projection completed, exact archived source bytes and all 15
+historical task full-row hashes remained unchanged. The later full-row check
+FAILED for exactly the three parent rows. The earlier approved T06 rollout had
+preserved all 18 rows at its verification stage; that success is not the later
+whole-pipeline acceptance. The original snapshots retain hashes only, so exact
+changed columns and original field preimages are not established. No guessed
+DB repair or claim that all 18 original row hashes are restored is authorized.
+T07 and RMGR-WP-0019-T06 remain waiting pending T09/T10 and a reviewed return.
+
+## Guard immutable historical index bindings in CLI and receiving API
+
+```task
+id: STATE-WP-0095-T09
+status: progress
+priority: high
+depends_on: [STATE-WP-0095-T06]
+```
+
+Prepare and publish the narrowly scoped ordinary-binding repair for the three
+existing task-bound Cluster registry entries. The CLI verifies exact frozen
+source metadata/bytes and omits those bindings, including on old receivers.
+The API independently validates the complete batch before any mutation, checks
+actual repo ownership and the existing terminal parent/task closure, and
+preserves valid frozen rows without field or timestamp assignments. Invalid
+metadata, missing/foreign/nonterminal rows refuse the batch. Unknown ordinary
+bindings retain existing behavior; historical IDs, UUIDs and source bytes stay
+unchanged. Isolated regression tests and normal owner rendering are required.
+Mark done only after reviewed source publication and normal owner projection;
+source preparation does not establish delivered runtime or T07 acceptance.
+Central check/fix engines also refuse the complete repair batch if any fixable
+context touches an exact registered parent/task UUID or frozen source path.
+This runs before index bindings and before reconcile/push/individual fixes;
+ordinary earlier fixes cannot partially execute before a later frozen refusal.
+
+## Deliver and verify the ordinary-binding guard successor
+
+```task
+id: STATE-WP-0095-T10
+status: wait
+priority: high
+depends_on: [STATE-WP-0095-T09]
+needs_human: true
+intervention_note: "New API runtime requires its own exact image, reviewed preflight and scoped rollout approval; prior revision-4 approval does not cover it."
+```
+
+After source publication, resolve normal CI status and immutable image identity,
+verify delivered guard source closure, prepare exact chart/reuse-values dry-run,
+full closure/headroom/schema baseline and conditional recovery. Retain additive
+migration and active-Job cancellation limitations; no Helm schema downgrade or
+bounded-outage claim. Obtain scoped approval before live rollout. Then verify
+new full-row baseline preservation and actual rollback-only refusal probes,
+and only then return to T07 ordinary-pipeline acceptance. This prevents future
+binding mutation; it does not reconstruct or restore original parent hashes.
+No production changes, new autonomy or credential authority are granted here.
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@
RAILIANCE_STATE_HUB_NAMESPACE ?= state-hub
RAILIANCE_STATE_HUB_CHART ?= deploy/railiance/apps/charts/state-hub
RAILIANCE_STATE_HUB_VALUES ?= deploy/railiance/apps/helm/state-hub-values.yaml
-RAILIANCE_STATE_HUB_IMAGE_TAG ?= main-0747b4d
+RAILIANCE_STATE_HUB_IMAGE_TAG ?= main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015
RAILIANCE_STATE_HUB_PLATFORM_DIR ?= deploy/railiance/platform
RAILIANCE_STATE_HUB_APP_MANIFESTS ?= deploy/railiance/apps/manifests
# Codex/WSL non-login shells may not source ~/.profile; keep uv discoverable.
--- a/deploy/railiance/apps/charts/state-hub/Chart.yaml
+++ b/deploy/railiance/apps/charts/state-hub/Chart.yaml
@@ -3,4 +3,4 @@
description: State Hub API service for private Railiance operation
type: application
version: 0.1.0
-appVersion: "main-5dd3df9"
+appVersion: "main-51bc70d"
--- a/deploy/railiance/apps/helm/state-hub-values.yaml
+++ b/deploy/railiance/apps/helm/state-hub-values.yaml
@@ -6,7 +6,7 @@
image:
repository: forgejo.coulomb.social/coulomb/state-hub
- tag: "main-0747b4d"
+ tag: "main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015"
ingress:
enabled: false
--- /dev/null
+++ b/docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json
@@ -0,0 +1,116 @@
+{
+ "schema": "statehub.cluster-historical-receiving-delivered.v1",
+ "status": "verified",
+ "proposal_id": "STATE-WP-0095-T06-cluster-frozen-receiving-r1",
+ "approved_revision": 4,
+ "approved_digest_sha256": "sha256:63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32",
+ "approval_decision_id": "e3798419-8aa9-5425-8c08-20df6bd82a19",
+ "source_revision": "51bc70d1ff8f25450a8650d8e50caf053093a02e",
+ "readiness_source_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
+ "helm_revision": 76,
+ "image_reference": "forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
+ "expected_schema": "c4d5e6f7a8b9",
+ "health": {
+ "status": "ok",
+ "instance_role": "primary",
+ "instance_label": "railiance01",
+ "schema": {
+ "status": "ok",
+ "applied": "c4d5e6f7a8b9",
+ "expected": "c4d5e6f7a8b9"
+ }
+ },
+ "pods_ready": true,
+ "historical_module_sha256": "sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2",
+ "historical_preservation_verified": true,
+ "parents": 3,
+ "tasks": 15,
+ "full_historical_rows_equal": true,
+ "native_rollback_probes": {
+ "foreign-holder": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "missing-task": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "nonterminal-parent": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "nonterminal-task": {
+ "full_historical_rows_restored": true,
+ "historical_binding_refused": true,
+ "native_outcome_status": "refused",
+ "rolled_back": true,
+ "status": "passed"
+ },
+ "preserve": {
+ "full_historical_rows_equal": true,
+ "full_historical_rows_restored": true,
+ "native_outcome_status": "applied",
+ "rolled_back": true,
+ "status": "passed"
+ }
+ },
+ "native_probe_commits": 0,
+ "fresh_transaction_full_rows_equal": true,
+ "source_receiving_gate_delivered": true,
+ "normal_cluster_publication_verified": false,
+ "registrar_admission_or_cluster_publication_not_inferred": true,
+ "authority_limits": [
+ "Rollback probe SQL effects rolled back; foreign-holder case is historical-binding refusal, not separate global holder branch.",
+ "Actual historical native receiving is verified; owner-native TLS/private admission remains unresolved.",
+ "Migration schema remains additive; Helm rollback does not downgrade schema or stop an active hook Job."
+ ],
+ "evidence": [
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/approval-decision.json",
+ "sha256": "sha256:b51554c004daa882f3709f67bdae7f2e939d611120383e61be04ec6969878134"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/helm-return.json",
+ "sha256": "sha256:61727deacf22d37da2d28cbaf04f5a3ddee0f9ff7571c77f1e85dba97963b572"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/delivered-runtime.json",
+ "sha256": "sha256:89681066e8fe139456163ebfafa3efe77ffae8534ea167219230b0a74367f129"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/native-refusal-probes.json",
+ "sha256": "sha256:673ccef965c820704dc310a1bf7832b583c30c3edfeb814528cf892555199172"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/before-full-row-hashes.json",
+ "sha256": "sha256:75cdd87eef79059ff3f484ed24ca69e285899cdf8d851cc4e472653c417eb0ee"
+ },
+ {
+ "path": "docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/after-full-row-hashes.json",
+ "sha256": "sha256:2156aad18f190384838c27e792706a156a7423391408afbc6107e6c28c5872d8"
+ }
+ ],
+ "later_ordinary_cluster_publication": {
+ "status": "failed_full_parent_row_preservation",
+ "changed_parent_hashes": 3,
+ "unchanged_task_hashes": 15,
+ "exact_changed_columns": "unknown_hash_only_baseline",
+ "original_parent_preimages": "unavailable_no_guessed_restoration",
+ "receipt": "the-custodian/docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/post-publication-full-row-hashes-FAILED.json",
+ "T07": "wait",
+ "RMGR_WP_0019_T06": "wait",
+ "followup": [
+ "STATE-WP-0095-T09",
+ "STATE-WP-0095-T10"
+ ]
+ }
+}
--- a/deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml
+++ b/deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml
@@ -13,7 +13,7 @@
# to match the standard version. CUST-WP-0050 T01.
standard: "Repo Classification Standard"
-version: "1.0"
+version: "1.1"
canon_id: "canon-repo-classification"
# category — exactly 1 required (§5)
@@ -24,6 +24,7 @@
- tooling
- product
- business
+ - publication
# domain / secondary_domains — primary exactly 1; secondaries 0..n (§6)
domains:
@@ -85,6 +86,8 @@
- traceability
- documentation
- decision-support
+ - history
+ - participation
platform_and_operations:
- platform
- deployment
--- a/api/services/historical_projection.py
+++ b/api/services/historical_projection.py
@@ -193,3 +193,46 @@
raise ValueError("Historical source binding changed: " + entry["path"])
result.append((entry, data.decode("utf-8")))
return result
+
+
+# Only the three existing full-task Cluster bindings have immutable DB rows.
+# Other historical views retain their existing compatibility behavior.
+FROZEN_CLUSTER_BINDINGS = tuple(
+ entry for entry in BINDINGS
+ if entry["repo"] == "railiance-cluster" and "tasks" in entry
+)
+
+
+def frozen_cluster_binding(binding):
+ """Validate a claimed frozen binding; unrelated requests remain ordinary."""
+ matches = [entry for entry in FROZEN_CLUSTER_BINDINGS
+ if str(binding["workplan_id"]) == entry["uuid"]
+ or (binding["repo_slug"] == "railiance-cluster"
+ and (binding["relative_path"] == entry["path"]
+ or binding["filename"] == Path(entry["path"]).name))]
+ if not matches:
+ return None
+ if len(matches) != 1:
+ raise ValueError("frozen historical binding is ambiguous")
+ entry = matches[0]
+ expected = {
+ "workplan_id": entry["uuid"], "repo_slug": entry["repo"],
+ "filename": Path(entry["path"]).name, "relative_path": entry["path"],
+ "archived": True, "status": "finished",
+ }
+ if any((str(binding[key]) if key == "workplan_id" else binding[key]) != value
+ for key, value in expected.items()):
+ raise ValueError("frozen historical binding metadata changed")
+ return entry
+
+
+def validate_frozen_cluster_rows(entry, parent, tasks, repo_id):
+ """Receiving requires the exact existing terminal closure, never repair."""
+ if (parent is None or str(parent.id) != entry["uuid"]
+ or repo_id is None or parent.repo_id != repo_id
+ or parent.status not in {"done", "finished", "archived", "completed"}):
+ raise ValueError("frozen historical parent missing, foreign or nonterminal")
+ local = {str(task.id): task for task in tasks if task.workplan_id == parent.id}
+ if any(task["uuid"] not in local or local[task["uuid"]].status not in {"done", "cancel"}
+ for task in entry["tasks"]):
+ raise ValueError("frozen historical task missing, foreign or nonterminal")
--- a/api/routers/workstreams.py
+++ b/api/routers/workstreams.py
@@ -16,6 +16,8 @@
from api.events import EventEnvelope, publish_event
from api.models.managed_repo import ManagedRepo
from api.models.workplan import Workplan
+from api.models.task import Task
+from api.services.historical_projection import frozen_cluster_binding, validate_frozen_cluster_rows
from api.schemas.workplan import (
WorkplanBindingsSync,
WorkplanCreate,
@@ -435,12 +437,42 @@
session: AsyncSession = Depends(get_session),
) -> dict[str, int]:
"""Upsert workstation workplan file bindings for remote API index fallback."""
+ # Preflight the complete batch before assigning even an ordinary row.
+ try:
+ frozen = {entry.workplan_id: bound for entry in body.bindings
+ if (bound := frozen_cluster_binding(entry.model_dump())) is not None}
+ except ValueError as exc:
+ raise HTTPException(status_code=409, detail=str(exc)) from exc
+ requested_ids = {entry.workplan_id for entry in body.bindings}
+ rows = await session.execute(
+ select(Workplan).where(Workplan.id.in_(requested_ids))
+ .order_by(Workplan.id).with_for_update().execution_options(populate_existing=True)
+ )
+ workplans = {workplan.id: workplan for workplan in rows.scalars().all()}
+ if frozen:
+ repo_rows = await session.execute(
+ select(ManagedRepo).where(ManagedRepo.slug == "railiance-cluster")
+ )
+ repo = repo_rows.scalar_one_or_none()
+ task_rows = await session.execute(
+ select(Task).where(Task.workplan_id.in_(frozen))
+ .order_by(Task.id).with_for_update().execution_options(populate_existing=True)
+ )
+ tasks = task_rows.scalars().all()
+ try:
+ for workplan_id, bound in frozen.items():
+ validate_frozen_cluster_rows(
+ bound, workplans.get(workplan_id), tasks, repo.id if repo else None
+ )
+ except ValueError as exc:
+ raise HTTPException(status_code=409, detail=str(exc)) from exc
synced_at = datetime.now(timezone.utc)
updated = 0
- requested_ids = {entry.workplan_id for entry in body.bindings}
- rows = await session.execute(select(Workplan).where(Workplan.id.in_(requested_ids)))
- workplans = {workplan.id: workplan for workplan in rows.scalars().all()}
+ preserved = 0
for entry in body.bindings:
+ if entry.workplan_id in frozen:
+ preserved += 1
+ continue # No setters, including backing_synced_at/updated_at.
wp = workplans.get(entry.workplan_id)
if wp is None:
continue
@@ -449,9 +481,10 @@
wp.backing_archived = entry.archived
wp.backing_synced_at = synced_at
updated += 1
- await session.commit()
- _invalidate_workplan_index_cache()
- return {"updated": updated, "received": len(body.bindings)}
+ if updated:
+ await session.commit()
+ _invalidate_workplan_index_cache()
+ return {"updated": updated, "received": len(body.bindings), "preserved": preserved}
@router.post("/", status_code=status.HTTP_410_GONE)
--- a/scripts/consistency_check.py
+++ b/scripts/consistency_check.py
@@ -120,7 +120,9 @@
resolve_topic_domain_slug,
)
from api.services.lifecycle import should_activate_parent_for_active_tasks # noqa: E402
-from api.services.historical_projection import BINDINGS as _HISTORICAL_BINDINGS # noqa: E402
+from api.services.historical_projection import ( # noqa: E402
+ BINDINGS as _HISTORICAL_BINDINGS, FROZEN_CLUSTER_BINDINGS, frozen_cluster_binding,
+)
from api.task_status import ( # noqa: E402
CANONICAL_TASK_STATUSES,
OPEN_TASK_STATUSES,
@@ -318,7 +320,7 @@
# C-00 marks infrastructure/automation faults (API down, repo missing in DB).
# All other FAIL severities are assessment findings for follow-up.
-_AUTOMATION_ERROR_CHECKS: frozenset[str] = frozenset({"C-00"})
+_AUTOMATION_ERROR_CHECKS: frozenset[str] = frozenset({"C-00", "C-44"})
_NON_WORKPLAN_WORKPLAN_FILES: frozenset[str] = frozenset({"README.md"})
@@ -2484,6 +2486,8 @@
_check_workplan_id_collisions(api_base, repo_slug, repo_dir, workplan_infos, report)
_check_scope_freshness(repo_dir, workplan_infos, report)
+ if _refuse_frozen_fix_batch(report, repo_slug):
+ return report
_sync_workplan_bindings(api_base, repo_slug, workplan_infos, repo_dir, report)
return report
@@ -2496,23 +2500,44 @@
repo_dir: Path,
report: ConsistencyReport,
) -> None:
+ if repo_slug == "railiance-cluster":
+ scanned_paths = {workplan_display_path(repo_dir, path) for path, _, _ in workplan_infos}
+ missing = [entry["path"] for entry in FROZEN_CLUSTER_BINDINGS
+ if entry["path"] not in scanned_paths]
+ if missing:
+ report.add(severity="FAIL", check_id="C-44",
+ message="Frozen binding batch refused: bound source missing from scan",
+ fixable=False)
+ return
bindings: list[dict[str, Any]] = []
for wp_file, meta, _ in workplan_infos:
ws_id = str(meta.get("state_hub_workstream_id", "")).strip().strip('"')
+ archived = wp_file.parent.name == "archived"
+ file_status = normalise_workstream_status(str(meta.get("status", "")).strip())
+ binding = {
+ "workplan_id": ws_id, "filename": wp_file.name,
+ "relative_path": workplan_display_path(repo_dir, wp_file),
+ "repo_slug": repo_slug, "archived": archived,
+ "status": file_status or None,
+ }
+ try:
+ frozen = frozen_cluster_binding(binding)
+ if frozen is not None:
+ # Verify exact source before omitting the immutable binding.
+ # This is safe even against a receiver predating the API guard.
+ from hashlib import sha256
+ if (wp_file.is_symlink() or not wp_file.is_file()
+ or sha256(wp_file.read_bytes()).hexdigest() != frozen["sha256"]):
+ raise ValueError("frozen historical source missing or changed")
+ continue
+ except ValueError as exc:
+ report.add(severity="FAIL", check_id="C-44",
+ message=f"Frozen binding batch refused: {exc}",
+ file_path=str(wp_file), fixable=False)
+ return # Never send a partial batch after a frozen-source refusal.
if not ws_id:
continue
- archived = wp_file.parent.name == "archived"
- file_status = normalise_workstream_status(str(meta.get("status", "")).strip())
- bindings.append(
- {
- "workplan_id": ws_id,
- "filename": wp_file.name,
- "relative_path": workplan_display_path(repo_dir, wp_file),
- "repo_slug": repo_slug,
- "archived": archived,
- "status": file_status or None,
- }
- )
+ bindings.append(binding)
if not bindings:
return
result = _api_put(api_base, "/workplans/index/bindings", {"bindings": bindings})
@@ -3610,6 +3635,45 @@
# Fix engine
# ---------------------------------------------------------------------------
+def _refuse_frozen_fix_batch(report: ConsistencyReport, repo_slug: str) -> bool:
+ """Refuse a complete repair batch touching the exact bound histories."""
+ if any(issue.check_id == "C-44" and issue.severity == "FAIL" for issue in report.issues):
+ return True
+ protected_ids = {entry["uuid"] for entry in FROZEN_CLUSTER_BINDINGS}
+ protected_ids.update(task["uuid"] for entry in FROZEN_CLUSTER_BINDINGS
+ for task in entry["tasks"])
+ paths = {entry["path"] for entry in FROZEN_CLUSTER_BINDINGS}
+ root = Path(report.repo_path).absolute() if report.repo_path else None
+
+ def protected(value, key=""):
+ if isinstance(value, dict):
+ return any(protected(item, name) for name, item in value.items())
+ if isinstance(value, (list, tuple)):
+ return any(protected(item, key) for item in value)
+ text = str(value)
+ if key in {"db_id", "ws_id", "task_id", "from_workstream_id",
+ "from_workplan_id", "from_task_id", "desired_ws_id",
+ "desired_task_id", "desired_record_id", "state_hub_workstream_id", "state_hub_task_id"}:
+ if text in protected_ids:
+ return True
+ if key in {"file_path", "wp_file", "md_path", "path"} and text:
+ candidate = Path(text)
+ if candidate.is_absolute():
+ return root is not None and any(candidate.absolute() == root / path for path in paths)
+ return repo_slug == "railiance-cluster" and candidate.as_posix() in paths
+ return False
+
+ for issue in report.issues:
+ if issue.fixable and (protected(issue.db_id, "db_id")
+ or protected(issue.file_path, "file_path")
+ or protected(issue._fix_context)):
+ report.add(severity="FAIL", check_id="C-44",
+ message="Frozen historical repair batch refused; owner review required",
+ fixable=False)
+ return True
+ return False
+
+
def fix_repo(
api_base: str,
repo_slug: str,
@@ -3624,7 +3688,9 @@
repo_path_override,
bootstrap_empty_projection=bootstrap_empty_projection,
)
- if any(i.check_id in {"C-00", "C-36"} for i in report.failures):
+ if _refuse_frozen_fix_batch(report, repo_slug):
+ return report
+ if any(i.check_id in {"C-00", "C-36", "C-44"} for i in report.failures):
return report
# RMGR-WP-0002: optional repo-manager reconcile proxy (index rebuild) for pilots
--- /dev/null
+++ b/tests/test_frozen_binding_guard_isolated.py
@@ -0,0 +1,200 @@
+from pathlib import Path
+import ast, asyncio, importlib.util, types, uuid
+from dataclasses import dataclass, field
+from datetime import datetime, timezone
+import pytest
+
+ROOT = Path(__file__).resolve().parents[1]
+spec=importlib.util.spec_from_file_location('historical',ROOT/'api/services/historical_projection.py')
+h=importlib.util.module_from_spec(spec);spec.loader.exec_module(h)
+B=h.FROZEN_CLUSTER_BINDINGS[0]
+def binding(_bound=B,**changes):
+ B=_bound
+ d=dict(workplan_id=uuid.UUID(B['uuid']),repo_slug=B['repo'],filename=Path(B['path']).name,relative_path=B['path'],archived=True,status='finished');d.update(changes);return d
+class Obj:
+ def __init__(self,**kw):self.__dict__.update(kw);self.writes=[]
+ def __setattr__(self,k,v):
+ if 'writes' in self.__dict__:self.writes.append(k)
+ object.__setattr__(self,k,v)
+class Entry(Obj):
+ def model_dump(self):return {k:v for k,v in self.__dict__.items() if k!='writes'}
+class Col:
+ def in_(self,x):return self
+ def __eq__(self,x):return self
+class Query:
+ def __init__(self):self.locked=False;self.refreshed=False;self.ordered=False
+ def where(self,*a):return self
+ def order_by(self,*a):self.ordered=True;return self
+ def with_for_update(self):self.locked=True;return self
+ def execution_options(self,**kw):self.refreshed=kw.get("populate_existing") is True;return self
+class Model: id=Col();slug=Col();workplan_id=Col()
+class Result:
+ def __init__(self,values):self.values=values
+ def scalars(self):return self
+ def all(self):return self.values
+ def scalar_one_or_none(self):return self.values[0] if self.values else None
+class Session:
+ def __init__(self,rows):self.results=iter(rows);self.commits=0;self.queries=[]
+ async def execute(self,q):self.queries.append(q);return Result(next(self.results))
+ async def commit(self):self.commits+=1
+class HTTPException(Exception):
+ def __init__(self,status_code,detail):self.status_code=status_code;super().__init__(detail)
+def extracted(path,name,extra):
+ tree=ast.parse((ROOT/path).read_text());node=next(n for n in tree.body if isinstance(n,(ast.FunctionDef,ast.AsyncFunctionDef)) and n.name==name)
+ node.decorator_list=[];node.returns=None
+ for a in node.args.args + node.args.kwonlyargs:a.annotation=None
+ node.args.defaults=[]
+ ns=dict(Path=Path,datetime=datetime,timezone=timezone,**extra)
+ exec(compile(ast.Module(body=[node],type_ignores=[]),str(path),'exec'),ns);return ns[name]
+def actual_report():
+ tree=ast.parse((ROOT/'scripts/consistency_check.py').read_text())
+ nodes=[n for n in tree.body if (isinstance(n,ast.ClassDef) and n.name in {'Issue','ConsistencyReport'}) or (isinstance(n,ast.AnnAssign) and isinstance(n.target,ast.Name) and n.target.id=='_AUTOMATION_ERROR_CHECKS')]
+ ns=dict(dataclass=dataclass,field=field,_AUTOMATION_ERROR_CHECKS=frozenset({'C-00','C-44'}))
+ exec(compile(ast.Module(body=nodes,type_ignores=[]),'actual_report','exec'),ns)
+ return ns['ConsistencyReport']('railiance-cluster','/unused')
+
+def closure(B=B):
+ repo=Obj(id=uuid.uuid4());parent=Obj(id=uuid.UUID(B['uuid']),repo_id=repo.id,status='finished')
+ tasks=[Obj(id=uuid.UUID(t['uuid']),workplan_id=parent.id,status='done') for t in B['tasks']]
+ return repo,parent,tasks
+async def run_api(entries,repo,parent,tasks,ordinary=None):
+ rows=([parent] if parent else [])+([ordinary] if ordinary else [])
+ session=Session([rows,[repo] if repo else [],tasks])
+ fn=extracted('api/routers/workstreams.py','sync_workplan_bindings',dict(frozen_cluster_binding=h.frozen_cluster_binding,validate_frozen_cluster_rows=h.validate_frozen_cluster_rows,HTTPException=HTTPException,select=lambda *_:Query(),Workplan=Model,Task=Model,ManagedRepo=Model,_invalidate_workplan_index_cache=lambda:None))
+ result=await fn(Obj(bindings=[Entry(**e) for e in entries]),session)
+ return result,session
+@pytest.mark.parametrize('change',[dict(repo_slug='foreign'),dict(workplan_id=uuid.uuid4()),dict(relative_path='workplans/other.md'),dict(filename='other.md'),dict(archived=False),dict(status='active')])
+def test_metadata_refuses(change):
+ with pytest.raises(ValueError):h.frozen_cluster_binding(binding(**change))
+def test_unrelated_binding_unchanged():assert h.frozen_cluster_binding(binding(workplan_id=uuid.uuid4(),filename='ordinary.md',relative_path='workplans/ordinary.md',repo_slug='other')) is None
+@pytest.mark.parametrize('fault',['parent_missing','foreign_repo','parent_active','task_missing','task_active','task_foreign','repo_missing'])
+@pytest.mark.parametrize("bound",h.FROZEN_CLUSTER_BINDINGS)
+def test_mixed_batch_refusal_precedes_all_writes(fault,bound):
+ repo,parent,tasks=closure(bound);ordinary=Obj(id=uuid.uuid4())
+ if fault=='repo_missing':repo=None
+ if fault=='parent_missing':parent=None
+ if fault=='foreign_repo':parent.repo_id=uuid.uuid4()
+ if fault=='parent_active':parent.status='active'
+ if fault=='task_missing':tasks.pop()
+ if fault=='task_active':tasks[0].status='progress'
+ if fault=='task_foreign':tasks[0].workplan_id=uuid.uuid4()
+ if parent:parent.writes.clear()
+ for t in tasks:t.writes.clear()
+ normal=binding(workplan_id=ordinary.id,repo_slug='ordinary',filename='ordinary.md',relative_path='workplans/ordinary.md')
+ with pytest.raises(HTTPException):asyncio.run(run_api([normal,binding(_bound=bound)],repo,parent,tasks,ordinary))
+ assert ordinary.writes==[]
+ if parent:assert parent.writes==[]
+ assert all(t.writes==[] for t in tasks)
+@pytest.mark.parametrize("bound",h.FROZEN_CLUSTER_BINDINGS)
+def test_exact_frozen_no_setters_or_commit(bound):
+ repo,parent,tasks=closure(bound);result,session=asyncio.run(run_api([binding(_bound=bound)],repo,parent,tasks))
+ assert result==dict(updated=0,received=1,preserved=1);assert session.commits==0;assert parent.writes==[]
+ assert all(q.locked and q.refreshed and q.ordered for q in (session.queries[0],session.queries[2]))
+@pytest.mark.parametrize("bound",h.FROZEN_CLUSTER_BINDINGS)
+def test_mixed_valid_preserves_frozen_and_updates_ordinary(bound):
+ repo,parent,tasks=closure(bound);ordinary=Obj(id=uuid.uuid4())
+ normal=binding(workplan_id=ordinary.id,repo_slug='ordinary',filename='ordinary.md',relative_path='workplans/ordinary.md')
+ result,session=asyncio.run(run_api([normal,binding(_bound=bound)],repo,parent,tasks,ordinary))
+ assert result==dict(updated=1,received=2,preserved=1);assert session.commits==1;assert parent.writes==[]
+ assert ordinary.writes==['backing_filename','backing_relative_path','backing_archived','backing_synced_at']
+@pytest.mark.parametrize('tamper',['metadata','bytes','symlink','missing_scan','missing_uuid','valid'])
+@pytest.mark.parametrize("bound_index", range(3))
+def test_cli_exact_source_omission_or_whole_batch_refusal(tmp_path,tamper,bound_index):
+ bound=h.FROZEN_CLUSTER_BINDINGS[bound_index]
+ import shutil
+ infos=[]
+ for entry in h.FROZEN_CLUSTER_BINDINGS:
+ target=tmp_path/entry['path'];target.parent.mkdir(parents=True,exist_ok=True)
+ shutil.copyfile(Path('/home/worsch/railiance-cluster')/entry['path'],target)
+ infos.append((target,dict(state_hub_workstream_id=entry['uuid'],status='finished'),''))
+ path=tmp_path/bound['path']
+ meta=dict(state_hub_workstream_id=bound['uuid'],status='finished')
+ if tamper=='metadata':meta['status']='active'
+ if tamper=='missing_uuid':meta.pop('state_hub_workstream_id')
+ if tamper=='bytes':path.write_text(path.read_text()+'\n')
+ if tamper=='symlink':path.unlink();path.symlink_to(Path('/home/worsch/railiance-cluster')/bound['path'])
+ ordinary=tmp_path/'workplans/ordinary.md';ordinary.write_text('ordinary')
+ if tamper=='missing_scan':infos.pop(bound_index)
+ else:infos[bound_index]=(path,meta,'')
+ calls=[];report=actual_report()
+ fn=extracted('scripts/consistency_check.py','_sync_workplan_bindings',dict(FROZEN_CLUSTER_BINDINGS=h.FROZEN_CLUSTER_BINDINGS,frozen_cluster_binding=h.frozen_cluster_binding,normalise_workstream_status=lambda s:s,workplan_display_path=lambda root,p:p.relative_to(root).as_posix(),_api_put=lambda *a:calls.append(a) or dict(updated=1,received=1)))
+ fn('http://unused','railiance-cluster',[(ordinary,dict(state_hub_workstream_id=str(uuid.uuid4()),status='active'),''),*infos],tmp_path,report)
+ if tamper=='valid':assert len(calls)==1 and len(calls[0][2]['bindings'])==1
+ else:assert calls==[] and report.failures[0].check_id=='C-44' and report.automation_errors
+
+
+def test_api_tampered_mixed_batch_refuses_before_queries_or_assignments():
+ repo,parent,tasks=closure();ordinary=Obj(id=uuid.uuid4())
+ with pytest.raises(HTTPException):
+ asyncio.run(run_api([binding(workplan_id=ordinary.id,repo_slug='ordinary',filename='ordinary.md',relative_path='workplans/ordinary.md'),binding(archived=False)],repo,parent,tasks,ordinary))
+ assert ordinary.writes==[] and parent.writes==[]
+
+
+def test_foreign_repo_same_filename_path_is_ordinary():
+ assert h.frozen_cluster_binding(binding(workplan_id=uuid.uuid4(),repo_slug='foreign')) is None
+
+
+@pytest.mark.parametrize('entry',h.FROZEN_CLUSTER_BINDINGS)
+def test_all_three_registry_bindings_are_guarded(entry):
+ good=dict(workplan_id=entry['uuid'],repo_slug=entry['repo'],filename=Path(entry['path']).name,relative_path=entry['path'],archived=True,status='finished')
+ assert h.frozen_cluster_binding(good) is entry
+ with pytest.raises(ValueError):h.frozen_cluster_binding(dict(good,status='active'))
+
+
+def test_real_cli_exit_criterion_is_nonzero_including_remote_all():
+ report=actual_report();report.add(severity='FAIL',check_id='C-44',message='refused')
+ fn=extracted('scripts/consistency_check.py','consistency_exit_code',{})
+ assert fn([report])==1 and fn([report],remote_all=True)==1
+
+
+@pytest.mark.parametrize('check,key,protected_kind',[
+ ('C-04','ws_id','parent'),('C-10','task_id','task'),('C-22','task_id','task'),
+ ('C-09','db_id','parent'),('C-23','wp_file','path'),
+])
+@pytest.mark.parametrize('bound',h.FROZEN_CLUSTER_BINDINGS)
+def test_complete_fix_batch_preflight_before_ordinary_writes(check,key,protected_kind,bound):
+ report=actual_report();report.repo_path='/tmp/fixture-cluster'
+ report.add(severity='WARN',check_id='C-05',message='ordinary first',fixable=True,_fix_context={'ws_id':str(uuid.uuid4()),'field':'title','value':'ordinary'})
+ value=bound['uuid'] if protected_kind=='parent' else bound['tasks'][0]['uuid'] if protected_kind=='task' else str(Path(report.repo_path)/bound['path'])
+ report.add(severity='WARN',check_id=check,message='protected later',fixable=True,db_id=value if key=='db_id' else '',_fix_context={key:value})
+ guard=extracted('scripts/consistency_check.py','_refuse_frozen_fix_batch',dict(FROZEN_CLUSTER_BINDINGS=h.FROZEN_CLUSTER_BINDINGS))
+ assert guard(report,'railiance-cluster') and report.automation_errors
+ calls=[]
+ fn=extracted('scripts/consistency_check.py','fix_repo',dict(check_repo=lambda *a,**kw:report,_refuse_frozen_fix_batch=guard,_api_post=lambda *a:calls.append(a),_api_patch=lambda *a:calls.append(a)))
+ assert fn('http://unused','railiance-cluster',None,False,False) is report and calls==[]
+
+def test_unrelated_fix_context_not_refused():
+ report=actual_report();report.add(severity='WARN',check_id='C-05',message='ordinary',fixable=True,_fix_context={'ws_id':str(uuid.uuid4())})
+ guard=extracted('scripts/consistency_check.py','_refuse_frozen_fix_batch',dict(FROZEN_CLUSTER_BINDINGS=h.FROZEN_CLUSTER_BINDINGS))
+ assert not guard(report,'other')
+
+
+def test_check_repo_guard_precedes_binding_sync_and_does_not_duplicate():
+ tree=ast.parse((ROOT/'scripts/consistency_check.py').read_text())
+ node=next(n for n in tree.body if isinstance(n,ast.FunctionDef) and n.name=='check_repo')
+ guard_lines=[n.lineno for n in ast.walk(node) if isinstance(n,ast.Call) and isinstance(n.func,ast.Name) and n.func.id=='_refuse_frozen_fix_batch']
+ sync_lines=[n.lineno for n in ast.walk(node) if isinstance(n,ast.Call) and isinstance(n.func,ast.Name) and n.func.id=='_sync_workplan_bindings']
+ assert len(guard_lines)==len(sync_lines)==1 and guard_lines[0]<sync_lines[0]
+ report=actual_report();report.add(severity='FAIL',check_id='C-44',message='already refused')
+ guard=extracted('scripts/consistency_check.py','_refuse_frozen_fix_batch',dict(FROZEN_CLUSTER_BINDINGS=h.FROZEN_CLUSTER_BINDINGS))
+ assert guard(report,'railiance-cluster') and len(report.issues)==1
+
+
+@pytest.mark.parametrize('bound',h.FROZEN_CLUSTER_BINDINGS)
+@pytest.mark.parametrize('key',['to_workstream_id','to_workplan_id','to_task_id'])
+def test_ordinary_dependency_to_history_remains_allowed(bound,key):
+ report=actual_report();ordinary=str(uuid.uuid4())
+ target=bound['tasks'][0]['uuid'] if key=='to_task_id' else bound['uuid']
+ report.add(severity='WARN',check_id='C-20',message='ordinary inbound edge',fixable=True,db_id=ordinary,_fix_context={'from_workstream_id':ordinary,key:target,'relationship_type':'blocks'})
+ guard=extracted('scripts/consistency_check.py','_refuse_frozen_fix_batch',dict(FROZEN_CLUSTER_BINDINGS=h.FROZEN_CLUSTER_BINDINGS))
+ assert not guard(report,'railiance-cluster') and not report.automation_errors
+
+@pytest.mark.parametrize('bound',h.FROZEN_CLUSTER_BINDINGS)
+@pytest.mark.parametrize('key',['from_workstream_id','from_workplan_id','from_task_id','state_hub_workstream_id','state_hub_task_id','desired_record_id'])
+def test_protected_dependency_origin_and_nested_binding_refused(bound,key):
+ report=actual_report();origin=bound['tasks'][0]['uuid'] if 'task' in key else bound['uuid']
+ context={key:origin,'to_workstream_id':str(uuid.uuid4())}
+ if key.startswith('state_hub'):context={'meta':context}
+ report.add(severity='WARN',check_id='C-20',message='protected origin',fixable=True,_fix_context=context)
+ guard=extracted('scripts/consistency_check.py','_refuse_frozen_fix_batch',dict(FROZEN_CLUSTER_BINDINGS=h.FROZEN_CLUSTER_BINDINGS))
+ assert guard(report,'railiance-cluster') and report.automation_errors

View file

@ -0,0 +1,63 @@
import hashlib
import importlib.util
import json
from pathlib import Path
import subprocess
import sys
import pytest
def load(name):
path=Path(__file__).parent/(name+'.py')
spec=importlib.util.spec_from_file_location(name,path)
module=importlib.util.module_from_spec(spec);spec.loader.exec_module(module)
return module
pub=load('publish_followthrough_source')
def git(root,*args):
return subprocess.check_output(['git','-C',str(root),*args]).decode().strip()
@pytest.fixture
def repo(tmp_path):
root=tmp_path/'owner';root.mkdir()
git(root,'init','-b','main');git(root,'config','user.name','Synthetic Test');git(root,'config','user.email','synthetic@example.invalid')
for name in ['source.py','.custodian-brief.md','WORK-RECORDS.md','evidence.json']:
(root/name).write_text('old\n')
git(root,'add','.');git(root,'commit','-m','baseline')
base=git(root,'rev-parse','HEAD')
(root/'.custodian-brief.md').write_text('staged brief\n');git(root,'add','.custodian-brief.md')
(root/'.custodian-brief.md').write_text('working brief\n')
(root/'WORK-RECORDS.md').write_text('working index\n');(root/'evidence.json').write_text('working evidence\n')
(root/'new-evidence.json').write_text('new evidence\n')
(root/'source.py').write_text('reviewed source\n');(root/'new-test.py').write_text('reviewed new test\n')
expected={'base_revision':base,'files':[{'path':p,'candidate_sha256':hashlib.sha256((root/p).read_bytes()).hexdigest()} for p in ['source.py','new-test.py']]}
return root,expected
def test_exact_commit_preserves_staged_brief_and_worktree_evidence(repo,tmp_path):
root,expected=repo
remote=tmp_path/'remote.git';subprocess.run(['git','init','--bare',str(remote)],check=True,capture_output=True)
git(root,'remote','add','origin',str(remote))
owned={f['path'] for f in expected['files']};before=pub.preserved_state(root,owned)
result=pub.commit_source(root,expected,[sys.executable,'-c','raise SystemExit(0)'],execute=True,push=True)
assert result['status']=='source_published_verified'
assert pub.preserved_state(root,owned)==before
assert git(root,'show',':.custodian-brief.md')=='staged brief'
assert git(root,'show','HEAD:.custodian-brief.md')=='old'
assert set(git(root,'diff-tree','--no-commit-id','--name-only','-r','HEAD').splitlines())==owned
def test_default_is_read_only_and_drift_refuses_before_commit(repo):
root,expected=repo;head=git(root,'rev-parse','HEAD');stage=git(root,'ls-files','--stage')
assert pub.commit_source(root,expected,[])['status']=='validated_not_executed'
assert git(root,'rev-parse','HEAD')==head and git(root,'ls-files','--stage')==stage
(root/'source.py').write_text('unreviewed change')
with pytest.raises(pub.Refusal,match='reviewed_source_drift'):
pub.commit_source(root,expected,[],execute=True)
assert git(root,'rev-parse','HEAD')==head and git(root,'ls-files','--stage')==stage
def test_normal_scanner_refusal_does_not_commit_or_change_unrelated_state(repo):
root,expected=repo;head=git(root,'rev-parse','HEAD')
owned={f['path'] for f in expected['files']};before=pub.preserved_state(root,owned)
with pytest.raises(pub.Refusal,match='normal_source_scanner_refused'):
pub.commit_source(root,expected,[sys.executable,'-c','raise SystemExit(1)'],execute=True)
assert git(root,'rev-parse','HEAD')==head and pub.preserved_state(root,owned)==before

View file

@ -0,0 +1,17 @@
{
"isolated_regression_tests": 102,
"pytest_exit": 0,
"pytest_command": "python3 -m pytest --noconftest -q state-hub/tests/test_frozen_binding_guard_isolated.py",
"normal_make_render_exit": 0,
"render_complete_tracked_chart": true,
"rendered_objects": 8,
"runtime_images": [
"forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
"forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
"forgejo.coulomb.social/coulomb/state-hub:main-51bc70d@sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015"
],
"classification_check_exit": 0,
"no_DB_or_cluster_access": true,
"no_canonical_mutations": true,
"original_r1_r2_receipts_preserved": true
}

View file

@ -0,0 +1,19 @@
from pathlib import Path
import json,hashlib,importlib.util
p=Path(__file__).resolve().parent;owner=Path('/home/worsch/state-hub')
spec=importlib.util.spec_from_file_location('pub',p.parent/'owner-followthrough-r5/publish_followthrough_source.py');pub=importlib.util.module_from_spec(spec);spec.loader.exec_module(pub)
d=json.loads((p/'manifest.json').read_text());sha=lambda b:hashlib.sha256(b).hexdigest()
assert pub.git(owner,'rev-parse','HEAD').stdout.decode().strip()==d['base_revision']
assert sha((p/'state-hub-writeback.patch').read_bytes())=='a99b02b2e2f745c23e7fb33821fdd17656ad22b0e040abe4ff7124f25487b825'
owned={e['path'] for e in d['files']};assert len(owned)==3
before=pub.preserved_state(owner,owned)
for e in d['files']:
f=owner/e['path'];s=p/'state-hub'/e['path'];assert not f.is_symlink() and not s.is_symlink()
assert (sha(f.read_bytes()) if f.exists() else None)==e['base_sha256']
assert sha(s.read_bytes())==e['candidate_sha256']
assert not pub.git(owner,'diff','--cached','--',e['path']).stdout
for e in d['files']:
f=owner/e['path'];f.parent.mkdir(parents=True,exist_ok=True);f.write_bytes((p/'state-hub'/e['path']).read_bytes())
assert pub.preserved_state(owner,owned)==before
(p/'local-integration-result.json').write_text(json.dumps({'status':'integrated_not_committed','preserved_before':before,'preserved_after':before,'new_UUIDs':False,'runtime_changed':False},indent=2)+'\n')
print('Exact3path integration passed; unrelated index and dirty state preserved')

View file

@ -0,0 +1,28 @@
{
"schema": "statehub.writeback-isolation.v1",
"base_revision": "a25b62f75aab6165ee9872ee53ac90c679ec746a",
"files": [
{
"path": "scripts/consistency_check.py",
"base_sha256": "eaee916f46a11f49d2621fc9386717d73b7fd517acbe4b695e7b551d67bfa8f7",
"candidate_sha256": "1bfbc89d3ff5c621ec541fd32384083cc7dcf96a639b217d62b6fc34de238efd"
},
{
"path": "tests/test_writeback_git_isolated.py",
"base_sha256": null,
"candidate_sha256": "b5c00d3228edc8430be0a0c4e7277895bf6cf87782f14eda3a865262730b640e"
},
{
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"base_sha256": "a9aa50f5772ac985dcee9b1b65228e5f909ab25209f80dea9d6f0248029855ca",
"candidate_sha256": "e386157304621ca2c174d6220fcd156e510592d43bb904c2bdbc5f73fa6a0722"
}
],
"patch_sha256": "sha256:a99b02b2e2f745c23e7fb33821fdd17656ad22b0e040abe4ff7124f25487b825",
"tests_passed": 5,
"canonical_mutation": false,
"runtime_changed": false,
"T07": "wait",
"T09": "done_source_refinement_candidate",
"T10": "wait_needs_human"
}

View file

@ -0,0 +1,198 @@
{
"ok": true,
"status": "applied",
"repo_slug": "state-hub",
"commit": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"requests": 2,
"elapsed_ms": 13852.7,
"git": {
"upstream": "origin/main",
"behind": 0,
"ahead": 0
},
"identifiers": {
"schema": "repo-manager.identifier-assignment.v1",
"ok": true,
"executed": true,
"repo": "state-hub",
"namespace": "helixforge",
"assignments": [],
"historical_invalid_identifiers": [],
"historical_identity_collisions": [],
"files_changed": []
},
"receipt": {
"schema": "state-hub.repository-projection-reconcile.v1",
"instance_role": "primary",
"instance_label": "railiance01",
"expected_commit": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"derived_commit": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"outcome": {
"schema": "state-hub.projection-reset.v1",
"repo_slug": "state-hub",
"commit": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"status": "applied",
"counts": {
"created": 0,
"updated": 70,
"retired": 0,
"refused": 0,
"released": 0,
"created_tasks": 0,
"updated_tasks": 1,
"cancelled_tasks": 0,
"created_edges": 0,
"removed_edges": 0,
"unresolved_edges": 0,
"external_edges": 6
},
"created": [],
"updated": [
"CUST-WP-0003",
"CUST-WP-0011",
"CUST-WP-0012",
"CUST-WP-0038",
"CUST-WP-0042",
"STATE-WP-0043",
"STATE-WP-0044",
"STATE-WP-0045",
"STATE-WP-0046",
"STATE-WP-0047",
"STATE-WP-0048",
"STATE-WP-0049",
"STATE-WP-0050",
"STATE-WP-0051",
"STATE-WP-0052",
"STATE-WP-0053",
"STATE-WP-0054",
"STATE-WP-0055",
"STATE-WP-0056",
"STATE-WP-0057",
"STATE-WP-0058",
"STATE-WP-0059",
"STATE-WP-0060",
"STATE-WP-0061",
"STATE-WP-0062",
"STATE-WP-0063",
"STATE-WP-0064",
"STATE-WP-0065",
"STATE-WP-0066",
"STATE-WP-0067",
"STATE-WP-0068",
"STATE-WP-0069",
"STATE-WP-0070",
"STATE-WP-0071",
"STATE-WP-0072",
"STATE-WP-0073",
"STATE-WP-0074",
"STATE-WP-0075",
"STATE-WP-0076",
"STATE-WP-0077",
"STATE-WP-0078",
"STATE-WP-0079",
"STATE-WP-0080",
"STATE-WP-0081",
"STATE-WP-0082",
"STATE-WP-0083",
"STATE-WP-0084",
"STATE-WP-0085",
"STATE-WP-0086",
"STATE-WP-0087",
"STATE-WP-0088",
"STATE-WP-0089",
"STATE-WP-0090",
"STATE-WP-0091",
"STATE-WP-0092",
"STATE-WP-0093",
"STATE-WP-0094",
"STATE-WP-0095",
"STATE-WP-0096",
"STATE-WP-0097",
"STATE-WP-0098",
"STATE-WP-ADHOC-2026-06-04",
"STATE-WP-ADHOC-2026-07-01",
"STATE-WP-ADHOC-2026-08-08",
"STATE-WP-ADHOC-2026-08-23",
"STATE-WP-ADHOC-2026-08-30",
"STATE-WP-ADHOC-2026-09-04",
"STATE-WP-ADHOC-2026-09-22",
"STATE-WP-ADHOC-2026-10-06",
"STATE-WP-ADHOC-2026-10-13"
],
"retired": [],
"released": [],
"created_tasks": [],
"updated_tasks": [
"STATE-WP-0095-T10"
],
"cancelled_tasks": [],
"created_edges": [],
"removed_edges": [],
"unresolved_edges": [],
"external_edges": [
{
"workplan": "STATE-WP-0098",
"from": "STATE-WP-0098-T04",
"target": "HUB-WP-0011-T01",
"relationship_type": "starts_after",
"from_workplan_id": "0c68970e-295b-57fc-ac70-e472ee3a7bc4",
"from_task_id": "077797c8-289b-55ec-9597-28f223891b02",
"to_workplan_id": null,
"to_task_id": "588e4b58-4694-513c-8e7a-1fab38fb6ce3"
},
{
"workplan": "CUST-WP-0038",
"from": "CUST-WP-0038",
"target": "CUST-WP-0011",
"relationship_type": "blocks",
"from_workplan_id": "ccb87fa4-6381-5f22-b097-6e026f56a9c1",
"from_task_id": null,
"to_workplan_id": "967baafb-d92d-405a-ba0b-0d00d37c4940",
"to_task_id": null
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T04",
"target": "HUB-WP-0011-T03",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "3a454438-1955-547f-a491-8eab7cd25710",
"to_workplan_id": null,
"to_task_id": "61c727a5-f4b1-54c0-b634-7d71a5416496"
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T04",
"target": "HUB-WP-0006-T06",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "3a454438-1955-547f-a491-8eab7cd25710",
"to_workplan_id": null,
"to_task_id": "7c8225f7-03dc-57b0-a668-c3d781bd828a"
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T06",
"target": "STATE-WP-0079-T04",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "9230c99b-af58-5794-9291-452e619a30fa",
"to_workplan_id": null,
"to_task_id": "3a454438-1955-547f-a491-8eab7cd25710"
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T06",
"target": "STATE-WP-0079-T05",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "9230c99b-af58-5794-9291-452e619a30fa",
"to_workplan_id": null,
"to_task_id": "f6cf8c01-eb59-5ca8-a541-23928d4a000c"
}
],
"refused": [],
"notes": []
}
}
}

View file

@ -0,0 +1,10 @@
from pathlib import Path
import subprocess,json
p=Path(__file__).resolve().parent
r=subprocess.run(['make','sync','SYNC_PATH=.','SYNC_PUSH=1','STATE_HUB_API_BASE=http://127.0.0.1:8000'],cwd='/home/worsch/state-hub',capture_output=True,text=True,timeout=180)
try:d=json.loads(r.stdout[r.stdout.index('{'):])
except Exception:d={'status':'unverified','reason':'normal_sync_receipt_unparseable','exit':r.returncode}
(p/'normal-sync-result.json').write_text(json.dumps(d,indent=2)+'\n')
receipt=d.get('receipt',{})
print(json.dumps({'exit':r.returncode,'status':d.get('status'),'commit':d.get('commit'),'instance_role':receipt.get('instance_role'),'instance_label':receipt.get('instance_label'),'expected_commit':receipt.get('expected_commit'),'derived_commit':receipt.get('derived_commit'),'identifier_assignments':d.get('identifiers',{}).get('assignments')}))
raise SystemExit(r.returncode)

View file

@ -0,0 +1,8 @@
from pathlib import Path
import importlib.util,json
p=Path(__file__).resolve().parent
spec=importlib.util.spec_from_file_location('pub',p.parent/'owner-followthrough-r5/publish_followthrough_source.py');pub=importlib.util.module_from_spec(spec);spec.loader.exec_module(pub)
expected=json.loads((p/'manifest.json').read_text())
r=pub.commit_source(Path('/home/worsch/state-hub'),expected,pub.SCANNER,execute=True,push=False)
(p/'source-commit-result.json').write_text(json.dumps(r,indent=2)+'\n')
print(json.dumps({k:v for k,v in r.items() if k not in {'preserved_before','preserved_after'}}))

View file

@ -0,0 +1,79 @@
{
"schema": "state95.writeback-publication-readback.v1",
"status": "applied",
"source_revision": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"remote_revision": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"instance_role": "primary",
"instance_label": "railiance01",
"expected_commit": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"derived_commit": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"checker_sha256": "sha256:1bfbc89d3ff5c621ec541fd32384083cc7dcf96a639b217d62b6fc34de238efd",
"canonical_tests_passed": 5,
"tasks": [
{
"uuid": "6a5f87bb-e63d-5e20-b9fc-c1b5cd403ff7",
"record_id": "STATE-WP-0095-T01",
"status": "done",
"needs_human": false
},
{
"uuid": "ebb24194-e4cc-5130-aaa6-663f2ea2c822",
"record_id": "STATE-WP-0095-T02",
"status": "done",
"needs_human": false
},
{
"uuid": "e8566341-cf6e-5b9c-ad80-8564d14cd52a",
"record_id": "STATE-WP-0095-T03",
"status": "done",
"needs_human": false
},
{
"uuid": "3bbb311f-194e-5862-8aed-358a580f22b4",
"record_id": "STATE-WP-0095-T04",
"status": "done",
"needs_human": false
},
{
"uuid": "339b9a37-181c-5599-9a89-0393e199bd4b",
"record_id": "STATE-WP-0095-T05",
"status": "done",
"needs_human": false
},
{
"uuid": "6af973b4-1964-5d4d-a2f8-8dbd4c01fda4",
"record_id": "STATE-WP-0095-T06",
"status": "done",
"needs_human": false
},
{
"uuid": "cfd1ea99-e75b-542e-a434-acefb62f3c7d",
"record_id": "STATE-WP-0095-T07",
"status": "wait",
"needs_human": false
},
{
"uuid": "2dd9b04f-2250-5a8a-b5bc-c8a009872858",
"record_id": "STATE-WP-0095-T08",
"status": "done",
"needs_human": false
},
{
"uuid": "8be8f13b-6352-5295-9755-de6fbfb13593",
"record_id": "STATE-WP-0095-T09",
"status": "done",
"needs_human": false
},
{
"uuid": "88585c69-d9b9-5e1f-a256-6416ff71e824",
"record_id": "STATE-WP-0095-T10",
"status": "wait",
"needs_human": true
}
],
"unrelated_whole_index_dirty_preserved": true,
"new_UUIDs": false,
"runtime_changed": false,
"T07": "wait",
"T10": "wait_needs_human"
}

View file

@ -0,0 +1,101 @@
--- a/scripts/consistency_check.py
+++ b/scripts/consistency_check.py
@@ -2767,11 +2767,12 @@
sync_env = {**_os.environ, "GIT_CUSTODIAN_SYNC": "1"}
try:
subprocess.run(
- ["git", "-C", repo_path, "add", str(file_path)],
+ ["git", "-C", repo_path, "add", "--", str(file_path)],
check=True, capture_output=True, env=sync_env,
)
subprocess.run(
- ["git", "-C", repo_path, *_git_identity_config(), "commit", "-m", msg],
+ ["git", "-C", repo_path, *_git_identity_config(),
+ "commit", "--only", "-m", msg, "--", str(file_path)],
check=True, capture_output=True, env=sync_env,
)
return True
--- /dev/null
+++ b/tests/test_writeback_git_isolated.py
@@ -0,0 +1,60 @@
+"""Real disposable Git proof; does not import owner app or test conftest."""
+import ast
+from pathlib import Path
+import subprocess
+import sys
+import pytest
+
+SOURCE=Path(__file__).resolve().parents[1]/'scripts/consistency_check.py'
+def actual_writeback():
+ tree=ast.parse(SOURCE.read_text());nodes=[]
+ for node in tree.body:
+ if isinstance(node,ast.FunctionDef) and node.name in {'_git_identity_config','_git_commit_writeback'}:
+ node.returns=None
+ for arg in node.args.args+node.args.kwonlyargs:arg.annotation=None
+ nodes.append(node)
+ env=dict(subprocess=subprocess,sys=sys,Path=Path)
+ exec(compile(ast.Module(body=nodes,type_ignores=[]),str(SOURCE),'exec'),env)
+ return env['_git_commit_writeback']
+def git(root,*args):return subprocess.check_output(['git','-C',str(root),*args]).decode().strip()
+@pytest.fixture
+def repo(tmp_path):
+ root=tmp_path/'owner';root.mkdir();git(root,'init','-b','main');git(root,'config','user.name','Synthetic Test');git(root,'config','user.email','synthetic@example.invalid');git(root,'config','core.hooksPath','.git/hooks')
+ for name in ['writeback.md','.custodian-brief.md','evidence.json']:(root/name).write_text('original\n')
+ git(root,'add','.');git(root,'commit','-m','baseline')
+ (root/'.custodian-brief.md').write_text('staged unrelated\n');git(root,'add','.custodian-brief.md');(root/'.custodian-brief.md').write_text('working unrelated\n')
+ (root/'evidence.json').write_text('dirty evidence\n')
+ return root
+
+def test_writeback_commits_only_target_preserves_unrelated_stage_and_worktree(repo):
+ before_index=git(repo,'ls-files','--stage','.custodian-brief.md','evidence.json');before_head=git(repo,'rev-parse','HEAD')
+ target=repo/'writeback.md';target.write_text('new status\n')
+ assert actual_writeback()(str(repo),target,['synthetic status'])
+ assert git(repo,'rev-parse','HEAD')!=before_head
+ assert git(repo,'diff-tree','--no-commit-id','--name-only','-r','HEAD')=='writeback.md'
+ assert git(repo,'show','HEAD:.custodian-brief.md')=='original'
+ assert git(repo,'show',':.custodian-brief.md')=='staged unrelated'
+ assert git(repo,'ls-files','--stage','.custodian-brief.md','evidence.json')==before_index
+ assert (repo/'.custodian-brief.md').read_text()=='working unrelated\n'
+ assert (repo/'evidence.json').read_text()=='dirty evidence\n'
+
+def test_noop_never_commits_unrelated_staged_change(repo):
+ head=git(repo,'rev-parse','HEAD');index=git(repo,'ls-files','--stage')
+ assert not actual_writeback()(str(repo),repo/'writeback.md',['no change'])
+ assert git(repo,'rev-parse','HEAD')==head and git(repo,'ls-files','--stage')==index
+
+@pytest.mark.parametrize('name',['new writeback.md','-leading-dash.md'])
+def test_new_target_and_argument_boundary(repo,name):
+ target=repo/name;target.write_text('new file\n')
+ assert actual_writeback()(str(repo),target,['new synthetic target'])
+ assert git(repo,'diff-tree','--no-commit-id','--name-only','-r','HEAD')==name
+ assert git(repo,'show',':.custodian-brief.md')=='staged unrelated'
+
+def test_normal_hook_refusal_preserves_unrelated_state(repo):
+ hook=repo/'.git/hooks/pre-commit';hook.write_text('#!/bin/sh\nexit 1\n');hook.chmod(0o755)
+ head=git(repo,'rev-parse','HEAD');index=git(repo,'ls-files','--stage','.custodian-brief.md','evidence.json')
+ target=repo/'writeback.md';target.write_text('new status\n')
+ assert not actual_writeback()(str(repo),target,['refused synthetic change'])
+ assert git(repo,'rev-parse','HEAD')==head
+ assert git(repo,'ls-files','--stage','.custodian-brief.md','evidence.json')==index
+ assert git(repo,'show',':.custodian-brief.md')=='staged unrelated'
--- a/workplans/STATE-WP-0095-historical-source-receiving.md
+++ b/workplans/STATE-WP-0095-historical-source-receiving.md
@@ -342,3 +342,18 @@
and only then return to T07 ordinary-pipeline acceptance. This prevents future
binding mutation; it does not reconstruct or restore original parent hashes.
No production changes, new autonomy or credential authority are granted here.
+
+
+T09 source repair refinement, 2026-10-17: the attempted current-client regression
+actually loaded an older packaged consistency checker from the owner virtualenv,
+not the reviewed canonical source. That trial again failed parent-row hash
+preservation; it is retained separately and does not count as R5 client proof.
+Normal C-23 also legitimately normalized WP18 ready to active and created a
+source commit, but the generic writeback commit included an unrelated staged
+brief. A narrow successor scopes git add and git commit --only to the actual
+writeback file, preserving unrelated index/worktree state. Real disposable Git
+regression tests cover pre-existing staged changes, hooks, no-op and path names.
+Verify the actually loaded CLI checker hash after ordinary owner package refresh
+before any retry; capture legitimate source HEAD transitions rather than assume
+a static revision. T07 and T10 remain wait. No original parent preimage recovery,
+new runtime delivery or broader authority follows from this source repair.

View file

@ -0,0 +1,17 @@
{
"schema": "state95.writeback-validation.v1",
"command": "python3 -m pytest --noconftest -q state-hub/tests/test_writeback_git_isolated.py",
"tests_passed": 5,
"seconds": 0.74,
"real_disposable_git": true,
"normal_hook_refusal_test": true,
"fixture_refinement": "Initial hook refusal fixture inherited host global core.hooksPath; local disposable-repo hook directory now explicit. No product hook bypass.",
"whole_unrelated_index_and_worktree_preserved": true,
"owner_config_imported": false,
"DB_access": false,
"production_mutations": false,
"canonical_source_mutations": false,
"old_packaged_checker_trial_accepted": false,
"T07": "wait",
"T10": "wait_needs_human"
}

View file

@ -0,0 +1,17 @@
{
"schema": "state95.client-proof-followthrough.v1",
"base_revision": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"files": [
{
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"base_sha256": "e386157304621ca2c174d6220fcd156e510592d43bb904c2bdbc5f73fa6a0722",
"candidate_sha256": "df055846c34f4e4eb9dc1fcc88969efd40bfca9daad1df006f7527e9b6d6c9e7"
}
],
"patch_sha256": "sha256:db6856796303234221b35c4c473822b14b591946c9283e0dfd1dd86a01a478ea",
"new_UUIDs": false,
"runtime_changed": false,
"T07": "wait_depends_on_T10",
"T09": "done",
"T10": "wait_needs_human"
}

View file

@ -0,0 +1,209 @@
{
"ok": true,
"status": "applied",
"repo_slug": "state-hub",
"commit": "9eaa36143ea18111c522ea14d32978495b4e5030",
"requests": 2,
"elapsed_ms": 14163.6,
"git": {
"upstream": "origin/main",
"behind": 0,
"ahead": 0
},
"identifiers": {
"schema": "repo-manager.identifier-assignment.v1",
"ok": true,
"executed": true,
"repo": "state-hub",
"namespace": "helixforge",
"assignments": [],
"historical_invalid_identifiers": [],
"historical_identity_collisions": [],
"files_changed": []
},
"receipt": {
"schema": "state-hub.repository-projection-reconcile.v1",
"instance_role": "primary",
"instance_label": "railiance01",
"expected_commit": "9eaa36143ea18111c522ea14d32978495b4e5030",
"derived_commit": "9eaa36143ea18111c522ea14d32978495b4e5030",
"outcome": {
"schema": "state-hub.projection-reset.v1",
"repo_slug": "state-hub",
"commit": "9eaa36143ea18111c522ea14d32978495b4e5030",
"status": "applied",
"counts": {
"created": 0,
"updated": 70,
"retired": 0,
"refused": 0,
"released": 0,
"created_tasks": 0,
"updated_tasks": 1,
"cancelled_tasks": 0,
"created_edges": 1,
"removed_edges": 0,
"unresolved_edges": 0,
"external_edges": 6
},
"created": [],
"updated": [
"CUST-WP-0003",
"CUST-WP-0011",
"CUST-WP-0012",
"CUST-WP-0038",
"CUST-WP-0042",
"STATE-WP-0043",
"STATE-WP-0044",
"STATE-WP-0045",
"STATE-WP-0046",
"STATE-WP-0047",
"STATE-WP-0048",
"STATE-WP-0049",
"STATE-WP-0050",
"STATE-WP-0051",
"STATE-WP-0052",
"STATE-WP-0053",
"STATE-WP-0054",
"STATE-WP-0055",
"STATE-WP-0056",
"STATE-WP-0057",
"STATE-WP-0058",
"STATE-WP-0059",
"STATE-WP-0060",
"STATE-WP-0061",
"STATE-WP-0062",
"STATE-WP-0063",
"STATE-WP-0064",
"STATE-WP-0065",
"STATE-WP-0066",
"STATE-WP-0067",
"STATE-WP-0068",
"STATE-WP-0069",
"STATE-WP-0070",
"STATE-WP-0071",
"STATE-WP-0072",
"STATE-WP-0073",
"STATE-WP-0074",
"STATE-WP-0075",
"STATE-WP-0076",
"STATE-WP-0077",
"STATE-WP-0078",
"STATE-WP-0079",
"STATE-WP-0080",
"STATE-WP-0081",
"STATE-WP-0082",
"STATE-WP-0083",
"STATE-WP-0084",
"STATE-WP-0085",
"STATE-WP-0086",
"STATE-WP-0087",
"STATE-WP-0088",
"STATE-WP-0089",
"STATE-WP-0090",
"STATE-WP-0091",
"STATE-WP-0092",
"STATE-WP-0093",
"STATE-WP-0094",
"STATE-WP-0095",
"STATE-WP-0096",
"STATE-WP-0097",
"STATE-WP-0098",
"STATE-WP-ADHOC-2026-06-04",
"STATE-WP-ADHOC-2026-07-01",
"STATE-WP-ADHOC-2026-08-08",
"STATE-WP-ADHOC-2026-08-23",
"STATE-WP-ADHOC-2026-08-30",
"STATE-WP-ADHOC-2026-09-04",
"STATE-WP-ADHOC-2026-09-22",
"STATE-WP-ADHOC-2026-10-06",
"STATE-WP-ADHOC-2026-10-13"
],
"retired": [],
"released": [],
"created_tasks": [],
"updated_tasks": [
"STATE-WP-0095-T10"
],
"cancelled_tasks": [],
"created_edges": [
{
"workplan": "STATE-WP-0095",
"from": "STATE-WP-0095-T07",
"target": "STATE-WP-0095-T10",
"relationship_type": "starts_after",
"from_workplan_id": "79579572-8120-5d3b-aca5-dd4aff60d058",
"from_task_id": "cfd1ea99-e75b-542e-a434-acefb62f3c7d",
"to_workplan_id": null,
"to_task_id": "88585c69-d9b9-5e1f-a256-6416ff71e824"
}
],
"removed_edges": [],
"unresolved_edges": [],
"external_edges": [
{
"workplan": "STATE-WP-0098",
"from": "STATE-WP-0098-T04",
"target": "HUB-WP-0011-T01",
"relationship_type": "starts_after",
"from_workplan_id": "0c68970e-295b-57fc-ac70-e472ee3a7bc4",
"from_task_id": "077797c8-289b-55ec-9597-28f223891b02",
"to_workplan_id": null,
"to_task_id": "588e4b58-4694-513c-8e7a-1fab38fb6ce3"
},
{
"workplan": "CUST-WP-0038",
"from": "CUST-WP-0038",
"target": "CUST-WP-0011",
"relationship_type": "blocks",
"from_workplan_id": "ccb87fa4-6381-5f22-b097-6e026f56a9c1",
"from_task_id": null,
"to_workplan_id": "967baafb-d92d-405a-ba0b-0d00d37c4940",
"to_task_id": null
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T04",
"target": "HUB-WP-0011-T03",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "3a454438-1955-547f-a491-8eab7cd25710",
"to_workplan_id": null,
"to_task_id": "61c727a5-f4b1-54c0-b634-7d71a5416496"
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T04",
"target": "HUB-WP-0006-T06",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "3a454438-1955-547f-a491-8eab7cd25710",
"to_workplan_id": null,
"to_task_id": "7c8225f7-03dc-57b0-a668-c3d781bd828a"
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T06",
"target": "STATE-WP-0079-T04",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "9230c99b-af58-5794-9291-452e619a30fa",
"to_workplan_id": null,
"to_task_id": "3a454438-1955-547f-a491-8eab7cd25710"
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T06",
"target": "STATE-WP-0079-T05",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "9230c99b-af58-5794-9291-452e619a30fa",
"to_workplan_id": null,
"to_task_id": "f6cf8c01-eb59-5ca8-a541-23928d4a000c"
}
],
"refused": [],
"notes": []
}
}
}

View file

@ -0,0 +1,16 @@
from pathlib import Path
import hashlib,json,importlib.util
p=Path(__file__).resolve().parent;owner=Path('/home/worsch/state-hub')
spec=importlib.util.spec_from_file_location('pub',p.parent/'owner-followthrough-r5/publish_followthrough_source.py');pub=importlib.util.module_from_spec(spec);spec.loader.exec_module(pub)
d=json.loads((p/'manifest.json').read_text());e=d['files'][0];assert len(d['files'])==1
assert pub.git(owner,'rev-parse','HEAD').stdout.decode().strip()==d['base_revision']
assert hashlib.sha256((p/'state-hub-workplan.patch').read_bytes()).hexdigest()=='db6856796303234221b35c4c473822b14b591946c9283e0dfd1dd86a01a478ea'
f=owner/e['path'];s=p/'state-hub'/e['path'];assert not f.is_symlink() and not s.is_symlink()
assert hashlib.sha256(f.read_bytes()).hexdigest()==e['base_sha256']
assert hashlib.sha256(s.read_bytes()).hexdigest()==e['candidate_sha256']
assert not pub.git(owner,'diff','--cached','--',e['path']).stdout
before=pub.preserved_state(owner,{e['path']});f.write_bytes(s.read_bytes());assert pub.preserved_state(owner,{e['path']})==before
result=pub.commit_source(owner,d,pub.SCANNER,execute=True,push=False)
assert pub.preserved_state(owner,{e['path']})==before
(p/'source-commit-result.json').write_text(json.dumps(result,indent=2)+'\n')
print(json.dumps({k:v for k,v in result.items() if k not in {'preserved_before','preserved_after'}}))

View file

@ -0,0 +1,10 @@
from pathlib import Path
import subprocess,json
p=Path(__file__).resolve().parent
r=subprocess.run(['make','sync','SYNC_PATH=.','SYNC_PUSH=1','STATE_HUB_API_BASE=http://127.0.0.1:8000'],cwd='/home/worsch/state-hub',capture_output=True,text=True,timeout=180)
try:d=json.loads(r.stdout[r.stdout.index('{'):])
except Exception:d={'status':'unverified','reason':'normal_sync_receipt_unparseable','exit':r.returncode}
(p/'normal-sync-result.json').write_text(json.dumps(d,indent=2)+'\n')
receipt=d.get('receipt',{})
print(json.dumps({'exit':r.returncode,'status':d.get('status'),'commit':d.get('commit'),'instance_role':receipt.get('instance_role'),'instance_label':receipt.get('instance_label'),'expected_commit':receipt.get('expected_commit'),'derived_commit':receipt.get('derived_commit'),'identifier_assignments':d.get('identifiers',{}).get('assignments')}))
raise SystemExit(r.returncode)

View file

@ -0,0 +1,86 @@
{
"schema": "state95.workplan-followthrough-readback.v1",
"status": "applied",
"source_revision": "9eaa36143ea18111c522ea14d32978495b4e5030",
"remote_revision": "9eaa36143ea18111c522ea14d32978495b4e5030",
"instance_role": "primary",
"instance_label": "railiance01",
"expected_commit": "9eaa36143ea18111c522ea14d32978495b4e5030",
"derived_commit": "9eaa36143ea18111c522ea14d32978495b4e5030",
"tasks": [
{
"uuid": "6a5f87bb-e63d-5e20-b9fc-c1b5cd403ff7",
"record_id": "STATE-WP-0095-T01",
"status": "done",
"needs_human": false
},
{
"uuid": "ebb24194-e4cc-5130-aaa6-663f2ea2c822",
"record_id": "STATE-WP-0095-T02",
"status": "done",
"needs_human": false
},
{
"uuid": "e8566341-cf6e-5b9c-ad80-8564d14cd52a",
"record_id": "STATE-WP-0095-T03",
"status": "done",
"needs_human": false
},
{
"uuid": "3bbb311f-194e-5862-8aed-358a580f22b4",
"record_id": "STATE-WP-0095-T04",
"status": "done",
"needs_human": false
},
{
"uuid": "339b9a37-181c-5599-9a89-0393e199bd4b",
"record_id": "STATE-WP-0095-T05",
"status": "done",
"needs_human": false
},
{
"uuid": "6af973b4-1964-5d4d-a2f8-8dbd4c01fda4",
"record_id": "STATE-WP-0095-T06",
"status": "done",
"needs_human": false
},
{
"uuid": "cfd1ea99-e75b-542e-a434-acefb62f3c7d",
"record_id": "STATE-WP-0095-T07",
"status": "wait",
"needs_human": false
},
{
"uuid": "2dd9b04f-2250-5a8a-b5bc-c8a009872858",
"record_id": "STATE-WP-0095-T08",
"status": "done",
"needs_human": false
},
{
"uuid": "8be8f13b-6352-5295-9755-de6fbfb13593",
"record_id": "STATE-WP-0095-T09",
"status": "done",
"needs_human": false
},
{
"uuid": "88585c69-d9b9-5e1f-a256-6416ff71e824",
"record_id": "STATE-WP-0095-T10",
"status": "wait",
"needs_human": true
}
],
"new_dependency": {
"id": "713e6db5-7574-4ade-a750-84bdde02f80a",
"from_workplan_id": "79579572-8120-5d3b-aca5-dd4aff60d058",
"from_task_id": "cfd1ea99-e75b-542e-a434-acefb62f3c7d",
"to_task_id": "88585c69-d9b9-5e1f-a256-6416ff71e824",
"relationship_type": "starts_after",
"source_owner": "forge:state-hub",
"source_commit": "9eaa36143ea18111c522ea14d32978495b4e5030"
},
"unchanged_old_edge_creation_commits_not_rewritten": true,
"whole_unrelated_index_dirty_preserved": true,
"runtime_source": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"runtime_changed": false,
"new_UUIDs": false
}

View file

@ -0,0 +1,39 @@
--- a/workplans/STATE-WP-0095-historical-source-receiving.md
+++ b/workplans/STATE-WP-0095-historical-source-receiving.md
@@ -237,7 +237,7 @@
id: STATE-WP-0095-T07
status: wait
priority: high
-depends_on: [STATE-WP-0095-T06, RMGR-WP-0019-T06]
+depends_on: [STATE-WP-0095-T06, RMGR-WP-0019-T06, STATE-WP-0095-T10]
state_hub_task_id: "cfd1ea99-e75b-542e-a434-acefb62f3c7d"
```
@@ -357,3 +357,27 @@
before any retry; capture legitimate source HEAD transitions rather than assume
a static revision. T07 and T10 remain wait. No original parent preimage recovery,
new runtime delivery or broader authority follows from this source repair.
+
+
+T07 current-baseline client return, 2026-10-17: after the owner refreshed the
+installed package and verified the actually loaded checker matched the reviewed
+R6 source, ordinary Cluster deep consistency and fast projection passed.
+Bindings synced 20/20, omitting the three frozen histories; all three parent
+and 15 task CURRENT full-row hashes remained unchanged across
+before-verified-client.json / after-verified-client.json. Unrelated staged brief
+state was preserved. This proves the corrected installed client stage against
+its fresh current baseline; earlier parent-hash failures remain retained
+historical exceptions, not restored preimages or backfilled successes.
+
+T10 remains wait/needs_human for exact proposal
+STATE-WP-0095-T10-frozen-bindings-guard-r1 revision 1, metadata
+sha256:81d365926fc585a186955d8c98ee83501fd3cec12135b2256d71b46a75097932,
+pending decision df703266-6719-4c04-ae1b-ba9afd3bca1c. The inspected candidate
+image is main-c103cbf@sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1,
+from runtime source c103cbf3c8bed5dba87a03e320595ddded9301a3. Image-only
+server dry-run passed eight identities with only three image-field changes.
+The exact proposal and recovery limits are retained in the Custodian dated
+2026-10-17 guard-successor-review-r1 packet. No new API runtime is approved or
+delivered by this source-only note; its later workplan commit does not change
+the image's source pin. T09 stays done, T07/T10 stay wait pending reviewed API
+delivery and explicit successor/current-baseline acceptance disposition.

View file

@ -0,0 +1,8 @@
{
"task_blocks": 10,
"all_UUIDs_statuses_needs_human_unchanged": true,
"only_task_field_change": "T07.depends_on adds STATE-WP-0095-T10",
"proposal_metadata_digest_verified": true,
"canonical_mutation": false,
"runtime_changed": false
}

View file

@ -0,0 +1,16 @@
{
"schema": "state95.proposal-revision-followthrough.v1",
"base_revision": "9eaa36143ea18111c522ea14d32978495b4e5030",
"files": [
{
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"base_sha256": "df055846c34f4e4eb9dc1fcc88969efd40bfca9daad1df006f7527e9b6d6c9e7",
"candidate_sha256": "163acbdf8252f37e309f4cb0b51d48706c6bd43d439fdbf7802b953b78ae35ac"
}
],
"patch_sha256": "sha256:83bf9a6d6f7dc9de6856aca30b3d10c5e715214132ab715f15a8f0caeef9c935",
"new_UUIDs": false,
"runtime_changed": false,
"proposal_id": "STATE-WP-0095-T10-frozen-bindings-guard-r1",
"revision": 2
}

View file

@ -0,0 +1,198 @@
{
"ok": true,
"status": "applied",
"repo_slug": "state-hub",
"commit": "4c03c9d2c6a47f5c7247473f74b2e2f188b787bd",
"requests": 2,
"elapsed_ms": 10221.2,
"git": {
"upstream": "origin/main",
"behind": 0,
"ahead": 0
},
"identifiers": {
"schema": "repo-manager.identifier-assignment.v1",
"ok": true,
"executed": true,
"repo": "state-hub",
"namespace": "helixforge",
"assignments": [],
"historical_invalid_identifiers": [],
"historical_identity_collisions": [],
"files_changed": []
},
"receipt": {
"schema": "state-hub.repository-projection-reconcile.v1",
"instance_role": "primary",
"instance_label": "railiance01",
"expected_commit": "4c03c9d2c6a47f5c7247473f74b2e2f188b787bd",
"derived_commit": "4c03c9d2c6a47f5c7247473f74b2e2f188b787bd",
"outcome": {
"schema": "state-hub.projection-reset.v1",
"repo_slug": "state-hub",
"commit": "4c03c9d2c6a47f5c7247473f74b2e2f188b787bd",
"status": "applied",
"counts": {
"created": 0,
"updated": 70,
"retired": 0,
"refused": 0,
"released": 0,
"created_tasks": 0,
"updated_tasks": 1,
"cancelled_tasks": 0,
"created_edges": 0,
"removed_edges": 0,
"unresolved_edges": 0,
"external_edges": 6
},
"created": [],
"updated": [
"CUST-WP-0003",
"CUST-WP-0011",
"CUST-WP-0012",
"CUST-WP-0038",
"CUST-WP-0042",
"STATE-WP-0043",
"STATE-WP-0044",
"STATE-WP-0045",
"STATE-WP-0046",
"STATE-WP-0047",
"STATE-WP-0048",
"STATE-WP-0049",
"STATE-WP-0050",
"STATE-WP-0051",
"STATE-WP-0052",
"STATE-WP-0053",
"STATE-WP-0054",
"STATE-WP-0055",
"STATE-WP-0056",
"STATE-WP-0057",
"STATE-WP-0058",
"STATE-WP-0059",
"STATE-WP-0060",
"STATE-WP-0061",
"STATE-WP-0062",
"STATE-WP-0063",
"STATE-WP-0064",
"STATE-WP-0065",
"STATE-WP-0066",
"STATE-WP-0067",
"STATE-WP-0068",
"STATE-WP-0069",
"STATE-WP-0070",
"STATE-WP-0071",
"STATE-WP-0072",
"STATE-WP-0073",
"STATE-WP-0074",
"STATE-WP-0075",
"STATE-WP-0076",
"STATE-WP-0077",
"STATE-WP-0078",
"STATE-WP-0079",
"STATE-WP-0080",
"STATE-WP-0081",
"STATE-WP-0082",
"STATE-WP-0083",
"STATE-WP-0084",
"STATE-WP-0085",
"STATE-WP-0086",
"STATE-WP-0087",
"STATE-WP-0088",
"STATE-WP-0089",
"STATE-WP-0090",
"STATE-WP-0091",
"STATE-WP-0092",
"STATE-WP-0093",
"STATE-WP-0094",
"STATE-WP-0095",
"STATE-WP-0096",
"STATE-WP-0097",
"STATE-WP-0098",
"STATE-WP-ADHOC-2026-06-04",
"STATE-WP-ADHOC-2026-07-01",
"STATE-WP-ADHOC-2026-08-08",
"STATE-WP-ADHOC-2026-08-23",
"STATE-WP-ADHOC-2026-08-30",
"STATE-WP-ADHOC-2026-09-04",
"STATE-WP-ADHOC-2026-09-22",
"STATE-WP-ADHOC-2026-10-06",
"STATE-WP-ADHOC-2026-10-13"
],
"retired": [],
"released": [],
"created_tasks": [],
"updated_tasks": [
"STATE-WP-0095-T10"
],
"cancelled_tasks": [],
"created_edges": [],
"removed_edges": [],
"unresolved_edges": [],
"external_edges": [
{
"workplan": "STATE-WP-0098",
"from": "STATE-WP-0098-T04",
"target": "HUB-WP-0011-T01",
"relationship_type": "starts_after",
"from_workplan_id": "0c68970e-295b-57fc-ac70-e472ee3a7bc4",
"from_task_id": "077797c8-289b-55ec-9597-28f223891b02",
"to_workplan_id": null,
"to_task_id": "588e4b58-4694-513c-8e7a-1fab38fb6ce3"
},
{
"workplan": "CUST-WP-0038",
"from": "CUST-WP-0038",
"target": "CUST-WP-0011",
"relationship_type": "blocks",
"from_workplan_id": "ccb87fa4-6381-5f22-b097-6e026f56a9c1",
"from_task_id": null,
"to_workplan_id": "967baafb-d92d-405a-ba0b-0d00d37c4940",
"to_task_id": null
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T04",
"target": "HUB-WP-0011-T03",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "3a454438-1955-547f-a491-8eab7cd25710",
"to_workplan_id": null,
"to_task_id": "61c727a5-f4b1-54c0-b634-7d71a5416496"
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T04",
"target": "HUB-WP-0006-T06",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "3a454438-1955-547f-a491-8eab7cd25710",
"to_workplan_id": null,
"to_task_id": "7c8225f7-03dc-57b0-a668-c3d781bd828a"
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T06",
"target": "STATE-WP-0079-T04",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "9230c99b-af58-5794-9291-452e619a30fa",
"to_workplan_id": null,
"to_task_id": "3a454438-1955-547f-a491-8eab7cd25710"
},
{
"workplan": "STATE-WP-0079",
"from": "STATE-WP-0079-T06",
"target": "STATE-WP-0079-T05",
"relationship_type": "starts_after",
"from_workplan_id": "ed077b62-7048-5752-bf65-f90471f45854",
"from_task_id": "9230c99b-af58-5794-9291-452e619a30fa",
"to_workplan_id": null,
"to_task_id": "f6cf8c01-eb59-5ca8-a541-23928d4a000c"
}
],
"refused": [],
"notes": []
}
}
}

View file

@ -0,0 +1,16 @@
from pathlib import Path
import hashlib,json,importlib.util
p=Path(__file__).resolve().parent;owner=Path('/home/worsch/state-hub')
spec=importlib.util.spec_from_file_location('pub',p.parent/'owner-followthrough-r5/publish_followthrough_source.py');pub=importlib.util.module_from_spec(spec);spec.loader.exec_module(pub)
d=json.loads((p/'manifest.json').read_text());e=d['files'][0];assert len(d['files'])==1
assert pub.git(owner,'rev-parse','HEAD').stdout.decode().strip()==d['base_revision']
assert hashlib.sha256((p/'state-hub-workplan.patch').read_bytes()).hexdigest()=='83bf9a6d6f7dc9de6856aca30b3d10c5e715214132ab715f15a8f0caeef9c935'
f=owner/e['path'];s=p/'state-hub'/e['path'];assert not f.is_symlink() and not s.is_symlink()
assert hashlib.sha256(f.read_bytes()).hexdigest()==e['base_sha256']
assert hashlib.sha256(s.read_bytes()).hexdigest()==e['candidate_sha256']
assert not pub.git(owner,'diff','--cached','--',e['path']).stdout
before=pub.preserved_state(owner,{e['path']});f.write_bytes(s.read_bytes());assert pub.preserved_state(owner,{e['path']})==before
result=pub.commit_source(owner,d,pub.SCANNER,execute=True,push=False)
assert pub.preserved_state(owner,{e['path']})==before
(p/'source-commit-result.json').write_text(json.dumps(result,indent=2)+'\n')
print(json.dumps({k:v for k,v in result.items() if k not in {'preserved_before','preserved_after'}}))

View file

@ -0,0 +1,10 @@
from pathlib import Path
import subprocess,json,hashlib
p=Path(__file__).resolve().parent
checker=Path('/home/worsch/state-hub/scripts/consistency_check.py')
assert hashlib.sha256(checker.read_bytes()).hexdigest()=='1bfbc89d3ff5c621ec541fd32384083cc7dcf96a639b217d62b6fc34de238efd'
r=subprocess.run(['/home/worsch/state-hub/.venv/bin/python',str(checker),'--repo','state-hub','--repo-path','/home/worsch/state-hub','--api-base','http://127.0.0.1:8000','--json'],cwd='/home/worsch/state-hub',capture_output=True,text=True,timeout=180)
try:d=json.loads(r.stdout)
except Exception:d={'status':'unparsed','exit':r.returncode}
(p/'normal-consistency-result.json').write_text(json.dumps(d,indent=2)+'\n')
print(json.dumps({'exit':r.returncode,'mode':'normal_check_no_fix_preserve_existing_dirty_files','parsed_type':type(d).__name__,'checker_sha256':'sha256:1bfbc89d3ff5c621ec541fd32384083cc7dcf96a639b217d62b6fc34de238efd'}))

View file

@ -0,0 +1,10 @@
from pathlib import Path
import subprocess,json
p=Path(__file__).resolve().parent
r=subprocess.run(['make','sync','SYNC_PATH=.','SYNC_PUSH=1','STATE_HUB_API_BASE=http://127.0.0.1:8000'],cwd='/home/worsch/state-hub',capture_output=True,text=True,timeout=180)
try:d=json.loads(r.stdout[r.stdout.index('{'):])
except Exception:d={'status':'unverified','reason':'normal_sync_receipt_unparseable','exit':r.returncode}
(p/'normal-sync-result.json').write_text(json.dumps(d,indent=2)+'\n')
receipt=d.get('receipt',{})
print(json.dumps({'exit':r.returncode,'status':d.get('status'),'commit':d.get('commit'),'instance_role':receipt.get('instance_role'),'instance_label':receipt.get('instance_label'),'expected_commit':receipt.get('expected_commit'),'derived_commit':receipt.get('derived_commit'),'identifier_assignments':d.get('identifiers',{}).get('assignments')}))
raise SystemExit(r.returncode)

View file

@ -0,0 +1,31 @@
--- a/workplans/STATE-WP-0095-historical-source-receiving.md
+++ b/workplans/STATE-WP-0095-historical-source-receiving.md
@@ -370,14 +370,25 @@
historical exceptions, not restored preimages or backfilled successes.
T10 remains wait/needs_human for exact proposal
-STATE-WP-0095-T10-frozen-bindings-guard-r1 revision 1, metadata
-sha256:81d365926fc585a186955d8c98ee83501fd3cec12135b2256d71b46a75097932,
+STATE-WP-0095-T10-frozen-bindings-guard-r1, now revision 2, metadata
+sha256:5d0ddebc21bcb035809cc8b57f4c2e1ba8ed09204be5b965460e178a90913f1e,
pending decision df703266-6719-4c04-ae1b-ba9afd3bca1c. The inspected candidate
image is main-c103cbf@sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1,
from runtime source c103cbf3c8bed5dba87a03e320595ddded9301a3. Image-only
server dry-run passed eight identities with only three image-field changes.
The exact proposal and recovery limits are retained in the Custodian dated
-2026-10-17 guard-successor-review-r1 packet. No new API runtime is approved or
+2026-10-17 guard-successor-review-r2 packet. No new API runtime is approved or
delivered by this source-only note; its later workplan commit does not change
the image's source pin. T09 stays done, T07/T10 stay wait pending reviewed API
delivery and explicit successor/current-baseline acceptance disposition.
+
+
+T10 proposal revision history: revision 1 metadata
+sha256:81d365926fc585a186955d8c98ee83501fd3cec12135b2256d71b46a75097932
+and its original helper remain immutable local evidence, unapproved and
+unexecuted. Revision 2 of the same stable proposal changes only the native
+probe's EXPECTED hash metadata into module/sha256 records for normal publication
+scanning; probe behavior, exact image, recovery and acceptance scope remain
+unchanged. The same decision df703266-6719-4c04-ae1b-ba9afd3bca1c remains open
+and pending. This source-only amendment grants no runtime authority or new
+image/code change; T07/T10 remain wait and T09 remains done.

View file

@ -0,0 +1,5 @@
{
"all10_task_blocks_unchanged": true,
"proposal_metadata_digest_verified": true,
"source_only": true
}

View file

@ -0,0 +1,46 @@
# Approved root-owned deployment verification preparation
These are source helpers for root review and execution through the existing
State Hub owner API-pod path. This subagent did not execute them or mutate a
live database. No additional approval or credential request is implied.
1. Root must run snapshot_full_row_hashes.py before the approved rollout and
again afterward inside the ordinary API-pod Python environment. It uses
existing async_session_factory with repeatable-read READ ONLY and dynamic
Workplan/Task model table assertions, full to_jsonb records hashed inside
the pod, columns/counts/UUIDs and canonical hashes only. It returns no raw
rows, credentials, DSN or SQL diagnostics and retains no full DB row bytes.
2. compare_snapshots.py compares only those sanitized receipts, exact3parent /
15task columns/UUID/full-row hashes and expected delivered module hash. Do
not substitute API-only snapshots for this full DB evidence. The optional
private API baseline is explicitly limited in its receipt and is not a full
database preservation claim.
3. After delivered module hash review, root can review/run
native_rollback_refusal_probes.py inside the same API-pod interpreter with
the exact private published-source payload on stdin. The payload receipt
binds published cluster HEADcac8eabe and22workplan files; all uncommitted
cluster additions are excluded. It performs no Forge token lookup and no
network clone. The deployed receiving module derives the checked source in
private temporary files; no caller projection is published as authority.
4. Each actual DB defect is inside a nested transaction, with explicit outer
rollback and statement/lock/idle timeouts. It tests ordinary preservation,
actual foreign-parent move, actual task/parent nonterminal status and actual
missing task (DELETE inside rollback). Source status and UUIDs are never
committed or published. The foreign-holder case precisely expects the
historical binding missing-child refusal; it is not a claim of reaching the
separate global creation-UUID holder branch. Constraint/lock/unrelated
refusal remains unverified and must be retained, not relabeled success.
5. Each case rolls back, clears ORM state and checks all historical full-row
hashes restored; final fresh transaction rechecks. Successful preserve may
stage unrelated legitimate source updates inside rollback, never commit.
Any unrelated authoritative-source or stale-row refusal must remain a
blocker to claiming that normal receive passed. Native helper exceptions
emit only closed status and optional five-character SQLSTATE, not values.
Root should invoke Python with argv lists, not shell interpolation, e.g. fixed
kubectl -n state-hub exec -i <approved API pod> -- /app/.venv/bin/python -c
<exact reviewed script text>, passing the payload bytes as stdin. No TTY, secret
argument, file credential or environment dump is needed. Keep any command error
stdout/stderr private and publish only the helper's fixed JSON receipt. Root
retains the real approved action/verification receipt; source compile is not
native proof. All helpers are compiled, not run against a live DB by this lane.

View file

@ -0,0 +1,13 @@
{
"status": "private_api_baseline_captured",
"observed_at": "2026-10-16T23:55:07.822861+00:00",
"rows": {
"parents": 3,
"tasks": 15
},
"private_snapshot": "/tmp/state95-private-api-baseline-dkreewoe/baseline.json",
"snapshot_sha256": "sha256:8204a2095433feb777694bfef5b2beec512acaaadd5129501d8ca1f278838c6c",
"limitations": [
"API fields only, not all DBcolumns. No schema migration or database mutation performed."
]
}

View file

@ -0,0 +1,13 @@
#!/usr/bin/env python3
"""Compare sanitized full-row hash receipts only; never consumes row values."""
import argparse,json
from pathlib import Path
ap=argparse.ArgumentParser();ap.add_argument('before');ap.add_argument('after');args=ap.parse_args()
a=json.loads(Path(args.before).read_text());b=json.loads(Path(args.after).read_text())
assert a['status']==b['status']=='captured_readonly'
assert a['tables']['workplans']['row_count']==b['tables']['workplans']['row_count']==3
assert a['tables']['tasks']['row_count']==b['tables']['tasks']['row_count']==15
same=a['tables']==b['tables']
expected='sha256:e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2'
result={'schema':'state95.historical-full-row-preservation.v1','status':'passed' if same and b['historical_module_sha256']==expected else 'refused_or_unverified','full_row_columns_uuids_hashes_equal':same,'delivered_historical_module_hash_matches':b['historical_module_sha256']==expected,'parent_count':3,'task_count':15,'raw_rows_retained':False}
print(json.dumps(result));raise SystemExit(result['status']!='passed')

View file

@ -0,0 +1,32 @@
{
"schema": "state95.postdeployment-verifier-source.v1",
"status": "source_prepared_for_root_review_not_native_executed_by_subagent",
"approved_rollout_proposal_digest": "63a02e8296d126c0158b7eb2c4ce79c7eeb6f8d6f61298d473c1065c7557ba32",
"runtime_source": "51bc70d1ff8f25450a8650d8e50caf053093a02e",
"files": [
{
"path": "snapshot_full_row_hashes.py",
"sha256": "sha256:f01e93c0fcb4ca155bdf76813626c33e4343f6a8caec2870ab1d785243c60479"
},
{
"path": "native_rollback_refusal_probes.py",
"sha256": "sha256:839d90fd336fe56bbd73d101b0770e8eba3d7517a3953b8afd075feccdd0b94d"
},
{
"path": "compare_snapshots.py",
"sha256": "sha256:fe38d1268a8c4bb54f0941f87a9aab5ee24410cc0197b082dbebe71bc94b0b78"
},
{
"path": "README.md",
"sha256": "sha256:f432c3bcb29ee0715ef8e72d5ae806a800f07338cd9b5faea9d71c470c51d699"
},
{
"path": "private-published-source-payload-receipt.json",
"sha256": "sha256:df2c438c455578d778b00363203b69aedd46e8bcdbdb3e0bd6650de6bde14bb9"
},
{
"path": "api-baseline-receipt.json",
"sha256": "sha256:8f6da30c33482b552392d16584f704265750f3a0263fa6ec4f20f5175b7bd852"
}
]
}

View file

@ -0,0 +1,79 @@
#!/usr/bin/env python3
"""Root-reviewed in-pod native probes only; private source stdin, every DB effect rolled back."""
import asyncio,base64,copy,hashlib,json,logging,sys,tempfile,uuid
from pathlib import Path
logging.disable(logging.CRITICAL)
BINDINGS=[{'repo': 'railiance-cluster', 'path': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md', 'sha256': '8d6f8533c119117686bc0d5bb9ed5349726aa6c3189ff98b53409c68ac685ca9', 'record_id': 'RAIL-BS-WP-0002', 'uuid': '4c63dfc6-9eac-4e79-9f77-8f644ad7147d', 'parent_record_id': 'RAIL-BS-WP-0002', 'source_status': 'finished', 'tasks': [{'label': 'T01', 'uuid': '3f042630-eab0-4c6a-9167-e2b28ff20e40', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-1'}, {'label': 'T02', 'uuid': 'e8510646-46ed-4697-a345-f3d3009eea78', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-2'}, {'label': 'T03', 'uuid': 'dab2c07f-8aa0-4635-8df6-857e87e93fc5', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-3'}, {'label': 'T04', 'uuid': '5c3d40e4-239b-488e-9519-6f7a38d2325f', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-4'}, {'label': 'T05', 'uuid': '7f9e0e58-a130-467a-a2d0-b3f2564e496f', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-5'}]}, {'repo': 'railiance-cluster', 'path': 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md', 'sha256': '4dc2f61e15adc3c5c81f9ecf8b933512275b95e8f829fac52ae7cde1385cea4a', 'record_id': 'RAIL-BS-WP-0003', 'uuid': '7ee9ee22-1fae-4567-9194-8d70a9e0f45b', 'parent_record_id': 'RAIL-BS-WP-0003', 'source_status': 'finished', 'tasks': [{'label': 'T01', 'uuid': '6841c93a-f146-47eb-9f7c-8fa0e02c1bbc', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-1'}, {'label': 'T02', 'uuid': 'ab166073-30a7-4702-a037-4091e8706e20', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-2'}, {'label': 'T03', 'uuid': '140da396-8e30-4f4d-b88c-c42c0cd46c01', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-3'}, {'label': 'T04', 'uuid': 'd8a3ba40-fda0-4c1f-a9f1-ffcd621a5b3d', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-4'}]}, {'repo': 'railiance-cluster', 'path': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md', 'sha256': '04f787078232395bd2d43861de16c521848559fa286f06e1caa9cb779aa71ac3', 'record_id': 'RAIL-BS-WP-0004', 'uuid': '7e8b0c20-51eb-40c9-9e3b-85dd380d7625', 'parent_record_id': 'RAIL-BS-WP-0004', 'source_status': 'finished', 'tasks': [{'label': 'T01', 'uuid': '4526a842-ea31-4874-9231-92ab556cfe7b', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-1'}, {'label': 'T02', 'uuid': 'a6313e06-1976-46a7-8e31-df4eb2eca880', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-2'}, {'label': 'T03', 'uuid': '05d42a55-921f-4aa7-bb76-e8af9c7e0ac3', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-3'}, {'label': 'T04', 'uuid': '08233868-d522-4117-bc4e-6c0f52545665', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-4'}, {'label': 'T05', 'uuid': '2d5acff7-4a4e-4ddd-ad06-08237ad3dac8', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-5'}, {'label': 'T06', 'uuid': 'f8e4a094-c367-40eb-b895-da17bc144b07', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-6'}]}]
PAYLOAD_SHA='82af93c3f8585f97fed63fafca2a6105caaeed8d52848ad628091663386fa949'
EXPECTED_HP='e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2'
EXPECTED_FP='b980e62cbd85c3e7df42b01abf14354e04133374db94af6531dcd91629c3487d'
def digest(value):return 'sha256:'+hashlib.sha256(json.dumps(value,sort_keys=True,separators=(',',':'),ensure_ascii=False).encode()).hexdigest()
async def main():
from sqlalchemy import text
from api.database import async_session_factory,engine
from api.services import forge_projection as fp,historical_projection as hp
from api.models.workplan import Workplan
from api.models.task import Task
engine.echo=False
assert Workplan.__tablename__=='workplans' and Task.__tablename__=='tasks'
assert hashlib.sha256(Path(hp.__file__).read_bytes()).hexdigest()==EXPECTED_HP
assert hashlib.sha256(Path(fp.__file__).read_bytes()).hexdigest()==EXPECTED_FP
raw=sys.stdin.buffer.read(2097153);assert len(raw)<=2097152 and hashlib.sha256(raw).hexdigest()==PAYLOAD_SHA
payload=json.loads(raw);assert set(payload)=={'repo','revision','files'} and payload['repo']=='railiance-cluster'
parents=[e['uuid'] for e in BINDINGS];task_ids=[t['uuid'] for e in BINDINGS for t in e['tasks']]
async def snapshot(session):
result={}
for table,ids in [('workplans',parents),('tasks',task_ids)]:
values=(await session.execute(text('SELECT to_jsonb(row) FROM '+table+' AS row WHERE row.id=ANY(:ids) ORDER BY row.id'),{'ids':[uuid.UUID(v) for v in ids]})).scalars().all()
assert len(values)==len(ids)
result[table]=digest(values)
return result
with tempfile.TemporaryDirectory(prefix='state95-exact-published-source-') as temporary:
checkout=Path(temporary)/'railiance-cluster';checkout.mkdir(mode=0o700)
for name,value in payload['files'].items():
path=Path(name);assert path.parts[0]=='workplans' and not path.is_absolute() and '..' not in path.parts and path.suffix=='.md'
target=checkout/path;target.parent.mkdir(parents=True,exist_ok=True);target.write_bytes(base64.b64decode(value,validate=True));target.chmod(0o600)
derived=fp.derive_from_checkout(checkout,'railiance-cluster',payload['revision'])
histories=[w for w in derived.workplans if w.historical_preservation]
assert len(histories)==3 and {w.uuid for w in histories}==set(parents)
result={'schema':'state95.native-rollback-refusal-probes.v1','status':'failed','source_revision':payload['revision'],'private_source_payload_sha256':'sha256:'+PAYLOAD_SHA,'module_hashes_verified':True,'commits_performed':0,'cases':{},'raw_rows_or_diagnostics_retained':False}
async with async_session_factory() as session:
try:
await session.execute(text("SET LOCAL statement_timeout='5s'"))
await session.execute(text("SET LOCAL lock_timeout='1s'"))
await session.execute(text("SET LOCAL idle_in_transaction_session_timeout='10s'"))
before=await snapshot(session);result['before_full_row_hashes']=before
for case in ('preserve','foreign-holder','nonterminal-task','nonterminal-parent','missing-task'):
nested=await session.begin_nested();row={'status':'unverified','rolled_back':False}
try:
session.expire_all()
if case=='foreign-holder':await session.execute(text('UPDATE tasks SET workplan_id=:parent WHERE id=:task'),{'parent':uuid.UUID(parents[1]),'task':uuid.UUID(task_ids[0])})
elif case=='nonterminal-task':await session.execute(text("UPDATE tasks SET status='progress' WHERE id=:task"),{'task':uuid.UUID(task_ids[0])})
elif case=='nonterminal-parent':await session.execute(text("UPDATE workplans SET status='active' WHERE id=:parent"),{'parent':uuid.UUID(parents[0])})
elif case=='missing-task':await session.execute(text('DELETE FROM tasks WHERE id=:task'),{'task':uuid.UUID(task_ids[0])})
outcome=await fp.reset_repository_projection(session,'railiance-cluster',derived=copy.deepcopy(derived))
reasons={r.get('reason') for r in outcome.refused}
if case=='preserve':
await session.flush();row['full_historical_rows_equal']=await snapshot(session)==before
row['status']='passed' if outcome.status in {'noop','applied'} and not outcome.refused and row['full_historical_rows_equal'] else 'refused_or_unverified'
else:
row['historical_binding_refused']=outcome.status=='refused' and 'historical binding requires existing parent and task UUIDs' in reasons
row['status']='passed' if row['historical_binding_refused'] else 'wrong_or_unverified_refusal'
row['native_outcome_status']=outcome.status
except BaseException as error:
code=getattr(getattr(error,'orig',error),'sqlstate',None)
row={'status':'native_probe_error','sqlstate':code if isinstance(code,str) and len(code)==5 and code.isalnum() else None,'rolled_back':False}
finally:
await nested.rollback();session.expire_all();row['rolled_back']=True
row['full_historical_rows_restored']=await snapshot(session)==before
result['cases'][case]=row
result['after_full_row_hashes']=await snapshot(session)
finally:await session.rollback()
async with async_session_factory() as check:
try:result['fresh_transaction_full_rows_equal']=await snapshot(check)==before
finally:await check.rollback()
result['status']='passed' if all(v['status']=='passed' and v['rolled_back'] and v['full_historical_rows_restored'] for v in result['cases'].values()) and result['fresh_transaction_full_rows_equal'] else 'refused_or_unverified'
await engine.dispose();print(json.dumps(result,sort_keys=True))
if __name__=='__main__':
try:asyncio.run(main())
except BaseException:print(json.dumps({'schema':'state95.native-rollback-refusal-probes.v1','status':'refused_or_unverified','commits_performed':0,'raw_rows_or_diagnostics_retained':False}));raise SystemExit(1)

View file

@ -0,0 +1,10 @@
{
"schema": "state95.source-probe-payload.v1",
"scope": "exact_current_git_HEAD_workplans_only_uncommitted_additions_excluded",
"revision": "cac8eabef5a0d0990a7b0de8f5e2c762666ac7f0",
"private_payload_path": "/tmp/state95-private-source-payload-frvylkw5/published-workplans.json",
"bytes": 155730,
"sha256": "sha256:82af93c3f8585f97fed63fafca2a6105caaeed8d52848ad628091663386fa949",
"file_count": 22,
"native_authority": false
}

View file

@ -0,0 +1,40 @@
#!/usr/bin/env python3
"""Run by approved owner inside API pod; SELECT-only, output full-row hashes only."""
import asyncio
import hashlib
import json
import logging
from pathlib import Path
import uuid
logging.disable(logging.CRITICAL)
BINDINGS=[{'repo': 'railiance-cluster', 'path': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md', 'sha256': '8d6f8533c119117686bc0d5bb9ed5349726aa6c3189ff98b53409c68ac685ca9', 'record_id': 'RAIL-BS-WP-0002', 'uuid': '4c63dfc6-9eac-4e79-9f77-8f644ad7147d', 'parent_record_id': 'RAIL-BS-WP-0002', 'source_status': 'finished', 'tasks': [{'label': 'T01', 'uuid': '3f042630-eab0-4c6a-9167-e2b28ff20e40', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-1'}, {'label': 'T02', 'uuid': 'e8510646-46ed-4697-a345-f3d3009eea78', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-2'}, {'label': 'T03', 'uuid': 'dab2c07f-8aa0-4635-8df6-857e87e93fc5', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-3'}, {'label': 'T04', 'uuid': '5c3d40e4-239b-488e-9519-6f7a38d2325f', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-4'}, {'label': 'T05', 'uuid': '7f9e0e58-a130-467a-a2d0-b3f2564e496f', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-5'}]}, {'repo': 'railiance-cluster', 'path': 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md', 'sha256': '4dc2f61e15adc3c5c81f9ecf8b933512275b95e8f829fac52ae7cde1385cea4a', 'record_id': 'RAIL-BS-WP-0003', 'uuid': '7ee9ee22-1fae-4567-9194-8d70a9e0f45b', 'parent_record_id': 'RAIL-BS-WP-0003', 'source_status': 'finished', 'tasks': [{'label': 'T01', 'uuid': '6841c93a-f146-47eb-9f7c-8fa0e02c1bbc', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-1'}, {'label': 'T02', 'uuid': 'ab166073-30a7-4702-a037-4091e8706e20', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-2'}, {'label': 'T03', 'uuid': '140da396-8e30-4f4d-b88c-c42c0cd46c01', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-3'}, {'label': 'T04', 'uuid': 'd8a3ba40-fda0-4c1f-a9f1-ffcd621a5b3d', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-4'}]}, {'repo': 'railiance-cluster', 'path': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md', 'sha256': '04f787078232395bd2d43861de16c521848559fa286f06e1caa9cb779aa71ac3', 'record_id': 'RAIL-BS-WP-0004', 'uuid': '7e8b0c20-51eb-40c9-9e3b-85dd380d7625', 'parent_record_id': 'RAIL-BS-WP-0004', 'source_status': 'finished', 'tasks': [{'label': 'T01', 'uuid': '4526a842-ea31-4874-9231-92ab556cfe7b', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-1'}, {'label': 'T02', 'uuid': 'a6313e06-1976-46a7-8e31-df4eb2eca880', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-2'}, {'label': 'T03', 'uuid': '05d42a55-921f-4aa7-bb76-e8af9c7e0ac3', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-3'}, {'label': 'T04', 'uuid': '08233868-d522-4117-bc4e-6c0f52545665', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-4'}, {'label': 'T05', 'uuid': '2d5acff7-4a4e-4ddd-ad06-08237ad3dac8', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-5'}, {'label': 'T06', 'uuid': 'f8e4a094-c367-40eb-b895-da17bc144b07', 'status': 'done', 'source': 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-6'}]}]
def digest(value):return 'sha256:'+hashlib.sha256(json.dumps(value,sort_keys=True,separators=(',',':'),ensure_ascii=False).encode()).hexdigest()
async def main():
from sqlalchemy import text
from api.database import async_session_factory,engine
from api.models.workplan import Workplan
from api.models.task import Task
engine.echo=False
assert Workplan.__tablename__=='workplans' and Task.__tablename__=='tasks'
parents=[entry['uuid'] for entry in BINDINGS]
tasks={task['uuid']:entry['uuid'] for entry in BINDINGS for task in entry['tasks']}
result={'schema':'state95.full-db-row-hash-snapshot.v1','status':'failed','credential_values_exposed':False,'raw_rows_retained':False}
async with async_session_factory() as session:
try:
await session.execute(text('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ ONLY'))
rows={}
for table,identifiers in [('workplans',parents),('tasks',list(tasks))]:
query=text('SELECT to_jsonb(row) FROM '+table+' AS row WHERE row.id=ANY(:ids) ORDER BY row.id')
values=(await session.execute(query,{'ids':[uuid.UUID(v) for v in identifiers]})).scalars().all()
assert len(values)==len(identifiers) and {v['id'] for v in values}==set(identifiers)
if table=='tasks':assert all(v['workplan_id']==tasks[v['id']] for v in values)
assert all(v['status'] in {'done','cancel','finished','archived','completed'} for v in values)
rows[table]={'row_count':len(values),'columns':sorted(values[0]),'rows':[{'uuid':v['id'],'sha256':digest(v)} for v in values],'all_rows_sha256':digest(values)}
from api.services import historical_projection
result.update(status='captured_readonly',tables=rows,historical_module_sha256='sha256:'+hashlib.sha256(Path(historical_projection.__file__).read_bytes()).hexdigest())
finally:await session.rollback()
await engine.dispose()
print(json.dumps(result,sort_keys=True))
if __name__=='__main__':
try:asyncio.run(main())
except BaseException:print(json.dumps({'schema':'state95.full-db-row-hash-snapshot.v1','status':'refused_or_unverified','raw_rows_retained':False}));raise SystemExit(1)

View file

@ -0,0 +1,152 @@
---
id: RCLUSTER-WP-0018
type: workplan
title: "Establish original KeyCape TLS recovery and future archive boundary"
domain: financials
repo: railiance-cluster
status: active
owner: codex
topic_slug: railiance
created: "2026-10-17"
updated: "2026-10-17"
flavor: implementation
depends_on: []
related: [CUST-WP-0080, NK-WP-0049, RCLUSTER-WP-0007, RCLUSTER-WP-0017]
state_hub_workstream_id: "e0a7813d-c916-5e49-84b2-5e5b30441891"
---
Required owner source work for NK-WP-0049-T35 and CUST-WP-0080 G08. Reviewed
against current INTENT/SCOPE, backup sources and existing work records; ready
means work can proceed, not privileged execute authority. This does not promote
HA/backlog work, reopen archived local backup delivery or duplicate signer0017.
Source-owner scope is certificate plumbing/backup posture; NetKingdom owns
namespace ingress, while exact original independent TLS custody remains to be
established. No secret read, reissue, live change or native assent occurred.
## Record source boundary and public-only metadata preparation
```task
id: RCLUSTER-WP-0018-T01
status: done
priority: high
assignee: codex
state_hub_task_id: "7280193d-0d59-5b78-a2d3-96ebd127127f"
```
Completed 2026-10-17 as isolated source preparation. Independently reviewed the
17 public source references against current owner bytes, checked current owner
instructions/environment/supervision and existing plans, and recorded the exact
boundary in docs/keycape-tls-recovery-boundary.md. Prepared bounded public-only
certificate/trust metadata projection with generated-certificate tests; no actual
certificate/key read. Source integration/publication and task projection remain
separate receipts, not claimed by this completed preparation task.
Evidence: the-custodian docs/changes/netkingdom-target-2026-10-16/
recovery-owner-handoffs-r1/ and prior recovery-attempt-r1/t35-t36-source-next/.
Publication return, 2026-10-17: normal owner source publication at
c562d7134c38679952a8ffd17a8a893a900aef0d was applied on primary/railiance01
with expected and derived commits equal. Read-only source/remote/Hub proof
verified this workplan's five exact task ID/UUID/status bindings and three
internal dependency edges. Receipts are retained in the Custodian packet
docs/changes/netkingdom-target-2026-10-17/railiance-cluster-projection.json and
cluster-publication-readback.json. The later legitimate C23 lifecycle repair
at 26671d33600e218316d29c9cd020f115ebfb35b2 changed ready to active; active
is retained. This return records publication separately from the completed
source preparation above. Original TLS artifact/provider custody, extraction
and native admission remain T02–T05 obligations; publication proves no TLS
recovery, private-key custody or native acceptance.
The whole maintenance pipeline's historical-row guard failed for three parent
rows while 15 task full-row hashes remained unchanged. STATE-WP-0095-T07 and
RMGR-WP-0019-T06 remain wait; neither publication nor this memo asserts full
historical-row preservation or restoration. The subsequent forward correction
restores the brief's committed content to its pre-accident version while restoring
the original staged/worktree change for its owner; history is not rewound. No legacy deep consistency fix is run by the correction.
## Establish exact independent original TLS artifact and provider custody metadata
```task
id: RCLUSTER-WP-0018-T02
status: todo
priority: high
assignee: codex
state_hub_task_id: "90836435-917f-504c-a711-3f29ece348e3"
```
Next: identify the actual original sso/kc-tls custody owner and independent public
provenance through existing owner processes. Record artifact/provider, timestamp,
public certificate/trust hashes, private custody entry point and outage dependencies
without values. Source review cannot infer a fresh backup, original key coverage
or independent decryption custody from a local backup script. Use credential
routing before any later credential need; missing route is not proof of absence.
Done when exact independent recovery or an explicitly owned unavailable capability
is evidenced as metadata and a reviewed next action, with no guessed assent.
## Prepare safe isolated original extraction or explicit reissue alternative
```task
id: RCLUSTER-WP-0018-T03
status: wait
priority: high
assignee: codex
depends_on: [RCLUSTER-WP-0018-T02]
blocking_reason: "Exact original artifact/provider/custody disposition is required before selecting extraction or reissue source."
state_hub_task_id: "5dfa9a3a-2639-5cf6-b0a4-13eef417d47a"
```
From T02, reuse the actual owner path to prepare an exact attended private-only
recovery command and full dependency/cleanup proof. Do not run whole-state restore
or expose raw state/Secret output. If existing backup staging is required, correct
only the needed path with bounded memory-only staging and early exact cleanup,
including error/parent-loss tests before use. Original recovery and accepted
reissue are distinct claims; no self-signed trust substitute, new broker or
implicit production action. Done when the exact source proposal, public metadata
preflight, negatives, timeout, abort and custody obligations are reviewed.
## Verify admitted original TLS recovery through the actual owner boundary
```task
id: RCLUSTER-WP-0018-T04
status: wait
priority: high
assignee: codex
needs_human: true
depends_on: [RCLUSTER-WP-0018-T02, RCLUSTER-WP-0018-T03]
blocking_reason: "Await exact reviewed attended owner custody path and its existing scoped authority; no private input or native attempt requested yet."
state_hub_task_id: "021b07bb-65bc-5743-bac5-4294b4be74f6"
```
Only the actual admitted owner action can prove recovered certificate/key pairing,
original hostname/trust and independent outage operation, or the expressly accepted
reissue result. Retain exact source/artifact/target/identity/negative/cleanup receipts.
Human custody/authority gates are not worker wakeups. Source and historical local
backup proof never fill native assent. Return bounded public proof to NK49T35;
no production mutation, credential retrieval or approval is granted by this task.
## Disposition original TLS coverage in the future identity archive contract
```task
id: RCLUSTER-WP-0018-T05
status: todo
priority: high
assignee: codex
state_hub_task_id: "5bc67a22-0991-5625-86a6-f749560d8a0e"
```
Next: deliver the source-owned requirement in docs/keycape-tls-recovery-boundary.md
to NetKingdom's existing contract process: original TLS custody or accepted reissue,
independent provider/key recovery, public identity hashes, scoped capture/read
permissions and verification/retention. Record named owner dependencies as live
work before closure. Do not append kc-tls to secret_refs, expand capture credentials
or rewrite a historical archive without those owner reviews/authority. Done when
the future contract requirement has an exact tracked disposition/handoff; it is
not proof of current archive coverage or actual future capture.
## Coordination and completion
Beneficiary NK-WP-0049-T35/CUST-WP-0080 remains linked to this obligor record by
derived cross_owner_wait case nk49-t35-rcluster18 in the packet. No new project
driver, live worker injection or message was created. Own T03 wait has an explicit
local prerequisite; T04 is a human gate. Close only after source/native obligations
are proved or an explicit bounded scope disposition hands off remaining live work.

View file

@ -0,0 +1,132 @@
---
id: RCLUSTER-WP-0018
type: workplan
title: "Establish original KeyCape TLS recovery and future archive boundary"
domain: financials
repo: railiance-cluster
status: active
owner: codex
topic_slug: railiance
created: "2026-10-17"
updated: "2026-10-17"
flavor: implementation
depends_on: []
related: [CUST-WP-0080, NK-WP-0049, RCLUSTER-WP-0007, RCLUSTER-WP-0017]
state_hub_workstream_id: "e0a7813d-c916-5e49-84b2-5e5b30441891"
---
Required owner source work for NK-WP-0049-T35 and CUST-WP-0080 G08. Reviewed
against current INTENT/SCOPE, backup sources and existing work records; ready
means work can proceed, not privileged execute authority. This does not promote
HA/backlog work, reopen archived local backup delivery or duplicate signer0017.
Source-owner scope is certificate plumbing/backup posture; NetKingdom owns
namespace ingress, while exact original independent TLS custody remains to be
established. No secret read, reissue, live change or native assent occurred.
## Record source boundary and public-only metadata preparation
```task
id: RCLUSTER-WP-0018-T01
status: done
priority: high
assignee: codex
state_hub_task_id: "7280193d-0d59-5b78-a2d3-96ebd127127f"
```
Completed 2026-10-17 as isolated source preparation. Independently reviewed the
17 public source references against current owner bytes, checked current owner
instructions/environment/supervision and existing plans, and recorded the exact
boundary in docs/keycape-tls-recovery-boundary.md. Prepared bounded public-only
certificate/trust metadata projection with generated-certificate tests; no actual
certificate/key read. Source integration/publication and task projection remain
separate receipts, not claimed by this completed preparation task.
Evidence: the-custodian docs/changes/netkingdom-target-2026-10-16/
recovery-owner-handoffs-r1/ and prior recovery-attempt-r1/t35-t36-source-next/.
## Establish exact independent original TLS artifact and provider custody metadata
```task
id: RCLUSTER-WP-0018-T02
status: todo
priority: high
assignee: codex
state_hub_task_id: "90836435-917f-504c-a711-3f29ece348e3"
```
Next: identify the actual original sso/kc-tls custody owner and independent public
provenance through existing owner processes. Record artifact/provider, timestamp,
public certificate/trust hashes, private custody entry point and outage dependencies
without values. Source review cannot infer a fresh backup, original key coverage
or independent decryption custody from a local backup script. Use credential
routing before any later credential need; missing route is not proof of absence.
Done when exact independent recovery or an explicitly owned unavailable capability
is evidenced as metadata and a reviewed next action, with no guessed assent.
## Prepare safe isolated original extraction or explicit reissue alternative
```task
id: RCLUSTER-WP-0018-T03
status: wait
priority: high
assignee: codex
depends_on: [RCLUSTER-WP-0018-T02]
blocking_reason: "Exact original artifact/provider/custody disposition is required before selecting extraction or reissue source."
state_hub_task_id: "5dfa9a3a-2639-5cf6-b0a4-13eef417d47a"
```
From T02, reuse the actual owner path to prepare an exact attended private-only
recovery command and full dependency/cleanup proof. Do not run whole-state restore
or expose raw state/Secret output. If existing backup staging is required, correct
only the needed path with bounded memory-only staging and early exact cleanup,
including error/parent-loss tests before use. Original recovery and accepted
reissue are distinct claims; no self-signed trust substitute, new broker or
implicit production action. Done when the exact source proposal, public metadata
preflight, negatives, timeout, abort and custody obligations are reviewed.
## Verify admitted original TLS recovery through the actual owner boundary
```task
id: RCLUSTER-WP-0018-T04
status: wait
priority: high
assignee: codex
needs_human: true
depends_on: [RCLUSTER-WP-0018-T02, RCLUSTER-WP-0018-T03]
blocking_reason: "Await exact reviewed attended owner custody path and its existing scoped authority; no private input or native attempt requested yet."
state_hub_task_id: "021b07bb-65bc-5743-bac5-4294b4be74f6"
```
Only the actual admitted owner action can prove recovered certificate/key pairing,
original hostname/trust and independent outage operation, or the expressly accepted
reissue result. Retain exact source/artifact/target/identity/negative/cleanup receipts.
Human custody/authority gates are not worker wakeups. Source and historical local
backup proof never fill native assent. Return bounded public proof to NK49T35;
no production mutation, credential retrieval or approval is granted by this task.
## Disposition original TLS coverage in the future identity archive contract
```task
id: RCLUSTER-WP-0018-T05
status: todo
priority: high
assignee: codex
state_hub_task_id: "5bc67a22-0991-5625-86a6-f749560d8a0e"
```
Next: deliver the source-owned requirement in docs/keycape-tls-recovery-boundary.md
to NetKingdom's existing contract process: original TLS custody or accepted reissue,
independent provider/key recovery, public identity hashes, scoped capture/read
permissions and verification/retention. Record named owner dependencies as live
work before closure. Do not append kc-tls to secret_refs, expand capture credentials
or rewrite a historical archive without those owner reviews/authority. Done when
the future contract requirement has an exact tracked disposition/handoff; it is
not proof of current archive coverage or actual future capture.
## Coordination and completion
Beneficiary NK-WP-0049-T35/CUST-WP-0080 remains linked to this obligor record by
derived cross_owner_wait case nk49-t35-rcluster18 in the packet. No new project
driver, live worker injection or message was created. Own T03 wait has an explicit
local prerequisite; T04 is a human gate. Close only after source/native obligations
are proved or an explicit bounded scope disposition hands off remaining live work.

View file

@ -0,0 +1,54 @@
#!/usr/bin/env python3
"""Reviewed forward-only two-path commit; retain original brief/index/worktree dirt."""
from pathlib import Path
import argparse,hashlib,json,subprocess
P=Path(__file__).resolve().parent
R=Path('/home/worsch/railiance-cluster')
B=P.parent/'railiance-cluster-publication-backup'
M=json.loads((P/'manifest.json').read_text())
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
def git(*args):
r=subprocess.run(['git','-C',str(R),*args],capture_output=True,timeout=180)
if r.returncode:raise RuntimeError(json.dumps({'args':args,'exit':r.returncode,'stdout':r.stdout.decode(errors='replace'),'stderr':r.stderr.decode(errors='replace')}))
return r.stdout
parser=argparse.ArgumentParser();parser.add_argument('--execute',action='store_true');a=parser.parse_args()
assert git('rev-parse','HEAD').decode().strip()==M['base']
for name,h in M['files'].items():assert sha(P/name)==h
for name,h in M['original_backup_sha256'].items():assert sha(B/name)==h
originals=json.loads((B/'originals.json').read_text())
for name,index in originals.items():
assert (R/name).read_bytes()==(B/(name+'.worktree')).read_bytes()
assert git('ls-files','--stage','--',name).decode()==index
wp,brief=M['paths'];assert (R/wp).read_bytes()==(P/'WP18.preimage.md').read_bytes()
assert git('show',M['restore_brief_from_commit']+':'+brief)==(P/'brief.forward-restore.md').read_bytes()
assert git('diff','--cached','--name-only')==b''
before_index=git('ls-files','--stage').decode().splitlines()
frozen={str(p.relative_to(R)):sha(p) for p in (R/'workplans/archived').glob('260622-RAIL-BS-WP-000[234]-*.md')};assert len(frozen)==3
assert sha(R/'WORK-RECORDS.md')==M['original_backup_sha256']['WORK-RECORDS.md.worktree']
git('apply','--check',str(P/'forward-correction.patch'))
if not a.execute:print(json.dumps({'status':'checked-ready','paths':M['paths'],'original_brief_and_work_records_preserved':True}));raise SystemExit(0)
(P/'execution-start.json').write_text(json.dumps({'status':'started','base':M['base'],'index_entries':before_index,'frozen_sha256':frozen},indent=2)+'\n')
commit_output='';error=None
try:
git('apply',str(P/'forward-correction.patch'))
# --only feeds exactly the two reviewed worktree versions to normal hooks.
commit_output=git('commit','--only','-m','Record Cluster publication and restore unrelated staged brief','--',*M['paths']).decode()
finally:
# The owner's original brief index/worktree is reinstated even if a hook refuses.
(R/brief).write_bytes((B/(brief+'.worktree')).read_bytes())
mode,oid,stagepath=originals[brief].split(' ',2)
assert stagepath=='0\t'+brief+'\n'
git('update-index','--cacheinfo',mode,oid,brief)
for name,index in originals.items():
assert (R/name).read_bytes()==(B/(name+'.worktree')).read_bytes()
assert git('ls-files','--stage','--',name).decode()==index
head=git('rev-parse','HEAD').decode().strip();assert head!=M['base']
assert set(git('diff-tree','--no-commit-id','--name-only','-r',head).decode().splitlines())==set(M['paths'])
assert git('show','HEAD:'+brief)==(P/'brief.forward-restore.md').read_bytes()
assert git('show','HEAD:'+wp)==(P/'WP18.candidate.md').read_bytes()
# Every unrelated stage entry is identical, including user's exact brief entry.
without_wp=lambda entries:[line for line in entries if line.split('\t',1)[1]!=wp]
assert without_wp(git('ls-files','--stage').decode().splitlines())==without_wp(before_index)
assert {path:sha(R/path) for path in frozen}==frozen
receipt={'status':'committed-forward-correction','head':head,'parent':M['base'],'paths':M['paths'],'commit_output':commit_output,'head_brief_equals_c562':True,'original_brief_index_and_worktree_restored':True,'all_other_index_entries_identical':True,'work_records_index_and_dirty_worktree_preserved':True,'three_archives_unchanged':True,'wp18_status':'active','task_blocks_and_UUIDs_unchanged':True,'legacy_deepfix':False,'history_rewrite':False,'native_TLS_acceptance':False,'all18historical_preservation_claim':False,'status_porcelain':git('status','--porcelain').decode()}
(P/'forward-correction-commit.json').write_text(json.dumps(receipt,indent=2)+'\n');print(json.dumps(receipt,indent=2))

View file

@ -0,0 +1,33 @@
<!-- custodian-brief: generated by fix-consistency — do not edit manually -->
# Custodian Brief — railiance-cluster
**Domain:** financials
**Last synced:** 2026-10-16 19:05 UTC
**State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)*
## Current Goal
Install k3s and Kubernetes Baseline on the HostEurope Server
## Active Workstreams
### Review NetKingdom signer runtime and node-local storage readiness
Progress: 1/3 done | workplan_id: `f383557d-c8a8-553e-adcd-9f82ff9c2929`
**Open tasks:**
- ► Review the bounded native preflight and storage action `7f4320c6`
- · Verify the approved runtime and storage result `747a8d77`
## Inbox Hygiene
**Stale unread:** 6 message(s) older than 3 day(s) — triage at session start.
**Missing thread_id:** 8 unread message(s) lack supersession chains.
- ! the-custodian: Workplan 'three-phoenix-ha-cluster' is blocked with no wait task `a1368d99`
---
## MCP Orientation (when available)
If the state-hub MCP server is reachable, call:
`get_domain_summary("financials")`
This provides richer cross-domain context.
If the MCP call fails, use this file as your orientation source.

View file

@ -0,0 +1,28 @@
<!-- custodian-brief: generated by fix-consistency — do not edit manually -->
# Custodian Brief — railiance-cluster
**Domain:** financials
**Last synced:** 2026-10-13 18:24 UTC
**State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)*
## Current Goal
Install k3s and Kubernetes Baseline on the HostEurope Server
## Active Workstreams
*(none — repo may need first-session setup)*
## Inbox Hygiene
**Stale unread:** 6 message(s) older than 3 day(s) — triage at session start.
**Missing thread_id:** 6 unread message(s) lack supersession chains.
- ! the-custodian: Workplan 'three-phoenix-ha-cluster' is blocked with no wait task `a1368d99`
---
## MCP Orientation (when available)
If the state-hub MCP server is reachable, call:
`get_domain_summary("financials")`
This provides richer cross-domain context.
If the MCP call fails, use this file as your orientation source.

View file

@ -0,0 +1,29 @@
{
"status": "review-required-before-execution",
"helper_sha256": "02b028822e07cc1612a2e5dea3c9f271f0020f9adfb656c0aac42555b0805502",
"patch_sha256": "a50c419c4ab3a35a6f953559546c88fe0cfb75605ef63b51fe30307180262610",
"manifest_sha256": "9ac8f5e43f84add61ec8560be78e4d10e55bdd2918467581f367e816a4592385",
"check_only_result": "passed at26671d33600e218316d29c9cd020f115ebfb35b2",
"execute_command": [
"python3",
"/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/cluster-forward-correction-r1/apply_forward_correction.py",
"--execute"
],
"then_required_publication": [
"/home/worsch/repo-manager/.venv/bin/rmgr",
"sync",
"--path",
"/home/worsch/railiance-cluster",
"--push"
],
"postconditions": [
"new forward commit exactly two paths, parent266",
"HEAD brief bytes equal c562; original86c0brief indexentry and originalbackupworktree retained",
"original WORK-RECORDS.md indexentry and dirtyworktree unchanged",
"all other indexentries unchanged except intentional WP18",
"source/remote HEAD identical and primary/railiance01 expected=derived applied receipt",
"WP18 active and exact5taskIDs/UUIDs/status3internaledges readback",
"no legacydeepfix or full18rowrestoration/nativeTLSclaim"
],
"canonical_mutations": false
}

View file

@ -0,0 +1,148 @@
{
"status": "started",
"base": "26671d33600e218316d29c9cd020f115ebfb35b2",
"index_entries": [
"100644 0e8a5d95b6d263fbaeae4261a7051112fb27ee18 0\t.claude/rules/agents.md",
"100644 7c2a64580a2fb55d6586e154ee70d801430faa3e 0\t.claude/rules/architecture.md",
"100644 64b84033daa3eea88ed07993a62bf0d35abd5705 0\t.claude/rules/credential-routing.md",
"100644 3b263fc0085c9cbcdc9de1dce015b5af67937875 0\t.claude/rules/first-session.md",
"100644 2f85f27000175e115dc6210ce3f87b5d1eefdb21 0\t.claude/rules/repo-boundary.md",
"100644 60c065fa1af76a3234ab5a156cda98612f67f14c 0\t.claude/rules/repo-identity.md",
"100644 a26f834124d5c9e7cdc77842b5b46f1923f0d6c3 0\t.claude/rules/session-protocol.md",
"100644 ee026b2fbbcf7f920ca21b7ad4209c5d2009ef44 0\t.claude/rules/stack-and-commands.md",
"100644 7d08acc433f44cbe649a66ae2c0c312dfb588cdd 0\t.claude/rules/workplan-convention.md",
"100644 86c0e6c7306f54aebda9b59c7e3b72e4ab3e75ba 0\t.custodian-brief.md",
"100644 95847006236387ab1a6a17f40b9efb0445d56547 0\t.editorconfig",
"100644 bd44c56a4f8a6c12bdab40257e450c2a676f751a 0\t.forgejo/workflows/ci-smoke.yaml",
"100644 e3975118068d1760ad2915fa15dd74cc1ef16d21 0\t.gitattributes",
"100644 bfd3dd9e1dffd45197045b9ef7b8dc7bb8dd9534 0\t.github/workflows/tests.yml",
"100644 57cf4d7e3e5e362da4e55b276b562871f36a39d2 0\t.gitignore",
"100644 34833e54fc69369cfeef8cbca71f2a416032d027 0\t.repo-classification.yaml",
"100644 18185bcf111aa96fc9204e04a9acb9f90eecda88 0\t.sops.yaml",
"100644 895538687b80cfdd1dacdd9c410bb675a24f480d 0\tAGENTS.md",
"100644 84f1c45d5992562844466d519011c04946f464eb 0\tCLAUDE.md",
"100644 31ab8b7d44ac38ddceae11094b1a67de6c515649 0\tDECISIONS.md",
"100644 03774676ce916c5b4abc897e17cfd0b38b82ff3c 0\tINTENT.md",
"100644 7e08e28d5f32bdea3a9e1c828ae9f1e21d9edae7 0\tLICENSE",
"100644 c958ede876b319ac9c9a254c1534f86c37009673 0\tMakefile",
"100644 d75037495f97c0d5c43ae94e0afab77c57315d10 0\tQUICKSTART.md",
"100644 c0012eae79f18baaf11a966c3c5c9f3c627f90b2 0\tREADME.md",
"100644 d4b3ea41d327292b492cafa3c6241c32b0b7ebee 0\tSCOPE.md",
"100644 ffbf8bc5fdd53b659ef84e6468dd1d43d745a8bf 0\tWORK-RECORDS.md",
"100644 66667e3d177459af1d44ecc0fd3f1dc56b774450 0\tansible/ansible.cfg",
"100644 7e4719f07dc5d27bfcaa41ad1e8ab328e64024db 0\tansible/bootstrap.yml",
"100644 e4bb7f5d25c74e545d66a550fc636a824226491c 0\tansible/harden.yml",
"100644 da2e3994cdce71d181f361401f125b087ae8b676 0\tansible/hosts.ini.example",
"100644 4e52fd4bbadc00b14e566ea003270b8fa37e79ad 0\tansible/requirements.yml",
"100755 28499688ae41aa60e946bf5b262d401bd55903e7 0\tbin/railiance",
"100644 5261f8886d61c50f4f531a2900a12d0025f73021 0\tcloudinit/user-data.yaml",
"100644 2ca9e9a23dae7f1334002109d6bd3253a34f980f 0\tdocs/CONTRIBUTING.md",
"100644 bc5cda9c1391119aab14b8224d6851aa1546ee9e 0\tdocs/OODA.md",
"100644 0da1fb472a503162151920b4faf58a8851950385 0\tdocs/README.md",
"100644 cbd2d280777a35123a52fae508d6ac095c7cef0c 0\tdocs/app-toml-contract.md",
"100644 5a3f5d96bf2a0b97c143d29c3e0495c94b517640 0\tdocs/backup-restore.md",
"100644 54d4ce16a98292c378af6f89b2bc051b6ff655cb 0\tdocs/canary-helm-template.md",
"100644 800ccefc95212fe5512a51a5e73c9ade0096fcdb 0\tdocs/cluster-resource-evidence.md",
"100644 2dcdf5d96cab063c8bce952f83bff235e700d8bf 0\tdocs/deployment-lifecycle.md",
"100644 28e9604f496b73001fdcdbc4ef1db0b4bdc059b1 0\tdocs/evidence/2026-10-13-publication-diagnosis.json",
"100644 97af3b44c8a4fd65835d72797a35287e46ff7e00 0\tdocs/evidence/2026-10-13-publication-timeout-rollout.json",
"100644 91157a54602517987dbee52dcbd8b4a991b624f5 0\tdocs/evidence/2026-10-13-publication-upload-timings.json",
"100644 69ce806c009c1846c650dc9858110818a07277a6 0\tdocs/evidence/2026-10-13-published-image-pull.json",
"100644 2a82cc9488046edb48213e3665290730d2c6d1bf 0\tdocs/evidence/resource-reef-railiance-k3s/observations/20260822T100349Z.json",
"100644 2a82cc9488046edb48213e3665290730d2c6d1bf 0\tdocs/evidence/resource-reef-railiance-k3s/observations/latest.json",
"100644 8caed08a5d292ca335df7dd2194c5824c1eba792 0\tdocs/first_host.md",
"100644 ad03fad9a435e82d2b95497b44c6d6d6f213df7f 0\tdocs/incidents/2026-03-10-pgpool-missing-secret.md",
"100644 40953976dd249c53fa650d670822216abd07e71c 0\tdocs/keycape-tls-recovery-boundary.md",
"100644 d74014ffa05a656d02356c350948bd7bc6b1f8da 0\tdocs/kubeconfig.md",
"100644 88ef13d70a4006c3adaf0e8acb85c6a131fdc967 0\tdocs/operator-runbook.md",
"100644 ce2e68dd9f76bada355862d08656bef167cfba33 0\tdocs/overlay-repo-pattern.md",
"100644 99ced4683e494209919507cbe633944752f4b0dd 0\tdocs/promote-rollback-onboarding.md",
"100644 7973760dcfd6b5995fb4075778ce5b1f6ebbac9b 0\tdocs/rail-kubernetes-compatibility-shim.md",
"100644 8034f074198be24650bb32cf2b9cf698814bc13f 0\tdocs/rail-kubernetes-extraction-map.md",
"100644 c2c4ca68d39d7da3d19df878600620586239a45f 0\tdocs/rail-kubernetes-substrate-profile.md",
"100644 7390e2a751969b07aa05895e0f5c66077eb28a15 0\tdocs/railiance-run-command.md",
"100644 b6e315b8274adc3caf8d6829ce89f925f9b8bf3a 0\tdocs/stage2-deploy-observe.md",
"100644 dbba0a87e2193472e0e0263665524eb57d334442 0\tdocs/threephoenix-implementation-gate.md",
"100644 d97f37b871efcced405ff0404b5ccce444c88dc8 0\texamples/railiance/app.toml",
"100644 84f399494219054e6c740a1365199f6c4a0d26f2 0\thelm/MOVED.md",
"100644 ca9ccf397fd401bd8a5355d94c66bd4825872f81 0\thelm/gitea-ssh-nodeport.yaml",
"100644 87f4228e1b12449e0cfe8f0257c442e0a1166e3b 0\tinstall/knative/README.md",
"100755 0d6797ce819172a8825d2b866c4a1895203fabc9 0\tinstall/knative/install.sh",
"100644 9245114e677f4f558a89b4af7d4abf023c638709 0\tinstall/knative/overlays/kourier/cpu-requests.patch.yaml",
"100644 4a5501c87b8c0731dbdc15161a6a8f536644b7c8 0\tinstall/knative/overlays/kourier/kustomization.yaml",
"100644 cdac368756da136ffd7d01efe57257f02505a1cf 0\tinstall/knative/overlays/kourier/service-clusterip.patch.yaml",
"100644 8676ab8c8d33a46b4465dd5f971448cc9463b56c 0\tinstall/knative/overlays/serving-core/cpu-requests.patch.yaml",
"100644 6e1be69e25ff00a22f2e50d40c946bc3d982a08b 0\tinstall/knative/overlays/serving-core/kustomization.yaml",
"100644 03cd8fa5a0bbcf1b8db77ab12e4c12d34702ca33 0\tinstall/knative/release-lock.env",
"100755 5e5fd2339f8a26048b13b441097195cb9a55e389 0\tinstall/knative/render.sh",
"100755 49b07865173f1653faf3b420548b8f417a65d504 0\tinstall/knative/verify.sh",
"100644 92232a6dbed33d5926c1732632e55b76272a97a9 0\tinstall/traefik/README.md",
"100644 ada1efe8a4e55b4dff31879c47b0172957e90729 0\tinstall/traefik/railiance01-helmchartconfig.yaml",
"100644 22a977bcb726ad6f9137492331b81f4f8cb2525a 0\tlib/railiance-print.sh",
"100644 687943e1d9115a182de136f6137f6b7911ee2226 0\tpyproject.toml",
"100644 569abe99c95e163d39048f4b02ccb47165751c7e 0\tregistry/README.md",
"100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0\tregistry/capabilities/.gitkeep",
"100644 6b7a5c0633b4a71f201f52c8ebe1e7923f12ac6e 0\tregistry/capabilities/capability.railiance.cluster-bootstrap.md",
"100644 a6161da4395f626569955ef486b981a5cc000853 0\tregistry/indexes/capabilities.yaml",
"100644 21cde4335115ab3071bdc258f5c51a271f92435c 0\tsbom-tools.yaml",
"100644 2ff92a5e869a7c4fee6854f920031731c2ca16f3 0\tschemas/railiance-app.schema.json",
"100644 cd841cad4977c04743955ffee339e7c16a772bbc 0\ttests/smoke_kube.sh",
"100644 aab9ea62a0d4cd139b8cae6b865b3ccb9d6f40df 0\ttests/test_cluster_resources.py",
"100755 add5bbd4b685750021bf01c40ee505ef13ae23c1 0\ttests/test_ha_failover.sh",
"100644 fc295bd80c263c30d99e5547db3fec090db7f78d 0\ttests/test_knative_render.py",
"100644 53b323ec2a5df12a2d61ffbc21b15e1b5e19c9ca 0\ttests/test_public_tls_metadata.py",
"100644 512082e7c84971ef8f51e14a1fded03787757892 0\ttools/README_tools.md",
"100644 9a09669cef3d69d6197faaacb29adbbc61a1b821 0\ttools/build_spore.sh",
"100755 6ebb8be44fe0d54ca69774f26aa604f825c3c2df 0\ttools/cmd/railiance-admin-sync-smoke",
"100755 f7b124bb7cec773441053092c9aa6fa7c22b1ba5 0\ttools/cmd/railiance-backup",
"100755 79fe69ed1e8d8a1c192a2b45bca198c82300c447 0\ttools/cmd/railiance-backup-s2",
"100755 1ef60715ff7abafb2c3cb31d6c9418a516ad7c4b 0\ttools/cmd/railiance-deploy-activity-core-triage-robustness",
"100644 6720eed5e96ebe789f165ed84146d690df5615ef 0\ttools/cmd/railiance-doctor",
"100755 4413b89d57126cfdfc6eb26507181e136b0dc0cb 0\ttools/cmd/railiance-plan-host",
"100755 323e6d1205cb4ed2255ce99a09aa8a65ee32522a 0\ttools/cmd/railiance-preflight",
"100755 0742f2e5b9cdba161875e86ed8310686fc14b499 0\ttools/cmd/railiance-reconcile-activity-core-llm-connect",
"100755 0aa3eb4910886b101bf259c2011250aa023c3ca3 0\ttools/cmd/railiance-restore-s2",
"100755 45c15d93fef3bba542fd95d28c392891330ca027 0\ttools/cmd/railiance-run",
"100755 2961eb8cf6081dc73bca167f09a38f0576528333 0\ttools/cmd/railiance-stage2",
"100755 0aa76e8ca0ca5b46397cddde1879908c3d564d0b 0\ttools/cmd/railiance-stage3",
"100755 5d26e13a3d6b6454cbdef6a09be7048f9846a767 0\ttools/cmd/railiance-verify-activity-core",
"100755 8a44e308bd4a14303eca09fa5e97f1767351902c 0\ttools/create_railiance_overlay_repo.sh",
"100644 83680c80c1afc01ad9ed81f60dd0fcaffede863e 0\ttools/create_railiance_repo.sh",
"100644 df5734ab3b12da40d0e748be27f465852bca5046 0\ttools/furnish_railiance_repo.sh",
"100755 d32abaa70bacbb9ca6446958e6c021a6315231d4 0\ttools/knative-preflight.sh",
"100755 08e5a33490db582444d92945e54f5f2f901adccc 0\ttools/observe_cluster_resources.py",
"100644 b3d429f318a0531fdb9769a75ea6f88c8a2ef84c 0\ttools/public-tls-metadata.py",
"100644 a486165db61a8303e0388bd20d29f08e666687e7 0\ttools/seed_node.sh",
"100644 c25ac23649217e15db35f184e87e07cad1c61891 0\tuv.lock",
"100644 1430ac54fc1bfb099e84cc48cf755714bce77541 0\twiki/RailianceThreePhoenix.md",
"100644 db2b87c5f12d5ca3c60cfa180f098e552a0c4f0d 0\twiki/ThreePhoenixWorkplan.md",
"100644 30a71bcd36f7660a1e9c17baec245f112249a4f5 0\tworkplans/ADHOC-2026-07-27.md",
"100644 43139e0843d52926b963310bf7aacc731e9da073 0\tworkplans/RAIL-BS-WP-0008-activity-core-wp0016-triage-output-deploy.md",
"100644 ea669bd74c15e6ec7ddae8d4ada22981b522561c 0\tworkplans/RAIL-BS-WP-0009-activity-core-admin-sync-smoke.md",
"100644 20270d80de60eddbbadba56e672f15ee71fb067d 0\tworkplans/RAIL-BS-WP-0010-weekly-legacy-meter-review-rollout.md",
"100644 e5526e441cd41dd31f5a969c8d2c5c6d4fad6f7e 0\tworkplans/RAIL-BS-WP-0011-legacy-meter-8h-capture-image-reconcile.md",
"100644 ae22dfb2b9fe831227784dd461bcf78bf2cd11de 0\tworkplans/RAIL-BS-WP-0012-rail-kubernetes-extraction.md",
"100644 525ce5d6caea8929ebc5233bf2053342db3f44b8 0\tworkplans/RAIL-BS-WP-0013-knative-substrate.md",
"100644 868aa948f8fa0d65c1f6fb0587ceb493d991c068 0\tworkplans/RAIL-BS-WP-0014-state-hub-surge-headroom.md",
"100644 6954393976731375ed1570f0c92edbe03892aeb5 0\tworkplans/RAIL-BS-WP-0015-knative-declared-cpu-requests.md",
"100644 555ae300fd36e7db282c51bca21a42217f01af7e 0\tworkplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md",
"100644 f205ac6cb1a0def27715edeb8f9f741f77693f62 0\tworkplans/RCLUSTER-WP-0014-capacity-utilization-and-allocation-evidence.md",
"100644 b2f385967cde17a870a96b6447a1ec3c40213da5 0\tworkplans/RCLUSTER-WP-0016-forgejo-upload-timeout.md",
"100644 bf474d1fc329f4fd547382e32d156fad4bf1fde6 0\tworkplans/RCLUSTER-WP-0017-netkingdom-signer-runtime-storage-review.md",
"100644 78f7319674238fe8afd9f540db48651837f041d3 0\tworkplans/RCLUSTER-WP-0018-keycape-original-tls-recovery.md",
"100644 375d935626d073011f52b8c5929a770b0c5655e1 0\tworkplans/archived/260622-RAIL-BS-WP-0001-dependency-management.md",
"100644 595cd5c19fa88faae24c5ae784d210194af36d61 0\tworkplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md",
"100644 fe7b21da629dd86942be36db4e6fc7e5920f8bc6 0\tworkplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md",
"100644 89d14fff27277d467c896611bb3b26324fef5f4b 0\tworkplans/archived/260622-RAIL-BS-WP-0004-safety-net.md",
"100644 28bf1d4e58420a6d1fab7b44c57b98f0a20ac9e4 0\tworkplans/archived/260622-RAIL-BS-WP-0005-kubeconfig-delivery.md",
"100644 2cf33b46fbae45bba67ec257259a61df4fc3f878 0\tworkplans/archived/260622-RCLUSTER-WP-0001-activity-core-cluster-owned-deploy-verify.md",
"100644 d7e2374c72813c2e3d8bbfc9b9a85bba1af02938 0\tworkplans/archived/260622-RCLUSTER-WP-0002-activity-core-verifier-evidence-hardening.md",
"100644 7f258e7c9b2da1f99fb7e115cd75157e1376ef0a 0\tworkplans/archived/260627-RAIL-BS-WP-0006-staged-promotion-lifecycle.md",
"100644 0944b98107bb5ed99884ef359106bfcf330707e1 0\tworkplans/archived/260701-RCLUSTER-WP-0003-activity-core-llm-connect-live-reconcile.md"
],
"frozen_sha256": {
"workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md": "4dc2f61e15adc3c5c81f9ecf8b933512275b95e8f829fac52ae7cde1385cea4a",
"workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md": "04f787078232395bd2d43861de16c521848559fa286f06e1caa9cb779aa71ac3",
"workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md": "8d6f8533c119117686bc0d5bb9ed5349726aa6c3189ff98b53409c68ac685ca9"
}
}

View file

@ -0,0 +1,22 @@
{
"status": "committed-forward-correction",
"head": "6ae3f847c83da3402883453ee7110457bfb2d0d6",
"parent": "26671d33600e218316d29c9cd020f115ebfb35b2",
"paths": [
"workplans/RCLUSTER-WP-0018-keycape-original-tls-recovery.md",
".custodian-brief.md"
],
"commit_output": "[main 6ae3f84] Record Cluster publication and restore unrelated staged brief\n 2 files changed, 23 insertions(+), 8 deletions(-)\n",
"head_brief_equals_c562": true,
"original_brief_index_and_worktree_restored": true,
"all_other_index_entries_identical": true,
"work_records_index_and_dirty_worktree_preserved": true,
"three_archives_unchanged": true,
"wp18_status": "active",
"task_blocks_and_UUIDs_unchanged": true,
"legacy_deepfix": false,
"history_rewrite": false,
"native_TLS_acceptance": false,
"all18historical_preservation_claim": false,
"status_porcelain": "M .custodian-brief.md\n M WORK-RECORDS.md\n"
}

View file

@ -0,0 +1,77 @@
{
"status": "verified",
"scope": "Cluster WP18 owner publication; read-only Git remote and Hub snapshots",
"writes_to_source_index_refs_or_Hub": false,
"rows": [
{
"repo": "railiance-cluster",
"published_commit": "6ae3f847c83da3402883453ee7110457bfb2d0d6",
"remote": {
"HEAD": "6ae3f847c83da3402883453ee7110457bfb2d0d6",
"refs/heads/main": "6ae3f847c83da3402883453ee7110457bfb2d0d6",
"symbolic_HEAD": "refs/heads/main"
},
"workplan": {
"id": "e0a7813d-c916-5e49-84b2-5e5b30441891",
"slug": "rcluster-wp-0018",
"status": "active"
},
"source_record_id": "RCLUSTER-WP-0018",
"tasks": [
{
"id": "7280193d-0d59-5b78-a2d3-96ebd127127f",
"record_id": "RCLUSTER-WP-0018-T01",
"status": "done"
},
{
"id": "90836435-917f-504c-a711-3f29ece348e3",
"record_id": "RCLUSTER-WP-0018-T02",
"status": "todo"
},
{
"id": "5dfa9a3a-2639-5cf6-b0a4-13eef417d47a",
"record_id": "RCLUSTER-WP-0018-T03",
"status": "wait"
},
{
"id": "021b07bb-65bc-5743-bac5-4294b4be74f6",
"record_id": "RCLUSTER-WP-0018-T04",
"status": "wait"
},
{
"id": "5bc67a22-0991-5625-86a6-f749560d8a0e",
"record_id": "RCLUSTER-WP-0018-T05",
"status": "todo"
}
],
"external_source_declarations_not_projected": [],
"dependencies": [
{
"from_task_id": "021b07bb-65bc-5743-bac5-4294b4be74f6",
"to_task_id": "5dfa9a3a-2639-5cf6-b0a4-13eef417d47a",
"relationship_type": "starts_after"
},
{
"from_task_id": "021b07bb-65bc-5743-bac5-4294b4be74f6",
"to_task_id": "90836435-917f-504c-a711-3f29ece348e3",
"relationship_type": "starts_after"
},
{
"from_task_id": "5dfa9a3a-2639-5cf6-b0a4-13eef417d47a",
"to_task_id": "90836435-917f-504c-a711-3f29ece348e3",
"relationship_type": "starts_after"
}
],
"source_file_sha256": "96d52b6dbae056399159632d50b32ccc6662e4f6d3677af154f7c8a3d618334b",
"source_file_unchanged": true,
"dependency_scope": "internal edges verified; external source target identities checked without claiming projected external edges",
"index_stat_unchanged": true
}
],
"hub_instance": {
"status": "ok",
"instance_role": "primary",
"instance_label": "railiance01"
},
"verifier_sha256": "ccf1776a2a8b3de5b1cc75f90ba4c10fbf8ade1b79fa4ba721be1c908be11d7d"
}

View file

@ -0,0 +1,246 @@
{
"ok": true,
"status": "applied",
"repo_slug": "railiance-cluster",
"commit": "6ae3f847c83da3402883453ee7110457bfb2d0d6",
"requests": 2,
"elapsed_ms": 6624.2,
"git": {
"upstream": "origin/main",
"behind": 0,
"ahead": 0
},
"identifiers": {
"schema": "repo-manager.identifier-assignment.v1",
"ok": true,
"executed": true,
"repo": "railiance-cluster",
"namespace": "helixforge",
"assignments": [],
"historical_invalid_identifiers": [
{
"kind": "task",
"id": "T01",
"source": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-1"
},
{
"kind": "task",
"id": "T02",
"source": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-2"
},
{
"kind": "task",
"id": "T03",
"source": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-3"
},
{
"kind": "task",
"id": "T04",
"source": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-4"
},
{
"kind": "task",
"id": "T05",
"source": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-5"
},
{
"kind": "task",
"id": "T01",
"source": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-1"
},
{
"kind": "task",
"id": "T02",
"source": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-2"
},
{
"kind": "task",
"id": "T03",
"source": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-3"
},
{
"kind": "task",
"id": "T04",
"source": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-4"
},
{
"kind": "task",
"id": "T01",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-1"
},
{
"kind": "task",
"id": "T02",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-2"
},
{
"kind": "task",
"id": "T03",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-3"
},
{
"kind": "task",
"id": "T04",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-4"
},
{
"kind": "task",
"id": "T05",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-5"
},
{
"kind": "task",
"id": "T06",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-6"
}
],
"historical_identity_collisions": [
{
"kind": "task",
"id": "T01",
"uuid": null,
"sources": [
"workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-1",
"workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-1",
"workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-1"
],
"parent_id": "RAIL-BS-WP-0002",
"uuids": [
"3f042630-eab0-4c6a-9167-e2b28ff20e40",
"4526a842-ea31-4874-9231-92ab556cfe7b",
"6841c93a-f146-47eb-9f7c-8fa0e02c1bbc"
]
},
{
"kind": "task",
"id": "T02",
"uuid": null,
"sources": [
"workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-2",
"workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-2",
"workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-2"
],
"parent_id": "RAIL-BS-WP-0002",
"uuids": [
"a6313e06-1976-46a7-8e31-df4eb2eca880",
"ab166073-30a7-4702-a037-4091e8706e20",
"e8510646-46ed-4697-a345-f3d3009eea78"
]
},
{
"kind": "task",
"id": "T03",
"uuid": null,
"sources": [
"workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-3",
"workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-3",
"workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-3"
],
"parent_id": "RAIL-BS-WP-0002",
"uuids": [
"05d42a55-921f-4aa7-bb76-e8af9c7e0ac3",
"140da396-8e30-4f4d-b88c-c42c0cd46c01",
"dab2c07f-8aa0-4635-8df6-857e87e93fc5"
]
},
{
"kind": "task",
"id": "T04",
"uuid": null,
"sources": [
"workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-4",
"workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-4",
"workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-4"
],
"parent_id": "RAIL-BS-WP-0002",
"uuids": [
"08233868-d522-4117-bc4e-6c0f52545665",
"5c3d40e4-239b-488e-9519-6f7a38d2325f",
"d8a3ba40-fda0-4c1f-a9f1-ffcd621a5b3d"
]
},
{
"kind": "task",
"id": "T05",
"uuid": null,
"sources": [
"workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-5",
"workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-5"
],
"parent_id": "RAIL-BS-WP-0002",
"uuids": [
"2d5acff7-4a4e-4ddd-ad06-08237ad3dac8",
"7f9e0e58-a130-467a-a2d0-b3f2564e496f"
]
}
],
"files_changed": []
},
"receipt": {
"schema": "state-hub.repository-projection-reconcile.v1",
"instance_role": "primary",
"instance_label": "railiance01",
"expected_commit": "6ae3f847c83da3402883453ee7110457bfb2d0d6",
"derived_commit": "6ae3f847c83da3402883453ee7110457bfb2d0d6",
"outcome": {
"schema": "state-hub.projection-reset.v1",
"repo_slug": "railiance-cluster",
"commit": "6ae3f847c83da3402883453ee7110457bfb2d0d6",
"status": "applied",
"counts": {
"created": 0,
"updated": 20,
"retired": 0,
"refused": 0,
"released": 0,
"created_tasks": 0,
"updated_tasks": 1,
"cancelled_tasks": 0,
"created_edges": 0,
"removed_edges": 0,
"unresolved_edges": 0,
"external_edges": 0
},
"created": [],
"updated": [
"RAIL-BS-WP-0001",
"RAIL-BS-WP-0005",
"RAIL-BS-WP-0006",
"RAIL-BS-WP-0008",
"RAIL-BS-WP-0009",
"RAIL-BS-WP-0010",
"RAIL-BS-WP-0011",
"RAIL-BS-WP-0012",
"RAIL-BS-WP-0013",
"RAIL-BS-WP-0014",
"RAIL-BS-WP-0015",
"RCLUSTER-WP-0001",
"RCLUSTER-WP-0002",
"RCLUSTER-WP-0003",
"RCLUSTER-WP-0007",
"RCLUSTER-WP-0014",
"RCLUSTER-WP-0016",
"RCLUSTER-WP-0017",
"RCLUSTER-WP-0018",
"RCLUSTER-WP-ADHOC-2026-07-27"
],
"retired": [],
"released": [],
"created_tasks": [],
"updated_tasks": [
"RCLUSTER-WP-0018-T01"
],
"cancelled_tasks": [],
"created_edges": [],
"removed_edges": [],
"unresolved_edges": [],
"external_edges": [],
"refused": [],
"notes": [
"Preserved bound historical row and task UUIDs: RAIL-BS-WP-0002",
"Preserved bound historical row and task UUIDs: RAIL-BS-WP-0003",
"Preserved bound historical row and task UUIDs: RAIL-BS-WP-0004"
]
}
}
}

View file

@ -0,0 +1,60 @@
--- a/workplans/RCLUSTER-WP-0018-keycape-original-tls-recovery.md
+++ b/workplans/RCLUSTER-WP-0018-keycape-original-tls-recovery.md
@@ -43,6 +43,26 @@
Evidence: the-custodian docs/changes/netkingdom-target-2026-10-16/
recovery-owner-handoffs-r1/ and prior recovery-attempt-r1/t35-t36-source-next/.
+
+Publication return, 2026-10-17: normal owner source publication at
+c562d7134c38679952a8ffd17a8a893a900aef0d was applied on primary/railiance01
+with expected and derived commits equal. Read-only source/remote/Hub proof
+verified this workplan's five exact task ID/UUID/status bindings and three
+internal dependency edges. Receipts are retained in the Custodian packet
+docs/changes/netkingdom-target-2026-10-17/railiance-cluster-projection.json and
+cluster-publication-readback.json. The later legitimate C23 lifecycle repair
+at 26671d33600e218316d29c9cd020f115ebfb35b2 changed ready to active; active
+is retained. This return records publication separately from the completed
+source preparation above. Original TLS artifact/provider custody, extraction
+and native admission remain T02–T05 obligations; publication proves no TLS
+recovery, private-key custody or native acceptance.
+
+The whole maintenance pipeline's historical-row guard failed for three parent
+rows while 15 task full-row hashes remained unchanged. STATE-WP-0095-T07 and
+RMGR-WP-0019-T06 remain wait; neither publication nor this memo asserts full
+historical-row preservation or restoration. The subsequent forward correction
+restores the brief's committed content to its pre-accident version while restoring
+the original staged/worktree change for its owner; history is not rewound. No legacy deep consistency fix is run by the correction.
## Establish exact independent original TLS artifact and provider custody metadata
--- a/.custodian-brief.md
+++ b/.custodian-brief.md
@@ -2,7 +2,7 @@
# Custodian Brief — railiance-cluster
**Domain:** financials
-**Last synced:** 2026-10-16 19:05 UTC
+**Last synced:** 2026-10-13 18:24 UTC
**State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)*
## Current Goal
@@ -11,17 +11,12 @@
## Active Workstreams
-### Review NetKingdom signer runtime and node-local storage readiness
-Progress: 1/3 done | workplan_id: `f383557d-c8a8-553e-adcd-9f82ff9c2929`
-
-**Open tasks:**
-- ► Review the bounded native preflight and storage action `7f4320c6`
-- · Verify the approved runtime and storage result `747a8d77`
+*(none — repo may need first-session setup)*
## Inbox Hygiene
**Stale unread:** 6 message(s) older than 3 day(s) — triage at session start.
-**Missing thread_id:** 8 unread message(s) lack supersession chains.
+**Missing thread_id:** 6 unread message(s) lack supersession chains.
- ! the-custodian: Workplan 'three-phoenix-ha-cluster' is blocked with no wait task `a1368d99`
---

View file

@ -0,0 +1,28 @@
{
"status": "prepared-not-applied",
"base": "26671d33600e218316d29c9cd020f115ebfb35b2",
"restore_brief_from_commit": "c562d7134c38679952a8ffd17a8a893a900aef0d",
"paths": [
"workplans/RCLUSTER-WP-0018-keycape-original-tls-recovery.md",
".custodian-brief.md"
],
"files": {
"WP18.preimage.md": "ec6213ddedd82a872f727ba030268d253ffbc8363e56df8b0f85c8d2168f1a49",
"WP18.candidate.md": "96d52b6dbae056399159632d50b32ccc6662e4f6d3677af154f7c8a3d618334b",
"brief.committed-preimage.md": "973c36a552854aa801708aecf45f80d07ce2215dfc7bfa58e1ab8c9e78b2de67",
"brief.forward-restore.md": "ce9a06a6e85437781f090615d989b82cb1fa2e8c509ed0dd99b6dc28152128b5",
"forward-correction.patch": "a50c419c4ab3a35a6f953559546c88fe0cfb75605ef63b51fe30307180262610"
},
"original_backup": "../railiance-cluster-publication-backup",
"original_backup_sha256": {
"originals.json": "009ec3ff5b3e4556ec06a363e6b4e43c6d58d97796258b4a06974932fd3ca1d2",
".custodian-brief.md.worktree": "973c36a552854aa801708aecf45f80d07ce2215dfc7bfa58e1ab8c9e78b2de67",
"WORK-RECORDS.md.worktree": "37bc7e5d2c28f62776189db3d89b5d238931a683d8b05ddae39c8f42f9778cce"
},
"brief_original_index_entry": "100644 86c0e6c7306f54aebda9b59c7e3b72e4ab3e75ba 0\t.custodian-brief.md\n",
"workplan_task_blocks_UUIDs_and_statuses_unchanged": true,
"workplan_status_retained": "active",
"legacy_deepfix": false,
"history_rewrite": false,
"all18preservation_claim": false
}

View file

@ -0,0 +1,30 @@
{
"status": "forward-correction-published-verified",
"head": "6ae3f847c83da3402883453ee7110457bfb2d0d6",
"parent": "26671d33600e218316d29c9cd020f115ebfb35b2",
"paths": [
"workplans/RCLUSTER-WP-0018-keycape-original-tls-recovery.md",
".custodian-brief.md"
],
"HEAD_brief_restored_to_c562": true,
"original_brief_staged_entry_and_worktree_exact": true,
"staged_brief_change_visible_again": true,
"original_WORK_RECORDS_dirty_worktree_and_index_exact": true,
"three_archive_hashes_unchanged": true,
"normal_fast_sync_applied_primary": true,
"five_task_three_edge_active_readback_verified": true,
"history_rewrite": false,
"legacy_deepfix": false,
"all18historical_preservation_or_restoration_claim": false,
"native_TLS_acceptance": false,
"files": {
"manifest.json": "9ac8f5e43f84add61ec8560be78e4d10e55bdd2918467581f367e816a4592385",
"execution-plan.json": "c374c9299bf30b5a746955e7ab3f883d76350a4eb0823f26ff5abccab1d5e69c",
"apply_forward_correction.py": "02b028822e07cc1612a2e5dea3c9f271f0020f9adfb656c0aac42555b0805502",
"forward-correction.patch": "a50c419c4ab3a35a6f953559546c88fe0cfb75605ef63b51fe30307180262610",
"forward-correction-commit.json": "d93f1d84b052b786332bc2238301cecf9d68f5a73d5ddc1376f25c859a765ed8",
"forward-correction-sync.json": "e022e5f8b92d154babe76de39dbc799d4cb04d4349f8642ed69f8587de18cb58",
"verify_forward_publication.py": "ccf1776a2a8b3de5b1cc75f90ba4c10fbf8ade1b79fa4ba721be1c908be11d7d",
"forward-correction-publication-readback.json": "cd1903b634511da269d19dd6d367482933ce06a175f8392db82b5655bd1b1de0"
}
}

View file

@ -0,0 +1,140 @@
#!/usr/bin/env python3
"""Read-only Git+Hub task binding verifier; never syncs or changes source/index."""
import hashlib
import json
import os
from pathlib import Path
import re
import subprocess
import urllib.request
HERE=Path(__file__).resolve().parent
OWNERS=[{'repo':'railiance-cluster','commit':'6ae3f847c83da3402883453ee7110457bfb2d0d6','path':'workplans/RCLUSTER-WP-0018-keycape-original-tls-recovery.md','id':'RCLUSTER-WP-0018','tasks':5}]
API=os.environ.get('API_BASE','http://127.0.0.1:8000').rstrip('/')
EXTERNAL={'STATE-WP-0095-T03':'e8566341-cf6e-5b9c-ad80-8564d14cd52a','STATE-WP-0095-T06':'6af973b4-1964-5d4d-a2f8-8dbd4c01fda4','NK-WP-0049-T33':'56c8d469-7a10-5d50-a30e-95cbf3cd4756'}
class Refused(Exception):pass
def git(root,*args):
result=subprocess.run(['git','--no-optional-locks','-C',str(root),*args],
capture_output=True,timeout=30,check=False)
if result.returncode:raise Refused('read-only-git-failed')
return result.stdout
def field(text,key):
values=re.findall(r'^'+re.escape(key)+r':\s*(.*?)\s*$',text,re.M)
if len(values)!=1:raise Refused('source-field-ambiguous')
return values[0].strip('"\'')
def source(text):
header=text.split('---',2)[1]
tasks=[]
for block in re.findall(r'```task\n(.*?)\n```',text,re.S):
deps=re.findall(r'^depends_on:\s*\[(.*?)\]',block,re.M)
tasks.append({'record_id':field(block,'id'),'id':field(block,'state_hub_task_id'),
'status':field(block,'status'),'dependencies':[x.strip() for x in deps[0].split(',') if x.strip()] if deps else []})
return {'id':field(header,'state_hub_workstream_id'),'source_record_id':field(header,'id'),
'slug':field(header,'id').lower(),
'status':field(header,'status'),'tasks':tasks}
def get(path):
class NoRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self,*args,**kwargs):raise Refused('hub-redirect-refused')
opener=urllib.request.build_opener(urllib.request.ProxyHandler({}),NoRedirect)
with opener.open(urllib.request.Request(API+path,method='GET'),timeout=20) as response:
data=response.read(8*1024**2+1)
if len(data)>8*1024**2:raise Refused('hub-read-limit')
return json.loads(data)
def index_stat(root):
raw=git(root,'rev-parse','--git-path','index').decode().strip();path=Path(raw)
if not path.is_absolute():path=root/path
try:item=path.lstat()
except FileNotFoundError:return None
return [item.st_dev,item.st_ino,item.st_size,item.st_mtime_ns,item.st_mode]
def remote(root,expected,repo):
if git(root,'remote','get-url','origin').decode().strip()!='forgejo-remote:coulomb/'+repo+'.git':
raise Refused('remote-route-drift')
lines=git(root,'ls-remote','--symref','origin','HEAD','refs/heads/main').decode().splitlines()
if set(lines)!={'ref: refs/heads/main\tHEAD',expected+'\tHEAD',expected+'\trefs/heads/main'}:
raise Refused('remote-head-mismatch')
return {'HEAD':expected,'refs/heads/main':expected,'symbolic_HEAD':'refs/heads/main'}
def verify():
result={'status':'unverified','scope':'Cluster WP18 owner publication; read-only Git remote and Hub snapshots',
'writes_to_source_index_refs_or_Hub':False,'rows':[]}
try:
if API not in {'http://127.0.0.1:8000','http://127.0.0.1:18080','http://10.43.68.154:8000'}:
raise Refused('unrecognized-hub-endpoint')
health=get('/state/health')
result['hub_instance']={key:health.get(key) for key in ('status','instance_role','instance_label')}
if result['hub_instance']!={'status':'ok','instance_role':'primary','instance_label':'railiance01'}:
raise Refused('hub-identity-mismatch')
for owner in OWNERS:
root=Path('/home/worsch')/owner['repo'];before_index=index_stat(root)
if git(root,'rev-parse','HEAD').decode().strip()!=owner['commit']:
raise Refused('local-head-drift')
committed=git(root,'show',owner['commit']+':'+owner['path'])
local=(root/owner['path']).read_bytes()
if local!=committed:raise Refused('published-workplan-local-drift')
expected=source(committed.decode())
if expected['source_record_id']!=owner['id'] or len(expected['tasks'])!=owner['tasks']:
raise Refused('source-task-denominator-mismatch')
snapshot=get('/repos/'+owner['repo']+'/work-record-projection/snapshot')
plans=[row for row in snapshot['workplans'] if row['id']==expected['id']]
if len(plans)!=1 or any(plans[0].get(key)!=expected[key] for key in ('id','slug','status')):
raise Refused('workplan-binding-mismatch')
projected=[row for row in snapshot['tasks']
if row.get('workplan_id',row.get('workstream_id'))==expected['id']]
if len(projected)!=len(expected['tasks']):raise Refused('projected-task-denominator-mismatch')
byid={row['id']:row for row in projected}
if len(byid)!=len(projected):raise Refused('duplicate-projected-uuid')
observed=[]
for task in expected['tasks']:
row=byid.get(task['id'],{})
if any(row.get(key)!=task[key] for key in ('id','record_id','status')):
raise Refused('task-id-uuid-status-mismatch')
observed.append({key:row[key] for key in ('id','record_id','status')})
identifiers={task['record_id']:task['id'] for task in expected['tasks']}
edges={(task['id'],identifiers[dep],'starts_after') for task in expected['tasks'] for dep in task['dependencies'] if dep in identifiers}
actual=[edge for edge in snapshot['dependencies'] if edge['from_workplan_id']==expected['id']]
projected_edges={(edge.get('from_task_id'),edge.get('to_task_id'),edge['relationship_type']) for edge in actual}
if len(actual)!=len(edges) or projected_edges!=edges:
raise Refused('dependency-binding-mismatch')
# Unchanged exact three edges retain their original creation commit.
if any(edge.get('source_commit') not in (None,owner['commit']) and not (edge.get('source_commit')=='c562d7134c38679952a8ffd17a8a893a900aef0d' and edge.get('source_owner')=='forge:railiance-cluster') for edge in actual):
raise Refused('dependency-source-commit-mismatch')
for task in expected['tasks']:
for dep in task['dependencies']:
if dep in EXTERNAL:
target=get('/tasks/'+EXTERNAL[dep])
if target.get('id')!=EXTERNAL[dep] or target.get('record_id')!=dep:
raise Refused('external-dependency-target-mismatch')
remote_readback=remote(root,owner['commit'],owner['repo'])
if index_stat(root)!=before_index or (root/owner['path']).read_bytes()!=local:
raise Refused('source-or-index-stat-changed')
result['rows'].append({'repo':owner['repo'],'published_commit':owner['commit'],
'remote':remote_readback,'workplan':{key:plans[0][key] for key in ('id','slug','status')},
'source_record_id':expected['source_record_id'],
'tasks':observed,'external_source_declarations_not_projected':[{'from_task_id':task['id'],'target_record_id':dep,'target_uuid':EXTERNAL[dep]} for task in expected['tasks'] for dep in task['dependencies'] if dep in EXTERNAL],'dependencies':[{'from_task_id':a,'to_task_id':b,'relationship_type':c} for a,b,c in sorted(edges)],
'source_file_sha256':hashlib.sha256(local).hexdigest(),'source_file_unchanged':True,'dependency_scope':'internal edges verified; external source target identities checked without claiming projected external edges',
'index_stat_unchanged':True})
result['status']='verified'
except Exception as error:
result['reason']=error.args[0] if isinstance(error,Refused) else 'readback-unavailable'
result['verifier_sha256']=hashlib.sha256(Path(__file__).read_bytes()).hexdigest()
(HERE/'forward-correction-publication-readback.json').write_text(json.dumps(result,indent=2)+'\n')
print(json.dumps({'status':result['status'],'owners':len(result['rows'])}))
return 0 if result['status']=='verified' else 2
if __name__=='__main__':raise SystemExit(verify())

View file

@ -0,0 +1,77 @@
{
"status": "verified",
"scope": "Cluster WP18 owner publication; read-only Git remote and Hub snapshots",
"writes_to_source_index_refs_or_Hub": false,
"rows": [
{
"repo": "railiance-cluster",
"published_commit": "c562d7134c38679952a8ffd17a8a893a900aef0d",
"remote": {
"HEAD": "c562d7134c38679952a8ffd17a8a893a900aef0d",
"refs/heads/main": "c562d7134c38679952a8ffd17a8a893a900aef0d",
"symbolic_HEAD": "refs/heads/main"
},
"workplan": {
"id": "e0a7813d-c916-5e49-84b2-5e5b30441891",
"slug": "rcluster-wp-0018",
"status": "ready"
},
"source_record_id": "RCLUSTER-WP-0018",
"tasks": [
{
"id": "7280193d-0d59-5b78-a2d3-96ebd127127f",
"record_id": "RCLUSTER-WP-0018-T01",
"status": "done"
},
{
"id": "90836435-917f-504c-a711-3f29ece348e3",
"record_id": "RCLUSTER-WP-0018-T02",
"status": "todo"
},
{
"id": "5dfa9a3a-2639-5cf6-b0a4-13eef417d47a",
"record_id": "RCLUSTER-WP-0018-T03",
"status": "wait"
},
{
"id": "021b07bb-65bc-5743-bac5-4294b4be74f6",
"record_id": "RCLUSTER-WP-0018-T04",
"status": "wait"
},
{
"id": "5bc67a22-0991-5625-86a6-f749560d8a0e",
"record_id": "RCLUSTER-WP-0018-T05",
"status": "todo"
}
],
"external_source_declarations_not_projected": [],
"dependencies": [
{
"from_task_id": "021b07bb-65bc-5743-bac5-4294b4be74f6",
"to_task_id": "5dfa9a3a-2639-5cf6-b0a4-13eef417d47a",
"relationship_type": "starts_after"
},
{
"from_task_id": "021b07bb-65bc-5743-bac5-4294b4be74f6",
"to_task_id": "90836435-917f-504c-a711-3f29ece348e3",
"relationship_type": "starts_after"
},
{
"from_task_id": "5dfa9a3a-2639-5cf6-b0a4-13eef417d47a",
"to_task_id": "90836435-917f-504c-a711-3f29ece348e3",
"relationship_type": "starts_after"
}
],
"source_file_sha256": "ca521f5330dfd42d22f6ee92774e036d0d3c85e33ebbd27ea89e4be2b3f62b5c",
"source_file_unchanged": true,
"dependency_scope": "internal edges verified; external source target identities checked without claiming projected external edges",
"index_stat_unchanged": true
}
],
"hub_instance": {
"status": "ok",
"instance_role": "primary",
"instance_label": "railiance01"
},
"verifier_sha256": "a0687ae6e05a6faf4efd2122c9ebd9f9a25a8cfb936741c8971295bb029abb1f"
}

View file

@ -0,0 +1,553 @@
{
"repo_slug": "railiance-cluster",
"repo_path": "/home/worsch/railiance-cluster",
"source_revision": "c562d7134c38679952a8ffd17a8a893a900aef0d",
"source_revision_reason": null,
"issues": [
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager warning: .repo-classification.yaml: category is project but slug is not prj-*; not every category:project is a prj- repo",
"file_path": ".repo-classification.yaml",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-1: task id 'T01' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-1",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-2: task id 'T02' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-2",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-3: task id 'T03' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-3",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-4: task id 'T04' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-4",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-5: task id 'T05' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-5",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-1: task id 'T01' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-1",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-2: task id 'T02' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-2",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-3: task id 'T03' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-3",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-4: task id 'T04' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-4",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-1: task id 'T01' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-1",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-2: task id 'T02' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-2",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-3: task id 'T03' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-3",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-4: task id 'T04' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-4",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-5: task id 'T05' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-5",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-6: task id 'T06' is not accepted by the canon kind registry",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-6",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-1: task 'T01' has conflicting UUID assignments at ['workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-1', 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-1', 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-1']",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-1",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-2: task 'T02' has conflicting UUID assignments at ['workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-2', 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-2', 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-2']",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-2",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-3: task 'T03' has conflicting UUID assignments at ['workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-3', 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-3', 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-3']",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-3",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-4: task 'T04' has conflicting UUID assignments at ['workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-4', 'workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-4', 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-4']",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-4",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-35",
"message": "Repo Manager contradictory: workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-5: task 'T05' has conflicting UUID assignments at ['workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-5', 'workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-5']",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-5",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-33",
"message": "WORK-RECORDS.md is missing or stale \u2014 regenerate via fix-consistency (CUST-WP-0061-T04 generated work-record index)",
"file_path": "WORK-RECORDS.md",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": true
},
{
"severity": "WARN",
"check_id": "C-23",
"message": "Lifecycle drift in 'rcluster-wp-0018': workplan status 'ready' has an active task \u2014 repair to 'active'",
"file_path": "workplans/RCLUSTER-WP-0018-keycape-original-tls-recovery.md",
"db_id": "e0a7813d-c916-5e49-84b2-5e5b30441891",
"file_value": "ready",
"db_value": "ready",
"fixable": true
},
{
"severity": "WARN",
"check_id": "C-34",
"message": "status=ready without quality_dor DoR-Ok \u2014 process claim without DoR assessment (soft; see docs/work-record-quality-gates.md)",
"file_path": "workplans/RCLUSTER-WP-0018-keycape-original-tls-recovery.md",
"db_id": "",
"file_value": "unassessed",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-39",
"message": "Human wait task 'RCLUSTER-WP-0018-T04' in workplan 'RCLUSTER-WP-0018' has needs_human: true without decision_id \u2014 unrouted human gate",
"file_path": "workplans/RCLUSTER-WP-0018-keycape-original-tls-recovery.md#RCLUSTER-WP-0018-T04",
"db_id": "",
"file_value": "needs_human: true",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'rail-bs-wp-0008-activity-core-wp0016-triage-output-deploy@retired-20260828' (id=f2ca1a5d\u2026, status=archived) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "f2ca1a5d-4dd6-42ea-8003-969c7265f891",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'rail-bs-wp-0009-activity-core-admin-sync-smoke@retired-20260828' (id=366eec46\u2026, status=archived) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "366eec46-3139-4810-ace6-ea75750fe821",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Closed DB workstream 'rail-bs-wp-0008' (id=5032c55c\u2026, status=finished) has no backing workplan file",
"file_path": "",
"db_id": "5032c55c-2ee2-4b7e-b1eb-157f0f8ac647",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'railiance-wp-0014@retired-20260826' (id=a152ddda\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "a152ddda-d60a-4a65-9b9c-59e2db9ff2b7",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'railiance-wp-0012@retired-20260826' (id=6434f7cb\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "6434f7cb-e13c-4c05-839b-197bb239d5cd",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'railiance-wp-0013@retired-20260826' (id=a3abb83a\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "a3abb83a-2d42-40f9-a5f6-1dbc36903436",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'rail-bs-rcluster-wp-adhoc-2026-07-27@retired-20260828' (id=b37f3c6e\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "b37f3c6e-a9e5-58c2-84ec-77ef2a2978a7",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "INFO",
"check_id": "C-08",
"message": "Retired DB workstream 'rail-bs-adhoc-2026-07-27@retired-20260828' (id=9a77bc91\u2026, status=finished) has no backing workplan file \u2014 projection tombstone, not live work",
"file_path": "",
"db_id": "9a77bc91-f457-5545-996f-04f49707f54b",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-28",
"message": "8 unread inbox message(s) older than 3 day(s): railiance-platform:0c1023ce, railiance-platform:f643ce05, prj-forgejo-org-refactor:be06609c, prj-forgejo-org-refactor:6eac8c3f, prj-forgejo-org-refactor:82225aca, ...",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-28",
"message": "8 unread message(s) lack thread_id for supersession tracking: railiance-platform:0c1023ce, railiance-platform:f643ce05, prj-forgejo-org-refactor:be06609c, prj-forgejo-org-refactor:6eac8c3f, prj-forgejo-org-refactor:82225aca",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-29",
"message": "Unread work request from railiance-platform (f643ce05) may need a workplan file: RPF56: implement native JWT consumer-group mapping for Playwright",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-29",
"message": "Unread work request from the-custodian (a1368d99) may need a workplan file: Workplan 'three-phoenix-ha-cluster' is blocked with no wait task",
"file_path": "",
"db_id": "",
"file_value": "",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-26",
"message": "Workplan id 'RCLUSTER-WP-0007' uses prefix 'RCLUSTER-WP' but repo canonical prefix is 'RAIL-BS-WP' \u2014 new plans must conform",
"file_path": "workplans/RCLUSTER-WP-0007-threephoenix-ha-cluster.md",
"db_id": "",
"file_value": "RCLUSTER-WP-0007",
"db_value": "RAIL-BS-WP",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-26",
"message": "Workplan id 'RCLUSTER-WP-0014' uses prefix 'RCLUSTER-WP' but repo canonical prefix is 'RAIL-BS-WP' \u2014 new plans must conform",
"file_path": "workplans/RCLUSTER-WP-0014-capacity-utilization-and-allocation-evidence.md",
"db_id": "",
"file_value": "RCLUSTER-WP-0014",
"db_value": "RAIL-BS-WP",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-26",
"message": "Workplan id 'RCLUSTER-WP-0016' uses prefix 'RCLUSTER-WP' but repo canonical prefix is 'RAIL-BS-WP' \u2014 new plans must conform",
"file_path": "workplans/RCLUSTER-WP-0016-forgejo-upload-timeout.md",
"db_id": "",
"file_value": "RCLUSTER-WP-0016",
"db_value": "RAIL-BS-WP",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-26",
"message": "Workplan id 'RCLUSTER-WP-0017' uses prefix 'RCLUSTER-WP' but repo canonical prefix is 'RAIL-BS-WP' \u2014 new plans must conform",
"file_path": "workplans/RCLUSTER-WP-0017-netkingdom-signer-runtime-storage-review.md",
"db_id": "",
"file_value": "RCLUSTER-WP-0017",
"db_value": "RAIL-BS-WP",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-26",
"message": "Workplan id 'RCLUSTER-WP-0018' uses prefix 'RCLUSTER-WP' but repo canonical prefix is 'RAIL-BS-WP' \u2014 new plans must conform",
"file_path": "workplans/RCLUSTER-WP-0018-keycape-original-tls-recovery.md",
"db_id": "",
"file_value": "RCLUSTER-WP-0018",
"db_value": "RAIL-BS-WP",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-26",
"message": "Workplan id 'RCLUSTER-WP-0001' uses prefix 'RCLUSTER-WP' but repo canonical prefix is 'RAIL-BS-WP' \u2014 new plans must conform",
"file_path": "workplans/archived/260622-RCLUSTER-WP-0001-activity-core-cluster-owned-deploy-verify.md",
"db_id": "",
"file_value": "RCLUSTER-WP-0001",
"db_value": "RAIL-BS-WP",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-26",
"message": "Workplan id 'RCLUSTER-WP-0002' uses prefix 'RCLUSTER-WP' but repo canonical prefix is 'RAIL-BS-WP' \u2014 new plans must conform",
"file_path": "workplans/archived/260622-RCLUSTER-WP-0002-activity-core-verifier-evidence-hardening.md",
"db_id": "",
"file_value": "RCLUSTER-WP-0002",
"db_value": "RAIL-BS-WP",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-26",
"message": "Workplan id 'RCLUSTER-WP-0003' uses prefix 'RCLUSTER-WP' but repo canonical prefix is 'RAIL-BS-WP' \u2014 new plans must conform",
"file_path": "workplans/archived/260701-RCLUSTER-WP-0003-activity-core-llm-connect-live-reconcile.md",
"db_id": "",
"file_value": "RCLUSTER-WP-0003",
"db_value": "RAIL-BS-WP",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-27",
"message": "Workplan id 'RAIL-BS-WP-0008' collides across repos: railiance-bootstrap/RAIL-BS-WP-0008-activity-core-wp0016-triage-output-deploy.md, railiance-cluster/RAIL-BS-WP-0008-activity-core-wp0016-triage-output-deploy.md",
"file_path": "workplans/RAIL-BS-WP-0008-activity-core-wp0016-triage-output-deploy.md",
"db_id": "",
"file_value": "RAIL-BS-WP-0008",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-27",
"message": "Workplan id 'RAIL-BS-WP-0009' collides across repos: railiance-bootstrap/RAIL-BS-WP-0009-activity-core-admin-sync-smoke.md, railiance-cluster/RAIL-BS-WP-0009-activity-core-admin-sync-smoke.md",
"file_path": "workplans/RAIL-BS-WP-0009-activity-core-admin-sync-smoke.md",
"db_id": "",
"file_value": "RAIL-BS-WP-0009",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-27",
"message": "Workplan id 'RAIL-BS-WP-0001' collides across repos: railiance-bootstrap/260622-RAIL-BS-WP-0001-dependency-management.md, railiance-cluster/260622-RAIL-BS-WP-0001-dependency-management.md",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0001-dependency-management.md",
"db_id": "",
"file_value": "RAIL-BS-WP-0001",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-27",
"message": "Workplan id 'RAIL-BS-WP-0002' collides across repos: railiance-bootstrap/260622-RAIL-BS-WP-0002-k3s-baseline.md, railiance-cluster/260622-RAIL-BS-WP-0002-k3s-baseline.md",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md",
"db_id": "",
"file_value": "RAIL-BS-WP-0002",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-27",
"message": "Workplan id 'RAIL-BS-WP-0003' collides across repos: railiance-bootstrap/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md, railiance-cluster/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md",
"db_id": "",
"file_value": "RAIL-BS-WP-0003",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-27",
"message": "Workplan id 'RAIL-BS-WP-0004' collides across repos: railiance-bootstrap/260622-RAIL-BS-WP-0004-safety-net.md, railiance-cluster/260622-RAIL-BS-WP-0004-safety-net.md",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md",
"db_id": "",
"file_value": "RAIL-BS-WP-0004",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-27",
"message": "Workplan id 'RAIL-BS-WP-0005' collides across repos: railiance-bootstrap/260622-RAIL-BS-WP-0005-kubeconfig-delivery.md, railiance-cluster/260622-RAIL-BS-WP-0005-kubeconfig-delivery.md",
"file_path": "workplans/archived/260622-RAIL-BS-WP-0005-kubeconfig-delivery.md",
"db_id": "",
"file_value": "RAIL-BS-WP-0005",
"db_value": "",
"fixable": false
},
{
"severity": "WARN",
"check_id": "C-27",
"message": "Workplan id 'RAIL-BS-WP-0006' collides across repos: railiance-bootstrap/260627-RAIL-BS-WP-0006-staged-promotion-lifecycle.md, railiance-cluster/260627-RAIL-BS-WP-0006-staged-promotion-lifecycle.md",
"file_path": "workplans/archived/260627-RAIL-BS-WP-0006-staged-promotion-lifecycle.md",
"db_id": "",
"file_value": "RAIL-BS-WP-0006",
"db_value": "",
"fixable": false
}
],
"fixes_applied": [
"bindings: synced 23/23",
"C-33 fixed: regenerated WORK-RECORDS.md",
"C-23 fixed: workstream e0a7813d\u2026 status \u2192 'active'",
"C-23 fixed: RCLUSTER-WP-0018-keycape-original-tls-recovery.md status ready \u2192 active (committed)",
"brief: .custodian-brief.md updated",
"push: pushed"
],
"summary": {
"fail": 0,
"automation_error": 0,
"warn": 45,
"info": 8
},
"result": "warn"
}

View file

@ -0,0 +1,244 @@
{
"ok": true,
"status": "applied",
"repo_slug": "railiance-cluster",
"commit": "26671d33600e218316d29c9cd020f115ebfb35b2",
"requests": 2,
"elapsed_ms": 2311.2,
"git": {
"upstream": "origin/main",
"behind": 0,
"ahead": 0
},
"identifiers": {
"schema": "repo-manager.identifier-assignment.v1",
"ok": true,
"executed": true,
"repo": "railiance-cluster",
"namespace": "helixforge",
"assignments": [],
"historical_invalid_identifiers": [
{
"kind": "task",
"id": "T01",
"source": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-1"
},
{
"kind": "task",
"id": "T02",
"source": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-2"
},
{
"kind": "task",
"id": "T03",
"source": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-3"
},
{
"kind": "task",
"id": "T04",
"source": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-4"
},
{
"kind": "task",
"id": "T05",
"source": "workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-5"
},
{
"kind": "task",
"id": "T01",
"source": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-1"
},
{
"kind": "task",
"id": "T02",
"source": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-2"
},
{
"kind": "task",
"id": "T03",
"source": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-3"
},
{
"kind": "task",
"id": "T04",
"source": "workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-4"
},
{
"kind": "task",
"id": "T01",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-1"
},
{
"kind": "task",
"id": "T02",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-2"
},
{
"kind": "task",
"id": "T03",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-3"
},
{
"kind": "task",
"id": "T04",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-4"
},
{
"kind": "task",
"id": "T05",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-5"
},
{
"kind": "task",
"id": "T06",
"source": "workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-6"
}
],
"historical_identity_collisions": [
{
"kind": "task",
"id": "T01",
"uuid": null,
"sources": [
"workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-1",
"workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-1",
"workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-1"
],
"parent_id": "RAIL-BS-WP-0002",
"uuids": [
"3f042630-eab0-4c6a-9167-e2b28ff20e40",
"4526a842-ea31-4874-9231-92ab556cfe7b",
"6841c93a-f146-47eb-9f7c-8fa0e02c1bbc"
]
},
{
"kind": "task",
"id": "T02",
"uuid": null,
"sources": [
"workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-2",
"workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-2",
"workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-2"
],
"parent_id": "RAIL-BS-WP-0002",
"uuids": [
"a6313e06-1976-46a7-8e31-df4eb2eca880",
"ab166073-30a7-4702-a037-4091e8706e20",
"e8510646-46ed-4697-a345-f3d3009eea78"
]
},
{
"kind": "task",
"id": "T03",
"uuid": null,
"sources": [
"workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-3",
"workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-3",
"workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-3"
],
"parent_id": "RAIL-BS-WP-0002",
"uuids": [
"05d42a55-921f-4aa7-bb76-e8af9c7e0ac3",
"140da396-8e30-4f4d-b88c-c42c0cd46c01",
"dab2c07f-8aa0-4635-8df6-857e87e93fc5"
]
},
{
"kind": "task",
"id": "T04",
"uuid": null,
"sources": [
"workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-4",
"workplans/archived/260622-RAIL-BS-WP-0003-pgpool-ha-failover-fix.md#task-block-4",
"workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-4"
],
"parent_id": "RAIL-BS-WP-0002",
"uuids": [
"08233868-d522-4117-bc4e-6c0f52545665",
"5c3d40e4-239b-488e-9519-6f7a38d2325f",
"d8a3ba40-fda0-4c1f-a9f1-ffcd621a5b3d"
]
},
{
"kind": "task",
"id": "T05",
"uuid": null,
"sources": [
"workplans/archived/260622-RAIL-BS-WP-0002-k3s-baseline.md#task-block-5",
"workplans/archived/260622-RAIL-BS-WP-0004-safety-net.md#task-block-5"
],
"parent_id": "RAIL-BS-WP-0002",
"uuids": [
"2d5acff7-4a4e-4ddd-ad06-08237ad3dac8",
"7f9e0e58-a130-467a-a2d0-b3f2564e496f"
]
}
],
"files_changed": []
},
"receipt": {
"schema": "state-hub.repository-projection-reconcile.v1",
"instance_role": "primary",
"instance_label": "railiance01",
"expected_commit": "26671d33600e218316d29c9cd020f115ebfb35b2",
"derived_commit": "26671d33600e218316d29c9cd020f115ebfb35b2",
"outcome": {
"schema": "state-hub.projection-reset.v1",
"repo_slug": "railiance-cluster",
"commit": "26671d33600e218316d29c9cd020f115ebfb35b2",
"status": "applied",
"counts": {
"created": 0,
"updated": 20,
"retired": 0,
"refused": 0,
"released": 0,
"created_tasks": 0,
"updated_tasks": 0,
"cancelled_tasks": 0,
"created_edges": 0,
"removed_edges": 0,
"unresolved_edges": 0,
"external_edges": 0
},
"created": [],
"updated": [
"RAIL-BS-WP-0001",
"RAIL-BS-WP-0005",
"RAIL-BS-WP-0006",
"RAIL-BS-WP-0008",
"RAIL-BS-WP-0009",
"RAIL-BS-WP-0010",
"RAIL-BS-WP-0011",
"RAIL-BS-WP-0012",
"RAIL-BS-WP-0013",
"RAIL-BS-WP-0014",
"RAIL-BS-WP-0015",
"RCLUSTER-WP-0001",
"RCLUSTER-WP-0002",
"RCLUSTER-WP-0003",
"RCLUSTER-WP-0007",
"RCLUSTER-WP-0014",
"RCLUSTER-WP-0016",
"RCLUSTER-WP-0017",
"RCLUSTER-WP-0018",
"RCLUSTER-WP-ADHOC-2026-07-27"
],
"retired": [],
"released": [],
"created_tasks": [],
"updated_tasks": [],
"cancelled_tasks": [],
"created_edges": [],
"removed_edges": [],
"unresolved_edges": [],
"external_edges": [],
"refused": [],
"notes": [
"Preserved bound historical row and task UUIDs: RAIL-BS-WP-0002",
"Preserved bound historical row and task UUIDs: RAIL-BS-WP-0003",
"Preserved bound historical row and task UUIDs: RAIL-BS-WP-0004"
]
}
}
}

View file

@ -0,0 +1,77 @@
{
"schema": "statehub.source-owner-followthrough.v1",
"revision": 3,
"status": "isolated_source_candidate_not_published",
"base_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
"files": [
{
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"action": "modify",
"base_sha256": "ef10359cc5974283b5bdbfc602adf14e3c24362adf00640698d2937c6538483a",
"candidate_sha256": "287001ec92d5a9b851b0d70e56747730a9bb150fcda09e97d6e6e9ddf39c7b5c"
},
{
"path": "Makefile",
"action": "modify",
"base_sha256": "5584ef94071044cca8215141ecd8aee8d6ae5cfe73e8f5719358c680eb8af0d4",
"candidate_sha256": "c5b70e8d4b8ae70380e0ade1c35f9e7fe80038de10080a4723b21ef07a98001e"
},
{
"path": "deploy/railiance/apps/charts/state-hub/Chart.yaml",
"action": "modify",
"base_sha256": "7fe02b390ffd2ba4ce6f82bd62df900826826401e31bdc2138dd5bf36b51a6ae",
"candidate_sha256": "61a989fcf277d05ffbececb7332ee3ca1d8f369c72f960ab1bc4dbc6815536b8"
},
{
"path": "deploy/railiance/apps/helm/state-hub-values.yaml",
"action": "modify",
"base_sha256": "f7cc0e9968598f6ce0faa0d56f62d6817845c3570c18b6ac39ed6561b952b197",
"candidate_sha256": "b51296fc937450f4ecf0ae43243262a631b551389c0d09c8bfe58fa10e2f3ee9"
},
{
"path": "docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json",
"action": "add",
"base_sha256": null,
"candidate_sha256": "fb0b59ba3558e084fb4ae2c36c556f3cfbb2a889f6fd86d4e803c52f483b26fd"
},
{
"path": "deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml",
"action": "modify",
"base_sha256": "9c36fbd5308b19695f9f05d86f8e315bbeccdd267575ce4e2fccf6fb2ea82e32",
"candidate_sha256": "f53c651bb4329c09c04c66f906e2462fe4339ab51ef0ec3da9f942c3016f5bed"
},
{
"path": "api/services/historical_projection.py",
"action": "modify",
"base_sha256": "e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2",
"candidate_sha256": "e24e57c58f4aaa4ec9d9bf088009ac69006e53f75b9477ee53dc26c4e850b975"
},
{
"path": "api/routers/workstreams.py",
"action": "modify",
"base_sha256": "61e7a0ab638b155e9e0b2a72fe8e0ddd2edf5bc6c2d3ca7f6c3ff51e8868910b",
"candidate_sha256": "9c9bf4376dd323b52109912bb3f615949e89ac02c8b88b4720f569f8565ad1d6"
},
{
"path": "scripts/consistency_check.py",
"action": "modify",
"base_sha256": "1827921c79b476bee823c2ddf9896aeb83f3efca6548427e17b3244216bbc6b5",
"candidate_sha256": "ae96d6260f6c88d35bc2d3f22f2a6061367621fd0416387d25d8683c8e804e06"
},
{
"path": "tests/test_frozen_binding_guard_isolated.py",
"action": "add",
"base_sha256": null,
"candidate_sha256": "78eb62178fdecf9b5f6c40d398f8c44e93ff740abaf86557ab51ceb708d2ed65"
}
],
"patch_sha256": "sha256:e9bc2ba9f81b6290945b6de6e0a00ba4c995478b17da786605f5a0466e300b3d",
"T06": "done_verified_approved_rollout_at_stage",
"T07": "wait_actual_later_parent_row_preservation_failure",
"T08": "done_source_repair_pending_publication",
"T09": "progress_until_source_published",
"T10": "wait_needs_human_new_runtime",
"live_effects": false,
"original_parent_preimages": "unknown_do_not_restore_guesses",
"managed_UUIDs": "T09_T10_not_allocated_pending_review"
}

View file

@ -0,0 +1,19 @@
{
"status": "intermediate-reviewed-new-fix-guard-pending",
"reviewed_patch": "e9bc2ba9f81b6290945b6de6e0a00ba4c995478b17da786605f5a0466e300b3d",
"isolated_tests": {
"candidate": 40,
"independent": 4,
"passed": 44,
"seconds": 2.84
},
"tests_scope": "AST-extracted API/checker functions; generated in-memory rows and copies of exact historical source files; no actual DB/network",
"findings": [
"original missing frozen scan path guard fixed in e9bc",
"original repo-unqualified path matcher fixed in e9bc",
"original refusal without automation FAIL fixed in e9bc",
"legacy fix_repo still needs protected parent/task repair preflight; recovery agent notified"
],
"independent_test_sha256": "6896ec48f02829cbc97954c78f29284024727330af38997149e7f03b01f36abc",
"canonical_source_mutation": false
}

View file

@ -0,0 +1,27 @@
{
"status": "reviewed-no-blocking-source-findings",
"reviewed_patch_sha256": "ad3d49b83435dd026118ee1e4a25779b5a7739473619bbda256f160c4eb0e56a",
"manifest_file": "r5-reviewed-manifest.json",
"isolated_tests": {
"candidate": 102,
"reviewer": 7,
"passed": 109,
"seconds": 10.89
},
"coverage": [
"all3parents API no-setter preservation and missing expected-task refusal",
"ordinary-first all3frozen invalid-final-task batch refuses with no setter or commit",
"all18knownUUIDs nested mutating-context denial, including foreign repo claims",
"candidate exact3source metadata/hash/missing/symlink failclosed and C44automationnonzero",
"candidate protected legacy repair preflight before binding sync and fix side effects",
"ordinary dependency TO historical record allowed; FROM protected parent/task refused"
],
"limits": [
"AST-extracted endpoint and checker tests use in-memory generated rows, not delivered runtime or PostgreSQL transactions",
"API requires all15knownUUIDs owned and terminal; additional children remain permitted, consistent current Forge semantics",
"no original parent preimages reconstructed; no restoration claim",
"source review does not complete T07/RMGR19T06 or authorize new runtime activation"
],
"canonical_source_or_database_changes": false,
"test_file_sha256": "fa2a347d8a2f0a28f9e81752de42d151138f71f5d1e83adb86f7cfe3e530486f"
}

View file

@ -0,0 +1,77 @@
{
"schema": "statehub.source-owner-followthrough.v1",
"revision": 5,
"status": "isolated_source_candidate_not_published",
"base_revision": "086d79a2736e34b916bd7de3c8a65e2ea38a3d64",
"files": [
{
"path": "workplans/STATE-WP-0095-historical-source-receiving.md",
"action": "modify",
"base_sha256": "ef10359cc5974283b5bdbfc602adf14e3c24362adf00640698d2937c6538483a",
"candidate_sha256": "5671189ee87f2d4dff08979f6243e5eb7888b140955899642a74d569496b71c7"
},
{
"path": "Makefile",
"action": "modify",
"base_sha256": "5584ef94071044cca8215141ecd8aee8d6ae5cfe73e8f5719358c680eb8af0d4",
"candidate_sha256": "c5b70e8d4b8ae70380e0ade1c35f9e7fe80038de10080a4723b21ef07a98001e"
},
{
"path": "deploy/railiance/apps/charts/state-hub/Chart.yaml",
"action": "modify",
"base_sha256": "7fe02b390ffd2ba4ce6f82bd62df900826826401e31bdc2138dd5bf36b51a6ae",
"candidate_sha256": "61a989fcf277d05ffbececb7332ee3ca1d8f369c72f960ab1bc4dbc6815536b8"
},
{
"path": "deploy/railiance/apps/helm/state-hub-values.yaml",
"action": "modify",
"base_sha256": "f7cc0e9968598f6ce0faa0d56f62d6817845c3570c18b6ac39ed6561b952b197",
"candidate_sha256": "b51296fc937450f4ecf0ae43243262a631b551389c0d09c8bfe58fa10e2f3ee9"
},
{
"path": "docs/evidence/2026-10-17-cluster-historical-receiving-rollout.json",
"action": "add",
"base_sha256": null,
"candidate_sha256": "fb0b59ba3558e084fb4ae2c36c556f3cfbb2a889f6fd86d4e803c52f483b26fd"
},
{
"path": "deploy/railiance/apps/charts/state-hub/files/repo-classification.allowed.yaml",
"action": "modify",
"base_sha256": "9c36fbd5308b19695f9f05d86f8e315bbeccdd267575ce4e2fccf6fb2ea82e32",
"candidate_sha256": "f53c651bb4329c09c04c66f906e2462fe4339ab51ef0ec3da9f942c3016f5bed"
},
{
"path": "api/services/historical_projection.py",
"action": "modify",
"base_sha256": "e3c4bf965764b32a6df5d61c71272ee22569df9a9ddae2a3fc3df97ec554e0b2",
"candidate_sha256": "e24e57c58f4aaa4ec9d9bf088009ac69006e53f75b9477ee53dc26c4e850b975"
},
{
"path": "api/routers/workstreams.py",
"action": "modify",
"base_sha256": "61e7a0ab638b155e9e0b2a72fe8e0ddd2edf5bc6c2d3ca7f6c3ff51e8868910b",
"candidate_sha256": "9c9bf4376dd323b52109912bb3f615949e89ac02c8b88b4720f569f8565ad1d6"
},
{
"path": "scripts/consistency_check.py",
"action": "modify",
"base_sha256": "1827921c79b476bee823c2ddf9896aeb83f3efca6548427e17b3244216bbc6b5",
"candidate_sha256": "eaee916f46a11f49d2621fc9386717d73b7fd517acbe4b695e7b551d67bfa8f7"
},
{
"path": "tests/test_frozen_binding_guard_isolated.py",
"action": "add",
"base_sha256": null,
"candidate_sha256": "4dc64df78a02dc633e5744d0277afe5d350fbb0637196e78dec992f91135bded"
}
],
"patch_sha256": "sha256:ad3d49b83435dd026118ee1e4a25779b5a7739473619bbda256f160c4eb0e56a",
"T06": "done_verified_approved_rollout_at_stage",
"T07": "wait_actual_later_parent_row_preservation_failure",
"T08": "done_source_repair_pending_publication",
"T09": "progress_until_source_published",
"T10": "wait_needs_human_new_runtime",
"live_effects": false,
"original_parent_preimages": "unknown_do_not_restore_guesses",
"managed_UUIDs": "T09_T10_not_allocated_pending_review"
}

View file

@ -0,0 +1,34 @@
import importlib.util,asyncio,uuid
from pathlib import Path
import pytest
spec=importlib.util.spec_from_file_location('guardtest',Path(__file__).with_name('test_frozen_binding_guard_isolated.py'))
t=importlib.util.module_from_spec(spec);spec.loader.exec_module(t)
@pytest.mark.parametrize('bound',t.h.FROZEN_CLUSTER_BINDINGS)
def test_independent_all_three_preserve_and_missing_refuse(bound):
previous=t.B;t.B=bound
try:
repo,parent,tasks=t.closure(bound)
r,s=asyncio.run(t.run_api([t.binding(_bound=bound)],repo,parent,tasks))
assert r['preserved']==1 and s.commits==0 and parent.writes==[]
with pytest.raises(t.HTTPException):asyncio.run(t.run_api([t.binding(_bound=bound)],repo,parent,tasks[:-1]))
finally:t.B=previous
def test_independent_three_parent_invalid_last_batch_no_setters():
repo=t.Obj(id=uuid.uuid4());parents=[];tasks=[];entries=[]
for b in t.h.FROZEN_CLUSTER_BINDINGS:
parent=t.Obj(id=uuid.UUID(b['uuid']),repo_id=repo.id,status='finished');parents.append(parent)
tasks.extend(t.Obj(id=uuid.UUID(x['uuid']),workplan_id=parent.id,status='done') for x in b['tasks'])
entries.append(t.Entry(workplan_id=parent.id,repo_slug=b['repo'],filename=Path(b['path']).name,relative_path=b['path'],archived=True,status='finished'))
ordinary=t.Obj(id=uuid.uuid4());normal=t.Entry(workplan_id=ordinary.id,repo_slug='ordinary',filename='ordinary.md',relative_path='workplans/ordinary.md',archived=False,status='active')
tasks[-1].status='progress';tasks[-1].writes.clear()
session=t.Session([[ordinary,*parents],[repo],tasks])
fn=t.extracted('api/routers/workstreams.py','sync_workplan_bindings',dict(frozen_cluster_binding=t.h.frozen_cluster_binding,validate_frozen_cluster_rows=t.h.validate_frozen_cluster_rows,HTTPException=t.HTTPException,select=lambda *_:t.Query(),Workplan=t.Model,Task=t.Model,ManagedRepo=t.Model,_invalidate_workplan_index_cache=lambda:None))
with pytest.raises(t.HTTPException):asyncio.run(fn(t.Obj(bindings=[normal,*entries]),session))
assert session.commits==0 and ordinary.writes==[] and all(p.writes==[] for p in parents) and all(x.writes==[] for x in tasks)
@pytest.mark.parametrize('bound',t.h.FROZEN_CLUSTER_BINDINGS)
def test_independent_all_eighteen_ids_nested_repair_denied(bound):
guard=t.extracted('scripts/consistency_check.py','_refuse_frozen_fix_batch',dict(FROZEN_CLUSTER_BINDINGS=t.h.FROZEN_CLUSTER_BINDINGS))
for protected in [bound['uuid'],*[x['uuid'] for x in bound['tasks']]]:
report=t.actual_report();report.add(severity='WARN',check_id='C-41',message='drift',fixable=True,_fix_context={'nested':[{'from_task_id':protected}]})
assert guard(report,'foreign') and report.automation_errors

View file

@ -0,0 +1,27 @@
import importlib.util,asyncio,uuid
from pathlib import Path
import pytest
spec=importlib.util.spec_from_file_location('guardtest',Path(__file__).with_name('test_frozen_binding_guard_isolated.py'))
t=importlib.util.module_from_spec(spec);spec.loader.exec_module(t)
@pytest.mark.parametrize('bound',t.h.FROZEN_CLUSTER_BINDINGS)
def test_independent_all_three_preserve_and_missing_refuse(bound):
previous=t.B;t.B=bound
try:
repo,parent,tasks=t.closure()
r,s=asyncio.run(t.run_api([t.binding()],repo,parent,tasks))
assert r['preserved']==1 and s.commits==0 and parent.writes==[]
with pytest.raises(t.HTTPException):asyncio.run(t.run_api([t.binding()],repo,parent,tasks[:-1]))
finally:t.B=previous
def test_independent_three_parent_invalid_last_batch_no_setters():
repo=t.Obj(id=uuid.uuid4());parents=[];tasks=[];entries=[]
for b in t.h.FROZEN_CLUSTER_BINDINGS:
parent=t.Obj(id=uuid.UUID(b['uuid']),repo_id=repo.id,status='finished');parents.append(parent)
tasks.extend(t.Obj(id=uuid.UUID(x['uuid']),workplan_id=parent.id,status='done') for x in b['tasks'])
entries.append(t.Entry(workplan_id=parent.id,repo_slug=b['repo'],filename=Path(b['path']).name,relative_path=b['path'],archived=True,status='finished'))
ordinary=t.Obj(id=uuid.uuid4());normal=t.Entry(workplan_id=ordinary.id,repo_slug='ordinary',filename='ordinary.md',relative_path='workplans/ordinary.md',archived=False,status='active')
tasks[-1].status='progress';tasks[-1].writes.clear()
session=t.Session([[ordinary,*parents],[repo],tasks])
fn=t.extracted('api/routers/workstreams.py','sync_workplan_bindings',dict(frozen_cluster_binding=t.h.frozen_cluster_binding,validate_frozen_cluster_rows=t.h.validate_frozen_cluster_rows,HTTPException=t.HTTPException,select=lambda *_:t.Query(),Workplan=t.Model,Task=t.Model,ManagedRepo=t.Model,_invalidate_workplan_index_cache=lambda:None))
with pytest.raises(t.HTTPException):asyncio.run(fn(t.Obj(bindings=[normal,*entries]),session))
assert session.commits==0 and ordinary.writes==[] and all(p.writes==[] for p in parents) and all(x.writes==[] for x in tasks)

View file

@ -0,0 +1,774 @@
{
"schema": "statehub.guard-image-inspection.v1",
"status": "verified-selected-public-image-bytes",
"source_commit": "a25b62f75aab6165ee9872ee53ac90c679ec746a",
"tag": "main-a25b62f",
"image_digest": "sha256:226086b1acaec3fc77e30014a101c96de687e38c9eb52cd522e5e69efb1980a0",
"selected_source_hashes": {
"app/api/services/historical_projection.py": "sha256:e24e57c58f4aaa4ec9d9bf088009ac69006e53f75b9477ee53dc26c4e850b975",
"app/api/routers/workstreams.py": "sha256:9c9bf4376dd323b52109912bb3f615949e89ac02c8b88b4720f569f8565ad1d6",
"app/scripts/consistency_check.py": "sha256:eaee916f46a11f49d2621fc9386717d73b7fd517acbe4b695e7b551d67bfa8f7",
"app/api/services/forge_projection.py": "sha256:b980e62cbd85c3e7df42b01abf14354e04133374db94af6531dcd91629c3487d",
"app/migrations/versions/c4d5e6f7a8b9_inbox_feed_revision.py": "sha256:48f1730037be99b5623e878d7f20a06bec243ce27317fde81c82e16006d7b3ce",
"tmp/.ci-build-id": "sha256:ea57ead67d610c44a6237a7d96be66a8f9882f026de544b8efc69dbd7d57315d"
},
"observed_files": {
"tmp/.ci-build-id": "sha256:ea57ead67d610c44a6237a7d96be66a8f9882f026de544b8efc69dbd7d57315d",
"tmp/hub-core/hub_core/__init__.py": "sha256:098578bae76f7d97354b8f3dfe8ddc63b15806a46d1691d70ed12d9839d69aec",
"tmp/hub-core/hub_core/conformance/__init__.py": "sha256:f7ce0a651913f157e586afd6e953b483add0dd5257ee9f2406c47e8d46ee9587",
"tmp/hub-core/hub_core/conformance/harness.py": "sha256:ca870fbbec7b7f5db6521d615fd76dfcbb9e97cbdfb037ffa993851a663b3c40",
"tmp/hub-core/hub_core/contracts/__init__.py": "sha256:ffb7a6b79ce15ddd57943bfbc40799e078c6f57c6690018237baa3f3a755ac49",
"tmp/hub-core/hub_core/contracts/helixforge_hub_extension/__init__.py": "sha256:32c095a16f777127ec0d2cd5e8373889866b81e9955d01e5adaf9503f6864da4",
"tmp/hub-core/hub_core/contracts/helixforge_hub_extension/v0_1_0/__init__.py": "sha256:e176b86b24d79c11f78ad714878bc3fca41c7821654fa766278b697360a41201",
"tmp/hub-core/hub_core/contracts/repository_navigation/__init__.py": "sha256:64912fe6673b72c3c0d8a2da28673d58bdf6f4185a1376ffe43d3735350adb60",
"tmp/hub-core/hub_core/contracts/repository_navigation/v1_0_0/__init__.py": "sha256:574cf1fee8433e0b11d9475cfbcc3837730b55f6ea1faa4920cba106d959464f",
"tmp/hub-core/hub_core/contracts/workload_projection/__init__.py": "sha256:c01198d23571442c1c3a596c7cd16be17dc1a3efdcfe3e8f9725b7dba16fc103",
"tmp/hub-core/hub_core/contracts/workload_projection/v1_0_0/__init__.py": "sha256:a9ecfecbf44893d32268288c872cdede0440d2a1373d37a47f69ba8c6431de0d",
"tmp/hub-core/hub_core/database.py": "sha256:a7704e97509433e90655b0ea22d5fa626d75b8b6470015ef8b9e5997e7a7f5ea",
"tmp/hub-core/hub_core/events.py": "sha256:c7125a242ed638a3ede29129e4ad826cd188cf76239b59a8587a40d182bbd0e7",
"tmp/hub-core/hub_core/mcp/__init__.py": "sha256:f97b25193573e56886b66f91cb8c86ef4a39f2100d709869e279e17456959859",
"tmp/hub-core/hub_core/mcp/credentials.py": "sha256:f5433d29848bd5a399a5e31695e0d908748e0a0856d26b2d691b667c50c95c34",
"tmp/hub-core/hub_core/mcp/server.py": "sha256:fc6a6de0a29ad9b6da176302a7d24e4ba987f667b6a7fb001029f00cb0d0c582",
"tmp/hub-core/hub_core/message_identity.py": "sha256:0ab996ba50f236c1342ce72ca8ae6ff28102ef41216972a745f7260e0c93fb24",
"tmp/hub-core/hub_core/migrations/__init__.py": "sha256:ccf4820e270c97fd5d4ac02f0c96362a772b8f4d1bcccc3f5e0077b77f575d36",
"tmp/hub-core/hub_core/migrations/env.py": "sha256:282e6e1a9e4a3cfdc111887f04dc5c1645307b3943a421852abe1709ce712e57",
"tmp/hub-core/hub_core/migrations/roles.py": "sha256:91e85297d296b0c4b9c78b16ae67d3a4707232d8f32b2cac2b2e84f31fa80e89",
"tmp/hub-core/hub_core/migrations/versions/0001_core_schema.py": "sha256:c65f076a7b56fb93ee67869e04d922ea396eab72a4c2d2f0dabd706c918aa081",
"tmp/hub-core/hub_core/migrations/versions/0002_runtime_ports.py": "sha256:d3ce15463841b3c13eaafdd137a65d4cf2839c0b8e8fddcb2cb2f1adbceb9f00",
"tmp/hub-core/hub_core/migrations/versions/0003_repository_navigation.py": "sha256:fb2d2cb5ed10f1760ab789ced8d43c657c1bedc29ba666231a70a18636160902",
"tmp/hub-core/hub_core/migrations/versions/0004_workload_projection.py": "sha256:87ce668bfef5cf4aaf0cfd3b48d498f2370f68e06a6e66375e446af6fbbb9c96",
"tmp/hub-core/hub_core/migrations/versions/0005_message_identity_aliases.py": "sha256:ec05d2c3cb906b78cdec4d220a7ce09264c38904c792cdad3cd1082e7eace7c0",
"tmp/hub-core/hub_core/migrations/versions/0006_outcome_outbox.py": "sha256:05effdf6f258836d1cd223f9d9fc3447d264484021d3a51cfa42517453d613e1",
"tmp/hub-core/hub_core/migrations/versions/__init__.py": "sha256:569f6d7e5cc1c17b7b1eee3eec3b82774b745d01ee1dfdf851a5c6f5c337f0bb",
"tmp/hub-core/hub_core/models/__init__.py": "sha256:c0b6de4986614a163dbb2467d15882eadbd66800478a50de4d6404198d1f773a",
"tmp/hub-core/hub_core/models/agent_message.py": "sha256:23d16eeaffe780f326b08e6c441100e6ae7b4075bbb6421734c06156a87c4375",
"tmp/hub-core/hub_core/models/base.py": "sha256:85bb40bde6f4cf8e6c5700a3a016a711fab4adff77c5eb78f89827fe28b9537b",
"tmp/hub-core/hub_core/models/capability_catalog.py": "sha256:eebbb31f264821a61662d3c9e8c7eba74f46d7f68b946e35f8127343bf2ff9c4",
"tmp/hub-core/hub_core/models/capability_request.py": "sha256:70a867c82aaa061a4e1c671b023d213032464e776226280f99e2ca192e2a6eba",
"tmp/hub-core/hub_core/models/domain.py": "sha256:ddf45c37e3c37014ddd9148be01cf104658e1601abba2a8ba96f7680cdb581b3",
"tmp/hub-core/hub_core/models/managed_repo.py": "sha256:835c5d44581daf7d7dd95325e3f7fdf0add4d529b83779ed83b5e812dcb3aa61",
"tmp/hub-core/hub_core/models/message_identity_alias.py": "sha256:d07d59cd9c9351669e8319727d08bc0e9bb7e0ee36bf8a34c0c258f0b4ea61e4",
"tmp/hub-core/hub_core/models/progress_event.py": "sha256:ee750127db2f49c5b9b94773a408f7f965d834b02e6d962220f4bc762309161f",
"tmp/hub-core/hub_core/models/tpsc.py": "sha256:cb28cbe3512486adb73c0bce633b3c542a41a64e7ec673e86a5a25ab20d94afe",
"tmp/hub-core/hub_core/routers/__init__.py": "sha256:800d1c45f597fcb4970ca7a83acd2b36016006efbdf638e14a3482a954d9046d",
"tmp/hub-core/hub_core/routers/capabilities.py": "sha256:18a403ad6ac961bc490543b698e079336f60ef9902a6cd71ef9899076660d5c0",
"tmp/hub-core/hub_core/routers/domains.py": "sha256:d4c4061d2ab0d2d6390a10f4f815deb0b93b3979345aee965b666110ba32e6e0",
"tmp/hub-core/hub_core/routers/messages.py": "sha256:903bd4f8c8ca599b606cf2229315de21097360816fcda907159dac4f48cee512",
"tmp/hub-core/hub_core/routers/policy.py": "sha256:358271263295fdebb5bcb95c3a27bd3ea456964a77bc01c3f784fb7a8754aacf",
"tmp/hub-core/hub_core/routers/progress.py": "sha256:680cf4dea00a1734d7d70ef7880acc8fd39f045521baa47f415c17934779d18a",
"tmp/hub-core/hub_core/routers/repos.py": "sha256:1bca6c9b2b5bbe172f5b935b763ac1e399b1d403cdc2c463000ae79f843257a2",
"tmp/hub-core/hub_core/routers/tpsc.py": "sha256:706815b01be1c0320bf73cf9cff3e9415c1f27b8449ee9e6fea67b12d3042fd1",
"tmp/hub-core/hub_core/runtime/__init__.py": "sha256:c522e626373407bf9bcd727dac7bb812cbdc8c3ef5bb6509a74949e5b49ab4c2",
"tmp/hub-core/hub_core/runtime/app.py": "sha256:87b077498bbe321c73139e51f7ca689fdc7963a98c4d72a5a3bbcc564f47ee76",
"tmp/hub-core/hub_core/runtime/cli.py": "sha256:98ec00f2a12911245827f515877472ae1c37cea65a42454494450ffbe7380e57",
"tmp/hub-core/hub_core/runtime/compat.py": "sha256:9f1c4575bb406ae1174da1a005ec16f44ace63768617e11164b44b4051162d0d",
"tmp/hub-core/hub_core/runtime/compat_catalogs.py": "sha256:250f61ea39cced32c8cd932c4e770ae8be54ff1cf1e257ee2c82324bde0d7a26",
"tmp/hub-core/hub_core/runtime/config.py": "sha256:009b2fc5d1f8fc390d478b01444f610ada91e5fee30534936382be2529a843fc",
"tmp/hub-core/hub_core/runtime/inbox_projection.py": "sha256:84499238654310b86f7a97f2817163ff4c4da0dfce562c677294fa3dfef7f398",
"tmp/hub-core/hub_core/runtime/migration.py": "sha256:d12731fa581c48bf58deec19405ece977c89d08993b2a2ad047cb1fd17318ea8",
"tmp/hub-core/hub_core/runtime/models.py": "sha256:367ca4aa29f59f8e3f59eab22f12782146cf623fa7ac7c22346c794b85a88185",
"tmp/hub-core/hub_core/runtime/ports.py": "sha256:ab70a401deae73389761a0e88dc8ee843df00a671fae6919b1f7eed344cfb542",
"tmp/hub-core/hub_core/runtime/postgres_store.py": "sha256:9286e7845009b66f00069d67177733dabe372d79986c33ca9b43e00dfa5a2341",
"tmp/hub-core/hub_core/runtime/repo_manager_client.py": "sha256:8fa305277c5f3ddfdbe1daf4023ce6c3cde03b5c18c1292dd6aac3fe995aabe1",
"tmp/hub-core/hub_core/runtime/repository_navigation.py": "sha256:f3503596781f3e7f7d53dd28dd3aaf563905f1398575b40c8080e2b1b9978b1e",
"tmp/hub-core/hub_core/runtime/repository_navigation_routes.py": "sha256:eab78ab418a7b542dcdcab5da023bacc65fb50520853f8d179accb2105e373cf",
"tmp/hub-core/hub_core/runtime/store.py": "sha256:2fb78f14bab8df08807322d6f6416745856d69e6001381246abbac879891858d",
"tmp/hub-core/hub_core/runtime/tables.py": "sha256:a5ff72a9c54eedcc8bb81330e62ee72578a383a1d03a1acb598c72c96cdfbe9e",
"tmp/hub-core/hub_core/runtime/validation.py": "sha256:2add804d95d5d0469d6d8d605fbd1013885da972489a017260c6fddef7b80c79",
"tmp/hub-core/hub_core/runtime/workload_projection.py": "sha256:8500260404b0c566a62e51fef63ee320d4e3dafe5e2467f44db884296b9e3bf4",
"tmp/hub-core/hub_core/runtime/workload_projection_routes.py": "sha256:5c71189b98867f2f1f7612f47ee69c0ec3ddf836b9b1c7e134b98a2be45791de",
"tmp/hub-core/hub_core/schemas/__init__.py": "sha256:dfa2ec2d125f03a532637d2fbef3058ebe1f85c515ff42a930198e164b7812f7",
"tmp/hub-core/hub_core/schemas/agent_message.py": "sha256:d6a7f40dc9a3c61be761f4d2e2c08f726fb0a423ef73e273a7cd97c69ae6c6a3",
"tmp/hub-core/hub_core/schemas/capability.py": "sha256:949c55cb1f2694de4617ad53dc9cb7bc0e72addd7b9d0f104b93d783e4edc647",
"tmp/hub-core/hub_core/schemas/doi.py": "sha256:73d675aecabd5a62ae13184494a4b9db122ad24b3132e1d0e908eef802382f36",
"tmp/hub-core/hub_core/schemas/domain.py": "sha256:872a704fea959d2e4d0ff771770a97160457282218f4748ba4f830c489543aac",
"tmp/hub-core/hub_core/schemas/managed_repo.py": "sha256:a7ab3b1ab399da81324693dcd5d3feeccb211642b10f11cd3f03c7fe6ba751d4",
"tmp/hub-core/hub_core/schemas/policy.py": "sha256:bdaef1640783ac325a050cadf214e731d7c8e5e3a35dbb8f7562d5abbd209a4c",
"tmp/hub-core/hub_core/schemas/progress_event.py": "sha256:9ac7b7fd4881d424bfe59c5001554fd7302243e8489d5e777584d11ead1db328",
"tmp/hub-core/hub_core/schemas/tpsc.py": "sha256:5640d96a7fa862a468eeb0d6da002697b1f58e4cd675a4603b91e448d4db851e",
"tmp/hub-core/hub_core/security/__init__.py": "sha256:2754e25ec0f5725c33cb0b4dff1b7d10b364ebd828e609bb5b44eee3309d2d60",
"tmp/hub-core/hub_core/security/account_reader.py": "sha256:27019616b84cf030969a8e3c0850b5ae52f336008fd9daa4c26360566e74a39b",
"tmp/hub-core/hub_core/security/audit.py": "sha256:94cb85d71f065443c6423871b59d41e929af0441c95928273caf3e38dad8125c",
"tmp/hub-core/hub_core/security/boundary.py": "sha256:a1629ac717672276f61015c83f7af6e375bbd8c1234c712dd3d225da307ae0d6",
"tmp/hub-core/hub_core/security/browser.py": "sha256:fd474ee4b9611fe8dd2c60111402c2fce67d680a7da3519b5d4a495a6b559b7a",
"tmp/hub-core/hub_core/security/config.py": "sha256:7d604f6aeebde393a371ec3e0ab174934e10808c29fb370acba031486e9c02a3",
"tmp/hub-core/hub_core/security/context.py": "sha256:1181bbf12ba86bfd5046dab2f3a22a64ee3686be6dd52ab3e843303349b13a52",
"tmp/hub-core/hub_core/security/facts.py": "sha256:3de4db38ffd3f86f4918d76f811289cd501be3c28dcba16f5088aa2a2b7529ce",
"tmp/hub-core/hub_core/security/identity.py": "sha256:d7a0bab9d59a5f342fdedc9723d818a9d2537a59c6a9415455786af748f912e9",
"tmp/hub-core/hub_core/security/policy.py": "sha256:a2370e9ea5b04b1d5a429644d7f81edb1cbe8e15214c23b16cd6f949613eebd6",
"tmp/hub-core/hub_core/utils/__init__.py": "sha256:ce4ddb30ccc4fd2c4ee59e8a3c088a12165171af02aea957f17f72cd868e1899",
"tmp/hub-core/hub_core/utils/pagination.py": "sha256:366250b85052c7aabc2a2262521d34233124ba3a41026042792f8eda706ecb4f",
"tmp/hub-core/hub_core/utils/paths.py": "sha256:988a889be74f0626ca3c27b1d6677bd4a556e35de389c060d07ab64fa1c22fc8",
"tmp/hub-core/hub_core/utils/routing.py": "sha256:c94b44c5f1ab723e123503e20e0309f28abeeabea6d51beda79247d99852ad1e",
"tmp/hub-core/hub_core/utils/slugs.py": "sha256:eda7a7d18ff21a4d949223b75a2b615a949e615f461152a9cb9a2cf74b491e2d",
"app/.venv/lib/python3.12/site-packages/hub_core/__init__.py": "sha256:098578bae76f7d97354b8f3dfe8ddc63b15806a46d1691d70ed12d9839d69aec",
"app/.venv/lib/python3.12/site-packages/hub_core/conformance/__init__.py": "sha256:f7ce0a651913f157e586afd6e953b483add0dd5257ee9f2406c47e8d46ee9587",
"app/.venv/lib/python3.12/site-packages/hub_core/conformance/harness.py": "sha256:ca870fbbec7b7f5db6521d615fd76dfcbb9e97cbdfb037ffa993851a663b3c40",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/__init__.py": "sha256:ffb7a6b79ce15ddd57943bfbc40799e078c6f57c6690018237baa3f3a755ac49",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/helixforge_hub_extension/__init__.py": "sha256:32c095a16f777127ec0d2cd5e8373889866b81e9955d01e5adaf9503f6864da4",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/helixforge_hub_extension/v0_1_0/__init__.py": "sha256:e176b86b24d79c11f78ad714878bc3fca41c7821654fa766278b697360a41201",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/repository_navigation/__init__.py": "sha256:64912fe6673b72c3c0d8a2da28673d58bdf6f4185a1376ffe43d3735350adb60",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/repository_navigation/v1_0_0/__init__.py": "sha256:574cf1fee8433e0b11d9475cfbcc3837730b55f6ea1faa4920cba106d959464f",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/workload_projection/__init__.py": "sha256:c01198d23571442c1c3a596c7cd16be17dc1a3efdcfe3e8f9725b7dba16fc103",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/workload_projection/v1_0_0/__init__.py": "sha256:a9ecfecbf44893d32268288c872cdede0440d2a1373d37a47f69ba8c6431de0d",
"app/.venv/lib/python3.12/site-packages/hub_core/database.py": "sha256:a7704e97509433e90655b0ea22d5fa626d75b8b6470015ef8b9e5997e7a7f5ea",
"app/.venv/lib/python3.12/site-packages/hub_core/events.py": "sha256:c7125a242ed638a3ede29129e4ad826cd188cf76239b59a8587a40d182bbd0e7",
"app/.venv/lib/python3.12/site-packages/hub_core/mcp/__init__.py": "sha256:f97b25193573e56886b66f91cb8c86ef4a39f2100d709869e279e17456959859",
"app/.venv/lib/python3.12/site-packages/hub_core/mcp/credentials.py": "sha256:f5433d29848bd5a399a5e31695e0d908748e0a0856d26b2d691b667c50c95c34",
"app/.venv/lib/python3.12/site-packages/hub_core/mcp/server.py": "sha256:fc6a6de0a29ad9b6da176302a7d24e4ba987f667b6a7fb001029f00cb0d0c582",
"app/.venv/lib/python3.12/site-packages/hub_core/message_identity.py": "sha256:0ab996ba50f236c1342ce72ca8ae6ff28102ef41216972a745f7260e0c93fb24",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/__init__.py": "sha256:ccf4820e270c97fd5d4ac02f0c96362a772b8f4d1bcccc3f5e0077b77f575d36",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/env.py": "sha256:282e6e1a9e4a3cfdc111887f04dc5c1645307b3943a421852abe1709ce712e57",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/roles.py": "sha256:91e85297d296b0c4b9c78b16ae67d3a4707232d8f32b2cac2b2e84f31fa80e89",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0001_core_schema.py": "sha256:c65f076a7b56fb93ee67869e04d922ea396eab72a4c2d2f0dabd706c918aa081",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0002_runtime_ports.py": "sha256:d3ce15463841b3c13eaafdd137a65d4cf2839c0b8e8fddcb2cb2f1adbceb9f00",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0003_repository_navigation.py": "sha256:fb2d2cb5ed10f1760ab789ced8d43c657c1bedc29ba666231a70a18636160902",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0004_workload_projection.py": "sha256:87ce668bfef5cf4aaf0cfd3b48d498f2370f68e06a6e66375e446af6fbbb9c96",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0005_message_identity_aliases.py": "sha256:ec05d2c3cb906b78cdec4d220a7ce09264c38904c792cdad3cd1082e7eace7c0",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0006_outcome_outbox.py": "sha256:05effdf6f258836d1cd223f9d9fc3447d264484021d3a51cfa42517453d613e1",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/__init__.py": "sha256:569f6d7e5cc1c17b7b1eee3eec3b82774b745d01ee1dfdf851a5c6f5c337f0bb",
"app/.venv/lib/python3.12/site-packages/hub_core/models/__init__.py": "sha256:c0b6de4986614a163dbb2467d15882eadbd66800478a50de4d6404198d1f773a",
"app/.venv/lib/python3.12/site-packages/hub_core/models/agent_message.py": "sha256:23d16eeaffe780f326b08e6c441100e6ae7b4075bbb6421734c06156a87c4375",
"app/.venv/lib/python3.12/site-packages/hub_core/models/base.py": "sha256:85bb40bde6f4cf8e6c5700a3a016a711fab4adff77c5eb78f89827fe28b9537b",
"app/.venv/lib/python3.12/site-packages/hub_core/models/capability_catalog.py": "sha256:eebbb31f264821a61662d3c9e8c7eba74f46d7f68b946e35f8127343bf2ff9c4",
"app/.venv/lib/python3.12/site-packages/hub_core/models/capability_request.py": "sha256:70a867c82aaa061a4e1c671b023d213032464e776226280f99e2ca192e2a6eba",
"app/.venv/lib/python3.12/site-packages/hub_core/models/domain.py": "sha256:ddf45c37e3c37014ddd9148be01cf104658e1601abba2a8ba96f7680cdb581b3",
"app/.venv/lib/python3.12/site-packages/hub_core/models/managed_repo.py": "sha256:835c5d44581daf7d7dd95325e3f7fdf0add4d529b83779ed83b5e812dcb3aa61",
"app/.venv/lib/python3.12/site-packages/hub_core/models/message_identity_alias.py": "sha256:d07d59cd9c9351669e8319727d08bc0e9bb7e0ee36bf8a34c0c258f0b4ea61e4",
"app/.venv/lib/python3.12/site-packages/hub_core/models/progress_event.py": "sha256:ee750127db2f49c5b9b94773a408f7f965d834b02e6d962220f4bc762309161f",
"app/.venv/lib/python3.12/site-packages/hub_core/models/tpsc.py": "sha256:cb28cbe3512486adb73c0bce633b3c542a41a64e7ec673e86a5a25ab20d94afe",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/__init__.py": "sha256:800d1c45f597fcb4970ca7a83acd2b36016006efbdf638e14a3482a954d9046d",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/capabilities.py": "sha256:18a403ad6ac961bc490543b698e079336f60ef9902a6cd71ef9899076660d5c0",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/domains.py": "sha256:d4c4061d2ab0d2d6390a10f4f815deb0b93b3979345aee965b666110ba32e6e0",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/messages.py": "sha256:903bd4f8c8ca599b606cf2229315de21097360816fcda907159dac4f48cee512",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/policy.py": "sha256:358271263295fdebb5bcb95c3a27bd3ea456964a77bc01c3f784fb7a8754aacf",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/progress.py": "sha256:680cf4dea00a1734d7d70ef7880acc8fd39f045521baa47f415c17934779d18a",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/repos.py": "sha256:1bca6c9b2b5bbe172f5b935b763ac1e399b1d403cdc2c463000ae79f843257a2",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/tpsc.py": "sha256:706815b01be1c0320bf73cf9cff3e9415c1f27b8449ee9e6fea67b12d3042fd1",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/__init__.py": "sha256:c522e626373407bf9bcd727dac7bb812cbdc8c3ef5bb6509a74949e5b49ab4c2",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/app.py": "sha256:87b077498bbe321c73139e51f7ca689fdc7963a98c4d72a5a3bbcc564f47ee76",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/cli.py": "sha256:98ec00f2a12911245827f515877472ae1c37cea65a42454494450ffbe7380e57",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/compat.py": "sha256:9f1c4575bb406ae1174da1a005ec16f44ace63768617e11164b44b4051162d0d",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/compat_catalogs.py": "sha256:250f61ea39cced32c8cd932c4e770ae8be54ff1cf1e257ee2c82324bde0d7a26",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/config.py": "sha256:009b2fc5d1f8fc390d478b01444f610ada91e5fee30534936382be2529a843fc",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/inbox_projection.py": "sha256:84499238654310b86f7a97f2817163ff4c4da0dfce562c677294fa3dfef7f398",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/migration.py": "sha256:d12731fa581c48bf58deec19405ece977c89d08993b2a2ad047cb1fd17318ea8",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/models.py": "sha256:367ca4aa29f59f8e3f59eab22f12782146cf623fa7ac7c22346c794b85a88185",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/ports.py": "sha256:ab70a401deae73389761a0e88dc8ee843df00a671fae6919b1f7eed344cfb542",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/postgres_store.py": "sha256:9286e7845009b66f00069d67177733dabe372d79986c33ca9b43e00dfa5a2341",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/repo_manager_client.py": "sha256:8fa305277c5f3ddfdbe1daf4023ce6c3cde03b5c18c1292dd6aac3fe995aabe1",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/repository_navigation.py": "sha256:f3503596781f3e7f7d53dd28dd3aaf563905f1398575b40c8080e2b1b9978b1e",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/repository_navigation_routes.py": "sha256:eab78ab418a7b542dcdcab5da023bacc65fb50520853f8d179accb2105e373cf",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/store.py": "sha256:2fb78f14bab8df08807322d6f6416745856d69e6001381246abbac879891858d",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/tables.py": "sha256:a5ff72a9c54eedcc8bb81330e62ee72578a383a1d03a1acb598c72c96cdfbe9e",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/validation.py": "sha256:2add804d95d5d0469d6d8d605fbd1013885da972489a017260c6fddef7b80c79",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/workload_projection.py": "sha256:8500260404b0c566a62e51fef63ee320d4e3dafe5e2467f44db884296b9e3bf4",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/workload_projection_routes.py": "sha256:5c71189b98867f2f1f7612f47ee69c0ec3ddf836b9b1c7e134b98a2be45791de",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/__init__.py": "sha256:dfa2ec2d125f03a532637d2fbef3058ebe1f85c515ff42a930198e164b7812f7",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/agent_message.py": "sha256:d6a7f40dc9a3c61be761f4d2e2c08f726fb0a423ef73e273a7cd97c69ae6c6a3",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/capability.py": "sha256:949c55cb1f2694de4617ad53dc9cb7bc0e72addd7b9d0f104b93d783e4edc647",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/doi.py": "sha256:73d675aecabd5a62ae13184494a4b9db122ad24b3132e1d0e908eef802382f36",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/domain.py": "sha256:872a704fea959d2e4d0ff771770a97160457282218f4748ba4f830c489543aac",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/managed_repo.py": "sha256:a7ab3b1ab399da81324693dcd5d3feeccb211642b10f11cd3f03c7fe6ba751d4",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/policy.py": "sha256:bdaef1640783ac325a050cadf214e731d7c8e5e3a35dbb8f7562d5abbd209a4c",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/progress_event.py": "sha256:9ac7b7fd4881d424bfe59c5001554fd7302243e8489d5e777584d11ead1db328",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/tpsc.py": "sha256:5640d96a7fa862a468eeb0d6da002697b1f58e4cd675a4603b91e448d4db851e",
"app/.venv/lib/python3.12/site-packages/hub_core/security/__init__.py": "sha256:2754e25ec0f5725c33cb0b4dff1b7d10b364ebd828e609bb5b44eee3309d2d60",
"app/.venv/lib/python3.12/site-packages/hub_core/security/account_reader.py": "sha256:27019616b84cf030969a8e3c0850b5ae52f336008fd9daa4c26360566e74a39b",
"app/.venv/lib/python3.12/site-packages/hub_core/security/audit.py": "sha256:94cb85d71f065443c6423871b59d41e929af0441c95928273caf3e38dad8125c",
"app/.venv/lib/python3.12/site-packages/hub_core/security/boundary.py": "sha256:a1629ac717672276f61015c83f7af6e375bbd8c1234c712dd3d225da307ae0d6",
"app/.venv/lib/python3.12/site-packages/hub_core/security/browser.py": "sha256:fd474ee4b9611fe8dd2c60111402c2fce67d680a7da3519b5d4a495a6b559b7a",
"app/.venv/lib/python3.12/site-packages/hub_core/security/config.py": "sha256:7d604f6aeebde393a371ec3e0ab174934e10808c29fb370acba031486e9c02a3",
"app/.venv/lib/python3.12/site-packages/hub_core/security/context.py": "sha256:1181bbf12ba86bfd5046dab2f3a22a64ee3686be6dd52ab3e843303349b13a52",
"app/.venv/lib/python3.12/site-packages/hub_core/security/facts.py": "sha256:3de4db38ffd3f86f4918d76f811289cd501be3c28dcba16f5088aa2a2b7529ce",
"app/.venv/lib/python3.12/site-packages/hub_core/security/identity.py": "sha256:d7a0bab9d59a5f342fdedc9723d818a9d2537a59c6a9415455786af748f912e9",
"app/.venv/lib/python3.12/site-packages/hub_core/security/policy.py": "sha256:a2370e9ea5b04b1d5a429644d7f81edb1cbe8e15214c23b16cd6f949613eebd6",
"app/.venv/lib/python3.12/site-packages/hub_core/utils/__init__.py": "sha256:ce4ddb30ccc4fd2c4ee59e8a3c088a12165171af02aea957f17f72cd868e1899",
"app/.venv/lib/python3.12/site-packages/hub_core/utils/pagination.py": "sha256:366250b85052c7aabc2a2262521d34233124ba3a41026042792f8eda706ecb4f",
"app/.venv/lib/python3.12/site-packages/hub_core/utils/paths.py": "sha256:988a889be74f0626ca3c27b1d6677bd4a556e35de389c060d07ab64fa1c22fc8",
"app/.venv/lib/python3.12/site-packages/hub_core/utils/routing.py": "sha256:c94b44c5f1ab723e123503e20e0309f28abeeabea6d51beda79247d99852ad1e",
"app/.venv/lib/python3.12/site-packages/hub_core/utils/slugs.py": "sha256:eda7a7d18ff21a4d949223b75a2b615a949e615f461152a9cb9a2cf74b491e2d",
"app/api/routers/workstreams.py": "sha256:9c9bf4376dd323b52109912bb3f615949e89ac02c8b88b4720f569f8565ad1d6",
"app/api/services/forge_projection.py": "sha256:b980e62cbd85c3e7df42b01abf14354e04133374db94af6531dcd91629c3487d",
"app/api/services/historical_projection.py": "sha256:e24e57c58f4aaa4ec9d9bf088009ac69006e53f75b9477ee53dc26c4e850b975",
"app/migrations/versions/c4d5e6f7a8b9_inbox_feed_revision.py": "sha256:48f1730037be99b5623e878d7f20a06bec243ce27317fde81c82e16006d7b3ce",
"app/scripts/consistency_check.py": "sha256:eaee916f46a11f49d2621fc9386717d73b7fd517acbe4b695e7b551d67bfa8f7"
},
"layers": [
{
"digest": "sha256:304074f06047f3dee0c586de265e0e27b577930bc80dc7f97f3829b188bc4fb0",
"compressed_bytes": 30855435,
"archive_entries": 3271,
"whiteouts": 0
},
{
"digest": "sha256:75b6a36c64a1cf3520fc4b4aae4739d5caa8a6a05c27835a920a61784c9c32f8",
"compressed_bytes": 1294052,
"archive_entries": 553,
"whiteouts": 0
},
{
"digest": "sha256:6912e23eb44595b44dc6d9882b34f305ad6f6e9667cec70b13e5dbc4f8cd97f4",
"compressed_bytes": 12121637,
"archive_entries": 1828,
"whiteouts": 0
},
{
"digest": "sha256:bbc5a12237474ec0b23b5051260d56d6436a24d70d9cad961adebe7a037ed813",
"compressed_bytes": 249,
"archive_entries": 8,
"whiteouts": 0
},
{
"digest": "sha256:e16e3995c15e64ae03e700d74eab2389f1151e6bd5d40f55faa047e9124aeb20",
"compressed_bytes": 93,
"archive_entries": 1,
"whiteouts": 0
},
{
"digest": "sha256:14568be832d0c877348328755de4e94cf4d0397d03f2161f6995e3b3e756e802",
"compressed_bytes": 55305356,
"archive_entries": 2898,
"whiteouts": 62
},
{
"digest": "sha256:2a6eb309967b62bf0c483ef7ca6b595a3222af9824d7d76df93588d2db516195",
"compressed_bytes": 148,
"archive_entries": 2,
"whiteouts": 0
},
{
"digest": "sha256:fb5adb1b205f7c2a5a53dc53c300aa7fa968e3bf2ba85bfcf569b8f45131ae94",
"compressed_bytes": 940,
"archive_entries": 2,
"whiteouts": 0
},
{
"digest": "sha256:2971f0a710787419ec533843974be96de47b083059b02e4a0dfdd48a98fdb458",
"compressed_bytes": 35700592,
"archive_entries": 5471,
"whiteouts": 0
},
{
"digest": "sha256:ab3e8c3939ccb8f5d731704f1e752ddb7fa9d135402990246724232683b00ff0",
"compressed_bytes": 598,
"archive_entries": 3,
"whiteouts": 0
},
{
"digest": "sha256:d1dbbe039887ff15d19e26f1fb3c559ea123a580c77bff5e286de1d6e3540595",
"compressed_bytes": 102610,
"archive_entries": 143,
"whiteouts": 0
},
{
"digest": "sha256:b62bd61a70f8477e54c01355ae337a553326e09974eebd65870d66f0b2f1ae3f",
"compressed_bytes": 109565,
"archive_entries": 160,
"whiteouts": 0
},
{
"digest": "sha256:99e6faeb00ebe8336cefd27da2bbedb3b4edc9d3c9e36ce05097163ba105a036",
"compressed_bytes": 475,
"archive_entries": 2,
"whiteouts": 0
},
{
"digest": "sha256:f910ccb3f35e942317fb817caf1ea13ddd0a49263e7bfbf6b8be6d132a663b29",
"compressed_bytes": 243471,
"archive_entries": 181,
"whiteouts": 0
},
{
"digest": "sha256:793e1ade12c8a9541429984963ef1084a96d41a69cbd5669d655829982b3bea7",
"compressed_bytes": 1675,
"archive_entries": 7,
"whiteouts": 0
},
{
"digest": "sha256:7a36c195ce44bc1ce1c7964cfd1fa3f3c32daf3dc9568a4ff7b550b0d93ef0fc",
"compressed_bytes": 36056,
"archive_entries": 7,
"whiteouts": 0
},
{
"digest": "sha256:231fbd5b3576f8c671a67522bad6a83935990a9a7fbe120ff26b422f78bd5f60",
"compressed_bytes": 33942,
"archive_entries": 63,
"whiteouts": 0
},
{
"digest": "sha256:23a0876f55835a5ee79ed45c5a67ba7ac9ca1e4e3168dfa2436dd234a370434a",
"compressed_bytes": 10801,
"archive_entries": 8,
"whiteouts": 0
},
{
"digest": "sha256:9a13796803f4255f7c8a1df9b693923fa002647c2690a148ebf901e4de66cb4f",
"compressed_bytes": 2116,
"archive_entries": 3,
"whiteouts": 0
},
{
"digest": "sha256:48d53f6a4a6c1a1f0ee5b6f45e8e8b47792ff9a4416c00c9c92454634155f915",
"compressed_bytes": 155200,
"archive_entries": 67,
"whiteouts": 0
},
{
"digest": "sha256:d5d5b11d971cbb2269dc1684898da2c0a41bff26630affbd8123ba7c82bd41b1",
"compressed_bytes": 2963,
"archive_entries": 7,
"whiteouts": 0
},
{
"digest": "sha256:d8438040b445dc9c2ad739b44d49d347d4c276ba889d5cdd8153fdadbe14f34d",
"compressed_bytes": 538,
"archive_entries": 4,
"whiteouts": 0
}
],
"python_package_metadata": {
"usr/local/lib/python3.12/site-packages/pip-25.0.1.dist-info/METADATA": {
"name": "pip",
"version": "25.0.1",
"metadata_sha256": "sha256:4fa7318cf30f979db7cec45c12cbbc2b4f88a15f12eefbf59a6291d0a03af926"
},
"usr/local/lib/python3.12/site-packages/uv-0.13.1.dist-info/METADATA": {
"name": "uv",
"version": "0.13.1",
"metadata_sha256": "sha256:3554d26fcb1db453b54bde82aa3830ddc37179f3ac4394d670361553c02d0cf2"
},
"app/.venv/lib/python3.12/site-packages/aiofile-3.12.3.dist-info/METADATA": {
"name": "aiofile",
"version": "3.12.3",
"metadata_sha256": "sha256:faaa3115c495ac1989aa6bda262b79a6c97e056c83e04afcfc71584a59e3ceb1"
},
"app/.venv/lib/python3.12/site-packages/alembic-1.20.0.dist-info/METADATA": {
"name": "alembic",
"version": "1.20.0",
"metadata_sha256": "sha256:bd32c118c43955c106bfa4255b2fb5ac9db410b0f7255a4cafb14b9e221ff41c"
},
"app/.venv/lib/python3.12/site-packages/annotated_doc-0.0.5.dist-info/METADATA": {
"name": "annotated-doc",
"version": "0.0.5",
"metadata_sha256": "sha256:8c24d70c5d9153d22123353a906042fd7603df2d15c2196290b0f8a962558c46"
},
"app/.venv/lib/python3.12/site-packages/annotated_types-0.8.0.dist-info/METADATA": {
"name": "annotated-types",
"version": "0.8.0",
"metadata_sha256": "sha256:614985b278f601b8ef863f82783b991cc3ada4b89f592eb71c7c48c5f2ef2298"
},
"app/.venv/lib/python3.12/site-packages/anyio-4.15.1.dist-info/METADATA": {
"name": "anyio",
"version": "4.15.1",
"metadata_sha256": "sha256:043aecb571af7189e8a6c528f5d8e32545f1b2cdfaaf761d51e6d5b67ea3ca81"
},
"app/.venv/lib/python3.12/site-packages/asyncpg-0.32.0.dist-info/METADATA": {
"name": "asyncpg",
"version": "0.32.0",
"metadata_sha256": "sha256:10c1e84f762a55c69630704e8a429793dcab1ce5edba7deadb35f40476d502c9"
},
"app/.venv/lib/python3.12/site-packages/attrs-26.1.0.dist-info/METADATA": {
"name": "attrs",
"version": "26.1.0",
"metadata_sha256": "sha256:4cd40e690f23bf37cbcad34efd6758e062df1df07c86833f7e3ce95bf1fa38cc"
},
"app/.venv/lib/python3.12/site-packages/authlib-1.9.1.dist-info/METADATA": {
"name": "Authlib",
"version": "1.9.1",
"metadata_sha256": "sha256:7141e57ccac936724fd004b401d0695e0ae48f32f2aee14d90259a9d4bc4fdbd"
},
"app/.venv/lib/python3.12/site-packages/beartype-0.23.1.dist-info/METADATA": {
"name": "beartype",
"version": "0.23.1",
"metadata_sha256": "sha256:ac75ec7a0bd6407db75c5c1da887798dfd4d5d12099e299602d03baa0ba22986"
},
"app/.venv/lib/python3.12/site-packages/cachetools-7.2.2.dist-info/METADATA": {
"name": "cachetools",
"version": "7.2.2",
"metadata_sha256": "sha256:76bbee4a06789a8c42253966988a07aff8f2f29cb1ae3ff9d6f16d661f01f2d4"
},
"app/.venv/lib/python3.12/site-packages/caio-0.12.9.dist-info/METADATA": {
"name": "caio",
"version": "0.12.9",
"metadata_sha256": "sha256:3128051d993cbf71f589f68b0082167fe1c910b17379d27653b6945ec848c3c8"
},
"app/.venv/lib/python3.12/site-packages/certifi-2026.7.22.dist-info/METADATA": {
"name": "certifi",
"version": "2026.7.22",
"metadata_sha256": "sha256:ef5af1638fbb23676ac3c5777dfcfc2cd9c348fe4172ed5ba3d277655b248090"
},
"app/.venv/lib/python3.12/site-packages/cffi-2.1.1.dist-info/METADATA": {
"name": "cffi",
"version": "2.1.1",
"metadata_sha256": "sha256:558bafb9093a8e790175d9ecff9688382981d744877dad86fd6770db0f4dc918"
},
"app/.venv/lib/python3.12/site-packages/click-8.5.0.dist-info/METADATA": {
"name": "click",
"version": "8.5.0",
"metadata_sha256": "sha256:e87bce0bd194de70dfb8e708e0a6b0483009f25611804eaf87bfeb63e6c20501"
},
"app/.venv/lib/python3.12/site-packages/cryptography-50.0.2.dist-info/METADATA": {
"name": "cryptography",
"version": "50.0.2",
"metadata_sha256": "sha256:047cfc71226409de4318b360aef15c63a2adf609731e3dcf7fe932f14ea042ee"
},
"app/.venv/lib/python3.12/site-packages/cyclopts-5.2.0.dist-info/METADATA": {
"name": "cyclopts",
"version": "5.2.0",
"metadata_sha256": "sha256:a1bcd1e587744ec6f5c5c64126ac03a03fc2468f7c91cd1c44572a5ac11dcb2a"
},
"app/.venv/lib/python3.12/site-packages/dnspython-2.9.0.dist-info/METADATA": {
"name": "dnspython",
"version": "2.9.0",
"metadata_sha256": "sha256:d25dbd09b39758cd5cebe518701012a6278731986cd384fc4a7f25e78f7de929"
},
"app/.venv/lib/python3.12/site-packages/docstring_parser-0.18.0.dist-info/METADATA": {
"name": "docstring_parser",
"version": "0.18.0",
"metadata_sha256": "sha256:cbc42027997fd4b194ae5fd064a4d1e57b92976941d0c26d369561a7c016a333"
},
"app/.venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/METADATA": {
"name": "email-validator",
"version": "2.3.0",
"metadata_sha256": "sha256:2a97b81eefcd856bc80b0346f47fa2d800b9a438bf8f9231ae00fe931d5c9fbc"
},
"app/.venv/lib/python3.12/site-packages/exceptiongroup-1.3.1.dist-info/METADATA": {
"name": "exceptiongroup",
"version": "1.3.1",
"metadata_sha256": "sha256:81984a523a2f7a522ad12bea784a8bb85edec0805ebbd0fb4e350169a36dd802"
},
"app/.venv/lib/python3.12/site-packages/fastapi-0.143.3.dist-info/METADATA": {
"name": "fastapi",
"version": "0.143.3",
"metadata_sha256": "sha256:364f68b16f489abe36d621da2fa727f774bec90916cd3325b78e422af3b59a5f"
},
"app/.venv/lib/python3.12/site-packages/fastmcp-4.1.0.dist-info/METADATA": {
"name": "fastmcp",
"version": "4.1.0",
"metadata_sha256": "sha256:cfdcfd24ad904514087ec1735baa54df174f72f570833a16b6074887cfc51fa6"
},
"app/.venv/lib/python3.12/site-packages/fastmcp_slim-4.1.0.dist-info/METADATA": {
"name": "fastmcp-slim",
"version": "4.1.0",
"metadata_sha256": "sha256:e8eca5fbae348ee6dcda0a0f1bf0dffa493e8d4d8763647ee48f4f871e35c998"
},
"app/.venv/lib/python3.12/site-packages/greenlet-3.5.6.dist-info/METADATA": {
"name": "greenlet",
"version": "3.5.6",
"metadata_sha256": "sha256:b9b4cbbc1f3165e50fbc4696c433fe82b8a151fde65eede28fb6ec5efb3e1fab"
},
"app/.venv/lib/python3.12/site-packages/griffelib-2.3.2.dist-info/METADATA": {
"name": "griffelib",
"version": "2.3.2",
"metadata_sha256": "sha256:fd24a68ed08309718d5759b8de3b90392b5804240d94834e6455be110ead34b3"
},
"app/.venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/METADATA": {
"name": "h11",
"version": "0.16.0",
"metadata_sha256": "sha256:28f326098ac09fcba79b8f180f96087c841fe2456215cb7b872a9c7d5cd19d64"
},
"app/.venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/METADATA": {
"name": "httpcore",
"version": "1.0.9",
"metadata_sha256": "sha256:fe2d4fda6199128978779e0cf27f3c045c531863fcdd987eacc74f3a18d41c21"
},
"app/.venv/lib/python3.12/site-packages/httpcore2-2.13.1.dist-info/METADATA": {
"name": "httpcore2",
"version": "2.13.1",
"metadata_sha256": "sha256:37a0ea0674e98b7c3a1f99c17d9bb5457de27a0f93c8b6560c9d17d525139abb"
},
"app/.venv/lib/python3.12/site-packages/httptools-0.9.0.dist-info/METADATA": {
"name": "httptools",
"version": "0.9.0",
"metadata_sha256": "sha256:8a743396f45465204e2b44b43cb57ec4a343c423f52604bbaf1777fd438698c9"
},
"app/.venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/METADATA": {
"name": "httpx",
"version": "0.28.1",
"metadata_sha256": "sha256:febb9b0f8f3e80d57c8199c304f35c4336e8581d1d18d7983c92766b82793b25"
},
"app/.venv/lib/python3.12/site-packages/httpx2-2.13.1.dist-info/METADATA": {
"name": "httpx2",
"version": "2.13.1",
"metadata_sha256": "sha256:b75b03a003b5593e000907cf7239fcc3f688b8f17db4ecff883d11221ea988fc"
},
"app/.venv/lib/python3.12/site-packages/idna-3.20.dist-info/METADATA": {
"name": "idna",
"version": "3.20",
"metadata_sha256": "sha256:dbd8c14c1e4ca1e0c9824a6dbc7cbbf78884f38eb52d91148cd3025f671e4b85"
},
"app/.venv/lib/python3.12/site-packages/jaraco.classes-3.4.0.dist-info/METADATA": {
"name": "jaraco.classes",
"version": "3.4.0",
"metadata_sha256": "sha256:2e6b102232edd45ae1bb8a6b4091fd40cf3201a6bb6fd4bc97c5e8cd765a44b8"
},
"app/.venv/lib/python3.12/site-packages/jaraco_context-6.1.2.dist-info/METADATA": {
"name": "jaraco.context",
"version": "6.1.2",
"metadata_sha256": "sha256:f1b65b60aea229af54e09b17ae0036cf048fe4a6161fa2e7966a8ea5c2321491"
},
"app/.venv/lib/python3.12/site-packages/jaraco_functools-4.6.0.dist-info/METADATA": {
"name": "jaraco.functools",
"version": "4.6.0",
"metadata_sha256": "sha256:6ed3cae5b8eef084c3c7b2385a0a8ac4c8155ab7c729212bea099bee69d5bd6c"
},
"app/.venv/lib/python3.12/site-packages/jeepney-0.9.0.dist-info/METADATA": {
"name": "jeepney",
"version": "0.9.0",
"metadata_sha256": "sha256:b8e6c353e9aaed0ed0144029556417fda23b64f344e718331907054ba05b8c62"
},
"app/.venv/lib/python3.12/site-packages/joserfc-1.7.5.dist-info/METADATA": {
"name": "joserfc",
"version": "1.7.5",
"metadata_sha256": "sha256:17df62bbdc7212bbcda3144e72720a62fc34bbf76c573062939120738545250f"
},
"app/.venv/lib/python3.12/site-packages/jsonref-1.1.0.dist-info/METADATA": {
"name": "jsonref",
"version": "1.1.0",
"metadata_sha256": "sha256:f98db3890394fba23912faab86ad8f70ed564fc8c885298b636b270f28453e43"
},
"app/.venv/lib/python3.12/site-packages/jsonschema-4.26.0.dist-info/METADATA": {
"name": "jsonschema",
"version": "4.26.0",
"metadata_sha256": "sha256:05b189866ca98a96da3934bf6b83687ced3ff85325273b77e16b705f6d8b26d2"
},
"app/.venv/lib/python3.12/site-packages/jsonschema_path-0.5.0.dist-info/METADATA": {
"name": "jsonschema-path",
"version": "0.5.0",
"metadata_sha256": "sha256:cd7e9a4426436980f099d826dbce8f61afa6603b496385fba9a9eb0ad59cdd48"
},
"app/.venv/lib/python3.12/site-packages/jsonschema_specifications-2025.9.1.dist-info/METADATA": {
"name": "jsonschema-specifications",
"version": "2025.9.1",
"metadata_sha256": "sha256:35abd41757f32b4ea24756920ded47b70173d77cbc052a5a6d3ab583b2e8d89d"
},
"app/.venv/lib/python3.12/site-packages/keyring-25.7.0.dist-info/METADATA": {
"name": "keyring",
"version": "25.7.0",
"metadata_sha256": "sha256:bd54de98fede6dc3e1f3cd89b4e37c95d8842a523bdbb9e52ab40edff1837163"
},
"app/.venv/lib/python3.12/site-packages/mako-1.4.3.dist-info/METADATA": {
"name": "Mako",
"version": "1.4.3",
"metadata_sha256": "sha256:39ea65f21e706265428ea6f2925520f419a10f0113a59318192ed38175d8838b"
},
"app/.venv/lib/python3.12/site-packages/markdown_it_py-4.2.0.dist-info/METADATA": {
"name": "markdown-it-py",
"version": "4.2.0",
"metadata_sha256": "sha256:72c36ff516755443b1ecb61e17b2567a990230b49a504b0eb0c42d5f82448a9c"
},
"app/.venv/lib/python3.12/site-packages/markupsafe-3.0.4.dist-info/METADATA": {
"name": "MarkupSafe",
"version": "3.0.4",
"metadata_sha256": "sha256:66767d76388ece15d49d50dafb655891ef5d868715e7128e7f7d737a70b353c4"
},
"app/.venv/lib/python3.12/site-packages/mcp-2.3.0.dist-info/METADATA": {
"name": "mcp",
"version": "2.3.0",
"metadata_sha256": "sha256:a94577513a4fa0cb639c279c1ad6f4d49650872d45f2f4ab9bb2d9c2a505d457"
},
"app/.venv/lib/python3.12/site-packages/mcp_types-2.3.0.dist-info/METADATA": {
"name": "mcp-types",
"version": "2.3.0",
"metadata_sha256": "sha256:eb973e8b7f53d52ab1df9d1f18854ffa84f074f6052e310089e2655961c48ca9"
},
"app/.venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/METADATA": {
"name": "mdurl",
"version": "0.1.2",
"metadata_sha256": "sha256:b53b29d48f499367053fda3c81e7ce27d2558380ebbf83e66023b02eb7ddd25d"
},
"app/.venv/lib/python3.12/site-packages/more_itertools-11.2.1.dist-info/METADATA": {
"name": "more-itertools",
"version": "11.2.1",
"metadata_sha256": "sha256:8c558bfab61818450e78db4018281f8f7b22115e681cd53ae1d9d4931be54f15"
},
"app/.venv/lib/python3.12/site-packages/nats_py-2.16.0.dist-info/METADATA": {
"name": "nats-py",
"version": "2.16.0",
"metadata_sha256": "sha256:58ddf3dd698f9026d397e5bb56a0baac723ba221d3dddae0831cfacc75c34255"
},
"app/.venv/lib/python3.12/site-packages/openapi_pydantic-0.6.0.dist-info/METADATA": {
"name": "openapi-pydantic",
"version": "0.6.0",
"metadata_sha256": "sha256:e46a181161c62fa24d7d3d0ff2eaabea3a7b580ad7aa9f70d1f08bd129d46f49"
},
"app/.venv/lib/python3.12/site-packages/opentelemetry_api-1.45.1.dist-info/METADATA": {
"name": "opentelemetry-api",
"version": "1.45.1",
"metadata_sha256": "sha256:5bc71e90cb421be92a43bf5ad5b0f25dccfa2a24ddceaa2877779879962a4c9e"
},
"app/.venv/lib/python3.12/site-packages/packaging-26.3.dist-info/METADATA": {
"name": "packaging",
"version": "26.3",
"metadata_sha256": "sha256:70fdb89fc4d4a9a043bf7372b8972bcc883fddff34ab55e9cf80d73875384763"
},
"app/.venv/lib/python3.12/site-packages/pathable-0.6.0.dist-info/METADATA": {
"name": "pathable",
"version": "0.6.0",
"metadata_sha256": "sha256:c418727931012c2306cb8fa2726d044616c3178c1fc078ce182385dcf2b59922"
},
"app/.venv/lib/python3.12/site-packages/platformdirs-4.13.3.dist-info/METADATA": {
"name": "platformdirs",
"version": "4.13.3",
"metadata_sha256": "sha256:3814840758f662bb98053d08f99085fb77721812258573732b092fd7f2120c30"
},
"app/.venv/lib/python3.12/site-packages/psycopg2_binary-2.9.13.dist-info/METADATA": {
"name": "psycopg2-binary",
"version": "2.9.13",
"metadata_sha256": "sha256:a5267b4520191137e34589704162fce02cfd40efcfeb899c45187c7f6bfea7e5"
},
"app/.venv/lib/python3.12/site-packages/py_key_value_aio-0.4.6.dist-info/METADATA": {
"name": "py-key-value-aio",
"version": "0.4.6",
"metadata_sha256": "sha256:0c1af357b841bc3862e39543faa863346c487be9f2e2ffefba009e957a256bee"
},
"app/.venv/lib/python3.12/site-packages/pycparser-3.11.dist-info/METADATA": {
"name": "pycparser",
"version": "3.11",
"metadata_sha256": "sha256:e3a74c846648bb55f4f907284b745e2003b87b96d9c9d17a8a50cf37804541c9"
},
"app/.venv/lib/python3.12/site-packages/pydantic-2.14.1.dist-info/METADATA": {
"name": "pydantic",
"version": "2.14.1",
"metadata_sha256": "sha256:4d4c8e8d5e6a27d5208f0d7949f25628e6747133034969d4d1399b1ad5394036"
},
"app/.venv/lib/python3.12/site-packages/pydantic_core-2.50.1.dist-info/METADATA": {
"name": "pydantic_core",
"version": "2.50.1",
"metadata_sha256": "sha256:ae6817764b603fa2300cd31b9566ecc33476df46163c4150fffc353121a166f2"
},
"app/.venv/lib/python3.12/site-packages/pydantic_settings-2.16.0.dist-info/METADATA": {
"name": "pydantic-settings",
"version": "2.16.0",
"metadata_sha256": "sha256:470656112388bca95fd7d27b8954fda1f11dd6579563cfb9c0ea0445d1746b77"
},
"app/.venv/lib/python3.12/site-packages/pygments-2.21.0.dist-info/METADATA": {
"name": "Pygments",
"version": "2.21.0",
"metadata_sha256": "sha256:1dde075570136774c706bf0009183a793fe0ee262e4a5590cc6eff8453eedd43"
},
"app/.venv/lib/python3.12/site-packages/pyjwt-2.15.1.dist-info/METADATA": {
"name": "PyJWT",
"version": "2.15.1",
"metadata_sha256": "sha256:1ea0c9f139b8c928276b3628af165955f6f764491448a6ad8f103cdcbb382da3"
},
"app/.venv/lib/python3.12/site-packages/pyperclip-1.11.0.dist-info/METADATA": {
"name": "pyperclip",
"version": "1.11.0",
"metadata_sha256": "sha256:2493839e0751761f27d39aa6d5c5dfd1df839c45da8f328aba4ae4102868b825"
},
"app/.venv/lib/python3.12/site-packages/python_dotenv-1.2.4.dist-info/METADATA": {
"name": "python-dotenv",
"version": "1.2.4",
"metadata_sha256": "sha256:87cfee6042412d48df1100ea7822684988c3f2b79de7a250f4717f4df3026d6f"
},
"app/.venv/lib/python3.12/site-packages/python_multipart-0.0.32.dist-info/METADATA": {
"name": "python-multipart",
"version": "0.0.32",
"metadata_sha256": "sha256:e9d399d7dea5eddf0e4d24b5c24687a82e7e50bf2c2b30f8f8a06a64d887dd86"
},
"app/.venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info/METADATA": {
"name": "PyYAML",
"version": "6.0.3",
"metadata_sha256": "sha256:03c3b415ed38d09faedc49360e930769b40c58f68585e6de00e2e4916a858d34"
},
"app/.venv/lib/python3.12/site-packages/referencing-0.37.0.dist-info/METADATA": {
"name": "referencing",
"version": "0.37.0",
"metadata_sha256": "sha256:c93b00e6ab1524fd60848376604c189a114374776475c25a31d57be47b29de6a"
},
"app/.venv/lib/python3.12/site-packages/rich-15.0.0.dist-info/METADATA": {
"name": "rich",
"version": "15.0.0",
"metadata_sha256": "sha256:fad34fc603fac4481bf81f8dd629492fc302c0ec31909c86644751512afb2e3b"
},
"app/.venv/lib/python3.12/site-packages/rich_rst-2.2.0.dist-info/METADATA": {
"name": "rich-rst",
"version": "2.2.0",
"metadata_sha256": "sha256:2cd1f39149e69bd94c4f1c30cb26c763e45689e6d6527b4c23afa1112c48f165"
},
"app/.venv/lib/python3.12/site-packages/rpds_py-2026.9.1.dist-info/METADATA": {
"name": "rpds-py",
"version": "2026.9.1",
"metadata_sha256": "sha256:5d72dca2e387c8d2b4180b68ee87c15b64751e059100a6db58891ec9995445c3"
},
"app/.venv/lib/python3.12/site-packages/secretstorage-3.5.0.dist-info/METADATA": {
"name": "SecretStorage",
"version": "3.5.0",
"metadata_sha256": "sha256:b98e3dc42ff7e9b1bacce60dac2662cd9965fad6e4469fc9483c9eb99998c367"
},
"app/.venv/lib/python3.12/site-packages/sqlalchemy-2.1.5.dist-info/METADATA": {
"name": "SQLAlchemy",
"version": "2.1.5",
"metadata_sha256": "sha256:7f568ea71aecfb29792ccee2c8b1345825e385d54b7e7bba755e445e53b5696f"
},
"app/.venv/lib/python3.12/site-packages/sse_starlette-3.5.0.dist-info/METADATA": {
"name": "sse-starlette",
"version": "3.5.0",
"metadata_sha256": "sha256:6dc401682bdae1a3e1f31b1c320b7f926c354643993840393875ebfc171c9014"
},
"app/.venv/lib/python3.12/site-packages/starlette-1.8.0.dist-info/METADATA": {
"name": "starlette",
"version": "1.8.0",
"metadata_sha256": "sha256:551e8d74d290002521c655b816b27654e49922b88cb474c8d710a893099036f8"
},
"app/.venv/lib/python3.12/site-packages/truststore-0.10.5.dist-info/METADATA": {
"name": "truststore",
"version": "0.10.5",
"metadata_sha256": "sha256:1fd496f290853214e630d96f7163d2dd916f84ebe634b58aa827d6853e8f8610"
},
"app/.venv/lib/python3.12/site-packages/typing_extensions-4.16.0.dist-info/METADATA": {
"name": "typing_extensions",
"version": "4.16.0",
"metadata_sha256": "sha256:b05084ca1d50879865178d9fff9fabeab61bdfb1f361bfbde95421ffc8f9be46"
},
"app/.venv/lib/python3.12/site-packages/typing_inspection-0.4.4.dist-info/METADATA": {
"name": "typing-inspection",
"version": "0.4.4",
"metadata_sha256": "sha256:bad3d9e6342ef6750cf5128ec942327b8bebdce0b6e4d6f67cb15b27ae5118da"
},
"app/.venv/lib/python3.12/site-packages/uncalled_for-0.4.1.dist-info/METADATA": {
"name": "uncalled-for",
"version": "0.4.1",
"metadata_sha256": "sha256:45a21666ddfa8ca8d4e2423c05edaeaa7827686a3ae4fed82b24427854745c2f"
},
"app/.venv/lib/python3.12/site-packages/uvicorn-0.54.0.dist-info/METADATA": {
"name": "uvicorn",
"version": "0.54.0",
"metadata_sha256": "sha256:9399e5ddda3d26e842d6fb5420c38b0857aac568d53badbdc224b3a21339efa8"
},
"app/.venv/lib/python3.12/site-packages/uvloop-0.23.0.dist-info/METADATA": {
"name": "uvloop",
"version": "0.23.0",
"metadata_sha256": "sha256:fe11a50198ffd4d9f1cb20922dc638ad459d5e63e6c615b0c1c69448d3362977"
},
"app/.venv/lib/python3.12/site-packages/watchfiles-1.3.0.dist-info/METADATA": {
"name": "watchfiles",
"version": "1.3.0",
"metadata_sha256": "sha256:1fba87d08d66f10f7515e4817abd4ac7f27abf3300cb33b7ad3f79762987a502"
},
"app/.venv/lib/python3.12/site-packages/websockets-17.2.dist-info/METADATA": {
"name": "websockets",
"version": "17.2",
"metadata_sha256": "sha256:0d5f1279d095e7ba84ef21614af0822dc500ccb2e51b7c3a19eda7159b2dade4"
},
"app/.venv/lib/python3.12/site-packages/hub_core-0.2.0.dist-info/METADATA": {
"name": "hub-core",
"version": "0.2.0",
"metadata_sha256": "sha256:84a59c6ea36d6d8a0b91b76e52f351a5ce6f2fd9ace8a4c887b51bab05973953"
}
},
"package_metadata_equal_to_deployed_image": true,
"hub_core_source_hashes_equal_to_deployed_image": true,
"image_executed": false,
"image_installed_or_daemon_pulled": false,
"anonymous_protocol_only": true,
"token_retained": false,
"limitations": [
"Selected code hashes and package inventory do not prove full application acceptance or hermetic provenance.",
"Floating dependency origins remain unknown; observed byte changes require explicit review.",
"New API behavior is not deployed or natively accepted."
]
}

View file

@ -0,0 +1,774 @@
{
"schema": "statehub.guard-image-inspection.v1",
"status": "verified-selected-public-image-bytes",
"source_commit": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"tag": "main-c103cbf",
"image_digest": "sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1",
"selected_source_hashes": {
"app/api/services/historical_projection.py": "sha256:e24e57c58f4aaa4ec9d9bf088009ac69006e53f75b9477ee53dc26c4e850b975",
"app/api/routers/workstreams.py": "sha256:9c9bf4376dd323b52109912bb3f615949e89ac02c8b88b4720f569f8565ad1d6",
"app/scripts/consistency_check.py": "sha256:1bfbc89d3ff5c621ec541fd32384083cc7dcf96a639b217d62b6fc34de238efd",
"app/api/services/forge_projection.py": "sha256:b980e62cbd85c3e7df42b01abf14354e04133374db94af6531dcd91629c3487d",
"app/migrations/versions/c4d5e6f7a8b9_inbox_feed_revision.py": "sha256:48f1730037be99b5623e878d7f20a06bec243ce27317fde81c82e16006d7b3ce",
"tmp/.ci-build-id": "sha256:97f14badea4537238f1f271813f40c4390fb6c99fbe7fc00025ee2af974901e2"
},
"observed_files": {
"tmp/.ci-build-id": "sha256:97f14badea4537238f1f271813f40c4390fb6c99fbe7fc00025ee2af974901e2",
"tmp/hub-core/hub_core/__init__.py": "sha256:098578bae76f7d97354b8f3dfe8ddc63b15806a46d1691d70ed12d9839d69aec",
"tmp/hub-core/hub_core/conformance/__init__.py": "sha256:f7ce0a651913f157e586afd6e953b483add0dd5257ee9f2406c47e8d46ee9587",
"tmp/hub-core/hub_core/conformance/harness.py": "sha256:ca870fbbec7b7f5db6521d615fd76dfcbb9e97cbdfb037ffa993851a663b3c40",
"tmp/hub-core/hub_core/contracts/__init__.py": "sha256:ffb7a6b79ce15ddd57943bfbc40799e078c6f57c6690018237baa3f3a755ac49",
"tmp/hub-core/hub_core/contracts/helixforge_hub_extension/__init__.py": "sha256:32c095a16f777127ec0d2cd5e8373889866b81e9955d01e5adaf9503f6864da4",
"tmp/hub-core/hub_core/contracts/helixforge_hub_extension/v0_1_0/__init__.py": "sha256:e176b86b24d79c11f78ad714878bc3fca41c7821654fa766278b697360a41201",
"tmp/hub-core/hub_core/contracts/repository_navigation/__init__.py": "sha256:64912fe6673b72c3c0d8a2da28673d58bdf6f4185a1376ffe43d3735350adb60",
"tmp/hub-core/hub_core/contracts/repository_navigation/v1_0_0/__init__.py": "sha256:574cf1fee8433e0b11d9475cfbcc3837730b55f6ea1faa4920cba106d959464f",
"tmp/hub-core/hub_core/contracts/workload_projection/__init__.py": "sha256:c01198d23571442c1c3a596c7cd16be17dc1a3efdcfe3e8f9725b7dba16fc103",
"tmp/hub-core/hub_core/contracts/workload_projection/v1_0_0/__init__.py": "sha256:a9ecfecbf44893d32268288c872cdede0440d2a1373d37a47f69ba8c6431de0d",
"tmp/hub-core/hub_core/database.py": "sha256:a7704e97509433e90655b0ea22d5fa626d75b8b6470015ef8b9e5997e7a7f5ea",
"tmp/hub-core/hub_core/events.py": "sha256:c7125a242ed638a3ede29129e4ad826cd188cf76239b59a8587a40d182bbd0e7",
"tmp/hub-core/hub_core/mcp/__init__.py": "sha256:f97b25193573e56886b66f91cb8c86ef4a39f2100d709869e279e17456959859",
"tmp/hub-core/hub_core/mcp/credentials.py": "sha256:f5433d29848bd5a399a5e31695e0d908748e0a0856d26b2d691b667c50c95c34",
"tmp/hub-core/hub_core/mcp/server.py": "sha256:fc6a6de0a29ad9b6da176302a7d24e4ba987f667b6a7fb001029f00cb0d0c582",
"tmp/hub-core/hub_core/message_identity.py": "sha256:0ab996ba50f236c1342ce72ca8ae6ff28102ef41216972a745f7260e0c93fb24",
"tmp/hub-core/hub_core/migrations/__init__.py": "sha256:ccf4820e270c97fd5d4ac02f0c96362a772b8f4d1bcccc3f5e0077b77f575d36",
"tmp/hub-core/hub_core/migrations/env.py": "sha256:282e6e1a9e4a3cfdc111887f04dc5c1645307b3943a421852abe1709ce712e57",
"tmp/hub-core/hub_core/migrations/roles.py": "sha256:91e85297d296b0c4b9c78b16ae67d3a4707232d8f32b2cac2b2e84f31fa80e89",
"tmp/hub-core/hub_core/migrations/versions/0001_core_schema.py": "sha256:c65f076a7b56fb93ee67869e04d922ea396eab72a4c2d2f0dabd706c918aa081",
"tmp/hub-core/hub_core/migrations/versions/0002_runtime_ports.py": "sha256:d3ce15463841b3c13eaafdd137a65d4cf2839c0b8e8fddcb2cb2f1adbceb9f00",
"tmp/hub-core/hub_core/migrations/versions/0003_repository_navigation.py": "sha256:fb2d2cb5ed10f1760ab789ced8d43c657c1bedc29ba666231a70a18636160902",
"tmp/hub-core/hub_core/migrations/versions/0004_workload_projection.py": "sha256:87ce668bfef5cf4aaf0cfd3b48d498f2370f68e06a6e66375e446af6fbbb9c96",
"tmp/hub-core/hub_core/migrations/versions/0005_message_identity_aliases.py": "sha256:ec05d2c3cb906b78cdec4d220a7ce09264c38904c792cdad3cd1082e7eace7c0",
"tmp/hub-core/hub_core/migrations/versions/0006_outcome_outbox.py": "sha256:05effdf6f258836d1cd223f9d9fc3447d264484021d3a51cfa42517453d613e1",
"tmp/hub-core/hub_core/migrations/versions/__init__.py": "sha256:569f6d7e5cc1c17b7b1eee3eec3b82774b745d01ee1dfdf851a5c6f5c337f0bb",
"tmp/hub-core/hub_core/models/__init__.py": "sha256:c0b6de4986614a163dbb2467d15882eadbd66800478a50de4d6404198d1f773a",
"tmp/hub-core/hub_core/models/agent_message.py": "sha256:23d16eeaffe780f326b08e6c441100e6ae7b4075bbb6421734c06156a87c4375",
"tmp/hub-core/hub_core/models/base.py": "sha256:85bb40bde6f4cf8e6c5700a3a016a711fab4adff77c5eb78f89827fe28b9537b",
"tmp/hub-core/hub_core/models/capability_catalog.py": "sha256:eebbb31f264821a61662d3c9e8c7eba74f46d7f68b946e35f8127343bf2ff9c4",
"tmp/hub-core/hub_core/models/capability_request.py": "sha256:70a867c82aaa061a4e1c671b023d213032464e776226280f99e2ca192e2a6eba",
"tmp/hub-core/hub_core/models/domain.py": "sha256:ddf45c37e3c37014ddd9148be01cf104658e1601abba2a8ba96f7680cdb581b3",
"tmp/hub-core/hub_core/models/managed_repo.py": "sha256:835c5d44581daf7d7dd95325e3f7fdf0add4d529b83779ed83b5e812dcb3aa61",
"tmp/hub-core/hub_core/models/message_identity_alias.py": "sha256:d07d59cd9c9351669e8319727d08bc0e9bb7e0ee36bf8a34c0c258f0b4ea61e4",
"tmp/hub-core/hub_core/models/progress_event.py": "sha256:ee750127db2f49c5b9b94773a408f7f965d834b02e6d962220f4bc762309161f",
"tmp/hub-core/hub_core/models/tpsc.py": "sha256:cb28cbe3512486adb73c0bce633b3c542a41a64e7ec673e86a5a25ab20d94afe",
"tmp/hub-core/hub_core/routers/__init__.py": "sha256:800d1c45f597fcb4970ca7a83acd2b36016006efbdf638e14a3482a954d9046d",
"tmp/hub-core/hub_core/routers/capabilities.py": "sha256:18a403ad6ac961bc490543b698e079336f60ef9902a6cd71ef9899076660d5c0",
"tmp/hub-core/hub_core/routers/domains.py": "sha256:d4c4061d2ab0d2d6390a10f4f815deb0b93b3979345aee965b666110ba32e6e0",
"tmp/hub-core/hub_core/routers/messages.py": "sha256:903bd4f8c8ca599b606cf2229315de21097360816fcda907159dac4f48cee512",
"tmp/hub-core/hub_core/routers/policy.py": "sha256:358271263295fdebb5bcb95c3a27bd3ea456964a77bc01c3f784fb7a8754aacf",
"tmp/hub-core/hub_core/routers/progress.py": "sha256:680cf4dea00a1734d7d70ef7880acc8fd39f045521baa47f415c17934779d18a",
"tmp/hub-core/hub_core/routers/repos.py": "sha256:1bca6c9b2b5bbe172f5b935b763ac1e399b1d403cdc2c463000ae79f843257a2",
"tmp/hub-core/hub_core/routers/tpsc.py": "sha256:706815b01be1c0320bf73cf9cff3e9415c1f27b8449ee9e6fea67b12d3042fd1",
"tmp/hub-core/hub_core/runtime/__init__.py": "sha256:c522e626373407bf9bcd727dac7bb812cbdc8c3ef5bb6509a74949e5b49ab4c2",
"tmp/hub-core/hub_core/runtime/app.py": "sha256:87b077498bbe321c73139e51f7ca689fdc7963a98c4d72a5a3bbcc564f47ee76",
"tmp/hub-core/hub_core/runtime/cli.py": "sha256:98ec00f2a12911245827f515877472ae1c37cea65a42454494450ffbe7380e57",
"tmp/hub-core/hub_core/runtime/compat.py": "sha256:9f1c4575bb406ae1174da1a005ec16f44ace63768617e11164b44b4051162d0d",
"tmp/hub-core/hub_core/runtime/compat_catalogs.py": "sha256:250f61ea39cced32c8cd932c4e770ae8be54ff1cf1e257ee2c82324bde0d7a26",
"tmp/hub-core/hub_core/runtime/config.py": "sha256:009b2fc5d1f8fc390d478b01444f610ada91e5fee30534936382be2529a843fc",
"tmp/hub-core/hub_core/runtime/inbox_projection.py": "sha256:84499238654310b86f7a97f2817163ff4c4da0dfce562c677294fa3dfef7f398",
"tmp/hub-core/hub_core/runtime/migration.py": "sha256:d12731fa581c48bf58deec19405ece977c89d08993b2a2ad047cb1fd17318ea8",
"tmp/hub-core/hub_core/runtime/models.py": "sha256:367ca4aa29f59f8e3f59eab22f12782146cf623fa7ac7c22346c794b85a88185",
"tmp/hub-core/hub_core/runtime/ports.py": "sha256:ab70a401deae73389761a0e88dc8ee843df00a671fae6919b1f7eed344cfb542",
"tmp/hub-core/hub_core/runtime/postgres_store.py": "sha256:9286e7845009b66f00069d67177733dabe372d79986c33ca9b43e00dfa5a2341",
"tmp/hub-core/hub_core/runtime/repo_manager_client.py": "sha256:8fa305277c5f3ddfdbe1daf4023ce6c3cde03b5c18c1292dd6aac3fe995aabe1",
"tmp/hub-core/hub_core/runtime/repository_navigation.py": "sha256:f3503596781f3e7f7d53dd28dd3aaf563905f1398575b40c8080e2b1b9978b1e",
"tmp/hub-core/hub_core/runtime/repository_navigation_routes.py": "sha256:eab78ab418a7b542dcdcab5da023bacc65fb50520853f8d179accb2105e373cf",
"tmp/hub-core/hub_core/runtime/store.py": "sha256:2fb78f14bab8df08807322d6f6416745856d69e6001381246abbac879891858d",
"tmp/hub-core/hub_core/runtime/tables.py": "sha256:a5ff72a9c54eedcc8bb81330e62ee72578a383a1d03a1acb598c72c96cdfbe9e",
"tmp/hub-core/hub_core/runtime/validation.py": "sha256:2add804d95d5d0469d6d8d605fbd1013885da972489a017260c6fddef7b80c79",
"tmp/hub-core/hub_core/runtime/workload_projection.py": "sha256:8500260404b0c566a62e51fef63ee320d4e3dafe5e2467f44db884296b9e3bf4",
"tmp/hub-core/hub_core/runtime/workload_projection_routes.py": "sha256:5c71189b98867f2f1f7612f47ee69c0ec3ddf836b9b1c7e134b98a2be45791de",
"tmp/hub-core/hub_core/schemas/__init__.py": "sha256:dfa2ec2d125f03a532637d2fbef3058ebe1f85c515ff42a930198e164b7812f7",
"tmp/hub-core/hub_core/schemas/agent_message.py": "sha256:d6a7f40dc9a3c61be761f4d2e2c08f726fb0a423ef73e273a7cd97c69ae6c6a3",
"tmp/hub-core/hub_core/schemas/capability.py": "sha256:949c55cb1f2694de4617ad53dc9cb7bc0e72addd7b9d0f104b93d783e4edc647",
"tmp/hub-core/hub_core/schemas/doi.py": "sha256:73d675aecabd5a62ae13184494a4b9db122ad24b3132e1d0e908eef802382f36",
"tmp/hub-core/hub_core/schemas/domain.py": "sha256:872a704fea959d2e4d0ff771770a97160457282218f4748ba4f830c489543aac",
"tmp/hub-core/hub_core/schemas/managed_repo.py": "sha256:a7ab3b1ab399da81324693dcd5d3feeccb211642b10f11cd3f03c7fe6ba751d4",
"tmp/hub-core/hub_core/schemas/policy.py": "sha256:bdaef1640783ac325a050cadf214e731d7c8e5e3a35dbb8f7562d5abbd209a4c",
"tmp/hub-core/hub_core/schemas/progress_event.py": "sha256:9ac7b7fd4881d424bfe59c5001554fd7302243e8489d5e777584d11ead1db328",
"tmp/hub-core/hub_core/schemas/tpsc.py": "sha256:5640d96a7fa862a468eeb0d6da002697b1f58e4cd675a4603b91e448d4db851e",
"tmp/hub-core/hub_core/security/__init__.py": "sha256:2754e25ec0f5725c33cb0b4dff1b7d10b364ebd828e609bb5b44eee3309d2d60",
"tmp/hub-core/hub_core/security/account_reader.py": "sha256:27019616b84cf030969a8e3c0850b5ae52f336008fd9daa4c26360566e74a39b",
"tmp/hub-core/hub_core/security/audit.py": "sha256:94cb85d71f065443c6423871b59d41e929af0441c95928273caf3e38dad8125c",
"tmp/hub-core/hub_core/security/boundary.py": "sha256:a1629ac717672276f61015c83f7af6e375bbd8c1234c712dd3d225da307ae0d6",
"tmp/hub-core/hub_core/security/browser.py": "sha256:fd474ee4b9611fe8dd2c60111402c2fce67d680a7da3519b5d4a495a6b559b7a",
"tmp/hub-core/hub_core/security/config.py": "sha256:7d604f6aeebde393a371ec3e0ab174934e10808c29fb370acba031486e9c02a3",
"tmp/hub-core/hub_core/security/context.py": "sha256:1181bbf12ba86bfd5046dab2f3a22a64ee3686be6dd52ab3e843303349b13a52",
"tmp/hub-core/hub_core/security/facts.py": "sha256:3de4db38ffd3f86f4918d76f811289cd501be3c28dcba16f5088aa2a2b7529ce",
"tmp/hub-core/hub_core/security/identity.py": "sha256:d7a0bab9d59a5f342fdedc9723d818a9d2537a59c6a9415455786af748f912e9",
"tmp/hub-core/hub_core/security/policy.py": "sha256:a2370e9ea5b04b1d5a429644d7f81edb1cbe8e15214c23b16cd6f949613eebd6",
"tmp/hub-core/hub_core/utils/__init__.py": "sha256:ce4ddb30ccc4fd2c4ee59e8a3c088a12165171af02aea957f17f72cd868e1899",
"tmp/hub-core/hub_core/utils/pagination.py": "sha256:366250b85052c7aabc2a2262521d34233124ba3a41026042792f8eda706ecb4f",
"tmp/hub-core/hub_core/utils/paths.py": "sha256:988a889be74f0626ca3c27b1d6677bd4a556e35de389c060d07ab64fa1c22fc8",
"tmp/hub-core/hub_core/utils/routing.py": "sha256:c94b44c5f1ab723e123503e20e0309f28abeeabea6d51beda79247d99852ad1e",
"tmp/hub-core/hub_core/utils/slugs.py": "sha256:eda7a7d18ff21a4d949223b75a2b615a949e615f461152a9cb9a2cf74b491e2d",
"app/.venv/lib/python3.12/site-packages/hub_core/__init__.py": "sha256:098578bae76f7d97354b8f3dfe8ddc63b15806a46d1691d70ed12d9839d69aec",
"app/.venv/lib/python3.12/site-packages/hub_core/conformance/__init__.py": "sha256:f7ce0a651913f157e586afd6e953b483add0dd5257ee9f2406c47e8d46ee9587",
"app/.venv/lib/python3.12/site-packages/hub_core/conformance/harness.py": "sha256:ca870fbbec7b7f5db6521d615fd76dfcbb9e97cbdfb037ffa993851a663b3c40",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/__init__.py": "sha256:ffb7a6b79ce15ddd57943bfbc40799e078c6f57c6690018237baa3f3a755ac49",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/helixforge_hub_extension/__init__.py": "sha256:32c095a16f777127ec0d2cd5e8373889866b81e9955d01e5adaf9503f6864da4",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/helixforge_hub_extension/v0_1_0/__init__.py": "sha256:e176b86b24d79c11f78ad714878bc3fca41c7821654fa766278b697360a41201",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/repository_navigation/__init__.py": "sha256:64912fe6673b72c3c0d8a2da28673d58bdf6f4185a1376ffe43d3735350adb60",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/repository_navigation/v1_0_0/__init__.py": "sha256:574cf1fee8433e0b11d9475cfbcc3837730b55f6ea1faa4920cba106d959464f",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/workload_projection/__init__.py": "sha256:c01198d23571442c1c3a596c7cd16be17dc1a3efdcfe3e8f9725b7dba16fc103",
"app/.venv/lib/python3.12/site-packages/hub_core/contracts/workload_projection/v1_0_0/__init__.py": "sha256:a9ecfecbf44893d32268288c872cdede0440d2a1373d37a47f69ba8c6431de0d",
"app/.venv/lib/python3.12/site-packages/hub_core/database.py": "sha256:a7704e97509433e90655b0ea22d5fa626d75b8b6470015ef8b9e5997e7a7f5ea",
"app/.venv/lib/python3.12/site-packages/hub_core/events.py": "sha256:c7125a242ed638a3ede29129e4ad826cd188cf76239b59a8587a40d182bbd0e7",
"app/.venv/lib/python3.12/site-packages/hub_core/mcp/__init__.py": "sha256:f97b25193573e56886b66f91cb8c86ef4a39f2100d709869e279e17456959859",
"app/.venv/lib/python3.12/site-packages/hub_core/mcp/credentials.py": "sha256:f5433d29848bd5a399a5e31695e0d908748e0a0856d26b2d691b667c50c95c34",
"app/.venv/lib/python3.12/site-packages/hub_core/mcp/server.py": "sha256:fc6a6de0a29ad9b6da176302a7d24e4ba987f667b6a7fb001029f00cb0d0c582",
"app/.venv/lib/python3.12/site-packages/hub_core/message_identity.py": "sha256:0ab996ba50f236c1342ce72ca8ae6ff28102ef41216972a745f7260e0c93fb24",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/__init__.py": "sha256:ccf4820e270c97fd5d4ac02f0c96362a772b8f4d1bcccc3f5e0077b77f575d36",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/env.py": "sha256:282e6e1a9e4a3cfdc111887f04dc5c1645307b3943a421852abe1709ce712e57",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/roles.py": "sha256:91e85297d296b0c4b9c78b16ae67d3a4707232d8f32b2cac2b2e84f31fa80e89",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0001_core_schema.py": "sha256:c65f076a7b56fb93ee67869e04d922ea396eab72a4c2d2f0dabd706c918aa081",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0002_runtime_ports.py": "sha256:d3ce15463841b3c13eaafdd137a65d4cf2839c0b8e8fddcb2cb2f1adbceb9f00",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0003_repository_navigation.py": "sha256:fb2d2cb5ed10f1760ab789ced8d43c657c1bedc29ba666231a70a18636160902",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0004_workload_projection.py": "sha256:87ce668bfef5cf4aaf0cfd3b48d498f2370f68e06a6e66375e446af6fbbb9c96",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0005_message_identity_aliases.py": "sha256:ec05d2c3cb906b78cdec4d220a7ce09264c38904c792cdad3cd1082e7eace7c0",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/0006_outcome_outbox.py": "sha256:05effdf6f258836d1cd223f9d9fc3447d264484021d3a51cfa42517453d613e1",
"app/.venv/lib/python3.12/site-packages/hub_core/migrations/versions/__init__.py": "sha256:569f6d7e5cc1c17b7b1eee3eec3b82774b745d01ee1dfdf851a5c6f5c337f0bb",
"app/.venv/lib/python3.12/site-packages/hub_core/models/__init__.py": "sha256:c0b6de4986614a163dbb2467d15882eadbd66800478a50de4d6404198d1f773a",
"app/.venv/lib/python3.12/site-packages/hub_core/models/agent_message.py": "sha256:23d16eeaffe780f326b08e6c441100e6ae7b4075bbb6421734c06156a87c4375",
"app/.venv/lib/python3.12/site-packages/hub_core/models/base.py": "sha256:85bb40bde6f4cf8e6c5700a3a016a711fab4adff77c5eb78f89827fe28b9537b",
"app/.venv/lib/python3.12/site-packages/hub_core/models/capability_catalog.py": "sha256:eebbb31f264821a61662d3c9e8c7eba74f46d7f68b946e35f8127343bf2ff9c4",
"app/.venv/lib/python3.12/site-packages/hub_core/models/capability_request.py": "sha256:70a867c82aaa061a4e1c671b023d213032464e776226280f99e2ca192e2a6eba",
"app/.venv/lib/python3.12/site-packages/hub_core/models/domain.py": "sha256:ddf45c37e3c37014ddd9148be01cf104658e1601abba2a8ba96f7680cdb581b3",
"app/.venv/lib/python3.12/site-packages/hub_core/models/managed_repo.py": "sha256:835c5d44581daf7d7dd95325e3f7fdf0add4d529b83779ed83b5e812dcb3aa61",
"app/.venv/lib/python3.12/site-packages/hub_core/models/message_identity_alias.py": "sha256:d07d59cd9c9351669e8319727d08bc0e9bb7e0ee36bf8a34c0c258f0b4ea61e4",
"app/.venv/lib/python3.12/site-packages/hub_core/models/progress_event.py": "sha256:ee750127db2f49c5b9b94773a408f7f965d834b02e6d962220f4bc762309161f",
"app/.venv/lib/python3.12/site-packages/hub_core/models/tpsc.py": "sha256:cb28cbe3512486adb73c0bce633b3c542a41a64e7ec673e86a5a25ab20d94afe",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/__init__.py": "sha256:800d1c45f597fcb4970ca7a83acd2b36016006efbdf638e14a3482a954d9046d",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/capabilities.py": "sha256:18a403ad6ac961bc490543b698e079336f60ef9902a6cd71ef9899076660d5c0",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/domains.py": "sha256:d4c4061d2ab0d2d6390a10f4f815deb0b93b3979345aee965b666110ba32e6e0",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/messages.py": "sha256:903bd4f8c8ca599b606cf2229315de21097360816fcda907159dac4f48cee512",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/policy.py": "sha256:358271263295fdebb5bcb95c3a27bd3ea456964a77bc01c3f784fb7a8754aacf",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/progress.py": "sha256:680cf4dea00a1734d7d70ef7880acc8fd39f045521baa47f415c17934779d18a",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/repos.py": "sha256:1bca6c9b2b5bbe172f5b935b763ac1e399b1d403cdc2c463000ae79f843257a2",
"app/.venv/lib/python3.12/site-packages/hub_core/routers/tpsc.py": "sha256:706815b01be1c0320bf73cf9cff3e9415c1f27b8449ee9e6fea67b12d3042fd1",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/__init__.py": "sha256:c522e626373407bf9bcd727dac7bb812cbdc8c3ef5bb6509a74949e5b49ab4c2",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/app.py": "sha256:87b077498bbe321c73139e51f7ca689fdc7963a98c4d72a5a3bbcc564f47ee76",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/cli.py": "sha256:98ec00f2a12911245827f515877472ae1c37cea65a42454494450ffbe7380e57",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/compat.py": "sha256:9f1c4575bb406ae1174da1a005ec16f44ace63768617e11164b44b4051162d0d",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/compat_catalogs.py": "sha256:250f61ea39cced32c8cd932c4e770ae8be54ff1cf1e257ee2c82324bde0d7a26",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/config.py": "sha256:009b2fc5d1f8fc390d478b01444f610ada91e5fee30534936382be2529a843fc",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/inbox_projection.py": "sha256:84499238654310b86f7a97f2817163ff4c4da0dfce562c677294fa3dfef7f398",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/migration.py": "sha256:d12731fa581c48bf58deec19405ece977c89d08993b2a2ad047cb1fd17318ea8",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/models.py": "sha256:367ca4aa29f59f8e3f59eab22f12782146cf623fa7ac7c22346c794b85a88185",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/ports.py": "sha256:ab70a401deae73389761a0e88dc8ee843df00a671fae6919b1f7eed344cfb542",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/postgres_store.py": "sha256:9286e7845009b66f00069d67177733dabe372d79986c33ca9b43e00dfa5a2341",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/repo_manager_client.py": "sha256:8fa305277c5f3ddfdbe1daf4023ce6c3cde03b5c18c1292dd6aac3fe995aabe1",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/repository_navigation.py": "sha256:f3503596781f3e7f7d53dd28dd3aaf563905f1398575b40c8080e2b1b9978b1e",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/repository_navigation_routes.py": "sha256:eab78ab418a7b542dcdcab5da023bacc65fb50520853f8d179accb2105e373cf",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/store.py": "sha256:2fb78f14bab8df08807322d6f6416745856d69e6001381246abbac879891858d",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/tables.py": "sha256:a5ff72a9c54eedcc8bb81330e62ee72578a383a1d03a1acb598c72c96cdfbe9e",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/validation.py": "sha256:2add804d95d5d0469d6d8d605fbd1013885da972489a017260c6fddef7b80c79",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/workload_projection.py": "sha256:8500260404b0c566a62e51fef63ee320d4e3dafe5e2467f44db884296b9e3bf4",
"app/.venv/lib/python3.12/site-packages/hub_core/runtime/workload_projection_routes.py": "sha256:5c71189b98867f2f1f7612f47ee69c0ec3ddf836b9b1c7e134b98a2be45791de",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/__init__.py": "sha256:dfa2ec2d125f03a532637d2fbef3058ebe1f85c515ff42a930198e164b7812f7",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/agent_message.py": "sha256:d6a7f40dc9a3c61be761f4d2e2c08f726fb0a423ef73e273a7cd97c69ae6c6a3",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/capability.py": "sha256:949c55cb1f2694de4617ad53dc9cb7bc0e72addd7b9d0f104b93d783e4edc647",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/doi.py": "sha256:73d675aecabd5a62ae13184494a4b9db122ad24b3132e1d0e908eef802382f36",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/domain.py": "sha256:872a704fea959d2e4d0ff771770a97160457282218f4748ba4f830c489543aac",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/managed_repo.py": "sha256:a7ab3b1ab399da81324693dcd5d3feeccb211642b10f11cd3f03c7fe6ba751d4",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/policy.py": "sha256:bdaef1640783ac325a050cadf214e731d7c8e5e3a35dbb8f7562d5abbd209a4c",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/progress_event.py": "sha256:9ac7b7fd4881d424bfe59c5001554fd7302243e8489d5e777584d11ead1db328",
"app/.venv/lib/python3.12/site-packages/hub_core/schemas/tpsc.py": "sha256:5640d96a7fa862a468eeb0d6da002697b1f58e4cd675a4603b91e448d4db851e",
"app/.venv/lib/python3.12/site-packages/hub_core/security/__init__.py": "sha256:2754e25ec0f5725c33cb0b4dff1b7d10b364ebd828e609bb5b44eee3309d2d60",
"app/.venv/lib/python3.12/site-packages/hub_core/security/account_reader.py": "sha256:27019616b84cf030969a8e3c0850b5ae52f336008fd9daa4c26360566e74a39b",
"app/.venv/lib/python3.12/site-packages/hub_core/security/audit.py": "sha256:94cb85d71f065443c6423871b59d41e929af0441c95928273caf3e38dad8125c",
"app/.venv/lib/python3.12/site-packages/hub_core/security/boundary.py": "sha256:a1629ac717672276f61015c83f7af6e375bbd8c1234c712dd3d225da307ae0d6",
"app/.venv/lib/python3.12/site-packages/hub_core/security/browser.py": "sha256:fd474ee4b9611fe8dd2c60111402c2fce67d680a7da3519b5d4a495a6b559b7a",
"app/.venv/lib/python3.12/site-packages/hub_core/security/config.py": "sha256:7d604f6aeebde393a371ec3e0ab174934e10808c29fb370acba031486e9c02a3",
"app/.venv/lib/python3.12/site-packages/hub_core/security/context.py": "sha256:1181bbf12ba86bfd5046dab2f3a22a64ee3686be6dd52ab3e843303349b13a52",
"app/.venv/lib/python3.12/site-packages/hub_core/security/facts.py": "sha256:3de4db38ffd3f86f4918d76f811289cd501be3c28dcba16f5088aa2a2b7529ce",
"app/.venv/lib/python3.12/site-packages/hub_core/security/identity.py": "sha256:d7a0bab9d59a5f342fdedc9723d818a9d2537a59c6a9415455786af748f912e9",
"app/.venv/lib/python3.12/site-packages/hub_core/security/policy.py": "sha256:a2370e9ea5b04b1d5a429644d7f81edb1cbe8e15214c23b16cd6f949613eebd6",
"app/.venv/lib/python3.12/site-packages/hub_core/utils/__init__.py": "sha256:ce4ddb30ccc4fd2c4ee59e8a3c088a12165171af02aea957f17f72cd868e1899",
"app/.venv/lib/python3.12/site-packages/hub_core/utils/pagination.py": "sha256:366250b85052c7aabc2a2262521d34233124ba3a41026042792f8eda706ecb4f",
"app/.venv/lib/python3.12/site-packages/hub_core/utils/paths.py": "sha256:988a889be74f0626ca3c27b1d6677bd4a556e35de389c060d07ab64fa1c22fc8",
"app/.venv/lib/python3.12/site-packages/hub_core/utils/routing.py": "sha256:c94b44c5f1ab723e123503e20e0309f28abeeabea6d51beda79247d99852ad1e",
"app/.venv/lib/python3.12/site-packages/hub_core/utils/slugs.py": "sha256:eda7a7d18ff21a4d949223b75a2b615a949e615f461152a9cb9a2cf74b491e2d",
"app/api/routers/workstreams.py": "sha256:9c9bf4376dd323b52109912bb3f615949e89ac02c8b88b4720f569f8565ad1d6",
"app/api/services/forge_projection.py": "sha256:b980e62cbd85c3e7df42b01abf14354e04133374db94af6531dcd91629c3487d",
"app/api/services/historical_projection.py": "sha256:e24e57c58f4aaa4ec9d9bf088009ac69006e53f75b9477ee53dc26c4e850b975",
"app/migrations/versions/c4d5e6f7a8b9_inbox_feed_revision.py": "sha256:48f1730037be99b5623e878d7f20a06bec243ce27317fde81c82e16006d7b3ce",
"app/scripts/consistency_check.py": "sha256:1bfbc89d3ff5c621ec541fd32384083cc7dcf96a639b217d62b6fc34de238efd"
},
"layers": [
{
"digest": "sha256:304074f06047f3dee0c586de265e0e27b577930bc80dc7f97f3829b188bc4fb0",
"compressed_bytes": 30855435,
"archive_entries": 3271,
"whiteouts": 0
},
{
"digest": "sha256:75b6a36c64a1cf3520fc4b4aae4739d5caa8a6a05c27835a920a61784c9c32f8",
"compressed_bytes": 1294052,
"archive_entries": 553,
"whiteouts": 0
},
{
"digest": "sha256:6912e23eb44595b44dc6d9882b34f305ad6f6e9667cec70b13e5dbc4f8cd97f4",
"compressed_bytes": 12121637,
"archive_entries": 1828,
"whiteouts": 0
},
{
"digest": "sha256:bbc5a12237474ec0b23b5051260d56d6436a24d70d9cad961adebe7a037ed813",
"compressed_bytes": 249,
"archive_entries": 8,
"whiteouts": 0
},
{
"digest": "sha256:e16e3995c15e64ae03e700d74eab2389f1151e6bd5d40f55faa047e9124aeb20",
"compressed_bytes": 93,
"archive_entries": 1,
"whiteouts": 0
},
{
"digest": "sha256:14568be832d0c877348328755de4e94cf4d0397d03f2161f6995e3b3e756e802",
"compressed_bytes": 55305356,
"archive_entries": 2898,
"whiteouts": 62
},
{
"digest": "sha256:bf1e1db2d1d373afe88df2f128ce08f7d271029d1c17de4d10e5e78124a6bb2d",
"compressed_bytes": 149,
"archive_entries": 2,
"whiteouts": 0
},
{
"digest": "sha256:cca568db8f6125ab1f5cc9404ac5cb680bd5f01aa44b2629cf2de438b91c177a",
"compressed_bytes": 939,
"archive_entries": 2,
"whiteouts": 0
},
{
"digest": "sha256:c7a4b7e67b1547f874baf3665689c5a71ac812dd3f4a457e88718704e3455d87",
"compressed_bytes": 35705202,
"archive_entries": 5471,
"whiteouts": 0
},
{
"digest": "sha256:7d941269c77dad23eb3cf2e20c329048395c423fe9757df3a6caa8fafca24255",
"compressed_bytes": 598,
"archive_entries": 3,
"whiteouts": 0
},
{
"digest": "sha256:2a88d6d68641dd9017cbb4c2a77c4a935a731d4ba1f2f118a62ec3105c97a960",
"compressed_bytes": 102613,
"archive_entries": 143,
"whiteouts": 0
},
{
"digest": "sha256:3558878fca903a25435eb78655b429261a518d3cdd69d8e27ed24a26cef6bfa5",
"compressed_bytes": 109561,
"archive_entries": 160,
"whiteouts": 0
},
{
"digest": "sha256:2c7101586f5978e425a539185f940607388c99304a1cfebbaf7574bec6f15273",
"compressed_bytes": 475,
"archive_entries": 2,
"whiteouts": 0
},
{
"digest": "sha256:59d38644e2bc333e0aa244c6ac7ef2e48d1eaa81e6134debe010e4322915fa6d",
"compressed_bytes": 243466,
"archive_entries": 181,
"whiteouts": 0
},
{
"digest": "sha256:52fa1200348c5b4962eb106f996f253ad7f4bd3b26cfa55b80a526398560246a",
"compressed_bytes": 1678,
"archive_entries": 7,
"whiteouts": 0
},
{
"digest": "sha256:82fdcd1e818c2dcee02108202c3c67a6a4c6ad59304dc8040f77dd824db82b3d",
"compressed_bytes": 36058,
"archive_entries": 7,
"whiteouts": 0
},
{
"digest": "sha256:085010e655b31f98dcf873b131d4a11742af387bec0a75d341058635a2f5cecb",
"compressed_bytes": 33942,
"archive_entries": 63,
"whiteouts": 0
},
{
"digest": "sha256:4aa7035189d4ba6594935b119c6014a27ca406f740f36ed66a586c03b547247d",
"compressed_bytes": 10803,
"archive_entries": 8,
"whiteouts": 0
},
{
"digest": "sha256:f7b6a72fd1110c2fb3e9e34032269dd8b47627bb2b8bdd142716a547f9a4fefe",
"compressed_bytes": 2118,
"archive_entries": 3,
"whiteouts": 0
},
{
"digest": "sha256:dc64ac4230f824b7ba637ebd59951abca1e9cbdcbbfc4b26f1600c0e95e7f554",
"compressed_bytes": 155207,
"archive_entries": 67,
"whiteouts": 0
},
{
"digest": "sha256:26abb1e017025d62034b1ea4b8c461f330c282e529bc7949788f455ed633d864",
"compressed_bytes": 2966,
"archive_entries": 7,
"whiteouts": 0
},
{
"digest": "sha256:4a46de9d4b0f85f756bf71e82b4e00459b9a0968013da1a92a848213448814b0",
"compressed_bytes": 539,
"archive_entries": 4,
"whiteouts": 0
}
],
"python_package_metadata": {
"usr/local/lib/python3.12/site-packages/pip-25.0.1.dist-info/METADATA": {
"name": "pip",
"version": "25.0.1",
"metadata_sha256": "sha256:4fa7318cf30f979db7cec45c12cbbc2b4f88a15f12eefbf59a6291d0a03af926"
},
"usr/local/lib/python3.12/site-packages/uv-0.13.1.dist-info/METADATA": {
"name": "uv",
"version": "0.13.1",
"metadata_sha256": "sha256:3554d26fcb1db453b54bde82aa3830ddc37179f3ac4394d670361553c02d0cf2"
},
"app/.venv/lib/python3.12/site-packages/aiofile-3.12.3.dist-info/METADATA": {
"name": "aiofile",
"version": "3.12.3",
"metadata_sha256": "sha256:faaa3115c495ac1989aa6bda262b79a6c97e056c83e04afcfc71584a59e3ceb1"
},
"app/.venv/lib/python3.12/site-packages/alembic-1.20.0.dist-info/METADATA": {
"name": "alembic",
"version": "1.20.0",
"metadata_sha256": "sha256:bd32c118c43955c106bfa4255b2fb5ac9db410b0f7255a4cafb14b9e221ff41c"
},
"app/.venv/lib/python3.12/site-packages/annotated_doc-0.0.5.dist-info/METADATA": {
"name": "annotated-doc",
"version": "0.0.5",
"metadata_sha256": "sha256:8c24d70c5d9153d22123353a906042fd7603df2d15c2196290b0f8a962558c46"
},
"app/.venv/lib/python3.12/site-packages/annotated_types-0.8.0.dist-info/METADATA": {
"name": "annotated-types",
"version": "0.8.0",
"metadata_sha256": "sha256:614985b278f601b8ef863f82783b991cc3ada4b89f592eb71c7c48c5f2ef2298"
},
"app/.venv/lib/python3.12/site-packages/anyio-4.15.1.dist-info/METADATA": {
"name": "anyio",
"version": "4.15.1",
"metadata_sha256": "sha256:043aecb571af7189e8a6c528f5d8e32545f1b2cdfaaf761d51e6d5b67ea3ca81"
},
"app/.venv/lib/python3.12/site-packages/asyncpg-0.32.0.dist-info/METADATA": {
"name": "asyncpg",
"version": "0.32.0",
"metadata_sha256": "sha256:10c1e84f762a55c69630704e8a429793dcab1ce5edba7deadb35f40476d502c9"
},
"app/.venv/lib/python3.12/site-packages/attrs-26.1.0.dist-info/METADATA": {
"name": "attrs",
"version": "26.1.0",
"metadata_sha256": "sha256:4cd40e690f23bf37cbcad34efd6758e062df1df07c86833f7e3ce95bf1fa38cc"
},
"app/.venv/lib/python3.12/site-packages/authlib-1.9.1.dist-info/METADATA": {
"name": "Authlib",
"version": "1.9.1",
"metadata_sha256": "sha256:7141e57ccac936724fd004b401d0695e0ae48f32f2aee14d90259a9d4bc4fdbd"
},
"app/.venv/lib/python3.12/site-packages/beartype-0.23.1.dist-info/METADATA": {
"name": "beartype",
"version": "0.23.1",
"metadata_sha256": "sha256:ac75ec7a0bd6407db75c5c1da887798dfd4d5d12099e299602d03baa0ba22986"
},
"app/.venv/lib/python3.12/site-packages/cachetools-7.2.2.dist-info/METADATA": {
"name": "cachetools",
"version": "7.2.2",
"metadata_sha256": "sha256:76bbee4a06789a8c42253966988a07aff8f2f29cb1ae3ff9d6f16d661f01f2d4"
},
"app/.venv/lib/python3.12/site-packages/caio-0.12.9.dist-info/METADATA": {
"name": "caio",
"version": "0.12.9",
"metadata_sha256": "sha256:3128051d993cbf71f589f68b0082167fe1c910b17379d27653b6945ec848c3c8"
},
"app/.venv/lib/python3.12/site-packages/certifi-2026.7.22.dist-info/METADATA": {
"name": "certifi",
"version": "2026.7.22",
"metadata_sha256": "sha256:ef5af1638fbb23676ac3c5777dfcfc2cd9c348fe4172ed5ba3d277655b248090"
},
"app/.venv/lib/python3.12/site-packages/cffi-2.1.1.dist-info/METADATA": {
"name": "cffi",
"version": "2.1.1",
"metadata_sha256": "sha256:558bafb9093a8e790175d9ecff9688382981d744877dad86fd6770db0f4dc918"
},
"app/.venv/lib/python3.12/site-packages/click-8.5.0.dist-info/METADATA": {
"name": "click",
"version": "8.5.0",
"metadata_sha256": "sha256:e87bce0bd194de70dfb8e708e0a6b0483009f25611804eaf87bfeb63e6c20501"
},
"app/.venv/lib/python3.12/site-packages/cryptography-50.0.2.dist-info/METADATA": {
"name": "cryptography",
"version": "50.0.2",
"metadata_sha256": "sha256:047cfc71226409de4318b360aef15c63a2adf609731e3dcf7fe932f14ea042ee"
},
"app/.venv/lib/python3.12/site-packages/cyclopts-5.2.0.dist-info/METADATA": {
"name": "cyclopts",
"version": "5.2.0",
"metadata_sha256": "sha256:a1bcd1e587744ec6f5c5c64126ac03a03fc2468f7c91cd1c44572a5ac11dcb2a"
},
"app/.venv/lib/python3.12/site-packages/dnspython-2.9.0.dist-info/METADATA": {
"name": "dnspython",
"version": "2.9.0",
"metadata_sha256": "sha256:d25dbd09b39758cd5cebe518701012a6278731986cd384fc4a7f25e78f7de929"
},
"app/.venv/lib/python3.12/site-packages/docstring_parser-0.18.0.dist-info/METADATA": {
"name": "docstring_parser",
"version": "0.18.0",
"metadata_sha256": "sha256:cbc42027997fd4b194ae5fd064a4d1e57b92976941d0c26d369561a7c016a333"
},
"app/.venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/METADATA": {
"name": "email-validator",
"version": "2.3.0",
"metadata_sha256": "sha256:2a97b81eefcd856bc80b0346f47fa2d800b9a438bf8f9231ae00fe931d5c9fbc"
},
"app/.venv/lib/python3.12/site-packages/exceptiongroup-1.3.1.dist-info/METADATA": {
"name": "exceptiongroup",
"version": "1.3.1",
"metadata_sha256": "sha256:81984a523a2f7a522ad12bea784a8bb85edec0805ebbd0fb4e350169a36dd802"
},
"app/.venv/lib/python3.12/site-packages/fastapi-0.143.3.dist-info/METADATA": {
"name": "fastapi",
"version": "0.143.3",
"metadata_sha256": "sha256:364f68b16f489abe36d621da2fa727f774bec90916cd3325b78e422af3b59a5f"
},
"app/.venv/lib/python3.12/site-packages/fastmcp-4.1.0.dist-info/METADATA": {
"name": "fastmcp",
"version": "4.1.0",
"metadata_sha256": "sha256:cfdcfd24ad904514087ec1735baa54df174f72f570833a16b6074887cfc51fa6"
},
"app/.venv/lib/python3.12/site-packages/fastmcp_slim-4.1.0.dist-info/METADATA": {
"name": "fastmcp-slim",
"version": "4.1.0",
"metadata_sha256": "sha256:e8eca5fbae348ee6dcda0a0f1bf0dffa493e8d4d8763647ee48f4f871e35c998"
},
"app/.venv/lib/python3.12/site-packages/greenlet-3.5.6.dist-info/METADATA": {
"name": "greenlet",
"version": "3.5.6",
"metadata_sha256": "sha256:b9b4cbbc1f3165e50fbc4696c433fe82b8a151fde65eede28fb6ec5efb3e1fab"
},
"app/.venv/lib/python3.12/site-packages/griffelib-2.3.2.dist-info/METADATA": {
"name": "griffelib",
"version": "2.3.2",
"metadata_sha256": "sha256:fd24a68ed08309718d5759b8de3b90392b5804240d94834e6455be110ead34b3"
},
"app/.venv/lib/python3.12/site-packages/h11-0.16.0.dist-info/METADATA": {
"name": "h11",
"version": "0.16.0",
"metadata_sha256": "sha256:28f326098ac09fcba79b8f180f96087c841fe2456215cb7b872a9c7d5cd19d64"
},
"app/.venv/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/METADATA": {
"name": "httpcore",
"version": "1.0.9",
"metadata_sha256": "sha256:fe2d4fda6199128978779e0cf27f3c045c531863fcdd987eacc74f3a18d41c21"
},
"app/.venv/lib/python3.12/site-packages/httpcore2-2.13.1.dist-info/METADATA": {
"name": "httpcore2",
"version": "2.13.1",
"metadata_sha256": "sha256:37a0ea0674e98b7c3a1f99c17d9bb5457de27a0f93c8b6560c9d17d525139abb"
},
"app/.venv/lib/python3.12/site-packages/httptools-0.9.0.dist-info/METADATA": {
"name": "httptools",
"version": "0.9.0",
"metadata_sha256": "sha256:8a743396f45465204e2b44b43cb57ec4a343c423f52604bbaf1777fd438698c9"
},
"app/.venv/lib/python3.12/site-packages/httpx-0.28.1.dist-info/METADATA": {
"name": "httpx",
"version": "0.28.1",
"metadata_sha256": "sha256:febb9b0f8f3e80d57c8199c304f35c4336e8581d1d18d7983c92766b82793b25"
},
"app/.venv/lib/python3.12/site-packages/httpx2-2.13.1.dist-info/METADATA": {
"name": "httpx2",
"version": "2.13.1",
"metadata_sha256": "sha256:b75b03a003b5593e000907cf7239fcc3f688b8f17db4ecff883d11221ea988fc"
},
"app/.venv/lib/python3.12/site-packages/idna-3.20.dist-info/METADATA": {
"name": "idna",
"version": "3.20",
"metadata_sha256": "sha256:dbd8c14c1e4ca1e0c9824a6dbc7cbbf78884f38eb52d91148cd3025f671e4b85"
},
"app/.venv/lib/python3.12/site-packages/jaraco.classes-3.4.0.dist-info/METADATA": {
"name": "jaraco.classes",
"version": "3.4.0",
"metadata_sha256": "sha256:2e6b102232edd45ae1bb8a6b4091fd40cf3201a6bb6fd4bc97c5e8cd765a44b8"
},
"app/.venv/lib/python3.12/site-packages/jaraco_context-6.1.2.dist-info/METADATA": {
"name": "jaraco.context",
"version": "6.1.2",
"metadata_sha256": "sha256:f1b65b60aea229af54e09b17ae0036cf048fe4a6161fa2e7966a8ea5c2321491"
},
"app/.venv/lib/python3.12/site-packages/jaraco_functools-4.6.0.dist-info/METADATA": {
"name": "jaraco.functools",
"version": "4.6.0",
"metadata_sha256": "sha256:6ed3cae5b8eef084c3c7b2385a0a8ac4c8155ab7c729212bea099bee69d5bd6c"
},
"app/.venv/lib/python3.12/site-packages/jeepney-0.9.0.dist-info/METADATA": {
"name": "jeepney",
"version": "0.9.0",
"metadata_sha256": "sha256:b8e6c353e9aaed0ed0144029556417fda23b64f344e718331907054ba05b8c62"
},
"app/.venv/lib/python3.12/site-packages/joserfc-1.7.5.dist-info/METADATA": {
"name": "joserfc",
"version": "1.7.5",
"metadata_sha256": "sha256:17df62bbdc7212bbcda3144e72720a62fc34bbf76c573062939120738545250f"
},
"app/.venv/lib/python3.12/site-packages/jsonref-1.1.0.dist-info/METADATA": {
"name": "jsonref",
"version": "1.1.0",
"metadata_sha256": "sha256:f98db3890394fba23912faab86ad8f70ed564fc8c885298b636b270f28453e43"
},
"app/.venv/lib/python3.12/site-packages/jsonschema-4.26.0.dist-info/METADATA": {
"name": "jsonschema",
"version": "4.26.0",
"metadata_sha256": "sha256:05b189866ca98a96da3934bf6b83687ced3ff85325273b77e16b705f6d8b26d2"
},
"app/.venv/lib/python3.12/site-packages/jsonschema_path-0.5.0.dist-info/METADATA": {
"name": "jsonschema-path",
"version": "0.5.0",
"metadata_sha256": "sha256:cd7e9a4426436980f099d826dbce8f61afa6603b496385fba9a9eb0ad59cdd48"
},
"app/.venv/lib/python3.12/site-packages/jsonschema_specifications-2025.9.1.dist-info/METADATA": {
"name": "jsonschema-specifications",
"version": "2025.9.1",
"metadata_sha256": "sha256:35abd41757f32b4ea24756920ded47b70173d77cbc052a5a6d3ab583b2e8d89d"
},
"app/.venv/lib/python3.12/site-packages/keyring-25.7.0.dist-info/METADATA": {
"name": "keyring",
"version": "25.7.0",
"metadata_sha256": "sha256:bd54de98fede6dc3e1f3cd89b4e37c95d8842a523bdbb9e52ab40edff1837163"
},
"app/.venv/lib/python3.12/site-packages/mako-1.4.3.dist-info/METADATA": {
"name": "Mako",
"version": "1.4.3",
"metadata_sha256": "sha256:39ea65f21e706265428ea6f2925520f419a10f0113a59318192ed38175d8838b"
},
"app/.venv/lib/python3.12/site-packages/markdown_it_py-4.2.0.dist-info/METADATA": {
"name": "markdown-it-py",
"version": "4.2.0",
"metadata_sha256": "sha256:72c36ff516755443b1ecb61e17b2567a990230b49a504b0eb0c42d5f82448a9c"
},
"app/.venv/lib/python3.12/site-packages/markupsafe-3.0.4.dist-info/METADATA": {
"name": "MarkupSafe",
"version": "3.0.4",
"metadata_sha256": "sha256:66767d76388ece15d49d50dafb655891ef5d868715e7128e7f7d737a70b353c4"
},
"app/.venv/lib/python3.12/site-packages/mcp-2.3.0.dist-info/METADATA": {
"name": "mcp",
"version": "2.3.0",
"metadata_sha256": "sha256:a94577513a4fa0cb639c279c1ad6f4d49650872d45f2f4ab9bb2d9c2a505d457"
},
"app/.venv/lib/python3.12/site-packages/mcp_types-2.3.0.dist-info/METADATA": {
"name": "mcp-types",
"version": "2.3.0",
"metadata_sha256": "sha256:eb973e8b7f53d52ab1df9d1f18854ffa84f074f6052e310089e2655961c48ca9"
},
"app/.venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/METADATA": {
"name": "mdurl",
"version": "0.1.2",
"metadata_sha256": "sha256:b53b29d48f499367053fda3c81e7ce27d2558380ebbf83e66023b02eb7ddd25d"
},
"app/.venv/lib/python3.12/site-packages/more_itertools-11.2.1.dist-info/METADATA": {
"name": "more-itertools",
"version": "11.2.1",
"metadata_sha256": "sha256:8c558bfab61818450e78db4018281f8f7b22115e681cd53ae1d9d4931be54f15"
},
"app/.venv/lib/python3.12/site-packages/nats_py-2.16.0.dist-info/METADATA": {
"name": "nats-py",
"version": "2.16.0",
"metadata_sha256": "sha256:58ddf3dd698f9026d397e5bb56a0baac723ba221d3dddae0831cfacc75c34255"
},
"app/.venv/lib/python3.12/site-packages/openapi_pydantic-0.6.0.dist-info/METADATA": {
"name": "openapi-pydantic",
"version": "0.6.0",
"metadata_sha256": "sha256:e46a181161c62fa24d7d3d0ff2eaabea3a7b580ad7aa9f70d1f08bd129d46f49"
},
"app/.venv/lib/python3.12/site-packages/opentelemetry_api-1.45.1.dist-info/METADATA": {
"name": "opentelemetry-api",
"version": "1.45.1",
"metadata_sha256": "sha256:5bc71e90cb421be92a43bf5ad5b0f25dccfa2a24ddceaa2877779879962a4c9e"
},
"app/.venv/lib/python3.12/site-packages/packaging-26.3.dist-info/METADATA": {
"name": "packaging",
"version": "26.3",
"metadata_sha256": "sha256:70fdb89fc4d4a9a043bf7372b8972bcc883fddff34ab55e9cf80d73875384763"
},
"app/.venv/lib/python3.12/site-packages/pathable-0.6.0.dist-info/METADATA": {
"name": "pathable",
"version": "0.6.0",
"metadata_sha256": "sha256:c418727931012c2306cb8fa2726d044616c3178c1fc078ce182385dcf2b59922"
},
"app/.venv/lib/python3.12/site-packages/platformdirs-4.13.3.dist-info/METADATA": {
"name": "platformdirs",
"version": "4.13.3",
"metadata_sha256": "sha256:3814840758f662bb98053d08f99085fb77721812258573732b092fd7f2120c30"
},
"app/.venv/lib/python3.12/site-packages/psycopg2_binary-2.9.13.dist-info/METADATA": {
"name": "psycopg2-binary",
"version": "2.9.13",
"metadata_sha256": "sha256:a5267b4520191137e34589704162fce02cfd40efcfeb899c45187c7f6bfea7e5"
},
"app/.venv/lib/python3.12/site-packages/py_key_value_aio-0.4.6.dist-info/METADATA": {
"name": "py-key-value-aio",
"version": "0.4.6",
"metadata_sha256": "sha256:0c1af357b841bc3862e39543faa863346c487be9f2e2ffefba009e957a256bee"
},
"app/.venv/lib/python3.12/site-packages/pycparser-3.11.dist-info/METADATA": {
"name": "pycparser",
"version": "3.11",
"metadata_sha256": "sha256:e3a74c846648bb55f4f907284b745e2003b87b96d9c9d17a8a50cf37804541c9"
},
"app/.venv/lib/python3.12/site-packages/pydantic-2.14.1.dist-info/METADATA": {
"name": "pydantic",
"version": "2.14.1",
"metadata_sha256": "sha256:4d4c8e8d5e6a27d5208f0d7949f25628e6747133034969d4d1399b1ad5394036"
},
"app/.venv/lib/python3.12/site-packages/pydantic_core-2.50.1.dist-info/METADATA": {
"name": "pydantic_core",
"version": "2.50.1",
"metadata_sha256": "sha256:ae6817764b603fa2300cd31b9566ecc33476df46163c4150fffc353121a166f2"
},
"app/.venv/lib/python3.12/site-packages/pydantic_settings-2.16.0.dist-info/METADATA": {
"name": "pydantic-settings",
"version": "2.16.0",
"metadata_sha256": "sha256:470656112388bca95fd7d27b8954fda1f11dd6579563cfb9c0ea0445d1746b77"
},
"app/.venv/lib/python3.12/site-packages/pygments-2.21.0.dist-info/METADATA": {
"name": "Pygments",
"version": "2.21.0",
"metadata_sha256": "sha256:1dde075570136774c706bf0009183a793fe0ee262e4a5590cc6eff8453eedd43"
},
"app/.venv/lib/python3.12/site-packages/pyjwt-2.15.1.dist-info/METADATA": {
"name": "PyJWT",
"version": "2.15.1",
"metadata_sha256": "sha256:1ea0c9f139b8c928276b3628af165955f6f764491448a6ad8f103cdcbb382da3"
},
"app/.venv/lib/python3.12/site-packages/pyperclip-1.11.0.dist-info/METADATA": {
"name": "pyperclip",
"version": "1.11.0",
"metadata_sha256": "sha256:2493839e0751761f27d39aa6d5c5dfd1df839c45da8f328aba4ae4102868b825"
},
"app/.venv/lib/python3.12/site-packages/python_dotenv-1.2.4.dist-info/METADATA": {
"name": "python-dotenv",
"version": "1.2.4",
"metadata_sha256": "sha256:87cfee6042412d48df1100ea7822684988c3f2b79de7a250f4717f4df3026d6f"
},
"app/.venv/lib/python3.12/site-packages/python_multipart-0.0.32.dist-info/METADATA": {
"name": "python-multipart",
"version": "0.0.32",
"metadata_sha256": "sha256:e9d399d7dea5eddf0e4d24b5c24687a82e7e50bf2c2b30f8f8a06a64d887dd86"
},
"app/.venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info/METADATA": {
"name": "PyYAML",
"version": "6.0.3",
"metadata_sha256": "sha256:03c3b415ed38d09faedc49360e930769b40c58f68585e6de00e2e4916a858d34"
},
"app/.venv/lib/python3.12/site-packages/referencing-0.37.0.dist-info/METADATA": {
"name": "referencing",
"version": "0.37.0",
"metadata_sha256": "sha256:c93b00e6ab1524fd60848376604c189a114374776475c25a31d57be47b29de6a"
},
"app/.venv/lib/python3.12/site-packages/rich-15.0.0.dist-info/METADATA": {
"name": "rich",
"version": "15.0.0",
"metadata_sha256": "sha256:fad34fc603fac4481bf81f8dd629492fc302c0ec31909c86644751512afb2e3b"
},
"app/.venv/lib/python3.12/site-packages/rich_rst-2.2.0.dist-info/METADATA": {
"name": "rich-rst",
"version": "2.2.0",
"metadata_sha256": "sha256:2cd1f39149e69bd94c4f1c30cb26c763e45689e6d6527b4c23afa1112c48f165"
},
"app/.venv/lib/python3.12/site-packages/rpds_py-2026.9.1.dist-info/METADATA": {
"name": "rpds-py",
"version": "2026.9.1",
"metadata_sha256": "sha256:5d72dca2e387c8d2b4180b68ee87c15b64751e059100a6db58891ec9995445c3"
},
"app/.venv/lib/python3.12/site-packages/secretstorage-3.5.0.dist-info/METADATA": {
"name": "SecretStorage",
"version": "3.5.0",
"metadata_sha256": "sha256:b98e3dc42ff7e9b1bacce60dac2662cd9965fad6e4469fc9483c9eb99998c367"
},
"app/.venv/lib/python3.12/site-packages/sqlalchemy-2.1.5.dist-info/METADATA": {
"name": "SQLAlchemy",
"version": "2.1.5",
"metadata_sha256": "sha256:7f568ea71aecfb29792ccee2c8b1345825e385d54b7e7bba755e445e53b5696f"
},
"app/.venv/lib/python3.12/site-packages/sse_starlette-3.5.0.dist-info/METADATA": {
"name": "sse-starlette",
"version": "3.5.0",
"metadata_sha256": "sha256:6dc401682bdae1a3e1f31b1c320b7f926c354643993840393875ebfc171c9014"
},
"app/.venv/lib/python3.12/site-packages/starlette-1.8.0.dist-info/METADATA": {
"name": "starlette",
"version": "1.8.0",
"metadata_sha256": "sha256:551e8d74d290002521c655b816b27654e49922b88cb474c8d710a893099036f8"
},
"app/.venv/lib/python3.12/site-packages/truststore-0.10.5.dist-info/METADATA": {
"name": "truststore",
"version": "0.10.5",
"metadata_sha256": "sha256:1fd496f290853214e630d96f7163d2dd916f84ebe634b58aa827d6853e8f8610"
},
"app/.venv/lib/python3.12/site-packages/typing_extensions-4.16.0.dist-info/METADATA": {
"name": "typing_extensions",
"version": "4.16.0",
"metadata_sha256": "sha256:b05084ca1d50879865178d9fff9fabeab61bdfb1f361bfbde95421ffc8f9be46"
},
"app/.venv/lib/python3.12/site-packages/typing_inspection-0.4.4.dist-info/METADATA": {
"name": "typing-inspection",
"version": "0.4.4",
"metadata_sha256": "sha256:bad3d9e6342ef6750cf5128ec942327b8bebdce0b6e4d6f67cb15b27ae5118da"
},
"app/.venv/lib/python3.12/site-packages/uncalled_for-0.4.1.dist-info/METADATA": {
"name": "uncalled-for",
"version": "0.4.1",
"metadata_sha256": "sha256:45a21666ddfa8ca8d4e2423c05edaeaa7827686a3ae4fed82b24427854745c2f"
},
"app/.venv/lib/python3.12/site-packages/uvicorn-0.54.0.dist-info/METADATA": {
"name": "uvicorn",
"version": "0.54.0",
"metadata_sha256": "sha256:9399e5ddda3d26e842d6fb5420c38b0857aac568d53badbdc224b3a21339efa8"
},
"app/.venv/lib/python3.12/site-packages/uvloop-0.23.0.dist-info/METADATA": {
"name": "uvloop",
"version": "0.23.0",
"metadata_sha256": "sha256:fe11a50198ffd4d9f1cb20922dc638ad459d5e63e6c615b0c1c69448d3362977"
},
"app/.venv/lib/python3.12/site-packages/watchfiles-1.3.0.dist-info/METADATA": {
"name": "watchfiles",
"version": "1.3.0",
"metadata_sha256": "sha256:1fba87d08d66f10f7515e4817abd4ac7f27abf3300cb33b7ad3f79762987a502"
},
"app/.venv/lib/python3.12/site-packages/websockets-17.2.dist-info/METADATA": {
"name": "websockets",
"version": "17.2",
"metadata_sha256": "sha256:0d5f1279d095e7ba84ef21614af0822dc500ccb2e51b7c3a19eda7159b2dade4"
},
"app/.venv/lib/python3.12/site-packages/hub_core-0.2.0.dist-info/METADATA": {
"name": "hub-core",
"version": "0.2.0",
"metadata_sha256": "sha256:84a59c6ea36d6d8a0b91b76e52f351a5ce6f2fd9ace8a4c887b51bab05973953"
}
},
"package_metadata_equal_to_deployed_image": true,
"hub_core_source_hashes_equal_to_deployed_image": true,
"image_executed": false,
"image_installed_or_daemon_pulled": false,
"anonymous_protocol_only": true,
"token_retained": false,
"limitations": [
"Selected code hashes and package inventory do not prove full application acceptance or hermetic provenance.",
"Floating dependency origins remain unknown; observed byte changes require explicit review.",
"New API behavior is not deployed or natively accepted."
]
}

View file

@ -0,0 +1,23 @@
# Deploy the frozen-binding API guard
Proposal **STATE-WP-0095-T10-frozen-bindings-guard-r1**, revision 1. Pending founder approval for `ADMINISTER @ realm:kubernetes/railiance01`, `activation=APPROVED`.
The approved receiver rollout is healthy at Helm 76. Its later ordinary maintenance path exposed a separate defect: the legacy binding endpoint refreshed three frozen parent rows. All fifteen task rows and the archive bytes stayed unchanged. The original failed full-row comparison is retained; the original parent preimages were not saved and will not be guessed.
The source fixes are published in State Hub c103cbf3c8bed5dba87a03e320595ddded9301a3. They protect the exact three bound parents and fifteen task UUIDs in the checker, repair engine and API binding endpoint. Ordinary inbound dependencies remain allowed. The installed checker is now hash-verified against that source. Its actual maintenance rerun omitted all three frozen bindings and preserved all eighteen **current** full rows. The unrelated staged brief accidentally included by the old writeback helper was restored through a forward commit; its original index/worktree state is preserved. Five real Git tests verify the corrected file-scoped commit behavior. Independent guard review passed 109 isolated cases; canonical guard tests passed 102. These are separate from new runtime acceptance.
Promote this verified CI artifact through the owner Helm path:
`forgejo.coulomb.social/coulomb/state-hub:main-c103cbf@sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1`
Use the already frozen chart archive with SHA256 b5c0663d830fc8d3b65080f237a0be8d01f8b2f7fec9dc33aeba91b1b6b281d4, preserving release values. Its fresh server dry-run passes: eight identities, three image changes. Public read-only image inspection verifies the selected guard/receiver/migration files and CI build ID; package metadata and hub-core source hashes match the deployed image. Fresh target/schema/readiness/headroom checks pass. All are refreshed before actual execution. Floating build origins and complete application/concurrent-writer acceptance remain outside these byte checks.
The exact upgrade is bound in proposal-metadata.json: stage the hash-verified archive in the specified owned remote directory, then use `--reuse-values --set-string image.tag=<the exact reference above> --atomic --timeout 3m`. Observe the exact new Job and owned Pods. Schema is already c4d5e6f7a8b9, and no migration file changed, but the existing migration hook and its recovery limitations still apply.
Verify delivered digest and module hashes, API/MCP readiness, schema and full-row preservation from a fresh **current** baseline. Run the eight prepared native cases only inside rollback transactions with commit interception enforced, then compare a fresh transaction. The prepared probe helper covers all three parents, ordinary-first invalid batches and expected-task/ownership/status refusals; its actual schema and commit-interception contracts are checked without a database connection. New probes are not yet executed. Rerun the verified-client ordinary maintenance path between current hash snapshots, preserve archive bytes and unrelated staged files, and read back source/remote/Hub bindings.
Approval includes using the current hashed rows for successor acceptance while retaining the prior parent-row mismatch as an explicit historical exception. It does not turn that failed comparison into a pass or restore its unavailable preimages. T07 and RMGR19T06 close only after the new receiving and corrected whole-pipeline checks pass with that exception recorded. All sixteen NetKingdom native target gates remain separate.
Approval must also cover [the exact conditional recovery](RECOVERY.md): only the newly observed owned Job may be cancelled with a UID precondition; verify database connection/lock quiescence before rollback to Helm **76**. Unknown mapping or mixed state stops for attended owner recovery. Helm timeout is not an outage or Job-lifetime bound; rollback retains schema.
Attributable EUR cost and credible loss exposure remain unpriced on the existing cluster. This needs scoped supervised approval and creates no autopilot, credential or monetary grant.

View file

@ -0,0 +1,17 @@
# Guard successor: conditional recovery
Proposal STATE-WP-0095-T10-frozen-bindings-guard-r1, revision 1.
The prior deployed release is Helm 76, with image manifest c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015 and schema c4d5e6f7a8b9. Refresh this baseline before execution. The successor's migration files are unchanged, but its existing pre-upgrade migration hook still runs. Its three-minute Helm wait does not stop the Job or bound outage, and the Job has no active deadline.
Observe the new Job UID, creation timestamp, exact successor image, Helm release/hook ownership and owned Pod UIDs/IPs using watch_rollout.py. If Helm fails or times out with this trial Job active, revalidate all identities immediately. Approval includes deleting only this exact new Job with a UID precondition and foreground propagation, and observing its bound Pods terminate. A reused name, foreign ownership, unexpected image, unobserved UID or ambiguous mapping stops automatic recovery. No name-only or blanket deletion, finalizer removal or broad database cancellation is authorized.
Through the existing private database-owner execution path, bind migration connections to the captured Pod/IP and start window, and verify those exact connections, transactions and locks are gone. Retain only connection-identity/state/lock-count metadata. Query text, parameters, credentials and DSNs remain private. If pooling/NAT, missing observation or access makes this mapping unknown, stop for attended database-owner recovery. Pod disappearance alone is insufficient.
After verified quiescence, inspect actual schema and release state. If application rollback is needed, the approved prior target is **76**, retaining frozen Forge receiving support. Use the normal owner SSH path, KUBECONFIG=/etc/rancher/k3s/k3s.yaml, and:
```
helm -n state-hub rollback state-hub 76 --no-hooks --wait --timeout 3m
```
Verify image, readiness, schema, full-row hashes and remaining Job/Pod state. The database retains its additive schema; do not downgrade or invent old parent values. The verified installed client guard remains in use. Removing receiving support or reverting the client guard is outside this recovery. Unknown/mixed state stops for attended handling; a failed or rescued attempt remains a failed/refined outcome.

View file

@ -0,0 +1,9 @@
Revision 1 was never approved or executed. The same proposal's current review is
[revision 2](../guard-successor-review-r2/FINAL-PROPOSAL.md).
The original metadata and its bound digests remain unchanged. The original helper
is retained locally; its generic API-key scanner finding was a module-to-SHA256
mapping. Revision 2 exposes the same hashes as explicit module/SHA256 records.
The published `verify_revision1_helper_preimage.py` reconstructs the original
helper bytes in memory and checks their original bound SHA256 without executing
the helper or printing source. No scanner rule or ignore list was changed.

View file

@ -0,0 +1,136 @@
{
"schema": "statehub.exact-reuse-values-readonly-diff.v1",
"status": "passed_images_only",
"dryrun_argv": [
"helm",
"--kubeconfig",
"/home/worsch/.kube/config-railiance01",
"-n",
"state-hub",
"upgrade",
"state-hub",
"/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-16/cluster-historical-publication-r1/revisions/r4-rollout-review/state-hub-0.1.0.tgz",
"--reuse-values",
"--set-string",
"image.tag=main-c103cbf@sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1",
"--dry-run=server",
"--hide-secret",
"--no-hooks",
"--timeout",
"3m"
],
"production_mutations": false,
"hooks_executed": false,
"raw_helm_values_release_content_logs_retained": false,
"limitations": [
"Dry-run admission/render only, not an actual image pull/migration/deployment.",
"Helm timeout does not stop a later live migration Job; exact scoped cancellation/quiescence remains required."
],
"chart_archive_sha256": "sha256:b5c0663d830fc8d3b65080f237a0be8d01f8b2f7fec9dc33aeba91b1b6b281d4",
"stage": "exact_upgrade_server_dryrun",
"objects": [
{
"api_version": "apps/v1",
"kind": "Deployment",
"namespace": "state-hub",
"name": "state-hub",
"intended_images": [
"forgejo.coulomb.social/coulomb/state-hub:main-c103cbf@sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1"
],
"intended_spec_sha256": "sha256:df32d106c28b270c67aa683c8a4f20b26c430b121420c4023d34d23ede0eaed9",
"baseline_object_sha256": "sha256:01e7278447f3204ec8abfd9a7b5b6be61850995b3e792fc1f97fbc3207536d69",
"intended_object_sha256": "sha256:7b7c78921b071732c8e7c4c062bdbd26787498581102ea9916b07c1f57887a73",
"changed_paths": [
"/spec/template/spec/containers/0/image"
]
},
{
"api_version": "apps/v1",
"kind": "Deployment",
"namespace": "state-hub",
"name": "state-hub-mcp",
"intended_images": [
"forgejo.coulomb.social/coulomb/state-hub:main-c103cbf@sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1"
],
"intended_spec_sha256": "sha256:50ae88c8c57919bf745a772a8ff34ea7e469751a403ac39d1d01ab2e9d3a27db",
"baseline_object_sha256": "sha256:9a4376e004060a4ec2c76784fd50ec6ce05f61b3793f6458625d88122a7b8713",
"intended_object_sha256": "sha256:b78c66a3e27bca60ff4dd4f51c1bbe789a4e246be3d1e7e6fb9659ffdce80127",
"changed_paths": [
"/spec/template/spec/containers/0/image"
]
},
{
"api_version": "batch/v1",
"kind": "Job",
"namespace": "state-hub",
"name": "state-hub-migrate",
"intended_images": [
"forgejo.coulomb.social/coulomb/state-hub:main-c103cbf@sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1"
],
"intended_spec_sha256": "sha256:2eb273b5e2ca5538fa1b13a8cf8cd10d259ad7cd3510bce1e86075f8c4c4a915",
"baseline_object_sha256": "sha256:6909dca9acd5e1b816491b91b6a32ef6d934e288e2d8d0d3d66fac9fe67468ec",
"intended_object_sha256": "sha256:208b52d9b958b9d4490182bda4d0da27b4a6f0961f6bf182c34ef4b640fcbb5e",
"changed_paths": [
"/spec/template/spec/containers/0/image"
]
},
{
"api_version": "v1",
"kind": "ConfigMap",
"namespace": "state-hub",
"name": "state-hub-classification-allowed",
"intended_images": [],
"intended_spec_sha256": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
"baseline_object_sha256": "sha256:924d16a0a6b4ba8a46b59f0990dcc2adc6dd813cf5d7d83bdb389844068d7cfd",
"intended_object_sha256": "sha256:924d16a0a6b4ba8a46b59f0990dcc2adc6dd813cf5d7d83bdb389844068d7cfd",
"changed_paths": []
},
{
"api_version": "v1",
"kind": "ConfigMap",
"namespace": "state-hub",
"name": "state-hub-config",
"intended_images": [],
"intended_spec_sha256": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
"baseline_object_sha256": "sha256:26707b20933b4f6de78f9059c0efec6df7f0e90c8f1a67db6d2f1ac72e674560",
"intended_object_sha256": "sha256:26707b20933b4f6de78f9059c0efec6df7f0e90c8f1a67db6d2f1ac72e674560",
"changed_paths": []
},
{
"api_version": "v1",
"kind": "Service",
"namespace": "state-hub",
"name": "state-hub",
"intended_images": [],
"intended_spec_sha256": "sha256:da5895e6aee1f619d16c07dafd4342cf7ec8f9de0944a84979c624a4e9eea22a",
"baseline_object_sha256": "sha256:62098bbc3ef6265e072f416ecb11de85d59fce7e2e0d22b2616bd233e720dafe",
"intended_object_sha256": "sha256:62098bbc3ef6265e072f416ecb11de85d59fce7e2e0d22b2616bd233e720dafe",
"changed_paths": []
},
{
"api_version": "v1",
"kind": "Service",
"namespace": "state-hub",
"name": "state-hub-mcp",
"intended_images": [],
"intended_spec_sha256": "sha256:4e04175b03bcd75833109d6843e282cee79d73eae2bc85e36097264b832ba26f",
"baseline_object_sha256": "sha256:ab096d239c9cd72e6177a260d9b4d548a7d5b7c0a285c3a11b7267193e336bba",
"intended_object_sha256": "sha256:ab096d239c9cd72e6177a260d9b4d548a7d5b7c0a285c3a11b7267193e336bba",
"changed_paths": []
},
{
"api_version": "v1",
"kind": "ServiceAccount",
"namespace": "state-hub",
"name": "state-hub",
"intended_images": [],
"intended_spec_sha256": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
"baseline_object_sha256": "sha256:750594b51a534d603f50640d02a3c4eec79cc52fe07d5f442102d37b7299adb8",
"intended_object_sha256": "sha256:750594b51a534d603f50640d02a3c4eec79cc52fe07d5f442102d37b7299adb8",
"changed_paths": []
}
],
"changed_object_count": 3,
"intended_diff_only_images": true,
"object_identity_set_unchanged": true
}

View file

@ -0,0 +1,46 @@
{
"schema": "state95.guard-successor-readonly-preflight.v1",
"observed_at": "2026-10-17T00:33:19.687847+00:00",
"target": "railiance01/92.205.62.239",
"node_identity_verified": true,
"kubeconfig": "/home/worsch/.kube/config-railiance01",
"helm_revision": 76,
"current_image_manifest": "sha256:c802690ee1811b3d77df4077936f9cdced1385514e8673fcbc9232b84d645015",
"health": {
"status": "ok",
"db": "connected",
"instance_role": "primary",
"instance_label": "railiance01",
"schema": {
"status": "ok",
"applied": "c4d5e6f7a8b9",
"expected": "c4d5e6f7a8b9"
}
},
"headroom": {
"schema": "state-hub.release-headroom-preflight.v1",
"ok": true,
"observed_at": "2026-10-17T00:33:19.561580+00:00",
"freshness_seconds": 0,
"remaining_cpu_m": 420,
"remaining_memory_bytes": 6535979008,
"pending_unrelated_cpu_m": 0,
"api_surge_cpu_m": 100,
"mcp_surge_cpu_m": 10,
"migrate_cpu_m": 50,
"atomic": true,
"reasons": [],
"notes": [
"Aggregate remaining millicores is not a kube-scheduler guarantee.",
"Preflight does not lower requests and does not start Helm."
],
"hook_order": [
"pre-upgrade migrate job (helm.sh/hook-weight -5)",
"API RollingUpdate maxSurge=1 maxUnavailable=0",
"MCP RollingUpdate maxSurge=1 maxUnavailable=0"
]
},
"migration_job_and_pods_absent": true,
"runtime_readback_ref": "../receiver-rollout-r4/final-runtime-check.json",
"live_changes": false
}

View file

@ -0,0 +1,18 @@
{
"workplan_id": "79579572-8120-5d3b-aca5-dd4aff60d058",
"id": "df703266-6719-4c04-ae1b-ba9afd3bca1c",
"topic_id": null,
"title": "Review exact frozen-binding API guard successor and retained baseline exception",
"description": "Pending proposal STATE-WP-0095-T10-frozen-bindings-guard-r1 revision1 SHA25681d365926fc585a186955d8c98ee83501fd3cec12135b2256d71b46a75097932. Image main-c103cbf@sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1; frozen chart b5c0663d830fc8d3b65080f237a0be8d01f8b2f7fec9dc33aeba91b1b6b281d4. Eight-identity image-only server dry-run and explicit target/headroom/schema pass. Verified installed checker maintenance preserves all18 CURRENT rows; prior three-parent hash failures remain historical exceptions, never restored or backfilled. Requested ADMINISTER @ realm:kubernetes/railiance01 activation=APPROVED includes exact new Job conditional recovery, rollback76 after verified quiescence, current-baseline successor acceptance, unpriced cost/risk and attended stop for unknown mapping. Full review: the-custodian/docs/changes/netkingdom-target-2026-10-17/guard-successor-review-r1/FINAL-PROPOSAL.md. No new runtime is approved or executed.",
"decision_type": "pending",
"status": "open",
"rationale": "Agent-prepared exact new-code proposal. Only the founder may resolve approval; prior receiver revision4 approval does not cover this new image.",
"decided_by": null,
"decided_at": null,
"deadline": null,
"escalation_note": null,
"superseded_by": null,
"created_at": "2026-10-17T00:37:26.205185Z",
"updated_at": "2026-10-17T00:37:26.205185Z",
"workstream_id": "79579572-8120-5d3b-aca5-dd4aff60d058"
}

View file

@ -0,0 +1,7 @@
{
"status": "prepared-helper-contract-checked",
"actual_workplan_binding_schema_accepts_exact_three": true,
"commit_interception_checked_with_actual_unbound_AsyncSession": true,
"DB_connected": false,
"native_probes_executed": false
}

View file

@ -0,0 +1,103 @@
{
"schema": "custodian.supervised-runtime-proposal.v1",
"proposal_id": "STATE-WP-0095-T10-frozen-bindings-guard-r1",
"revision": 1,
"status": "pending_supervisor_approval_not_executed",
"prepared_at": "2026-10-17T00:37:11.095872+00:00",
"owner_task_id": "STATE-WP-0095-T10",
"owner_task_uuid": "88585c69-d9b9-5e1f-a256-6416ff71e824",
"target": "railiance01/92.205.62.239 state-hub release API/MCP and exact-new-trial migration Job",
"authority_requested": "ADMINISTER @ realm:kubernetes/railiance01 activation=APPROVED",
"source_commit": "c103cbf3c8bed5dba87a03e320595ddded9301a3",
"image": "forgejo.coulomb.social/coulomb/state-hub:main-c103cbf@sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1",
"image_digest": "sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1",
"chart_archive": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-16/cluster-historical-publication-r1/revisions/r4-rollout-review/state-hub-0.1.0.tgz",
"chart_sha256": "b5c0663d830fc8d3b65080f237a0be8d01f8b2f7fec9dc33aeba91b1b6b281d4",
"remote_owned_chart": "/tmp/statehub-binding-guard-b5c0663d830f/state-hub-0.1.0.tgz",
"expected_prior_helm_revision": 76,
"expected_schema": "c4d5e6f7a8b9",
"migration_files_changed_since_deployed_source": false,
"exact_upgrade_argv": [
"ssh",
"railiance01",
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml helm -n state-hub upgrade state-hub /tmp/statehub-binding-guard-b5c0663d830f/state-hub-0.1.0.tgz --reuse-values --set-string image.tag=main-c103cbf@sha256:4cc4ce17bbcdb1b66132d07c5b7b741f46df83124ef1c8403ffabdafba6993d1 --atomic --timeout 3m"
],
"staging": "Create exact new private owned directory, refuse unexpected existing ownership/content, copy only frozen chart, verify remote SHA before execution and remove only owned exact archive/directory after proof.",
"readiness_refresh_required_before_execution": true,
"native_probe_cases": 8,
"verification": [
"Delivered manifest and guard module hashes, API/MCP Ready, primary/railiance01 and expected schema.",
"Fresh CURRENT full historical-row hashes before and after; enforce rollback and commit interception for eight exact native cases, then fresh-transaction comparison including ordinary parent.",
"Verified installed local CLI guard, ordinary consistency/fast projection between current snapshots, archive bytes and unrelated staged work preserved; source/remote/Hub IDs/statuses read back."
],
"acceptance_disposition_requested": "Use current hashed baseline for successor acceptance; retain the earlier three-parent mismatch as a historical exception, without guessed restoration or backfilling its failed result. T07/RMGR19T06 close only after new receiving and corrected pipeline pass with exception recorded.",
"conditional_recovery_included": true,
"rollback_helm_revision": 76,
"recovery_limits": "Exact observed new Job UID/image/ownership and bound Pods only; foreground UID-precondition cancellation after revalidation. Verify private owner DB connection/transaction/lock quiescence; unknown mapping/mixed state stops for attended recovery. No schema downgrade or broad backend termination.",
"cost_estimate_eur": null,
"risk_estimate_eur": null,
"cost_and_risk_disposition": "Unpriced attributable cost and credible loss/outage exposure on existing infrastructure require supervised founder acceptance. Helm timeout is not Job/outage bound.",
"autopilot_grant": false,
"bound_receipts": [
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/guard-successor-review-r1/FINAL-PROPOSAL.md",
"sha256": "7addca35af1973be4a2f2c1aeec658a00b581108da03e6509e645045f2767ae4"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/guard-successor-review-r1/RECOVERY.md",
"sha256": "dc72dea7cdf519a712ee8f6d28fc6aa5667b44655d948f2c0160869383f33cef"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/guard-successor-review-r1/native_binding_probes.py",
"sha256": "ef5c07affb15d20b4194edda68fd14b4d0fee1e9dab857e3242c3a1a1e49046f"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/guard-successor-review-r1/probe-helper-preparation-check.json",
"sha256": "e11f48b18cdb57e1b8f2bddcf7e6ffc7473ab2ab2b031c3c1a26afae609f831c"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/guard-successor-review-r1/watch_rollout.py",
"sha256": "a496da3c9a415ac800921ce755446be4bb55bc17e4e6b913143a5d6baf48f815"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/guard-successor-review-r1/reuse_values_dryrun.py",
"sha256": "5e653ae8439c773b27a167464b620805055e9d820a907761ab30652e65fae200"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/guard-successor-review-r1/exact-server-dryrun.json",
"sha256": "2bfb02130876aeb71a773585dae8b446ad5c671050ebc14d0fc7bcce86dffea5"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/guard-successor-review-r1/fresh-readonly-preflight.json",
"sha256": "01bbdc94ebd6fb266ab21bdc0851eac6eddeafbabcd7105cce23806931ebfbce"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/guard-image-c103cbf-inspection.json",
"sha256": "21b4ddd3fa65743bed5eae568e0c08f2d150fcecacb7949263cef06bab99a683"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/before-verified-client.json",
"sha256": "ee41be2d74085603abf2bfe2c91c1bb430b4ea0539a6cbf988528b18f3f5ef46"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/after-verified-client.json",
"sha256": "8cd8921271cd647fe40dde0f00bc55b714313426e14091397d8fd11314c5e610"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/verified-loaded-client.json",
"sha256": "0745b5df92d2533714e2a87a43c73b3b685e7bab7bcf4444f7a5fbd82dd4722f"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/verified-client-cluster-projection.json",
"sha256": "c25b43575273df0e648842d447979aca1b41ade16fcdaf9f5f870024e7ca06e9"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/verified-client-cluster-consistency.json",
"sha256": "fd8a7d58d9e08b4866420ad77d01fbc7c28c0c2c9610ffbe95ddc77dddd9b1a6"
},
{
"path": "/home/worsch/the-custodian/docs/changes/netkingdom-target-2026-10-17/receiver-rollout-r4/ordinary-pipeline-preservation-finding.json",
"sha256": "43d4adc0ffbf61345865eebb3f8948f82a3c33a28fd0436eccd08bc93ba973c1"
}
]
}

Some files were not shown because too many files have changed in this diff Show more