#!/usr/bin/env bash
set -Eeuo pipefail
umask 077

STEP_ID='STEP_050M07R20B_DEGRADED_POOL_STATE_AND_RETRY_DESIGN_R01'
RESULT='STOP_R20B_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=''
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:?BUNDLE_ZIP is required}"
EXPECTED_BUNDLE_SHA256="${EXPECTED_BUNDLE_SHA256:?EXPECTED_BUNDLE_SHA256 is required}"
EXPECTED_INSTALLER_SHA256="${EXPECTED_INSTALLER_SHA256:?EXPECTED_INSTALLER_SHA256 is required}"
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"
source "$BUNDLE_DIR/scripts/publication-functions.sh"

router_step_workflow_init \
    "$PHASE_CURRENT" \
    "$PHASE_EVENTS" \
    transfer_verification \
    target_preflight \
    target_core \
    target_postcheck \
    vm130_source_publication \
    project_source_publication \
    external_http_verification \
    step_report_publication

field() {
    local file
    local key
    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}"
}

write_rollback() {
    cat >"$ROLLBACK" <<EOF
#!/usr/bin/env bash
set -Eeuo pipefail
[[ "\${CONFIRM_R20B_ROLLBACK:-}" == YES ]] || {
    echo RESULT=STOP_R20B_ROLLBACK_CONFIRMATION_REQUIRED
    exit 2
}
ROLLBACK_FILE='$TARGET_ROLLBACK_FILE'
[[ -x "\$ROLLBACK_FILE" ]] || {
    echo RESULT=STOP_R20B_ROLLBACK_FILE_MISSING
    exit 2
}
"\$ROLLBACK_FILE"
echo RESULT=PASS_R20B_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
R20A_STEP_REPORT_URL=$R20A_STEP_REPORT_URL
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}
R20_SHARED_POLICY_ACTIVE=$VM130_WORKFLOW_CHANGED
R20_STATE_SCHEMA_VERSION=1
R20_DEFAULT_RETRY_INTERVAL_SEC=1800
R20_RETRY_TICK_INTERVAL_SEC=60
R20A_INVENTORY_REPEATED=false
R20A_DELTA_SOURCE_FILE_COUNT=0
DIRECT_FAILOPEN_ALLOWED=false
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
R19_SHARED_POLICY_PRESERVED=true
R17_LEGACY_GATE_PRESERVED=true
R20_SHARED_POLICY_ACTIVE=$VM130_WORKFLOW_CHANGED
R20_BASH_LOCAL_SELF_REFERENCE_GUARD=$VM130_WORKFLOW_CHANGED
R20_PUBLICATION_SAFE_PAYLOAD_GUARD=$VM130_WORKFLOW_CHANGED
R20_DEGRADED_POOL_BUILD_CONTRACT=$VM130_WORKFLOW_CHANGED
R20A_INVENTORY_REPEATED=false
VM101_SSH_USED=false
VM101_RUNTIME_CHANGED=false
FULL_ROOTFS_SNAPSHOT=false
PRIVATE_KEY_MATERIAL_EXPORTED=false
DIRECT_FAILOPEN_ALLOWED=false
SNAPSHOT_CREATED=false
ROUTER_MACHINE_CLOSE_EXECUTED=false
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",
  "r20a_step_report_url":"$R20A_STEP_REPORT_URL",
  "vm101_runtime_changed":False,
  "vm101_ssh_used":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",
  "r20_shared_policy_active":"$VM130_WORKFLOW_CHANGED"=="true",
  "r20_state_schema_version":1,
  "retry_interval_sec":1800,
  "retry_tick_interval_sec":60,
  "r20a_inventory_repeated":False,
  "r20a_delta_source_file_count":0,
  "direct_failopen_allowed":False,
  "copy_verify":"$COPY_VERIFY",
  "http_verify_pass":"$HTTP_VERIFY_PASS"=="true",
  "publication_barrier":"$PUBLICATION_BARRIER",
  "runtime_impact":False,
  "vm130_source_url":"$VM130_SOURCE_URL",
  "project_source_post_url":"$PROJECT_SOURCE_POST_URL",
  "step_report_url":"$STEP_REPORT_URL"
}
with open(sys.argv[1],'w') as f:
    json.dump(obj,f,indent=2,sort_keys=True)
    f.write('\n')
PYFACT
}

