Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
4f880bf
feat: implement issue #1297 — Synced stubs in ring repos carry a head…
don-petry Oct 11, 2026
83a1175
fix(reviews): sweep treats stale stable-channel header as drift
don-petry Oct 11, 2026
70ed8af
fix(reviews): migrate stale stable headers in place, stable-tier exem…
don-petry Oct 11, 2026
b6f3d24
test: validate sweep flags and fixes stale stable-channel headers in …
don-petry Oct 11, 2026
4bb767a
fix(reviews): replace whole legacy stub header; exempt idea engines f…
don-petry Oct 11, 2026
3fbd2c9
test: verify sweep processes all ring-managed stubs with stale headers
don-petry Oct 11, 2026
506ded3
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 11, 2026
4b57d18
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 11, 2026
4c421b5
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 11, 2026
0f414c9
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 11, 2026
572180f
fix: stub_has_stale_stable_header must be tier-aware to prevent contr…
don-petry Oct 11, 2026
c638177
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 12, 2026
1f70096
fix(reviews): strip stale stable-channel comment blocks in stub body,…
don-petry Oct 11, 2026
03b5dd3
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 12, 2026
3f0de8a
fix(reviews): exempt present-only callers from repo-template full-bod…
don-petry Oct 12, 2026
f47c49c
fix(bot): revert stub header changes — templates are read-only synced…
don-petry Oct 12, 2026
d6d2d69
fix(reviews): render ring headers tier-neutral from stable-wording te…
don-petry Oct 12, 2026
666b6d9
test(reviews): render ring fixtures via ring_repin_uses so headers ar…
don-petry Oct 12, 2026
a294cb9
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 12, 2026
d7ec4f4
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 13, 2026
1eea28d
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 14, 2026
ec25264
Merge main (org renamed to combsmith) into dev-lead/issue-1297-202610…
don-petry Oct 14, 2026
348aae4
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 14, 2026
01f4602
fix: remove outer quotes from neutral array expansion in ring_repin_uses
don-petry Oct 14, 2026
63444b5
fix(reviews): pass only the ref token to ring_repin_uses in dry-run s…
don-petry Oct 14, 2026
4708ee3
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 14, 2026
9842d6f
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 14, 2026
9051276
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 16, 2026
8e71eb3
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 18, 2026
3ed50a2
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 18, 2026
dd65220
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 18, 2026
2269059
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 20, 2026
767380b
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 20, 2026
9bee24c
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 20, 2026
b2366d9
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 20, 2026
ad33b1b
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 20, 2026
49d3107
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 20, 2026
97df195
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 21, 2026
a7e67e7
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 21, 2026
e6653a6
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 21, 2026
8411623
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 22, 2026
b150f8d
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 25, 2026
1cbfb3a
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 25, 2026
226791d
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 25, 2026
23a89c7
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 26, 2026
59ad365
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 28, 2026
614897d
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 28, 2026
c569f00
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 28, 2026
15401e4
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 28, 2026
2fd8350
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 28, 2026
42d5aea
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 28, 2026
251e8d4
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 28, 2026
d350b82
fix(bot): address CodeRabbit pre-merge check findings for issue #1297
don-petry Oct 28, 2026
9687135
fix(reviews): drop tests for the removed present-only idea-workflow f…
don-petry Oct 28, 2026
33e11de
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 29, 2026
cc34cdd
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 29, 2026
19a0d27
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 29, 2026
2d310e8
fix(reviews): require guarded-surface compliance before preserving ex…
don-petry Oct 29, 2026
ecc885f
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 30, 2026
5b6441a
fix(reviews): require inherited secrets before preserving a stale-hea…
don-petry Oct 30, 2026
9fb6c47
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 30, 2026
896d6b1
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 31, 2026
7397320
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Oct 31, 2026
daeb3f0
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 1, 2026
2b7fbc3
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 1, 2026
6e6ec52
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 2, 2026
5aa7eb8
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 2, 2026
1d901df
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 2, 2026
733dee0
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 3, 2026
bf5db64
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 3, 2026
34de3ae
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 3, 2026
d6f03b6
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 3, 2026
2ec585c
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 3, 2026
ec622f6
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 3, 2026
624075c
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 3, 2026
ffa191c
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 4, 2026
5380df9
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 4, 2026
883850e
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 4, 2026
d253e02
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 5, 2026
da25d6e
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 5, 2026
6bf01d1
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 5, 2026
fe15121
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 6, 2026
2905eda
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 6, 2026
ff92d2c
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 8, 2026
559f713
fix(reviews): test stale-header migration keeps customized body
don-petry Nov 8, 2026
0c7fb3b
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 8, 2026
5bdb7c6
Merge branch 'main' into dev-lead/issue-1297-20261011-0422
don-petry Nov 9, 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
99 changes: 98 additions & 1 deletion scripts/deploy-standard-workflows.sh
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,12 @@ template_requires_s7635_marker() {
grep -qE '^[[:space:]]*secrets:[[:space:]]+inherit([[:space:]]|$)' "$1"
}

