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

STEP_ID="STEP_050M07R13E3_INTEGRATE_LATEST_OLD_INTO_SINGLE_PUBLISH"
RESULT_PASS="PASS_${STEP_ID}"
BASE="/opt/router-ops"
BIN="$BASE/bin"
PUBLIC="$BASE/public"
TOKEN_FILE="$PUBLIC/.router-public-token"
TS="$(date -u +%Y%m%d-%H%M%S)"
STATE="$BASE/state/public-layout-single-publish/${TS}"
BACKUP="$STATE/backup"
CANDIDATE="$STATE/candidate"
TESTROOT="$STATE/test-root"
SOURCE_BUILD="$STATE/vm130-source-build"
REPORT_BUILD="$STATE/report-build"
PROGRESS="$STATE/progress.log"

TUNNEL_BASE="${TUNNEL_BASE:-https://receiver-rejected-average-combat.trycloudflare.com}"
TUNNEL_BASE="${TUNNEL_BASE%/}"

mkdir -p "$BACKUP" "$CANDIDATE" "$TESTROOT" "$SOURCE_BUILD" "$REPORT_BUILD"
chmod 700 "$STATE" "$BACKUP" "$CANDIDATE" "$TESTROOT" "$SOURCE_BUILD" "$REPORT_BUILD"
: > "$PROGRESS"

TOKEN="$(tr -d '\r\n' < "$TOKEN_FILE")"
ROOT="$PUBLIC/r/$TOKEN"
LATEST="$ROOT/latest"
OLD="$ROOT/old"

MUTATED=0
COMMITTED=0
NEW_SOURCE_NAME=""
PREVIOUS_SOURCE_NAME=""
NEW_REPORT_NAME=""
PREVIOUS_REPORT_NAME=""
FAILURE_REASON=""

progress() {
    printf '>>> [%s] %s\n' "$1" "$2" | tee -a "$PROGRESS"
}

single_latest_name() {
    local pattern="$1"
    find "$LATEST" -mindepth 1 -maxdepth 1 -type d -name "$pattern" -printf '%f\n' |
        LC_ALL=C sort |
        tail -n 1
}

restore_layout_object() {
    local new_name="$1" previous_name="$2"
    if [ -n "$new_name" ] && [ -d "$LATEST/$new_name" ]; then
        if [ ! -e "$OLD/$new_name" ]; then
            mv "$LATEST/$new_name" "$OLD/$new_name"
        else
            mv "$LATEST/$new_name" "$OLD/${new_name}.rollback-${TS}"
        fi
    fi
    if [ -n "$previous_name" ] && [ -d "$OLD/$previous_name" ] && [ ! -e "$LATEST/$previous_name" ]; then
        mv "$OLD/$previous_name" "$LATEST/$previous_name"
    fi
}

rollback_runtime() {
    set +e
    if [ "$MUTATED" -eq 1 ]; then
        for name in \
            router-publish-report \
            router-public-reindex \
            router-vm100-git-source-publish \
            router-vm101-git-source-publish \
            router-vm121-git-source-publish
        do
            if [ -f "$BACKUP/$name" ]; then
                cp -a "$BACKUP/$name" "$BIN/.${name}.rollback.$$"
                chmod 0755 "$BIN/.${name}.rollback.$$"
                mv -f "$BIN/.${name}.rollback.$$" "$BIN/$name"
            fi
        done
    fi

    restore_layout_object "$NEW_REPORT_NAME" "$PREVIOUS_REPORT_NAME"
    restore_layout_object "$NEW_SOURCE_NAME" "$PREVIOUS_SOURCE_NAME"

    "$BIN/router-public-reindex" >/dev/null 2>&1 || true
}

on_exit() {
    local rc=$?
    trap - EXIT INT TERM HUP
    if [ "$rc" -ne 0 ] && [ "$COMMITTED" -ne 1 ]; then
        FAILURE_REASON="${FAILURE_REASON:-COMMAND_FAILED_RC_${rc}_LINE_${BASH_LINENO[0]:-unknown}}"
        progress STOP "$FAILURE_REASON"
        rollback_runtime
        printf '\nRESULT=STOP_%s\n' "$STEP_ID"
        printf 'FAILURE_REASON=%s\n' "$FAILURE_REASON"
        printf 'STATE_DIR=%s\n' "$STATE"
    fi
    exit "$rc"
}
trap on_exit EXIT INT TERM HUP

