From 994aeb58aa6ac1747ecfac15d915e67462bd009b Mon Sep 17 00:00:00 2001 From: Andriujose <43181885+andriujoseba@users.noreply.github.com> Date: Tue, 4 Aug 2026 11:43:44 +0000 Subject: [PATCH] fix: cite release doctrine in both layouts --- actions/issueflow-reconcile/issueflow-reconcile.sh | 5 ++++- test/issueflow-reconcile.test.sh | 13 +++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/actions/issueflow-reconcile/issueflow-reconcile.sh b/actions/issueflow-reconcile/issueflow-reconcile.sh index 27d03f8..06f4875 100644 --- a/actions/issueflow-reconcile/issueflow-reconcile.sh +++ b/actions/issueflow-reconcile/issueflow-reconcile.sh @@ -747,6 +747,9 @@ itself, so a parse unchanged since the last echo never re-posts.*" >/dev/null esac elif has_issue_label epic; then if has_issue_label release && ! issue_comment_has_marker "$n" release-init-due; then + release_doctrine_path=.ceremony/RELEASES.md + # Ceremony dogfoods the action but owns doctrine at the repository root (#253). + [ "$REPO" != heavy-duty/ceremony ] || release_doctrine_path=RELEASES.md refs="$(blocked_references <<<"$(jq -r '.body // ""' <<<"$ISSUE_JSON")")" cross_refs="$(blocked_cross_references <<<"$(jq -r '.body // ""' <<<"$ISSUE_JSON")")" states="$(reference_states <<<"$refs")" @@ -760,7 +763,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 \`.ceremony/RELEASES.md\`. The operator blessing the order is the one step this chain never automates." +See \`$release_doctrine_path\`. 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 e782437..605577e 100644 --- a/test/issueflow-reconcile.test.sh +++ b/test/issueflow-reconcile.test.sh @@ -416,7 +416,7 @@ issue_stub_gh() { shift done printf '%s\n----\n' "$body" >>"$TMP/posted-$n" - file="$TMP/repos_owner_repo_issues_${n}_comments.json" + file="$TMP/$(printf 'repos/%s/issues/%s/comments' "$REPO" "$n" | tr / _).json" [ -f "$file" ] || printf '[]\n' >"$file" jq --arg b "$body" --arg at "$(iso_at "$INOW")" \ '. + [{"user":{"login":"sweep-bot"},"created_at":$at,"html_url":"https://x/posted","body":$b}]' \ @@ -435,7 +435,7 @@ issue_probe() { # $1 issue, $2 labels, $3 assignees, $4 false|closing|refs, $5 m # only way to prove a rule that self-rate-limits on its own comment's # timestamp (#254): sweep, then sweep again a day later and watch the # nudge stay silent because the comment it posted is now the activity. - REPO=owner/repo NOW="${PROBE_NOW:-$INOW}" + REPO="${PROBE_REPO:-owner/repo}" NOW="${PROBE_NOW:-$INOW}" ISSUE_LABELS="$2" ISSUE_JSON="$(jq -n --arg at "$(iso_at $((INOW - 10 * 86400)))" \ --argjson assignees "$assignee_json" --arg body "$body" \ @@ -497,6 +497,15 @@ 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 '{"state":"closed"}\n' >"$TMP/repos_heavy-duty_ceremony_issues_201.json" +printf '{"state":"closed"}\n' >"$TMP/repos_heavy-duty_ceremony_issues_202.json" +printf '[]\n' >"$TMP/repos_heavy-duty_ceremony_issues_53_comments.json" +PROBE_REPO=heavy-duty/ceremony \ + issue_probe 53 $'epic\nrelease' 0 false "" "$release_init_body" >/dev/null +# shellcheck disable=SC2016 # backticks are the literal dogfood doctrine citation +check "the ceremony dogfood announce cites its root doctrine path" 0 "" \ + grep -qF 'See `RELEASES.md`.' "$TMP/posted-53" + printf '[]\n' >"$(cfix 54)" issue_probe 54 $'epic\nrelease' 0 false "" \ $'Blocked by #203.\n\n## Task list\n- [x] #201 complete' >/dev/null