Skip to content

chore: label-consolidation - Align Decision taxonomy and templates - #3534

Merged
ashleyshaw merged 8 commits into
developfrom
chore/issue-types-colours
Sep 25, 2026
Merged

ashleyshaw merged 8 commits into
developfrom
chore/issue-types-colours

Conversation

@ashleyshaw

@ashleyshaw ashleyshaw commented Sep 24, 2026 •

Copy link
Copy Markdown
Member

Chore Pull Request

This repository enforces changelog, release, and label automation for all PRs and issues.
See the organisation-wide Automation Governance & Release Strategy for required rules.

Linked issues

Closes #3557 ([TEMPLATE-UPDATE-REQUEST]: Decision template and Discussions routing; approval pending)

Merge only after #3556 and #3557 are approved (constitution §II).

Summary

First step of the label consolidation work (spec 008 Stage 0a). issue-types.yml and the type:* labels in labels.yml now use one agreed list of 25 issue types, with colours from docs/LABEL_COLOR_STRATEGY.md and a description for every type. Decision replaces Question, as approved in #3530. Decision issues get a decision: title prefix, and questions go to GitHub Discussions.

Changes

  • .github/issue-types.yml: 25 entries (Decision replaces Question), each with a description; colours from the strategy doc.
  • .github/labels.yml: all 25 type:* colours match issue-types.yml (24 changed); type:question removed; type:decision set to 3467D3.
  • .github/ISSUE_TEMPLATE/06-decision.md: new Decision template (Summary, Context, Options Considered, Decision, Consequences, Linked Work, DoR, DoD), title decision: {scope} - {short description}, default labels type:decision, status:needs-triage, priority:normal, area:governance. 06-question.md removed.
  • .github/ISSUE_TEMPLATE/config.yml: the issue chooser links questions to GitHub Discussions.
  • .github/issue-fields.yml: type:decision mapping replaces type:question; 10 non-canonical type mappings removed; issue-type lists match issue-types.yml.
  • docs/ISSUE_FIELDS.md: type mapping table rebuilt from issue-fields.yml (25 types).
  • docs/ISSUE_PR_TITLE_GOVERNANCE.md §5: type:decision → decision; new questions go to Discussions, and issues already titled question: keep that title until converted.
  • scripts/automation/normalize-issue-pr-titles.{js,cjs}: type:decision → decision: and type:question → question: (both used to fall back to chore:); 2 new tests.
  • scripts/agents/includes/yaml-validator.js: issue-type schema accepts description.
  • CHANGELOG.md: Unreleased entry.

Impact / Compatibility

  • Runtime/behaviour changes: type:* label colours change when labels are next synced from labels.yml. New issues can no longer pick the Question template; questions go to Discussions. The live develop taxonomy changes only when this PR merges.
  • Build/dev-experience impact: scripts/validation/validate-issue-fields.cjs now passes (it failed on develop with 10 non-canonical type mappings and a missing type:docs reference in docs/ISSUE_FIELDS.md).
  • Nine colours are marked inferred in the contract where the strategy doc has no explicit rule; they can be changed in review.

Verification

  • CI passes (all checks green on a2f582bb; the cancelled runs were superseded by later runs on the same commit)
  • Local build and smoke tests: validate-labeling-configs.cjs OK; validate-issue-fields.cjs parity and docs checks pass; check-template-labels.js valid; normalize-titles.test.js 50/50; npm test shows only the 9 suites that also fail on unchanged develop
  • Docs updated if developer-facing (ISSUE_FIELDS.md, ISSUE_PR_TITLE_GOVERNANCE.md)

Risk & Rollback

  • Risk level: Low
  • Rollback plan: revert the merge commit

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


Checklist (Global DoD / PR)


🤖 Generated with Claude Code

https://claude.ai/code/session_018WC6kKorYRTVqd5RVtHFuZ

…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
@coderabbitai

coderabbitai Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository: lightspeedwp/.github/.coderabbit.yml

Review profile: CHILL

Plan: Advanced

Run ID: c11548a4-0826-4827-8bf3-066cb5249e1b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: lightspeedwp/.github/.coderabbit.yml

Review profile: CHILL

Plan: Advanced

Run ID: 84ffcf90-cb41-46cb-8ab8-4cc3081bbfe0

📥 Commits

Reviewing files that changed from the base of the PR and between 3f50359 and 8942ab4.

📒 Files selected for processing (9)
  • .github/ISSUE_TEMPLATE/06-decision.md
  • .github/ISSUE_TEMPLATE/06-question.md
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/issue-fields.yml
  • .github/issue-types.yml
  • .github/labels.yml
  • CHANGELOG.md
  • docs/ISSUE_FIELDS.md
  • scripts/agents/includes/yaml-validator.js
💤 Files with no reviewable changes (1)
  • .github/ISSUE_TEMPLATE/06-question.md

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The 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.

Changes

Issue taxonomy and intake

