Skip to content

ci(promotion): the bundle's base is the newest armed set, never the first parent (stacked on #5824) - #5848

Closed
rbuergi wants to merge 1 commit into
ci/never-block-core-mergefrom
ci/promotion-base-armed-set
Closed

rbuergi wants to merge 1 commit into
ci/never-block-core-mergefrom
ci/promotion-base-armed-set

Conversation

@rbuergi

@rbuergi rbuergi commented Sep 28, 2026

Copy link
Copy Markdown
Contributor

What

This is gap 1 of 3 being ported onto the kept one-promotion-gate design, following the maintainer's decision on 2026-09-27. It is stacked on #5824 (base ci/never-block-core-merge) and stays a draft until #5824 merges. It will then be retargeted to main.

The defect. promote wrote the promotion record with base set to the core commit's first parent, and judge() pins the verdict to rec["base"].

The fix.

  • arm-promoted-set.py armed-base names the newest ARMED set from memex-portal-ai's manifest metadata.

    • The armed <version> tag sits on the same manifest as the seven-character sha tag. I measured this on 3.0.0-ci.9538 / b9fe5ed together with the pair tag b9fe5ed-pb7390a0.
    • It is a pure function with 6 self-test rows. An uninterpretable manifest (no sha tag, two sha tags, or not a list) is RED, never a guess.
  • promote's record step sets base to that commit, provided it resolves and is an ancestor of the candidate. It records which rule produced the base in base_kind:

    base_kind when what happens
    armed the normal case measured and armed as usual
    first-parent nothing was ever armed, or the candidate IS the armed set measured and armed; nothing wider exists
    unresolved the armed set can't be read or resolved, or isn't an ancestor promoted for CI as usual, but select refuses to arm it and pending does not measure it; a warning names why, and the next promoted set retries

    So CI is never held, and the fleet never receives merges nobody measured. A record written before this change has no base_kind and is judged as before, so no set promoted during the transition is stranded.

  • OnePromotionGate.md gains the section "The bundle's base is the newest ARMED set", and its step 2 now names that base.

No change is needed on the Plugins side. promotion-candidate.yml already passes the record's base through to core-candidate.yml, and #2479's attribution then covers the whole bundle.

Verified

  • arm-promoted-set.py --self-test passes with 0 failures, including 10 new rows (armed-base, base_kind, and unresolved never armed or measured).

  • The armed-base CLI, run on the live manifest listing, returns {"armed_version": "3.0.0-ci.9538", "armed_short": "b9fe5ed"}.

  • I ran the record step itself end to end against live ACR and GitHub, writing only to a scratch RUNNER_TEMP:

    candidate result
    main tip 003b70dd armed, base b9fe5ed47a… (the armed set)
    the armed commit b9fe5ed4 itself first-parent
    the older 9357060 unresolved ("compare: behind"), with the warning
  • MeshWeaver.Documentation.Test: 650/650 in Release with -warnaserror.

  • test-cd-steps.py passes, check-workflow-timeouts and check-workflow-yaml-keys report 0 violations, and shellcheck -S warning on the record step is clean.

  • actionlint findings on main-cd.yml are byte-identical to ci: never block a core merge; one promotion gate arms the fleet #5824's.

Pairs-with: none — no public src/ surface (a CI script, a workflow step and a doc page).

🤖 Generated with Claude Code

…irst parent

Gap 1 of 3 ported onto one-promotion-gate (maintainer decision 2026-09-27). promote wrote the record
with base = the core commit's first parent, and the verdict is pinned to rec["base"] — so Plugins'
scope diffed, and its control arm re-ran at, ONE merge of a set that usually carries several, and
`arm` then armed every other merge unmeasured.

- arm-promoted-set.py `armed-base`: names the newest armed set from memex-portal-ai's manifest
  metadata (the armed <version> tag shares its manifest with the 7-char sha tag — measured on
  3.0.0-ci.9538 / b9fe5ed); pure, self-tested (6 rows incl. uninterpretable manifests = RED).
- promote's record step: base = that commit when it resolves AND is an ancestor of the candidate
  (base_kind `armed`); `first-parent` when nothing was ever armed or the candidate IS the armed set;
  `unresolved` otherwise — CI still promotes, but select REFUSES to arm it and pending does not
  measure it (the next promoted set retries). Legacy records without base_kind judge as before.
- OnePromotionGate.md: "The bundle's base is the newest ARMED set".

Dry-run against live ACR + GitHub: main 003b70d → armed, base b9fe5ed; b9fe5ed itself →
first-parent; the older 9357060 → unresolved (compare: behind), with the warning.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 0)

  1 files  ±0    1 suites  ±0   3m 16s ⏱️ +4s
348 tests ±0  348 ✅ ±0  0 💤 ±0  0 ❌ ±0 
352 runs  ±0  352 ✅ ±0  0 💤 ±0  0 ❌ ±0 

Results for commit 0aeb542. ± Comparison against base commit 4e38aac.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 3)

461 tests  ±0   461 ✅ ±0   1m 11s ⏱️ +13s
  3 suites ±0     0 💤 ±0 
  3 files   ±0     0 ❌ ±0 

Results for commit 0aeb542. ± Comparison against base commit 4e38aac.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 1)

1 696 tests  ±0   1 696 ✅ ±0   4m 45s ⏱️ -1s
    2 suites ±0       0 💤 ±0 
    2 files   ±0       0 ❌ ±0 

Results for commit 0aeb542. ± Comparison against base commit 4e38aac.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 4)

    3 files  ±0      3 suites  ±0   6m 44s ⏱️ -21s
2 232 tests ±0  2 232 ✅ ±0  0 💤 ±0  0 ❌ ±0 
2 233 runs  ±0  2 233 ✅ ±0  0 💤 ±0  0 ❌ ±0 

Results for commit 0aeb542. ± Comparison against base commit 4e38aac.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 2)

764 tests  ±0   573 ✅ ±0   7m 9s ⏱️ +2s
  3 suites ±0   191 💤 ±0 
  3 files   ±0     0 ❌ ±0 

Results for commit 0aeb542. ± Comparison against base commit 4e38aac.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results (shard 5)

    5 files  ±0      5 suites  ±0   14m 1s ⏱️ -40s
4 282 tests  - 1  4 280 ✅  - 1  2 💤 ±0  0 ❌ ±0 
4 286 runs   - 1  4 284 ✅  - 1  2 💤 ±0  0 ❌ ±0 

Results for commit 0aeb542. ± Comparison against base commit 4e38aac.

@github-actions

Copy link
Copy Markdown
Contributor

Test Results

   17 files  ±0     17 suites  ±0   37m 8s ⏱️ -41s
9 783 tests  - 1  9 590 ✅  - 1  193 💤 ±0  0 ❌ ±0 
9 792 runs   - 1  9 599 ✅  - 1  193 💤 ±0  0 ❌ ±0 

Results for commit 0aeb542. ± Comparison against base commit 4e38aac.

@rbuergi

rbuergi commented Sep 28, 2026

Copy link
Copy Markdown
Contributor Author

Folded into #5824, which I adopted per a coordinator assignment. Its commit 10265952b7 is on ci/never-block-core-merge, unchanged: the bundle base is the newest ARMED set, with base_kind armed, first-parent or unresolved. Closing this PR so the fix lands once, with #5824.

@rbuergi rbuergi closed this Sep 28, 2026
@rbuergi
rbuergi deleted the ci/promotion-base-armed-set branch October 24, 2026 16:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant