Uh oh!
There was an error while loading. Please reload this page.
chore(ci): add issue health audit and project field sync workflows - #1399
Conversation
✅ Template check passed after update. Thanks for fixing the PR description. |
Warning Review limit reached
Next review available in:2 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Repository YAML (base), Organization UI (inherited) Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (6)
📝 WalkthroughWalkthroughAdds a Phase 3 continuation plan, introduces a scheduled/manual issue health audit workflow for reopening incomplete issues and repairing labels, and updates project execution records. ChangesPhase 3 issue governance
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant GitHub Actions
participant Issue Health Audit
participant GitHub Issues API
participant Job Summary
GitHub Actions->>Issue Health Audit: Start on schedule or manual dispatch
Issue Health Audit->>GitHub Issues API: Fetch issues
Issue Health Audit->>GitHub Issues API: Reopen issues and add labels
Issue Health Audit->>Job Summary: Publish audit results
Possibly related issues
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
🧪 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 |
⏱️ Aging and SLA annotation
Maintained by project-meta-sync workflow. |
There was a problem hiding this comment.
Actionable comments posted: 8
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
@.github/projects/active/workflows-consolidation-2026-q3/PHASE_3_CONTINUATION_PROMPT.md:
- Line 140: Correct the Timeline total in the phase continuation prompt from
approximately 9 hours to approximately 7.5 hours, while preserving the existing
per-issue breakdown of 2 + 2.5 + 1.5 + 1.5 hours.
- Line 22: Synchronize the Phase 3 lifecycle records across
.github/projects/active/workflows-consolidation-2026-q3/PHASE_3_CONTINUATION_PROMPT.md:22,
.remember/now.md:102-126, .remember/now.md:204-210, and
.remember/phase-3.2-execution-continuation.md:11-27. Update the continuation
prompt to reflect the actual post-Phase-3.1 state or explicitly mark it
historical; reconcile PR `#1319` and PR `#1367` and align the later now.md entries
with that authoritative merge history. In phase-3.2-execution-continuation.md,
retain PR `#1367` as the merged workflow delivery and describe PR `#1390` only as
planning documentation unless it changed the workflow.
In @.github/workflows/issue-health-audit.yml:
- Around line 132-139: Update the issue-health audit logic around the
uncheckedMatches and checkedMatches calculations to reuse the DoD-section
extraction and checkbox-matching policy from
validate-issue-dod-before-close.yml, rather than scanning the entire issue body.
Ensure only checkboxes within the extracted DoD section determine whether the
issue is reopened.
- Around line 56-61: Update the report construction and label-processing flow so
type and priority entries are added only after addLabels succeeds, while dry-run
entries are recorded as planned rather than applied. Include successful
status:needs-triage additions in the summary, and ensure failed label requests
are recorded only in errors, using the existing report categories and addLabels
flow.
- Line 73: Update the label classification condition in the issue-health audit
workflow to return the canonical `type:build` label instead of `type:ci` for
matching build/CI titles. Preserve the existing pattern matching and
priority-label flow.
- Around line 34-36: Move the issues: write and contents: read permissions from
workflow scope into the audit-and-fix job, leaving the workflow default
read-only and ensuring only audit-and-fix receives the write token.
- Around line 94-119: Update the issue-fetching logic around openIssues and
closedIssues to filter both paginated datasets with !i.pull_request before
auditing. Change the closed-issue eligibility window to use the closed_at
timestamp rather than the API since parameter, ensuring only issues actually
closed within the last 28 days are eligible for reopening.
In @.remember/now.md:
- Around line 127-202: Remove the copied session-closing transcript from the
documented section, including the user-specific worktree removal command,
checklist, summary, and continuation instructions. Retain only a concise neutral
dated entry in the Daily Log Entry section describing the completed
restructuring documentation and PR status, without local paths or cleanup
commands.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository YAML (base), Organization UI (inherited)
Review profile: CHILL
Plan: Pro Plus
Run ID: 668c60b7-5af6-407b-b66d-4265a341a1cd
📒 Files selected for processing (4)
.github/projects/active/workflows-consolidation-2026-q3/PHASE_3_CONTINUATION_PROMPT.md.github/workflows/issue-health-audit.yml.remember/now.md.remember/phase-3.2-execution-continuation.md
📜 Review details
⏰ Context from checks skipped due to timeout. (6)
- GitHub Check: Unified Labeling, Status, and Type Assignment
- GitHub Check: coderabbit-gate
- GitHub Check: Testing
- GitHub Check: Standard Labeling, Status, and Type Assignment
- GitHub Check: Analyze (python)
- GitHub Check: Summary
⚠️ CI failures not shown inline (4)
GitHub Actions: Validate PR Template / validate-pr-template: chore(ci): add issue-health-audit workflow
Conclusion: failure
##[group]Run actions/github-script@v7
with:
script: const { validatePullRequestBody } = require('./scripts/validation/template-helpers.cjs');
const marker = '<!-- template-enforcement -->';
const pr = context.payload.pull_request;
const author = pr.user?.login || '';
const isDependabot = author === 'dependabot[bot]' || author === 'app/dependabot';
const isImgbot = author === 'imgbot[bot]' || author === 'app/imgbot';
if (isDependabot || isImgbot) {
core.info(`Skipping PR template validation for bot author ${author}.`);
return;
}
const validation = validatePullRequestBody(pr.body || '', pr.labels || [], pr.head?.ref || '');
const comments = await github.paginate(github.rest.issues.listComments, {
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
per_page: 100
});
const previous = comments.find((comment) =>
comment.user?.type === 'Bot' && comment.body?.includes(marker)
);
if (validation.missing.length === 0) {
if (previous) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: previous.id,
body: `${marker}\n✅ Template check passed after update. Thanks for fixing the PR description.`
});
}
return;
}
const message = [
marker,
'🚫 This PR description is missing required template content.',
'',
`Missing required section(s): ${validation.missing.join(', ')}`,
'',
'Please update the PR body using one of the repository PR templates:',
'- https://github.com/lightspeedwp/.github/blob/develop/.github/pull_request_template.md',
'- https://github.com/lightspeedwp/.github/tree/develop/.github/PULL_REQUEST_TEMPLATE',
'',
'Empty placeholders, unchecked checklist boxes, and stub issue references do not count.'
].join('\n');
if (previous) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: previous.id,
body: message
});
} else {
await github.rest.issues....
GitHub Actions: Validate PR Template / 0_validate-pr-template.txt: chore(ci): add issue-health-audit workflow
Conclusion: failure
##[group]Run actions/github-script@v7
with:
script: const { validatePullRequestBody } = require('./scripts/validation/template-helpers.cjs');
const marker = '<!-- template-enforcement -->';
const pr = context.payload.pull_request;
const author = pr.user?.login || '';
const isDependabot = author === 'dependabot[bot]' || author === 'app/dependabot';
const isImgbot = author === 'imgbot[bot]' || author === 'app/imgbot';
if (isDependabot || isImgbot) {
core.info(`Skipping PR template validation for bot author ${author}.`);
return;
}
const validation = validatePullRequestBody(pr.body || '', pr.labels || [], pr.head?.ref || '');
const comments = await github.paginate(github.rest.issues.listComments, {
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
per_page: 100
});
const previous = comments.find((comment) =>
comment.user?.type === 'Bot' && comment.body?.includes(marker)
);
if (validation.missing.length === 0) {
if (previous) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: previous.id,
body: `${marker}\n✅ Template check passed after update. Thanks for fixing the PR description.`
});
}
return;
}
const message = [
marker,
'🚫 This PR description is missing required template content.',
'',
`Missing required section(s): ${validation.missing.join(', ')}`,
'',
'Please update the PR body using one of the repository PR templates:',
'- https://github.com/lightspeedwp/.github/blob/develop/.github/pull_request_template.md',
'- https://github.com/lightspeedwp/.github/tree/develop/.github/PULL_REQUEST_TEMPLATE',
'',
'Empty placeholders, unchecked checklist boxes, and stub issue references do not count.'
].join('\n');
if (previous) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: previous.id,
body: message
});
} else {
await github.rest.issues....
GitHub Actions: Changelog • Management / 0_Validate changelog on PR.txt: chore(ci): add issue-health-audit workflow
Conclusion: failure
##[group]Run actions/github-script@v7
with:
script: const cp = require("node:child_process");
const author = context.payload.pull_request?.user?.login || "";
const labels = (context.payload.pull_request?.labels || []).map((l) => l.name);
const has = (name) => labels.includes(name);
if (author === "dependabot[bot]" || author === "app/dependabot") {
core.info("Skipping changelog requirement for Dependabot pull requests.");
core.setOutput("run_validation", "false");
return;
}
if (has("meta:needs-changelog") && has("meta:no-changelog")) {
core.setFailed("PR cannot include both meta:needs-changelog and meta:no-changelog.");
return;
}
const restrictedTypes = new Set([
"type:feature",
"type:bug",
"type:performance",
"type:security",
"type:release",
"type:hotfix",
]);
if (has("meta:no-changelog") && labels.some((label) => restrictedTypes.has(label))) {
core.setFailed("meta:no-changelog is not allowed for high-impact release-related change types.");
return;
}
const baseSha = context.payload.pull_request?.base?.sha;
const headSha = context.payload.pull_request?.head?.sha;
const changed = cp
.execSync(`git diff --name-only ${baseSha} ${headSha}`, {
encoding: "utf8",
maxBuffer: 1024 * 1024 * 100,
})
.split("\n")
.filter(Boolean);
if (changed.includes("CHANGELOG.md")) {
core.info("CHANGELOG.md updated in PR diff.");
core.setOutput("run_validation", "true");
return;
}
if (has("meta:no-changelog")) {
core.info("Skipping changelog requirement due to meta:no-changelog label.");
core.setOutput("run_validation", "false");
return;
}
core.setFailed("PR requires a CHANGELOG.md update or the meta:no-changelog label.");
github-***REDACTED***
debug: false
user-agent: actions/github-script
result-encoding: json
retries: 0
retry-exempt-status-codes: 400,401,403,404,422
##[endgroup]
##[error]PR requires a CHANGELOG.md update or the meta:no-changelog label.
GitHub Actions: Changelog • Management / Validate changelog on PR: chore(ci): add issue-health-audit workflow
Conclusion: failure
##[group]Run actions/github-script@v7
with:
script: const cp = require("node:child_process");
const author = context.payload.pull_request?.user?.login || "";
const labels = (context.payload.pull_request?.labels || []).map((l) => l.name);
const has = (name) => labels.includes(name);
if (author === "dependabot[bot]" || author === "app/dependabot") {
core.info("Skipping changelog requirement for Dependabot pull requests.");
core.setOutput("run_validation", "false");
return;
}
if (has("meta:needs-changelog") && has("meta:no-changelog")) {
core.setFailed("PR cannot include both meta:needs-changelog and meta:no-changelog.");
return;
}
const restrictedTypes = new Set([
"type:feature",
"type:bug",
"type:performance",
"type:security",
"type:release",
"type:hotfix",
]);
if (has("meta:no-changelog") && labels.some((label) => restrictedTypes.has(label))) {
core.setFailed("meta:no-changelog is not allowed for high-impact release-related change types.");
return;
}
const baseSha = context.payload.pull_request?.base?.sha;
const headSha = context.payload.pull_request?.head?.sha;
const changed = cp
.execSync(`git diff --name-only ${baseSha} ${headSha}`, {
encoding: "utf8",
maxBuffer: 1024 * 1024 * 100,
})
.split("\n")
.filter(Boolean);
if (changed.includes("CHANGELOG.md")) {
core.info("CHANGELOG.md updated in PR diff.");
core.setOutput("run_validation", "true");
return;
}
if (has("meta:no-changelog")) {
core.info("Skipping changelog requirement due to meta:no-changelog label.");
core.setOutput("run_validation", "false");
return;
}
core.setFailed("PR requires a CHANGELOG.md update or the meta:no-changelog label.");
github-***REDACTED***
debug: false
user-agent: actions/github-script
result-encoding: json
retries: 0
retry-exempt-status-codes: 400,401,403,404,422
##[endgroup]
##[error]PR requires a CHANGELOG.md update or the meta:no-changelog label.
🧰 Additional context used
📓 Path-based instructions (1)
**/.github/workflows/*.yml
⚙️ CodeRabbit configuration file
**/.github/workflows/*.yml: Review GitHub Actions workflows for this governance repo:
- Security: check for least-privilege permissions (use
permissions:at job level, default to read-only).- Secret handling: ensure secrets are passed via env vars, not interpolated directly into run: steps to prevent injection.
- Action pinning: prefer SHA-pinned actions over mutable tags (e.g.
actions/checkout@v4is acceptable; SHA pins are better).- No
pull_request_targetwith untrusted code execution unless explicitly justified.- Avoid storing sensitive outputs as unmasked step outputs.
- Check for reusable workflow patterns and matrix strategies where appropriate.
- Validate
on:triggers: ensure branch/path filters are present to avoid unnecessary runs.- Confirm workflows are documented, DRY, and maintainable.
- Ensure agent-triggered workflows use
workflow_dispatchwith defined inputs.
Files:
.github/workflows/issue-health-audit.yml
🪛 LanguageTool
.remember/phase-3.2-execution-continuation.md
[uncategorized] ~3-~3: Possible missing comma found.
Context: ...ation Prompt ## Current State (2026-07-26 15:45 UTC) Project: GitHub Workflo...
(AI_HYDRA_LEO_MISSING_COMMA)
[uncategorized] ~12-~12: The official name of this software platform is spelled with a capital “H”.
Context: ...18:37:14Z) - New consolidated workflow: .github/workflows/labeling-governance.yml (226...
(GITHUB)
.github/projects/active/workflows-consolidation-2026-q3/PHASE_3_CONTINUATION_PROMPT.md
[uncategorized] ~20-~20: Possible missing comma found.
Context: ...ng-related workflows into 2 streamlined workflows while maintaining all label governance ...
(AI_HYDRA_LEO_MISSING_COMMA)
[uncategorized] ~71-~71: The official name of this software platform is spelled with a capital “H”.
Context: ... labels on close) Deliverable: New .github/workflows/labeling-governance.yml with...
(GITHUB)
[uncategorized] ~170-~170: The official name of this software platform is spelled with a capital “H”.
Context: ...--- ## Documentation & Resources **In `.github/projects/active/workflows-consolidation...
(GITHUB)
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
🔍 Reviewer Summary for PR #1399CI Status: ❌ Recommendations
|
Metadata governance
|
Adds a new GitHub Actions workflow that: - Audits closed issues from the last 28 days and reopens any with unchecked checkboxes (unless meta:force-close is present) - Scans all open issues and applies missing type: and priority: labels using title-pattern inference - Runs weekly (Monday 08:00 UTC) and via workflow_dispatch with dry-run support Triggered by manual audit run on 2026-07-29 that: - Reopened 8 issues closed with incomplete checkboxes - Applied type labels to 32 open issues - Applied priority labels to 43 open issues
Syncs open issues into a GitHub Projects v2 board and fills in Status, Priority, and Type fields based on issue labels. Field mapping: - status:in-progress → Status: In Progress - status:needs-review → Status: In Review - status:blocked → Status: Blocked - status:ready → Status: Ready - (no status label) → Status: Todo - priority:critical → Priority: Critical - priority:important → Priority: High - priority:normal → Priority: Medium - priority:minor → Priority: Low - type:bug → Type: Bug (etc.) Setup required: - Set PROJECT_NUMBER repo/org variable (Settings → Variables → Actions) - Optionally add GH_PROJECT_TOKEN secret with a PAT having 'project' scope (required for org-level projects; GITHUB_TOKEN covers repo-linked projects)
- Move permissions to job level (audit-and-fix) — reduces token scope - Fix type:ci → type:build to match canonical label in issue-fields.yml - Filter openIssues to exclude PRs (GitHub Issues API returns both) - Change closedIssues to filter by closed_at instead of using API since param (since uses updated_at, not closed_at) - Update DoD checkbox logic to extract DoD section first, matching the policy in validate-issue-dod-before-close.yml — prevents unchecked checkboxes in non-DoD sections from incorrectly triggering a reopen - Fix label reporting to record entries only after addLabels succeeds; add dry-run labeling to report as planned; include status:needs-triage additions in summary Also update PHASE_3_CONTINUATION_PROMPT.md: - Correct timeline total from ~9 hours to ~7.5 hours (2+2.5+1.5+1.5) - Update current status to reflect Phase 3.1 complete (PR #1367 merged) Remove session-closing transcript from .remember/now.md (local-path cleanup commands have no place in project log history)
a4a112a to
6ef3eceCompareashleyshaw
commented
Jul 29, 2026
@Mergifyio queue |
Merge Queue Status
Waiting for
All conditions
|
Linked issues
Closes#1402
Relates to #1172
Relates to #1170
Changelog
Added
issue-health-audit.yml— weekly audit workflow that reopens issues closed with unchecked checkboxes and applies missingtype:/priority:labels across all open issues; supportsdry_runmode; runs every Monday 08:00 UTCissue-project-field-sync.yml— on-demand workflow to add open issues to a GitHub Projects v2 board and set Status, Priority, and Type fields from labels; auto-discovers field IDs via GraphQLTesting steps
issue-health-auditwithdry_run=true→ verify summary shows issues that would be reopened and labels that would be appliedissue-project-field-syncwithdry_run=true, project_number=33→ verify issues would be added/updated in projectChecklist (Global DoD / PR)
dry_runmode on both workflowsmeta:force-closeescape hatch prevents false DoD reopenschore/branch targetingdevelop