Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
c849153
ci: fail the stuck-job watchdog closed when it cannot read runner inv…
wallstop Jul 31, 2026
917aec6
ci: stop reporting a cleanup failure for a lock a leg never acquired
wallstop Jul 31, 2026
bc3764f
ci: collapse the post-merge regeneration workflows into one commit
wallstop Jul 31, 2026
e40abae
ci: close seven defects found by adversarial review
wallstop Jul 31, 2026
967df6a
ci: silence the trap-invoked function under both shellcheck code numbers
wallstop Jul 31, 2026
caa1652
ci: close six defects the verification pass found in the review fixes
wallstop Jul 31, 2026
b4128b3
ci: name the pending dispatcher-stuck run before the cancel cap is read
wallstop Jul 31, 2026
764540b
ci: clear the post-merge failure flag per regeneration, and cover the…
wallstop Jul 31, 2026
24df920
test(ci): cover the watchdog guards that decide whether a live run is…
wallstop Jul 31, 2026
b502b4b
ci: report a starved sibling even when another job is merely busy
wallstop Jul 31, 2026
06276ab
ci: report starvation even while a sibling job is in progress
wallstop Jul 31, 2026
82b95c1
ci: report starvation on the dispatcher-stuck path, and stop breaking…
wallstop Jul 31, 2026
1775064
test(ci): close the six behaviors round four could still delete unpinned
wallstop Jul 31, 2026
881eeff
test(ci): prove the summary channel, and close round five's four gaps
wallstop Aug 1, 2026
98cd209
test(ci): make the watchdog verdict space a table instead of copy-pas…
wallstop Aug 1, 2026
393a4a7
test(ci): restore the two blocks the table refactor silently deleted
wallstop Aug 1, 2026
e2bb5e5
test(ci): restore the other four blocks the fold deleted, and close t…
wallstop Aug 1, 2026
ca478ef
test(ci): pin the re-dispatch call itself and the second verdict exit
wallstop Aug 1, 2026
b585880
ci: stop the post-merge job generating and pushing after a cancellation
wallstop Aug 1, 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
14 changes: 13 additions & 1 deletion .github/workflows/perf-numbers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,19 @@ jobs:
timeout-minutes: 2
uses: Ambiguous-Interactive/ambiguous-organization-build-lock/.github/actions/require-confirmed-unity-cleanup@ce12fde93e67a27062350601fb97e4a2f546d405
with:
acquired: ${{ steps.acquire_lock.outputs.acquired }}
# A leg that aborts before `Acquire organization Unity lock` runs never
# took a seat, and this gate's own contract treats `acquired: false` as
# proof that licensed cleanup was not required. Feeding it the skipped
# step's EMPTY output instead made it fail closed on work that never
# started, so a leg with one honest failure reported two (#327).
#
# This does not weaken the gate. It reads `outcome`, not `acquired`, and
# only the two values that prove the step never executed map to 'false'.
# An acquire that RAN and failed part-way reports outcome=failure while
# `acquired` reads empty, so the empty value still flows through and the
# gate still fails -- that ambiguous shape is the seat leak the bare
# `if: always()` above exists to catch, and it stays caught.
acquired: ${{ (steps.acquire_lock.outcome == 'skipped' || steps.acquire_lock.outcome == '') && 'false' || steps.acquire_lock.outputs.acquired }}
classification-complete: ${{ steps.cleanup_classification.outputs.classification-complete }}
cleanup-status: ${{ steps.cleanup_classification.outputs.resource-cleanup-status }}
cleanup-health: ${{ steps.cleanup_classification.outputs.resource-health }}
Expand Down
354 changes: 354 additions & 0 deletions .github/workflows/post-merge-maintenance.yml

Large diffs are not rendered by default.

28 changes: 26 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,19 @@ jobs:
timeout-minutes: 2
uses: Ambiguous-Interactive/ambiguous-organization-build-lock/.github/actions/require-confirmed-unity-cleanup@ce12fde93e67a27062350601fb97e4a2f546d405
with:
acquired: ${{ steps.acquire_lock.outputs.acquired }}
# A leg that aborts before `Acquire organization Unity lock` runs never
# took a seat, and this gate's own contract treats `acquired: false` as
# proof that licensed cleanup was not required. Feeding it the skipped
# step's EMPTY output instead made it fail closed on work that never
# started, so a leg with one honest failure reported two (#327).
#
# This does not weaken the gate. It reads `outcome`, not `acquired`, and
# only the two values that prove the step never executed map to 'false'.
# An acquire that RAN and failed part-way reports outcome=failure while
# `acquired` reads empty, so the empty value still flows through and the
# gate still fails -- that ambiguous shape is the seat leak the bare
# `if: always()` above exists to catch, and it stays caught.
acquired: ${{ (steps.acquire_lock.outcome == 'skipped' || steps.acquire_lock.outcome == '') && 'false' || steps.acquire_lock.outputs.acquired }}
classification-complete: ${{ steps.cleanup_classification.outputs.classification-complete }}
cleanup-status: ${{ steps.cleanup_classification.outputs.resource-cleanup-status }}
cleanup-health: ${{ steps.cleanup_classification.outputs.resource-health }}
Expand Down Expand Up @@ -732,7 +744,19 @@ jobs:
timeout-minutes: 2
uses: Ambiguous-Interactive/ambiguous-organization-build-lock/.github/actions/require-confirmed-unity-cleanup@ce12fde93e67a27062350601fb97e4a2f546d405
with:
acquired: ${{ steps.acquire_lock.outputs.acquired }}
# A leg that aborts before `Acquire organization Unity lock` runs never
# took a seat, and this gate's own contract treats `acquired: false` as
# proof that licensed cleanup was not required. Feeding it the skipped
# step's EMPTY output instead made it fail closed on work that never
# started, so a leg with one honest failure reported two (#327).
#
# This does not weaken the gate. It reads `outcome`, not `acquired`, and
# only the two values that prove the step never executed map to 'false'.
# An acquire that RAN and failed part-way reports outcome=failure while
# `acquired` reads empty, so the empty value still flows through and the
# gate still fails -- that ambiguous shape is the seat leak the bare
# `if: always()` above exists to catch, and it stays caught.
acquired: ${{ (steps.acquire_lock.outcome == 'skipped' || steps.acquire_lock.outcome == '') && 'false' || steps.acquire_lock.outputs.acquired }}
classification-complete: ${{ steps.cleanup_classification.outputs.classification-complete }}
cleanup-status: ${{ steps.cleanup_classification.outputs.resource-cleanup-status }}
cleanup-health: ${{ steps.cleanup_classification.outputs.resource-health }}
Expand Down
Loading
Loading