# stub_has_inherited_secrets — 0 if the stub content on stdin carries a real
# `secrets: inherit` YAML line.
stub_has_inherited_secrets() {
grep -qE '^[[:space:]]*secrets:[[:space:]]+inherit([[:space:]]|$)'
}

# stub_has_s7635_marker — 0 if the stub content on stdin carries the
# `# NOSONAR(githubactions:S7635)` marker on a real `secrets: inherit` line.
stub_has_s7635_marker() {
Expand Down Expand Up @@ -601,6 +607,70 @@ merge_guarded_surfaces() {
return 0
}

# stub_has_stale_stable_header <existing_content> <template> <repo> -> 0 if the stub carries a
# comment naming its agent's stable channel (`<base>/stable`, `<base>/v<M>-stable`,
# `<base> stable channel`) that the template no longer carries (#1297). Such a header
# contradicts a ring pin; the pin alone is compliant, so without this check the sweep
# would never ship the comment-only header fix to existing ring repos. In ring repos,
# even a currently stable-pinned stub must migrate its header because the in-place
# repin will change the pin to ring, leaving the header contradictory.
stub_has_stale_stable_header() {
local existing="$1" template="$2" repo="$3" base re tier
base="$(reusable_base_of "$template")"
[[ -n "$base" ]] || return 1
re="^[[:space:]]*#.*(${base}/(v[0-9]+-)?stable|${base} stable channel)"
grep -qE "$re" <<< "$existing" || return 1
# A stable-pinned stub's header agrees with its pin, BUT only when the repo is
# stable-tier. In ring-managed repos, a stable-pinned stub is itself an anomaly
# that the repin will fix; the header must migrate too, so don't exempt in ring.
if ring_is_ring_reusable "$base" && [[ -n "$repo" ]]; then
tier="$(ring_tier_for_repo "$base" "$repo" 2>/dev/null)" || tier=""
# Ring-managed repo with a tier: the stub should be ring-pinned, so the header
# is stale regardless of the current pin.
if [[ -n "$tier" ]] && [[ "$tier" != "stable" ]]; then
# The template may still carry the stable wording; ring renders (ring_repin_uses)
# and the header cleanup neutralize it, so the template never exempts a ring repo.
return 0 # Flag as stale
fi
fi
! grep -qE "$re" "$template" || return 1
# Non-ring reusable or stable-tier repo: apply the exemption (don't flag if
# the stub is stable-pinned, since the header agrees with the pin).
! grep -qE "^[[:space:]]*uses:.*@${base}/(v[0-9]+-)?stable([[:space:]]|\$)" <<< "$existing"
}

# strip_stale_stable_header <base> [<template>] -> stdin minus the stale stable-channel
# header. With <template>, the stub's whole leading comment block (everything above the
# first top-level YAML key) is replaced by the template's canonical, tier-neutral header,
# so a multiline legacy bullet is never left half-deleted. The body is kept verbatim, so
# per-repo edits (e.g. workflow_run.workflows) survive and the next sweep sees no stale
# header (#1297). Without <template>, only the lines naming the stable channel are dropped.
strip_stale_stable_header() {
local base="$1" template="${2:-}"
if [[ -n "$template" && -r "$template" ]]; then
# Body comment blocks (consecutive comment lines) that name the stable channel are
# dropped whole too, so a legacy `# Pinned to the moving ... stable channel` block under
# `jobs:` does not survive and keep the detector true forever.
awk -v tpl="$template" -v base="$base" -v re="^[[:space:]]*#.*(${base}/(v[0-9]+-)?stable|${base} stable channel)" '
BEGIN {
while ((getline l < tpl) > 0) { if (l ~ /^[^#[:space:]]/) break; hdr = hdr l "\n" }
# The template header may still name the stable channel; render it tier-neutral
# (same wording as ring_repin_uses) so cleanup never reinstalls it.
gsub(base "/(v[0-9]+-)?stable", base "/<tier>", hdr)
gsub(base " stable channel", base "/<tier> channel", hdr)
}
function flush() { if (!stale) printf "%s", blk; blk = ""; stale = 0 }
!body && /^[^#[:space:]]/ { body = 1; printf "%s", hdr }
body && /^[[:space:]]*#/ { blk = blk $0 "\n"; if ($0 ~ re) stale = 1; next }

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

strip_stale_stable_header deletes body comment blocks instead of rendering them tier-neutral like ring_repin_uses

When strip_stale_stable_header runs with a <template>, the BEGIN block rewrites <base>/(v[0-9]+-)?stable and <base> stable channel to <base>/<tier> in the header (matching ring_repin_uses), but line 666 (body && /^[[:space:]]*#/) marks the entire consecutive comment block as stale = 1 and drops all of its lines (if (!stale) printf "%s", blk).

For example, in standards/workflows/dev-lead.yml (lines 59–63), the 5-line explanation block under jobs.dev-lead starts with # Pinned to the moving dev-lead stable channel tag, not @main...: a fresh/template deploy via ring_repin_uses preserves that comment block with dev-lead/<tier> channel, whereas an in-place header migration via strip_stale_stable_header deletes the entire 5-line block. Applying the same two gsub(...) replacements to body comment lines instead of dropping blk keeps in-place migrations consistent with ring_repin_uses.

@don-petry don-petry Oct 28, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not applied: rendering body comment lines tier-neutral (as ring_repin_uses does) conflicts with the existing bats test "strip_stale_stable_header with a template also drops a stale comment block under jobs" (test/scripts/deploy-standard-workflows/stub-header-tier-neutral.bats). That test deliberately asserts the legacy block (cannot gate) is dropped, and a bot suggestion is not grounds to rewrite it. I prototyped the change in strip_stale_stable_header and that test was the only one that failed, so I reverted it. Leaving this open for a maintainer to decide whether the intended behavior is drop or rewrite. If rewrite, the test needs a Test-Change-Justification.

body { flush(); print; next }
END { if (body) flush() }
'
return 0
fi
grep -vE "^[[:space:]]*#.*(${base}/(v[0-9]+-)?stable|${base} stable channel)" || true
Comment thread
don-petry marked this conversation as resolved.
Resolved
}


# is_already_compliant <existing_content> <template> <repo> -> 0 if the deployed
# stub needs no re-deploy. A stub is compliant only when it is BOTH pin-compliant
# (is_pin_compliant, below) AND — when its template carries a real `secrets: inherit`
Expand All @@ -615,7 +685,8 @@ merge_guarded_surfaces() {
# rendered at the repo's tier channel (stub_body_matches_template): its callers
# predate the template and carry per-repo edits, which are drift. So must every stub
# in a FULL_BODY_COMPARE_REPOS repo (repo-template, #1285) other than a
# BODY_PRESERVING_WORKFLOWS one, whose per-repo body is never re-synced.
# BODY_PRESERVING_WORKFLOWS or PRESENT_ONLY_WORKFLOWS one, whose per-repo body is
# re-pinned in place and never re-synced from the template.
#
# A pin-correct stub whose guarded `on:` / `permissions:` / `concurrency:` surface
# differs from the template is ALSO drift (#1236): the audit flags it
Expand All @@ -634,6 +705,7 @@ is_already_compliant() {
&& ! stub_has_s7635_marker <<< "$existing_content"; then
return 1
fi
stub_has_stale_stable_header "$existing_content" "$template" "$repo" && return 1
if is_replace_if_present_workflow "$workflow" \
|| { is_full_body_compare_repo "$repo" && ! is_body_preserving_workflow "$workflow"; }; then
stub_body_matches_template "$existing_content" "$template" "$repo" || return 1
Expand Down Expand Up @@ -928,6 +1000,31 @@ deploy_repo() {
fi
fi

# Stale stable-channel header (#1297): migrate by editing the stub's OWN body, never
# by redeploying the template (that would reset per-repo edits such as
# pr-auto-review's workflow_run.workflows). Full-body-compared stubs are exempt —
# their drift is already resolved by a template redeploy.
if [[ "$DRY_RUN" != "true" && -n "$existing_sha" ]] \
&& stub_has_stale_stable_header "$existing_content" "$template" "$repo"; then
base="$(reusable_base_of "$template")"
if [[ "$repin_source" == "$template" ]] && ! is_replace_if_present_workflow "$workflow" \
&& ! { is_full_body_compare_repo "$repo" && ! is_body_preserving_workflow "$workflow"; } \
&& is_pin_compliant "$existing_content" "$template" "$repo" \
&& ! stub_any_surface_drift "$workflow" "$(< "$template")" "$existing_content" \
&& { ! template_requires_s7635_marker "$template" || stub_has_inherited_secrets < <(printf '%s\n' "$existing_content"); }; then
# Keep the existing body only when its guarded surfaces are compliant and it
# still forwards `secrets: inherit` where the template does (the marker
# injection below cannot add a missing line); a stub with trigger/permission/
# secrets drift falls back to the canonical template.
repin_source="$(mktemp)"; _TMPFILES+=("$repin_source")
printf '%s\n' "$existing_content" > "$repin_source"
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
fi
if [[ "$repin_source" != "$template" ]]; then
strip_stale_stable_header "$base" "$template" < "$repin_source" > "$repin_source.stripped"
mv "$repin_source.stripped" "$repin_source"
fi
fi

# When repin_source is a copy of existing_content (meta-repo consumer or body-
# preserving repin-in-place) and the template requires the S7635 marker but the
# copy lacks it, inject the marker now. Without this, the deployed stub would
Expand Down
13 changes: 12 additions & 1 deletion scripts/lib/ring-pins.sh
Original file line number Diff line number Diff line change
Expand Up @@ -455,11 +455,22 @@ ring_tag_exists() {
# is re-pinned alongside `uses:` here. This only re-pins the VALUE of an input the
# stub already forwards (never adds/forwards a new one), so it never introduces the
# undeclared-input channel-skew defect (#1052).
# When <newref> is not a stable channel, comment lines naming this agent's stable
# channel (`<base>/v<M>-stable`, `<base> stable channel`) are rendered tier-neutral
# (`<base>/<tier>`), so a header never contradicts the ring pin even while the
# template still carries the stable wording (#1297).
ring_repin_uses() {
local base="$1" newref="$2" file
local base="$1" newref="$2" file neutral=()
file="$(ring_reusable_file "$base")"
file="${file//./\\.}"
if [[ ! "$newref" =~ stable$ ]]; then
neutral=(
-e "/^[[:space:]]*#/s#${base}/(v[0-9]+-)?stable#${base}/<tier>#g"
-e "/^[[:space:]]*#/s#${base} stable channel#${base}/<tier> channel#g"
)
fi
sed -E \
${neutral[@]+"${neutral[@]}"} \
-e "s#^([[:space:]]*uses:[[:space:]]*combsmith/[^@[:space:]]*/${file})@[^[:space:]]+#\1@${newref}#" \
-e "s#^([[:space:]]*agent_ref:[[:space:]]*[\"']?)${base}/[^\"'[:space:]]+#\1${newref}#" \
-e "s#^([[:space:]]*checkout_ref:[[:space:]]*[\"']?)${base}/[^\"'[:space:]]+#\1${newref}#"
Expand Down
2 changes: 1 addition & 1 deletion standards/workflows/add-to-project.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# • This file is a THIN CALLER STUB. All noise-gate / reconcile logic lives
# in the reusable workflow above.
# • You MAY change: nothing in normal use. The `uses:` ref and `agent_ref`
# are pinned to the `add-to-project/v1-stable` channel and move with it — do
# are pinned to the `add-to-project/<tier>` channel and move with it — do
# not change them to `@main` or a SHA (see ci-standards.md → Reusable
# workflow versioning).
# • You MUST NOT change: trigger events, the concurrency group, or the
Expand Down
2 changes: 1 addition & 1 deletion standards/workflows/idea-enhancer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# • This file is a THIN CALLER STUB. All enhancement-dispatch logic (including
# the Ideas-category / non-bot guard) lives in the reusable above.
# • You MUST NOT change: the `uses:` ref — it is pinned to the
# `idea-enhancer/v1-stable` channel, a moving tag advanced centrally. Never
# `idea-enhancer/<tier>` channel, a moving tag advanced centrally. Never
# repoint it to `@main`, a SHA, or a frozen `@vX`. Do not change the trigger
# events or the `secrets:` block.
# • You MAY change: the cron schedule if the weekly cadence doesn't suit.
Expand Down
2 changes: 1 addition & 1 deletion standards/workflows/idea-triage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# • This file is a THIN CALLER STUB. All triage-dispatch logic lives in the
# reusable above.
# • You MUST NOT change: the `uses:` ref — it is pinned to the
# `idea-triage/v1-stable` channel, a moving tag advanced centrally. Never
# `idea-triage/<tier>` channel, a moving tag advanced centrally. Never
# repoint it to `@main`, a SHA, or a frozen `@vX`. Do not change the
# `secrets:` block.
# • You MAY change: the cron schedule if the weekly cadence doesn't suit.
Expand Down
2 changes: 1 addition & 1 deletion standards/workflows/initiative-planner.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
# `idea:approved` gate, the trusted-actor check, and the cross-repo dispatch
# to the central BMAD Scrum Master planner) lives in the reusable above.
# • You MUST NOT change: the `uses:` ref — it is pinned to the
# `initiative-planner/v1-stable` channel, a moving tag advanced centrally.
# `initiative-planner/<tier>` channel, a moving tag advanced centrally.
# Never repoint it to `@main`, a SHA, or a frozen `@vX` (see
# ci-standards.md → Reusable workflow versioning). Also do not change the
# trigger events or the `secrets:` block.
Expand Down
2 changes: 1 addition & 1 deletion standards/workflows/persona-mention.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
# workflow above, and every per-persona decision lives in that persona's
# manifest — not here and not in the reusable.
# • You MUST NOT change: the `uses:` ref — it is pinned to the
# `persona-mention/v1-stable` channel, a moving tag advanced centrally.
# `persona-mention/<tier>` channel, a moving tag advanced centrally.
# Never repoint it to `@main`, a SHA, or a frozen `@vX.Y.Z` (see
# ci-standards.md → Reusable workflow versioning). Also do not change the
# trigger events or the job-level `permissions:` block — reusable workflows
Expand Down Expand Up @@ -74,7 +74,7 @@
persona-mention:
permissions:
contents: read # the reusable checks out its tooling repo — required,
# or the call fails at startup (a reusable is granted

Check warning on line 77 in standards/workflows/persona-mention.yml

View workflow job for this annotation

GitHub Actions / Lint

77:29 [comments-indentation] comment not indented like content
# no more than the caller; persona-standards.md §5)
issues: read
pull-requests: read
Expand Down
2 changes: 1 addition & 1 deletion standards/workflows/pr-auto-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
# reusable workflow above.
# • You MAY change: the workflow name(s) in `workflow_run.workflows` to match
# your repository's CI workflow name(s).
# • You MUST NOT change: the `@pr-auto-review/v1-stable` channel in the `uses:`
# • You MUST NOT change: the `@pr-auto-review/<tier>` channel in the `uses:`
# line — this reusable is on the org-wide moving-channel model (rollout and
# rollback are a single central tag move; a frozen `@vN`/`@<sha>` pin is
# rejected by the compliance audit). Nor the trigger event types or the
Expand Down
2 changes: 1 addition & 1 deletion standards/workflows/pr-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
# above, including concurrency (per PR + head SHA, never cancelling an
# in-flight review), the check_suite-without-a-PR skip, and reading
# `client_payload.pr_url` from repository_dispatch.
# • You MUST NOT change: the `@pr-review/v1-stable` channel in the `uses:`
# • You MUST NOT change: the `@pr-review/<tier>` channel in the `uses:`
# line or the matching `agent_ref` — both are re-pinned in lockstep to this
# repo's canary-ring tier by the standards sweep. Nor the workflow `name:`,
# the job id `review` (check names depend on both), the trigger event types,
Expand Down
3 changes: 2 additions & 1 deletion test/scripts/deploy-standard-workflows/dry-run.bats
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@ stub_pinning() { # <ref> → base64 of the auto-rebase template re-pinned to <r
# and the surface-drift check (#1236) stays clean.
local body
body="$(sed -E "s|(auto-rebase-reusable\.yml)@[^[:space:]]+|\1@$1|" \
"${REPO_ROOT}/standards/workflows/auto-rebase.yml")"
"${REPO_ROOT}/standards/workflows/auto-rebase.yml" \
| bash -c 'source "$1"; ring_repin_uses "$2" "$3"' _ "$SCRIPT" auto-rebase "${1%% *}")"
base64 -w 0 <<<"$body" 2>/dev/null || base64 -b 0 <<<"$body"
}

Expand Down
6 changes: 4 additions & 2 deletions test/scripts/deploy-standard-workflows/emit-vform.bats
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ stub_pinning() { # <ref> → base64 of the auto-rebase template re-pinned to <r
# concurrency: surfaces match and the surface-drift check (#1236) stays clean.
local body
body="$(sed -E "s|(auto-rebase-reusable\.yml)@[^[:space:]]+|\1@$1|" \
"${REPO_ROOT}/standards/workflows/auto-rebase.yml")"
"${REPO_ROOT}/standards/workflows/auto-rebase.yml" \
| bash -c 'source "$1"; ring_repin_uses "$2" "$3"' _ "$SCRIPT" auto-rebase "$1")"
base64 -w 0 <<<"$body" 2>/dev/null || base64 -b 0 <<<"$body"
}

Expand Down Expand Up @@ -112,7 +113,8 @@ devlead_stub_pinning_with_marker() { # <ref> → base64 of the dev-lead templat
local body
body="$(sed -E -e "s|(dev-lead-reusable\.yml)@[^[:space:]]+|\1@$1|" \
-e "s|^([[:space:]]*agent_ref:[[:space:]]*).*|\1$1|" \
"${REPO_ROOT}/standards/workflows/dev-lead.yml")"
"${REPO_ROOT}/standards/workflows/dev-lead.yml" \
| bash -c 'source "$1"; ring_repin_uses "$2" "$3"' _ "$SCRIPT" dev-lead "$1")"
base64 -w 0 <<<"$body" 2>/dev/null || base64 -b 0 <<<"$body"
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ STUB
# The template rendered at <channel> — what a correctly deployed caller looks like:
# only the two pin lines move; the header prose keeps the template's channel.
rendered_at() { # <channel>
sed -E "/^[[:space:]]*(uses|agent_ref):/s#pr-review/v1-stable#$1#" "$TEMPLATE"
sed -E "/^[[:space:]]*(uses|agent_ref):/s#pr-review/v1-stable#$1#" "$TEMPLATE" \
| bash -c 'source "$1"; ring_repin_uses pr-review "$2"' _ "$SCRIPT" "$1"
}

# The legacy fleet caller shape (TalkTerm-like): bare pr-review/stable pin, an
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ STUB

# The template rendered at <channel> — only the reusable pin moves.
rendered_at() { # <channel>
sed -E "/^[[:space:]]*uses:/s#dependabot-rebase/v2-stable#$1#" "$TEMPLATE"
sed -E "/^[[:space:]]*uses:/s#dependabot-rebase/v2-stable#$1#" "$TEMPLATE" \
| bash -c 'source "$1"; ring_repin_uses dependabot-rebase "$2"' _ "$SCRIPT" "$1"
}

# The template at <channel> with a stale header comment — the #1075 shape: the
Expand Down
Loading
Loading