#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
STEP_ID='STEP_050M07R19_R18_FAILURE_ANALYSIS_AND_WORKFLOW_HARDENING_R01'; RESULT='STOP_R19_NOT_STARTED'; STOP_REASON='none'; CURRENT_PHASE='initializing'; COPY_VERIFY='FAIL'; HTTP_VERIFY_PASS=false; PUBLICATION_BARRIER=none; PUBLIC_OBJECT_KIND=step-report; PREVIOUS_MOVED_COUNT=0; RUNTIME_IMPACT=false; VM101_RUNTIME_CHANGED=false; VM130_WORKFLOW_CHANGED=false; CORE_CHANGE_COMPLETE=false; BACKUP_READY=false; BACKUP_DIR=''; TARGET_ROLLBACK_FILE=''; VM130_SOURCE_URL='https://reports.secret-studio.ru/latest/20260718-053858_vm130_router_ops_source_snapshot_r17_workflow_hardening_after_r16_r01/'; PROJECT_SOURCE_POST_URL=''; PROJECT_SOURCE_POST_FILE_URL=''; STEP_REPORT_URL=''; FACTS_URL=''; VERIFY_URL=''; ROLLBACK_URL=''
BUNDLE_DIR="$(cd "$(dirname "$0")" && pwd -P)"; SELF="$(readlink -f "$0")"; BUNDLE_ZIP="${BUNDLE_ZIP:?}"; EXPECTED_BUNDLE_SHA256="${EXPECTED_BUNDLE_SHA256:?}"; EXPECTED_INSTALLER_SHA256="${EXPECTED_INSTALLER_SHA256:?}"; BASE="${ROUTER_OPS_BASE:-/opt/router-ops}"; PUBLISHER="$BASE/bin/router-publish-report"; HTTP="$BASE/bin/router-http-verify"; FINALIZER="$BASE/bin/router-step-finalize"; SAFE_BUILDER="$BASE/bin/router-public-safe-payload"; HTML_BUILDER="$BASE/bin/router-public-html-aliases"; WORKFLOW_LIB="$BASE/lib/router-step-workflow.sh"; CONTRACT_LIB="$BASE/lib/router-publication-contract.sh"; TS="$(date -u +%Y%m%d-%H%M%S)"; STEP_DIR="$BASE/steps/${TS}_${STEP_ID}"; mkdir -p "$STEP_DIR"; chmod 700 "$STEP_DIR"; STOP_GUARD_DIR="$STEP_DIR/.stop-handler-active"; STEP_FILE="$STEP_DIR/step-code.sh"; BUNDLE_COPY="$STEP_DIR/$(basename "$BUNDLE_ZIP")"; cp -a "$SELF" "$STEP_FILE"; chmod 700 "$STEP_FILE"; cp -a "$BUNDLE_ZIP" "$BUNDLE_COPY"
REPORT="$STEP_DIR/report.txt"; FACTS="$STEP_DIR/facts.json"; VERIFY="$STEP_DIR/verify.txt"; ROLLBACK="$STEP_DIR/rollback.sh"; MAIN_LOG="$STEP_DIR/main.log"; PROGRESS="$STEP_DIR/progress.log"; TRANSFER="$STEP_DIR/transfer-verify.txt"; PHASE_CURRENT="$STEP_DIR/phase-current.env"; PHASE_EVENTS="$STEP_DIR/phase-events.log"; COMPONENTS="$STEP_DIR/components"; mkdir -p "$COMPONENTS"
exec 3>&1; exec >>"$MAIN_LOG" 2>&1
progress(){ printf '>>> [%s] %s\n' "$(date '+%F %T')" "$*" | tee -a "$PROGRESS" >&3; }
source "$BUNDLE_DIR/plans/current-links.env"; source "$WORKFLOW_LIB"; source "$CONTRACT_LIB"
router_step_workflow_init "$PHASE_CURRENT" "$PHASE_EVENTS" transfer_verification target_preflight target_core target_postcheck vm130_source_publication plan_publication project_source_publication external_http_verification step_report_publication
field(){ local file="$1" key="$2"; awk -F= -v k="$key" '$1==k{v=substr($0,index($0,"=")+1)} END{print v}' "$file"; }; phase_begin(){ CURRENT_PHASE="$1"; router_step_phase_begin "$1" "${2:-none}"; progress "$1"; }; phase_done(){ router_step_phase_complete "$1" "${2:-complete}"; }; vm101_run_script(){ local script="$1"; ssh -o BatchMode=yes pve-mgts "ssh -o BatchMode=yes -i /root/.ssh/pve_to_openwrt_mgts_ed25519 root@10.71.100.2 'sh -s'" <"$script"; }
write_rollback(){ cat >"$ROLLBACK" <<EOF
#!/usr/bin/env bash
set -Eeuo pipefail
[[ "\${CONFIRM_R19_ROLLBACK:-}" == YES ]] || { echo RESULT=STOP_R19_ROLLBACK_CONFIRMATION_REQUIRED; exit 2; }
ROLLBACK_FILE='$TARGET_ROLLBACK_FILE'; [[ -x "\$ROLLBACK_FILE" ]] || { echo RESULT=STOP_R19_ROLLBACK_FILE_MISSING; exit 2; }; "\$ROLLBACK_FILE"; echo RESULT=PASS_R19_VM130_WORKFLOW_ROLLED_BACK
EOF
chmod 700 "$ROLLBACK"; }
write_docs(){ local step_sha; step_sha="$(sha256sum "$STEP_FILE"|awk '{print $1}')"; write_rollback; cat >"$REPORT" <<EOF
RESULT=$RESULT
STEP_ID=$STEP_ID
STOP_REASON=$STOP_REASON
CURRENT_PHASE=$CURRENT_PHASE
VM101_RUNTIME_CHANGED=$VM101_RUNTIME_CHANGED
VM130_WORKFLOW_CHANGED=$VM130_WORKFLOW_CHANGED
CORE_CHANGE_COMPLETE=$CORE_CHANGE_COMPLETE
BACKUP_READY=$BACKUP_READY
BACKUP_DIR=${BACKUP_DIR:-none}
TARGET_ROLLBACK_FILE=${TARGET_ROLLBACK_FILE:-none}
COPY_VERIFY=$COPY_VERIFY
STEP_SHA256=$step_sha
HTTP_VERIFY_PASS=$HTTP_VERIFY_PASS
PUBLICATION_BARRIER=$PUBLICATION_BARRIER
RUNTIME_IMPACT=$RUNTIME_IMPACT
STEP_REPORT_URL=${STEP_REPORT_URL:-PENDING_NOT_PUBLISHED}
PROJECT_SOURCE_POST_URL=${PROJECT_SOURCE_POST_URL:-PENDING_NOT_PUBLISHED}
PROJECT_SOURCE_POST_FILE_URL=${PROJECT_SOURCE_POST_FILE_URL:-PENDING_NOT_PUBLISHED}
LOCAL_M07_PLAN_URL=$LOCAL_M07_PLAN_URL
GLOBAL_PROJECT_PLAN_URL=$GLOBAL_PROJECT_PLAN_URL
ACCESS_MAP_URL=$ACCESS_MAP_URL
VM100_PUBLIC_URL=$VM100_PUBLIC_URL
VM101_PUBLIC_URL=$VM101_PUBLIC_URL
VM121_PUBLIC_URL=$VM121_PUBLIC_URL
VM101_MODEL_URL=$VM101_MODEL_URL
VM101_METHODS_URL=$VM101_METHODS_URL
VM130_SOURCE_URL=$VM130_SOURCE_URL
LATEST_ROOT_URL=$LATEST_ROOT_URL
OLD_ROOT_URL=$OLD_ROOT_URL
FACTS_URL=${FACTS_URL:-PENDING_NOT_PUBLISHED}
VERIFY_URL=${VERIFY_URL:-PENDING_NOT_PUBLISHED}
ROLLBACK_URL=${ROLLBACK_URL:-PENDING_NOT_PUBLISHED}
PUBLIC_OBJECT_KIND=$PUBLIC_OBJECT_KIND
PREVIOUS_MOVED_COUNT=$PREVIOUS_MOVED_COUNT
EOF
cat >"$VERIFY" <<EOF
RESULT=$RESULT
R18_FAILURES_CLASSIFIED=true
R19_SHARED_POLICY_ACTIVE=$VM130_WORKFLOW_CHANGED
R17_LEGACY_GATE_PRESERVED=$VM130_WORKFLOW_CHANGED
INTERACTIVE_BOOTSTRAP_INSTALLED=$VM130_WORKFLOW_CHANGED
MACHINE_CLOSE_SAFE_INSTALLED=$VM130_WORKFLOW_CHANGED
RUNTIME_TRANSITION_GUARD_INSTALLED=$VM130_WORKFLOW_CHANGED
VM101_R18_CHECKPOINT_PASS=true
VM101_RUNTIME_CHANGED=false
ACTIVE_GENERATION_ID=r18r08-20260719-060942-3890
VM101_COMMIT=e8850197c367cf3493b664419f063138058a65ba
PROJECT_SOURCE_REPLACEMENT_FILES=6
PROJECT_SOURCE_REPLACEMENT_MAP_INCLUDED=true
PUBLICATION_BARRIER=$PUBLICATION_BARRIER
RUNTIME_IMPACT=false
EOF
python3 - "$FACTS" <<PYFACT
import json,sys
obj={"schema":"router-step-facts-v1","step_id":"$STEP_ID","result":"$RESULT","stop_reason":"$STOP_REASON","current_phase":"$CURRENT_PHASE","vm101_runtime_changed":False,"vm130_workflow_changed":"$VM130_WORKFLOW_CHANGED"=="true","core_change_complete":"$CORE_CHANGE_COMPLETE"=="true","backup_ready":"$BACKUP_READY"=="true","backup_dir":"$BACKUP_DIR","target_rollback_file":"$TARGET_ROLLBACK_FILE","copy_verify":"$COPY_VERIFY","http_verify_pass":"$HTTP_VERIFY_PASS"=="true","publication_barrier":"$PUBLICATION_BARRIER","runtime_impact":False,"active_generation_id":"r18r08-20260719-060942-3890","vm101_commit":"e8850197c367cf3493b664419f063138058a65ba","vm130_source_url":"$VM130_SOURCE_URL","plan_url":"$LOCAL_M07_PLAN_URL","project_source_post_url":"$PROJECT_SOURCE_POST_URL","step_report_url":"$STEP_REPORT_URL"}; json.dump(obj,open(sys.argv[1],'w'),indent=2,sort_keys=True); open(sys.argv[1],'a').write('\n')
PYFACT
}
emit_final(){ for x in "RESULT=$RESULT" "STEP_REPORT_URL=${STEP_REPORT_URL:-PENDING_NOT_PUBLISHED}" "PROJECT_SOURCE_POST_URL=${PROJECT_SOURCE_POST_URL:-PENDING_NOT_PUBLISHED}" "PROJECT_SOURCE_POST_FILE_URL=${PROJECT_SOURCE_POST_FILE_URL:-PENDING_NOT_PUBLISHED}" "LOCAL_M07_PLAN_URL=$LOCAL_M07_PLAN_URL" "GLOBAL_PROJECT_PLAN_URL=$GLOBAL_PROJECT_PLAN_URL" "ACCESS_MAP_URL=$ACCESS_MAP_URL" "VM100_PUBLIC_URL=$VM100_PUBLIC_URL" "VM101_PUBLIC_URL=$VM101_PUBLIC_URL" "VM121_PUBLIC_URL=$VM121_PUBLIC_URL" "VM101_MODEL_URL=$VM101_MODEL_URL" "VM101_METHODS_URL=$VM101_METHODS_URL" "VM130_SOURCE_URL=$VM130_SOURCE_URL" "LATEST_ROOT_URL=$LATEST_ROOT_URL" "OLD_ROOT_URL=$OLD_ROOT_URL" "FACTS_URL=${FACTS_URL:-PENDING_NOT_PUBLISHED}" "VERIFY_URL=${VERIFY_URL:-PENDING_NOT_PUBLISHED}" "ROLLBACK_URL=${ROLLBACK_URL:-PENDING_NOT_PUBLISHED}" "PUBLIC_OBJECT_KIND=$PUBLIC_OBJECT_KIND" "PREVIOUS_MOVED_COUNT=$PREVIOUS_MOVED_COUNT" "COPY_VERIFY=$COPY_VERIFY" "STEP_SHA256=$(sha256sum "$STEP_FILE"|awk '{print $1}')" "HTTP_VERIFY_PASS=$HTTP_VERIFY_PASS" "RUNTIME_IMPACT=$RUNTIME_IMPACT"; do printf '%s\n' "$x" >&3; done; }
publish_object(){ local label="$1" expect="$2" outvar="$3"; shift 3; local log="$STEP_DIR/publish-${expect}.log"; "$PUBLISHER" "$label" "$@" >"$log"; router_publication_contract_load "$log" "$expect" || return 1; "$HTTP" --url "$RPC_PUBLIC_URL" --output "$STEP_DIR/http-${expect}-index.html" >"$STEP_DIR/http-${expect}.log" 2>&1; printf -v "$outvar" '%s' "$RPC_PUBLIC_URL"; }
publish_stop_report(){ set +e; write_docs; local html="$STEP_DIR/stop-html" safe="$STEP_DIR/stop-safe" label='step050m07r19_r18_failure_analysis_and_workflow_hardening_r01_stop'; python3 "$HTML_BUILDER" --facts "$FACTS" --verify "$VERIFY" --rollback "$ROLLBACK" --output-dir "$html" --title-prefix R19 >/dev/null 2>&1; "$SAFE_BUILDER" "$safe" "$STEP_FILE" step-code.sh "$REPORT" report.txt "$FACTS" facts.json "$VERIFY" verify.txt "$ROLLBACK" rollback.sh "$MAIN_LOG" main.log "$PROGRESS" progress.log "$TRANSFER" transfer-verify.txt "$PHASE_CURRENT" phase-current.txt "$PHASE_EVENTS" phase-events.log "$html/facts-public.html" facts-public.html "$html/verify-public.html" verify-public.html "$html/rollback-public.html" rollback-public.html >/dev/null 2>&1; "$FINALIZER" --label "$label" --payload-dir "$safe" --workflow-current "$PHASE_CURRENT" --workflow-events "$PHASE_EVENTS" --output-env "$STEP_DIR/stop-finalize.env" --expect-kind step-report >"$STEP_DIR/stop-finalize.log" 2>&1; if [[ -s "$STEP_DIR/stop-finalize.env" ]]; then STEP_REPORT_URL="$(field "$STEP_DIR/stop-finalize.env" PUBLIC_URL)"; FACTS_URL="${STEP_REPORT_URL}facts-public.html"; VERIFY_URL="${STEP_REPORT_URL}verify-public.html"; ROLLBACK_URL="${STEP_REPORT_URL}rollback-public.html"; PUBLICATION_BARRIER=verified; HTTP_VERIFY_PASS=true; fi; set -e; }
stop(){ local result="$1" reason="$2" rc="${3:-1}"; trap - ERR; PUBLICATION_BARRIER=none; if ! mkdir "$STOP_GUARD_DIR" 2>/dev/null; then exit "$rc"; fi; RESULT="$result"; STOP_REASON="$reason"; router_step_phase_fail "$CURRENT_PHASE" "$reason" >/dev/null 2>&1 || true; if [[ "$BACKUP_READY" == true && "$CORE_CHANGE_COMPLETE" != true && -x "$TARGET_ROLLBACK_FILE" ]]; then "$TARGET_ROLLBACK_FILE" >"$COMPONENTS/automatic-rollback.log" 2>&1 || true; fi; if ! router_step_publication_is_verified; then publish_stop_report || true; fi; emit_final; exit "$rc"; }
trap 'stop STOP_R19_UNEXPECTED_ERROR "phase=$CURRENT_PHASE line=$LINENO rc=$?" 1' ERR
phase_begin transfer_verification
actual_zip="$(sha256sum "$BUNDLE_COPY"|awk '{print $1}')"; actual_inst="$(sha256sum "$STEP_FILE"|awk '{print $1}')"; [[ "$actual_zip" == "$EXPECTED_BUNDLE_SHA256" && "$actual_inst" == "$EXPECTED_INSTALLER_SHA256" ]] || stop STOP_COPY_OR_TRANSFER_ERROR sha_mismatch 20; (cd "$BUNDLE_DIR" && sha256sum -c manifest.sha256) >"$STEP_DIR/manifest.log"; BUNDLE_ROOT="$BUNDLE_DIR" "$BASE/bin/router-bundle-gate" "$BUNDLE_DIR" >"$STEP_DIR/bundle-gate-r17.log"; grep -qx RESULT=PASS_ROUTER_BUNDLE_GATE "$STEP_DIR/bundle-gate-r17.log" || stop STOP_COPY_OR_TRANSFER_ERROR bundle_gate 20; COPY_VERIFY=PASS; printf 'COPY_VERIFY=PASS\nEXPECTED_BUNDLE_SHA256=%s\nACTUAL_BUNDLE_SHA256=%s\nEXPECTED_INSTALLER_SHA256=%s\nACTUAL_INSTALLER_SHA256=%s\nMANIFEST_VERIFY=PASS\nSYNTAX_VERIFY=PASS\nFIXTURE_VERIFY=PASS\n' "$EXPECTED_BUNDLE_SHA256" "$actual_zip" "$EXPECTED_INSTALLER_SHA256" "$actual_inst" >"$TRANSFER"; phase_done transfer_verification
phase_begin target_preflight
[[ "$(hostname)" == router-ops ]] || stop STOP_R19_WRONG_HOST "$(hostname)" 21; while read -r s p; do [[ -f "$p" && "$(sha256sum "$p"|awk '{print $1}')" == "$s" ]] || stop STOP_R19_VM130_BASELINE_SHA "$p" 21; done <"$BUNDLE_DIR/reference/expected-r17-vm130.sha256"; "$BASE/bin/router-workflow-r17-selftest" "$STEP_DIR/r17-selftest" >"$COMPONENTS/r17-selftest.log"; grep -qx RESULT=PASS_ROUTER_WORKFLOW_R17_SELFTEST "$COMPONENTS/r17-selftest.log" || stop STOP_R19_R17_SELFTEST marker 21; vm101_run_script "$BUNDLE_DIR/scripts/vm101-r18-checkpoint.sh" >"$COMPONENTS/vm101-r18-checkpoint.log"; grep -qx RESULT=PASS_R19_VM101_R18_CHECKPOINT "$COMPONENTS/vm101-r18-checkpoint.log" || stop STOP_R19_VM101_CHECKPOINT marker 21; mkdir -p "$STEP_DIR/preflight"; declare -a PREFS=('vm130_router_ops_source_snapshot_r19_workflow_hardening_after_r18_r01:vm130-source:README.md' 'local_architecture_plan_vm101_autonomous_hmn_recovery_r19:local-m07-plan:project-sources/WG_PAID_MGTS_LOCAL_ARCHITECTURE_PLAN_VM101_AUTONOMOUS_HMN_RECOVERY_R19.md' 'project_source_post_vm130_r18_failure_analysis_workflow_hardening_r19:project-source-post:project-sources/WG_PAID_MGTS_R18_FAILURE_ANALYSIS_AND_WORKFLOW_HARDENING_R19.md' 'step050m07r19_r18_failure_analysis_and_workflow_hardening_r01:step-report:README.md'); for spec in "${PREFS[@]}"; do IFS=: read -r label kind rel <<<"$spec"; "$PUBLISHER" --classify "$label" >"$STEP_DIR/preflight/${kind}.classify"; grep -Fqx "PUBLIC_OBJECT_KIND=$kind" "$STEP_DIR/preflight/${kind}.classify" || stop STOP_R19_PUBLICATION_CLASSIFY "$label" 22; "$PUBLISHER" --preflight "$label" "$BUNDLE_DIR/$rel" >"$STEP_DIR/preflight/${kind}.preflight"; grep -qx RESULT=PASS_ROUTER_PUBLISH_PREFLIGHT "$STEP_DIR/preflight/${kind}.preflight" || stop STOP_R19_PUBLICATION_PREFLIGHT "$label" 22; done; phase_done target_preflight
phase_begin target_core
"$BUNDLE_DIR/scripts/vm130-apply.sh" "$BUNDLE_DIR" >"$COMPONENTS/vm130-apply.log"; grep -qx RESULT=PASS_R19_VM130_WORKFLOW_INSTALLED "$COMPONENTS/vm130-apply.log" || stop STOP_R19_VM130_APPLY marker 23; BACKUP_DIR="$(field "$COMPONENTS/vm130-apply.log" BACKUP_DIR)"; TARGET_ROLLBACK_FILE="$(field "$COMPONENTS/vm130-apply.log" ROLLBACK_FILE)"; BACKUP_READY="$(field "$COMPONENTS/vm130-apply.log" BACKUP_READY)"; [[ "$BACKUP_READY" == true && -d "$BACKUP_DIR" && -x "$TARGET_ROLLBACK_FILE" ]] || stop STOP_R19_BACKUP_EVIDENCE missing 23; VM130_WORKFLOW_CHANGED=true; phase_done target_core
phase_begin target_postcheck
"$BUNDLE_DIR/scripts/vm130-postcheck.sh" "$BUNDLE_DIR" "$STEP_DIR/r19-postcheck" >"$COMPONENTS/vm130-postcheck.log"; grep -qx RESULT=PASS_R19_VM130_WORKFLOW_POSTCHECK "$COMPONENTS/vm130-postcheck.log" || stop STOP_R19_POSTCHECK marker 24; vm101_run_script "$BUNDLE_DIR/scripts/vm101-r18-checkpoint.sh" >"$COMPONENTS/vm101-r18-checkpoint-after.log"; grep -qx RESULT=PASS_R19_VM101_R18_CHECKPOINT "$COMPONENTS/vm101-r18-checkpoint-after.log" || stop STOP_R19_VM101_CHECKPOINT_AFTER marker 24; CORE_CHANGE_COMPLETE=true; phase_done target_postcheck
phase_begin vm130_source_publication
SOURCE="$STEP_DIR/vm130-source"; "$BUNDLE_DIR/scripts/vm130-export-source.sh" "$SOURCE" >"$COMPONENTS/vm130-export-source.log"; grep -qx RESULT=PASS_R19_VM130_SOURCE_EXPORTED "$COMPONENTS/vm130-export-source.log" || stop STOP_R19_SOURCE_EXPORT marker 25; publish_object vm130_router_ops_source_snapshot_r19_workflow_hardening_after_r18_r01 vm130-source VM130_SOURCE_URL "$SOURCE/report.txt" "$SOURCE/vm130-router-ops-r19-workflow-hardening.tar.gz" "$SOURCE/vm130-router-ops-r19-workflow-hardening.tar.gz.sha256" "$SOURCE/vm130-source-manifest.sha256" || stop STOP_R19_VM130_SOURCE_PUBLICATION contract 25; phase_done vm130_source_publication
phase_begin plan_publication
publish_object local_architecture_plan_vm101_autonomous_hmn_recovery_r19 local-m07-plan LOCAL_M07_PLAN_URL "$BUNDLE_DIR/project-sources/WG_PAID_MGTS_LOCAL_ARCHITECTURE_PLAN_VM101_AUTONOMOUS_HMN_RECOVERY_R19.md" || stop STOP_R19_PLAN_PUBLICATION contract 26; phase_done plan_publication
phase_begin project_source_publication
mapfile -t PS_FILES < <(find "$BUNDLE_DIR/project-sources" -maxdepth 1 -type f -print | LC_ALL=C sort); publish_object project_source_post_vm130_r18_failure_analysis_workflow_hardening_r19 project-source-post PROJECT_SOURCE_POST_URL "${PS_FILES[@]}" || stop STOP_R19_PROJECT_SOURCE_PUBLICATION contract 27; PROJECT_SOURCE_POST_FILE_URL="${PROJECT_SOURCE_POST_URL}WG_PAID_MGTS_R18_FAILURE_ANALYSIS_AND_WORKFLOW_HARDENING_R19.md"; phase_done project_source_publication
phase_begin external_http_verification
for url in "$VM130_SOURCE_URL" "$LOCAL_M07_PLAN_URL" "$PROJECT_SOURCE_POST_URL"; do "$HTTP" --url "$url" --output "$STEP_DIR/http-final-$(printf '%s' "$url"|sha256sum|cut -c1-12).html" >>"$COMPONENTS/final-http.log" 2>&1; done; HTTP_VERIFY_PASS=true; phase_done external_http_verification
phase_begin step_report_publication
RESULT=PASS_R19_VM130_WORKFLOW_HARDENED_AFTER_R18; STOP_REASON=none; CURRENT_PHASE=step_report_publication; PUBLICATION_BARRIER=verified; write_docs; HTML="$STEP_DIR/html"; SAFE="$STEP_DIR/safe"; python3 "$HTML_BUILDER" --facts "$FACTS" --verify "$VERIFY" --rollback "$ROLLBACK" --output-dir "$HTML" --title-prefix R19 >"$COMPONENTS/html-aliases.log"; "$SAFE_BUILDER" "$SAFE" "$STEP_FILE" step-code.sh "$REPORT" report.txt "$FACTS" facts.json "$VERIFY" verify.txt "$ROLLBACK" rollback.sh "$MAIN_LOG" main.log "$PROGRESS" progress.log "$TRANSFER" transfer-verify.txt "$PHASE_CURRENT" phase-current.txt "$PHASE_EVENTS" phase-events.log "$COMPONENTS/vm101-r18-checkpoint.log" vm101-r18-checkpoint-before.txt "$COMPONENTS/vm101-r18-checkpoint-after.log" vm101-r18-checkpoint-after.txt "$COMPONENTS/vm130-apply.log" vm130-apply.txt "$COMPONENTS/vm130-postcheck.log" vm130-postcheck.txt "$COMPONENTS/vm130-export-source.log" vm130-export-source.txt "$COMPONENTS/final-http.log" final-http.txt "$STEP_DIR/manifest.log" bundle-manifest-verify.txt "$STEP_DIR/bundle-gate-r17.log" bundle-gate-r17.txt "$HTML/facts-public.html" facts-public.html "$HTML/verify-public.html" verify-public.html "$HTML/rollback-public.html" rollback-public.html >"$COMPONENTS/safe-payload.log"; "$FINALIZER" --label step050m07r19_r18_failure_analysis_and_workflow_hardening_r01 --payload-dir "$SAFE" --workflow-current "$PHASE_CURRENT" --workflow-events "$PHASE_EVENTS" --output-env "$STEP_DIR/finalize.env" --expect-kind step-report >"$COMPONENTS/finalize.log"
trap - ERR
set +e
STEP_REPORT_URL="$(field "$STEP_DIR/finalize.env" PUBLIC_URL)"; PREVIOUS_MOVED_COUNT="$(field "$COMPONENTS/finalize.log" PREVIOUS_MOVED_COUNT)"; [[ -n "$PREVIOUS_MOVED_COUNT" ]] || PREVIOUS_MOVED_COUNT=0; FACTS_URL="${STEP_REPORT_URL}facts-public.html"; VERIFY_URL="${STEP_REPORT_URL}verify-public.html"; ROLLBACK_URL="${STEP_REPORT_URL}rollback-public.html"; PUBLICATION_BARRIER=verified; HTTP_VERIFY_PASS=true; CURRENT_PHASE=complete; emit_final; exit 0
