{"artifact":"release-evidence-retention-verification-v1","release_id":"intellicore-20260514T085549221819Z","generated_at":"2026-05-14T08:55:49.376635Z","evidence_generated_at":"2026-05-14T08:55:49.221819Z","overall_status":"fresh_with_operator_placeholders","network_action_mode":"no_network_dry_run","deploy_action_mode":"no_deploy_action","publish_action_performed":false,"credentials":"redacted","retention_policy":{"retention_days":30,"max_artifact_age_minutes":120,"storage_scope":"operator-controlled evidence archive outside git","secret_policy":"do not store credentials, API keys, private BAS ranges, or customer secrets in release evidence"},"freshness":{"status":"fresh","stale":false,"age_minutes":0.003,"max_artifact_age_minutes":120,"checked_at":"2026-05-14T08:55:49.376635Z","evidence_generated_at":"2026-05-14T08:55:49.221819Z"},"trend_history_evidence":{"artifact":"release-trend-history-preflight-evidence-v1","status":"blocked_trend_history_release_preflight","source_artifact":"predictive-readiness-trend-history-evidence-v1","source_status":"not_requested_explicit_equipment_scope_required","generated_at":"2026-05-14T08:55:49.221819Z","scope":{"site_ref":"all","building_ref":"all","equipment_ref":"all","site_id":null,"building_id":null,"equipment_id":null},"sample_summary":{"evidence_count":0,"point_count":0,"total_samples":0,"minimum_sample_count":0,"maximum_sample_count":0,"stale_point_ids":[]},"point_rollups":[],"blockers":["explicit_equipment_scope_required","missing_scoped_trend_history_evidence","source_status:not_requested_explicit_equipment_scope_required"],"recommended_operator_next_action":"Fix scoped trend-history freshness/sample/scope blockers before release package handoff or predictive readiness claims.","advisory_only":true,"read_only":true,"write_execution_enabled":false,"autopilot_execution_enabled":false,"physical_execution_blocked":true,"bas_scan_action_mode":"no_bas_scan","bas_write_action_mode":"no_bas_write","network_action_mode":"no_network_dry_run","deploy_action_mode":"no_deploy_action","credentials":"redacted"},"alarm_event_evidence":{"artifact":"release-alarm-event-preflight-evidence-v1","status":"blocked_alarm_event_release_preflight","source_artifact":"alarm-event-readiness-evidence-v1","source_status":"not_requested_explicit_equipment_scope_required","generated_at":"2026-05-14T08:55:49.221819Z","scope":{"site_ref":"all","building_ref":"all","equipment_ref":"all","site_id":null,"building_id":null,"equipment_id":null},"summary":{"event_count":0,"active_event_count":0,"critical_or_high_event_count":0,"acknowledged_count":0},"freshness":{"status":"missing","max_age_minutes":240,"latest_event_age_minutes":null,"latest_event_timestamp":null},"events":[],"blockers":["explicit_equipment_scope_required","missing_scoped_alarm_event_evidence","source_status:not_requested_explicit_equipment_scope_required"],"recommended_operator_next_action":"Fix scoped alarm/event freshness/scope/read-only blockers before release package handoff claims.","advisory_only":true,"read_only":true,"write_execution_enabled":false,"alarm_acknowledgement_enabled":false,"autopilot_execution_enabled":false,"physical_execution_blocked":true,"alarm_action_mode":"no_alarm_acknowledgement","bas_scan_action_mode":"no_bas_scan","bas_write_action_mode":"no_bas_write","network_action_mode":"no_network_dry_run","deploy_action_mode":"no_deploy_action","credentials":"redacted"},"weather_forecast_evidence":{"artifact":"release-weather-forecast-preflight-evidence-v1","status":"blocked_weather_forecast_release_preflight","source_artifact":"weather-forecast-readiness-evidence-v1","source_status":"blocked_weather_forecast_not_ready","generated_at":"2026-05-14T08:55:49.221819Z","scope":{"site_ref":"all","building_ref":"all","site_id":null,"building_id":null},"summary":{"forecast_count":0,"severe_weather_flag_count":0,"source_refs":[]},"freshness":{"status":"missing","max_age_minutes":120,"latest_forecast_age_minutes":null,"latest_forecast_timestamp":null},"forecasts":[],"blockers":["missing_scoped_weather_forecast","explicit_site_scope_required","weather_forecast_freshness:missing","source_status:blocked_weather_forecast_not_ready"],"recommended_operator_next_action":"Import a current scoped weather forecast export or fixture before release package handoff or predictive readiness claims.","advisory_only":true,"read_only":true,"write_execution_enabled":false,"autopilot_execution_enabled":false,"physical_execution_blocked":true,"weather_provider_action_mode":"no_weather_provider_call","bas_scan_action_mode":"no_bas_scan","bas_write_action_mode":"no_bas_write","network_action_mode":"no_network_dry_run","deploy_action_mode":"no_deploy_action","credentials":"redacted"},"controlled_write_readiness_evidence":{"source_key":"controlled_write_readiness","label":"Controlled-write readiness","status":"missing","source_artifact":"predictive-controlled-write-readiness-audit-packet-v1","freshness_status":"unknown","evidence_count":0,"confidence":null,"packet_uid":null,"source_refs":{},"recommended_operator_next_action":"Generate scoped controlled-write readiness packet before release handoff.","blocker_count":1,"blockers":["missing_controlled_write_readiness_packet"],"ok_for_operator_review":false,"advisory_only":true,"write_execution_enabled":false,"autopilot_execution_enabled":false,"physical_execution_blocked":true},"archive_index_reference":{"artifact":"operator-release-handoff-archive-index-v1","archive_id":"archive-intellicore-20260514T085549221819Z","archive_name":"intellicore-operator-release-handoff-intellicore-20260514T085549221819Z","route":"/api/operator/release-handoff/archive-index.json","generated_at":"2026-05-14T08:55:49.221819Z","retention_notes":["Persist this archive index beside the downloaded operator release handoff package and integrity manifest.","Keep site credentials, BAS network ranges, and API keys out of archive storage unless encrypted by the operator outside git.","Regenerate the archive index after any readiness, package, or blocker evidence changes."],"verification_instructions":["Download /api/operator/release-handoff/package.json from the reviewed deployment.","Run the checksum verification command from checksum_manifest_reference.verification_command.","Confirm advisory_only=true, write_execution_enabled=false, autopilot_execution_enabled=false, and physical_execution_blocked=true before handoff."]},"checksum_manifest_reference":{"artifact":"operator-release-handoff-integrity-manifest-v1","algorithm":"SHA-256","route":"/api/operator/release-handoff/integrity.json","verification_command":"python - <<'PY'\nimport hashlib,json,pathlib\npkg=json.loads(pathlib.Path('operator-release-handoff-package.json').read_text())\nmanifest=pkg['integrity_manifest']\nbundle=json.dumps(pkg['bundle'],sort_keys=True,separators=(',',':'),ensure_ascii=False).encode()\nmarkdown=pkg['markdown_report'].encode()\nhtml=pkg['html_report'].encode()\ncore={k:v for k,v in pkg.items() if k not in ('integrity_manifest','archive_index','controlled_write_readiness_release_summary')}\ncore_bytes=json.dumps(core,sort_keys=True,separators=(',',':'),ensure_ascii=False).encode()\nfor name,data in [('operator_release_handoff_bundle_json',bundle),('operator_release_handoff_markdown_report',markdown),('operator_release_handoff_html_report',html),('operator_release_handoff_package_core',core_bytes)]:\n    expected=next(a['checksum_sha256'] for a in manifest['artifacts'] if a['name']==name)\n    assert hashlib.sha256(data).hexdigest()==expected, name\nprint('operator release handoff integrity verified')\nPY","artifact_checksums":{"operator_release_handoff_bundle_json":{"checksum_algorithm":"SHA-256","checksum_sha256":"2b26ababc06dffa6ac5aecf783bab05d64909f3d7d497609af48b7e911b3fd25","artifact_route":"/api/operator/release-handoff","media_type":"application/json"},"operator_release_handoff_markdown_report":{"checksum_algorithm":"SHA-256","checksum_sha256":"7c71acda734ac86e2b2e93b329e09148b58ff93239f63f0f43a6c025ffc012c4","artifact_route":"/api/operator/release-handoff/report.md","media_type":"text/markdown"},"operator_release_handoff_html_report":{"checksum_algorithm":"SHA-256","checksum_sha256":"0fd55237082f33bfc8fc08700a2b2cef00a0ebab8d44e85ffce314a76983525a","artifact_route":"/api/operator/release-handoff/report.html","media_type":"text/html"},"operator_release_handoff_package_core":{"checksum_algorithm":"SHA-256","checksum_sha256":"920fe53fd558f6adc1457131d73d1a1c58f87f94ab54832042d5a598c6759ba9","artifact_route":"/api/operator/release-handoff/package.json","media_type":"application/json"},"visual_composer_blocker_rollup_json":{"checksum_algorithm":"SHA-256","checksum_sha256":"f859c9a70a3155568f5dc3f6d85c03b48aaa1585adced56b2fbeefaa4ee75869","artifact_route":"/api/operator/release-handoff/visual-composer-blocker-rollup.json","media_type":"application/json"},"visual_composer_blocker_rollup_csv":{"checksum_algorithm":"SHA-256","checksum_sha256":"e1551cad7ba8380b11a2ce6aac1e9781b9b5bd30efd54aa7275db67fca93b730","artifact_route":"/api/operator/release-handoff/visual-composer-blocker-rollup/export.csv","media_type":"text/csv"},"visual_composer_blocker_rollup_markdown":{"checksum_algorithm":"SHA-256","checksum_sha256":"880f622d69c68757d234693881cbc233135aa92ef7cd1f7e112356bb8e50bc5d","artifact_route":"/api/operator/release-handoff/visual-composer-blocker-rollup/report.md","media_type":"text/markdown"},"visual_runtime_gateway_operator_preflight_json":{"checksum_algorithm":"SHA-256","checksum_sha256":"cfb6c9d5a3cc042d72ec2f3170c3f375108574621f99e2c76ee6ef9c1de305b0","artifact_route":"/api/operator/release-handoff/visual-runtime-gateway-verification-preflight.json","media_type":"application/json"},"visual_runtime_gateway_operator_preflight_csv":{"checksum_algorithm":"SHA-256","checksum_sha256":"8a3f8274c77c20fcf08c301973344b665a86d59d6586a3f1a2e5d3921d9a8e05","artifact_route":"/api/operator/release-handoff/visual-runtime-gateway-verification-preflight/export.csv","media_type":"text/csv"},"visual_runtime_gateway_operator_preflight_html":{"checksum_algorithm":"SHA-256","checksum_sha256":"7d8884e522b32e15c1e055724c0b9b9376ba974f20b27229b0df022a1e52f800","artifact_route":"/operator-release-handoff/visual-runtime-gateway-verification-preflight","media_type":"text/html"}}},"evidence_artifacts":{"bundle":{"ok":true,"artifact":"operator-release-handoff-v1","route":"/api/operator/release-handoff"},"package":{"ok":true,"artifact":"operator-release-handoff-package-v1","route":"/api/operator/release-handoff/package.json"},"integrity_manifest":{"ok":true,"artifact":"operator-release-handoff-integrity-manifest-v1","route":"/api/operator/release-handoff/integrity.json","algorithm":"SHA-256"},"archive_index":{"ok":true,"artifact":"operator-release-handoff-archive-index-v1","route":"/api/operator/release-handoff/archive-index.json"}},"artifact_references":{"json_api":"/api/operator/release-handoff","package_download_api":"/api/operator/release-handoff/package.json","integrity_manifest_api":"/api/operator/release-handoff/integrity.json","archive_index_api":"/api/operator/release-handoff/archive-index.json","retention_report_api":"/api/operator/release-handoff/evidence-retention.json","local_url_smoke_api":"/api/operator/release-handoff/local-url-smoke.json","publish_smoke_api":"/api/operator/release-handoff/publish-smoke.json","cli":"scripts/intellicore_operator_handoff_bundle.py --retention-report"},"blockers":["semantic_role:zone_temperature","semantic_role:zone_setpoint","trend_samples","occupancy_signals","weather_observations","occupancy_evidence:explicit_equipment_scope_required","weather_forecast:missing_scoped_weather_forecast","explicit_equipment_scope_required","visual composer explicit equipment scope required","missing Visual Composer AI planner decision audit evidence","DigitalOcean Docker Droplet/VPS target must be explicit","Attached DigitalOcean volume path must be configured before restore drill evidence can be trusted","Database restore drill last-run timestamp must be recorded","Restore drill evidence is stale or timestamp is invalid","Restore drill release package id is missing, invalid, or cross-scope","Restore drill build id must be configured","Restore drill operator approval reference must be archived before production cutover","Restore drill operator approval actor must be recorded","Restore drill operator approval timestamp must be valid and no older than the restore drill","Database restore drill evidence path must be stored on the attached volume","Artifact restore drill evidence path must be stored on the attached volume","Rollback runbook path must be stored on the attached volume","Database backup export evidence path must be stored on the attached volume for restore drill readiness","Artifact backup export evidence path must be stored on the attached volume for restore drill readiness","Database backup retention days must be a positive integer for restore drill readiness","Artifact backup retention days must be a positive integer for restore drill readiness","Restore drill target must be isolated staging/sandbox, not production","Restore drill RTO minutes must be a positive integer","Restore drill RPO minutes must be a positive integer","operator must set target BACnet/IP range before live discovery","operator must set target Modbus host before live enumeration","operator must provide deployed remote base URL before external readiness smoke","manual gate pending: operator_approval_recorded","manual gate pending: backup_restore_path_verified","manual gate pending: rollback_plan_reviewed","manual gate pending: evidence_archive_persisted","manual gate pending: write_and_autopilot_disabled_confirmed","storage/backup preflight not ready: blocked_missing_or_unsafe_storage_posture","controlled-write readiness packet is missing or not ready for release evidence retention"],"blocker_summary":{"total":39,"operator_handoff":38,"evidence_stale":0,"evidence_missing":0,"trend_history":3,"alarm_event":3,"controlled_write_readiness":1},"verification_commands":["python scripts/intellicore_operator_handoff_bundle.py --retention-report","python scripts/intellicore_operator_handoff_bundle.py --archive-index","python scripts/intellicore_deployment_publish_smoke.py --json --target-url https://replace-with-deployment-url","curl -fsS http://127.0.0.1:8000/api/operator/release-handoff/evidence-retention.json",".venv/bin/python -m pytest tests/test_operator_release_handoff.py -q"],"verification_instructions":["Regenerate this report immediately before operator handoff or publish smoke review.","Persist package.json, integrity.json, archive-index.json, and evidence-retention.json together outside git.","Verify SHA-256 checksums from checksum_manifest_reference before publishing or handing off evidence.","Treat stale or missing evidence as a release blocker until the package and archive index are regenerated.","Keep advisory_only=true, write_execution_enabled=false, autopilot_execution_enabled=false, and physical_execution_blocked=true."],"recommended_next_action":"Persist package.json, integrity.json, archive-index.json, and evidence-retention.json together; verify checksums; resolve listed non-code blockers before publish handoff.","safe_posture":{"advisory_only":true,"write_execution_enabled":false,"autopilot_execution_enabled":false,"physical_execution_blocked":true},"advisory_only":true,"write_execution_enabled":false,"autopilot_execution_enabled":false,"physical_execution_blocked":true}