Layer / File(s) Summary
Define and validate issue types
.github/issue-types.yml, .github/labels.yml, scripts/agents/includes/yaml-validator.js, CHANGELOG.md
The issue-type registry adds descriptions and Decision, and removes Question. Type-label colors change, and the validator checks that issue-type descriptions are non-empty strings.
Map issue types to project fields
.github/issue-fields.yml, docs/ISSUE_FIELDS.md
The project-field mappings and enabled issue types are updated for the revised taxonomy. The specification documents 25 canonical types mapped to 11 project-field values.
Update decision and question intake
.github/ISSUE_TEMPLATE/06-decision.md, .github/ISSUE_TEMPLATE/06-question.md, .github/ISSUE_TEMPLATE/config.yml
A Decision issue template is added, the Question template is removed, and a contact link directs questions and support requests to GitHub Discussions.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Other

Suggested reviewers: lightspeedwp

Merge Risk: ⚪ Minimal · up to 8942a

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)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 5 functions across 1 files. (7 skipped: 7 …
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: consolidating label and issue taxonomy and aligning the Decision templates.
✨ Finishing Touches
📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

ashleyshaw pushed a commit that referenced this pull request Sep 24, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018WC6kKorYRTVqd5RVtHFuZ
@github-actions

Copy link
Copy Markdown
Contributor

PR Template Routing

Branch Type: chore
Scope: issue-types-colours
Template: pr_chore.md
Labels Applied: type:chore

This PR was automatically routed based on the branch naming strategy.

ashleyshaw pushed a commit that referenced this pull request Sep 24, 2026
- 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
@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

📋 Changelog Quality Validation

Metric Count
✅ Passing 98
❌ Failing 10
🆕 New failures in this PR 0
📦 Pre-existing failures 10

Status

✅ Validation PASSED - No new failures introduced by this PR.
Note: 10 pre-existing failure(s) remain in the Unreleased section.

No action required.

@ashleyshaw ashleyshaw removed the type:bug label Sep 24, 2026 — with Claude
@ashleyshaw
ashleyshaw requested a review from eleshar September 24, 2026 07:05
@ashleyshaw
ashleyshaw marked this pull request as ready for review September 24, 2026 07:05
@ashleyshaw
ashleyshaw requested a review from a team as a code owner September 24, 2026 07:05
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Align canonical issue types and replace Question with Decision

⚙️ Configuration changes ✨ Enhancement 📝 Documentation 🕐 20-40 Minutes

Grey Divider

AI Description

• Standardizes 25 issue types, label colours, descriptions, and project-field mappings.
• Replaces Question issues with a structured Decision workflow.
• Routes questions to Discussions and updates validation and reference documentation.
Diagram

graph TD
  A["Issue type catalog"] --> B["Type labels"] --> C["Label sync"]
  A --> D["Field mappings"] --> E["Project fields"]
  A --> F["YAML validator"]
  A --> G["Decision template"]
  H["Issue chooser"] --> I["Discussions"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Generate derived configuration from one catalog
  • ➕ Eliminates manual colour and type drift across configuration and documentation.
  • ➕ Makes future taxonomy changes smaller and easier to verify.
  • ➖ Requires new generation tooling and contributor workflow changes.
  • ➖ Cannot fully automate organization settings that still require manual updates.
  • ➖ Would substantially expand this consolidation task's scope.

Recommendation: Keep the PR's synchronized configuration approach for this scoped migration because existing validators enforce canonical label and mapping parity. Consider a follow-up generator for labels and documentation if repeated taxonomy changes make maintaining duplicated declarations costly.

Files changed (8) +423 / -378

Enhancement (2) +147 / -109
06-decision.mdAdd a structured Decision issue template +76/-0

Add a structured Decision issue template

• Introduces a Decision template covering context, considered options, outcome, consequences, linked work, and readiness/completion criteria. It directs questions and support requests to Discussions.

.github/ISSUE_TEMPLATE/06-decision.md

yaml-validator.jsValidate issue-type descriptions +71/-109

Validate issue-type descriptions

• Extends the issue-type schema to accept non-empty descriptions. The file is also reformatted to the repository's single-quote and compact-call style.

scripts/agents/includes/yaml-validator.js

Documentation (2) +15 / -21
CHANGELOG.mdDocument the issue-type alignment +1/-0

Document the issue-type alignment

• Adds an Unreleased entry covering the colour and description alignment, the Decision replacement, and routing questions to Discussions.

CHANGELOG.md

ISSUE_FIELDS.mdRebuild canonical type-mapping documentation +14/-21

Rebuild canonical type-mapping documentation

• Updates the mapping table to match the 25 canonical labels and 11 project-field values, removing obsolete aliases and documenting Decision.

docs/ISSUE_FIELDS.md

Other (4) +261 / -248
config.ymlRoute questions and support to Discussions +3/-0

Route questions and support to Discussions

• Adds an issue-chooser contact link for questions and support, clarifying that issues track work and decisions use the Decision template.

.github/ISSUE_TEMPLATE/config.yml

issue-fields.ymlAlign issue-field projections with canonical types +15/-26

Align issue-field projections with canonical types

• Replaces the Question projection with Decision, removes ten non-canonical aliases, and aligns organization issue-type lists with the 25-type catalog.

.github/issue-fields.yml

issue-types.ymlDefine the canonical 25-type issue catalog +51/-26

Define the canonical 25-type issue catalog

• Aligns issue-type colours with the colour strategy and adds a detailed description to every type. Decision replaces Question in the locked organization-wide catalog.

.github/issue-types.yml

labels.ymlSynchronize type labels with the issue-type catalog +192/-196

Synchronize type labels with the issue-type catalog

• Aligns all canonical type-label colours, removes type:question, and standardizes type:decision. It also normalizes YAML description quoting throughout the file.

.github/labels.yml

@ashleyshaw ashleyshaw added this to the Backlog milestone Sep 24, 2026
@ashleyshaw ashleyshaw linked an issue Sep 24, 2026 that may be closed by this pull request
10 of 17 tasks
@ashleyshaw ashleyshaw modified the milestones: Backlog, v1.1 Sep 24, 2026
@ashleyshaw
ashleyshaw enabled auto-merge (squash) September 24, 2026 08:32
@ashleyshaw
ashleyshaw requested a lite review from Copilot September 24, 2026 10:33

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 Medium severity · 1 Low severity

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.

Comment thread .github/ISSUE_TEMPLATE/06-decision.md Outdated
Comment thread .github/issue-fields.yml
Comment thread docs/ISSUE_FIELDS.md
ashleyshaw pushed a commit that referenced this pull request Sep 25, 2026
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

Copy link
Copy Markdown
Member Author

Here's where each item from your pre-merge list stands:

I also merged the latest develop in (32e2b989). There were no conflicts. validate-labeling-configs, check-template-labels and validate-issue-fields all pass. I'll check CI once it has run on the new head.


Generated by Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011cim45iF9naViRzx5vUysK
@coderabbitai

coderabbitai Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

🤖 Completed: Generate docstrings for PR #3534 — View commit 975ddbb

@mergify

mergify Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

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.

@ashleyshaw
ashleyshaw merged commit 0d061c9 into develop Sep 25, 2026
21 checks passed
@ashleyshaw
ashleyshaw deleted the chore/issue-types-colours branch September 25, 2026 07:42
@eleshar

eleshar commented Sep 25, 2026

Copy link
Copy Markdown
Contributor

/agentic_review

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (4) 📘 Rule violations (0) 🔗 Cross-repo conflicts (1) 📜 Skill insights (0)

Grey Divider


Action required

1. Existing questions lose their type 🐞 Bug
Description
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

.github/labels.yml[L149-151]

-- 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.

PR-#2524

ⓘ 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
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## 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


2. Scaffold questions reach wrong forum 🔗 Cross-repo conflict
Description
.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

.github/ISSUE_TEMPLATE/config.yml[4]

+    url: https://github.com/lightspeedwp/.github/discussions
Relevance

●● 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
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## 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



Remediation recommended

3. Integration metadata falls back to Task 🐞 Bug
Description
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

.github/issue-fields.yml[69]

-    type:integration: Compatibility
Relevance

●●● Strong

Recent accepted findings consistently require mappings and dependent configuration to remain
synchronized after taxonomy changes.

PR-#2524
PR-#691

ⓘ 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
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## 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


View medium (1)
4. Question authors reach a missing form 🐞 Bug
Description
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

.github/ISSUE_TEMPLATE/06-question.md[L2-5]

-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.

PR-#966

ⓘ 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
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## 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



Informational

5. Bare decision titles stay malformed 🐞 Bug
Description
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

scripts/automation/normalize-issue-pr-titles.cjs[193]

+    /^(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.

PR-#2471

ⓘ 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
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## 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


Grey Divider

Context sources
✅ Compliance rules (platform): 30 rules
✅ Cross-repo context — repo relationships
  Explored: repo: lightspeedwp/block-theme-scaffold (sha: 52d58f0b) — View relationship
  Explored: repo: lightspeedwp/block-plugin-scaffold (sha: a09b4306) — View relationship
Review mode: 🧠 Deep: This broad taxonomy/configuration change spans many interdependent files and includes runtime validator and title-normalization logic, creating multiple independent, easy-to-miss consistency and behavior risks.

Grey Divider

Tip of the day
💡 Did you know, you can enable the Remediation agent and Qodo fixes findings in a dedicated fix PR

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Comment thread .github/issue-fields.yml
type:build: Automation

# Integration & Dependencies Group
type:integration: Compatibility

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

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: Compatibility
Relevance

●●● Strong

Recent accepted findings consistently require mappings and dependent configuration to remain
synchronized after taxonomy changes.

PR-#2524
PR-#691

ⓘ 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;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Informational

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.

PR-#2471

ⓘ 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

Comment thread .github/labels.yml
Comment on lines -149 to -151
- name: type:question
color: 4393F8
description: "Question or enquiry"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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.

PR-#2524

ⓘ 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

Comment on lines -2 to -5
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"]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

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.

PR-#966

ⓘ 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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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/discussions
Relevance

●● 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

5 participants