Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .github/ISSUE_TEMPLATE/03-task.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
name: Task
description: Track maintainer or agent execution work
description: Track narrow execution, audit, spike, migration, or follow-up work
title: "[Task] "
labels:
- task
body:
- type: markdown
attributes:
value: |
Use this for maintainer or agent execution work that is not a user-facing bug report or feature request.
Use this for narrow execution-only, audit, spike, migration, upstream follow-up, or tracking work.

Do not use Task when another type is clearer:
- Behavior is broken, incorrect, flaky, misleading, or regressed → `bug`
- A user-facing workflow or capability should improve → `enhancement`
- Documentation, templates, policies, or written process should change → `documentation`
- Internal cleanup, maintainability, architecture, test, or quality debt → add `tech-debt` as supplemental context

Keep the issue concrete enough that an agent can understand the target, scope, and verification path.
- type: textarea
Expand Down
12 changes: 12 additions & 0 deletions .github/ISSUE_TRIAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Issue triage labels

Use one primary type label whenever possible:

- `bug`: existing behavior is broken, incorrect, flaky, misleading, or regressed.
- `enhancement`: a user-facing workflow or capability should improve.
- `documentation`: docs, templates, policies, or written process should change.
- `task`: narrow execution-only, audit, spike, migration, upstream follow-up, or tracking work without clearer bug, feature, docs, or tech-debt semantics.

Do not use `task` as the default label for work an agent can do. If `bug`, `enhancement`, or `documentation` describes the work more clearly, use that label instead.

Area, priority, and context labels such as `app`, `ui`, `platform`, `harness`, `ci`, `P1`, `P2`, `upstream`, and `tech-debt` are supplemental and may be combined with the primary type. Use `tech-debt` for internal cleanup, maintainability, architecture, test, or quality debt; it does not require `task`.
1 change: 1 addition & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ Required for visible UI changes.
## Checklist

> **How to use this checklist:**
>
> - Tick a box by replacing `[ ]` with `[x]`. Do not edit, add, or remove items.
> - The bot-applied label items can only be honestly ticked AFTER the PR is opened and the labeler / priority-triage bots have run — return to the PR description and tick them then.
> - Most items are required. The few that are conditional are explicitly marked **(conditional)**; for those, leave unticked if they truly do not apply and explain why in Risk Notes. All other items must be ticked before requesting human review.
Expand Down
11 changes: 4 additions & 7 deletions .github/scripts/label-policy-check.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,12 @@ export function validateLabelPolicy({ itemType, labels = [] }) {

const routing = intersection(labelSet, POLICY.routing)
if (routing.length < 1) {
errors.push(error(`${itemType} must have at least one primary routing label: ${labelList(POLICY.routing)}`, routing))
}

if (labelSet.has("tech-debt") && !labelSet.has("task")) {
errors.push(error("tech-debt is only allowed with the task type label", ["tech-debt"]))
errors.push(
error(`${itemType} must have at least one primary routing label: ${labelList(POLICY.routing)}`, routing),
)
}

const forbiddenIssueLabels =
itemType === "issue" ? intersection(labelSet, POLICY.issueForbiddenLabels) : []
const forbiddenIssueLabels = itemType === "issue" ? intersection(labelSet, POLICY.issueForbiddenLabels) : []
if (forbiddenIssueLabels.length > 0) {
errors.push(
error(`issue must not use PR automation labels: ${labelList(POLICY.issueForbiddenLabels)}`, forbiddenIssueLabels),
Expand Down
12 changes: 8 additions & 4 deletions .github/scripts/label-policy-check.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,9 @@ test("rejects multiple type labels", () => {
labels: ["bug", "task", "P2", "app"],
})

assert.deepEqual(messages(result), ["issue must have exactly one type label: bug, enhancement, task, or documentation"])
assert.deepEqual(messages(result), [
"issue must have exactly one type label: bug, enhancement, task, or documentation",
])
})

test("rejects missing primary routing labels", () => {
Expand All @@ -90,16 +92,18 @@ test("rejects missing primary routing labels", () => {
labels: ["task", "P2"],
})

assert.deepEqual(messages(result), ["issue must have at least one primary routing label: app, ui, platform, harness, or ci"])
assert.deepEqual(messages(result), [
"issue must have at least one primary routing label: app, ui, platform, harness, or ci",
])
})

test("rejects tech-debt outside task issues", () => {
test("accepts tech-debt as a supplemental label with any primary type", () => {
const result = validateLabelPolicy({
itemType: "issue",
labels: ["bug", "P2", "app", "tech-debt"],
})

assert.deepEqual(messages(result), ["tech-debt is only allowed with the task type label"])
assert.deepEqual(result.errors, [])
})

test("rejects dependency automation labels on issues", () => {
Expand Down