Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
8439875
feat(memory): persist versioned source evidence
MaoMengww Oct 14, 2026
5dfa2ad
feat(memory): verify historical evidence during projection rebuild
MaoMengww Oct 14, 2026
034e0cc
fix(memory): enforce evidence schema safety and backend conformance
MaoMengww Oct 14, 2026
4d1bf17
fix(memory): preserve unrelated database inspection
MaoMengww Oct 14, 2026
cf8068a
test(memory): consolidate source evidence E2E acceptance
MaoMengww Oct 14, 2026
dd1d128
merge: integrate upstream artifact handles with evidence migration
MaoMengww Oct 14, 2026
0d70cba
fix(memory): verify evidence against retained source material
MaoMengww Oct 15, 2026
3305b6b
fix(sources): align remote payload aliases with manifests
MaoMengww Oct 15, 2026
c9ee82d
fix(sources): preserve envelope keys with alias generators
MaoMengww Oct 16, 2026
dc9b6a1
fix(sources): align envelope validation with serialization
MaoMengww Oct 17, 2026
8ee3aba
fix(memory): preserve source identity and shared evidence
MaoMengww Oct 18, 2026
6a836b1
fix(sqlite): preserve startup catalog compatibility
MaoMengww Oct 19, 2026
b5a4c1e
fix(sources): keep unverifiable evidence neutral
MaoMengww Oct 19, 2026
40d6c80
Merge upstream master into source evidence declarations
MaoMengww Oct 19, 2026
2bce54e
fix(sources): reject omitted identity before capture
MaoMengww Oct 19, 2026
bb36c93
fix(sources): reject transformed identity before capture
MaoMengww Oct 19, 2026
88cd8f2
Merge upstream master into source evidence declarations
MaoMengww Oct 19, 2026
73ec5aa
fix(sources): separate worker and historical identity decoding
MaoMengww Oct 20, 2026
25d9e7a
fix(sources): disambiguate canonical history from business aliases
MaoMengww Oct 20, 2026
5ceed57
fix(sources): normalize recursive transport root schemas
MaoMengww Oct 20, 2026
f4ca7f8
merge: integrate upstream retrieval lifecycle validation
MaoMengww Oct 20, 2026
2b95df6
fix(sources): preserve versioned alias compatibility
MaoMengww Oct 21, 2026
1e67e5d
chore(migrations): initialize issue 2154 implementation branch
Zxf-xufeng Oct 21, 2026
13517fd
fix(sources): keep upgraded alias definitions compatible
MaoMengww Oct 21, 2026
579b67e
fix(migrations): parse arithmetic CHECK constraints
Zxf-xufeng Oct 21, 2026
d7f2d89
ci(release): gate database upgrade support on installed artifacts
Zxf-xufeng Oct 21, 2026
c4fc8ab
fix(migrations): preserve literal percent in CHECK validation
Zxf-xufeng Oct 22, 2026
eff8bac
ci(release): discover upgrade sources and exercise embedded seekdb
Zxf-xufeng Oct 22, 2026
2be0739
ci(release): pin upgrade baseline and add OceanBase coverage
Zxf-xufeng Oct 22, 2026
76d4863
fix(ci): select OceanBase for the historical upgrade fixture
Zxf-xufeng Oct 22, 2026
8391cf9
fix(ci): provide OceanBase maintenance coordination options
Zxf-xufeng Oct 22, 2026
3c5c0ec
merge: sync upstream master and refresh the atomic maintenance baseline
MaoMengww Oct 21, 2026
fd4173d
ci(release): require successful full database upgrades
Zxf-xufeng Oct 22, 2026
7941a90
test(release): use embedded-compatible Server roles
Zxf-xufeng Oct 22, 2026
3b27a25
Merge remote-tracking branch 'origin/master' into codex/2084-full-ser…
AlexStocks Oct 22, 2026
10efc32
fix(release): normalize review hashes and validate all artifacts
Zxf-xufeng Oct 22, 2026
8b7ec35
feat(migrations): recognize complete released SQLite Server schemas
AlexStocks Oct 22, 2026
e44c8b7
Merge commit '3c5c0eccdfc65da04c509c005fe230252990d00a' into codex/20…
AlexStocks Oct 22, 2026
8f3c0d6
Merge commit 'refs/pull/2178/head' of https://github.com/oceanbase/po…
AlexStocks Oct 22, 2026
3a8b38b
fix(sources): preserve stable remote manifest fingerprints
MaoMengww Oct 22, 2026
8a89520
feat(migrations): register immutable MySQL schema layout fragments
AlexStocks Oct 22, 2026
01c680b
Merge remote-tracking branch 'origin/master' into codex/2084-full-ser…
AlexStocks Oct 22, 2026
8662724
Merge commit '3a8b38be1037672010f0bba1597060a9994c4dd3' into codex/20…
AlexStocks Oct 22, 2026
881335f
feat(migrations): recognize complete released seekDB Server schemas
AlexStocks Oct 22, 2026
54f8802
feat(migrations): execute registered MySQL revision wrappers
AlexStocks Oct 22, 2026
9e0088b
fix(migrations): bind plans to target Processing declarations
AlexStocks Oct 22, 2026
bcd3657
feat(migrations): recognize complete OceanBase Server baseline
AlexStocks Oct 22, 2026
5e23222
feat(migrations): complete registered Server upgrade path
Zxf-xufeng Oct 22, 2026
4f53f05
feat(migrations): integrate OceanBase baseline and execution registra…
Zxf-xufeng Oct 22, 2026
dc6e188
fix(migrations): validate durable task ownership before admission
Zxf-xufeng Oct 22, 2026
29f0512
fix(migrations): preserve Server resource checksums across checkouts
AlexStocks Oct 22, 2026
0a89ec7
test(upgrades): shut down embedded servers gracefully
Zxf-xufeng Oct 22, 2026
72b16a7
test(migrations): align startup guards with full Server readiness
AlexStocks Oct 22, 2026
e2e91ac
Merge commit '0a89ec706db5f016c3efa698ca3fbe831f549f11' into codex/20…
AlexStocks Oct 22, 2026
69fd6ee
test(migrations): exercise installed background workers after upgrade
AlexStocks Oct 22, 2026
c615a90
fix(migrations): allow worker takeover after Server upgrade
AlexStocks Oct 22, 2026
3c3e866
refactor(migrations): separate Source evidence feature from upgrade f…
Zxf-xufeng Oct 22, 2026
5b58308
merge: preserve upstream worker takeover fix after feature separation
Zxf-xufeng Oct 22, 2026
0ba95e9
merge: reconcile upgrade compatibility review with current master
AlexStocks Oct 22, 2026
1a1b159
test(server): initialize OceanBase acceptance storage explicitly
AlexStocks Oct 22, 2026
aa15b5f
test(server): prepare managed storage before fixture seeding
AlexStocks Oct 22, 2026
bc235ff
fix(storage): preserve canonical schema in legacy tag maintenance
AlexStocks Oct 22, 2026
110cecc
test(server): migrate legacy fixtures before normal admission
AlexStocks Oct 22, 2026
8c581a0
fix(migrations): register the offline Memory archive
AlexStocks Oct 22, 2026
f7a328c
fix(migrations): connect managed upgrades to local service maintenance
AlexStocks Oct 22, 2026
3ade379
fix(e2e): initialize managed OceanBase before Compose startup
AlexStocks Oct 22, 2026
9b7bd48
test(migrations): exercise managed upgrades with native services
AlexStocks Oct 22, 2026
0270f63
test(migrations): cover native full Server interruption recovery
AlexStocks Oct 22, 2026
752477f
fix(ci): retain bounded seekDB upgrade diagnostics
AlexStocks Oct 22, 2026
20f2c12
feat(migrations): coordinate managed Processing maintenance
AlexStocks Oct 22, 2026
0a1056f
chore(release): review managed Processing maintenance
AlexStocks Oct 22, 2026
70c73c1
fix(ci): retain installed Desktop fixture Server diagnostics
AlexStocks Oct 22, 2026
015026c
fix(migrations): delegate managed Atomic conversion to the Server chain
AlexStocks Oct 22, 2026
c0e585e
test(desktop): retain diagnostics for both isolated Server harnesses
AlexStocks Oct 22, 2026
3a62282
test(migrations): isolate native CLI capture from live SQL logging
AlexStocks Oct 22, 2026
cbad742
fix(migrations): coordinate managed Atomic projection repair
AlexStocks Oct 22, 2026
0a7a749
test(kimi): retain bounded Server startup failure evidence
AlexStocks Oct 22, 2026
1c24549
fix(migrations): prevent Topic bundle writes to managed storage
AlexStocks Oct 22, 2026
be53c1b
fix(server): avoid identity schema DDL on managed storage
AlexStocks Oct 22, 2026
f8c9487
docs(migrations): inventory startup and maintenance ownership
AlexStocks Oct 22, 2026
4fe1309
test(service): cover native upgrades from installed 1.3.0
AlexStocks Oct 22, 2026
66962ec
test(migrations): recover after an OceanBase client exits
AlexStocks Oct 22, 2026
d64d6b5
ci(migrations): budget the full native Server acceptance suite
AlexStocks Oct 22, 2026
793861b
test(service): retry installed upgrades after backup failure
AlexStocks Oct 22, 2026
3c99205
fix(migrations): preserve separate Code caches through Server upgrades
AlexStocks Oct 22, 2026
cb40660
test(upgrades): accept installed Code configuration and query status
AlexStocks Oct 22, 2026
f22862e
test(code): initialize Server storage before SDK fixture writes
AlexStocks Oct 22, 2026
9f20986
test(service): recover installed upgrades after switch and startup fa…
AlexStocks Oct 22, 2026
772ab5e
test(migrations): verify recovery after an OceanBase engine crash
AlexStocks Oct 22, 2026
017abf5
fix(ci): create the engine recovery evidence parent before pytest
AlexStocks Oct 22, 2026
5563b65
test(service): bind the Unix startup conflict after TIME_WAIT
AlexStocks Oct 22, 2026
35ed35c
feat(migrations): register the embedded seekDB Code schema
AlexStocks Oct 23, 2026
a60065b
test(migrations): exercise installed SQLite backup restoration
AlexStocks Oct 23, 2026
e645a24
fix(migrations): reflect native vector index definitions explicitly
AlexStocks Oct 23, 2026
5f769d6
feat(migrations): register exact Server vector profiles
AlexStocks Oct 23, 2026
a8643b8
test(upgrades): require installed vector profiles across backends
AlexStocks Oct 23, 2026
747dac3
fix(migrations): reject incomplete projections before admission
Zxf-xufeng Oct 23, 2026
3ad35d6
test(server): initialize managed authorization fixtures before startup
AlexStocks Oct 23, 2026
04a33ff
fix(runtime): validate managed SQLite without reserving the writer
AlexStocks Oct 23, 2026
23323a4
fix(migrations): pin SQLite startup validation snapshot
Zxf-xufeng Oct 23, 2026
1f6c89c
test(migrations): initialize long-query storage before event loop
Zxf-xufeng Oct 23, 2026
0b1d6f3
ci(oceanbase): budget isolated long-query acceptance (#2211)
AlexStocks Oct 23, 2026
8f10c56
fix(migrations): resolve review gaps after syncing master
Zxf-xufeng Oct 24, 2026
c3d642d
fix(migrations): register native portable receipt boolean
Zxf-xufeng Oct 24, 2026
135838e
fix(desktop): qualify current Server protocol
Zxf-xufeng Oct 24, 2026
d12e791
fix(ci): stabilize isolated migration validation
Zxf-xufeng Oct 24, 2026
9b457be
fix(migrations): guard background startup and upgrade cleanup
Zxf-xufeng Oct 24, 2026
a23424a
fix(migrations): classify profile drift and sync master
Zxf-xufeng Oct 25, 2026
d3490d6
test(service): drain startup-conflict probe connections
Zxf-xufeng Oct 25, 2026
1df6c18
ci(e2e): budget OceanBase acceptance phases
Zxf-xufeng Oct 25, 2026
b8ee365
ci(upgrades): size recovery storage and retain diagnostics
Zxf-xufeng Oct 25, 2026
6d055f0
fix(migrations): enforce complete snapshot readiness
Zxf-xufeng Oct 25, 2026
74bf2cd
feat(migrations): register the released 1.4.0 source bridge
Zxf-xufeng Oct 25, 2026
630e498
chore: sync master and preserve Desktop qualifications
Zxf-xufeng Oct 25, 2026
3a3569b
fix(migrations): enforce shared maintenance admission
Zxf-xufeng Oct 25, 2026
65ab7ef
fix(migrations): avoid row locks during readiness checks
Zxf-xufeng Oct 26, 2026
e8889da
feat(migrations): name upgrade steps for PowerContext 1.4.1
Zxf-xufeng Oct 26, 2026
dd62723
ci(upgrades): keep only the 1.3.0 acceptance source
Zxf-xufeng Oct 26, 2026
ecdec7a
fix(ci): complete 1.4.1 validation and isolate recovery deadlines
Zxf-xufeng Oct 26, 2026
bf18162
ci(upgrades): run disjoint release configurations in parallel
Zxf-xufeng Oct 26, 2026
b2592fb
test(upgrades): retain artifact integrity checks across workers
Zxf-xufeng Oct 26, 2026
c90fcd1
fix(migrations): enforce startup maintenance admission
Zxf-xufeng Oct 26, 2026
e11c7ea
fix(migrations): reject unfinished domain maintenance in full admission
Zxf-xufeng Oct 26, 2026
eb91c22
test(ci): align migration and release probes with shared entry points
Zxf-xufeng Oct 26, 2026
babb51f
ci(upgrades): make seekdb Code acceptance manual
Zxf-xufeng Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,8 @@ integrations/dsh/plugins/powercontext/lib/*.js text eol=lf
integrations/dsh/plugins/powercontext/lib/*.d.ts text eol=lf
# Generated guidance compares canonical bytes; keep user notes outside its markers untouched.
integrations/**/skills/powercontext-project-context/** text eol=lf
# Migration evidence hashes exact resource bytes on every platform.
src/powercontext/builtin/persistence/migrations/resources/** text eol=lf
src/powercontext/builtin/persistence/migrations/mysql_resources/** text eol=lf
src/powercontext/builtin/persistence/migrations/server_resources/** text eol=lf
src/powercontext/builtin/persistence/migration_resources/** text eol=lf
82 changes: 82 additions & 0 deletions .github/actions/setup-upgrade-oceanbase/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
name: Setup upgrade OceanBase
description: Start the disposable MySQL tenant used by installed-release upgrade checks
runs:
using: composite
steps:
- name: Start and verify OceanBase
shell: bash
env:
OCEANBASE_IMAGE: ghcr.io/oceanbase/oceanbase-ce:4.3.5.6-106000012026040916
run: |
docker run --detach --name upgrade-oceanbase \
--publish 127.0.0.1:2881:2881 \
--ulimit nofile=65536:65536 \
--env MODE=slim \
--env OB_DATABASE=pc_upgrade_test \
--env OB_TENANT_PASSWORD=powercontext-e2e \
"$OCEANBASE_IMAGE"
for attempt in $(seq 1 120); do
if docker exec upgrade-oceanbase \
obclient -h127.0.0.1 -P2881 -uroot@test -ppowercontext-e2e \
-Dpc_upgrade_test -e 'SELECT 1' >/dev/null 2>&1; then
# The slim image's default 1 GB maximum is too small for the
# indexes created across the clean migration acceptance cases.
docker exec upgrade-oceanbase \
obclient -h127.0.0.1 -P2881 -uroot@sys \
-e "ALTER SYSTEM SET datafile_maxsize='8G'; ALTER SYSTEM SET datafile_next='512M'; ALTER SYSTEM SET datafile_size='4G';"
datafile_ready=false
for config_attempt in $(seq 1 30); do
docker exec upgrade-oceanbase \
obclient -h127.0.0.1 -P2881 -uroot@sys --batch --skip-column-names \
-e "SHOW PARAMETERS WHERE name IN ('datafile_size', 'datafile_maxsize', 'datafile_next');" \
> "$RUNNER_TEMP/upgrade-datafile.tsv"
if awk '
$5 == "datafile_size" && $7 == "4G" { size = 1 }
$5 == "datafile_maxsize" && $7 == "8G" { maximum = 1 }
$5 == "datafile_next" && $7 == "512M" { increment = 1 }
END { exit !(size && maximum && increment) }
' "$RUNNER_TEMP/upgrade-datafile.tsv"; then
datafile_ready=true
break
fi
sleep 2
done
cat "$RUNNER_TEMP/upgrade-datafile.tsv"
if [ "$datafile_ready" != true ]; then
echo 'OceanBase datafile configuration did not become effective within one minute.' >&2
exit 1
fi
docker exec upgrade-oceanbase \
obclient -h127.0.0.1 -P2881 -uroot@test -ppowercontext-e2e \
-Dpc_upgrade_test \
-e "
CREATE DATABASE pc_upgrade_fresh;
CREATE DATABASE pc_upgrade_code_test;
CREATE DATABASE pc_upgrade_code_fresh;
CREATE DATABASE pc_upgrade_vector_test;
CREATE DATABASE pc_upgrade_vector_fresh;
CREATE DATABASE pc_upgrade_vector_code_test;
CREATE DATABASE pc_upgrade_vector_code_fresh;
CREATE DATABASE pc_upgrade_140_test;
CREATE DATABASE pc_upgrade_140_fresh;
CREATE DATABASE pc_upgrade_140_code_test;
CREATE DATABASE pc_upgrade_140_code_fresh;
CREATE DATABASE pc_upgrade_140_vector_test;
CREATE DATABASE pc_upgrade_140_vector_fresh;
CREATE DATABASE pc_upgrade_140_vector_code_test;
CREATE DATABASE pc_upgrade_140_vector_code_fresh;
SET GLOBAL recyclebin=OFF;
SELECT VERSION();
SHOW VARIABLES LIKE 'ob_compatibility_mode';
SHOW VARIABLES LIKE 'recyclebin';
"
exit 0
fi
if [ "$(docker inspect --format '{{.State.Running}}' upgrade-oceanbase)" != true ]; then
echo 'OceanBase exited before becoming ready.' >&2
exit 1
fi
sleep 5
done
echo 'OceanBase did not become ready within 10 minutes.' >&2
exit 1
70 changes: 70 additions & 0 deletions .github/workflows/candidate-schema-replay.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Candidate schema replay

on:
pull_request:
paths:
- src/powercontext/builtin/persistence/**
- src/powercontext/builtin/artifacts/**
- tests/builtin/persistence/**
- scripts/replay_candidate_migration.py
- .github/workflows/candidate-schema-replay.yml
- .github/actions/setup-upgrade-oceanbase/**
- pyproject.toml
- uv.lock
push:
branches: [master]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: candidate-replay-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
replay:
name: Candidate replay (${{ matrix.backend }})
runs-on: ubuntu-24.04
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
backend: [sqlite, seekdb, oceanbase]
env:
POWERCONTEXT_TEST_MIGRATION_SEEKDB: "1"
POWERCONTEXT_TEST_MIGRATION_OCEANBASE_URL: mysql+aoceanbase://root%40test:powercontext-e2e@127.0.0.1:2881/pc_migration_probe_candidate_replay?charset=utf8mb4
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up Python
uses: ./.github/actions/setup-python-env
- name: Start isolated OceanBase
if: matrix.backend == 'oceanbase'
uses: ./.github/actions/setup-upgrade-oceanbase
- name: Create the scratch database namespace
if: matrix.backend == 'oceanbase'
run: >-
docker exec upgrade-oceanbase
obclient -h127.0.0.1 -P2881 -uroot@test -ppowercontext-e2e
-e 'CREATE DATABASE pc_migration_probe_candidate_replay'
- name: Replay and recover the frozen Candidate conversion without skips
run: >-
uv run --locked --extra seekdb python scripts/replay_candidate_migration.py
${{ matrix.backend }} --output "$RUNNER_TEMP/candidate-replay"
- name: Preserve OceanBase diagnostics
if: always() && matrix.backend == 'oceanbase'
run: |
mkdir -p "$RUNNER_TEMP/candidate-replay"
docker logs upgrade-oceanbase > "$RUNNER_TEMP/candidate-replay/oceanbase.log" 2>&1 || true
docker stop --timeout 30 upgrade-oceanbase || true
- name: Save generated inventories and comparisons
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
with:
name: candidate-replay-${{ matrix.backend }}-${{ github.sha }}
path: ${{ runner.temp }}/candidate-replay/
if-no-files-found: error
retention-days: 14
63 changes: 63 additions & 0 deletions .github/workflows/capture-release-schema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: Capture released Server schema

on:
pull_request:
paths:
- scripts/capture_release_schema.py
- scripts/upgrade_database_probe.py
- scripts/upgrade_process.py
- tests/release_upgrades/test_full_server.py
- .github/workflows/capture-release-schema.yml
- .github/actions/setup-upgrade-oceanbase/**
workflow_dispatch:

permissions:
contents: read

concurrency:
group: release-schema-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
capture:
name: Capture 1.4.0 (${{ matrix.backend }}, ${{ matrix.configuration }})
runs-on: ubuntu-24.04
timeout-minutes: 45
strategy:
fail-fast: false
matrix:
backend: [sqlite, seekdb, oceanbase]
configuration: [full-server-no-vector, full-server-code, full-server-vector, full-server-vector-code]
env:
PC_UPGRADE_OCEANBASE_URL: mysql+aoceanbase://root%40test:powercontext-e2e@127.0.0.1:2881/pc_upgrade_test?charset=utf8mb4
steps:
- name: Check out
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
persist-credentials: false
- name: Set up Python
uses: ./.github/actions/setup-python-env
- name: Start isolated OceanBase
if: matrix.backend == 'oceanbase'
uses: ./.github/actions/setup-upgrade-oceanbase
- name: Capture installed release without current runtime initialization
run: >-
.venv/bin/python scripts/upgrade_process.py
--parent-pid $$ --timeout 1800 --shutdown-timeout 60 --
.venv/bin/python scripts/capture_release_schema.py
${{ matrix.backend }} --configuration ${{ matrix.configuration }}
--output "$RUNNER_TEMP/release-schema"
- name: Preserve OceanBase diagnostics
if: always() && matrix.backend == 'oceanbase'
run: |
mkdir -p "$RUNNER_TEMP/release-schema"
docker logs upgrade-oceanbase > "$RUNNER_TEMP/release-schema/oceanbase.log" 2>&1 || true
docker stop --timeout 30 upgrade-oceanbase || true
- name: Save source schema and provenance
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
with:
name: release-1.4.0-${{ matrix.backend }}-${{ matrix.configuration }}-${{ github.sha }}
path: ${{ runner.temp }}/release-schema/
if-no-files-found: error
retention-days: 30
2 changes: 2 additions & 0 deletions .github/workflows/desktop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -134,13 +134,15 @@ jobs:
desktop/.artifacts/windows-smoke.json
desktop/.artifacts/ci-compatibility.json
desktop/.artifacts/real-server.json
desktop/.artifacts/real-server-*/
desktop/.artifacts/real-cli.json
desktop/.artifacts/installed-ui.json
desktop/.artifacts/installed-ui.png
desktop/.artifacts/installed-ui-driver.log
desktop/.artifacts/installed-ui-app.log
desktop/.artifacts/installed-ui-processes.json
desktop/.artifacts/installed-ui-window.png
desktop/.artifacts/installed-ui-server-*/
# Early validation failures can leave no installer or acceptance evidence.
# Still reject missing artifacts when every preceding step succeeded.
if-no-files-found: ${{ job.status == 'success' && 'error' || 'warn' }}
Expand Down
Loading
Loading