mirror of
https://github.com/Comfy-Org/github-workflows.git
synced 2026-11-05 00:17:37 +00:00
[PR #189] [MERGED] feat(linear-ticket): rename the status context to "Linear ticket" and drop the slug from its description #197
Labels
No labels
cursor-review-catalog-drift
groom
groom
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Comfy-Org/github-workflows#197
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/Comfy-Org/github-workflows/pull/189
Author: @mattmillerai
Created: 8/20/2026
Status: ✅ Merged
Merged: 8/20/2026
Merged by: @mattmillerai
Base:
main← Head:matt/linear-ticket-pretty-context📝 Commits (4)
a1f9aa2feat(linear-ticket): rename the status context to "Linear ticket" and drop the slug from its description12f1029fix(linear-ticket): keep the two link-failure categories distinguishable, and correct the rename calloutacdef01docs(linear-ticket): drop the leading space inside the/ validatecode spancf4d468Merge origin/main into matt/linear-ticket-pretty-context📊 Changes
7 files changed (+148 additions, -48 deletions)
View changed files
📝
.github/workflows/linear-ticket.yml(+6 -6)📝
README.md(+1 -1)📝
docs/callers/linear-ticket.md(+57 -19)📝
scripts/linear-ticket/README.md(+3 -3)📝
scripts/linear-ticket/lib.py(+25 -9)📝
scripts/linear-ticket/tests/test_lib.py(+52 -6)📝
scripts/linear-ticket/validate.py(+4 -4)📄 Description
Before / after
GitHub renders the commit-status context verbatim as the check's name, so
linear-ticketwas putting a machine slug where a reader expects prose:All four categories, in
enforcemode:no_candidate✗ Linear ticket — No linked Linear issueexists_not_linked✗ Linear ticket — Referenced Linear issue is not linked yetpolicy_mismatch✗ Linear ticket — Linked Linear issue fails this repo's policyinfra_error✗ Linear ticket — Could not verify — Linear could not be queriedAnd the same headline across the reporting modes:
✗ Linear ticket — No linked Linear issue✗ Linear ticket — Warn-only: no linked Linear issue✓ Linear ticket — Warn-only (would fail): no linked Linear issueThe category slug leaves the one-liner. It stays in the marker comment and job summary —
### Linear ticket check — ❌ fail (no_candidate) — warn-only— which is where triage actually happens. Beside the check name it was noise, and forinfra_errorit was the second slug in a line that already had one.exists_not_linkedgained its own headline in review (see Guardrails): dropping the slug had collapsed it ontono_candidate's string, and the two remedies are opposite — one means add a link at all, the other means Linear already knows the issue and has not attached it yet (the async-link race that rollout step 3 calls the common case, where the fix is a re-run, not an edit).Timing is the whole point
The context is the exact string a consumer lists in its ruleset's required checks. Renaming it is free only while no caller requires it — after that it silently retires the required check: the new context is never satisfied, the old one is never reported again, and merges hang pending forever.
I checked all three callers before touching it, and re-verified live against the API during review:
Caller repos are private and this repo is public, so they are referred to by index — see
vars.LINEAR_TICKET_CALLERSfor the roster.This is the last cheap moment. Once the pilot flips to
enforce: trueand repos start requiring the context, the same change becomes a coordinated multi-repo migration.Guardrails added
A test now pins
CONTEXT, so a future rename fails loudly and forces that same caller audit rather than shipping quietly. A second test pinsMARKERas independent of it — the comment marker (<!-- linear-ticket-check -->) is not the status context, and "tidying" it to match a context rename would make the gate stop finding its own comment and start posting duplicates on every run.A third asserts the status description carries no raw category slug and no underscore, so the slug can't creep back into the one-liner.
A fourth —
test_each_category_gets_a_distinct_description— pins all four categories' descriptions pairwise-distinct in every reporting mode, so a future headline edit cannot silently re-collapse two categories onto one string the way dropping the slug did.Docs
A migration callout where the context is introduced, covering the three things that bite when a caller takes the bump:
linear-ticket, update it in the same change. The old context is never reported again, so a required check nobody publishes leaves every PR pending — which blocks merges exactly as a failure would.pull_request, so moving the pin publishes nothing for a PR already open: until it takes a new commit or someone re-runs its validate workflow, it carries the old context alone — there is no newLinear ticketbeside it. Requiring the new context before those PRs are re-validated leaves every one of them pending, so backfill deliberately rather than waiting for head SHAs to turn over.linear-ticketstatus survives, and it is not inert. Statuses are last-write-wins per context, so whatever value the old context last held stays on that head SHA — and it is frequentlysuccess, not red (any pass, any exemption, and every outcome undersoft-fail: false). Whilelinear-ticketis still required, that stale green keeps satisfying the requirement even after the verdict changed underneath it (issue canceled, attachment removed, exempt label pulled,team-keystightened); and either value counts toward the commit's combined status andstatusCheckRollup, which tooling reads — this repo's owngrade-pr-risk.shdoes.The
enforce: falseupgrade guide got the same treatment: where it describes pre-bump state it now names the old context, because a caller that has not taken the rename bump does not publish the new one — following the old instruction literally finds nothing and reports safe while the old requirement is live.The job-vs-status gotcha is now a table, because the two names have become confusably similar in the ruleset's check picker — they differ only by capitalisation and a suffix:
Linear ticket— the commit statusLinear Ticket / validate— the job, which runs on the default branchThat collision is the one real cost of this name, and it's worth knowing about: requiring the job instead of the status is the classic mistake, and it just got easier to make. The alternative was a context that shares no words with the workflow name.
docs/callers/README.mdis deliberately untouched — its threelinear-ticketmentions name the reusable workflow, not the status context.Tests
Rename scoped mechanically (
`linear-ticket`→`Linear ticket`, closing-backtick anchored solinear-ticket.yml,linear-ticket-validate.yml,linear-ticket-check,bump-linear-ticket-callersandscripts/linear-ticket/can't match), with an assertion pass afterwards confirming no collateral renames.After merge
The bump fleet rolls all three callers. Their caller files carry
# publish the `linear-ticket` commit statusin a permissions comment — cosmetic, not functional, and I'll clean it up in the same follow-up as the stale caller header if you want.Provenance
Authored by: agent-work loop
Verified: Re-verified after merging current
main(f8eec04) into this branch and resolving the three doc conflicts:scripts/linear-ticket/tests74 passed,.github/cursor-review/tests194,.github/groom/tests365,.github/workflow-pins/tests102,.github/refresh-reviewers/tests48,.github/agents-md-integrity/tests46 — all green on the merged tree. The PR is nowMERGEABLE/CLEANagainstmain, and no merge-queue run ongh-readonly-queue/main/pr-189-*exists or has failed. (coderabbit-configtests need the pinnedjsonschemadependency and are unrunnable in this local env — they fail identically on cleanmain, and this PR touches none of their path-filtered files.)Deviations: One review thread is answered but deliberately left unresolved — whether this rename ships under the existing
v1tag or bumps the major is a call for whoever moves the tag, not for this PR. The live ruleset audit in that thread confirms no caller currently requires the oldlinear-ticketcontext, so nothing is stranded today; the open thread is the record of that decision, not an outstanding defect. The conflict resolution kept BOTH intents:main's new protected-branch-gating prose is preserved verbatim, and this branch's context rename was applied to the status referencesmainintroduced (README.md,docs/callers/linear-ticket.md,scripts/linear-ticket/README.md). References to the oldlinear-ticketspelling inside the rename/migration callout are left deliberately — they describe pre-bump state, where the old name is the correct one. No test coverage frommainwas removed or weakened.🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
if:spellings (BE-8130) #204ref:whose id cannot resolve, and read the||fallback spelling (BE-8220) #210