chore: label-consolidation - Align Decision taxonomy and templates - #3534
Conversation
…laces Question - issue-types.yml: 25 types with descriptions and colours from docs/LABEL_COLOR_STRATEGY.md; Decision replaces Question - labels.yml: type:* colours match issue-types.yml; type:question removed; type:decision 3467D3 - Add 06-decision.md issue template; remove 06-question.md; issue chooser links questions to Discussions - issue-fields.yml: type:decision mapping; drop 10 non-canonical type mappings; issue type lists match issue-types.yml - docs/ISSUE_FIELDS.md type table rebuilt from issue-fields.yml - yaml-validator: issue types accept a description Spec 008 task T040b. Approved in #3530. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018WC6kKorYRTVqd5RVtHFuZ
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository: lightspeedwp/.github/.coderabbit.yml Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: lightspeedwp/.github/.coderabbit.yml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (9)
💤 Files with no reviewable changes (1)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthroughThe issue taxonomy and project-field mappings are revised. The issue-type registry adds descriptions and a Decision type, while removing Question. A YAML validator now checks issue-type descriptions. A Decision template replaces the Question template, and a contact link directs questions and support requests to GitHub Discussions. ChangesIssue taxonomy and intake
Priority: ➖ Normal Estimated code review effort: 3 (Moderate) | ~20 minutes Change: Other Suggested reviewers: Merge Risk: ⚪ Minimal · up to The issue-type, project-field, and intake updates have no established merge-blocking issue; merge after normal checks. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018WC6kKorYRTVqd5RVtHFuZ
PR Template RoutingBranch Type: This PR was automatically routed based on the branch naming strategy. |
- research R12 (issue type colours and descriptions) and R13 (credentials for organisation-wide changes) - data model: Issue Type entity - quickstart Test 10c (colour and description parity) and a credentials check in Test 14 - plan: stage 3 only verifies native issue types (done in stage 0a); constitution re-check covers FR-018 security and PR #3534 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018WC6kKorYRTVqd5RVtHFuZ
📋 Changelog Quality Validation
Status✅ Validation PASSED - No new failures introduced by this PR. No action required. |
PR Summary by QodoAlign canonical issue types and replace Question with Decision
AI Description
Diagram
High-Level Assessment
Files changed (8)
|
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Resolve the missing area label, native issue-type synchronization list, and contradictory documentation/routing references.
Get a fresh assessment by requesting another Copilot review.
Review effort: Lite
Findings: 2
Open (3)
What changed in this PR
Aligns the repository around 25 canonical issue types, replacing Question with Decision.
Changes:
- Updates issue types, label colours, descriptions, and mappings.
- Adds the Decision template and routes questions to Discussions.
- Updates validation, documentation, and changelog entries.
| File | Description |
|---|---|
scripts/agents/includes/yaml-validator.js |
Supports issue-type descriptions. |
docs/ISSUE_FIELDS.md |
Updates type mappings; remaining sections still require alignment. |
CHANGELOG.md |
Records the governance update. |
.github/labels.yml |
Aligns type-label colours and removes Question. |
.github/issue-types.yml |
Defines canonical issue types and descriptions. |
.github/issue-fields.yml |
Updates mappings; enabled native issue types remain incomplete. |
.github/ISSUE_TEMPLATE/config.yml |
Routes questions to Discussions. |
.github/ISSUE_TEMPLATE/06-question.md |
Removes the Question template. |
.github/ISSUE_TEMPLATE/06-decision.md |
Adds the Decision template; area scoping remains unresolved. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Title prefix is decision: and the default area is area:governance, as in 06-decision.md on #3534. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011cim45iF9naViRzx5vUysK
|
Here's where each item from your pre-merge list stands:
I also merged the latest Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011cim45iF9naViRzx5vUysK
|
🤖 Completed: Generate docstrings for PR #3534 — View commit |
|
This pull request does not currently match the merge queue conditions, so it cannot be queued from here. The box comes back if it matches again. |
|
/agentic_review |
Code Review by Qodo
1. Existing questions lose their type
|
| type:build: Automation | ||
|
|
||
| # Integration & Dependencies Group | ||
| type:integration: Compatibility |
There was a problem hiding this comment.
3. Integration metadata falls back to task 🐞 Bug ≡ Correctness
inferTypeFromContext still emits type:integration, but the PR removes that key from project_field_mappings.Type. When an unlabelled issue or pull request mentions integration, dependency, compatibility, or interoperability work, the failed lookup reaches the generic Task or Chore fallback instead of Compatibility or Dependency Update.
Code
- type:integration: CompatibilityRelevance
●●● Strong
Recent accepted findings consistently require mappings and dependent configuration to remain synchronized after taxonomy changes.
ⓘ Recommendations generated based on similar findings in past PRs
Evidence
The inference rule returns the removed type:integration label, while the revised mapping contains only type:compat and type:dependency. A missing lookup returns an empty value and subsequently invokes the generic issue or pull-request fallback.
scripts/agents/includes/derive-project-fields.cjs[84-90]
scripts/agents/includes/derive-project-fields.cjs[119-145]
scripts/agents/includes/derive-project-fields.cjs[240-246]
.github/issue-fields.yml[65-82]
Agent Prompt
## Issue description
Integration-related text inference still produces the removed `type:integration` alias, causing metadata derivation to use generic fallback types.
## Fix Focus Areas
- scripts/agents/includes/derive-project-fields.cjs[84-90]
- .github/issue-fields.yml[65-82]
## Recommended Fix
Replace the obsolete inference rule with canonical taxonomy labels. Map dependency-specific terms to `type:dependency`, and map compatibility, integration, and interoperability terms to `type:compat`; add regression tests proving the resulting values are Dependency Update and Compatibility.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| function isAlreadyPrefixed(title) { | ||
| const prefixPattern = | ||
| /^(fix|feat|hotfix|refactor|chore|docs|test|perf|ci|build|deps|security|design|a11y|ux|release|research|revert|i18n|ops|proto|ds|api|schema|telemetry|content|seo|config|migrate|qa|uat|audit):\s*/i; | ||
| /^(fix|feat|hotfix|refactor|chore|docs|test|perf|ci|build|deps|security|design|a11y|ux|release|research|revert|i18n|ops|proto|ds|api|schema|telemetry|content|seo|config|migrate|qa|uat|audit|decision|question):\s*/i; |
There was a problem hiding this comment.
5. Bare decision titles stay malformed 🐞 Bug ≡ Correctness
isAlreadyPrefixed in the executable CommonJS normalizer uses :\s*, unlike the JavaScript implementation and its tests, so decision: and question: are accepted without required separating whitespace. Running that variant against either bare prefix returns no update, while the tested implementation prepends the selected prefix to expose and normalize the malformed title.
Code
+ /^(fix|feat|hotfix|refactor|chore|docs|test|perf|ci|build|deps|security|design|a11y|ux|release|research|revert|i18n|ops|proto|ds|api|schema|telemetry|content|seo|config|migrate|qa|uat|audit|decision|question):\s*/i;Relevance
●●● Strong
This is a deterministic parity bug between executable variants, and recent automation findings of this type were accepted.
ⓘ Recommendations generated based on similar findings in past PRs
Evidence
The changed CommonJS pattern recognizes the newly added prefixes with zero trailing whitespace, and normalizeTitle immediately returns without changing recognized titles. The JavaScript copy requires whitespace, while its test suite explicitly expects a prefix with no space to be normalized rather than skipped.
scripts/automation/normalize-issue-pr-titles.cjs[187-204]
scripts/automation/normalize-issue-pr-titles.js[187-193]
scripts/automation/tests/normalize-titles.test.js[133-143]
Agent Prompt
## Issue description
The CommonJS title normalizer accepts bare Decision and Question prefixes that the tested JavaScript implementation rejects.
## Fix Focus Areas
- scripts/automation/normalize-issue-pr-titles.cjs[187-193]
- scripts/automation/normalize-issue-pr-titles.js[187-193]
- scripts/automation/__tests__/normalize-titles.test.js[133-143]
## Recommended Fix
Change the CommonJS regular expression from `:\s*` to `:\s+` so both executable implementations share the tested behavior, and run the same prefix edge-case tests against both modules.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| - name: type:question | ||
| color: 4393F8 | ||
| description: "Question or enquiry" |
There was a problem hiding this comment.
1. Existing questions lose their type 🐞 Bug ≡ Correctness
standardizeLabelsOnItem() removes every label absent from the canonical set, and deleting type:question gives it no alias or preservation path. When a pre-existing question issue is next edited or reopened, the active labeling workflow reaches this cleanup after seeing the stale type label, removes it, and does not add a replacement or convert the issue to a Discussion.
Code
-- name: type:question
- color: 4393F8
- description: "Question or enquiry"
+ color: 3467D3
+ description: 'Large multi-scope initiative'Relevance
●●● Strong
The team accepts findings requiring canonical-label preservation and migration clarity when removing or consolidating labels.
ⓘ Recommendations generated based on similar findings in past PRs
Evidence
The active workflow invokes the labeling agent for issue events. That agent loads aliases only from labels.yml, then removes every label not in its canonical set when no alias resolves; defaults and content detection both inspect the original label snapshot first, so an existing type:question prevents a new type from being added before cleanup.
.github/workflows/labeling-unified.yml[147-174]
scripts/agents/includes/label-lookup.js[25-51]
scripts/agents/labeling.agent.js[204-237]
scripts/agents/labeling.agent.js[432-484]
scripts/agents/labeling.agent.js[516-533]
Agent Prompt
## Issue description
Retiring `type:question` causes the active label standardizer to remove that label from existing question issues without adding a replacement. Existing questions must remain identifiable until they are explicitly converted to Discussions or manually relabelled.
## Fix Focus Areas
- .github/labels.yml[145-151]
- scripts/agents/labeling.agent.js[204-237]
- scripts/agents/labeling.agent.js[516-533]
## Recommended Fix
Add an explicit deprecated-label migration policy for `type:question` before removing it from canonical labels. The standardizer must preserve this legacy label until a deliberate conversion/relabel action occurs, or perform a real migration that adds the intended replacement and records the conversion; do not silently strip it.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| name: "❓ Question" | ||
| about: "Ask a question or request help" | ||
| title: "type:question: {scope} - {short description}" | ||
| labels: ["type:question", "status:needs-triage", "priority:normal", "area:core"] |
There was a problem hiding this comment.
4. Question authors reach a missing form 🐞 Bug ⚙ Maintainability
The PR deletes 06-question.md, while the constitution’s canonical Issue Type to Template Mapping still names that file for Question and does not add the new Decision form. Anyone following the mandatory routing table is directed to a nonexistent template instead of the configured Discussions path.
Code
-name: "❓ Question"
-about: "Ask a question or request help"
-title: "type:question: {scope} - {short description}"
-labels: ["type:question", "status:needs-triage", "priority:normal", "area:core"]Relevance
●●● Strong
Accepted precedent requires removing templates to update all routing documentation and chooser references consistently.
ⓘ Recommendations generated based on similar findings in past PRs
Evidence
The repository’s constitution says every canonical issue type maps to exactly one template and specifically maps Question to 06-question.md. The new template and issue chooser instead direct questions to Discussions, and the referenced Question template no longer exists on the PR branch.
.specify/memory/constitution.md[100-128]
.github/ISSUE_TEMPLATE/06-decision.md[10-14]
.github/ISSUE_TEMPLATE/config.yml[2-5]
Agent Prompt
## Issue description
The canonical issue-type routing table still sends Question creators to the deleted `06-question.md` template and omits the new Decision template. It must describe the new Discussions route and the Decision form so repository guidance agrees with the chooser configuration.
## Fix Focus Areas
- .specify/memory/constitution.md[100-128]
- .github/ISSUE_TEMPLATE/06-decision.md[1-14]
- .github/ISSUE_TEMPLATE/config.yml[2-5]
## Recommended Fix
Replace the Question template row with guidance that questions belong in GitHub Discussions, and add a Decision row pointing to `06-decision.md` with `type:decision`. Update the surrounding routing language if necessary so it no longer claims every canonical type has an issue template.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| blank_issues_enabled: false | ||
| contact_links: | ||
| - name: Questions and support | ||
| url: https://github.com/lightspeedwp/.github/discussions |
There was a problem hiding this comment.
2. Scaffold questions reach wrong forum 🔗 Cross-repo conflict ≡ Correctness
.github/ISSUE_TEMPLATE/config.yml hard-codes the questions link to lightspeedwp/.github/discussions, contrary to both scaffold repositories’ documented project-specific Discussions destinations. Because both scaffolds inherit the central issue configuration, contributors using their issue choosers are routed away from the repository where their theme or plugin question belongs.
Code
+ url: https://github.com/lightspeedwp/.github/discussionsRelevance
●● Moderate
Cross-repository routing concern is plausible, but no close precedent establishes project-specific Discussions URLs as required here.
ⓘ Recommendations generated based on similar findings in past PRs
Evidence
The PR hard-codes the governance repository’s Discussions URL, while block-theme-scaffold directs community questions to theme_repo_url/discussions and block-plugin-scaffold directs general questions to its generated plugin repository’s Discussions page. These project-specific destinations conflict with the inherited central link.
.github -> block-theme-scaffold
.github -> block-plugin-scaffold
.github/ISSUE_TEMPLATE/config.yml[1-8]
External repo: lightspeedwp/block-theme-scaffold, SUPPORT.md [23-32]
External repo: lightspeedwp/block-plugin-scaffold, CONTRIBUTING.md [394-400]
External repo: lightspeedwp/block-plugin-scaffold, SUPPORT.md [88-95]
Agent Prompt
## Issue description
The organization-level issue chooser is inherited by scaffold repositories, but its hard-coded Discussions URL sends their users to the `.github` governance repository instead of the project-specific forum documented by each scaffold.
## Fix Focus Areas
- .github/ISSUE_TEMPLATE/config.yml[3-5]
- /cross_repos/block-theme-scaffold/SUPPORT.md[23-32]
- /cross_repos/block-plugin-scaffold/CONTRIBUTING.md[394-400]
## Recommended Fix
Do not publish a repository-specific Discussions URL through inherited organization configuration. Coordinate repository-local `.github/ISSUE_TEMPLATE/config.yml` files in both scaffolds using their own Discussions URLs, or retain a central question route until those local overrides are deployed.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Chore Pull Request
Linked issues
Closes #3557 (
[TEMPLATE-UPDATE-REQUEST]: Decision template and Discussions routing; approval pending)[ISSUE-TYPE-UPDATE-REQUEST]: issue types, descriptions and colours; approved in principle 2026-09-25, full sign-off pending). Not closed by this PR: its native issue-type step (T040c) is done by hand after this PR mergesissue-types-org-settings.mdanddecision-issue-template.md)Merge only after #3556 and #3557 are approved (constitution §II).
Summary
First step of the label consolidation work (spec 008 Stage 0a).
issue-types.ymland thetype:*labels inlabels.ymlnow use one agreed list of 25 issue types, with colours fromdocs/LABEL_COLOR_STRATEGY.mdand a description for every type. Decision replaces Question, as approved in #3530. Decision issues get adecision:title prefix, and questions go to GitHub Discussions.Changes
.github/issue-types.yml: 25 entries (Decision replaces Question), each with adescription; colours from the strategy doc..github/labels.yml: all 25type:*colours matchissue-types.yml(24 changed);type:questionremoved;type:decisionset to3467D3..github/ISSUE_TEMPLATE/06-decision.md: new Decision template (Summary, Context, Options Considered, Decision, Consequences, Linked Work, DoR, DoD), titledecision: {scope} - {short description}, default labelstype:decision,status:needs-triage,priority:normal,area:governance.06-question.mdremoved..github/ISSUE_TEMPLATE/config.yml: the issue chooser links questions to GitHub Discussions..github/issue-fields.yml:type:decisionmapping replacestype:question; 10 non-canonical type mappings removed; issue-type lists matchissue-types.yml.docs/ISSUE_FIELDS.md: type mapping table rebuilt fromissue-fields.yml(25 types).docs/ISSUE_PR_TITLE_GOVERNANCE.md§5:type:decision→decision; new questions go to Discussions, and issues already titledquestion:keep that title until converted.scripts/automation/normalize-issue-pr-titles.{js,cjs}:type:decision→decision:andtype:question→question:(both used to fall back tochore:); 2 new tests.scripts/agents/includes/yaml-validator.js: issue-type schema acceptsdescription.CHANGELOG.md: Unreleased entry.Impact / Compatibility
type:*label colours change when labels are next synced fromlabels.yml. New issues can no longer pick the Question template; questions go to Discussions. The livedeveloptaxonomy changes only when this PR merges.scripts/validation/validate-issue-fields.cjsnow passes (it failed ondevelopwith 10 non-canonical type mappings and a missingtype:docsreference indocs/ISSUE_FIELDS.md).Verification
a2f582bb; the cancelled runs were superseded by later runs on the same commit)validate-labeling-configs.cjsOK;validate-issue-fields.cjsparity and docs checks pass;check-template-labels.jsvalid;normalize-titles.test.js50/50;npm testshows only the 9 suites that also fail on unchangeddevelopISSUE_FIELDS.md,ISSUE_PR_TITLE_GOVERNANCE.md)Risk & Rollback
Not in this PR (later spec 008 tasks): the organisation's native issue types (T040c, manual), the never-delete list (T055, on #3362) and the remaining docs that mention
type:question(T058, on #3362).Changelog
Changed
decision:title prefix. (chore: label-consolidation - Align Decision taxonomy and templates #3534)Checklist (Global DoD / PR)
🤖 Generated with Claude Code
https://claude.ai/code/session_018WC6kKorYRTVqd5RVtHFuZ