progress PREFLIGHT "checking restored one-step workflow and latest/old layout"

for cmd in bash sh python3 tar gzip base64 sha256sum flock find awk sed grep cmp curl mktemp install; do
    command -v "$cmd" >/dev/null 2>&1
 done

test -d "$LATEST"
test -d "$OLD"
test -x "$BIN/router-machine-close"
test "$(sha256sum "$BIN/router-machine-close" | awk '{print $1}')" = \
    "bfa28b24bf6148c89f367eaad200d2992c97972ec479f05706f50471b96b38c4"
test ! -e "$BIN/router-machine-close.core"

cat > "$STATE/expected-current.sha256" <<'EOF_EXPECTED'
28ecf163982969fadde73bc15ece7e719207dfa3f713fb9422ebe03078f5ee0d  router-publish-report
77870f1e391557f5c5e2b0a1e2d74a2a85c77ac776ff01e967a859bd4df95193  router-public-reindex
79f685ccb1c85c549b5894bd811b10c2be32b70560af345dc3a58fba66928dee  router-vm100-git-source-publish
dd404817192d4803b31c76e3bd30dfbf5ffb755ee8022ee35a6344c654ff66d9  router-vm101-git-source-publish
0309e6cc8254523e0b225cef243b28afcbdc3eec498724fe99c502a7421b8b67  router-vm121-git-source-publish
EOF_EXPECTED

while read -r expected name; do
    test -x "$BIN/$name"
    actual="$(sha256sum "$BIN/$name" | awk '{print $1}')"
    if [ "$actual" != "$expected" ]; then
        FAILURE_REASON="UNEXPECTED_CURRENT_SHA_${name}_${actual}"
        false
    fi
    cp -a "$BIN/$name" "$BACKUP/$name"
done < "$STATE/expected-current.sha256"

PREVIOUS_SOURCE_NAME="$(single_latest_name '*_vm130_router_ops_source_snapshot*')"
PREVIOUS_REPORT_NAME="$(single_latest_name '*_step*')"
test -n "$PREVIOUS_SOURCE_NAME"
test -n "$PREVIOUS_REPORT_NAME"

progress BUILD "extracting five complete rewritten workflow files"

cat > "$STATE/candidate.tar.gz.b64" <<'EOF_CANDIDATE_B64'
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
EOF_CANDIDATE_B64

base64 -d "$STATE/candidate.tar.gz.b64" > "$STATE/candidate.tar.gz"
echo '5a85731b26afb09c188cdc1dd69c8ba7837f5e8e72104c9b796ffaf5135d6c1f  '"$STATE/candidate.tar.gz" | sha256sum -c -
tar -xzf "$STATE/candidate.tar.gz" -C "$CANDIDATE"

cat > "$STATE/expected-candidate.sha256" <<'EOF_CANDIDATE_SHA'
901c375b9c36f14ebcfde66ddecea083a97907e61d489f210c79422c3e2db970  router-publish-report
09add0b861e9eba9793b3188dd8e91811cbef8a8da095f216b9a5efcbfdec61c  router-public-reindex
844e41382d69d30aa22be4b5466bb9fd2e32bbd5e079fca49e2911c8706a10b2  router-vm100-git-source-publish
22aef95167693affdfe612a6d2d762d9bd3961f43d4158b20acd23bbdfb89123  router-vm101-git-source-publish
84e61b00880ea48b8d8027f2e29a294756c8049cca84a3778706d8f702a8a2b4  router-vm121-git-source-publish
EOF_CANDIDATE_SHA

(
    cd "$CANDIDATE"
    sha256sum -c "$STATE/expected-candidate.sha256"
) | tee "$STATE/candidate-hash-check.txt"

sh -n "$CANDIDATE/router-publish-report"
sh -n "$CANDIDATE/router-public-reindex"
bash -n "$CANDIDATE/router-vm100-git-source-publish"
bash -n "$CANDIDATE/router-vm101-git-source-publish"
bash -n "$CANDIDATE/router-vm121-git-source-publish"

for machine in vm100 vm101 vm121; do
    file="$CANDIDATE/router-${machine}-git-source-publish"
    grep -q '^PUBLISHED_RELATIVE_PATH=' "$file"
    grep -q 'latest/\*' "$file"
    grep -q 'PUBLISHED_RELATIVE_PATH%/' "$file"
    ! grep -q 'PUBLIC_DIR_NAME=' "$file"
done

progress TEST "running full latest/old transaction simulation before installation"

