Skip to content

Commit 684a306

Browse files
2026.10.17.1: an upgrade does not replace installed payloads inside a build; a dangling record does not fail every build; doctor reads, it does not change (#815)
## What changes - **Intent (D3).** `Fetcher::resolve_xpkg_path` takes a `PayloadIntent`: `Use` (build, run, test, pack, the runtime, host tools) takes a payload the provider calls usable and installs or replaces only one that is not; `Provision` (`mcpp toolchain install`) takes the index's current packaging; `Locate` never installs. A replacement says why (`Updating llvm@23.1.3 packaging revision 0 → 1 (revision 0 is below the index's floor 1)`). - **Failure (D5).** By the provider's error code: a deterministic refusal is neither retried through the command line nor followed by an index refresh, and its hint does not say retry; only `E_NOT_FOUND` refreshes, with a reason that is true (`could not be installed; the index may predate it`). A failed replacement of a usable payload names the revision still in use. - **Currency where a person looks (D6).** `mcpp index update` lists installed payloads the refreshed index packages anew; `mcpp toolchain list` marks them (JSON `installedRevision` / `availableRevision`). - **doctor (D7).** Read-only: one offline `prepare_build`; the toolchain it reports is what a build here uses (the configured default outside a package) with its payload's revision; a build that would install first is reported as that; mcpp's package home is summarized from xlings `binding_state`. - **Identity (D8).** A toolchain payload's revision above 0 enters the driver identity (`payload-revision: <n>`). - **xlings 2026.10.17.1** (openxlings/xlings#678): `payload_status` reports `complete` / `usable` / `current` apart; `unmet()` requires `payload_currency` and `binding_state`; `scope_repaired` events are shown (`Repaired c++@16.1.0 in mcpp's package home had no registration; deactivated`). - **CI (D9).** `ci-upgrade.yml`: the previous release (read from GitHub at run time) builds a home; this commit's mcpp, laid out as a release, runs in it on Linux x86_64/aarch64, macOS and Windows; Linux adds an old-index variant (xim-pkgindex of 2026-10-07) and a dangling-record variant. ## Why After `xlings self update && xlings update mcpp -y`, a user's every `mcpp new && mcpp run` failed: `install of 'xim:llvm@23.1.3' failed ... sysroot update refused before metadata changed: c++@16.1.0: installed asset registration missing`. 2026.10.16.1 folded "is the packaging revision the index's" into "is the payload complete", and mcpp treated "not complete" as "not installed" inside the build; the replacement then met a dangling record of another package and failed on every run, while `mcpp self doctor` started the same replacement and reported `ok`. Measured on probe PR #814: a home of the previous release downloads gcc (101.7 MB), glibc (36.7 MB) and llvm on its first run after the upgrade, and the reported home fails with rc 101 on every run on x86_64 and aarch64. Design: .agents/docs/2026-10-17-upgrade-continuity-design.md. ## Tests - unit: `PmPayloadIntent.*` (the intent × usable × current matrix), `PmInstallFailurePolicy.*` (error code → refresh / retry). - e2e 918: a toolchain payload re-recorded at another revision builds with no install call, `toolchain list` offers the other packaging, doctor installs nothing. Fails on 2026.10.16.3 (it downloads glibc, binutils, linux-headers and fails). - ci-upgrade lane, run locally before push: orphan (the reported home) passes -- first run no download, `toolchain install` replaces llvm and reports the repaired record; snapshot passes -- `index update` names llvm 0 → 1 and glibc 2 → 4, no run downloads. Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
1 parent f481614 commit 684a306

63 files changed

Lines changed: 1578 additions & 167 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.agents/docs/2026-10-17-upgrade-continuity-design.md‎

Lines changed: 268 additions & 0 deletions
Large diffs are not rendered by default.

‎.agents/docs/README.md‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ superseded_by: 2026-09-07-....md # when status is superseded
1818
---
1919
```
2020

21-
332 records.
21+
333 records.
2222

2323
## By subject
2424

@@ -31,6 +31,7 @@ Records that declare one. Everything else is listed by date below.
3131

3232
### design
3333

34+
- [升级的连续性:打包修订不在使用路径上替换载荷、替换失败不拆掉可用状态、home 中的悬空记录自愈、真实的升级 lane](2026-10-17-upgrade-continuity-design.md) — active
3435
- [一处来源,一种含义:工作空间的传递语义、生成输出、模块角色与首次运行(#786、#785、#778、#790)](2026-10-10-one-source-one-meaning-design.md) — landed
3536
- [2026.10.5.3 发布方案:32 位 x86 的架构词汇、资源编译器的识别与增量(#776 后续)](2026-10-06-windows-x86-arch-vocabulary-and-rc-follow-ups-design.md) — active
3637
- [下一个版本的发布方案:标准库模块、原生 MSVC LTO 与导出发现、共享库的链接配置、Windows 参数引号(#768 后续、#770、#771)](2026-10-05-std-module-pair-msvc-lto-and-export-discovery-design.md) — active
@@ -129,6 +130,7 @@ Records that declare one. Everything else is listed by date below.
129130

130131
### 2026-10
131132

133+
- [升级的连续性:打包修订不在使用路径上替换载荷、替换失败不拆掉可用状态、home 中的悬空记录自愈、真实的升级 lane](2026-10-17-upgrade-continuity-design.md) — active
132134
- [mcpp 对 xlings 的依赖:Provider 端口、归属与位置、上游复用、系统级安装、payload 不可变、文件系统能力与长路径(#809)](2026-10-16-xlings-provider-port-and-shared-store-design.md) — active
133135
- [构建依赖的一条管线:配置与产物两轴、包的实例、库接口、兼容系统与工作空间收尾(#797)](2026-10-11-build-dependencies-one-pipeline-design.md) — active
134136
- [一处来源,一种含义:工作空间的传递语义、生成输出、模块角色与首次运行(#786、#785、#778、#790)](2026-10-10-one-source-one-meaning-design.md) — landed

‎.github/actions/bootstrap-mcpp/action.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ inputs:
3333
# `package.name`, so one of the two was simply unreachable — and which one
3434
# depended on the machine, which is why CI failed on `compat:lua` on
3535
# Windows and `mcpplibs.capi:lua` on Linux. Never pin below that.
36-
default: '2026.10.16.2'
36+
default: '2026.10.17.1'
3737

3838
outputs:
3939
sandbox-key:

‎.github/actions/setup-macos-llvm/action.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ inputs:
1515
# Floor imposed by the index, not a routine bump — see
1616
# .github/actions/bootstrap-mcpp/action.yml for why 0.4.69 is required
1717
# (two packages named `lua` in one repo need openxlings/xlings#381).
18-
default: '2026.10.16.2'
18+
default: '2026.10.17.1'
1919
image:
2020
description: >
2121
The runner label the job runs on (macos-15, xcode-27). It is part of the

‎.github/tools/upgrade_lane.sh‎

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
#!/usr/bin/env bash
2+
# upgrade_lane.sh <variant> <new-mcpp> <new-xlings> -- a home the previous
3+
# release made keeps working under this commit's mcpp (design 2026-10-17 D9).
4+
#
5+
# Every other lane starts from an empty home, so the installed packaging
6+
# revision always equals the index's and an upgrade is never executed. A user
7+
# upgraded to 2026.10.16.3 and every `mcpp run` failed from then on; nothing
8+
# in CI could see it. This lane builds the home with the PREVIOUS RELEASE --
9+
# the newest published release that is not this commit's version, read from
10+
# GitHub, so it moves forward with every release -- and then runs this
11+
# commit's mcpp in it, laid out as a release (bin/mcpp, registry/bin/xlings).
12+
#
13+
# variant:
14+
# plain the previous release installs from today's index.
15+
# snapshot the previous release installs from the xim index of 2026-10-07
16+
# (xim-pkgindex ebf1fbb): payloads genuinely of older packaging
17+
# revisions (llvm revision 0, gcc 16.1.0 before -r1).
18+
# orphan every payload recorded at another revision, and `c++` active at
19+
# gcc's version whose registration is gone (a reported home).
20+
#
21+
# Asserted, every variant: the first `mcpp new && mcpp run` of the new mcpp
22+
# succeeds and downloads nothing; a second run likewise; `mcpp self doctor`
23+
# in the project installs nothing and names the toolchain the build uses.
24+
# snapshot: `mcpp index update` names the newer packagings, the run after it
25+
# still downloads nothing, and `mcpp toolchain list` offers the new one.
26+
# orphan: `mcpp toolchain install` replaces the payload, and the dangling
27+
# record is reported as repaired instead of refusing the replacement.
28+
set -uo pipefail
29+
VARIANT="${1:?variant}"
30+
NEW_MCPP="${2:?new mcpp binary}"
31+
NEW_XLINGS="${3:?new xlings binary}"
32+
SNAPSHOT=ebf1fbb3417ec513b923279044433887b3af8850
33+
TC=llvm@23.1.3
34+
35+
unset MCPP_VENDORED_XLINGS MCPP MCPP_FRESH MCPP_BOOT XLINGS_HOME XLINGS_PROJECT_DIR XLINGS_ACTIVE_SUBOS
36+
W="${RUNNER_TEMP:-/tmp}/upgrade-lane"
37+
rm -rf "$W"; mkdir -p "$W"
38+
export MCPP_HOME="$W/home"
39+
REG="$MCPP_HOME/registry"
40+
PY=$(command -v python3 || command -v python)
41+
FAILED=0
42+
fail() { echo "::error::upgrade lane ($VARIANT): $*"; FAILED=1; }
43+
44+
case "$(uname -s)-$(uname -m)" in
45+
Linux-x86_64) PLAT=linux-x86_64; EXT=tar.gz; EXE= ;;
46+
Linux-aarch64) PLAT=linux-aarch64; EXT=tar.gz; EXE= ;;
47+
Darwin-arm64) PLAT=macosx-arm64; EXT=tar.gz; EXE= ;;
48+
MINGW*|MSYS*) PLAT=windows-x86_64; EXT=zip; EXE=.exe ;;
49+
*) echo "::error::unknown platform $(uname -a)"; exit 1 ;;
50+
esac
51+
IS_LINUX=0; [[ $PLAT == linux-* ]] && IS_LINUX=1
52+
53+
# ── the previous release ───────────────────────────────────────────────
54+
CURRENT=$(sed -n 's/^version *= *"\([^"]*\)".*/\1/p' mcpp.toml | head -1)
55+
OLD_VER=$(curl -fsSL ${GH_TOKEN:+-H "Authorization: Bearer $GH_TOKEN"} \
56+
"https://api.github.com/repos/mcpp-community/mcpp/releases?per_page=20" \
57+
| "$PY" -c '
58+
import json, sys
59+
current = sys.argv[1]
60+
for r in json.load(sys.stdin):
61+
v = r["tag_name"].lstrip("v")
62+
if not r["draft"] and not r["prerelease"] and v != current:
63+
print(v); break
64+
' "$CURRENT")
65+
case "$OLD_VER" in ''|*[!0-9.]*) echo "::error::no previous release resolved (got '$OLD_VER')"; exit 1 ;; esac
66+
echo "previous release: $OLD_VER; this commit: $CURRENT ($PLAT, variant $VARIANT)"
67+
68+
name="mcpp-$OLD_VER-$PLAT.$EXT"
69+
bash .github/tools/fetch_release.sh \
70+
"https://github.com/mcpp-community/mcpp/releases/download/v$OLD_VER/$name" "$W/$name" || exit 1
71+
mkdir -p "$W/x"
72+
if [[ $EXT == zip ]]; then
73+
"$PY" -c "import zipfile,sys; zipfile.ZipFile(sys.argv[1]).extractall(sys.argv[2])" "$W/$name" "$W/x"
74+
else
75+
tar xzf "$W/$name" -C "$W/x"
76+
fi
77+
mv "$W/x/mcpp-$OLD_VER-$PLAT" "$W/old"
78+
OLD="$W/old/bin/mcpp$EXE"
79+
mkdir -p "$W/new/bin" "$W/new/registry/bin"
80+
cp "$NEW_MCPP" "$W/new/bin/mcpp$EXE"
81+
cp "$NEW_XLINGS" "$W/new/registry/bin/xlings$EXE"
82+
chmod +x "$OLD" "$W/old/registry/bin/xlings$EXE" "$W/new/bin/mcpp$EXE" "$W/new/registry/bin/xlings$EXE" 2>/dev/null
83+
NEW="$W/new/bin/mcpp$EXE"
84+
"$OLD" --version; "$NEW" --version
85+
86+
# run <label> <dir> <bin> args...: the log is kept; returns the exit code.
87+
run() {
88+
local label=$1 dir=$2 bin=$3; shift 3
89+
echo "::group::$label: (cd $dir && mcpp $*)"
90+
(cd "$dir" && "$bin" "$@") > "$W/$label.log" 2>&1
91+
local rc=$?
92+
sed -e 's/\x1b\[[0-9;]*[A-Za-z]//g' "$W/$label.log" | tr '\r' '\n' | grep -v '^\s*Planning ' | tail -60
93+
echo "--> rc=$rc"
94+
echo "::endgroup::"
95+
return $rc
96+
}
97+
downloads() { grep -o "Downloading [^ ]*" "$W/$1.log" | sort -u | tr '\n' ' '; }
98+
new_project() { # <dir> <bin>
99+
(cd "$W" && "$2" new "$1" > /dev/null 2>&1) || mkdir -p "$W/$1"
100+
printf '\n[toolchain]\ndefault = "%s"\n' "$TC" >> "$W/$1/mcpp.toml"
101+
}
102+
103+
# ── the previous release builds the home ───────────────────────────────
104+
run old-env "$W" "$OLD" self env || fail "the previous release does not start"
105+
if [ "$VARIANT" = snapshot ]; then
106+
git clone -q --filter=blob:none https://github.com/openxlings/xim-pkgindex "$W/xpi" \
107+
&& git -C "$W/xpi" checkout -q "$SNAPSHOT" || { echo "::error::cannot fetch the snapshot index"; exit 1; }
108+
idx="$REG/data/xim-pkgindex"
109+
[ -d "$idx" ] || idx=$(find "$MCPP_HOME" -type d -name xim-pkgindex | head -1)
110+
find "$idx" -mindepth 1 -maxdepth 1 ! -name .xlings-index-version -exec rm -rf {} +
111+
(cd "$W/xpi" && git archive HEAD) | tar x -C "$idx"
112+
echo "llvm.lua revisions now: $(grep -o 'revision = [0-9]*' "$idx/pkgs/l/llvm.lua" | sort -u | tr '\n' ' ')"
113+
fi
114+
run old-tc "$W" "$OLD" toolchain install "$TC" || fail "the previous release cannot install $TC"
115+
[ "$VARIANT" = orphan ] && { run old-tc-gcc "$W" "$OLD" toolchain install gcc@16.1.0 || fail "the previous release cannot install gcc"; }
116+
new_project p-old "$OLD"
117+
run old-run "$W/p-old" "$OLD" run || fail "the previous release cannot run a new project"
118+
119+
if [ "$VARIANT" = orphan ]; then
120+
"$PY" - "$REG" <<'PY' || fail "could not shape the orphan home"
121+
import glob, json, os, sys
122+
reg = sys.argv[1]
123+
for f in glob.glob(os.path.join(reg, "data", "xpkgs", "xim-x-*", "*", ".xpkg-install.json")):
124+
d = json.load(open(f)); r = d.get("revision", 0)
125+
d["revision"] = 1 if r == 0 else r - 1
126+
json.dump(d, open(f, "w"), indent=2)
127+
wsf = os.path.join(reg, "subos", "default", ".xlings.json")
128+
wsdoc = json.load(open(wsf)); ws = wsdoc["workspace"]
129+
dbf = os.path.join(reg, "data", "versions.json")
130+
src = json.load(open(dbf))["versions"] if os.path.exists(dbf) else json.load(open(os.path.join(reg, ".xlings.json")))["versions"]
131+
owners = {k: (v.get("bindingGroup") or {}).get("provider") for k, v in src.get("c++", {}).get("versions", {}).items()}
132+
keys = [k for k, p in owners.items() if p and "gcc" in p]
133+
if not keys: sys.exit("no gcc-owned c++ registration: %r" % owners)
134+
key = keys[0]
135+
entry = ws.get("c++")
136+
if isinstance(entry, dict): entry["active"] = key
137+
else: ws["c++"] = key
138+
json.dump(wsdoc, open(wsf, "w"))
139+
for path in (dbf, os.path.join(reg, ".xlings.json")):
140+
if not os.path.exists(path): continue
141+
doc = json.load(open(path)); c = doc.get("versions", {}).get("c++", {})
142+
c.get("versions", {}).pop(key, None)
143+
for edges in c.get("bindings", {}).values(): edges.pop(key, None)
144+
json.dump(doc, open(path, "w"))
145+
print("c++ active at %s, its registration removed" % key)
146+
PY
147+
fi
148+
149+
# ── this commit's mcpp in that home ────────────────────────────────────
150+
if [ "$VARIANT" = snapshot ]; then
151+
run new-run-on-old-index "$W/p-old" "$NEW" run || fail "the old project does not run on the old index"
152+
[ -z "$(downloads new-run-on-old-index)" ] || fail "the run on the old index downloaded: $(downloads new-run-on-old-index)"
153+
run new-index-update "$W" "$NEW" index update || fail "index update failed"
154+
grep -q "newer packagings" "$W/new-index-update.log" \
155+
|| fail "index update does not name the newer packagings of installed payloads"
156+
fi
157+
new_project p-new "$NEW"
158+
run new-run1 "$W/p-new" "$NEW" run || fail "the first run of the new mcpp failed"
159+
[ -z "$(downloads new-run1)" ] || fail "the first run downloaded: $(downloads new-run1)"
160+
# A payload replaced names its package (`Updating llvm@23.1.3 packaging
161+
# revision 0 → 1`); the vendored xlings update is not one.
162+
grep -Eq "^\s*(Updating|Reinstalling) [^ ]+@" "$W/new-run1.log" && fail "the first run replaced a payload"
163+
run new-run2 "$W/p-new" "$NEW" run || fail "the second run failed"
164+
[ -z "$(downloads new-run2)" ] || fail "the second run downloaded: $(downloads new-run2)"
165+
run new-run-old-project "$W/p-old" "$NEW" run || fail "the project the previous release made does not run"
166+
[ -z "$(downloads new-run-old-project)" ] || fail "the old project's run downloaded: $(downloads new-run-old-project)"
167+
168+
run new-doctor "$W/p-new" "$NEW" self doctor
169+
[ -z "$(downloads new-doctor)" ] || fail "doctor downloaded: $(downloads new-doctor)"
170+
grep -q "what a build here uses" "$W/new-doctor.log" || fail "doctor does not name the toolchain the build uses"
171+
172+
if [ "$VARIANT" = snapshot ]; then
173+
run new-toolchain-list "$W" "$NEW" toolchain list || fail "toolchain list failed"
174+
grep -q "packaging revision .* available" "$W/new-toolchain-list.log" \
175+
|| fail "toolchain list does not offer the newer packaging"
176+
fi
177+
if [ "$VARIANT" = orphan ]; then
178+
run new-provision "$W" "$NEW" toolchain install "$TC" || fail "toolchain install could not replace the payload"
179+
grep -q "installed asset registration missing" "$W/new-provision.log" \
180+
&& fail "the replacement was refused by the dangling record"
181+
grep -qi "deactivated\|dangling" "$W/new-provision.log" \
182+
|| fail "the repaired record is not reported"
183+
run new-run-after-provision "$W/p-new" "$NEW" run || fail "the run after the replacement failed"
184+
fi
185+
186+
{
187+
echo "### upgrade lane: $PLAT / $VARIANT ($OLD_VER → $CURRENT)"
188+
echo
189+
for l in "$W"/*.log; do
190+
b=$(basename "$l" .log)
191+
echo "- \`$b\`: downloads [$(downloads "$b")]"
192+
done
193+
} >> "${GITHUB_STEP_SUMMARY:-/dev/null}"
194+
mkdir -p "${GITHUB_WORKSPACE:-.}/upgrade-lane-logs"
195+
cp "$W"/*.log "${GITHUB_WORKSPACE:-.}/upgrade-lane-logs/" 2>/dev/null || true
196+
[ "$FAILED" = 0 ] && echo "PASS: upgrade lane ($VARIANT)"
197+
exit "$FAILED"

‎.github/workflows/bootstrap-macos.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
# Dormant (workflow_dispatch only), but kept in step with the rest —
1818
# check_version_pins.sh holds it there. Floor: 0.4.69, below which the
1919
# index cannot resolve two packages that share a short name.
20-
XLINGS_VERSION: '2026.10.16.2'
20+
XLINGS_VERSION: '2026.10.17.1'
2121
steps:
2222
- uses: actions/checkout@v4
2323

‎.github/workflows/ci-bootstrap.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ jobs:
4141
os: [ubuntu-24.04, macos-15, windows-2025]
4242
env:
4343
XLINGS_NON_INTERACTIVE: '1'
44-
XLINGS_VERSION: '2026.10.16.2'
44+
XLINGS_VERSION: '2026.10.17.1'
4545
steps:
4646
- uses: actions/checkout@v4
4747

@@ -50,7 +50,7 @@ jobs:
5050
shell: bash
5151
run: |
5252
set -euo pipefail
53-
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.16.2
53+
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.17.1
5454
echo "$HOME/.xlings/subos/current/bin" >> "$GITHUB_PATH"
5555
echo "$HOME/.xlings/bin" >> "$GITHUB_PATH"
5656
@@ -124,7 +124,7 @@ jobs:
124124
shell: bash
125125
run: |
126126
set -euo pipefail
127-
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.16.2
127+
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.17.1
128128
echo "$HOME/.xlings/subos/current/bin" >> "$GITHUB_PATH"
129129
130130
- name: Install the newest release and build the tree with it (mcpp build --strict)

‎.github/workflows/ci-fresh-install.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ jobs:
152152
env:
153153
XLINGS_NON_INTERACTIVE: '1'
154154
run: |
155-
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.16.2
155+
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.17.1
156156
echo "$HOME/.xlings/subos/current/bin" >> "$GITHUB_PATH"
157157
158158
- name: Install mcpp and config mirror
@@ -315,7 +315,7 @@ jobs:
315315

316316
- name: Install xlings + mcpp
317317
run: |
318-
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.16.2
318+
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.17.1
319319
# Deliberately NOT writing to $GITHUB_PATH here. On container
320320
# images that declare no PATH in their config (opensuse/
321321
# tumbleweed), appending a single dir to GITHUB_PATH makes the
@@ -464,7 +464,7 @@ jobs:
464464
# (older ones carry minos=15 and refuse to start).
465465
# v0.4.51+: in-process sha256 — this image has no sha256sum
466466
# binary, so pinned fetches failed before it.
467-
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.16.2
467+
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.17.1
468468
echo "$HOME/.xlings/subos/current/bin" >> "$GITHUB_PATH"
469469
470470
- name: Install mcpp and config mirror

‎.github/workflows/ci-linux-e2e.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ jobs:
414414
415415
- name: Bootstrap xlings + released mcpp
416416
run: |
417-
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.16.2
417+
curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/main/tools/other/quick_install.sh | bash -s v2026.10.17.1
418418
export PATH="$HOME/.xlings/subos/current/bin:$PATH"
419419
xlings update
420420
xlings install mcpp -y -g

‎.github/workflows/ci-upgrade.yml‎

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
name: ci-upgrade
2+
3+
# A home the previous release made keeps working under this commit's mcpp
4+
# (design .agents/docs/2026-10-17-upgrade-continuity-design.md, D9).
5+
#
6+
# Every other lane starts from an empty MCPP_HOME, so the packaging revision a
7+
# payload records always equals the index's, and an upgrade is never executed.
8+
# 2026.10.16.3 replaced every payload of an older revision inside the user's
9+
# next `mcpp run`, and on a home with one dangling record failed every run;
10+
# nothing in CI could see it. Here the PREVIOUS RELEASE (the newest published
11+
# one that is not this commit's version, read from GitHub at run time, so the
12+
# lane moves forward with every release) builds the home, and this commit's
13+
# binary, laid out as a release with the xlings it pins, runs in it.
14+
# .github/tools/upgrade_lane.sh holds the steps and the assertions.
15+
#
16+
# Called by ci.yml after each host's build, with the binary build.yml produced
17+
# (use-built-mcpp, rule R1 of the 2026-10-02 CI record).
18+
19+
on:
20+
workflow_call:
21+
22+
jobs:
23+
upgrade:
24+
name: upgrade from the previous release (${{ matrix.host }}, ${{ matrix.variant }})
25+
strategy:
26+
fail-fast: false
27+
matrix:
28+
include:
29+
- { host: linux-x86_64, runs-on: ubuntu-24.04, variant: plain }
30+
- { host: linux-x86_64, runs-on: ubuntu-24.04, variant: snapshot }
31+
- { host: linux-x86_64, runs-on: ubuntu-24.04, variant: orphan }
32+
- { host: linux-aarch64, runs-on: ubuntu-24.04-arm, variant: plain }
33+
- { host: macos-arm64, runs-on: macos-15, variant: plain }
34+
- { host: windows-x86_64, runs-on: windows-latest, variant: plain }
35+
runs-on: ${{ matrix.runs-on }}
36+
timeout-minutes: 60
37+
steps:
38+
- uses: actions/checkout@v4
39+
40+
- if: ${{ matrix.host != 'macos-arm64' }}
41+
uses: ./.github/actions/bootstrap-mcpp
42+
- if: ${{ matrix.host == 'macos-arm64' }}
43+
uses: ./.github/actions/setup-macos-llvm
44+
with:
45+
image: macos-15
46+
47+
- uses: ./.github/actions/use-built-mcpp
48+
with:
49+
host: ${{ matrix.host }}
50+
51+
- name: The previous release's home runs this commit's mcpp without downloading or failing (${{ matrix.variant }})
52+
shell: bash
53+
env:
54+
GH_TOKEN: ${{ github.token }}
55+
run: |
56+
test -x "$MCPP_VENDORED_XLINGS"
57+
bash .github/tools/upgrade_lane.sh "${{ matrix.variant }}" "$MCPP_FRESH" "$MCPP_VENDORED_XLINGS"
58+
59+
- uses: actions/upload-artifact@v4
60+
if: always()
61+
with:
62+
name: upgrade-lane-${{ matrix.host }}-${{ matrix.variant }}
63+
path: upgrade-lane-logs/
64+
if-no-files-found: ignore

0 commit comments

Comments
 (0)