#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
STEP_ID='STEP_050M07R20B_R04_ALL_PAYLOAD_COUNT_FIXTURES_PYCACHE_TOLERANT_AND_FINALIZATION_CONTINUATION'
RESULT='STOP_R20B_R04_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=true
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/components"; chmod 700 "$STEP_DIR"
STOP_GUARD_DIR="$STEP_DIR/.stop-handler-active"
STEP_FILE="$STEP_DIR/step-code.sh"; cp -a "$SELF" "$STEP_FILE"; chmod 700 "$STEP_FILE"
BUNDLE_COPY="$STEP_DIR/$(basename "$BUNDLE_ZIP")"; 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"
exec 3>&1; exec >>"$MAIN_LOG" 2>&1
progress() { printf '>>> [%s] %s
' "$(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 continuation_preflight compatibility_fix 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" <<R20B_R04_STEP_ROLLBACK
#!/usr/bin/env bash
set -Eeuo pipefail
[[ "\${CONFIRM_R20B_R04_ROLLBACK:-}" == YES ]] || { echo RESULT=STOP_R20B_R04_ROLLBACK_CONFIRMATION_REQUIRED; exit 2; }
ROLLBACK_FILE='$TARGET_ROLLBACK_FILE'
[[ -x "\$ROLLBACK_FILE" ]] || { echo RESULT=STOP_R20B_R04_ROLLBACK_FILE_MISSING; exit 2; }
"\$ROLLBACK_FILE"
R20B_R04_STEP_ROLLBACK
chmod 700 "$ROLLBACK"; }
write_docs() {
  local step_sha; step_sha="$(sha256sum "$STEP_FILE" | awk '{print $1}')"; write_rollback
  cat >"$REPORT" <<R20B_R04_REPORT
RESULT=$RESULT
STEP_ID=$STEP_ID
STOP_REASON=$STOP_REASON
CURRENT_PHASE=$CURRENT_PHASE
R20B_R01_CORE_REPEATED=false
R20B_COMPATIBILITY_FIX_ONLY=true
R19_GATE_MARKER_PRESERVED=true
R20_GATE_MARKER_ACTIVE=true
VM101_RUNTIME_CHANGED=false
VM101_SSH_USED=false
INVENTORY_REPEATED=false
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=false
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
R20B_R04_REPORT
  cat >"$VERIFY" <<R20B_R04_VERIFY
RESULT=$RESULT
R19_SHARED_POLICY_PRESERVED=true
R17_LEGACY_GATE_PRESERVED=true
R20_SHARED_POLICY_ACTIVE=true
R19_GATE_PASS_MARKER_PRESENT=true
R20_GATE_PASS_MARKER_PRESENT=true
GENERIC_GATE_PASS_MARKER_PRESENT=true
R19_SELFTEST_PASS=$CORE_CHANGE_COMPLETE
R20_SELFTEST_PASS=$CORE_CHANGE_COMPLETE
R20B_R01_CORE_REPEATED=false
VM101_SSH_USED=false
VM101_RUNTIME_CHANGED=false
INVENTORY_REPEATED=false
DIRECT_FAILOPEN_ALLOWED=false
SNAPSHOT_CREATED=false
ROUTER_MACHINE_CLOSE_EXECUTED=false
PUBLICATION_BARRIER=$PUBLICATION_BARRIER
RUNTIME_IMPACT=false
R20B_R04_VERIFY
  python3 - "$FACTS" <<R20B_R04_FACTS
import json,sys
obj={'schema':'router-step-facts-v1','step_id':'$STEP_ID','result':'$RESULT','stop_reason':'$STOP_REASON','current_phase':'$CURRENT_PHASE','r20b_r01_core_repeated':False,'r20b_compatibility_fix_only':True,'r19_gate_marker_preserved':True,'r20_gate_marker_active':True,'vm101_runtime_changed':False,'vm101_ssh_used':False,'inventory_repeated':False,'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,'vm130_source_url':'$VM130_SOURCE_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('
')
R20B_R04_FACTS
}
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=false"; do printf '%s
' "$x" >&3; done; }
publish_stop_report() { set +e; write_docs; local html safe label; html="$STEP_DIR/stop-html"; safe="$STEP_DIR/stop-safe"; label='step050m07r20b_r04_r19_gate_compatibility_and_finalization_continuation_stop'; python3 "$HTML_BUILDER" --facts "$FACTS" --verify "$VERIFY" --rollback "$ROLLBACK" --output-dir "$html" --title-prefix R20B-R04 >/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 >/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 reason 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_R04_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.log"
grep -qx RESULT=PASS_ROUTER_BUNDLE_GATE "$STEP_DIR/bundle-gate.log" || stop STOP_COPY_OR_TRANSFER_ERROR bundle_gate 20
COPY_VERIFY=PASS; printf 'COPY_VERIFY=PASS
MANIFEST_VERIFY=PASS
SYNTAX_VERIFY=PASS
FIXTURE_VERIFY=PASS
' >"$TRANSFER"; phase_done transfer_verification
phase_begin continuation_preflight
[[ "$(hostname)" == router-ops ]] || stop STOP_R20B_R04_WRONG_HOST "$(hostname)" 21
R01_DIR="$(find "$BASE/steps" -mindepth 1 -maxdepth 1 -type d -name '*_STEP_050M07R20B_DEGRADED_POOL_STATE_AND_RETRY_DESIGN_R01' -print | LC_ALL=C sort | tail -n1)"
[[ -n "$R01_DIR" && -d "$R01_DIR" ]] || stop STOP_R20B_R04_R01_EVIDENCE_MISSING none 21
grep -q '^target_core=complete$' "$R01_DIR/phase-current.env" || stop STOP_R20B_R04_R01_CORE_NOT_COMPLETE none 21
grep -q '^target_postcheck=failed$' "$R01_DIR/phase-current.env" || stop STOP_R20B_R04_R01_POSTCHECK_NOT_FAILED none 21
# Accept either the R20B R01 installed state or the automatic R19 rollback baseline.
while read -r sha path; do
  case "$path" in
    /opt/router-ops/bin/router-bundle-gate) continue ;;
  esac
  [[ -f "$path" && "$(sha256sum "$path" | awk '{print $1}')" == "$sha" ]] || stop STOP_R20B_R04_R19_BASELINE_MISMATCH "$path" 21
done <"$BUNDLE_DIR/reference/expected-vm130-r19.sha256"
R19_GATE_SHA="$(awk '$2=="/opt/router-ops/bin/router-bundle-gate"{print $1}' "$BUNDLE_DIR/reference/expected-vm130-r19.sha256")"
R01_GATE_SHA="$(awk '$2=="bin/router-bundle-gate"{print $1}' "$BUNDLE_DIR/reference/expected-r20b-r01-installed.sha256")"
CURRENT_GATE_SHA="$(sha256sum "$BASE/bin/router-bundle-gate" | awk '{print $1}')"
[[ "$CURRENT_GATE_SHA" == "$R19_GATE_SHA" || "$CURRENT_GATE_SHA" == "$R01_GATE_SHA" ]] || stop STOP_R20B_R04_GATE_BASELINE_UNKNOWN "$CURRENT_GATE_SHA" 21
R20_PRESENT_COUNT=0
while read -r sha rel; do
  [[ "$rel" == bin/router-bundle-gate ]] && continue
  path="$BASE/$rel"
  if [[ -f "$path" ]]; then
    [[ "$(sha256sum "$path" | awk '{print $1}')" == "$sha" ]] || stop STOP_R20B_R04_R20_COMPONENT_MISMATCH "$rel" 21
    R20_PRESENT_COUNT=$((R20_PRESENT_COUNT+1))
  fi
done <"$BUNDLE_DIR/reference/expected-r20b-r01-installed.sha256"
[[ "$R20_PRESENT_COUNT" -eq 0 || "$R20_PRESENT_COUNT" -eq 3 ]] || stop STOP_R20B_R04_PARTIAL_ROLLBACK_STATE "$R20_PRESENT_COUNT" 21
set +e
"$BASE/bin/router-workflow-r19-selftest" "$STEP_DIR/r19-before" >"$COMPONENTS/r19-before.log" 2>&1
r19_before_rc=$?
set -e
if [[ "$CURRENT_GATE_SHA" == "$R19_GATE_SHA" ]]; then
  [[ "$r19_before_rc" -eq 0 ]] || stop STOP_R20B_R04_R19_ROLLBACK_SELFTEST marker 21
  BASELINE_CLASS=R19_ROLLED_BACK
else
  [[ "$r19_before_rc" -ne 0 ]] || stop STOP_R20B_R04_FAILURE_SIGNATURE_NOT_REPRODUCED r19_selftest_unexpected_pass 21
  "$BASE/bin/router-workflow-r20-selftest" "$STEP_DIR/r20-before" >"$COMPONENTS/r20-before.log"
  grep -qx RESULT=PASS_ROUTER_WORKFLOW_R20_SELFTEST "$COMPONENTS/r20-before.log" || stop STOP_R20B_R04_R20_SELFTEST_BEFORE marker 21
  BASELINE_CLASS=R20_INSTALLED_PRE_POSTCHECK
fi
printf 'BASELINE_CLASS=%s
CURRENT_GATE_SHA=%s
R20_PRESENT_COUNT=%s
' "$BASELINE_CLASS" "$CURRENT_GATE_SHA" "$R20_PRESENT_COUNT" >"$COMPONENTS/baseline-classification.log"
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_R04_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_R04_PUBLICATION_PREFLIGHT "$label" 22; done <<R20B_R04_PREFLIGHT
vm130_router_ops_source_snapshot_r20b_r04_gate_compatibility|vm130-source|README.md
project_source_post_vm101_degraded_pool_design_r20b_r04|project-source-post|project-sources/WG_PAID_MGTS_R20_DEGRADED_POOL_STATE_AND_RETRY_DESIGN_AND_WORKFLOW_HARDENING_R20B.md
step050m07r20b_r04_r19_gate_compatibility_and_finalization_continuation|step-report|README.md
R20B_R04_PREFLIGHT
phase_done continuation_preflight
phase_begin compatibility_fix
"$BUNDLE_DIR/scripts/vm130-apply-compat.sh" "$BUNDLE_DIR" >"$COMPONENTS/vm130-apply-compat.log"
grep -qx RESULT=PASS_R20B_R04_GATE_COMPATIBILITY_INSTALLED "$COMPONENTS/vm130-apply-compat.log" || stop STOP_R20B_R04_COMPATIBILITY_APPLY marker 23
BACKUP_DIR="$(field "$COMPONENTS/vm130-apply-compat.log" BACKUP_DIR)"; TARGET_ROLLBACK_FILE="$(field "$COMPONENTS/vm130-apply-compat.log" ROLLBACK_FILE)"; BACKUP_READY="$(field "$COMPONENTS/vm130-apply-compat.log" BACKUP_READY)"; [[ "$BACKUP_READY" == true && -d "$BACKUP_DIR" && -x "$TARGET_ROLLBACK_FILE" ]] || stop STOP_R20B_R04_BACKUP_EVIDENCE missing 23
CHANGED_FILE_COUNT="$(field "$COMPONENTS/vm130-apply-compat.log" CHANGED_FILE_COUNT)"; [[ "$CHANGED_FILE_COUNT" -ge 1 && "$CHANGED_FILE_COUNT" -le 4 ]] || stop STOP_R20B_R04_CHANGED_FILE_COUNT "$CHANGED_FILE_COUNT" 23
phase_done compatibility_fix
phase_begin target_postcheck
"$BUNDLE_DIR/scripts/vm130-postcheck.sh" "$BUNDLE_DIR" "$STEP_DIR/r20b-r04-postcheck" >"$COMPONENTS/vm130-postcheck.log"
grep -qx RESULT=PASS_R20B_R04_GATE_COMPATIBILITY_POSTCHECK "$COMPONENTS/vm130-postcheck.log" || stop STOP_R20B_R04_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_R04_SOURCE_EXPORT marker 25
publish_object vm130_router_ops_source_snapshot_r20b_r04_gate_compatibility 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_R04_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_design_r20b_r04 project-source-post PROJECT_SOURCE_POST_URL "${PS_FILES[@]}" || stop STOP_R20B_R04_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-R04 >"$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-compat.log" vm130-apply-compat.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.log" bundle-gate.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_r04_r19_gate_compatibility_and_finalization_continuation --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