mkdir -p \
    "$TESTROOT/bin" \
    "$TESTROOT/public/r/testtoken/latest" \
    "$TESTROOT/public/r/testtoken/old" \
    "$TESTROOT/state/locks" \
    "$TESTROOT/input"
printf 'testtoken\n' > "$TESTROOT/public/.router-public-token"
printf 'QUICK_TUNNEL_URL=https://example.invalid\n' > "$TESTROOT/state/current-quick-tunnel.env"
cp "$CANDIDATE/router-public-reindex" "$TESTROOT/bin/router-public-reindex"
cp "$CANDIDATE/router-publish-report" "$TESTROOT/bin/router-publish-report"
chmod 0755 "$TESTROOT/bin/"*

mkdir "$TESTROOT/public/r/testtoken/latest/20260713-000000_vm101_git_source_old"
printf 'old\n' > "$TESTROOT/public/r/testtoken/latest/20260713-000000_vm101_git_source_old/marker"
mkdir "$TESTROOT/public/r/testtoken/latest/20260713-000000_global_project_plan_wg_paid"
printf 'plan\n' > "$TESTROOT/public/r/testtoken/latest/20260713-000000_global_project_plan_wg_paid/marker"
printf 'payload\n' > "$TESTROOT/input/facts.json"

ROUTER_OPS_BASE="$TESTROOT" \
ROUTER_PUBLIC_TOKEN=testtoken \
TUNNEL_BASE=https://example.invalid \
    "$TESTROOT/bin/router-publish-report" \
    vm101_git_source_abcdef \
    "$TESTROOT/input/facts.json" \
    > "$STATE/simulation-first.txt"

grep -q '^PUBLISHED_RELATIVE_PATH=latest/' "$STATE/simulation-first.txt"
grep -q '^PREVIOUS_MOVED_COUNT=1$' "$STATE/simulation-first.txt"
test -f "$TESTROOT/public/r/testtoken/old/20260713-000000_vm101_git_source_old/marker"
test -f "$TESTROOT/public/r/testtoken/latest/20260713-000000_global_project_plan_wg_paid/marker"
test "$(find "$TESTROOT/public/r/testtoken/latest" -mindepth 1 -maxdepth 1 -type d -name '*_vm101_git_source_*' | wc -l)" -eq 1

sleep 1
printf 'payload2\n' > "$TESTROOT/input/facts2.json"
ROUTER_OPS_BASE="$TESTROOT" \
ROUTER_PUBLIC_TOKEN=testtoken \
TUNNEL_BASE=https://example.invalid \
    "$TESTROOT/bin/router-publish-report" \
    vm101_git_source_bcdef0 \
    "$TESTROOT/input/facts2.json" \
    > "$STATE/simulation-second.txt"

test "$(find "$TESTROOT/public/r/testtoken/latest" -mindepth 1 -maxdepth 1 -type d -name '*_vm101_git_source_*' | wc -l)" -eq 1
test "$(find "$TESTROOT/public/r/testtoken/old" -mindepth 1 -maxdepth 1 -type d -name '*_vm101_git_source_*' | wc -l)" -eq 2

mkdir "$TESTROOT/public/r/testtoken/latest/20260713-010000_step_old"
printf 'old-step\n' > "$TESTROOT/public/r/testtoken/latest/20260713-010000_step_old/marker"
printf 'report\n' > "$TESTROOT/input/report.txt"
ROUTER_OPS_BASE="$TESTROOT" \
ROUTER_PUBLIC_TOKEN=testtoken \
TUNNEL_BASE=https://example.invalid \
    "$TESTROOT/bin/router-publish-report" \
    step050m07r13e3_simulation \
    "$TESTROOT/input/report.txt" \
    > "$STATE/simulation-step.txt"

test "$(find "$TESTROOT/public/r/testtoken/latest" -mindepth 1 -maxdepth 1 -type d -name '*_step*' | wc -l)" -eq 1
test -f "$TESTROOT/public/r/testtoken/old/20260713-010000_step_old/marker"
test -f "$TESTROOT/public/r/testtoken/index.html"
test -f "$TESTROOT/public/r/testtoken/latest/index.html"
test -f "$TESTROOT/public/r/testtoken/old/index.html"

