ADJCJH commited on
Commit
54d801e
·
verified ·
1 Parent(s): 144b65c

Sync ProofFrame public Space after final handoff waits

Browse files
README.md CHANGED
@@ -119,7 +119,7 @@ python scripts/judge_decision_brief.py
119
  python scripts/devpost_event_snapshot.py --validate-committed
120
  python scripts/agent_handoff_check.py
121
  python scripts/public_space_upload.py
122
- python scripts/public_space_sync.py
123
  python scripts/claim_lint.py
124
  python scripts/demo_storyboard.py
125
  python scripts/demo_video_draft.py --build-video
 
119
  python scripts/devpost_event_snapshot.py --validate-committed
120
  python scripts/agent_handoff_check.py
121
  python scripts/public_space_upload.py
122
+ python scripts/public_space_sync.py --wait-attempts 5 --wait-seconds 30
123
  python scripts/claim_lint.py
124
  python scripts/demo_storyboard.py
125
  python scripts/demo_video_draft.py --build-video
docs/assets/final-closeout-status.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "schema": "proofframe.final_closeout_status.v1",
3
- "created_at": "2026-06-30T10:21:45Z",
4
  "ok": true,
5
  "mode": "waiting_for_credentials",
6
  "phase": "credential_entry",
 
1
  {
2
  "schema": "proofframe.final_closeout_status.v1",
3
+ "created_at": "2026-06-30T10:34:39Z",
4
  "ok": true,
5
  "mode": "waiting_for_credentials",
6
  "phase": "credential_entry",
docs/assets/final-launch-plan.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "schema": "proofframe.final_launch_plan.v1",
3
- "created_at": "2026-06-30T05:21:11Z",
4
  "ok": false,
5
  "mode": "ready_for_credential_entry",
6
  "repo_root": "/Users/junhaocheng/working-dir/ai-competitions/backblaze-proofframe",
 
1
  {
2
  "schema": "proofframe.final_launch_plan.v1",
3
+ "created_at": "2026-06-30T10:34:39Z",
4
  "ok": false,
5
  "mode": "ready_for_credential_entry",
6
  "repo_root": "/Users/junhaocheng/working-dir/ai-competitions/backblaze-proofframe",
docs/assets/final-operator-brief.json CHANGED
@@ -217,6 +217,9 @@
217
  ],
218
  "codex_actions_after_credentials": [
219
  "python scripts/post_credential_live_proof.py --env-file .env.final.local --execute --update-tasks",
 
 
 
220
  "python scripts/demo_storyboard.py --strict-final",
221
  "python scripts/public_video_check.py --video-url \"$PROOFFRAME_PUBLIC_VIDEO_URL\" --verify-url --strict-final",
222
  "python scripts/demo_readiness.py --strict-final",
@@ -233,7 +236,10 @@
233
  "python scripts/final_submission_control.py --strict-final",
234
  "python scripts/final_launch_plan.py --strict-final",
235
  "python scripts/devpost_submission_preview.py --strict-final",
236
- "python scripts/submission_bundle.py --strict-final"
 
 
 
237
  ],
238
  "safety_policy": {
239
  "env_final_local_ignored": true,
 
217
  ],
218
  "codex_actions_after_credentials": [
219
  "python scripts/post_credential_live_proof.py --env-file .env.final.local --execute --update-tasks",
220
+ "python scripts/public_space_upload.py --execute --commit-message \"Sync ProofFrame public Space after live proof\"",
221
+ "python scripts/public_space_sync.py --wait-attempts 5 --wait-seconds 30",
222
+ "python scripts/api_smoke.py --base-url https://adjcjh-backblaze-proofframe.hf.space",
223
  "python scripts/demo_storyboard.py --strict-final",
224
  "python scripts/public_video_check.py --video-url \"$PROOFFRAME_PUBLIC_VIDEO_URL\" --verify-url --strict-final",
225
  "python scripts/demo_readiness.py --strict-final",
 
236
  "python scripts/final_submission_control.py --strict-final",
237
  "python scripts/final_launch_plan.py --strict-final",
238
  "python scripts/devpost_submission_preview.py --strict-final",
239
+ "python scripts/submission_bundle.py --strict-final",
240
+ "python scripts/public_space_upload.py --execute --commit-message \"Sync ProofFrame public Space after final receipt\"",
241
+ "python scripts/public_space_sync.py --wait-attempts 5 --wait-seconds 30",
242
+ "python scripts/api_smoke.py --base-url https://adjcjh-backblaze-proofframe.hf.space"
243
  ],
244
  "safety_policy": {
245
  "env_final_local_ignored": true,
docs/assets/final-operator-brief.md CHANGED
@@ -43,6 +43,9 @@ Safe to submit: `false`
43
 
44
  ```bash
45
  python scripts/post_credential_live_proof.py --env-file .env.final.local --execute --update-tasks
 
 
 
46
  python scripts/demo_storyboard.py --strict-final
47
  python scripts/public_video_check.py --video-url "$PROOFFRAME_PUBLIC_VIDEO_URL" --verify-url --strict-final
48
  python scripts/demo_readiness.py --strict-final
@@ -60,6 +63,9 @@ python scripts/final_submission_control.py --strict-final
60
  python scripts/final_launch_plan.py --strict-final
61
  python scripts/devpost_submission_preview.py --strict-final
62
  python scripts/submission_bundle.py --strict-final
 
 
 
63
  ```
64
 
65
  ## Safety Policy
 
43
 
44
  ```bash
45
  python scripts/post_credential_live_proof.py --env-file .env.final.local --execute --update-tasks
46
+ python scripts/public_space_upload.py --execute --commit-message "Sync ProofFrame public Space after live proof"
47
+ python scripts/public_space_sync.py --wait-attempts 5 --wait-seconds 30
48
+ python scripts/api_smoke.py --base-url https://adjcjh-backblaze-proofframe.hf.space
49
  python scripts/demo_storyboard.py --strict-final
50
  python scripts/public_video_check.py --video-url "$PROOFFRAME_PUBLIC_VIDEO_URL" --verify-url --strict-final
51
  python scripts/demo_readiness.py --strict-final
 
63
  python scripts/final_launch_plan.py --strict-final
64
  python scripts/devpost_submission_preview.py --strict-final
65
  python scripts/submission_bundle.py --strict-final
66
+ python scripts/public_space_upload.py --execute --commit-message "Sync ProofFrame public Space after final receipt"
67
+ python scripts/public_space_sync.py --wait-attempts 5 --wait-seconds 30
68
+ python scripts/api_smoke.py --base-url https://adjcjh-backblaze-proofframe.hf.space
69
  ```
70
 
71
  ## Safety Policy
docs/assets/final-rehearsal-checklist.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "schema": "proofframe.final_rehearsal.v1",
3
- "created_at": "2026-06-30T05:21:10Z",
4
  "mode": "ready_for_credential_rehearsal",
5
  "ok": true,
6
  "safe_to_submit": false,
@@ -36,7 +36,7 @@
36
  {
37
  "id": "public_space_synced",
38
  "ok": true,
39
- "detail": "Runtime sha: eab3ee62e8d7a21f8f2542d5b4d38675270619ab.",
40
  "evidence": "docs/assets/public-space-sync-report.json"
41
  },
42
  {
@@ -359,7 +359,7 @@
359
  "final_form_ready": null,
360
  "mock_recording_ready": null,
361
  "final_video_ready": null,
362
- "runtime_sha": "eab3ee62e8d7a21f8f2542d5b4d38675270619ab",
363
  "failed_checks": [],
364
  "missing_ids": [],
365
  "blocking_items": []
 
1
  {
2
  "schema": "proofframe.final_rehearsal.v1",
3
+ "created_at": "2026-06-30T10:34:39Z",
4
  "mode": "ready_for_credential_rehearsal",
5
  "ok": true,
6
  "safe_to_submit": false,
 
36
  {
37
  "id": "public_space_synced",
38
  "ok": true,
39
+ "detail": "Runtime sha: 144b65ce7b82065789abd97c39ff4dc9021afc6a.",
40
  "evidence": "docs/assets/public-space-sync-report.json"
41
  },
42
  {
 
359
  "final_form_ready": null,
360
  "mock_recording_ready": null,
361
  "final_video_ready": null,
362
+ "runtime_sha": "144b65ce7b82065789abd97c39ff4dc9021afc6a",
363
  "failed_checks": [],
364
  "missing_ids": [],
365
  "blocking_items": []
docs/assets/final-rehearsal-checklist.md CHANGED
@@ -11,7 +11,7 @@ Next command: `python scripts/final_env_wizard.py --output .env.final.local --mi
11
  - OK `operator_ready`: Operator brief mode is credential_entry_ready. Evidence: `docs/assets/final-operator-brief.json`
12
  - OK `only_expected_secrets_missing`: Missing ids: b2_application_key, b2_key_id, genblaze_api_key. Evidence: `docs/assets/final-operator-brief.json`
13
  - OK `launch_plan_at_credential_entry`: Current phase is credential_entry. Evidence: `docs/assets/final-launch-plan.json`
14
- - OK `public_space_synced`: Runtime sha: eab3ee62e8d7a21f8f2542d5b4d38675270619ab. Evidence: `docs/assets/public-space-sync-report.json`
15
  - OK `mock_form_ready`: Devpost form mode is pre_live_form_ready. Evidence: `docs/assets/devpost-form-kit.json`
16
  - OK `mock_recording_ready`: Recording assets mode is mock_recording_ready. Evidence: `docs/assets/recording-assets.json`
17
  - OK `secret_scan_currently_clear`: Secret scan mode is clear. Evidence: `docs/assets/secret-scan-report.json`
 
11
  - OK `operator_ready`: Operator brief mode is credential_entry_ready. Evidence: `docs/assets/final-operator-brief.json`
12
  - OK `only_expected_secrets_missing`: Missing ids: b2_application_key, b2_key_id, genblaze_api_key. Evidence: `docs/assets/final-operator-brief.json`
13
  - OK `launch_plan_at_credential_entry`: Current phase is credential_entry. Evidence: `docs/assets/final-launch-plan.json`
14
+ - OK `public_space_synced`: Runtime sha: 144b65ce7b82065789abd97c39ff4dc9021afc6a. Evidence: `docs/assets/public-space-sync-report.json`
15
  - OK `mock_form_ready`: Devpost form mode is pre_live_form_ready. Evidence: `docs/assets/devpost-form-kit.json`
16
  - OK `mock_recording_ready`: Recording assets mode is mock_recording_ready. Evidence: `docs/assets/recording-assets.json`
17
  - OK `secret_scan_currently_clear`: Secret scan mode is clear. Evidence: `docs/assets/secret-scan-report.json`
docs/assets/final-submission-control.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "schema": "proofframe.final_submission_control.v1",
3
- "created_at": "2026-06-30T10:21:45Z",
4
  "ok": true,
5
  "control_health_ok": true,
6
  "mode": "pre_live_control",
 
1
  {
2
  "schema": "proofframe.final_submission_control.v1",
3
+ "created_at": "2026-06-30T10:34:39Z",
4
  "ok": true,
5
  "control_health_ok": true,
6
  "mode": "pre_live_control",
docs/assets/final-submission-control.md CHANGED
@@ -3,7 +3,7 @@
3
  Mode: `pre_live_control`
4
  Control health OK: `true`
5
  Safe to submit: `false`
6
- Created: `2026-06-30T10:21:45Z`
7
  Public demo: https://adjcjh-backblaze-proofframe.hf.space/?judge=1
8
  Repository: https://github.com/adjcjh777/backblaze-proofframe
9
 
 
3
  Mode: `pre_live_control`
4
  Control health OK: `true`
5
  Safe to submit: `false`
6
+ Created: `2026-06-30T10:34:39Z`
7
  Public demo: https://adjcjh-backblaze-proofframe.hf.space/?judge=1
8
  Repository: https://github.com/adjcjh777/backblaze-proofframe
9
 
docs/assets/public-space-sync-report.json CHANGED
@@ -1,17 +1,17 @@
1
  {
2
  "schema": "proofframe.public_space_sync.v1",
3
- "created_at": "2026-06-30T10:15:52Z",
4
  "ok": true,
5
  "mode": "public_space_synced",
6
  "space_id": "ADJCJH/backblaze-proofframe",
7
  "public_host": "https://adjcjh-backblaze-proofframe.hf.space",
8
- "expected_sha": "c775d838b14529a2d057592f4058d92a8a4a006a",
9
  "observed": {
10
- "space_sha": "c775d838b14529a2d057592f4058d92a8a4a006a",
11
- "runtime_sha": "c775d838b14529a2d057592f4058d92a8a4a006a",
12
  "runtime_stage": "RUNNING",
13
  "domain_ready": true,
14
- "last_modified": "2026-06-30T10:12:39.000Z",
15
  "health": {
16
  "ready": true,
17
  "storage_backend": "local",
@@ -76,14 +76,14 @@
76
  "judge_crosswalk_safe_to_submit": false,
77
  "judge_decision_brief": {
78
  "schema": "proofframe.judge_decision_brief.v1",
79
- "created_at": "2026-06-30T05:47:07Z",
80
  "age_days": 0,
81
  "mode": "pre_live_decision_ready",
82
  "safe_to_share": true,
83
  "safe_to_submit": false,
84
  "check_count": 6,
85
  "space_mode": "public_space_synced",
86
- "space_sync_checked_at": "2026-06-30T05:43:34Z",
87
  "evidence_index_link": "https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-evidence-index.md",
88
  "source_state_ok": true,
89
  "fresh": true
@@ -215,14 +215,14 @@
215
  "id": "space_metadata",
216
  "label": "Space metadata points at the expected commit",
217
  "ok": true,
218
- "detail": "Space sha is c775d838b14529a2d057592f4058d92a8a4a006a; expected c775d838b14529a2d057592f4058d92a8a4a006a.",
219
  "evidence": "https://huggingface.co/api/spaces/ADJCJH/backblaze-proofframe"
220
  },
221
  {
222
  "id": "runtime_ready",
223
  "label": "Space runtime is running the expected commit",
224
  "ok": true,
225
- "detail": "Runtime stage is RUNNING; runtime sha is c775d838b14529a2d057592f4058d92a8a4a006a; domain ready is True.",
226
  "evidence": "https://huggingface.co/api/spaces/ADJCJH/backblaze-proofframe/runtime"
227
  },
228
  {
@@ -271,7 +271,7 @@
271
  "id": "raw_judge_decision_brief",
272
  "label": "Raw judge decision brief is public and claim-safe",
273
  "ok": true,
274
- "detail": "Decision brief schema is proofframe.judge_decision_brief.v1; mode is pre_live_decision_ready; safe_to_submit is False; checks=6; space_mode=public_space_synced; space_sync_checked_at=2026-06-30T05:43:34Z; age_days=0; fresh=True.",
275
  "evidence": "https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-decision-brief.json"
276
  },
277
  {
 
1
  {
2
  "schema": "proofframe.public_space_sync.v1",
3
+ "created_at": "2026-06-30T10:24:10Z",
4
  "ok": true,
5
  "mode": "public_space_synced",
6
  "space_id": "ADJCJH/backblaze-proofframe",
7
  "public_host": "https://adjcjh-backblaze-proofframe.hf.space",
8
+ "expected_sha": "144b65ce7b82065789abd97c39ff4dc9021afc6a",
9
  "observed": {
10
+ "space_sha": "144b65ce7b82065789abd97c39ff4dc9021afc6a",
11
+ "runtime_sha": "144b65ce7b82065789abd97c39ff4dc9021afc6a",
12
  "runtime_stage": "RUNNING",
13
  "domain_ready": true,
14
+ "last_modified": "2026-06-30T10:22:46.000Z",
15
  "health": {
16
  "ready": true,
17
  "storage_backend": "local",
 
76
  "judge_crosswalk_safe_to_submit": false,
77
  "judge_decision_brief": {
78
  "schema": "proofframe.judge_decision_brief.v1",
79
+ "created_at": "2026-06-30T10:15:25Z",
80
  "age_days": 0,
81
  "mode": "pre_live_decision_ready",
82
  "safe_to_share": true,
83
  "safe_to_submit": false,
84
  "check_count": 6,
85
  "space_mode": "public_space_synced",
86
+ "space_sync_checked_at": "2026-06-30T10:13:57Z",
87
  "evidence_index_link": "https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-evidence-index.md",
88
  "source_state_ok": true,
89
  "fresh": true
 
215
  "id": "space_metadata",
216
  "label": "Space metadata points at the expected commit",
217
  "ok": true,
218
+ "detail": "Space sha is 144b65ce7b82065789abd97c39ff4dc9021afc6a; expected 144b65ce7b82065789abd97c39ff4dc9021afc6a.",
219
  "evidence": "https://huggingface.co/api/spaces/ADJCJH/backblaze-proofframe"
220
  },
221
  {
222
  "id": "runtime_ready",
223
  "label": "Space runtime is running the expected commit",
224
  "ok": true,
225
+ "detail": "Runtime stage is RUNNING; runtime sha is 144b65ce7b82065789abd97c39ff4dc9021afc6a; domain ready is True.",
226
  "evidence": "https://huggingface.co/api/spaces/ADJCJH/backblaze-proofframe/runtime"
227
  },
228
  {
 
271
  "id": "raw_judge_decision_brief",
272
  "label": "Raw judge decision brief is public and claim-safe",
273
  "ok": true,
274
+ "detail": "Decision brief schema is proofframe.judge_decision_brief.v1; mode is pre_live_decision_ready; safe_to_submit is False; checks=6; space_mode=public_space_synced; space_sync_checked_at=2026-06-30T10:13:57Z; age_days=0; fresh=True.",
275
  "evidence": "https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-decision-brief.json"
276
  },
277
  {
docs/assets/public-space-sync-report.md CHANGED
@@ -2,26 +2,26 @@
2
 
3
  Mode: `public_space_synced`
4
  OK: `true`
5
- Created: `2026-06-30T10:15:52Z`
6
  Space: `ADJCJH/backblaze-proofframe`
7
  Public host: https://adjcjh-backblaze-proofframe.hf.space
8
- Expected sha: `c775d838b14529a2d057592f4058d92a8a4a006a`
9
- Runtime sha: `c775d838b14529a2d057592f4058d92a8a4a006a`
10
  Runtime stage: `RUNNING`
11
 
12
  ## Checks
13
 
14
  | Status | Check | Detail | Evidence |
15
  | --- | --- | --- | --- |
16
- | OK | Space metadata points at the expected commit | Space sha is c775d838b14529a2d057592f4058d92a8a4a006a; expected c775d838b14529a2d057592f4058d92a8a4a006a. | https://huggingface.co/api/spaces/ADJCJH/backblaze-proofframe |
17
- | OK | Space runtime is running the expected commit | Runtime stage is RUNNING; runtime sha is c775d838b14529a2d057592f4058d92a8a4a006a; domain ready is True. | https://huggingface.co/api/spaces/ADJCJH/backblaze-proofframe/runtime |
18
  | OK | Raw handoff report is public and ready | Handoff schema is proofframe.agent_handoff.v1; mode is handoff_ready. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/agent-handoff-report.json |
19
  | OK | Raw Devpost event snapshot is public and fresh | Event snapshot schema is proofframe.devpost_event_snapshot.v1; submission_open=True; age_days=0; participants=404. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/devpost-event-snapshot.json |
20
  | OK | Raw final launch plan is public and phase-aware | Launch plan schema is proofframe.final_launch_plan.v1; mode is ready_for_credential_entry; current phase is credential_entry. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/final-launch-plan.json |
21
  | OK | Raw B2 key scope checklist is public and no-secret | Checklist schema is proofframe.b2_key_scope_checklist.v1; safe_to_commit=True; bucket=proofframe-demo-a6b4e49; prefix=campaigns/; confirmation=required_before_key_creation; required=['listAllBucketNames', 'writeFiles']. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/b2-key-scope-checklist.json |
22
  | OK | Raw judge brief is public and claim-safe | Judge brief schema is proofframe.judge_brief.v1; safe_to_submit is False. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-brief.json |
23
  | OK | Raw judge crosswalk is public and claim-safe | Judge crosswalk schema is proofframe.judge_crosswalk.v1; mode is pre_live_crosswalk_ready; safe_to_submit is False. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-crosswalk.json |
24
- | OK | Raw judge decision brief is public and claim-safe | Decision brief schema is proofframe.judge_decision_brief.v1; mode is pre_live_decision_ready; safe_to_submit is False; checks=6; space_mode=public_space_synced; space_sync_checked_at=2026-06-30T05:43:34Z; age_days=0; fresh=True. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-decision-brief.json |
25
  | OK | Raw judge evidence index is public and claim-safe | Evidence index schema is proofframe.judge_evidence_index.v1; mode is pre_live_evidence_index_ready; safe_to_submit is False; links=18; blockers=10. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-evidence-index.json |
26
  | OK | Raw final closeout status is public and closeout-safe | Closeout schema is proofframe.final_closeout_status.v1; mode is waiting_for_credentials; safe_to_submit is False; gates=12. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/final-closeout-status.json |
27
  | OK | Final closeout API matches the raw public status | API closeout schema is proofframe.final_closeout_status.v1; mode is waiting_for_credentials; safe_to_submit is False; gates=12. | https://adjcjh-backblaze-proofframe.hf.space/api/judge/final-closeout |
 
2
 
3
  Mode: `public_space_synced`
4
  OK: `true`
5
+ Created: `2026-06-30T10:24:10Z`
6
  Space: `ADJCJH/backblaze-proofframe`
7
  Public host: https://adjcjh-backblaze-proofframe.hf.space
8
+ Expected sha: `144b65ce7b82065789abd97c39ff4dc9021afc6a`
9
+ Runtime sha: `144b65ce7b82065789abd97c39ff4dc9021afc6a`
10
  Runtime stage: `RUNNING`
11
 
12
  ## Checks
13
 
14
  | Status | Check | Detail | Evidence |
15
  | --- | --- | --- | --- |
16
+ | OK | Space metadata points at the expected commit | Space sha is 144b65ce7b82065789abd97c39ff4dc9021afc6a; expected 144b65ce7b82065789abd97c39ff4dc9021afc6a. | https://huggingface.co/api/spaces/ADJCJH/backblaze-proofframe |
17
+ | OK | Space runtime is running the expected commit | Runtime stage is RUNNING; runtime sha is 144b65ce7b82065789abd97c39ff4dc9021afc6a; domain ready is True. | https://huggingface.co/api/spaces/ADJCJH/backblaze-proofframe/runtime |
18
  | OK | Raw handoff report is public and ready | Handoff schema is proofframe.agent_handoff.v1; mode is handoff_ready. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/agent-handoff-report.json |
19
  | OK | Raw Devpost event snapshot is public and fresh | Event snapshot schema is proofframe.devpost_event_snapshot.v1; submission_open=True; age_days=0; participants=404. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/devpost-event-snapshot.json |
20
  | OK | Raw final launch plan is public and phase-aware | Launch plan schema is proofframe.final_launch_plan.v1; mode is ready_for_credential_entry; current phase is credential_entry. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/final-launch-plan.json |
21
  | OK | Raw B2 key scope checklist is public and no-secret | Checklist schema is proofframe.b2_key_scope_checklist.v1; safe_to_commit=True; bucket=proofframe-demo-a6b4e49; prefix=campaigns/; confirmation=required_before_key_creation; required=['listAllBucketNames', 'writeFiles']. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/b2-key-scope-checklist.json |
22
  | OK | Raw judge brief is public and claim-safe | Judge brief schema is proofframe.judge_brief.v1; safe_to_submit is False. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-brief.json |
23
  | OK | Raw judge crosswalk is public and claim-safe | Judge crosswalk schema is proofframe.judge_crosswalk.v1; mode is pre_live_crosswalk_ready; safe_to_submit is False. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-crosswalk.json |
24
+ | OK | Raw judge decision brief is public and claim-safe | Decision brief schema is proofframe.judge_decision_brief.v1; mode is pre_live_decision_ready; safe_to_submit is False; checks=6; space_mode=public_space_synced; space_sync_checked_at=2026-06-30T10:13:57Z; age_days=0; fresh=True. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-decision-brief.json |
25
  | OK | Raw judge evidence index is public and claim-safe | Evidence index schema is proofframe.judge_evidence_index.v1; mode is pre_live_evidence_index_ready; safe_to_submit is False; links=18; blockers=10. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/judge-evidence-index.json |
26
  | OK | Raw final closeout status is public and closeout-safe | Closeout schema is proofframe.final_closeout_status.v1; mode is waiting_for_credentials; safe_to_submit is False; gates=12. | https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main/docs/assets/final-closeout-status.json |
27
  | OK | Final closeout API matches the raw public status | API closeout schema is proofframe.final_closeout_status.v1; mode is waiting_for_credentials; safe_to_submit is False; gates=12. | https://adjcjh-backblaze-proofframe.hf.space/api/judge/final-closeout |
docs/assets/public-space-upload-report.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "schema": "proofframe.public_space_upload.v1",
3
- "created_at": "2026-06-30T10:12:41Z",
4
  "mode": "uploaded",
5
  "ok": true,
6
  "execute": true,
@@ -8,7 +8,7 @@
8
  "repo_type": "space",
9
  "revision": "main",
10
  "space_raw_base": "https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main",
11
- "commit_message": "Sync ProofFrame public Space after judge brief cleanup",
12
  "ignore_patterns": [
13
  ".git/**",
14
  ".venv/**",
@@ -51,9 +51,9 @@
51
  ]
52
  },
53
  "file_plan": {
54
- "total_files": 14893,
55
  "included_count": 209,
56
- "excluded_count": 14684,
57
  "included_samples": [
58
  ".dockerignore",
59
  ".env.example",
@@ -125,8 +125,8 @@
125
  "upload": {
126
  "attempted": true,
127
  "ok": true,
128
- "commit_url": "https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/commit/c775d838b14529a2d057592f4058d92a8a4a006a",
129
- "commit_oid": "c775d838b14529a2d057592f4058d92a8a4a006a"
130
  },
131
  "secret_probe": {
132
  "attempted": true,
 
1
  {
2
  "schema": "proofframe.public_space_upload.v1",
3
+ "created_at": "2026-06-30T10:22:48Z",
4
  "mode": "uploaded",
5
  "ok": true,
6
  "execute": true,
 
8
  "repo_type": "space",
9
  "revision": "main",
10
  "space_raw_base": "https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main",
11
+ "commit_message": "Sync ProofFrame public Space after portable proof plan",
12
  "ignore_patterns": [
13
  ".git/**",
14
  ".venv/**",
 
51
  ]
52
  },
53
  "file_plan": {
54
+ "total_files": 14935,
55
  "included_count": 209,
56
+ "excluded_count": 14726,
57
  "included_samples": [
58
  ".dockerignore",
59
  ".env.example",
 
125
  "upload": {
126
  "attempted": true,
127
  "ok": true,
128
+ "commit_url": "https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/commit/144b65ce7b82065789abd97c39ff4dc9021afc6a",
129
+ "commit_oid": "144b65ce7b82065789abd97c39ff4dc9021afc6a"
130
  },
131
  "secret_probe": {
132
  "attempted": true,
docs/assets/public-space-upload-report.md CHANGED
@@ -3,7 +3,7 @@
3
  Mode: `uploaded`
4
  OK: `true`
5
  Execute: `true`
6
- Created: `2026-06-30T10:12:41Z`
7
  Repo: `ADJCJH/backblaze-proofframe`
8
  Revision: `main`
9
  Raw base: https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main
@@ -12,7 +12,7 @@ Raw base: https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main
12
 
13
  - Required ignore patterns OK: `true`
14
  - Included files: `209`
15
- - Excluded files: `14684`
16
  - Included sensitive files: `none`
17
 
18
  ## Sensitive File Checks
@@ -25,8 +25,8 @@ Raw base: https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main
25
  ## Upload
26
 
27
  - Upload OK: `true`
28
- - Commit: `c775d838b14529a2d057592f4058d92a8a4a006a`
29
- - Commit URL: https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/commit/c775d838b14529a2d057592f4058d92a8a4a006a
30
 
31
  ## Secret Probe
32
 
 
3
  Mode: `uploaded`
4
  OK: `true`
5
  Execute: `true`
6
+ Created: `2026-06-30T10:22:48Z`
7
  Repo: `ADJCJH/backblaze-proofframe`
8
  Revision: `main`
9
  Raw base: https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/raw/main
 
12
 
13
  - Required ignore patterns OK: `true`
14
  - Included files: `209`
15
+ - Excluded files: `14726`
16
  - Included sensitive files: `none`
17
 
18
  ## Sensitive File Checks
 
25
  ## Upload
26
 
27
  - Upload OK: `true`
28
+ - Commit: `144b65ce7b82065789abd97c39ff4dc9021afc6a`
29
+ - Commit URL: https://huggingface.co/spaces/ADJCJH/backblaze-proofframe/commit/144b65ce7b82065789abd97c39ff4dc9021afc6a
30
 
31
  ## Secret Probe
32
 
docs/assets/secret-scan-report.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "schema": "proofframe.secret_scan.v1",
3
- "created_at": "2026-06-30T10:21:45Z",
4
  "mode": "clear",
5
  "ok": true,
6
  "root": ".",
@@ -9,7 +9,7 @@
9
  "scanned_text_files": 233,
10
  "inventoried_binary_files": 6,
11
  "skipped_local_secret_files": 1,
12
- "skipped_hard_files": 14506,
13
  "findings": 0
14
  },
15
  "coverage": {
 
1
  {
2
  "schema": "proofframe.secret_scan.v1",
3
+ "created_at": "2026-06-30T10:34:40Z",
4
  "mode": "clear",
5
  "ok": true,
6
  "root": ".",
 
9
  "scanned_text_files": 233,
10
  "inventoried_binary_files": 6,
11
  "skipped_local_secret_files": 1,
12
+ "skipped_hard_files": 14488,
13
  "findings": 0
14
  },
15
  "coverage": {
docs/assets/secret-scan-report.md CHANGED
@@ -2,7 +2,7 @@
2
 
3
  Mode: `clear`
4
  OK: `true`
5
- Created: `2026-06-30T10:21:45Z`
6
 
7
  ## Counts
8
 
 
2
 
3
  Mode: `clear`
4
  OK: `true`
5
+ Created: `2026-06-30T10:34:40Z`
6
 
7
  ## Counts
8
 
docs/assets/submission-audit-report.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "schema": "proofframe.submission_audit.v1",
3
- "created_at": "2026-06-30T10:21:45Z",
4
  "mode": "pre_submit_audit_blocked",
5
  "ok": false,
6
  "root": ".",
 
1
  {
2
  "schema": "proofframe.submission_audit.v1",
3
+ "created_at": "2026-06-30T10:34:40Z",
4
  "mode": "pre_submit_audit_blocked",
5
  "ok": false,
6
  "root": ".",
docs/assets/submission-audit-report.md CHANGED
@@ -2,7 +2,7 @@
2
 
3
  Mode: `pre_submit_audit_blocked`
4
  OK: `false`
5
- Created: `2026-06-30T10:21:45Z`
6
  Final evidence: `docs/assets/final-live-proof-evidence.json`
7
 
8
  ## Task Statuses
 
2
 
3
  Mode: `pre_submit_audit_blocked`
4
  OK: `false`
5
+ Created: `2026-06-30T10:34:40Z`
6
  Final evidence: `docs/assets/final-live-proof-evidence.json`
7
 
8
  ## Task Statuses
docs/assets/submission-bundle-manifest.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "schema": "proofframe.submission_bundle.v1",
3
- "created_at": "2026-06-30T10:21:45Z",
4
  "project": "ProofFrame",
5
  "repository_url": "https://github.com/adjcjh777/backblaze-proofframe",
6
  "public_demo_url": "https://adjcjh-backblaze-proofframe.hf.space/?judge=1",
@@ -137,7 +137,7 @@
137
  "present": true,
138
  "schema": "proofframe.secret_scan.v1",
139
  "schema_ok": true,
140
- "created_at": "2026-06-30T10:21:45Z",
141
  "ready": true,
142
  "fresh_after_receipt": true,
143
  "findings": []
@@ -148,7 +148,7 @@
148
  "present": true,
149
  "schema": "proofframe.final_submission_control.v1",
150
  "schema_ok": true,
151
- "created_at": "2026-06-30T10:21:45Z",
152
  "ready": false,
153
  "fresh_after_receipt": true,
154
  "findings": [
@@ -162,7 +162,7 @@
162
  "present": true,
163
  "schema": "proofframe.final_closeout_status.v1",
164
  "schema_ok": true,
165
- "created_at": "2026-06-30T10:21:45Z",
166
  "ready": false,
167
  "fresh_after_receipt": true,
168
  "findings": [
@@ -190,7 +190,7 @@
190
  "present": true,
191
  "schema": "proofframe.final_launch_plan.v1",
192
  "schema_ok": true,
193
- "created_at": "2026-06-30T05:21:11Z",
194
  "ready": false,
195
  "fresh_after_receipt": true,
196
  "findings": [
@@ -234,8 +234,8 @@
234
  "path": "README.md",
235
  "label": "Core public project overview",
236
  "present": true,
237
- "bytes": 15718,
238
- "sha256": "f2d927ebb3ab4f705299ebea80cdd433023ba3de93aaa43b9147a2ca3f49ab46"
239
  },
240
  {
241
  "id": "dockerfile",
@@ -378,8 +378,8 @@
378
  "path": "scripts/public_space_sync.py",
379
  "label": "Public Hugging Face Space sync verifier",
380
  "present": true,
381
- "bytes": 84533,
382
- "sha256": "7e79e725fc04ba0b6c531b73374d64af4a542ff714ef410d370e59961bf1a3e2"
383
  },
384
  {
385
  "id": "public_space_sync_json",
@@ -387,7 +387,7 @@
387
  "label": "Machine-readable public Space sync report",
388
  "present": true,
389
  "bytes": 20606,
390
- "sha256": "aa2dad62e9fa099f5c7eb3f5640d7d00dd2a9798bb76d41ce6d575a0a26d4910"
391
  },
392
  {
393
  "id": "public_space_sync_md",
@@ -395,7 +395,7 @@
395
  "label": "Human-readable public Space sync report",
396
  "present": true,
397
  "bytes": 8673,
398
- "sha256": "d587400442f71b61ea1469fbcb976405bb0ea244180adf81c32d32cd0f182a44"
399
  },
400
  {
401
  "id": "public_space_upload_script",
@@ -411,7 +411,7 @@
411
  "label": "Machine-readable public Space upload report",
412
  "present": true,
413
  "bytes": 4150,
414
- "sha256": "42e1f29bb2591795ce2a0f4cc9b04bdaa8b849390f87242018c4a369dd49b0fa"
415
  },
416
  {
417
  "id": "public_space_upload_md",
@@ -419,7 +419,7 @@
419
  "label": "Human-readable public Space upload report",
420
  "present": true,
421
  "bytes": 1372,
422
- "sha256": "523d4a7614613d8ba03cbe6657061aec644d77eac017c9926d9cf8927266c183"
423
  },
424
  {
425
  "id": "public_demo_screenshot_script",
@@ -803,7 +803,7 @@
803
  "label": "Machine-readable final control report",
804
  "present": true,
805
  "bytes": 24359,
806
- "sha256": "75b85638e7545de7e7092941de6c53fe1f8f9b3da405cb115e34edaaf98c8db9"
807
  },
808
  {
809
  "id": "final_submission_control_md",
@@ -811,7 +811,7 @@
811
  "label": "Human-readable final control report",
812
  "present": true,
813
  "bytes": 7087,
814
- "sha256": "212f9a8537ba22003d78a5c5c646af54f4dfec82cc85216250bccff6b5119e43"
815
  },
816
  {
817
  "id": "final_closeout_status_script",
@@ -827,7 +827,7 @@
827
  "label": "Machine-readable final closeout status",
828
  "present": true,
829
  "bytes": 12592,
830
- "sha256": "c3593ced6d2f0db407bc014785b4a06101ed1d9e3a10ca832911e684b45bbd21"
831
  },
832
  {
833
  "id": "final_closeout_status_md",
@@ -842,24 +842,24 @@
842
  "path": "scripts/final_operator_brief.py",
843
  "label": "No-secret final operator brief",
844
  "present": true,
845
- "bytes": 15305,
846
- "sha256": "06367d7eddaf62ef7dc6068ed2b83bb2b04c12d0931650ae3770c415345e244c"
847
  },
848
  {
849
  "id": "final_operator_brief_json",
850
  "path": "docs/assets/final-operator-brief.json",
851
  "label": "Machine-readable final operator brief",
852
  "present": true,
853
- "bytes": 9555,
854
- "sha256": "bdda68a06465e32c44738d323f06e00fd71270c17a7145581cd2c793efc945a4"
855
  },
856
  {
857
  "id": "final_operator_brief_md",
858
  "path": "docs/assets/final-operator-brief.md",
859
  "label": "Human-readable final operator brief",
860
  "present": true,
861
- "bytes": 3985,
862
- "sha256": "4e035a35fea178fa2d5dbe9e52f3e8368844d0ba5d88b4ea2e4651c24c1f5394"
863
  },
864
  {
865
  "id": "final_launch_plan_script",
@@ -875,7 +875,7 @@
875
  "label": "Machine-readable final launch plan",
876
  "present": true,
877
  "bytes": 5690,
878
- "sha256": "08380a4f74ed87a52c31dc8fd53ebbf0b8926c04218be8088103a299d3550a55"
879
  },
880
  {
881
  "id": "final_launch_plan_md",
@@ -899,7 +899,7 @@
899
  "label": "Machine-readable final rehearsal checklist",
900
  "present": true,
901
  "bytes": 17103,
902
- "sha256": "bbf2a60092d76ccc05a33c1ac5dd66b6b7a4f8c1650ba3335c5bb710699e1562"
903
  },
904
  {
905
  "id": "final_rehearsal_md",
@@ -907,7 +907,7 @@
907
  "label": "Human-readable final rehearsal checklist",
908
  "present": true,
909
  "bytes": 7404,
910
- "sha256": "03f4b95358f2fa19bc224ad2bb284db2380ce86b71f1586410f48ea2c3253f40"
911
  },
912
  {
913
  "id": "submission_audit_script",
@@ -923,7 +923,7 @@
923
  "label": "Machine-readable submission audit report",
924
  "present": true,
925
  "bytes": 5925,
926
- "sha256": "ee996b0af38d788fff67f96139d55d78ee0f65ed689a121f0200ff8298c9cd83"
927
  },
928
  {
929
  "id": "submission_audit_md",
@@ -931,7 +931,7 @@
931
  "label": "Human-readable submission audit report",
932
  "present": true,
933
  "bytes": 4459,
934
- "sha256": "1ea287caa81cb763df77f0cbf072ec46d6386c5f1fb911a2e484efc0f3f2fa3e"
935
  },
936
  {
937
  "id": "devpost_receipt_script",
@@ -978,8 +978,8 @@
978
  "path": "docs/verification.md",
979
  "label": "Local, CI, Docker, and live proof runbook",
980
  "present": true,
981
- "bytes": 12070,
982
- "sha256": "cab41d4b7a0454e4f66a37265ae983e5092bb9583fb19936d706d7fa3e24993a"
983
  },
984
  {
985
  "id": "final_env_template",
@@ -1003,7 +1003,7 @@
1003
  "label": "Machine-readable secret scan report",
1004
  "present": true,
1005
  "bytes": 11871,
1006
- "sha256": "9182d21b6defddc1f8fe043a194e808224b95b93a2bd039c9ffd9f2313cbfece"
1007
  },
1008
  {
1009
  "id": "secret_scan_md",
@@ -1011,7 +1011,7 @@
1011
  "label": "Human-readable secret scan report",
1012
  "present": true,
1013
  "bytes": 846,
1014
- "sha256": "3bdd7405edfade109d86523110bc8a1653012e1f032f5f24ffe1b5a8dea1f482"
1015
  },
1016
  {
1017
  "id": "b2_live_setup_json",
@@ -1218,8 +1218,8 @@
1218
  "path": "tasks.json",
1219
  "label": "Machine-readable task board",
1220
  "present": true,
1221
- "bytes": 71942,
1222
- "sha256": "33e1a70c6835850a8225a2cb755ae0ec94ad3c1f667b47c7c9c63b9c0cb57f2b"
1223
  },
1224
  {
1225
  "id": "local_ui_smoke",
 
1
  {
2
  "schema": "proofframe.submission_bundle.v1",
3
+ "created_at": "2026-06-30T10:34:40Z",
4
  "project": "ProofFrame",
5
  "repository_url": "https://github.com/adjcjh777/backblaze-proofframe",
6
  "public_demo_url": "https://adjcjh-backblaze-proofframe.hf.space/?judge=1",
 
137
  "present": true,
138
  "schema": "proofframe.secret_scan.v1",
139
  "schema_ok": true,
140
+ "created_at": "2026-06-30T10:34:40Z",
141
  "ready": true,
142
  "fresh_after_receipt": true,
143
  "findings": []
 
148
  "present": true,
149
  "schema": "proofframe.final_submission_control.v1",
150
  "schema_ok": true,
151
+ "created_at": "2026-06-30T10:34:39Z",
152
  "ready": false,
153
  "fresh_after_receipt": true,
154
  "findings": [
 
162
  "present": true,
163
  "schema": "proofframe.final_closeout_status.v1",
164
  "schema_ok": true,
165
+ "created_at": "2026-06-30T10:34:39Z",
166
  "ready": false,
167
  "fresh_after_receipt": true,
168
  "findings": [
 
190
  "present": true,
191
  "schema": "proofframe.final_launch_plan.v1",
192
  "schema_ok": true,
193
+ "created_at": "2026-06-30T10:34:39Z",
194
  "ready": false,
195
  "fresh_after_receipt": true,
196
  "findings": [
 
234
  "path": "README.md",
235
  "label": "Core public project overview",
236
  "present": true,
237
+ "bytes": 15754,
238
+ "sha256": "363988b5191f54bfdaffffc045485215ec612b19f7f215773956a2397f5a489c"
239
  },
240
  {
241
  "id": "dockerfile",
 
378
  "path": "scripts/public_space_sync.py",
379
  "label": "Public Hugging Face Space sync verifier",
380
  "present": true,
381
+ "bytes": 84964,
382
+ "sha256": "52280330d9e7605b093a6e3a6749b7ee5336621711c3a41692007b53fa42aaed"
383
  },
384
  {
385
  "id": "public_space_sync_json",
 
387
  "label": "Machine-readable public Space sync report",
388
  "present": true,
389
  "bytes": 20606,
390
+ "sha256": "79bb420f3af13169bacbca15c44765c59707d410644540771027893714f81b6e"
391
  },
392
  {
393
  "id": "public_space_sync_md",
 
395
  "label": "Human-readable public Space sync report",
396
  "present": true,
397
  "bytes": 8673,
398
+ "sha256": "f88d08314f5d10e9ae5a4b90639e04317bbdd30d0e863bf9d48bcc5e38603036"
399
  },
400
  {
401
  "id": "public_space_upload_script",
 
411
  "label": "Machine-readable public Space upload report",
412
  "present": true,
413
  "bytes": 4150,
414
+ "sha256": "ba7d18ffa6c81e74bf0695bb88e8b4a450e00ac4a69e603e987d6c7815a7e90d"
415
  },
416
  {
417
  "id": "public_space_upload_md",
 
419
  "label": "Human-readable public Space upload report",
420
  "present": true,
421
  "bytes": 1372,
422
+ "sha256": "54004f7b2da7855d97a41398664d97449684bf2c75243e0682df9695edb1fb03"
423
  },
424
  {
425
  "id": "public_demo_screenshot_script",
 
803
  "label": "Machine-readable final control report",
804
  "present": true,
805
  "bytes": 24359,
806
+ "sha256": "9296e8833cc97cebc405d532d46dd2809d828611fead5fc55039217dcde6b96c"
807
  },
808
  {
809
  "id": "final_submission_control_md",
 
811
  "label": "Human-readable final control report",
812
  "present": true,
813
  "bytes": 7087,
814
+ "sha256": "25a37efea59f5a07ec9313e4deddadcef6846f7f1f1236111e9d862be27971ac"
815
  },
816
  {
817
  "id": "final_closeout_status_script",
 
827
  "label": "Machine-readable final closeout status",
828
  "present": true,
829
  "bytes": 12592,
830
+ "sha256": "97c97abad3ba39e273d37afd89d91364dc92879d86a623be2dbd99690de3d15d"
831
  },
832
  {
833
  "id": "final_closeout_status_md",
 
842
  "path": "scripts/final_operator_brief.py",
843
  "label": "No-secret final operator brief",
844
  "present": true,
845
+ "bytes": 15912,
846
+ "sha256": "1e01afa36b48d9b801bd36ee1c92b91be1d3586121562efd823f8007ed4ba76a"
847
  },
848
  {
849
  "id": "final_operator_brief_json",
850
  "path": "docs/assets/final-operator-brief.json",
851
  "label": "Machine-readable final operator brief",
852
  "present": true,
853
+ "bytes": 10142,
854
+ "sha256": "4fb10abaa1f654cfc874bd96c03f31c663533ca60943e38c67ae603e34dc51f0"
855
  },
856
  {
857
  "id": "final_operator_brief_md",
858
  "path": "docs/assets/final-operator-brief.md",
859
  "label": "Human-readable final operator brief",
860
  "present": true,
861
+ "bytes": 4526,
862
+ "sha256": "42f6a85163235033082406d68039c45789700542afd1913a608508fcef6e47fe"
863
  },
864
  {
865
  "id": "final_launch_plan_script",
 
875
  "label": "Machine-readable final launch plan",
876
  "present": true,
877
  "bytes": 5690,
878
+ "sha256": "2f74c7c3b603e5125baccd05d750bf2a8ffbd3f06c1e4cfcb4017f48d408b041"
879
  },
880
  {
881
  "id": "final_launch_plan_md",
 
899
  "label": "Machine-readable final rehearsal checklist",
900
  "present": true,
901
  "bytes": 17103,
902
+ "sha256": "ae398d43c900e40fca63a368e0277448cf042f93d8c11f27831d3999414b54a1"
903
  },
904
  {
905
  "id": "final_rehearsal_md",
 
907
  "label": "Human-readable final rehearsal checklist",
908
  "present": true,
909
  "bytes": 7404,
910
+ "sha256": "026e07a2a99bf6166f016e8edd6b37899fd91b9ed2e108b30a342b20643b03f0"
911
  },
912
  {
913
  "id": "submission_audit_script",
 
923
  "label": "Machine-readable submission audit report",
924
  "present": true,
925
  "bytes": 5925,
926
+ "sha256": "da4f79c9f66a7e6e226b01f0a9fdfc23b91b6ff06eefbaf70d1a0ae269ad8897"
927
  },
928
  {
929
  "id": "submission_audit_md",
 
931
  "label": "Human-readable submission audit report",
932
  "present": true,
933
  "bytes": 4459,
934
+ "sha256": "76f29f258d5b4cef623a85d357df9a3b404afecfdda76c817b4e543bde1f64a5"
935
  },
936
  {
937
  "id": "devpost_receipt_script",
 
978
  "path": "docs/verification.md",
979
  "label": "Local, CI, Docker, and live proof runbook",
980
  "present": true,
981
+ "bytes": 12499,
982
+ "sha256": "c92fd26c877d5c5fbef51af2cb37bcb3f9be37bed4cc2027d5640717c8636a27"
983
  },
984
  {
985
  "id": "final_env_template",
 
1003
  "label": "Machine-readable secret scan report",
1004
  "present": true,
1005
  "bytes": 11871,
1006
+ "sha256": "f228cd4b487d25b998eda59eb0db975aad6441865bd4a27f402e96193ea3b666"
1007
  },
1008
  {
1009
  "id": "secret_scan_md",
 
1011
  "label": "Human-readable secret scan report",
1012
  "present": true,
1013
  "bytes": 846,
1014
+ "sha256": "044ccc76b693ebdef875f791f1c09ebe54abcb3c2ef2aab1b3557ef47c5bbe9e"
1015
  },
1016
  {
1017
  "id": "b2_live_setup_json",
 
1218
  "path": "tasks.json",
1219
  "label": "Machine-readable task board",
1220
  "present": true,
1221
+ "bytes": 72478,
1222
+ "sha256": "76c2bf237562c2ec633d5c305c2140a408e22c789914981620a6231ddb9630bc"
1223
  },
1224
  {
1225
  "id": "local_ui_smoke",
docs/assets/submission-bundle-manifest.md CHANGED
@@ -1,6 +1,6 @@
1
  # ProofFrame Submission Bundle
2
 
3
- Created: `2026-06-30T10:21:45Z`
4
  Repository: https://github.com/adjcjh777/backblaze-proofframe
5
  Public mock demo: https://adjcjh-backblaze-proofframe.hf.space/?judge=1
6
  Devpost packet mode: `pre_live_safe`
@@ -25,7 +25,7 @@ Final gate ready: `false`
25
 
26
  ## Artifacts
27
 
28
- - `README.md` (15718 bytes, sha256 `f2d927ebb3ab4f70...`) - Core public project overview
29
  - `Dockerfile` (522 bytes, sha256 `6764f101746a802d...`) - Docker deployment image contract
30
  - `.dockerignore` (214 bytes, sha256 `29e12906fc6e9af3...`) - Docker build context secret exclusion policy
31
  - `scripts/docker_smoke.py` (13273 bytes, sha256 `4e900d7da53d329c...`) - Docker build and API smoke verifier
@@ -43,12 +43,12 @@ Final gate ready: `false`
43
  - `scripts/agent_handoff_check.py` (14559 bytes, sha256 `3ef180b6a92eb987...`) - Agent Bus and Codex handoff path checker
44
  - `docs/assets/agent-handoff-report.json` (2253 bytes, sha256 `87711b3b8a5b1515...`) - Machine-readable Agent handoff report
45
  - `docs/assets/agent-handoff-report.md` (1571 bytes, sha256 `b64f0c7769d5867c...`) - Human-readable Agent handoff report
46
- - `scripts/public_space_sync.py` (84533 bytes, sha256 `7e79e725fc04ba0b...`) - Public Hugging Face Space sync verifier
47
- - `docs/assets/public-space-sync-report.json` (20606 bytes, sha256 `aa2dad62e9fa099f...`) - Machine-readable public Space sync report
48
- - `docs/assets/public-space-sync-report.md` (8673 bytes, sha256 `d587400442f71b61...`) - Human-readable public Space sync report
49
  - `scripts/public_space_upload.py` (12920 bytes, sha256 `38e4c3e665478e0b...`) - No-secret public Hugging Face Space upload helper
50
- - `docs/assets/public-space-upload-report.json` (4150 bytes, sha256 `42e1f29bb2591795...`) - Machine-readable public Space upload report
51
- - `docs/assets/public-space-upload-report.md` (1372 bytes, sha256 `523d4a7614613d8b...`) - Human-readable public Space upload report
52
  - `scripts/public_demo_screenshot.py` (8926 bytes, sha256 `3eb5b0a003e383dd...`) - Public judge-mode screenshot verifier
53
  - `docs/assets/public-demo-screenshot-report.json` (2421 bytes, sha256 `e8ce08735a86a920...`) - Machine-readable public screenshot report
54
  - `docs/assets/public-demo-screenshot-report.md` (1418 bytes, sha256 `dce44c3bc2188131...`) - Human-readable public screenshot report
@@ -96,33 +96,33 @@ Final gate ready: `false`
96
  - `docs/assets/award-readiness-report.json` (11377 bytes, sha256 `66417f6e0c2a15d9...`) - Machine-readable award readiness report
97
  - `docs/assets/award-readiness-report.md` (4390 bytes, sha256 `5be57ca5d9cab53d...`) - Human-readable award readiness report
98
  - `scripts/final_submission_control.py` (32644 bytes, sha256 `6514cbdf2bfe8998...`) - Final submission control tower
99
- - `docs/assets/final-submission-control.json` (24359 bytes, sha256 `75b85638e7545de7...`) - Machine-readable final control report
100
- - `docs/assets/final-submission-control.md` (7087 bytes, sha256 `212f9a8537ba2200...`) - Human-readable final control report
101
  - `scripts/final_closeout_status.py` (19027 bytes, sha256 `fef94acd01449141...`) - No-secret final closeout status report
102
- - `docs/assets/final-closeout-status.json` (12592 bytes, sha256 `c3593ced6d2f0db4...`) - Machine-readable final closeout status
103
  - `docs/assets/final-closeout-status.md` (2467 bytes, sha256 `218ef848c482db51...`) - Human-readable final closeout status
104
- - `scripts/final_operator_brief.py` (15305 bytes, sha256 `06367d7eddaf62ef...`) - No-secret final operator brief
105
- - `docs/assets/final-operator-brief.json` (9555 bytes, sha256 `bdda68a06465e32c...`) - Machine-readable final operator brief
106
- - `docs/assets/final-operator-brief.md` (3985 bytes, sha256 `4e035a35fea178fa...`) - Human-readable final operator brief
107
  - `scripts/final_launch_plan.py` (17492 bytes, sha256 `dc2766d5f424c1ac...`) - No-secret final launch phase plan
108
- - `docs/assets/final-launch-plan.json` (5690 bytes, sha256 `08380a4f74ed87a5...`) - Machine-readable final launch plan
109
  - `docs/assets/final-launch-plan.md` (4596 bytes, sha256 `7747b3177be9562a...`) - Human-readable final launch plan
110
  - `scripts/final_rehearsal.py` (18265 bytes, sha256 `7b0b844fcce35158...`) - No-secret final submission rehearsal checklist
111
- - `docs/assets/final-rehearsal-checklist.json` (17103 bytes, sha256 `bbf2a60092d76ccc...`) - Machine-readable final rehearsal checklist
112
- - `docs/assets/final-rehearsal-checklist.md` (7404 bytes, sha256 `03f4b95358f2fa19...`) - Human-readable final rehearsal checklist
113
  - `scripts/submission_audit.py` (20684 bytes, sha256 `0f9a378c203bf7b6...`) - Pre-submit audit gate
114
- - `docs/assets/submission-audit-report.json` (5925 bytes, sha256 `ee996b0af38d788f...`) - Machine-readable submission audit report
115
- - `docs/assets/submission-audit-report.md` (4459 bytes, sha256 `1ea287caa81cb763...`) - Human-readable submission audit report
116
  - `scripts/devpost_submission_receipt.py` (9209 bytes, sha256 `76c55e8ff1aeaa52...`) - Public-safe Devpost submission receipt generator
117
  - `docs/assets/devpost-submission-receipt.json` (1298 bytes, sha256 `bf646cf968665c8c...`) - Machine-readable Devpost submission receipt
118
  - `docs/assets/devpost-submission-receipt.md` (996 bytes, sha256 `af2fa18349d5c017...`) - Human-readable Devpost submission receipt
119
  - `docs/evidence_package.md` (21706 bytes, sha256 `82c45621486c175e...`) - Evidence package plan
120
  - `docs/public_claim_freeze.md` (4089 bytes, sha256 `735b9188feae74ea...`) - Verified-claim boundary
121
- - `docs/verification.md` (12070 bytes, sha256 `cab41d4b7a0454e4...`) - Local, CI, Docker, and live proof runbook
122
  - `.env.final.example` (363 bytes, sha256 `fb5fad4f14e2b0ad...`) - Redacted final B2 plus Genblaze env template
123
  - `scripts/secret_scan.py` (11105 bytes, sha256 `02aec3a4a6e9fd47...`) - Final secret scanner
124
- - `docs/assets/secret-scan-report.json` (11871 bytes, sha256 `9182d21b6defddc1...`) - Machine-readable secret scan report
125
- - `docs/assets/secret-scan-report.md` (846 bytes, sha256 `3bdd7405edfade10...`) - Human-readable secret scan report
126
  - `docs/assets/b2-live-setup.json` (719 bytes, sha256 `a377923f48e112b1...`) - Non-secret B2 bucket setup record
127
  - `docs/assets/b2-live-setup.md` (864 bytes, sha256 `863b2a02e3d2824f...`) - Human-readable B2 bucket setup record
128
  - `scripts/b2_key_scope_checklist.py` (17240 bytes, sha256 `bb1e6140f10aa3ac...`) - No-secret Backblaze B2 application key scope checklist
@@ -148,7 +148,7 @@ Final gate ready: `false`
148
  - `docs/assets/recording-assets.md` (3867 bytes, sha256 `e3d2ef5dd86dfe33...`) - Human-readable recording asset report
149
  - `scripts/run_final_live_proof.py` (5814 bytes, sha256 `c6b9dc2fc9d7c670...`) - One-command final B2 plus Genblaze proof runner
150
  - `docs/submission.md` (4000 bytes, sha256 `b702417f1345fe39...`) - Registration and submission plan
151
- - `tasks.json` (71942 bytes, sha256 `33e1a70c6835850a...`) - Machine-readable task board
152
  - `docs/assets/proofframe-local-ui-smoke.png` (364927 bytes, sha256 `cca671ad38bda4dc...`) - Local UI screenshot
153
  - `docs/assets/proofframe-review-console-smoke.png` (343618 bytes, sha256 `30620a33e3c7ab28...`) - Review console screenshot
154
  - `docs/assets/proofframe-hf-public-smoke.png` (741074 bytes, sha256 `5d6f68f7a4a2fdee...`) - Public mock demo screenshot
 
1
  # ProofFrame Submission Bundle
2
 
3
+ Created: `2026-06-30T10:34:40Z`
4
  Repository: https://github.com/adjcjh777/backblaze-proofframe
5
  Public mock demo: https://adjcjh-backblaze-proofframe.hf.space/?judge=1
6
  Devpost packet mode: `pre_live_safe`
 
25
 
26
  ## Artifacts
27
 
28
+ - `README.md` (15754 bytes, sha256 `363988b5191f54bf...`) - Core public project overview
29
  - `Dockerfile` (522 bytes, sha256 `6764f101746a802d...`) - Docker deployment image contract
30
  - `.dockerignore` (214 bytes, sha256 `29e12906fc6e9af3...`) - Docker build context secret exclusion policy
31
  - `scripts/docker_smoke.py` (13273 bytes, sha256 `4e900d7da53d329c...`) - Docker build and API smoke verifier
 
43
  - `scripts/agent_handoff_check.py` (14559 bytes, sha256 `3ef180b6a92eb987...`) - Agent Bus and Codex handoff path checker
44
  - `docs/assets/agent-handoff-report.json` (2253 bytes, sha256 `87711b3b8a5b1515...`) - Machine-readable Agent handoff report
45
  - `docs/assets/agent-handoff-report.md` (1571 bytes, sha256 `b64f0c7769d5867c...`) - Human-readable Agent handoff report
46
+ - `scripts/public_space_sync.py` (84964 bytes, sha256 `52280330d9e7605b...`) - Public Hugging Face Space sync verifier
47
+ - `docs/assets/public-space-sync-report.json` (20606 bytes, sha256 `79bb420f3af13169...`) - Machine-readable public Space sync report
48
+ - `docs/assets/public-space-sync-report.md` (8673 bytes, sha256 `f88d08314f5d10e9...`) - Human-readable public Space sync report
49
  - `scripts/public_space_upload.py` (12920 bytes, sha256 `38e4c3e665478e0b...`) - No-secret public Hugging Face Space upload helper
50
+ - `docs/assets/public-space-upload-report.json` (4150 bytes, sha256 `ba7d18ffa6c81e74...`) - Machine-readable public Space upload report
51
+ - `docs/assets/public-space-upload-report.md` (1372 bytes, sha256 `54004f7b2da7855d...`) - Human-readable public Space upload report
52
  - `scripts/public_demo_screenshot.py` (8926 bytes, sha256 `3eb5b0a003e383dd...`) - Public judge-mode screenshot verifier
53
  - `docs/assets/public-demo-screenshot-report.json` (2421 bytes, sha256 `e8ce08735a86a920...`) - Machine-readable public screenshot report
54
  - `docs/assets/public-demo-screenshot-report.md` (1418 bytes, sha256 `dce44c3bc2188131...`) - Human-readable public screenshot report
 
96
  - `docs/assets/award-readiness-report.json` (11377 bytes, sha256 `66417f6e0c2a15d9...`) - Machine-readable award readiness report
97
  - `docs/assets/award-readiness-report.md` (4390 bytes, sha256 `5be57ca5d9cab53d...`) - Human-readable award readiness report
98
  - `scripts/final_submission_control.py` (32644 bytes, sha256 `6514cbdf2bfe8998...`) - Final submission control tower
99
+ - `docs/assets/final-submission-control.json` (24359 bytes, sha256 `9296e8833cc97ceb...`) - Machine-readable final control report
100
+ - `docs/assets/final-submission-control.md` (7087 bytes, sha256 `25a37efea59f5a07...`) - Human-readable final control report
101
  - `scripts/final_closeout_status.py` (19027 bytes, sha256 `fef94acd01449141...`) - No-secret final closeout status report
102
+ - `docs/assets/final-closeout-status.json` (12592 bytes, sha256 `97c97abad3ba39e2...`) - Machine-readable final closeout status
103
  - `docs/assets/final-closeout-status.md` (2467 bytes, sha256 `218ef848c482db51...`) - Human-readable final closeout status
104
+ - `scripts/final_operator_brief.py` (15912 bytes, sha256 `1e01afa36b48d9b8...`) - No-secret final operator brief
105
+ - `docs/assets/final-operator-brief.json` (10142 bytes, sha256 `4fb10abaa1f654cf...`) - Machine-readable final operator brief
106
+ - `docs/assets/final-operator-brief.md` (4526 bytes, sha256 `42f6a85163235033...`) - Human-readable final operator brief
107
  - `scripts/final_launch_plan.py` (17492 bytes, sha256 `dc2766d5f424c1ac...`) - No-secret final launch phase plan
108
+ - `docs/assets/final-launch-plan.json` (5690 bytes, sha256 `2f74c7c3b603e512...`) - Machine-readable final launch plan
109
  - `docs/assets/final-launch-plan.md` (4596 bytes, sha256 `7747b3177be9562a...`) - Human-readable final launch plan
110
  - `scripts/final_rehearsal.py` (18265 bytes, sha256 `7b0b844fcce35158...`) - No-secret final submission rehearsal checklist
111
+ - `docs/assets/final-rehearsal-checklist.json` (17103 bytes, sha256 `ae398d43c900e40f...`) - Machine-readable final rehearsal checklist
112
+ - `docs/assets/final-rehearsal-checklist.md` (7404 bytes, sha256 `026e07a2a99bf616...`) - Human-readable final rehearsal checklist
113
  - `scripts/submission_audit.py` (20684 bytes, sha256 `0f9a378c203bf7b6...`) - Pre-submit audit gate
114
+ - `docs/assets/submission-audit-report.json` (5925 bytes, sha256 `da4f79c9f66a7e6e...`) - Machine-readable submission audit report
115
+ - `docs/assets/submission-audit-report.md` (4459 bytes, sha256 `76f29f258d5b4cef...`) - Human-readable submission audit report
116
  - `scripts/devpost_submission_receipt.py` (9209 bytes, sha256 `76c55e8ff1aeaa52...`) - Public-safe Devpost submission receipt generator
117
  - `docs/assets/devpost-submission-receipt.json` (1298 bytes, sha256 `bf646cf968665c8c...`) - Machine-readable Devpost submission receipt
118
  - `docs/assets/devpost-submission-receipt.md` (996 bytes, sha256 `af2fa18349d5c017...`) - Human-readable Devpost submission receipt
119
  - `docs/evidence_package.md` (21706 bytes, sha256 `82c45621486c175e...`) - Evidence package plan
120
  - `docs/public_claim_freeze.md` (4089 bytes, sha256 `735b9188feae74ea...`) - Verified-claim boundary
121
+ - `docs/verification.md` (12499 bytes, sha256 `c92fd26c877d5c5f...`) - Local, CI, Docker, and live proof runbook
122
  - `.env.final.example` (363 bytes, sha256 `fb5fad4f14e2b0ad...`) - Redacted final B2 plus Genblaze env template
123
  - `scripts/secret_scan.py` (11105 bytes, sha256 `02aec3a4a6e9fd47...`) - Final secret scanner
124
+ - `docs/assets/secret-scan-report.json` (11871 bytes, sha256 `f228cd4b487d25b9...`) - Machine-readable secret scan report
125
+ - `docs/assets/secret-scan-report.md` (846 bytes, sha256 `044ccc76b693ebde...`) - Human-readable secret scan report
126
  - `docs/assets/b2-live-setup.json` (719 bytes, sha256 `a377923f48e112b1...`) - Non-secret B2 bucket setup record
127
  - `docs/assets/b2-live-setup.md` (864 bytes, sha256 `863b2a02e3d2824f...`) - Human-readable B2 bucket setup record
128
  - `scripts/b2_key_scope_checklist.py` (17240 bytes, sha256 `bb1e6140f10aa3ac...`) - No-secret Backblaze B2 application key scope checklist
 
148
  - `docs/assets/recording-assets.md` (3867 bytes, sha256 `e3d2ef5dd86dfe33...`) - Human-readable recording asset report
149
  - `scripts/run_final_live_proof.py` (5814 bytes, sha256 `c6b9dc2fc9d7c670...`) - One-command final B2 plus Genblaze proof runner
150
  - `docs/submission.md` (4000 bytes, sha256 `b702417f1345fe39...`) - Registration and submission plan
151
+ - `tasks.json` (72478 bytes, sha256 `76c2bf237562c2ec...`) - Machine-readable task board
152
  - `docs/assets/proofframe-local-ui-smoke.png` (364927 bytes, sha256 `cca671ad38bda4dc...`) - Local UI screenshot
153
  - `docs/assets/proofframe-review-console-smoke.png` (343618 bytes, sha256 `30620a33e3c7ab28...`) - Review console screenshot
154
  - `docs/assets/proofframe-hf-public-smoke.png` (741074 bytes, sha256 `5d6f68f7a4a2fdee...`) - Public mock demo screenshot
docs/todo.md CHANGED
@@ -57,3 +57,4 @@ python3 scripts/task.py doing T020 --note "Live B2 proof in progress"
57
  | T098 | No-secret public Space upload helper added with dry-run safety checks, explicit execute mode, raw `.env.final.local` public 404 probe, tests, docs, CI, and bundle coverage. |
58
  | T099 | Public HF Space synced through the no-secret upload helper; raw `.env.final.local` public probe, public Space sync, and public API smoke all pass while final submission remains fail-closed. Current runtime sha is tracked in `docs/assets/public-space-sync-report.json`. |
59
  | T100 | Post-credential live proof plan now renders portable `python scripts/...` commands without local absolute paths, while keeping execution argv semantics and public sync validation. |
 
 
57
  | T098 | No-secret public Space upload helper added with dry-run safety checks, explicit execute mode, raw `.env.final.local` public 404 probe, tests, docs, CI, and bundle coverage. |
58
  | T099 | Public HF Space synced through the no-secret upload helper; raw `.env.final.local` public probe, public Space sync, and public API smoke all pass while final submission remains fail-closed. Current runtime sha is tracked in `docs/assets/public-space-sync-report.json`. |
59
  | T100 | Post-credential live proof plan now renders portable `python scripts/...` commands without local absolute paths, while keeping execution argv semantics and public sync validation. |
60
+ | T101 | Final operator actions now include public Space upload, waited public sync, and public API smoke after live proof and after final receipt; `public_space_sync.py` supports rollout wait attempts. |
docs/verification.md CHANGED
@@ -113,6 +113,14 @@ python scripts/post_credential_live_proof.py --env-file .env.final.local --execu
113
 
114
  The runner first runs the B2-only proof with mock generation, validates `docs/assets/b2-live-proof-evidence.json`, and only then marks T020 when `--update-tasks` is set. It then runs the final B2 plus Genblaze proof, validates `docs/assets/final-live-proof-evidence.json`, and only then marks T021. Both validators require the expected backend/provider fields, nonempty checksum/object-key fields, and no secret-like keys, bearer tokens, signed URL parameters, or GMI-style key values. Server logs stay under `var/live-proof/`, which is ignored by git.
115
 
 
 
 
 
 
 
 
 
116
  Before refreshing the public Hugging Face Space, run the upload helper in dry-run mode:
117
 
118
  ```bash
@@ -123,7 +131,7 @@ Only after the dry-run reports no included sensitive files, execute the upload a
123
 
124
  ```bash
125
  python scripts/public_space_upload.py --execute --commit-message "Sync ProofFrame public Space"
126
- python scripts/public_space_sync.py
127
  python scripts/api_smoke.py --base-url https://adjcjh-backblaze-proofframe.hf.space
128
  ```
129
 
 
113
 
114
  The runner first runs the B2-only proof with mock generation, validates `docs/assets/b2-live-proof-evidence.json`, and only then marks T020 when `--update-tasks` is set. It then runs the final B2 plus Genblaze proof, validates `docs/assets/final-live-proof-evidence.json`, and only then marks T021. Both validators require the expected backend/provider fields, nonempty checksum/object-key fields, and no secret-like keys, bearer tokens, signed URL parameters, or GMI-style key values. Server logs stay under `var/live-proof/`, which is ignored by git.
115
 
116
+ After the post-credential runner succeeds, sync the public Space before recording or sharing the final proof:
117
+
118
+ ```bash
119
+ python scripts/public_space_upload.py --execute --commit-message "Sync ProofFrame public Space after live proof"
120
+ python scripts/public_space_sync.py --wait-attempts 5 --wait-seconds 30
121
+ python scripts/api_smoke.py --base-url https://adjcjh-backblaze-proofframe.hf.space
122
+ ```
123
+
124
  Before refreshing the public Hugging Face Space, run the upload helper in dry-run mode:
125
 
126
  ```bash
 
131
 
132
  ```bash
133
  python scripts/public_space_upload.py --execute --commit-message "Sync ProofFrame public Space"
134
+ python scripts/public_space_sync.py --wait-attempts 5 --wait-seconds 30
135
  python scripts/api_smoke.py --base-url https://adjcjh-backblaze-proofframe.hf.space
136
  ```
137
 
scripts/final_operator_brief.py CHANGED
@@ -146,6 +146,9 @@ def build_user_actions(
146
  def build_codex_actions() -> list[str]:
147
  return [
148
  "python scripts/post_credential_live_proof.py --env-file .env.final.local --execute --update-tasks",
 
 
 
149
  "python scripts/demo_storyboard.py --strict-final",
150
  'python scripts/public_video_check.py --video-url "$PROOFFRAME_PUBLIC_VIDEO_URL" --verify-url --strict-final',
151
  "python scripts/demo_readiness.py --strict-final",
@@ -163,6 +166,9 @@ def build_codex_actions() -> list[str]:
163
  "python scripts/final_launch_plan.py --strict-final",
164
  "python scripts/devpost_submission_preview.py --strict-final",
165
  "python scripts/submission_bundle.py --strict-final",
 
 
 
166
  ]
167
 
168
 
 
146
  def build_codex_actions() -> list[str]:
147
  return [
148
  "python scripts/post_credential_live_proof.py --env-file .env.final.local --execute --update-tasks",
149
+ 'python scripts/public_space_upload.py --execute --commit-message "Sync ProofFrame public Space after live proof"',
150
+ "python scripts/public_space_sync.py --wait-attempts 5 --wait-seconds 30",
151
+ "python scripts/api_smoke.py --base-url https://adjcjh-backblaze-proofframe.hf.space",
152
  "python scripts/demo_storyboard.py --strict-final",
153
  'python scripts/public_video_check.py --video-url "$PROOFFRAME_PUBLIC_VIDEO_URL" --verify-url --strict-final',
154
  "python scripts/demo_readiness.py --strict-final",
 
166
  "python scripts/final_launch_plan.py --strict-final",
167
  "python scripts/devpost_submission_preview.py --strict-final",
168
  "python scripts/submission_bundle.py --strict-final",
169
+ 'python scripts/public_space_upload.py --execute --commit-message "Sync ProofFrame public Space after final receipt"',
170
+ "python scripts/public_space_sync.py --wait-attempts 5 --wait-seconds 30",
171
+ "python scripts/api_smoke.py --base-url https://adjcjh-backblaze-proofframe.hf.space",
172
  ]
173
 
174
 
scripts/public_space_sync.py CHANGED
@@ -6,6 +6,7 @@ from __future__ import annotations
6
  import argparse
7
  import json
8
  from http.client import IncompleteRead
 
9
  from datetime import datetime, timezone
10
  from pathlib import Path
11
  from typing import Any, Callable
@@ -1650,16 +1651,25 @@ def build_parser() -> argparse.ArgumentParser:
1650
  parser.add_argument("--space-id", default=SPACE_ID)
1651
  parser.add_argument("--public-host", default=SPACE_HOST)
1652
  parser.add_argument("--expected-sha", default=EXPECTED_SPACE_SHA)
 
 
1653
  return parser
1654
 
1655
 
1656
  def main() -> None:
1657
  args = build_parser().parse_args()
1658
- report = build_report(
1659
- space_id=args.space_id,
1660
- public_host=args.public_host,
1661
- expected_sha=args.expected_sha,
1662
- )
 
 
 
 
 
 
 
1663
  write_outputs(report, args.json_out, args.markdown_out)
1664
  print(
1665
  json.dumps(
 
6
  import argparse
7
  import json
8
  from http.client import IncompleteRead
9
+ import time
10
  from datetime import datetime, timezone
11
  from pathlib import Path
12
  from typing import Any, Callable
 
1651
  parser.add_argument("--space-id", default=SPACE_ID)
1652
  parser.add_argument("--public-host", default=SPACE_HOST)
1653
  parser.add_argument("--expected-sha", default=EXPECTED_SPACE_SHA)
1654
+ parser.add_argument("--wait-attempts", type=int, default=1)
1655
+ parser.add_argument("--wait-seconds", type=float, default=30.0)
1656
  return parser
1657
 
1658
 
1659
  def main() -> None:
1660
  args = build_parser().parse_args()
1661
+ attempts = max(1, args.wait_attempts)
1662
+ report: dict[str, Any] | None = None
1663
+ for attempt in range(attempts):
1664
+ report = build_report(
1665
+ space_id=args.space_id,
1666
+ public_host=args.public_host,
1667
+ expected_sha=args.expected_sha,
1668
+ )
1669
+ if report["ok"] or attempt == attempts - 1:
1670
+ break
1671
+ time.sleep(max(0.0, args.wait_seconds))
1672
+ assert report is not None
1673
  write_outputs(report, args.json_out, args.markdown_out)
1674
  print(
1675
  json.dumps(
tasks.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "project": "ProofFrame",
3
- "updated_at": "2026-06-30T10:21:27Z",
4
  "tasks": [
5
  {
6
  "id": "T001",
@@ -281,6 +281,15 @@
281
  "done_criteria": "The post-credential live proof plan stores public-safe, repo-relative command strings while preserving executable argv semantics and public sync validation.",
282
  "notes": "Post-credential plan now renders commands as python scripts/... without local absolute paths; tests cover command/argv output and no /Users path leakage."
283
  },
 
 
 
 
 
 
 
 
 
284
  {
285
  "id": "T030",
286
  "title": "Run browser smoke test",
 
1
  {
2
  "project": "ProofFrame",
3
+ "updated_at": "2026-06-30T10:34:17Z",
4
  "tasks": [
5
  {
6
  "id": "T001",
 
281
  "done_criteria": "The post-credential live proof plan stores public-safe, repo-relative command strings while preserving executable argv semantics and public sync validation.",
282
  "notes": "Post-credential plan now renders commands as python scripts/... without local absolute paths; tests cover command/argv output and no /Users path leakage."
283
  },
284
+ {
285
+ "id": "T101",
286
+ "title": "Add public sync waits to final handoff",
287
+ "phase": "P4 Submit",
288
+ "owner": "tester",
289
+ "status": "done",
290
+ "done_criteria": "Final operator actions include public Space upload, waited public sync, and public API smoke after live proof and after final receipt, and public_space_sync supports wait attempts for HF runtime rollout.",
291
+ "notes": "Added --wait-attempts/--wait-seconds to public_space_sync and wired public upload/sync/smoke into final operator actions."
292
+ },
293
  {
294
  "id": "T030",
295
  "title": "Run browser smoke test",
tests/test_final_operator_brief.py CHANGED
@@ -215,6 +215,11 @@ def test_final_operator_brief_is_ready_for_secret_entry(tmp_path):
215
  assert report["codex_actions_after_credentials"][0] == (
216
  "python scripts/post_credential_live_proof.py --env-file .env.final.local --execute --update-tasks"
217
  )
 
 
 
 
 
218
  assert not any(
219
  action.startswith("python scripts/run_b2_live_proof.py")
220
  or action.startswith("python scripts/run_final_live_proof.py")
@@ -238,6 +243,9 @@ def test_final_operator_brief_is_ready_for_secret_entry(tmp_path):
238
  "python scripts/final_launch_plan.py --strict-final",
239
  "python scripts/devpost_submission_preview.py --strict-final",
240
  "python scripts/submission_bundle.py --strict-final",
 
 
 
241
  ]
242
  assert report["reports"]["secret_scan"]["schema_ok"] is True
243
  assert report["reports"]["public_video_check"]["schema_ok"] is True
 
215
  assert report["codex_actions_after_credentials"][0] == (
216
  "python scripts/post_credential_live_proof.py --env-file .env.final.local --execute --update-tasks"
217
  )
218
+ assert report["codex_actions_after_credentials"][1:4] == [
219
+ 'python scripts/public_space_upload.py --execute --commit-message "Sync ProofFrame public Space after live proof"',
220
+ "python scripts/public_space_sync.py --wait-attempts 5 --wait-seconds 30",
221
+ "python scripts/api_smoke.py --base-url https://adjcjh-backblaze-proofframe.hf.space",
222
+ ]
223
  assert not any(
224
  action.startswith("python scripts/run_b2_live_proof.py")
225
  or action.startswith("python scripts/run_final_live_proof.py")
 
243
  "python scripts/final_launch_plan.py --strict-final",
244
  "python scripts/devpost_submission_preview.py --strict-final",
245
  "python scripts/submission_bundle.py --strict-final",
246
+ 'python scripts/public_space_upload.py --execute --commit-message "Sync ProofFrame public Space after final receipt"',
247
+ "python scripts/public_space_sync.py --wait-attempts 5 --wait-seconds 30",
248
+ "python scripts/api_smoke.py --base-url https://adjcjh-backblaze-proofframe.hf.space",
249
  ]
250
  assert report["reports"]["secret_scan"]["schema_ok"] is True
251
  assert report["reports"]["public_video_check"]["schema_ok"] is True
tests/test_public_space_sync.py CHANGED
@@ -938,6 +938,7 @@ def test_public_space_sync_report_passes_when_space_is_current():
938
  "section_count": 5,
939
  "blocker_count": 3,
940
  }
 
941
  assert report["observed"]["final_closeout_status"] == {
942
  "schema": "proofframe.final_closeout_status.v1",
943
  "mode": "waiting_for_credentials",
@@ -993,6 +994,15 @@ def test_public_space_sync_report_passes_when_space_is_current():
993
  assert all(item["ok"] for item in report["checks"])
994
 
995
 
 
 
 
 
 
 
 
 
 
996
  def test_public_space_sync_required_bundle_artifacts_include_genblaze_contract():
997
  assert {
998
  "genblaze_contract_json",
 
938
  "section_count": 5,
939
  "blocker_count": 3,
940
  }
941
+
942
  assert report["observed"]["final_closeout_status"] == {
943
  "schema": "proofframe.final_closeout_status.v1",
944
  "mode": "waiting_for_credentials",
 
994
  assert all(item["ok"] for item in report["checks"])
995
 
996
 
997
+ def test_public_space_sync_parser_accepts_wait_options():
998
+ parser = public_space_sync.build_parser()
999
+
1000
+ args = parser.parse_args(["--wait-attempts", "5", "--wait-seconds", "1.5"])
1001
+
1002
+ assert args.wait_attempts == 5
1003
+ assert args.wait_seconds == 1.5
1004
+
1005
+
1006
  def test_public_space_sync_required_bundle_artifacts_include_genblaze_contract():
1007
  assert {
1008
  "genblaze_contract_json",