emit_final() {
    local x
    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_stop_report() {
    set +e
    write_docs
    local html
    local safe
    local label
    html="$STEP_DIR/stop-html"
    safe="$STEP_DIR/stop-safe"
    label='step050m07r20b_degraded_pool_state_and_retry_design_r01_stop'
    python3 "$HTML_BUILDER" \
        --facts "$FACTS" \
        --verify "$VERIFY" \
        --rollback "$ROLLBACK" \
        --output-dir "$html" \
        --title-prefix R20B >/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
    local reason
    local rc
    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_R20B_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-r19.log"
grep -qx RESULT=PASS_ROUTER_BUNDLE_GATE "$STEP_DIR/bundle-gate-r19.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_R20B_WRONG_HOST "$(hostname)" 21
while read -r sha path; do
    [[ -f "$path" ]]
    [[ "$(sha256sum "$path" | awk '{print $1}')" == "$sha" ]]
done <"$BUNDLE_DIR/reference/expected-vm130-r19.sha256"
"$BASE/bin/router-workflow-r19-selftest" "$STEP_DIR/r19-selftest" >"$COMPONENTS/r19-selftest.log"
grep -qx RESULT=PASS_ROUTER_WORKFLOW_R19_SELFTEST "$COMPONENTS/r19-selftest.log" || stop STOP_R20B_R19_SELFTEST marker 21
mkdir -p "$STEP_DIR/preflight"
while IFS='|' read -r label kind rel; do
    "$PUBLISHER" --classify "$label" >"$STEP_DIR/preflight/${kind}.classify"
    grep -Fqx "PUBLIC_OBJECT_KIND=$kind" "$STEP_DIR/preflight/${kind}.classify" || stop STOP_R20B_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_R20B_PUBLICATION_PREFLIGHT "$label" 22
done <<'R20B_PREFLIGHT_LIST'
vm130_router_ops_source_snapshot_r20b_degraded_pool_design_hardening_r01|vm130-source|README.md
project_source_post_vm101_degraded_pool_state_retry_design_r20b|project-source-post|project-sources/WG_PAID_MGTS_R20_DEGRADED_POOL_STATE_AND_RETRY_DESIGN_AND_WORKFLOW_HARDENING_R20B.md
step050m07r20b_degraded_pool_state_and_retry_design_r01|step-report|README.md
R20B_PREFLIGHT_LIST
phase_done target_preflight

phase_begin target_core
"$BUNDLE_DIR/scripts/vm130-apply.sh" "$BUNDLE_DIR" >"$COMPONENTS/vm130-apply.log"
grep -qx RESULT=PASS_R20B_VM130_DESIGN_POLICY_INSTALLED "$COMPONENTS/vm130-apply.log" || stop STOP_R20B_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_R20B_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/r20b-postcheck" >"$COMPONENTS/vm130-postcheck.log"
grep -qx RESULT=PASS_R20B_VM130_DESIGN_POLICY_POSTCHECK "$COMPONENTS/vm130-postcheck.log" || stop STOP_R20B_POSTCHECK 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_R20B_VM130_SOURCE_EXPORTED "$COMPONENTS/vm130-export-source.log" || stop STOP_R20B_SOURCE_EXPORT marker 25
publish_object \
    vm130_router_ops_source_snapshot_r20b_degraded_pool_design_hardening_r01 \
    vm130-source \
    VM130_SOURCE_URL \
    "$SOURCE/report.txt" \
    "$SOURCE/vm130-router-ops-r20b-degraded-design.tar.gz" \
    "$SOURCE/vm130-router-ops-r20b-degraded-design.tar.gz.sha256" \
    "$SOURCE/vm130-source-manifest.sha256" || stop STOP_R20B_VM130_SOURCE_PUBLICATION contract 25
phase_done vm130_source_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_vm101_degraded_pool_state_retry_design_r20b \
    project-source-post \
    PROJECT_SOURCE_POST_URL \
    "${PS_FILES[@]}" || stop STOP_R20B_PROJECT_SOURCE_PUBLICATION contract 26
PROJECT_SOURCE_POST_FILE_URL="${PROJECT_SOURCE_POST_URL}WG_PAID_MGTS_R20_DEGRADED_POOL_STATE_AND_RETRY_DESIGN_AND_WORKFLOW_HARDENING_R20B.md"
phase_done project_source_publication

phase_begin external_http_verification
for url in "$VM130_SOURCE_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_R20B_DEGRADED_POOL_DESIGN_AND_VM130_POLICY_HARDENED
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 R20B >"$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/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-r19.log" bundle-gate-r19.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 step050m07r20b_degraded_pool_state_and_retry_design_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