LATEST_BEFORE_NEGATIVE="$(find "$TESTROOT/public/r/testtoken/latest" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | LC_ALL=C sort | sha256sum | awk '{print $1}')"
set +e
ROUTER_OPS_BASE="$TESTROOT" \
ROUTER_PUBLIC_TOKEN=testtoken \
    "$TESTROOT/bin/router-publish-report" \
    vm101_git_source_missing \
    "$TESTROOT/input/does-not-exist" \
    > "$STATE/simulation-negative.txt" 2>&1
NEGATIVE_RC=$?
set -e
test "$NEGATIVE_RC" -ne 0
LATEST_AFTER_NEGATIVE="$(find "$TESTROOT/public/r/testtoken/latest" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | LC_ALL=C sort | sha256sum | awk '{print $1}')"
test "$LATEST_BEFORE_NEGATIVE" = "$LATEST_AFTER_NEGATIVE"

printf '%s\n' \
    'SIMULATION=PASS' \
    'ONE_STEP_PUBLISH=true' \
    'PREVIOUS_OBJECT_MOVES_TO_OLD=true' \
    'UNRELATED_LATEST_OBJECT_PRESERVED=true' \
    'FAILED_PUBLICATION_ROLLS_BACK=true' \
    'ROUTER_MACHINE_CLOSE_WRAPPER=false' \
    > "$STATE/simulation-result.txt"

progress INSTALL "atomically installing complete files in /opt/router-ops/bin"
MUTATED=1

for name in \
    router-publish-report \
    router-public-reindex \
    router-vm100-git-source-publish \
    router-vm101-git-source-publish \
    router-vm121-git-source-publish
do
    install -m 0755 "$CANDIDATE/$name" "$BIN/.${name}.new.$$"
    mv -f "$BIN/.${name}.new.$$" "$BIN/$name"
done

(
    cd "$BIN"
    sha256sum -c "$STATE/expected-candidate.sha256"
) | tee "$STATE/installed-hash-check.txt"

sh -n "$BIN/router-publish-report"
sh -n "$BIN/router-public-reindex"
bash -n "$BIN/router-vm100-git-source-publish"
bash -n "$BIN/router-vm101-git-source-publish"
bash -n "$BIN/router-vm121-git-source-publish"
test "$(sha256sum "$BIN/router-machine-close" | awk '{print $1}')" = \
    "bfa28b24bf6148c89f367eaad200d2992c97972ec479f05706f50471b96b38c4"
test ! -e "$BIN/router-machine-close.core"

progress SNAPSHOT "building updated VM130 source snapshot from previous confirmed baseline plus installed files"

mapfile -t PREVIOUS_ARCHIVES < <(
    find "$LATEST/$PREVIOUS_SOURCE_NAME" -maxdepth 1 -type f -name '*.tar.gz' -printf '%p\n' |
        LC_ALL=C sort
)
test "${#PREVIOUS_ARCHIVES[@]}" -eq 1
PREVIOUS_ARCHIVE="${PREVIOUS_ARCHIVES[0]}"

mkdir -p "$SOURCE_BUILD/extract"
tar -xzf "$PREVIOUS_ARCHIVE" -C "$SOURCE_BUILD/extract"
mapfile -t SNAP_TOPS < <(find "$SOURCE_BUILD/extract" -mindepth 1 -maxdepth 1 -type d -printf '%p\n')
test "${#SNAP_TOPS[@]}" -eq 1
SNAP_TOP="${SNAP_TOPS[0]}"

for name in \
    router-publish-report \
    router-public-reindex \
    router-vm100-git-source-publish \
    router-vm101-git-source-publish \
    router-vm121-git-source-publish
do
    mkdir -p "$SNAP_TOP/opt/router-ops/bin"
    cp -a "$BIN/$name" "$SNAP_TOP/opt/router-ops/bin/$name"
done

cat > "$SNAP_TOP/source-update-r13e3.txt" <<EOF_SOURCE_UPDATE
STEP=$STEP_ID
UPDATED_AT_UTC=$TS
METHOD=previous confirmed VM130 source snapshot plus exact overlay of five installed complete files
ROUTER_MACHINE_CLOSE_CHANGED=false
WRAPPER_CORE_SCHEME_USED=false
ONE_STEP_PUBLICATION=true
EOF_SOURCE_UPDATE
chmod 0644 "$SNAP_TOP/source-update-r13e3.txt"

