Repository navigation
Description
Task Summary
25 labels that exist in lightspeedwp repositories carry known items but have no target that spec 008 or the label documents define. The consolidation tool deletes every label outside the approved set, and it lists any such label with items and no target under needs_decision in the dry run (FR-016). Each of these needs a chosen target, or an explicit decision to drop the label, before its repository's deletion is approved.
Each label already has a row in evidence/linear-labels.json (all retire, or team-scope for area:monorepo). Choosing a target means changing that row to merge or rename with a target.
Linked Stories/Tasks
- Spec:
.github/specs/008-label-audit-consolidation/spec.md(FR-016, FR-023); tasks T043, T044, T064c, T065 - Mapping and coverage: Add spec 008 label mapping and label update request draft #3831 (
evidence/linear-labels.json,evidence/github-label-coverage.json) - Parent: epic: label-governance - Stabilise canonical labels and harden workflow automation #449; label update request: chore: labels - Add conflict-resolution labels to canonical taxonomy [LABEL-UPDATE-REQUEST] #3554
The 25 labels
Known items are the counts in the weekly label drift check run of 2026-10-04 (283 repositories read). The report caps counted rows, so each count is a lower bound, and it does not say whether an item is open or closed. The dry run reads the real state. A "candidate" is the closest approved label by name or description. It is not a decision, and the documents do not define a rule for it.
| Label | Known items | Repositories | Candidate target (not decided) |
|---|---|---|---|
agent-audit |
4 | 1 | none found |
component:ci |
4 | 1 | area:ci (the label documents define area:* and comp:*, not component:*) |
component:workflows |
2 | 1 | area:workflows (pending #3554) |
area:accessibility |
1 | 1 | area:a11y (description "Accessibility (WCAG compliance)") |
area:monorepo |
1 | 1 | none found (moved to a Linear team in the mapping) |
meta:refactor |
1 | 1 | type:refactor (an item must keep exactly one type:*) |
migrate:type:enhancement |
1 | 1 | type:improve (the earlier bare-label mapping maps enhancement there) |
migrate:type:compatibility |
1 | 1 | none found |
migrate:openspec:status/planning |
4 | 1 | spec:planning |
migrate:openspec:status/implementation |
2 | 1 | none found (three spec:implementation-* labels) |
migrate:openspec:status/production |
1 | 1 | spec:status-production |
migrate:openspec:status/testing |
1 | 1 | spec:status-testing |
phase-1-critical |
2 | 1 | none found |
phase-2-medium |
1 | 1 | none found |
phase-3-polish |
1 | 1 | none found |
phase:1 |
1 | 2 | none found |
ag-p14 |
1 | 1 | none found |
ag-phase |
1 | 1 | none found |
bug-fix |
1 | 1 | type:bug (an item must keep exactly one type:*) |
code-quality |
1 | 1 | none found |
error-handling |
1 | 1 | none found |
logging |
1 | 2 | none found |
observability |
1 | 1 | area:observability (pending #3554) |
reliability |
1 | 1 | none found |
reviewer |
1 | 1 | none found |
Steps / Checklist
- For each label, choose a target (
mergeorrename), or confirm it is retired and its items lose the label - Update the label's row in
evidence/linear-labels.jsonand regenerate withnode scripts/automation/label-mapping.cjs --write - Re-run the consolidation dry run for the repositories that hold these labels and confirm
needs_decisionis empty - Record the decisions on the label update request (chore: labels - Add conflict-resolution labels to canonical taxonomy [LABEL-UPDATE-REQUEST] #3554) or the deletion gate issue
Notes
- Not decided by this issue: the approvals that spec 008 FR-021 and FR-023 require from @ashleyshaw.
- Labels found only in private repositories are not named here; the drift check counts 57 of them.
Other follow-ups found while checking coverage
Each was verified on 2026-10-06 unless marked otherwise.
- Older drift report artifacts name private repositories. Corrected 2026-10-06: an earlier version of this item wrongly said the drift check had read fewer repositories. It had not. The 2026-10-04 run (37172762292) reported 283 repositories, 198 of them private, with their names and labels in its JSON artifact. After the 2026-10-04 privacy decision the report lists the 85 active public repositories only and summarises the private ones (199 checked). Two artifacts from before that change are still downloadable from this public repository until 2026-11-02 and 2026-11-03:
label-drift-report-37095484118(the 2026-10-03 content was not opened, so it is unverified) andlabel-drift-report-37172762292. Someone with repository admin rights should delete them. - Drift report issue shows one repository. Label drift report #3783 lists only the first 200 of 36,622 rows (all from
lightspeedwp/.github). The full data is in the run's JSON artifact, which expires. - Item counts are a lower bound. The report caps counted rows (13,318 rows had no count). Real counts come from the dry run, so no label's deletion should be judged from the counts above alone.
- Private-only labels are not mapped by name. 57 labels exist only in private repositories. The tool still handles them at run time (any such label with items lands in
needs_decision), and the details belong in the private gate (PRIVATE_REPORT_REPO), not in this public repository. - FR-015 wording. The spec calls the eight FR-015 type labels "Linear-only". All eight are live GitHub labels in
lightspeedwp/.github, and onlytype:maintenanceexists in Linear. Correct the wording inspec.md,plan.mdandresearch.md. - FR-015 absence from Linear is not airtight. Six complete team listings, the workspace listing and the Stage 1 export show none of the other seven, but the GitHub team listing was cut off at 250 labels and name-only searches miss team labels. Re-check with paging before Stage 5.
- Linear counts have moved. Live workspace counts differ from the 2026-10-02 export (for example
type:feature308 to 285,type:documentation1 to 2). Refresh the Stage 1 export before Stage 5, or have T069 read live counts. - No Linear label group for
type:*. A live check found no label groups, so Linear does not enforce one type per issue. T064 and T069 must enforce and verify it. - Label creation restriction is unverified. Whether label management is limited to team owners (T071) could not be seen with the available tools. A workspace admin has to confirm it in Linear settings.
- T041 was not run as written. The spec prescribes the inventory script with a short-lived fine-grained token. The coverage came from the existing drift check instead. Decide whether T041 is still needed, and amend or close it.
- Approvals still pending. The 4 type merges outside FR-012 and the 8
openspec:*gap entries in the label update request, plus chore: labels - Add conflict-resolution labels to canonical taxonomy [LABEL-UPDATE-REQUEST] #3554, chore: labels - Add area:labels to canonical taxonomy [LABEL-UPDATE-REQUEST] #3757, [TEMPLATE-UPDATE-REQUEST] Replace non-canonical labels in six PR template frontmatters #3548, task: label-consolidation - Approve issue type and label changes [ISSUE-TYPE-UPDATE-REQUEST] #3556 and task: label-consolidation - Approve Decision template and Discussions routing [TEMPLATE-UPDATE-REQUEST] #3557, still need @ashleyshaw's dated decision. Nothing here substitutes for it.
Status after #3831 merged (2026-10-06, commit 1a65abb)
The mapping (471 entries), the coverage evidence and the draft label update request are on develop. Rebuilding the mapping from develop reproduces the saved file with no problems, 66 automation suites pass (1,990 tests), and the real Stage 4 planner finds a row for every one of the 374 labels outside the approved set in lightspeedwp/.github. Still open:
-
Imports without a change request. Fixed in Cite a change request for every imported label (#3834) #3835 (merged as 6667d0b): the request is open as chore: labels - Consolidate labels across GitHub and Linear [LABEL-UPDATE-REQUEST] #3834, and all 49 imports now cite a change request (5 cite chore: labels - Add conflict-resolution labels to canonical taxonomy [LABEL-UPDATE-REQUEST] #3554,
area:labelscites chore: labels - Add area:labels to canonical taxonomy [LABEL-UPDATE-REQUEST] #3757, 43 cite chore: labels - Consolidate labels across GitHub and Linear [LABEL-UPDATE-REQUEST] #3834). T043 and T043a stay unticked because T043 depends on T041. -
T077. Ticked in Cite a change request for every imported label (#3834) #3835.
-
T046c and T046a. Reopening chore: labels - Add conflict-resolution labels to canonical taxonomy [LABEL-UPDATE-REQUEST] #3554 is manual and still outstanding, and T046a depends on it.
-
Linear comments. The opencode session with Linear access fails every request with a 400 APIError, so the status comments on GIT-2338, GIT-2543 and GIT-847 were not made. Use a fresh session.
Status 2026-10-06: targets chosen, in #3839
No new pull request. The work is on #3839 (commit 6f10a9e), and the regenerated request is applied to #3834.
Five labels now have a proposed merge target. Each follows a row the mapping had already decided, named in the row's note:
| Label | Target | Precedent |
|---|---|---|
component:workflows |
area:workflows |
comp:workflows merges into area:workflows (FR-012) |
component:ci |
area:ci |
same family as comp:workflows; area:ci is "Build and CI pipelines" |
meta:refactor |
type:refactor |
refactor and type/refactor already resolve there |
observability |
area:observability |
same word; #3554 requests area:observability |
area:accessibility |
area:a11y |
area:a11y is described as "Accessibility (WCAG compliance)" |
The other 20 stay retire, and the tool still lists their items under needs_decision per repository, so no item loses a label unreviewed. Reasons by group:
migrate:openspec:status/*(4): their parent rowsopenspec:status/*are already retired because thespec:*labels replace them (FR-011), so these follow the parents.phase-1-critical,phase-2-medium,phase-3-polish,phase:1: project phases are tracked in milestones and projects, as the existingphase-1,phase-2andphase:3rows already say.ag-p14,ag-phase: agent markers, like the other retiredag-*labels.migrate:type:enhancement,migrate:type:compatibility:type:enhancementandtype:compatibilityhave no row to follow.bug-fix,agent-audit,code-quality,error-handling,logging,reliability,reviewer: no row or document defines a target. Name similarity alone (for examplebug-fixandtype:bug) was not treated as a decision.area:monorepostaysteam-scope(FR-012).
A test pins all of this (label-mapping.test.js). The mapping still needs @ashleyshaw's dated decision (FR-021, FR-023); nothing here replaces it.
Metadata
Metadata
Assignees
Type
Fields
Priority
Activity
linear-code commentedon Oct 6, 2026
GIT-2589
[-]task: label-consolidation - Choose a target for 25 labels that carry items[/-][+]task: label-consolidation - Resolve label coverage follow-ups, including 25 labels with no target[/+]Map five GitHub-only labels to targets with a decided precedent (#3832)
chore: labels - Add the redacted label inventory and close T041, T043…