From a786a8050db92807d0f16e637043fbd191ab9335 Mon Sep 17 00:00:00 2001 From: tegwick Date: Sat, 31 Oct 2026 13:25:36 +0100 Subject: [PATCH] Record content recovery release preparation and backup ordering Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a18e2d-f513-7742-b8e7-12af0b744ff3 --- ...fecycle-candidate-recovery-2026-10-31.json | 65 ++++++++++++++ ...t-lifecycle-release-2026-10-31.sources.txt | 3 + ...ifecycle-release-preflight-2026-10-31.json | 7 ++ ...ecycle-release-preparation-2026-10-31.json | 79 ++++++++++++++++ ...lifecycle-release-proposal-2026-10-31.json | 90 +++++++++++++++++++ ...ifecycle-release-row-drift-2026-10-31.json | 61 +++++++++++++ ...t-lifecycle-release-target-2026-10-31.json | 62 +++++++++++++ docs/usecases/sharing-portability-review.md | 56 ++++++++++++ ...0012-durable-recovery-service-readiness.md | 21 ++++- .../CSOC-WP-0013-sharing-content-hardening.md | 13 +++ 10 files changed, 455 insertions(+), 2 deletions(-) create mode 100644 docs/release/content-lifecycle-candidate-recovery-2026-10-31.json create mode 100644 docs/release/content-lifecycle-release-2026-10-31.sources.txt create mode 100644 docs/release/content-lifecycle-release-preflight-2026-10-31.json create mode 100644 docs/release/content-lifecycle-release-preparation-2026-10-31.json create mode 100644 docs/release/content-lifecycle-release-proposal-2026-10-31.json create mode 100644 docs/release/content-lifecycle-release-row-drift-2026-10-31.json create mode 100644 docs/release/content-lifecycle-release-target-2026-10-31.json diff --git a/docs/release/content-lifecycle-candidate-recovery-2026-10-31.json b/docs/release/content-lifecycle-candidate-recovery-2026-10-31.json new file mode 100644 index 0000000..72b4365 --- /dev/null +++ b/docs/release/content-lifecycle-candidate-recovery-2026-10-31.json @@ -0,0 +1,65 @@ +{ + "schema": "coulomb.packaged-content-lifecycle-recovery.v1", + "status": "packaged_recovered_client_export_and_views_verified", + "source": "f306dbfa2604e4815523667740be2925c333b84e", + "image_id": "sha256:d3f2f5bb90f0ba79f4e1d8098d2eb06f8940b8789e5ecb851914bbab364597ec", + "restore_receipt_sha256": "966d6640e42e2f4940c66d1cd5c8a802cd950de0305572f3c8b720ee3d81ae2b", + "client_export": { + "status": "recovered_client_export_verified", + "schema": "coulomb.client-dataset-export.v1", + "content_files": 85, + "records": { + "members.user": 1, + "members.member": 1, + "spaces.space": 1, + "spaces.spacemembership": 1 + }, + "admin_events": 0, + "archive_sha256": "e364a61570e0083e729a3f314eb707c57347200438bd98170c77b8f7fcc2b337", + "offboarding_complete": false, + "all_source_tables_compared": 13, + "all_source_files_compared": 86, + "archive_member_hashes_verified": true, + "selected_client_content_complete_locally": true, + "source_sql_and_content_unchanged": true, + "external_bindings_require_review": 0, + "sessions_and_credentials_excluded": true + }, + "candidate_application": { + "status": "isolated_application_recovery_verified", + "recovered_spaces_with_content": 1, + "actual_pages_rendered_through_view": 40, + "restored_owner_access_verified": true, + "synthetic_viewer_reads": 1, + "synthetic_viewer_mutation_denials": 1, + "same_tenant_ungranted_page_denials": 40, + "fixture_transaction_rolled_back": true, + "production_access": false, + "external_identity_provider_used": false, + "real_browser_journey_verified": false + }, + "previous_image_application": { + "status": "isolated_application_recovery_verified", + "recovered_spaces_with_content": 1, + "actual_pages_rendered_through_view": 40, + "restored_owner_access_verified": true, + "synthetic_viewer_reads": 1, + "synthetic_viewer_mutation_denials": 1, + "same_tenant_ungranted_page_denials": 40, + "fixture_transaction_rolled_back": true, + "production_access": false, + "external_identity_provider_used": false, + "real_browser_journey_verified": false + }, + "source_content_files_unchanged": 86, + "all_tables_unchanged_after_both_view_checks": true, + "application_source_overlay": false, + "export_archive_removed": true, + "network_internal": true, + "published_ports": 0, + "production_access": false, + "production_restore": false, + "post_date_correction_data_claimed": true, + "retained_point_captured_at": "2026-10-31T07:13:52Z", + "driver_sha256": "92b66225e5f9bdf03d0a0999b613370c42341a2ceef468f1743fb4301884cb25" +} diff --git a/docs/release/content-lifecycle-release-2026-10-31.sources.txt b/docs/release/content-lifecycle-release-2026-10-31.sources.txt new file mode 100644 index 0000000..cdb9490 --- /dev/null +++ b/docs/release/content-lifecycle-release-2026-10-31.sources.txt @@ -0,0 +1,3 @@ +/tmp/csoc-content-release-observation-20261031.py: 1065625ee5b0736ae68a5230684f0effcb2c92cf0f814154ee86450b5a8fda4a +/tmp/csoc-content-row-drift-20261031.py: 49c8f0b8a92524205e2b190bbefec76d9cc38d966c4d20ffa7391e85ff17bf0e +/tmp/csoc-packaged-lifecycle-recovery-20261031.py: 92b66225e5f9bdf03d0a0999b613370c42341a2ceef468f1743fb4301884cb25 diff --git a/docs/release/content-lifecycle-release-preflight-2026-10-31.json b/docs/release/content-lifecycle-release-preflight-2026-10-31.json new file mode 100644 index 0000000..e62ada5 --- /dev/null +++ b/docs/release/content-lifecycle-release-preflight-2026-10-31.json @@ -0,0 +1,7 @@ +{ + "proposal_digest": "sha256:c9c3231620721ef3ea9b2bf22fc6c62fe3ed8efb91386cf7ec96acc6959dae08", + "execution_started": false, + "status": "release_refused_or_failed", + "failure_type": "Refused", + "failure_reason": "inactive_backup_installation_required_before_image_release" +} \ No newline at end of file diff --git a/docs/release/content-lifecycle-release-preparation-2026-10-31.json b/docs/release/content-lifecycle-release-preparation-2026-10-31.json new file mode 100644 index 0000000..fd558c3 --- /dev/null +++ b/docs/release/content-lifecycle-release-preparation-2026-10-31.json @@ -0,0 +1,79 @@ +{ + "schema": "coulomb.content-release-preparation.v1", + "prepared_at": "2026-10-31T12:16:52.085864+00:00", + "status": "prepared_waiting_for_inactive_backup_installation", + "proposal_digest": "sha256:c9c3231620721ef3ea9b2bf22fc6c62fe3ed8efb91386cf7ec96acc6959dae08", + "capsule_members": 20, + "owner_task": "RAPPS-WP-0015-T07", + "owner_task_id": "8f448934-bdfe-539f-8cab-a739ec752491", + "consumer_task": "CSOC-WP-0013-T05", + "baseline_revision": 19, + "current_business_rows": 93, + "candidate_image": "forgejo.coulomb.social/coulomb/coulomb-social@sha256:d3f2f5bb90f0ba79f4e1d8098d2eb06f8940b8789e5ecb851914bbab364597ec", + "prerequisite_installation_digest": "sha256:8f442bf0ebed8bbf3b7f227b52081df52613f3f5f6874c4a59511cfc2ba06d42", + "ordering": [ + "historical custody repair", + "recurring alert route", + "inactive backup-source installation", + "content image preflight and supervised release", + "native recurring proof and schedule activation" + ], + "controller_tests": { + "tests": 40, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + "helm_lint": "passed", + "image_only_local_render_difference": true, + "candidate_image_only_server_preview_verified": true, + "native_full_preflight": "refused_expected_missing_installation", + "full_preflight_passed": false, + "historical_custody_packet_digest_unchanged": true, + "inactive_installer_packet_digest_unchanged": true, + "release_executed": false, + "fresh_backup_created_by_preparation": false, + "production_data_restored": false, + "timers_activated": false, + "new_resources_committed": 0, + "cost_risk_review": { + "additional_infrastructure_reservations": 0, + "new_backup_objects": 1, + "encrypted_file_limit_bytes": 1073741824, + "incremental_provider_cost_eur": null, + "autopilot_budget_claimed": false, + "risks": [ + "Brief application pause for paired capture and Recreate image rollout.", + "Rollback restores previous image/helper without rolling back productive data.", + "Uncertain or changed baseline refuses; inspect durable receipt before retry." + ] + }, + "files": [ + { + "repo": "railiance-apps", + "path": "tools/coulomb-image-release.py", + "sha256": "4cefb7b4ce7fb7eece1cd78ce3c1712a2b5cc2f9c81acfed06e3c6ac7c4abad3" + }, + { + "repo": "railiance-apps", + "path": "tools/coulomb_image_release_node.py", + "sha256": "5547b3809f34178e48404cd1590f665729b062b4333f561e2da81b56d435dece" + }, + { + "repo": "railiance-apps", + "path": "tests/test_coulomb_image_release.py", + "sha256": "dc9cd51bd0698b46c5e2a4f2f0fb8f89eceed722a92bd7b03f7278ed77a497d4" + }, + { + "repo": "railiance-apps", + "path": "release/coulomb-content-lifecycle-f306dbf.json", + "sha256": "1bcd840aee2a93130838b7430de279c56dd7aecbce4244765a85be9d0a7130e2" + } + ], + "native_no_attempt_readback": { + "release_journal_exists": false, + "release_receipt_exists": false + }, + "sequencing_decision_id": "de5a4528-0864-4769-b9d0-2f658b0310c6", + "owner_controller_commit": "9c748846413c6db3f13ae3e55627fe3f6ad89194" +} diff --git a/docs/release/content-lifecycle-release-proposal-2026-10-31.json b/docs/release/content-lifecycle-release-proposal-2026-10-31.json new file mode 100644 index 0000000..5f633e1 --- /dev/null +++ b/docs/release/content-lifecycle-release-proposal-2026-10-31.json @@ -0,0 +1,90 @@ +{ + "schema": "coulomb.reviewed-image-release.v1", + "proposal_id": "CSOC-CONTENT-LIFECYCLE-20261031", + "scope": "ADMINISTER @ realm:kubernetes/railiance01; supervised founder execution only", + "operation": "image_only_existing_migration_0003", + "cluster_uid": "a553c742-0115-43d4-99a4-a5ca56fe0786", + "baseline_revision": 19, + "baseline_helm_manifest_sha256": "93cb277abd1aea0657be482e458dcfb268fe0bfbd45d90aa1faedcc7f5bce499", + "candidate_render_sha256": "1606725273089b83689850ad1c25d1834faa15e00c8cf8aa24e1053273af71bc", + "deployment_uid": "2dbe661a-d232-4477-bbd1-833813077fbe", + "pvc_uid": "9888abeb-9d52-4c70-a23d-b5494780d9c3", + "baseline_spec_sha256": "42e091e52d5dae3c1f986e4898c62057fa80846adfce049a75d8fbd4681180ea", + "candidate_spec_sha256": "c65cb691bab7054ae25de58cdb75933d383621ec4e049d2daa1b1bf52dce0bba", + "old_image": "forgejo.coulomb.social/coulomb/coulomb-social@sha256:522bcd7fce92436765a60c1e4afa2598f3cc40913352153ff1c4319a99ca92ed", + "candidate_image": "forgejo.coulomb.social/coulomb/coulomb-social@sha256:d3f2f5bb90f0ba79f4e1d8098d2eb06f8940b8789e5ecb851914bbab364597ec", + "product_source": "f306dbfa2604e4815523667740be2925c333b84e", + "expected_data": { + "business_tables": 12, + "migration_rows_sha256": "43471516387c0e2a3d35971033ed6af330e2963efe4da93293d97633825d04af", + "business_rows": 93, + "business_rows_sha256": "7953b37b02b80d89ca6869dab6b2b0b996541de20ca0dd1b294a5f25572fb2ca", + "content_files": 86, + "content_files_sha256": "ed535246f4e8f46fcd7ce01f936127996aff873c6936b297f7272194b594aeda", + "global_slug_constraint": true, + "tenant_slug_constraint": true, + "migration_0003_applied": true, + "duplicate_slug_groups": 0 + }, + "public_recipient": "age1qm30jk8q0cezey652dk2dhcr3d9vs528v6lg8mavl6d4q3e3vgnqmrmyy3", + "installed_helper_hashes": { + "/opt/coulomb-social-backup/paired-backup.py": "d161c742d1a6a182460a57d0a1719591ab58fc94006f55169ad3d74442a93630", + "/opt/coulomb-social-backup/snapshot-content-and-db.py": "dcc8dd2a3989f279597595f9260b31b24fcc9b6dc787f04c17ef0491c53d830d", + "/opt/coulomb-social-backup/mirror-paired-backup.py": "9ceb26d9083af016c4b787907e4dce7bdf437c782fb2d15eb28d9e334e6e431c", + "/opt/coulomb-social-backup/check-paired-backup-health.py": "2d40ec6e4c59ea7fe1d46065d197b9a87ca6811f023cc6f3e20e4184a3490566", + "/opt/coulomb-social-backup/backup_capacity.py": "cb699a79e67b129239b5aa5d6f3b0d4ffaa9773a8b073227ad17fdecb5b9d893", + "/opt/railiance-platform/scripts/application_recovery_identities.py": "20f56255ed6eeec4aafe33f142bc3ee03f623d4957a7b0cabb741d340f15f79d", + "/opt/railiance-platform/scripts/application_recovery_mirror.py": "d48ab95e89b9eeae36269d853ebe4c44c22e1f57d4e14224f03d0b9aeeb34178", + "/opt/railiance-platform/scripts/application_recovery_resources.py": "ab70ec341e738272730eb0daf76840d0bca807caeb3c4e4c2357f162fbed4498", + "/opt/railiance-platform/scripts/primary_application_archive.py": "a3f0a61e869a6012edb4b5288be14e3b0c4a9a1273b090320ab146d12e5aa94d", + "/opt/coulomb-social-backup/backup_alerts.py": "07522437d4276b92f0a44149adc6c9e81bb18dbe59ce0f1f9e58a48347700d0e", + "/opt/coulomb-social-backup/notify-backup-alert.py": "0bd53bc5ad22d8bcb0326fb18a17737744b06416fe785dad077308e45f051d5a", + "/opt/coulomb-social-backup/observe-backup-alerts.py": "17caf4fa65283242f618b039ff1d018801c9890ea2a9178912cbdd4b50ee2664" + }, + "clipboard_static_sha256": "347eabe0c8d93bf439df02b5a08a7ea71004600e6ff4e8a42cecbee52a9f0413", + "fresh_backup_before_helm": true, + "requires_dataset_equality_before_and_after": true, + "node_request_percent_limit": 90, + "helm_atomic_timeout_seconds": 300, + "rollback": "Restore Helm revision19/image522bcd7f and verified snapshot pin; preserve all post-capture data. No production data restore or schema downgrade.", + "approval_status": "prepared_not_admitted", + "recovery_rehearsal_scope": "Retained independently recovered 2026-10-31T07:13:52Z point; candidate and previous image preserve all 13 source tables and 86 files. Live observation now has93 business rows versus92 in that point; exact fresh paired backup/readback is required before Helm. Independent restore of the new point remains consumer follow-through. Read-only drift comparison confines differences to sessions and user/member login timestamps; all content and migration history match the retained point.", + "rehearsal_evidence_sha256": { + "content-lifecycle-candidate-build-2026-10-31.json": "83ad2ec41c85f8bb5087a250fdb91126ed92f12351cdc72b353c6f0e1a26452b", + "content-lifecycle-candidate-provenance-2026-10-31.json": "35ed909e0a2fa5c57cea1fcc4fbebb877eae559ca9dc753c3da00f84806d7b73", + "content-lifecycle-candidate-tests-2026-10-31.json": "27a75cfee6bbda41f377b73d6a6c7ecde0c54806c113f1be5223dd2f2cf39b3b", + "content-lifecycle-baseline-tests-2026-10-31.json": "de14e4e10337990ccec1c483f7d943bdc7e11b03aa813aff47d00a9b38a07b65", + "content-lifecycle-candidate-recovery-2026-10-31.json": "8d15172e5e330d01f153336e67f6bffb4363d571530c31ea05db872ca10807a9", + "content-lifecycle-validation-2026-10-31.json": "cbb093af470588ca6e8eb3ec5bc1ccee0be537ab37a46625b6ac267c17343d99", + "content-lifecycle-release-target-2026-10-31.json": "e9b50be3c8284c5a9ae96d75b800cbc4090580fa811c2ecd098d73ce8cbee74e", + "content-lifecycle-release-row-drift-2026-10-31.json": "b10f65bf55e900199ae6037767f32e8901aaccb6f7f3a86461f13dd02ec8efce" + }, + "new_resources_committed": 0, + "autopilot_or_eur_budget_claimed": false, + "values_file": "release/content-lifecycle-values.yaml", + "snapshot_file": "release/content-lifecycle-snapshot.py", + "evidence_directory": "release/content-lifecycle-evidence", + "prerequisite_installation_digest": "sha256:8f442bf0ebed8bbf3b7f227b52081df52613f3f5f6874c4a59511cfc2ba06d42", + "requires_inactive_backup_units": true, + "files": { + "tools/coulomb-image-release.py": "4cefb7b4ce7fb7eece1cd78ce3c1712a2b5cc2f9c81acfed06e3c6ac7c4abad3", + "tools/coulomb_image_release_node.py": "5547b3809f34178e48404cd1590f665729b062b4333f561e2da81b56d435dece", + "tools/coulomb_image_probe.py": "7d241b288992fbbc961b42a1311f7d0938b0c899c0675b7db92653c5ace6014f", + "release/content-lifecycle-values.yaml": "daa302f96bddb889c7fe4aa95b740e9f5184d2ac463cd2403431b3e94db86528", + "release/content-lifecycle-snapshot.py": "c1508043f473d2762723acda04944a36f5346e7641fbe6fdf21a91acd3921a54", + "charts/coulomb-social/Chart.yaml": "663d6c23c57457a03bc376ebafb8107ee7f150e150f4d4fb6a3a949fb21006aa", + "charts/coulomb-social/templates/_helpers.tpl": "65379818d484959e7221d3f538b59ffd6b8b7d3c9493250e47520576aee1fc68", + "charts/coulomb-social/templates/content-pvc.yaml": "5c4ddcaee2b3dcdf17da061b1a7a2cb1e0398d2f56f4ef31790cfaaf648b0fee", + "charts/coulomb-social/templates/deployment.yaml": "f90b7517959ec8785f578f917fec222287931e4f8a27f6f9e8fc0a28385f7df8", + "charts/coulomb-social/templates/service.yaml": "78ce0ec6990c5ad57703c7a8d5d2c88c8eb9302d325cb2ba9d2df34e5f90ebdd", + "charts/coulomb-social/values.yaml": "af48d133f7fe45f0d762b40878f306ef48262f6cbbca61808ffac5dd9fc9d241", + "release/content-lifecycle-evidence/content-lifecycle-baseline-tests-2026-10-31.json": "de14e4e10337990ccec1c483f7d943bdc7e11b03aa813aff47d00a9b38a07b65", + "release/content-lifecycle-evidence/content-lifecycle-candidate-build-2026-10-31.json": "83ad2ec41c85f8bb5087a250fdb91126ed92f12351cdc72b353c6f0e1a26452b", + "release/content-lifecycle-evidence/content-lifecycle-candidate-provenance-2026-10-31.json": "35ed909e0a2fa5c57cea1fcc4fbebb877eae559ca9dc753c3da00f84806d7b73", + "release/content-lifecycle-evidence/content-lifecycle-candidate-recovery-2026-10-31.json": "8d15172e5e330d01f153336e67f6bffb4363d571530c31ea05db872ca10807a9", + "release/content-lifecycle-evidence/content-lifecycle-candidate-tests-2026-10-31.json": "27a75cfee6bbda41f377b73d6a6c7ecde0c54806c113f1be5223dd2f2cf39b3b", + "release/content-lifecycle-evidence/content-lifecycle-release-row-drift-2026-10-31.json": "b10f65bf55e900199ae6037767f32e8901aaccb6f7f3a86461f13dd02ec8efce", + "release/content-lifecycle-evidence/content-lifecycle-release-target-2026-10-31.json": "e9b50be3c8284c5a9ae96d75b800cbc4090580fa811c2ecd098d73ce8cbee74e", + "release/content-lifecycle-evidence/content-lifecycle-validation-2026-10-31.json": "cbb093af470588ca6e8eb3ec5bc1ccee0be537ab37a46625b6ac267c17343d99" + } +} diff --git a/docs/release/content-lifecycle-release-row-drift-2026-10-31.json b/docs/release/content-lifecycle-release-row-drift-2026-10-31.json new file mode 100644 index 0000000..8c8aeec --- /dev/null +++ b/docs/release/content-lifecycle-release-row-drift-2026-10-31.json @@ -0,0 +1,61 @@ +{ + "changed_columns": { + "django_session": [ + "session_key", + "session_data", + "expire_date" + ], + "members_member": [ + "updated_at", + "last_login_at" + ], + "members_user": [ + "last_login" + ] + }, + "file_changes": [], + "retained_fingerprint": { + "business_tables": 12, + "migration_rows_sha256": "43471516387c0e2a3d35971033ed6af330e2963efe4da93293d97633825d04af", + "business_rows": 92, + "business_rows_sha256": "6243955479f7861fcdcd79b62f7f1e9f9a27c05a17bd2c17b792ebc98b2fa7b6", + "content_files": 86, + "content_files_sha256": "ed535246f4e8f46fcd7ce01f936127996aff873c6936b297f7272194b594aeda", + "global_slug_constraint": true, + "tenant_slug_constraint": true, + "migration_0003_applied": true, + "duplicate_slug_groups": 0 + }, + "schema": "coulomb.content-release-row-drift.v1", + "changed_tables": [ + { + "table": "django_session", + "retained_rows": 42, + "current_rows": 43, + "retained_sha256": "c958e33ec782f9f2fd1b3cceba4a64da0038fde51050f25905ae42de91ca6dde", + "current_sha256": "594e246ef6297d9be9b6e8d9eda076a5b2ab36afb9263606b719f64f51293ba6" + }, + { + "table": "members_member", + "retained_rows": 1, + "current_rows": 1, + "retained_sha256": "4d465d2b9d1e6311e505f861f2ed4b67763a545a965f9a7d0c586a3d07e3e9a3", + "current_sha256": "ab82b3f2c5e49f8634c598c9642894747f4b6fcff0f5230ac27f41939feb8640" + }, + { + "table": "members_user", + "retained_rows": 1, + "current_rows": 1, + "retained_sha256": "81ccb3a40191e910a68c101896df518a588c00231728934c4c900577f8ae4f12", + "current_sha256": "0fc7a71b4b80a71fbedce527bbd2cae3858cf6a062e5714fc231be13ff987256" + } + ], + "all_other_business_tables_equal": true, + "migration_history_equal": true, + "content_equal": true, + "retained_point": "2026-10-31T07:13:52Z", + "current_business_rows": 93, + "current_business_rows_sha256": "7953b37b02b80d89ca6869dab6b2b0b996541de20ca0dd1b294a5f25572fb2ca", + "private_row_values_printed": false, + "production_changes": false +} diff --git a/docs/release/content-lifecycle-release-target-2026-10-31.json b/docs/release/content-lifecycle-release-target-2026-10-31.json new file mode 100644 index 0000000..a3e6e05 --- /dev/null +++ b/docs/release/content-lifecycle-release-target-2026-10-31.json @@ -0,0 +1,62 @@ +{ + "schema": "coulomb.content-release-target-observation.v1", + "observed_at": "2026-10-31T12:07:24.322343+00:00", + "cluster_uid": "a553c742-0115-43d4-99a4-a5ca56fe0786", + "deployment_uid": "2dbe661a-d232-4477-bbd1-833813077fbe", + "pvc_uid": "9888abeb-9d52-4c70-a23d-b5494780d9c3", + "baseline_revision": 19, + "baseline_helm_manifest_sha256": "93cb277abd1aea0657be482e458dcfb268fe0bfbd45d90aa1faedcc7f5bce499", + "baseline_spec_sha256": "42e091e52d5dae3c1f986e4898c62057fa80846adfce049a75d8fbd4681180ea", + "candidate_spec_sha256": "c65cb691bab7054ae25de58cdb75933d383621ec4e049d2daa1b1bf52dce0bba", + "old_image": "forgejo.coulomb.social/coulomb/coulomb-social@sha256:522bcd7fce92436765a60c1e4afa2598f3cc40913352153ff1c4319a99ca92ed", + "candidate_image": "forgejo.coulomb.social/coulomb/coulomb-social@sha256:d3f2f5bb90f0ba79f4e1d8098d2eb06f8940b8789e5ecb851914bbab364597ec", + "sole_ready_pvc_writer": true, + "existing_unmanaged_metadata_preserved": true, + "candidate_image_only_server_preview_verified": true, + "data": { + "business_tables": 12, + "migration_rows_sha256": "43471516387c0e2a3d35971033ed6af330e2963efe4da93293d97633825d04af", + "business_rows": 93, + "business_rows_sha256": "7953b37b02b80d89ca6869dab6b2b0b996541de20ca0dd1b294a5f25572fb2ca", + "content_files": 86, + "content_files_sha256": "ed535246f4e8f46fcd7ce01f936127996aff873c6936b297f7272194b594aeda", + "global_slug_constraint": true, + "tenant_slug_constraint": true, + "migration_0003_applied": true, + "duplicate_slug_groups": 0, + "actual_owner_pages_rendered": 40, + "unsaved_outsider_page_denials": 40, + "production_identity_or_grant_created": false + }, + "matches_verified_revision19_data": false, + "installed_helper_sha256": { + "/opt/coulomb-social-backup/paired-backup.py": "43e119acb6a4933b4e144c349a091e074e1a91ab61dbe15a65c8264c1d47661a", + "/opt/coulomb-social-backup/snapshot-content-and-db.py": "dcc8dd2a3989f279597595f9260b31b24fcc9b6dc787f04c17ef0491c53d830d", + "/opt/railiance-platform/scripts/primary_application_archive.py": "a3f0a61e869a6012edb4b5288be14e3b0c4a9a1273b090320ab146d12e5aa94d" + }, + "timers": { + "coulomb-social-paired-backup.timer": { + "LoadState": "not-found", + "ActiveState": "inactive", + "UnitFileState": "" + }, + "coulomb-social-backup-freshness.timer": { + "LoadState": "not-found", + "ActiveState": "inactive", + "UnitFileState": "" + } + }, + "prerequisites": { + "custody": { + "exists": false + }, + "installation": { + "exists": false + }, + "route": { + "exists": false + } + }, + "production_data_modified": false, + "release_executed": false +} diff --git a/docs/usecases/sharing-portability-review.md b/docs/usecases/sharing-portability-review.md index 683d00c..3abaf51 100644 --- a/docs/usecases/sharing-portability-review.md +++ b/docs/usecases/sharing-portability-review.md @@ -80,3 +80,59 @@ symlinks. Existing retention/incoming-address permission tests remain required. Evidence: `../release/content-lifecycle-validation-2026-10-31.json`. This is source and isolated-fixture evidence; the fix still needs release delivery and productive review. Do not kill or mutate the productive application to perform this review. + +## Prepared lifecycle image release — follows inactive backup installation + +The owner packet is `railiance-apps/release/coulomb-content-lifecycle-f306dbf.json`, +proposal `sha256:c9c3231620721ef3ea9b2bf22fc6c62fe3ed8efb91386cf7ec96acc6959dae08`. +It upgrades the verified revision19/image522bcd7f to candidate d3f2f5bb, with no new +migration, resource, authorization grant or content rewrite. The only packaged +application change is attachment journal ordering/durability in pageops.py. + +**Current full preflight refuses the missing inactive-installation receipt.** +The order is: existing historical custody repairfa2763d1 and recurring route4d848106, +then inactive source installation8f442bf0, then this image release, then native +recurring-backup proof and schedule activation. The installer pins the current +snapshot helper; deploying this image first would invalidate its reviewed preimage. +The image controller enforces the completed installer receipt and inactive/disabled +backup units before creating an execution journal. Do not bypass that dependency. + +After the existing prerequisites have their independently verified returns, run +this read-only check from the workstation: + +```bash +python3 /home/worsch/railiance-apps/tools/coulomb-image-release.py \ + --plan /home/worsch/railiance-apps/release/coulomb-content-lifecycle-f306dbf.json \ + --preflight \ + --expect-digest sha256:c9c3231620721ef3ea9b2bf22fc6c62fe3ed8efb91386cf7ec96acc6959dae08 +``` + +Only a `live_release_preflight_verified` return at that exact digest makes the +packet ready for attended execution. A changed baseline needs a revised review. +The founder execution command then replaces `--preflight` with `--execute`; its +terminal prompt requires `DEPLOY` followed by that full digest. The supervision +rule is recorded in the-custodian/docs/agent-autonomy-decision.md: “The supervisor +approves that proposal or performs it through the privileged execution path.” +This release has not been executed or approved through the retention-policy answer. + +Execution creates a fresh immutable paired primary backup/readback before Helm, +checks the current complete data and migration fingerprints, performs an atomic +image-only upgrade, verifies owner/outsider/public endpoints and refreshes the +snapshot image pin. A failure restores revision19 and the recognized previous pin +without restoring old data or downgrading schema. Inspect the durable receipt +before any retry. Expected receipt status is `image_candidate_deployed_verified` +under `/var/lib/coulomb-social-backup/releases/c9c3231620721ef3ea9b2bf22fc6c62fe3ed8efb91386cf7ec96acc6959dae08/receipt.json`. + +The current observation binds93business rows/86files. The retained07:13 recovery +point has92business rows: the differences are sessions and login timestamps, with +identical content and migration history. Candidate/rollback rehearsals preserve +all13tables/86files, verify85export files and40owner/40outsider views on that point. +They do not establish recovery of the newer session; independent retrieval/restore +of the fresh execution point remains part of the release return. + +There are no new infrastructure reservations. The action adds one encrypted +primary backup object and temporary local scratch under the admitted capacity +bounds. Incremental provider cost is unpriced; no EUR autopilot budget is claimed. +Application writes pause during paired capture and the Recreate rollout. Evidence: +`../release/content-lifecycle-release-preparation-2026-10-31.json`, its proposal, +native target/preflight/row-drift receipts, and the candidate recovery receipt. diff --git a/workplans/CSOC-WP-0012-durable-recovery-service-readiness.md b/workplans/CSOC-WP-0012-durable-recovery-service-readiness.md index eb49779..621c3d0 100644 --- a/workplans/CSOC-WP-0012-durable-recovery-service-readiness.md +++ b/workplans/CSOC-WP-0012-durable-recovery-service-readiness.md @@ -647,6 +647,12 @@ Then obtain the attended return and independently verify installed hashes and disabled units. Review: docs/release/backup-source-installation-execution-review-2026-10-31.md; source/gate evidence: backup-supervised-installer-validation-2026-10-31.json. +The later content image release (RAPPS-WP-0015-T07, packetc9c32316) must follow +this installation: it refreshes the snapshot image pin that this reviewed bundle +currently fixes atdcc8dd2a. Both existing packet digests are preserved. Technical +sequencing decision: de5a4528-0864-4769-b9d0-2f658b0310c6; this is not image +execution approval. + Preparation is complete; task status is now wait for the T04 custody/profile return and T07 attended route. The exact eight-entry custody repair has a passing native preflight but has not executed. Installation and independent postflight @@ -659,10 +665,15 @@ neither task represents a currently running native job. id: CSOC-WP-0012-T09 status: todo priority: high +depends_on: +- CSOC-WP-0012-T04 +- CSOC-WP-0012-T07 +- CSOC-WP-0012-T08 +- RAPPS-WP-0015-T07 state_hub_task_id: "c30bc200-6e0c-5651-b53a-be7a6f3dd207" ``` -After T07/T08 and applicable T04 operating admission, prove a native paired service capture, exact primary/mirror receipt, independent retrieval, received failed/pending/stale events in both channels, retry and restart continuity, and outside-producer failure detection. Retain correlated receipts without claiming an Alertmanager handoff is recipient delivery. Simulated source tests and the one-off email cannot close this task. +After T07/T08, applicable T04 operating admission and RAPPS-WP-0015-T07 content image delivery, prove a native paired service capture, exact primary/mirror receipt, independent retrieval, received failed/pending/stale events in both channels, retry and restart continuity, and outside-producer failure detection. Retain correlated receipts without claiming an Alertmanager handoff is recipient delivery. Simulated source tests and the one-off email cannot close this task. ## T10 — Activate and observe the approved recurring schedule @@ -670,10 +681,16 @@ After T07/T08 and applicable T04 operating admission, prove a native paired serv id: CSOC-WP-0012-T10 status: todo priority: high +depends_on: +- CSOC-WP-0012-T04 +- CSOC-WP-0012-T07 +- CSOC-WP-0012-T08 +- RAPPS-WP-0015-T07 +- CSOC-WP-0012-T09 state_hub_task_id: "009c9b51-32d4-5a35-a771-7cff0059c042" ``` -After T04 and T07–T09, activate the already approved 03:15 UTC schedule with five-minute jitter, RPO24h/stale26h and attended RTO60min target. Verify native timer/service state and subsequent scheduled capture/freshness evidence. Record measured recovery limits; cached-image rehearsal is not cold-start recovery. Do not ask the user to approve the schedule again. Close on observed operation, not merely enabling a timer. +After T04, T07–T09 and RAPPS-WP-0015-T07, activate the already approved 03:15 UTC schedule with five-minute jitter, RPO24h/stale26h and attended RTO60min target. Verify native timer/service state and subsequent scheduled capture/freshness evidence. Record measured recovery limits; cached-image rehearsal is not cold-start recovery. Do not ask the user to approve the schedule again. Close on observed operation, not merely enabling a timer. ## T11 — Close service registration, provenance, cost and smoke evidence diff --git a/workplans/CSOC-WP-0013-sharing-content-hardening.md b/workplans/CSOC-WP-0013-sharing-content-hardening.md index a9dad0a..0f5ad3f 100644 --- a/workplans/CSOC-WP-0013-sharing-content-hardening.md +++ b/workplans/CSOC-WP-0013-sharing-content-hardening.md @@ -229,6 +229,19 @@ new exact release preparation/execution return. T05 remains progress until that return and productive acceptance; policy acceptance is settled and no live purge is authorized. No production image or release pin changed during this work. +Exact owner image packetc9c32316 is now prepared and RAPPS-WP-0015-T07 waits on +WP-0012-T08. Its40controller cases pass; the separate values/snapshot paths retain +historical capsules. Current native image preview is image-only at revision19. +Candidate and rollback images preserve the retained13tables/86files and render40 +owner pages/deny40outsiders. Live93-row baseline includes a new session and login +timestamps since the92-row retained point; content/migrations match. The execution +must capture a new exact paired point before Helm. Native full preflight refuses +missing installation8f442bf0 before creating an execution journal. Existing backup +packets retain their digests; image delivery follows inactive installation and +precedes native recurring-service acceptance/activation. Details and later commands +are in docs/usecases/sharing-portability-review.md. No image release or productive +acceptance has occurred; T05 remains progress. + ## Completion Finish when every task above has its stated evidence and acceptance, or hand off any newly discovered residual to a live work record first. Cross-owner dependencies remain their existing canonical records.