NEW_TOP="$SOURCE_BUILD/wg-paid-vm130-router-ops-${TS}"
mv "$SNAP_TOP" "$NEW_TOP"
SOURCE_ARCHIVE="$SOURCE_BUILD/wg-paid-vm130-router-ops-${TS}.tar.gz"
SOURCE_ARCHIVE_SHA="$SOURCE_BUILD/$(basename "$SOURCE_ARCHIVE").sha256"
SOURCE_ARCHIVE_B64="$SOURCE_BUILD/$(basename "$SOURCE_ARCHIVE").b64.txt"
SOURCE_MANIFEST="$SOURCE_BUILD/manifest.sha256"
SOURCE_FACTS="$SOURCE_BUILD/facts.json"
SOURCE_VERIFY="$SOURCE_BUILD/verify.txt"

tar -czf "$SOURCE_ARCHIVE" -C "$SOURCE_BUILD" "$(basename "$NEW_TOP")"
sha256sum "$SOURCE_ARCHIVE" > "$SOURCE_ARCHIVE_SHA"
base64 -w76 "$SOURCE_ARCHIVE" > "$SOURCE_ARCHIVE_B64"
(
    cd "$NEW_TOP"
    find . -type f -print0 | LC_ALL=C sort -z | xargs -0 sha256sum
) > "$SOURCE_MANIFEST"

python3 - "$SOURCE_FACTS" "$TS" "$PREVIOUS_SOURCE_NAME" "$SOURCE_ARCHIVE" "$SOURCE_ARCHIVE_SHA" <<'PY_SOURCE_FACTS'
import json, pathlib, sys
out, ts, baseline, archive, sha_file = sys.argv[1:]
sha = pathlib.Path(sha_file).read_text().split()[0]
data = {
    "step_id": "STEP_050M07R13E3_INTEGRATE_LATEST_OLD_INTO_SINGLE_PUBLISH",
    "timestamp_utc": ts,
    "baseline_source_folder": baseline,
    "archive": pathlib.Path(archive).name,
    "archive_sha256": sha,
    "method": "confirmed baseline plus exact overlay of five complete installed workflow files",
    "router_machine_close_changed": False,
    "wrapper_core_scheme_used": False,
    "one_step_publication": True,
}
pathlib.Path(out).write_text(json.dumps(data, indent=2) + "\n")
PY_SOURCE_FACTS

cat > "$SOURCE_VERIFY" <<EOF_SOURCE_VERIFY
RESULT=PASS
BASELINE_SOURCE_FOLDER=$PREVIOUS_SOURCE_NAME
OVERLAY_FILE_COUNT=5
ROUTER_MACHINE_CLOSE_CHANGED=false
WRAPPER_CORE_SCHEME_USED=false
ONE_STEP_PUBLICATION=true
EOF_SOURCE_VERIFY

SOURCE_OUTPUT="$(
    TUNNEL_BASE="$TUNNEL_BASE" \
    "$BIN/router-publish-report" \
        vm130_router_ops_source_snapshot_r13e3 \
        "$SOURCE_ARCHIVE" \
        "$SOURCE_ARCHIVE_SHA" \
        "$SOURCE_ARCHIVE_B64" \
        "$SOURCE_MANIFEST" \
        "$SOURCE_FACTS" \
        "$SOURCE_VERIFY"
)"
printf '%s\n' "$SOURCE_OUTPUT" | tee "$STATE/source-publish-output.txt"

NEW_SOURCE_DIR="$(printf '%s\n' "$SOURCE_OUTPUT" | awk -F= '$1=="PUBLISHED_DIR" {print substr($0,index($0,"=")+1)}')"
VM130_SOURCE_URL="$(printf '%s\n' "$SOURCE_OUTPUT" | awk -F= '$1=="TRYCF_REPORT" {print substr($0,index($0,"=")+1)}')"
NEW_SOURCE_NAME="$(basename "$NEW_SOURCE_DIR")"
test -d "$NEW_SOURCE_DIR"
test -n "$VM130_SOURCE_URL"
test -d "$OLD/$PREVIOUS_SOURCE_NAME"

curl -fsS --max-time 30 "$VM130_SOURCE_URL" >/dev/null
curl -fsS --max-time 60 "${VM130_SOURCE_URL}$(basename "$SOURCE_ARCHIVE").sha256" >/dev/null

progress REPORT "creating formal STEP report and rollback"

