From e7df33b277b248da08363ff991f36bc80424260b Mon Sep 17 00:00:00 2001 From: Andriujose <43181885+andriujoseba@users.noreply.github.com> Date: Tue, 4 Aug 2026 11:17:51 +0000 Subject: [PATCH] fix: make release init citation portable --- actions/issueflow-reconcile/issueflow-reconcile.sh | 4 ++-- test/issueflow-reconcile.test.sh | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/actions/issueflow-reconcile/issueflow-reconcile.sh b/actions/issueflow-reconcile/issueflow-reconcile.sh index b936f97..27d03f8 100644 --- a/actions/issueflow-reconcile/issueflow-reconcile.sh +++ b/actions/issueflow-reconcile/issueflow-reconcile.sh @@ -746,7 +746,7 @@ itself, so a parse unchanged since the last echo never re-posts.*" >/dev/null log "#$n: blockers closed -> ready" ;; esac elif has_issue_label epic; then - if has_issue_label release; then + if has_issue_label release && ! issue_comment_has_marker "$n" release-init-due; then refs="$(blocked_references <<<"$(jq -r '.body // ""' <<<"$ISSUE_JSON")")" cross_refs="$(blocked_cross_references <<<"$(jq -r '.body // ""' <<<"$ISSUE_JSON")")" states="$(reference_states <<<"$refs")" @@ -760,7 +760,7 @@ itself, so a parse unchanged since the last echo never re-posts.*" >/dev/null 4. Ask the operator to bless the order, then open the first wave. 5. Ship the release, close this epic, and trigger the next window. -See [\`RELEASES.md\`](https://github.com/$REPO/blob/main/RELEASES.md). The operator blessing the order is the one step this chain never automates." +See \`.ceremony/RELEASES.md\`. The operator blessing the order is the one step this chain never automates." log "#$n: release-init due" fi fi diff --git a/test/issueflow-reconcile.test.sh b/test/issueflow-reconcile.test.sh index 3097c7f..3f10af3 100644 --- a/test/issueflow-reconcile.test.sh +++ b/test/issueflow-reconcile.test.sh @@ -479,16 +479,22 @@ check "a release epic with every declared blocker closed announces init" 0 "" \ grep -qF '' "$TMP/posted-53" check "the init announce names all five steps" 0 "5" \ grep -cE '^[1-5]\. ' "$TMP/posted-53" -check "the init announce cites RELEASES.md" 0 "" \ - grep -qF 'RELEASES.md' "$TMP/posted-53" +check "the init announce cites the portable vendored doctrine path" 0 "" \ + grep -qF 'See `.ceremony/RELEASES.md`.' "$TMP/posted-53" check "the init announce names the never-automated operator blessing" 0 "" \ grep -qF 'operator blessing the order is the one step this chain never automates' \ "$TMP/posted-53" check "the opened release gate is logged" 0 "" \ grep -qF '#53: release-init due' <<<"$release_init" +release_init_gate_reads_before_repeat="$( + grep -cE 'repos/owner/repo/issues/(201|202)$' "$TMP/api-calls" +)" issue_probe 53 $'epic\nrelease' 0 false "" "$release_init_body" >/dev/null check "an unchanged opened gate announces only once" 0 "1" \ grep -cF '' "$TMP/posted-53" +check "an announced gate does not re-read its durable blockers" 0 \ + "$release_init_gate_reads_before_repeat" \ + grep -cE 'repos/owner/repo/issues/(201|202)$' "$TMP/api-calls" printf '[]\n' >"$(cfix 54)" issue_probe 54 $'epic\nrelease' 0 false "" \