Skip to content

ci: fix stalled PRs by bypassing check-ai-tells cleanly - #1173

Merged
d-morrison merged 1 commit into
mainfrom
fix-1169-18175414958215205686
Sep 17, 2026
Merged

d-morrison merged 1 commit into
mainfrom
fix-1169-18175414958215205686

Conversation

@d-morrison

Copy link
Copy Markdown
Owner

Fixes issue #1169 where check-ai-tells would stall non-prose PRs because its required status check was skipped entirely by a top-level paths: filter. The workflow now always runs and delegates to a bypass reusable workflow when no prose changes are detected.


PR created automatically by Jules for task 18175414958215205686 started by @d-morrison

Co-authored-by: d-morrison <2474437+d-morrison@users.noreply.github.com>
@google-labs-jules

Copy link
Copy Markdown
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@github-actions

Copy link
Copy Markdown
Contributor

Claude finished reviewView run


Review: PR #1173ci: fix stalled PRs by bypassing check-ai-tells cleanly

Status confirmed: open, not draft, not merged (per live API fetch). No prior Claude review comment found on this PR (only a bot "Jules, reporting for duty" comment exists).

Summary of changes

Two files, both under .github/workflows/ (per CLAUDE.md's rule that CI/infra changes get their own dedicated PR — respected here, no book content mixed in):

  • New _check-ai-tells-bypass-reusable.yml: a trivial reusable workflow with one no-op job (check-ai-tells) that just echoes a bypass message.
  • check-ai-tells.yml: replaces the old trigger-level paths: filter (which caused issue #1169 — non-prose PRs never triggered the workflow at all, so the required check-ai-tells status check stayed permanently "Expected/waiting" and blocked merges) with a filter job using dorny/paths-filter@v4. The real check-ai-tells job now runs only when prose files changed (fail-open via !cancelled() if filter itself errors); otherwise a bypass job (named check-ai-tells, calling the new local reusable workflow whose inner job id is also check-ai-tells) reports the same composite status-check name.

Verification performed

  • This is not a novel pattern — it's a near-exact mirror of the already-working preview.yml / _preview-bypass-reusable.yml pair in this same repo (same filter/real-job/bypass-job structure, same trigger types: [opened, reopened, synchronize, labeled, closed], same !cancelled() fail-open rationale, same permissions: {} on the bypass job, same zizmor: ignore[self-repository] annotation). That precedent (rme#1108) resolved the identical class of bug for the build check, which is good evidence this approach works.
  • Confirmed dorny/paths-filter@v4 is a real, current tag (checked via GitHub API tags list) — not a hallucinated version.
  • Confirmed Morrison-Lab/gha/.github/workflows/check-ai-tells.yml@v2's inner job id is literally check-ai-tells (fetched the raw file), so the composite required-status-check name for both the real path (check-ai-tells / check-ai-tells) and the new bypass path (check-ai-tells job name + local reusable's check-ai-tells job id → check-ai-tells / check-ai-tells) match exactly — this is the crux of the fix and it's correct.
  • Validated both new/changed YAML files parse cleanly with a duplicate-key-rejecting loader (no duplicate mapping keys, no syntax errors).
  • Live dogfooding proof: this very PR's own gh pr checks output shows check-ai-tells / check-ai-tells passed in 4s (consistent with the bypass no-op path, since this PR touches no .md/.qmd/.Rmd), and the PR is reported MERGEABLE — i.e., the fix already demonstrably resolves the exact stall condition described in ci: fix stalled PRs by bypassing check-ai-tells cleanly #1169 for this PR itself. The lint / lint-workflows check (which runs actionlint/zizmor-style checks) also passed on this PR's branch.
  • No LaTeX/math content and no d-morrison/macros submodule content touched — macro-opportunity checks not applicable.
  • No AI-hallucinated APIs, action names, or references found; all cited action versions and reusable-workflow paths resolve to real, existing content.

Findings

No blocking issues. Two optional, non-blocking suggestions:

  1. .github/workflows/check-ai-tells.yml (new filter job) — pins dorny/paths-filter@v4, while the sibling preview.yml filter job pins dorny/paths-filter@v3. Not a bug (v4 works, as CI on this PR shows), but the two near-identical workflows in this repo now track different major versions of the same action for no stated reason; worth aligning for consistency, or leaving a comment noting the deliberate divergence.
  2. .github/workflows/check-ai-tells.yml (check-ai-tells job) — preview.yml's analogous render job carries an explanatory comment on its !cancelled() fail-open condition, explicitly citing the precedent issue (rme#1108) it fixed. This PR's check-ai-tells job has no equivalent comment explaining why !cancelled() is used or why the job intentionally reports the same composite check name in both branches — a future maintainer reading only this file (without knowing the preview.yml precedent) may not realize the design is deliberate. Consider adding a short comment mirroring the precedent, referencing ci: fix stalled PRs by bypassing check-ai-tells cleanly #1169.

Verdict

Ready for merge

Structured Review Data (JSON)
{
  "schema_version": "1.1",
  "reviewer": "claude",
  "commit_sha": "dcb27b67364de3f504552bb5cabd85c2f396a498",
  "verdict": "CLEAN",
  "findings": [],
  "detailed_assessment": "Checked .github/workflows/check-ai-tells.yml and the new _check-ai-tells-bypass-reusable.yml for YAML validity, duplicate keys, and composite status-check name alignment, finding no defect.",
  "holistic_assessment": "Verified the fix mirrors the working preview.yml bypass pattern, resolves issue 1169 by live CI evidence on this PR, and introduces no regression to workflow_dispatch or manual-trigger behavior."
}

Reviewed commit: dcb27b6

@github-actions

Copy link
Copy Markdown
Contributor

💰 Cost: $0.8219 (review) — run

@d-morrison
d-morrison merged commit 681ecbc into main Sep 17, 2026
18 checks passed
@d-morrison
d-morrison deleted the fix-1169-18175414958215205686 branch September 17, 2026 08:19
d-morrison added a commit to Morrison-Lab/ai-config that referenced this pull request Sep 17, 2026
…sue (#3734)

* memory: closing keywords don't auto-close a referenced PR, only an issue

Merging d-morrison/rme#1173, whose body read "Fixes issue #1169" against
an open duplicate PR (not an issue), left #1169 open after merge; it had
to be closed by hand. Records the asymmetry so future sessions verify
rather than assume.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S3EW8dfJZQn8hj4gbVQems

* fix: add semantic line breaks in closing-keyword memory addition

check-new-line-breaks flagged 4 lines packing more than one
sentence/clause. Reflows the added section to one clause per line.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S3EW8dfJZQn8hj4gbVQems

* fix: avoid a bare #N at line start tripping markdownlint MD018

A line starting "#1173 was..." reads as a malformed ATX heading to
markdownlint (no space after #). Reword to avoid starting a line with
a bare issue/PR reference.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S3EW8dfJZQn8hj4gbVQems

* fix: correct false claim about gh CLI's duplicate-close support

Review finding: "GitHub's CLI has no native duplicate reason" was
false. gh issue close has natively supported --reason duplicate and
--duplicate-of since December 2024. Corrects the routing to use the
native command for a duplicate issue, keeping the PR-close caveat.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S3EW8dfJZQn8hj4gbVQems

* fix: distinguish gh issue close from issue_write on a PR number

Review finding, verified against cli/cli's close.go source: gh issue
close resolves a PR number via REST (treats it as an issue) and
succeeds via a PullRequestClose fallback, unlike issue_write which
uses a GraphQL field that only resolves true issues and errors. The
prior fix wrongly grouped both tools as erroring identically.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S3EW8dfJZQn8hj4gbVQems

* fix: gh issue close resolves a PR via GraphQL, not REST

Review finding, this time independently verified against the actual
gh v2.100.0 source (fetched pkg/cmd/issue/shared/lookup.go and
api/queries_pr.go directly rather than trusting the review alone):
both issue_write and gh issue close use GraphQL. The difference is
the queried field (type-specific Repository.issue vs polymorphic
issueOrPullRequest), not the transport. Corrects the third
consecutive round's error on this exact point.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S3EW8dfJZQn8hj4gbVQems

---------

Co-authored-by: Claude <noreply@anthropic.com>
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