ci: drop the triage label, use is:open no:assignee filter#4899
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #4899 +/- ##
============================================
+ Coverage 42.04% 42.99% +0.95%
- Complexity 2155 2219 +64
============================================
Files 980 1011 +31
Lines 36292 40546 +4254
Branches 3783 4684 +901
============================================
+ Hits 15260 17434 +2174
- Misses 20108 21844 +1736
- Partials 924 1268 +344
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
88107b6 to
67cabba
Compare
a4427d2 to
94407d8
Compare
triage label, use is:open no:assignee filter
`triage` is a derived state — an issue needs triage iff it has no assignee. Materializing it as a label means every assignee mutation needs to keep the label in sync, which is fragile (GITHUB_TOKEN-authored mutations don't trigger event-driven reconcilers, third-party bots bypass them, etc.). Drop the label entirely; reviewers use the search filter `is:issue is:open no:assignee` instead. Behavior is preserved by existing pieces in `pr-assignment.yml`: - PR opened/edited with closing reference -> opener auto-assigned to each linked issue (issue leaves the no-assignee filter). - PR closed without merge -> opener unassigned (issue returns to the filter unless someone else is still on it). - PR merged -> credit-on-merge step overwrites assignees with the actual commit authors. Pre-merge assignments are tentative. `/take` and `/untake` commands move to a new `take-commands.yml` — trimmed of the old triage-label management. Anyone can self-claim or self-release an issue via comment. Removed: - `.github/workflows/issue-triage.yml` (the triage-label state machine). Issue templates still attach `labels: ["triage"]`; that line is left to a separate change so it can be backported independently. Until the templates are also updated, newly opened issues will continue to acquire the label until that follow-up lands and the label itself is deleted from the repo.
94407d8 to
54cd795
Compare
|
The current workflow uses addAssignees, which is additive. Two questions just to clarify if this is the intent:
If (1) is changed to first-come-first-served, (2) becomes moot. Otherwise (2) is worth fixing on its own. |
Definitely not get rejected. we usually have the case where Alice gets assigned but backeloged, thus Bob wants to take over. So we will allow bob to /take. But I think they can both get assigned, just to keep track, we can read from comment history to know the order, if needed. Note that before a PR is merged, these assignments are temporary.
I think that rarely rarely happens. It only exist in odds. I've never seen an issue has 10 assignees, ever. we don't need to over engineer this... Plus, a committer can always manually change the assignees, without this automation system. |
### What changes were proposed in this PR?
`triage` is a derived state (issue needs triage iff it has no assignee).
Materializing it as a label means every assignee mutation has to keep
the label in sync, which is fragile across `GITHUB_TOKEN`-authored
writes, third-party bots, and dropped webhooks. Drop the label;
reviewers use the search filter `is:issue is:open no:assignee` instead.
- Delete `.github/workflows/issue-triage.yml` (the entire triage-label
state machine).
- Add `.github/workflows/take-commands.yml`: handles `/take`
(self-assign) and `/untake` (self-unassign) on issues.
- Update one stale comment in `pr-assignment.yml` that referenced the
removed workflow.
`labels: ["triage"]` is left in `bug-template.yaml`,
`task-template.yaml`, `feature-template.yaml` so that change can be
backported on its own. Until that follow-up lands and the label itself
is deleted from the repo, newly opened issues will continue to acquire
the label.
### Simplified issue lifecycle
The new model is "assignee = ownership; no assignee = needs triage". One
filter and three transition rules — no reified state.
```
open issue, no assignee
(visible in `is:open no:assignee` triage filter)
│
┌──────────────────────┼──────────────────────┐
│ │ │
/take comment PR opened with (no action)
on the issue `Closes #N` stays in filter
│ │
v v
assignee = commenter assignee = PR opener
(out of filter) (out of filter — tentative)
│ │
│ ┌───────┴────────┐
│ │ │
/untake PR closed PR merged
comment unmerged
│ │ │
v v v
removes self opener credit-on-merge:
(back in unassigned assignees overwritten
filter only (back in with PR opener +
if no other filter unless commit authors.
assignees) others stay) Final attribution.
```
#### Stacked claims
`/take` uses GitHub's `addAssignees`, which is append-semantics —
existing assignees are not replaced. So if Alice has already taken an
issue and goes inactive, Bob commenting `/take` produces a co-assignment
rather than a rejection. Comment history records the order. `/untake`
only removes the commenter from the assignee list, leaving anyone else
in place. At merge time the credit step overwrites the whole list with
the actual contributors, so stacked claims are explicitly tentative.
Behavior preserved by `pr-assignment.yml` (already on main):
- PR opened/edited with `Closes #N` → opener is auto-assigned to each
linked issue (issue leaves the no-assignee filter).
- PR closed without merge → opener is unassigned.
- PR merged → the credit-on-merge step overwrites assignees with the
actual commit authors. **Pre-merge assignments are tentative.**
### Any related issues, documentation, discussions?
Closes #4898.
After merge, the `triage` label can be deleted from the repo as a
one-shot cleanup (`gh api -X DELETE
/repos/apache/texera/labels/triage`); that drops the chip from every
existing issue at once. Any saved searches / project-board automation
keyed on `label:triage` should be moved to `no:assignee`.
The follow-up to drop `labels: ["triage"]` from the three issue
templates is a separate change so it can be backported independently.
### How was this PR tested?
Static checks: YAML parse on both workflow files. Behavior verifiable
post-merge: opening a PR with `Closes #N` should remove `#N` from the
`is:open no:assignee` filter; closing the PR unmerged should put it
back; commenting `/take` / `/untake` should toggle the assignee. Two
users commenting `/take` in sequence should produce a stacked
co-assignment.
### Was this PR authored or co-authored using generative AI tooling?
(backported from commit 07d8311)
Generated-by: Claude Opus 4.7 (1M context)
|
Backport to |
### What changes were proposed in this PR? Follow-up to PR #4899, which retired the `triage` label workflow in favor of the search filter `is:issue is:open no:assignee`. The three issue templates still carried `labels: ["triage"]` at the top, so every new issue opened via the templates re-acquired the label even though no workflow consumes it anymore. Drop the line in `bug-template.yaml`, `task-template.yaml`, and `feature-template.yaml` (one line each). ### Any related issues, documentation, discussions? Closes #4917. Sequel to #4899. After this lands, the `triage` label itself can be deleted from the repo: ``` gh api -X DELETE /repos/apache/texera/labels/triage ``` That removes the chip from every issue that still carries it. ### How was this PR tested? YAML parse on all three templates. Behavior verifiable post-merge by opening a new issue from any template and confirming no `triage` label is attached. ### Was this PR authored or co-authored using generative AI tooling? Generated-by: Claude Opus 4.7 (1M context)
What changes were proposed in this PR?
triageis a derived state (issue needs triage iff it has no assignee). Materializing it as a label means every assignee mutation has to keep the label in sync, which is fragile acrossGITHUB_TOKEN-authored writes, third-party bots, and dropped webhooks. Drop the label; reviewers use the search filteris:issue is:open no:assigneeinstead..github/workflows/issue-triage.yml(the entire triage-label state machine)..github/workflows/take-commands.yml: handles/take(self-assign) and/untake(self-unassign) on issues.pr-assignment.ymlthat referenced the removed workflow.labels: ["triage"]is left inbug-template.yaml,task-template.yaml,feature-template.yamlso that change can be backported on its own. Until that follow-up lands and the label itself is deleted from the repo, newly opened issues will continue to acquire the label.Simplified issue lifecycle
The new model is "assignee = ownership; no assignee = needs triage". One filter and three transition rules — no reified state.
Stacked claims
/takeuses GitHub'saddAssignees, which is append-semantics — existing assignees are not replaced. So if Alice has already taken an issue and goes inactive, Bob commenting/takeproduces a co-assignment rather than a rejection. Comment history records the order./untakeonly removes the commenter from the assignee list, leaving anyone else in place. At merge time the credit step overwrites the whole list with the actual contributors, so stacked claims are explicitly tentative.Behavior preserved by
pr-assignment.yml(already on main):Closes #N→ opener is auto-assigned to each linked issue (issue leaves the no-assignee filter).Any related issues, documentation, discussions?
Closes #4898.
After merge, the
triagelabel can be deleted from the repo as a one-shot cleanup (gh api -X DELETE /repos/apache/texera/labels/triage); that drops the chip from every existing issue at once. Any saved searches / project-board automation keyed onlabel:triageshould be moved tono:assignee.The follow-up to drop
labels: ["triage"]from the three issue templates is a separate change so it can be backported independently.How was this PR tested?
Static checks: YAML parse on both workflow files. Behavior verifiable post-merge: opening a PR with
Closes #Nshould remove#Nfrom theis:open no:assigneefilter; closing the PR unmerged should put it back; commenting/take//untakeshould toggle the assignee. Two users commenting/takein sequence should produce a stacked co-assignment.Was this PR authored or co-authored using generative AI tooling?
Generated-by: Claude Opus 4.7 (1M context)