LOCAL_M07_NAME="$(single_latest_name '*_local_architecture_plan_vm101_autonomous_hmn_recovery*')"
GLOBAL_PLAN_NAME="$(single_latest_name '*_global_project_plan_wg_paid*')"
ACCESS_MAP_NAME="$(single_latest_name '*_xs_map_*')"
VM100_NAME="$(single_latest_name '*_vm100_git_source_*')"
VM101_NAME="$(single_latest_name '*_vm101_git_source_*')"
VM121_NAME="$(single_latest_name '*_vm121_git_source_*')"
VM101_MODEL_NAME="$(single_latest_name '*_vm101_model_*')"
VM101_METHODS_NAME="$(single_latest_name '*_vm101_methods_*')"

for required in \
    "$LOCAL_M07_NAME" "$GLOBAL_PLAN_NAME" "$ACCESS_MAP_NAME" \
    "$VM100_NAME" "$VM101_NAME" "$VM121_NAME" \
    "$VM101_MODEL_NAME" "$VM101_METHODS_NAME"
do
    test -n "$required"
done

BASE_URL="$TUNNEL_BASE/r/$TOKEN"
LATEST_ROOT_URL="$BASE_URL/latest/"
OLD_ROOT_URL="$BASE_URL/old/"
LOCAL_M07_PLAN_URL="$BASE_URL/latest/$LOCAL_M07_NAME/"
GLOBAL_PROJECT_PLAN_URL="$BASE_URL/latest/$GLOBAL_PLAN_NAME/"
ACCESS_MAP_URL="$BASE_URL/latest/$ACCESS_MAP_NAME/"
XS_MAP_URL="$ACCESS_MAP_URL"
VM100_PUBLIC_URL="$BASE_URL/latest/$VM100_NAME/"
VM101_PUBLIC_URL="$BASE_URL/latest/$VM101_NAME/"
VM121_PUBLIC_URL="$BASE_URL/latest/$VM121_NAME/"
VM101_MODEL_URL="$BASE_URL/latest/$VM101_MODEL_NAME/vm101-model.txt"
VM101_METHODS_URL="$BASE_URL/latest/$VM101_METHODS_NAME/"

cp "$0" "$REPORT_BUILD/step-code.sh"
chmod 0644 "$REPORT_BUILD/step-code.sh"
cp "$PROGRESS" "$REPORT_BUILD/progress.log"
cp "$STATE/simulation-result.txt" "$REPORT_BUILD/simulation-result.txt"
cp "$STATE/installed-hash-check.txt" "$REPORT_BUILD/installed-hash-check.txt"
cp "$STATE/expected-current.sha256" "$REPORT_BUILD/original-hashes.sha256"
cp "$STATE/expected-candidate.sha256" "$REPORT_BUILD/installed-hashes.sha256"
cp "$CANDIDATE/"* "$REPORT_BUILD/"
chmod 0644 "$REPORT_BUILD/"*

cat > "$REPORT_BUILD/rollback.sh" <<EOF_ROLLBACK
#!/usr/bin/env bash
set -Eeuo pipefail
BASE=/opt/router-ops
BIN=\"\$BASE/bin\"
ROOT=\"$ROOT\"
LATEST=\"\$ROOT/latest\"
OLD=\"\$ROOT/old\"
BACKUP=\"$BACKUP\"

for name in router-publish-report router-public-reindex router-vm100-git-source-publish router-vm101-git-source-publish router-vm121-git-source-publish; do
    test -f \"\$BACKUP/\$name\"
    cp -a \"\$BACKUP/\$name\" \"\$BIN/.\${name}.rollback.\$\$\"
    chmod 0755 \"\$BIN/.\${name}.rollback.\$\$\"
    mv -f \"\$BIN/.\${name}.rollback.\$\$\" \"\$BIN/\$name\"
done

