You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The "Area" dropdown is the product-surface axis for issue intake. Its canonical list lives in .github/issue-areas.yml (lines 32-38) and is mirrored into three templates' id: area dropdowns (bug_report.yml:5-16, feature_request.yml, enhancement.yml), with .github/workflows/issue-templates-drift.yml failing CI on any divergence and .github/workflows/issue-labeler.yml reading the file at runtime to compute valid labels.
The axis is broken because it conflates two different dimensions:
A product surface (where the code lives), and
A kind-of-work dimension that the native GitHub issue type already owns (this repo has types Task, Bug, Feature, Enhancement, Infrastructure, Discussion).
Symptoms:
tooling is a 53% catch-all — 133 of 247 open issues. It is a kind, not a surface: 91 of those 133 (68%) are already typed Infrastructure (measured 2026-06-08), so the label largely re-encodes the native issue-type axis. Splitting tooling into ci/build/deps/release would just recreate the same axis-conflation one level down.
CODEOWNERS-owned dirs have no area.CODEOWNERS owns /docs/ and /website/ (lines 25-26) and /.github/ (line 29), but there are no docs, website, or infra areas. So docs-site, user-docs, and CI work all fall into tooling or needs-triage.
The root defect is the axis design, not the parsing/labeler machinery (which #885/#946/#948 cover). Fixing it drains both the tooling and needs-triage piles at the source.
Proposal / Recommendation
Make Area a pure product-surface axis that maps 1:1 to CODEOWNERS dirs wherever possible, lets the native Infrastructure issue type own the kind-of-work dimension, and admits exactly one justified cross-cutting exception (security).
New .github/issue-areas.yml list (keep values FLAT bare strings; defer any area/* namespacing):
Dissolve tooling. Its CI surface becomes infra (maps to /.github/). The kind-of-work dimension (ci/build/deps/release) is carried by the existing Infrastructure issue type, NOT by new area labels. Do not add ci/build/deps/release as areas.
Add docs (/docs/) and website (/website/) — the only CODEOWNERS-owned dirs with no area.
Add security — the one sanctioned cross-cutting label (no 1:1 dir) for the SLSA/cosign/Scorecard/vuln issues currently invisible inside tooling.
Keep cli/spec/go-glx/import-export unchanged — each maps 1:1 to a CODEOWNERS dir. Low issue count is a product signal, not a defect.
This is a data-only change to the runtime-read list plus the mirrored dropdowns — no labeler/awk/PyYAML code change is required (issue-labeler.yml and issue-templates-drift.yml read the list dynamically).
New labels needed (do not yet exist as repo labels)
docs, website, infra, security must be created as repo labels before this lands. This matters because of #946: the labeler hard-fails gh --add-label when a valid area has no backing repo label. Conversely, ui and tooling labels should be deleted only after a scripted relabel of the ~133 tooling + 4 ui issues by directory heuristic.
Sequencing (to avoid breaking the labeler / drift gate)
Scripted relabel of the ~133 tooling + 4 ui open issues to the new surface labels by directory/keyword heuristic; tag security issues security.
Update .github/issue-areas.yml AND all three templates' id: area option lists in the same commit (the issue-templates-drift.yml gate fails otherwise).
Delete the now-unused ui and tooling repo labels.
Acceptance criteria
.github/issue-areas.ymlareas: is exactly cli, spec, go-glx, import-export, docs, website, infra, security (flat bare strings).
The id: area dropdown options in bug_report.yml, feature_request.yml, and enhancement.yml match the new list; issue-templates-drift.yml passes on the PR.
Note: this issue is itself filed under area tooling only because that is the closest existing label until infra exists — which is precisely the bucket this proposal dissolves.
Follow-up issues filed alongside this one (same review)
This issue is the hub for a focused 2026 review of .github/issue-areas.yml and its labeling machinery (how the canonical Area list relates to the three issue-form templates, the issue-templates-drift gate, the issue-labeler workflow, the repo labels, and CODEOWNERS). The concrete sub-findings were filed separately:
Context / Problem
The "Area" dropdown is the product-surface axis for issue intake. Its canonical list lives in
.github/issue-areas.yml(lines 32-38) and is mirrored into three templates'id: areadropdowns (bug_report.yml:5-16,feature_request.yml,enhancement.yml), with.github/workflows/issue-templates-drift.ymlfailing CI on any divergence and.github/workflows/issue-labeler.ymlreading the file at runtime to compute valid labels.Today the list is:
The axis is broken because it conflates two different dimensions:
Task, Bug, Feature, Enhancement, Infrastructure, Discussion).Symptoms:
toolingis a 53% catch-all — 133 of 247 open issues. It is a kind, not a surface: 91 of those 133 (68%) are already typedInfrastructure(measured 2026-06-08), so the label largely re-encodes the native issue-type axis. Splittingtoolingintoci/build/deps/releasewould just recreate the same axis-conflation one level down.CODEOWNERSowns/docs/and/website/(lines 25-26) and/.github/(line 29), but there are nodocs,website, orinfraareas. So docs-site, user-docs, and CI work all fall intotoolingorneeds-triage.toolingissues (a quarter) are SLSA/cosign/Scorecard/vuln/supply-chain work (e.g. CI: add harden-runner to release and security workflows #350 harden-runner, SECURITY.md: add safe harbor clause and embargo policy #424 SECURITY.md, dependabot: add native cooldown (min-release-age) to defend against worm-class supply-chain updates #929 dependabot cooldown, ci: set persist-credentials: false on read-only checkout steps (artipacked hardening) #945 artipacked, scorecard.yml: SHA-pin ossf/scorecard-action and codeql-action/upload-sarif (match repo convention; reconcile codeql with security.yml) #1019 SHA-pin scorecard) — buried insidetoolingwith no cross-cutting label to find them by.ui(4 issues) is mixed and partly backs no code. It conflates VitePress docs-site issues (Website: upgrade VitePress from alpha to stable release #277/Website: add OpenGraph and Twitter Card meta tags #281) with archive-viewer vaporware (Read-only web viewer for sharing archives #91/Visual editor — local-first browser UI for GLX archives #93).uimaps to no directory in CODEOWNERS.The root defect is the axis design, not the parsing/labeler machinery (which #885/#946/#948 cover). Fixing it drains both the
toolingandneeds-triagepiles at the source.Proposal / Recommendation
Make Area a pure product-surface axis that maps 1:1 to CODEOWNERS dirs wherever possible, lets the native
Infrastructureissue type own the kind-of-work dimension, and admits exactly one justified cross-cutting exception (security).New
.github/issue-areas.ymllist (keep values FLAT bare strings; defer anyarea/*namespacing):Rationale per change:
tooling. Its CI surface becomesinfra(maps to/.github/). The kind-of-work dimension (ci/build/deps/release) is carried by the existingInfrastructureissue type, NOT by new area labels. Do not addci/build/deps/releaseas areas.docs(/docs/) andwebsite(/website/) — the only CODEOWNERS-owned dirs with no area.security— the one sanctioned cross-cutting label (no 1:1 dir) for the SLSA/cosign/Scorecard/vuln issues currently invisible insidetooling.ui. Route VitePress docs-site issues (Website: upgrade VitePress from alpha to stable release #277/Website: add OpenGraph and Twitter Card meta tags #281) towebsite; leave the archive-viewer vaporware (Read-only web viewer for sharing archives #91/Visual editor — local-first browser UI for GLX archives #93) astype: Featurewith no area until it is real code.cli/spec/go-glx/import-exportunchanged — each maps 1:1 to a CODEOWNERS dir. Low issue count is a product signal, not a defect.This is a data-only change to the runtime-read list plus the mirrored dropdowns — no labeler/awk/PyYAML code change is required (
issue-labeler.ymlandissue-templates-drift.ymlread the list dynamically).New labels needed (do not yet exist as repo labels)
docs,website,infra,securitymust be created as repo labels before this lands. This matters because of #946: the labeler hard-failsgh --add-labelwhen a valid area has no backing repo label. Conversely,uiandtoolinglabels should be deleted only after a scripted relabel of the ~133tooling+ 4uiissues by directory heuristic.Sequencing (to avoid breaking the labeler / drift gate)
docs,website,infra,security(prerequisite — see issue-labeler: a valid Area whose repo label is missing hard-fails gh --add-label (drift check guards options, not label existence) #946).tooling+ 4uiopen issues to the new surface labels by directory/keyword heuristic; tag security issuessecurity..github/issue-areas.ymlAND all three templates'id: areaoption lists in the same commit (theissue-templates-drift.ymlgate fails otherwise).uiandtoolingrepo labels.Acceptance criteria
.github/issue-areas.ymlareas:is exactlycli, spec, go-glx, import-export, docs, website, infra, security(flat bare strings).id: areadropdown options inbug_report.yml,feature_request.yml, andenhancement.ymlmatch the new list;issue-templates-drift.ymlpasses on the PR.docs,website,infra,securityexist before the templates change merges (guards issue-labeler: a valid Area whose repo label is missing hard-fails gh --add-label (drift check guards options, not label existence) #946).toolingand 4uiopen issues are relabeled to surface labels; security issues additionally carrysecurity.uiandtoolingrepo labels are deleted after the relabel.issue-labeler.yml/issue-templates-drift.ymlparsing logic (list is read at runtime).ci/build/deps/releaseare NOT added as areas (kind-of-work stays on theInfrastructureissue type).type: Featurewith no area; docs-site issues (Website: upgrade VitePress from alpha to stable release #277/Website: add OpenGraph and Twitter Card meta tags #281) carrywebsite.Relates to
docs/website/infra/securitylabels must be created before the list changes.issue-templates-drifthardening (4th-template glob gap, concurrency group); this PR touches the templates the drift gate guards.Note: this issue is itself filed under area
toolingonly because that is the closest existing label untilinfraexists — which is precisely the bucket this proposal dissolves.Follow-up issues filed alongside this one (same review)
This issue is the hub for a focused 2026 review of
.github/issue-areas.ymland its labeling machinery (how the canonical Area list relates to the three issue-form templates, theissue-templates-driftgate, theissue-labelerworkflow, the repo labels, and CODEOWNERS). The concrete sub-findings were filed separately:issue-labeler:needs-triageis additive-only and never cleared — ~93% ofneeds-triagelabels are false positives (Infrastructure). The bug that inflates theneeds-triagepile this proposal also drains.issue-templates-drift: the gate guardsid: area+ options but the labeler keys on the rendered### Areaheading; also assert the dropdownlabelisArea(Infrastructure).issue-areas.ymlinto each template (--checkmode, mirroringmake docs-cli).ci: scheduled taxonomy-drift tripwire that alerts when any one Area exceeds ~30% of open issues (would have caught the 53%toolingoverload automatically) (Infrastructure).cli/import-export/go-glx) as part of this pass — concrete evidence that the "empty"import-exportarea is empty because work was misrouted toneeds-triage, not because the work doesn't exist.