From 479a15024d29f2f90b4e45144b76fcc5c8d88a70 Mon Sep 17 00:00:00 2001 From: tegwick Date: Sat, 31 Oct 2026 21:29:27 +0100 Subject: [PATCH] Verify revision 20 content release and prepare productive acceptance Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a192e9-c28b-7533-bf25-e2341364c22a --- ...t-acceptance-authorization-2026-10-31.json | 12 ++ ...ptance-fresh-client-export-2026-10-31.json | 67 +++++++++++ ...-acceptance-fresh-recovery-2026-10-31.json | 37 ++++++ ...nce-independent-postflight-2026-10-31.json | 41 +++++++ ...ceptance-preflight-refresh-2026-10-31.json | 25 ++++ ...content-acceptance-receipt-2026-10-31.json | 70 +++++++++++ ...-acceptance-reconciliation-2026-10-31.json | 17 +++ ...t-acceptance-return-2026-10-31.sources.txt | 4 + .../content-acceptance-review-2026-10-31.md | 20 +++- ...irror-content-point-native-2026-10-31.json | 72 ++++++++++++ ...ontent-point-native-2026-10-31.sources.txt | 9 ++ .../attachment-check.txt | 2 + .../manifest.json | 14 +++ .../visual-check.png | Bin 0 -> 125 bytes .../productive-content-acceptance-session.md | 109 ++++++++++++++++++ registry/release-units/coulomb-social.yaml | 4 +- scripts/snapshot-content-and-db.py | 2 +- .../CSOC-WP-0013-sharing-content-hardening.md | 24 +++- 18 files changed, 519 insertions(+), 10 deletions(-) create mode 100644 docs/release/content-acceptance-authorization-2026-10-31.json create mode 100644 docs/release/content-acceptance-fresh-client-export-2026-10-31.json create mode 100644 docs/release/content-acceptance-fresh-recovery-2026-10-31.json create mode 100644 docs/release/content-acceptance-independent-postflight-2026-10-31.json create mode 100644 docs/release/content-acceptance-preflight-refresh-2026-10-31.json create mode 100644 docs/release/content-acceptance-receipt-2026-10-31.json create mode 100644 docs/release/content-acceptance-reconciliation-2026-10-31.json create mode 100644 docs/release/content-acceptance-return-2026-10-31.sources.txt create mode 100644 docs/release/mirror-content-point-native-2026-10-31.json create mode 100644 docs/release/mirror-content-point-native-2026-10-31.sources.txt create mode 100644 docs/usecases/fixtures/productive-content-acceptance/attachment-check.txt create mode 100644 docs/usecases/fixtures/productive-content-acceptance/manifest.json create mode 100644 docs/usecases/fixtures/productive-content-acceptance/visual-check.png create mode 100644 docs/usecases/productive-content-acceptance-session.md diff --git a/docs/release/content-acceptance-authorization-2026-10-31.json b/docs/release/content-acceptance-authorization-2026-10-31.json new file mode 100644 index 0000000..a976583 --- /dev/null +++ b/docs/release/content-acceptance-authorization-2026-10-31.json @@ -0,0 +1,12 @@ +{ + "schema": "coulomb.content-release-supervisor-disposition.v1", + "proposal_digest": "sha256:e96752ecfa7adef2fd1d9da48902c8e63de124ccfd272fe20ba79b758b3ca4a3", + "decision_id": "d9b70cc5-e035-40ae-8d0d-020190581202", + "approved_by": "Bernd", + "recorded_at": "2026-10-31T20:16:08.885956+00:00", + "user_instruction": "Good, then lets do deployment the productive acceptance work now.", + "status": "deployment_scope_approved_awaiting_founder_execution", + "execution_performed": false, + "human_only_execution_lane_changed": false, + "productive_acceptance_inferred": false +} diff --git a/docs/release/content-acceptance-fresh-client-export-2026-10-31.json b/docs/release/content-acceptance-fresh-client-export-2026-10-31.json new file mode 100644 index 0000000..f628b13 --- /dev/null +++ b/docs/release/content-acceptance-fresh-client-export-2026-10-31.json @@ -0,0 +1,67 @@ +{ + "schema": "coulomb.packaged-content-acceptance-recovery.v1", + "status": "packaged_recovered_export_and_views_verified", + "source": "1139a6d30eee4f75317b46bd45120a15d818455f", + "image": "forgejo.coulomb.social/coulomb/coulomb-social@sha256:7906f461bc8d2d5204fd4fde67a251850f725b914452a66172919d6853672ed5", + "restore_receipt_sha256": "9dacbd44544f93abf99354158cf610b4fb1f4e59611b22056b3086e0033231ab", + "retained_point_captured_at": "2026-10-31T20:21:01Z", + "candidate_application": { + "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 + }, + "previous_image_application": { + "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 + }, + "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": "597f5929cae723e9f5d895afac6f5c96022049cb6bd938d4908d6aa56221f4ea", + "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 + }, + "source_content_files_unchanged": 86, + "all_tables_unchanged": true, + "application_source_overlay": false, + "network_internal": true, + "published_ports": 0, + "production_access": false, + "production_restore": false, + "driver_sha256": "ce8c34a0ad00f9c4ac1ba6dd2043884aa07c90e216074cae070626aa04bf1639" +} diff --git a/docs/release/content-acceptance-fresh-recovery-2026-10-31.json b/docs/release/content-acceptance-fresh-recovery-2026-10-31.json new file mode 100644 index 0000000..75706fb --- /dev/null +++ b/docs/release/content-acceptance-fresh-recovery-2026-10-31.json @@ -0,0 +1,37 @@ +{ + "schema": "coulomb.image-release-independent-recovery.v1", + "status": "fresh_point_independently_retrieved_and_restored", + "completed_at": "2026-10-31T20:27:35.058428+00:00", + "captured_at": "2026-10-31T20:21:01Z", + "primary_version": "1793478121590106", + "mirror_version": "1793478426025763", + "mirror_receipt_version": "1793478427159655", + "ciphertext_sha256": "91b4ffe4874a53e3422d604b7c3fa85f6551a481411ef82b2209993552486bfb", + "independent_reader_used": true, + "unpack": { + "status": "decrypted_pair_verified", + "version_id": "1793478121590106", + "encrypted_sha256": "91b4ffe4874a53e3422d604b7c3fa85f6551a481411ef82b2209993552486bfb", + "captured_at": "2026-10-31T20:21:01Z", + "database_sha256": "c5faa20ac0c443635393e04cf5b154710780d829d6c085edc098e2dd7525fc6a", + "content_sha256": "1bf31bafc19d8c4847f3793463189f13ce4b470ed96ccdc614b269acca6c12c0", + "application_restore_verified": false + }, + "restore": { + "status": "restored_verified", + "database_tables": 13, + "database_rows": 115, + "database_rows_and_sequences_match": true, + "content_files": 86, + "content_hashes_match": true, + "network_internal": true, + "published_ports": 0, + "postgres_image_id": "sha256:ff23cdce56cac62ada6f66013e1a50864c0abbe79d132d40b6e05bd80f378a70", + "elapsed_seconds": 4.42, + "content_was_empty": false + }, + "elapsed_seconds": 5.517, + "production_restore": false, + "current_kit_replaced": false, + "driver_sha256": "a88a63c0e990cc4d8d9180d1907ec367f2e7f54c81d00e79f38ded4f30384341" +} diff --git a/docs/release/content-acceptance-independent-postflight-2026-10-31.json b/docs/release/content-acceptance-independent-postflight-2026-10-31.json new file mode 100644 index 0000000..cdbc019 --- /dev/null +++ b/docs/release/content-acceptance-independent-postflight-2026-10-31.json @@ -0,0 +1,41 @@ +{ + "schema": "coulomb.content-acceptance-independent-postflight.v1", + "status": "deployed_image_and_complete_native_state_verified", + "proposal_digest": "sha256:e96752ecfa7adef2fd1d9da48902c8e63de124ccfd272fe20ba79b758b3ca4a3", + "receipt_sha256": "074ec03d62d43f35bd6c276213a28de4a7b0161132379221bec0e402b5334233", + "helm_revision": 20, + "image": "forgejo.coulomb.social/coulomb/coulomb-social@sha256:7906f461bc8d2d5204fd4fde67a251850f725b914452a66172919d6853672ed5", + "source": "1139a6d30eee4f75317b46bd45120a15d818455f", + "packaged_source_files_verified": 79, + "sole_ready_content_writer": true, + "all_frozen_capsule_files_verified": 23, + "installed_helper_hashes_verified": true, + "snapshot_pin_refreshed": true, + "public_health_landing_static_verified": true, + "postflight": { + "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 + }, + "fresh_paired_point": { + "captured_at": "2026-10-31T20:21:01Z", + "destination": "s3://railiance-platform-pg-backup/platform-pg/application-archives/coulomb-social/2026/10/31/20261031T202101Z-2ad4faf215939d67e82f67a4.tar.age", + "version_id": "1793478121590106", + "encrypted_sha256": "91b4ffe4874a53e3422d604b7c3fa85f6551a481411ef82b2209993552486bfb", + "encrypted_bytes": 2181848, + "image": "forgejo.coulomb.social/coulomb/coulomb-social@sha256:522bcd7fce92436765a60c1e4afa2598f3cc40913352153ff1c4319a99ca92ed" + }, + "timers_activated": false, + "production_data_restored": false, + "productive_acceptance_inferred": false +} diff --git a/docs/release/content-acceptance-preflight-refresh-2026-10-31.json b/docs/release/content-acceptance-preflight-refresh-2026-10-31.json new file mode 100644 index 0000000..9d2c07b --- /dev/null +++ b/docs/release/content-acceptance-preflight-refresh-2026-10-31.json @@ -0,0 +1,25 @@ +{ + "schema": "coulomb.guarded-image-release.v1", + "proposal_digest": "sha256:e96752ecfa7adef2fd1d9da48902c8e63de124ccfd272fe20ba79b758b3ca4a3", + "started_at": "2026-10-31T20:14:42.622703+00:00", + "status": "live_release_preflight_verified", + "production_data_restored": false, + "timers_activated": false, + "node_request_percent": { + "cpu": 68, + "memory": 76 + }, + "preflight": { + "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 + }, + "live_changes": false +} \ No newline at end of file diff --git a/docs/release/content-acceptance-receipt-2026-10-31.json b/docs/release/content-acceptance-receipt-2026-10-31.json new file mode 100644 index 0000000..bb4a840 --- /dev/null +++ b/docs/release/content-acceptance-receipt-2026-10-31.json @@ -0,0 +1,70 @@ +{ + "completed_at": "2026-10-31T20:22:30.428195+00:00", + "elapsed_seconds": 97.22, + "existing_global_constraint_preserved": true, + "fresh_paired_point": { + "age_recipient": "age1qm30jk8q0cezey652dk2dhcr3d9vs528v6lg8mavl6d4q3e3vgnqmrmyy3", + "application": "coulomb-social", + "application_restore_verified": false, + "captured_at": "2026-10-31T20:21:01Z", + "ciphertext_bytes": 2181848, + "ciphertext_sha256": "91b4ffe4874a53e3422d604b7c3fa85f6551a481411ef82b2209993552486bfb", + "completed_at": "2026-10-31T20:22:02.185627+00:00", + "content_sha256": "1bf31bafc19d8c4847f3793463189f13ce4b470ed96ccdc614b269acca6c12c0", + "database_sha256": "c5faa20ac0c443635393e04cf5b154710780d829d6c085edc098e2dd7525fc6a", + "destination": "s3://railiance-platform-pg-backup/platform-pg/application-archives/coulomb-social/2026/10/31/20261031T202101Z-2ad4faf215939d67e82f67a4.tar.age", + "encrypted_bytes": 2181848, + "encrypted_sha256": "91b4ffe4874a53e3422d604b7c3fa85f6551a481411ef82b2209993552486bfb", + "image": "forgejo.coulomb.social/coulomb/coulomb-social@sha256:522bcd7fce92436765a60c1e4afa2598f3cc40913352153ff1c4319a99ca92ed", + "immutable_create": true, + "local_archive": "20261031T202101Z-2ad4faf215939d67e82f67a4.tar.age", + "object_key": "platform-pg/application-archives/coulomb-social/2026/10/31/20261031T202101Z-2ad4faf215939d67e82f67a4.tar.age", + "pause_and_capture_seconds": 59.82, + "remote_retrieval_verified": true, + "schema": "platform.application-primary-archive.v1", + "status": "offsite_fetched_verified", + "version_id": "1793478121590106" + }, + "helm_revision": 20, + "node_request_percent": { + "cpu": 68, + "memory": 76 + }, + "pid": 1461378, + "postflight": { + "actual_owner_pages_rendered": 40, + "business_rows": 93, + "business_rows_sha256": "7953b37b02b80d89ca6869dab6b2b0b996541de20ca0dd1b294a5f25572fb2ca", + "business_tables": 12, + "content_files": 86, + "content_files_sha256": "ed535246f4e8f46fcd7ce01f936127996aff873c6936b297f7272194b594aeda", + "duplicate_slug_groups": 0, + "global_slug_constraint": true, + "migration_0003_applied": true, + "migration_rows_sha256": "43471516387c0e2a3d35971033ed6af330e2963efe4da93293d97633825d04af", + "production_identity_or_grant_created": false, + "tenant_slug_constraint": true, + "unsaved_outsider_page_denials": 40 + }, + "preflight": { + "business_rows": 93, + "business_rows_sha256": "7953b37b02b80d89ca6869dab6b2b0b996541de20ca0dd1b294a5f25572fb2ca", + "business_tables": 12, + "content_files": 86, + "content_files_sha256": "ed535246f4e8f46fcd7ce01f936127996aff873c6936b297f7272194b594aeda", + "duplicate_slug_groups": 0, + "global_slug_constraint": true, + "migration_0003_applied": true, + "migration_rows_sha256": "43471516387c0e2a3d35971033ed6af330e2963efe4da93293d97633825d04af", + "tenant_slug_constraint": true + }, + "private_values_printed": false, + "production_data_restored": false, + "proposal_digest": "sha256:e96752ecfa7adef2fd1d9da48902c8e63de124ccfd272fe20ba79b758b3ca4a3", + "public_health_landing_static_verified": true, + "schema": "coulomb.guarded-image-release.v1", + "snapshot_pin_refreshed": true, + "started_at": "2026-10-31T20:20:53.065197+00:00", + "status": "image_candidate_deployed_verified", + "timers_activated": false +} \ No newline at end of file diff --git a/docs/release/content-acceptance-reconciliation-2026-10-31.json b/docs/release/content-acceptance-reconciliation-2026-10-31.json new file mode 100644 index 0000000..50df0e0 --- /dev/null +++ b/docs/release/content-acceptance-reconciliation-2026-10-31.json @@ -0,0 +1,17 @@ +{ + "schema": "coulomb.content-release-reconciliation.v1", + "helm_revision": 20, + "snapshot_server_dry_run": { + "status": "reviewed", + "server_dry_run": true, + "image_pinned": true, + "pvc_read_only": true, + "db_scope": "coulomb_social_db", + "replicas_restored_to": 1 + }, + "backup_timers_inactive_disabled": true, + "snapshot_source_sha256": "23f92c96b840df61f92858004241e860e0ddb32ed6fd7448294d3c8278906e46", + "owner_live_values_match_sealed_values": true, + "recovery_container_stopped": true, + "snapshot_restore_regression_tests_passed": 9 +} diff --git a/docs/release/content-acceptance-return-2026-10-31.sources.txt b/docs/release/content-acceptance-return-2026-10-31.sources.txt new file mode 100644 index 0000000..d1b13f7 --- /dev/null +++ b/docs/release/content-acceptance-return-2026-10-31.sources.txt @@ -0,0 +1,4 @@ +/home/worsch/.config/railiance-platform/coulomb-social-recovery/content-point-recovery-20261031/csoc-mirror-content-point.py: bc4d04c3f8ee3ca089fa9b038e6ab617eaababcb7f0aec94339e7f4eeb70f13a +/home/worsch/.config/railiance-platform/coulomb-social-recovery/content-point-recovery-20261031/csoc-recover-content-point.py: a88a63c0e990cc4d8d9180d1907ec367f2e7f54c81d00e79f38ded4f30384341 +/home/worsch/.config/railiance-platform/coulomb-social-recovery/content-point-recovery-20261031/csoc-verify-deployed-content.py: fb6079fb614a23eba0985c1d4a2e5b776e2d873f29c158cf6f38254d1415b387 +/home/worsch/.config/railiance-platform/coulomb-social-recovery/content-point-recovery-20261031/csoc-verify-fresh-content-point.py: ce8c34a0ad00f9c4ac1ba6dd2043884aa07c90e216074cae070626aa04bf1639 diff --git a/docs/release/content-acceptance-review-2026-10-31.md b/docs/release/content-acceptance-review-2026-10-31.md index ac54e8c..c03527b 100644 --- a/docs/release/content-acceptance-review-2026-10-31.md +++ b/docs/release/content-acceptance-review-2026-10-31.md @@ -1,5 +1,10 @@ # Combined content release for WP-0013 +Deployed and independently verified at Helm revision20, completed +2026-10-31T20:22:30Z. The command below is historical: do not rerun it. +All93business rows/86files are unchanged;40owner views/40outsider denials pass. +See content-acceptance-independent-postflight-2026-10-31.json. + The candidate adds the requested attachment action menu, including author uploads and removal, authenticated downloads, and independent attachments on copies and moves. It also restores ordered-list starting numbers and fixes interrupted @@ -22,7 +27,10 @@ recovery database was returned to its previously stopped state. This retained point has92business rows; current production has93. Session/login-only drift was previously reviewed and its fingerprints are unchanged. Execution creates and reads back a fresh paired backup before Helm; independent recovery of that new -point is still required afterward. +point is now verified: all13tables/115rows and86files restore exactly; the +deployed and previous packages pass40owner/40outsider checks, and client export +verifies85files without altering source data. See content-acceptance-fresh- +{recovery,client-export}-2026-10-31.json. The route and inactive installation prerequisites are independently verified. Full recurring backup/service acceptance remains WP-0012. This proposal does not @@ -39,8 +47,8 @@ snapshot image pin. Rollback restores the prior image/pin while preserving write An older image retains the new attachment metadata/files but lacks the new menu. Full native preflight reports `live_release_preflight_verified` at this exact -digest (receipt: content-acceptance-preflight-2026-10-31.json). Pending execution -decision: d9b70cc5-e035-40ae-8d0d-020190581202. Run: +digest (receipt: content-acceptance-preflight-2026-10-31.json). Resolved approval +decision: d9b70cc5-e035-40ae-8d0d-020190581202. Executed command: ```bash python3 /home/worsch/railiance-apps/tools/coulomb-image-release.py \ @@ -58,8 +66,8 @@ DEPLOY sha256:e96752ecfa7adef2fd1d9da48902c8e63de124ccfd272fe20ba79b758b3ca4a3 Founder-terminal execution is required by the source-bound launcher and the standing supervised execution contract in `the-custodian/docs/agent-autonomy-decision.md`: “The supervisor approves that -proposal or performs it through the privileged execution path.” The already -completed route/installer approvals do not approve this different proposal. +proposal or performs it through the privileged execution path.” Bernd separately +approved and executed this proposal; the execution gate is satisfied. The action pauses writes during backup capture and the Recreate rollout. It adds one encrypted primary backup object and temporary scratch within the admitted @@ -71,7 +79,7 @@ Check the durable receipt before any retry. Required final status: ## Productive review after verified deployment Use the prepared UC-003–006 steps in -[sharing-portability-review.md](../usecases/sharing-portability-review.md). +[productive-content-acceptance-session.md](../usecases/productive-content-acceptance-session.md). On a disposable page, open Attachments, add a file, download it as an authorized reader, duplicate/move the page, and remove the copied association. Verify that the original remains independent and revoked/outsider access is denied. Record diff --git a/docs/release/mirror-content-point-native-2026-10-31.json b/docs/release/mirror-content-point-native-2026-10-31.json new file mode 100644 index 0000000..4bdf2b6 --- /dev/null +++ b/docs/release/mirror-content-point-native-2026-10-31.json @@ -0,0 +1,72 @@ +{ + "schema": "coulomb.native-mirror-worker-proof.v1", + "status": "native_worker_and_independent_receipt_verified", + "completed_at": "2026-10-31T20:27:08.869833+00:00", + "primary": { + "application": "coulomb-social", + "captured_at": "2026-10-31T20:21:01Z", + "object_key": "platform-pg/application-archives/coulomb-social/2026/10/31/20261031T202101Z-2ad4faf215939d67e82f67a4.tar.age", + "version_id": "1793478121590106", + "ciphertext_sha256": "91b4ffe4874a53e3422d604b7c3fa85f6551a481411ef82b2209993552486bfb", + "ciphertext_bytes": 2181848, + "age_recipient": "age1qm30jk8q0cezey652dk2dhcr3d9vs528v6lg8mavl6d4q3e3vgnqmrmyy3", + "image": "forgejo.coulomb.social/coulomb/coulomb-social@sha256:522bcd7fce92436765a60c1e4afa2598f3cc40913352153ff1c4319a99ca92ed", + "database_sha256": "c5faa20ac0c443635393e04cf5b154710780d829d6c085edc098e2dd7525fc6a", + "content_sha256": "1bf31bafc19d8c4847f3793463189f13ce4b470ed96ccdc614b269acca6c12c0" + }, + "recovery_mirror": { + "bucket": "railiance-coulomb-social-archives", + "ciphertext_bytes": 2181848, + "ciphertext_sha256": "91b4ffe4874a53e3422d604b7c3fa85f6551a481411ef82b2209993552486bfb", + "hash_readback_verified": true, + "object_key": "archives/platform-pg/application-archives/coulomb-social/2026/10/31/20261031T202101Z-2ad4faf215939d67e82f67a4.tar.age", + "project_id": "06d107bc-9d84-4672-b2a0-95701cc0c07f", + "receipt_bytes": 1664, + "receipt_object_key": "archives/platform-pg/application-archives/coulomb-social/2026/10/31/20261031T202101Z-2ad4faf215939d67e82f67a4.tar.age.741bdf7b02b859523053f45c88c874b58d43b45a0273bb315116d2bfc34e58aa.receipt.json", + "receipt_readback_verified": true, + "receipt_sha256": "741bdf7b02b859523053f45c88c874b58d43b45a0273bb315116d2bfc34e58aa", + "receipt_version_id": "1793478427159655", + "version_id": "1793478426025763" + }, + "worker_results": [ + { + "status": "mirrored_with_retained_receipt", + "primary_recaptured": false, + "ciphertext_readback_verified": true, + "receipt_readback_verified": true, + "recovery_key_read": false, + "independent_reader_used": false, + "retained_objects_deleted": false, + "application_restore_verified": false + }, + { + "status": "mirrored_with_retained_receipt", + "primary_recaptured": false, + "ciphertext_readback_verified": true, + "receipt_readback_verified": true, + "recovery_key_read": false, + "independent_reader_used": false, + "retained_objects_deleted": false, + "application_restore_verified": false + } + ], + "native_versions_before": 0, + "native_versions_after": 2, + "one_ciphertext_and_one_receipt_version_after_retry": true, + "independent_reader_ciphertext_and_receipt_verified": true, + "retained_receipt_equals_exact_public_field_filter": true, + "local_primary_receipt_and_ciphertext_unchanged": true, + "retry_last_mirror_bytes_unchanged": true, + "runtime_source_commit": "09f4fd33cbeefecb833998246cf53848bb1e5d8d", + "private_state_copy_used": true, + "production_application_contact": false, + "node_helpers_or_state_modified": false, + "node_timers_changed": false, + "native_capture_performed": false, + "decryption_identity_read": false, + "retained_objects_deleted": false, + "operating_capacity_profile_admitted": false, + "alert_reception_verified": false, + "scheduled_service_execution_verified": false, + "sources_manifest_sha256": "a865efe1cbf468c34e8f06912a6d423845ce08fc8a9963936f1e8af73897cad2" +} diff --git a/docs/release/mirror-content-point-native-2026-10-31.sources.txt b/docs/release/mirror-content-point-native-2026-10-31.sources.txt new file mode 100644 index 0000000..de3adb6 --- /dev/null +++ b/docs/release/mirror-content-point-native-2026-10-31.sources.txt @@ -0,0 +1,9 @@ +/home/worsch/coulomb-social/deploy/backup/mirror-platform-runtime.json: 9253c5f6e956b67f499d3e12d2851be7fabd3bc56b00496b8810bbd0be8209f1 +/home/worsch/coulomb-social/scripts/backup_capacity.py: cb699a79e67b129239b5aa5d6f3b0d4ffaa9773a8b073227ad17fdecb5b9d893 +/home/worsch/coulomb-social/scripts/check-paired-backup-health.py: 2d40ec6e4c59ea7fe1d46065d197b9a87ca6811f023cc6f3e20e4184a3490566 +/home/worsch/coulomb-social/scripts/mirror-paired-backup.py: 9ceb26d9083af016c4b787907e4dce7bdf437c782fb2d15eb28d9e334e6e431c +/home/worsch/railiance-platform/scripts/application_recovery_identities.py: 20f56255ed6eeec4aafe33f142bc3ee03f623d4957a7b0cabb741d340f15f79d +/home/worsch/railiance-platform/scripts/application_recovery_mirror.py: d48ab95e89b9eeae36269d853ebe4c44c22e1f57d4e14224f03d0b9aeeb34178 +/home/worsch/railiance-platform/scripts/application_recovery_resources.py: ab70ec341e738272730eb0daf76840d0bca807caeb3c4e4c2357f162fbed4498 +/home/worsch/railiance-platform/scripts/primary_application_archive.py: a3f0a61e869a6012edb4b5288be14e3b0c4a9a1273b090320ab146d12e5aa94d +/tmp/csoc-mirror-content-point.py: bc4d04c3f8ee3ca089fa9b038e6ab617eaababcb7f0aec94339e7f4eeb70f13a diff --git a/docs/usecases/fixtures/productive-content-acceptance/attachment-check.txt b/docs/usecases/fixtures/productive-content-acceptance/attachment-check.txt new file mode 100644 index 0000000..3299c5f --- /dev/null +++ b/docs/usecases/fixtures/productive-content-acceptance/attachment-check.txt @@ -0,0 +1,2 @@ +Coulomb attachment acceptance +This file should download unchanged. diff --git a/docs/usecases/fixtures/productive-content-acceptance/manifest.json b/docs/usecases/fixtures/productive-content-acceptance/manifest.json new file mode 100644 index 0000000..e69453b --- /dev/null +++ b/docs/usecases/fixtures/productive-content-acceptance/manifest.json @@ -0,0 +1,14 @@ +{ + "schema": "coulomb.productive-acceptance-samples.v1", + "purpose": "Harmless files for an attended productive review", + "files": { + "attachment-check.txt": { + "bytes": 67, + "sha256": "3dc7fcbfc6f2fa76172a42d61cedcf1b1acbd4a09d1ba4b38057776d864628eb" + }, + "visual-check.png": { + "bytes": 125, + "sha256": "f5cfb696601f2da142f011cc09e82d14febaf444a395dc2c558d1a23e7d1f635" + } + } +} diff --git a/docs/usecases/fixtures/productive-content-acceptance/visual-check.png b/docs/usecases/fixtures/productive-content-acceptance/visual-check.png new file mode 100644 index 0000000000000000000000000000000000000000..2f43adb52ca4311cc210fca817f101daa85f6979 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBI!2~1^uF2j9q+C2*978JRyghHo%V5C4V6fzk y%jF~Q=BeqK6nrpU*?4Sce(2vAQ6_vqm^XrP)gyPts_8)U7(8A5T-G@yGywod+8sLp literal 0 HcmV?d00001 diff --git a/docs/usecases/productive-content-acceptance-session.md b/docs/usecases/productive-content-acceptance-session.md new file mode 100644 index 0000000..b01d2f1 --- /dev/null +++ b/docs/usecases/productive-content-acceptance-session.md @@ -0,0 +1,109 @@ +# Productive content acceptance session + +The combined image7906f461 is independently verified at Helm revision20, +completed2026-10-31T20:22:30Z. Record your review date and actual verdicts. + +Use your normal account at https://app.coulomb.social. Create two private spaces, +`acceptance-a-20261031` and `acceptance-b-20261031`, or choose unused names if those +already exist. These are disposable review spaces. Keep existing workspaces and +their grants intact. Keep the review artifacts until the verdicts are recorded. + +## 1. Authoring and attachments — UC-003 / WP-0013-T06 + +In space A, create a page titled `Acceptance notes`, file name `notes`, and abstract +`Content and attachment review`. Use this body: + +```html +Acceptance notes. + +
    +
  1. Third item
  2. +
  3. Fourth item
  4. +
+ +**Keep this text when adding or removing attachments.** +``` + +Save and reopen. The list should start at3. In Attachments, add +[attachment-check.txt](fixtures/productive-content-acceptance/attachment-check.txt) +and [visual-check.png](fixtures/productive-content-acceptance/visual-check.png). +Download the text file and open the image: the text has two short lines and the +image has blue and yellow halves. Files should remain available after reopening. + +To check a page Visual, use Open image and take the `assets/...` part of its +address as the Visual field in the page editor. Save and check the displayed +image. Edit the title/abstract/body and reopen to check persistence. + +Open the page editor in two tabs. Save a change in the first; then try saving the +older second tab. The second submission must retain your submitted text and ask +you to reopen/merge rather than overwrite the newer page. Return to the current +page and check that its attachments and Visual remain intact. + +Verdicts: `UC-003 accepted/gap` and `attachments accepted/gap`, with any observed +difference. The custom-topic rendering and obsolete-scrap dispositions are already +recorded; they do not need another review. + +## 2. Independent copy and move — UC-004 + +Duplicate the page into space B with file name `copied`. Change its body and +remove its text attachment. Reopen the original in A: its body and downloadable +text file should remain unchanged. The removed copy's earlier revisions retain +the file, as agreed in the retention policy. + +Create another duplicate in A with file name `moving`, retaining both files. +Save its address before moving it to B with file name `moved`. Its content, +Visual and downloads should remain intact. Its old address should reach the +destination for an authorized account; the sharing check below verifies denial +when the destination is private to you. + +Verdict: `UC-004 accepted/gap`, including the incoming-address permission result +once the second participant has checked it. + +## 3. Sharing and revocation — UC-005 + +The user nominated `testuser` as the second participant. The live app had only +one member at preparation. Have `testuser` sign in to the same tenant and +obtain their member ID from Your app data. The same participant can cover the +ungranted, viewer and revoked states in sequence, using their own browser session. + +Before a grant, they try the A page and its direct image/download URLs: access +must be denied. In A's Share space screen, grant their member ID Viewer access. +They should now read and download, but receive denial for direct edit/copy/move +URLs copied from your session. Space B stays private: they must be denied both +the moved page and its old incoming address. + +Revoke their A access. They retry the page, image and saved download URLs: each +must be denied. Review the remaining grants and creator access in Share space. +Sharing does not send email. + +Verdict: `UC-005 accepted/gap`, including the participant's three access states. + +## 4. Account-local portability — UC-006 + +Open https://app.coulomb.social/account/data/ and Export my account records. +Inspect the downloaded JSON privately: profile, identity references and space +memberships should match your local account. Pages/assets remain in their spaces; +this account export is distinct from the complete operator client-data export. + +Review Leaving the app and the ownership/succession explanation. Sole-owned +spaces must gain another active owner before local account removal. Shared +content remains, while platform identity and mailbox remain under their existing +owners. Review these screens with your productive account. Any actual account +removal exercise needs a separately selected disposable member. + +Verdict: `UC-006 accepted/gap`, stating whether export and the displayed exit/ +succession semantics meet your needs. Keep the account export private. + +## Result record + +Record the deployed revision/date and each verdict independently: + +- UC-003 authoring: +- Attachments: +- UC-004 copy/move and old-address permissions: +- UC-005 sharing/revocation: +- UC-006 account-local export and exit/succession semantics: + +An unresolved gap or an unperformed participant check stays open. Automated +regression, native postflight and recovered-store proofs remain supporting +evidence and do not supply these user verdicts. diff --git a/registry/release-units/coulomb-social.yaml b/registry/release-units/coulomb-social.yaml index 22fabde..dd1351d 100644 --- a/registry/release-units/coulomb-social.yaml +++ b/registry/release-units/coulomb-social.yaml @@ -35,7 +35,7 @@ pins: digest: hashAlgorithm: SHA-256 normalisationAlgorithm: ociArtifactDigest/v1 - value: sha256:522bcd7fce92436765a60c1e4afa2598f3cc40913352153ff1c4319a99ca92ed + value: sha256:7906f461bc8d2d5204fd4fde67a251850f725b914452a66172919d6853672ed5 sources: - name: coulomb-social type: git @@ -43,4 +43,4 @@ pins: digest: hashAlgorithm: SHA-1 normalisationAlgorithm: gitCommit/v1 - value: 23ffe2cf4b214666754a2420558943438e54251a + value: 1139a6d30eee4f75317b46bd45120a15d818455f diff --git a/scripts/snapshot-content-and-db.py b/scripts/snapshot-content-and-db.py index a928c1b..52c92ec 100644 --- a/scripts/snapshot-content-and-db.py +++ b/scripts/snapshot-content-and-db.py @@ -21,7 +21,7 @@ from pathlib import Path NS = 'coulomb-social' IMAGE = ('forgejo.coulomb.social/coulomb/coulomb-social@sha256:' - '522bcd7fce92436765a60c1e4afa2598f3cc40913352153ff1c4319a99ca92ed') + '7906f461bc8d2d5204fd4fde67a251850f725b914452a66172919d6853672ed5') CLUSTER_UID = 'a553c742-0115-43d4-99a4-a5ca56fe0786' LOCK_PATH = Path('/var/lib/coulomb-social-backup/snapshot.lock') diff --git a/workplans/CSOC-WP-0013-sharing-content-hardening.md b/workplans/CSOC-WP-0013-sharing-content-hardening.md index ac27e82..6a69ff3 100644 --- a/workplans/CSOC-WP-0013-sharing-content-hardening.md +++ b/workplans/CSOC-WP-0013-sharing-content-hardening.md @@ -41,6 +41,23 @@ records the scope split and effort estimate. Task counts are not effort percenta Historical notes retain the evidence trail; this map and the task blocks govern current status. No original acceptance requirement has been dropped. +2026-10-31 deployment return: Bernd approved and executed exact proposal +`e96752ec`. Independent verification confirms Helm revision20/image7906f461, +all79packaged source files, all23frozen capsule files, complete deployment/PVC +identities and all helper hashes. All93business rows/86content files are unchanged; +40owner views and40outsider denials pass. The fresh20:21paired point was fetched +back from primary storage. Snapshot pin is refreshed; timers remain inactive. +Receipt and proof: docs/release/content-acceptance-{receipt,independent-postflight}-2026-10-31.json. +Independent mirror retrieval/decryption now restores all13tables/115rows and +86files exactly. Deployed/previous image views and85-file client export pass; +source SQL/files remain unchanged. Source release/helper pins match revision20. +The execution gate is complete. T03 is now in progress with the attended +[acceptance session](../docs/usecases/productive-content-acceptance-session.md) +and harmless attachment fixtures. Actual user verdicts remain open; sharing +uses the user-nominated `testuser` account after its sign-in; there was only one +live member at preparation. Deployment +and automated evidence do not supply those verdicts. + ## T01 — Finish unambiguous storage enforcement ```task @@ -272,7 +289,7 @@ The earlier unresolved-scrap notes are historical and superseded by this return. ```task id: CSOC-WP-0013-T03 -status: todo +status: progress priority: high state_hub_task_id: "8edd7661-17b0-5aa0-b177-6170aa159623" ``` @@ -283,6 +300,11 @@ Review owner Share space/revocation, reader/outsider denial, account-local expor Prepared exact UC-003–006 steps in docs/usecases/sharing-portability-review.md; no acceptance inferred. +2026-10-31: Revision20 is independently verified and the user requested productive +acceptance now. The focused session and sample attachments are prepared; owner +authoring/attachments review has been requested. A second participant must sign +in after deployment for ungranted/viewer/revoked checks. No verdict is inferred. + ## T04 — Prepare private corpus fidelity review evidence ```task