if [ -d \"\$LATEST/$NEW_SOURCE_NAME\" ]; then
    mv \"\$LATEST/$NEW_SOURCE_NAME\" \"\$OLD/$NEW_SOURCE_NAME\"
fi
if [ -d \"\$OLD/$PREVIOUS_SOURCE_NAME\" ] && [ ! -e \"\$LATEST/$PREVIOUS_SOURCE_NAME\" ]; then
    mv \"\$OLD/$PREVIOUS_SOURCE_NAME\" \"\$LATEST/$PREVIOUS_SOURCE_NAME\"
fi

if [ -n \"${NEW_REPORT_NAME}\" ] && [ -d \"\$LATEST/${NEW_REPORT_NAME}\" ]; then
    mv \"\$LATEST/${NEW_REPORT_NAME}\" \"\$OLD/${NEW_REPORT_NAME}\"
fi
if [ -d \"\$OLD/$PREVIOUS_REPORT_NAME\" ] && [ ! -e \"\$LATEST/$PREVIOUS_REPORT_NAME\" ]; then
    mv \"\$OLD/$PREVIOUS_REPORT_NAME\" \"\$LATEST/$PREVIOUS_REPORT_NAME\"
fi

\"\$BIN/router-public-reindex\" >/dev/null
bash -n \"\$BIN/router-machine-close\"
echo RESULT=PASS_ROLLBACK_$STEP_ID
EOF_ROLLBACK
chmod 0755 "$REPORT_BUILD/rollback.sh"

cat > "$REPORT_BUILD/report.txt" <<EOF_REPORT
STEP=$STEP_ID
RESULT=$RESULT_PASS

Purpose:
Restore and preserve the original one-command workflow while adapting publication to the latest/old layout.

Correction of the failed R13E approach:
- router-machine-close was not wrapped and was not renamed.
- no .core chain or /usr/local helper layer is used.
- the central router-publish-report now performs the complete transaction itself.
- a new artifact is built outside the public tree, then atomically moved into latest/.
- the previous artifact of the same kind moves into old/.
- unrelated current artifacts remain in latest/.
- on publication failure, the layout transaction rolls back.
- machine backends consume PUBLISHED_RELATIVE_PATH and publish direct URLs inside latest/.

Changed VM130 files:
- /opt/router-ops/bin/router-publish-report
- /opt/router-ops/bin/router-public-reindex
- /opt/router-ops/bin/router-vm100-git-source-publish
- /opt/router-ops/bin/router-vm101-git-source-publish
- /opt/router-ops/bin/router-vm121-git-source-publish

Unchanged:
- /opt/router-ops/bin/router-machine-close
- VM100, VM101 and VM121 runtime/source state
- Git repositories and machine commits

Verification:
- complete-file hashes matched the prepared candidates;
- shell syntax passed for all five files;
- two consecutive simulated VM101 publications left exactly one VM101 folder in latest/;
- prior VM101 publications moved into old/;
- unrelated global plan remained in latest/;
- failed simulated publication did not alter latest/;
- root/latest/old indexes were regenerated;
- router-machine-close retained SHA256 bfa28b24bf6148c89f367eaad200d2992c97972ec479f05706f50471b96b38c4.

RUNTIME_IMPACT=false
VM100_CHANGED=false
VM101_CHANGED=false
VM121_CHANGED=false
VM130_WORKFLOW_CHANGED=true
ROLLBACK=$REPORT_BUILD/rollback.sh
VM130_SOURCE_URL=$VM130_SOURCE_URL
EOF_REPORT

python3 - "$REPORT_BUILD/facts.json" <<PY_FACTS
import json, pathlib
pathlib.Path("$REPORT_BUILD/facts.json").write_text(json.dumps({
  "step_id": "$STEP_ID",
  "result": "$RESULT_PASS",
  "timestamp_utc": "$TS",
  "changed_files": [
    "/opt/router-ops/bin/router-publish-report",
    "/opt/router-ops/bin/router-public-reindex",
    "/opt/router-ops/bin/router-vm100-git-source-publish",
    "/opt/router-ops/bin/router-vm101-git-source-publish",
    "/opt/router-ops/bin/router-vm121-git-source-publish"
  ],
  "router_machine_close_changed": False,
  "router_machine_close_sha256": "bfa28b24bf6148c89f367eaad200d2992c97972ec479f05706f50471b96b38c4",
  "one_step_workflow": True,
  "wrapper_core_scheme_used": False,
  "publication_target": "latest",
  "historical_target": "old",
  "simulation_pass": True,
  "runtime_impact": False,
  "vm100_changed": False,
  "vm101_changed": False,
  "vm121_changed": False,
  "vm130_source_url": "$VM130_SOURCE_URL"
}, indent=2) + "\n")
PY_FACTS

cat > "$REPORT_BUILD/verify.txt" <<EOF_VERIFY
RESULT=PASS
ONE_STEP_WORKFLOW=true
ROUTER_MACHINE_CLOSE_CHANGED=false
ROUTER_MACHINE_CLOSE_SHA256=bfa28b24bf6148c89f367eaad200d2992c97972ec479f05706f50471b96b38c4
WRAPPER_CORE_SCHEME_USED=false
COMPLETE_FILES_INSTALLED=5
SIMULATION_PASS=true
FAILED_PUBLICATION_ROLLBACK_PASS=true
LATEST_OLD_REINDEX_PASS=true
VM100_CHANGED=false
VM101_CHANGED=false
VM121_CHANGED=false
RUNTIME_IMPACT=false
EOF_VERIFY

REPORT_OUTPUT="$(
    TUNNEL_BASE="$TUNNEL_BASE" \
    "$BIN/router-publish-report" \
        step050m07r13e3_integrate_latest_old_into_single_publish \
        "$REPORT_BUILD/step-code.sh" \
        "$REPORT_BUILD/report.txt" \
        "$REPORT_BUILD/facts.json" \
        "$REPORT_BUILD/progress.log" \
        "$REPORT_BUILD/verify.txt" \
        "$REPORT_BUILD/rollback.sh" \
        "$REPORT_BUILD/simulation-result.txt" \
        "$REPORT_BUILD/installed-hash-check.txt" \
        "$REPORT_BUILD/original-hashes.sha256" \
        "$REPORT_BUILD/installed-hashes.sha256" \
        "$REPORT_BUILD/router-publish-report" \
        "$REPORT_BUILD/router-public-reindex" \
        "$REPORT_BUILD/router-vm100-git-source-publish" \
        "$REPORT_BUILD/router-vm101-git-source-publish" \
        "$REPORT_BUILD/router-vm121-git-source-publish"
)"
printf '%s\n' "$REPORT_OUTPUT" | tee "$STATE/report-publish-output.txt"

NEW_REPORT_DIR="$(printf '%s\n' "$REPORT_OUTPUT" | awk -F= '$1=="PUBLISHED_DIR" {print substr($0,index($0,"=")+1)}')"
STEP_REPORT_URL="$(printf '%s\n' "$REPORT_OUTPUT" | awk -F= '$1=="TRYCF_REPORT" {print substr($0,index($0,"=")+1)}')"
NEW_REPORT_NAME="$(basename "$NEW_REPORT_DIR")"
test -d "$NEW_REPORT_DIR"
test -n "$STEP_REPORT_URL"
test -d "$OLD/$PREVIOUS_REPORT_NAME"

curl -fsS --max-time 30 "$STEP_REPORT_URL" >/dev/null
curl -fsS --max-time 30 "${STEP_REPORT_URL}facts.json" >/dev/null
curl -fsS --max-time 30 "$LATEST_ROOT_URL" >/dev/null

FACTS_URL="${STEP_REPORT_URL}facts.json"
VERIFY_URL="${STEP_REPORT_URL}verify.txt"
ROLLBACK_URL="${STEP_REPORT_URL}rollback.sh"
ARCHITECTURE_PLAN_URL="$LOCAL_M07_PLAN_URL"

COMMITTED=1
trap - EXIT INT TERM HUP

printf '\nRESULT=%s\n' "$RESULT_PASS"
printf 'STEP_REPORT_URL=%s\n' "$STEP_REPORT_URL"
printf 'LATEST_ROOT_URL=%s\n' "$LATEST_ROOT_URL"
printf 'OLD_ROOT_URL=%s\n' "$OLD_ROOT_URL"
printf 'LOCAL_M07_PLAN_URL=%s\n' "$LOCAL_M07_PLAN_URL"
printf 'GLOBAL_PROJECT_PLAN_URL=%s\n' "$GLOBAL_PROJECT_PLAN_URL"
printf 'ACCESS_MAP_URL=%s\n' "$ACCESS_MAP_URL"
printf 'XS_MAP_URL=%s\n' "$XS_MAP_URL"
printf 'VM100_PUBLIC_URL=%s\n' "$VM100_PUBLIC_URL"
printf 'VM101_PUBLIC_URL=%s\n' "$VM101_PUBLIC_URL"
printf 'VM121_PUBLIC_URL=%s\n' "$VM121_PUBLIC_URL"
printf 'VM101_MODEL_URL=%s\n' "$VM101_MODEL_URL"
printf 'VM101_METHODS_URL=%s\n' "$VM101_METHODS_URL"
printf 'VM130_SOURCE_URL=%s\n' "$VM130_SOURCE_URL"
printf 'FACTS_URL=%s\n' "$FACTS_URL"
printf 'VERIFY_URL=%s\n' "$VERIFY_URL"
printf 'ROLLBACK_URL=%s\n' "$ROLLBACK_URL"
printf 'ARCHITECTURE_PLAN_URL=%s\n' "$ARCHITECTURE_PLAN_URL"
