Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
c57837b
Fix Bun patch compatibility and refusals
mikolalysenko Sep 18, 2026
cfc1e96
Keep Bun compatibility probes nonblocking
mikolalysenko Sep 18, 2026
d475268
Guard Bun manifests for explicit patch retrieval
mikolalysenko Sep 18, 2026
b316a06
fix(bun): claim and replay bun.lock hosted edits per purl in the take…
mikolalysenko Sep 18, 2026
3730d83
fix(vendor): probe the hosted takeover on dry runs instead of promisi…
mikolalysenko Sep 18, 2026
53d92b8
test(bun): hermetic hosted->vendored takeover, dry-run and scoped unw…
mikolalysenko Sep 18, 2026
65cb920
fix(process): shared PATH tool resolver — absolute entries only, PATH…
mikolalysenko Sep 18, 2026
8f28ab6
fix(bun): rollback restores bun.lockb from the redirect ledger
mikolalysenko Sep 18, 2026
77c9e9f
fix(bun): truthful bun.lockb migration ledger, manual-migration code,…
mikolalysenko Sep 18, 2026
93039f6
test(bun): shim-driven lockb migration + rollback round trips, Window…
mikolalysenko Sep 18, 2026
1d10690
test(redirect): golden harness pins warning codes via optional expect…
mikolalysenko Sep 21, 2026
9f92f74
fix(bun): one actionable lockfileVersion refusal message for hosted a…
mikolalysenko Sep 21, 2026
a1b0ea0
fix(bun): true remedy for the v0 workspace refusal, pinned on real bu…
mikolalysenko Sep 21, 2026
532c40b
fix(bun): keep CRLF on the rewritten hosted bun.lock line
mikolalysenko Sep 21, 2026
e1558e0
test(bun): golden fixtures for the stale-URL re-pin and bun's alias s…
mikolalysenko Sep 21, 2026
4e1d8dd
fix(bun): gate the vendored workspace refusal on the classified insta…
mikolalysenko Sep 18, 2026
11d1d56
fix(bun): surface a bun.lockb-only project as a scan diagnosis instea…
mikolalysenko Sep 18, 2026
4a767c2
test(bun): run the repair flavor suite over bun lockfileVersion {0,1,…
mikolalysenko Sep 18, 2026
436891f
fix(bun): preflight every vendored download path, keep refusals visib…
mikolalysenko Sep 18, 2026
5bf38f2
test(bun): hermetic CLI coverage for the vendored Bun preflight
mikolalysenko Sep 18, 2026
3f3e4c2
test(bun): hard-fail gates, lock-era assertions, 1.3.10 digest bounda…
mikolalysenko Sep 18, 2026
741e94d
test(bun): accept lockfileVersion 0, hard-fail gates, tampered twin, …
mikolalysenko Sep 18, 2026
fad247f
test(bun): real-bun scoped dependency-bearing legs — {dependencies, b…
mikolalysenko Sep 18, 2026
c9efd61
ci: run the hermetic real-bun e2e suites in the e2e matrix
mikolalysenko Sep 18, 2026
811a425
ci(bun): main trigger, wider paths, verified retried bun download, di…
mikolalysenko Sep 18, 2026
55e2124
test(bun): un-ignore the already-vendored workspace re-run now the ga…
mikolalysenko Sep 21, 2026
4562de5
test(bun): real-bun hosted<->vendored mode-migration suite (takeover,…
mikolalysenko Sep 21, 2026
b4a9abd
test(bun): backtest oracle of documented boundaries, exit-code/envelo…
Sep 21, 2026
be4c165
docs(bun): contract, ecosystem matrix and changelog for the merged Bu…
mikolalysenko Sep 21, 2026
a505ca9
docs(bun): rewrite the compatibility guide around the merged matrix, …
mikolalysenko Sep 21, 2026
db3bf7b
docs(bun): name the two workspace-get backtest shapes as the script s…
mikolalysenko Sep 21, 2026
263b4c1
fix(bun): recognise, heal and unwind digest-less tuples re-saved by B…
mikolalysenko Sep 21, 2026
aa8e1ca
fix(bun): name the sibling lock a stale bun.lockb shadows in the disc…
mikolalysenko Sep 21, 2026
df87493
fix(bun): version-specific hosted remedy for pre-v2 workspace locks; …
mikolalysenko Sep 21, 2026
86f8a55
fix(bun): gate the vendor takeover on the shared vendored preflight; …
mikolalysenko Sep 21, 2026
a7c8759
fix(bun): refuse a non-regular bun.lockb and a stale one beside a sib…
mikolalysenko Sep 21, 2026
6b66ee3
fix(process): spawn resolved .cmd/.bat shims directly; std quotes the…
mikolalysenko Sep 21, 2026
0630bc5
fix(bun): state the v0 workspace remedy as delete-and-relock, in-plac…
mikolalysenko Sep 21, 2026
66d99e1
test(bun): share the ambient BUN_*/npm_config_* scrub across the thre…
mikolalysenko Sep 21, 2026
a802d99
test(bun): assert the vendor capstone's re-run is an already_vendored…
mikolalysenko Sep 21, 2026
4c14faf
test(bun): pin warning-free rewrites in the positive bun golden cases
mikolalysenko Sep 21, 2026
8eea7f2
test(bun): oracle carries bun_lockb_unsupported on every bun.lockb sc…
mikolalysenko Sep 21, 2026
011074a
ci(bun): stage the legacy baseline, skip pre-1.1.0 on Windows, check …
mikolalysenko Sep 21, 2026
9772549
docs(bun): contract, guide and changelog for the final-review fixes
mikolalysenko Sep 21, 2026
b25aebf
test(bun): keep uuid-derived values out of assertion messages for CodeQL
mikolalysenko Sep 21, 2026
cb00dff
fix(bun): preserve patch state on refused mode changes
mikolalysenko Sep 21, 2026
d92470f
fix(ci): eliminate harness races and retry artifact uploads
mikolalysenko Sep 21, 2026
5ac10a9
fix(ci): recover artifact uploads with reserved names
mikolalysenko Sep 21, 2026
fee6cea
fix(ci): use resilient uploads across compatibility workflows
mikolalysenko Sep 21, 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
87 changes: 87 additions & 0 deletions .github/actions/upload-artifact/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: Upload artifact with retries
description: Retry artifact service failures without hiding an exhausted upload failure
inputs:
name:
description: Artifact name, unique to this job within the workflow run
required: true
path:
description: Files or globs to upload
required: true
if-no-files-found:
description: Behavior when no files match (warn, error, or ignore)
default: warn
retention-days:
description: Retention in days (0 uses the repository default)
default: '0'
include-hidden-files:
description: Include hidden files in the artifact
default: 'false'
outputs:
artifact-id:
description: ID of the uploaded artifact
value: ${{ steps.first.outputs.artifact-id || steps.second.outputs.artifact-id || steps.third.outputs.artifact-id }}
artifact-url:
description: URL of the uploaded artifact
value: ${{ steps.first.outputs.artifact-url || steps.second.outputs.artifact-url || steps.third.outputs.artifact-url }}
artifact-digest:
description: SHA-256 digest of the uploaded artifact
value: ${{ steps.first.outputs.artifact-digest || steps.second.outputs.artifact-digest || steps.third.outputs.artifact-digest }}
runs:
using: composite
steps:
# The artifact client does not retry the service's intermittent
# "FinalizeArtifact ... (403) Forbidden: Error from intermediary".
# An unfinished upload reserves its name but is invisible to the list /
# delete APIs, so overwrite cannot recover it. Retry with a fresh name,
# including run_attempt so rerunning a failed job cannot reuse a poisoned
# retry name either. Consumers use a name pattern and merge-multiple to
# accept any successful attempt without duplicating identical files.
- name: Upload (attempt 1)
id: first
if: ${{ !cancelled() }}
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
continue-on-error: true
with:
name: ${{ inputs.name }}
path: ${{ inputs.path }}
if-no-files-found: ${{ inputs.if-no-files-found }}
retention-days: ${{ inputs.retention-days }}
include-hidden-files: ${{ inputs.include-hidden-files }}
overwrite: true

- name: Wait before retrying
if: ${{ !cancelled() && steps.first.outcome == 'failure' }}
shell: bash
run: sleep 5

- name: Upload (attempt 2)
id: second
if: ${{ !cancelled() && steps.first.outcome == 'failure' }}
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
continue-on-error: true
with:
name: ${{ inputs.name }}-retry-${{ github.run_attempt }}-2
path: ${{ inputs.path }}
if-no-files-found: ${{ inputs.if-no-files-found }}
retention-days: ${{ inputs.retention-days }}
include-hidden-files: ${{ inputs.include-hidden-files }}
overwrite: true

- name: Wait before the final attempt
if: ${{ !cancelled() && steps.second.outcome == 'failure' }}
shell: bash
run: sleep 15

# Do not continue-on-error here: downstream consumers need the artifact,
# and missing files or persistent service/auth failures must fail the job.
- name: Upload (attempt 3)
id: third
if: ${{ !cancelled() && steps.second.outcome == 'failure' }}
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: ${{ inputs.name }}-retry-${{ github.run_attempt }}-3
path: ${{ inputs.path }}
if-no-files-found: ${{ inputs.if-no-files-found }}
retention-days: ${{ inputs.retention-days }}
include-hidden-files: ${{ inputs.include-hidden-files }}
overwrite: true
Loading
Loading