Skip to content

Feat/workflow automation pillar#82

Closed
rbmathis wants to merge 8 commits intomicrosoft:mainfrom
MSBart2:feat/workflow-automation-pillar
Closed

Feat/workflow automation pillar#82
rbmathis wants to merge 8 commits intomicrosoft:mainfrom
MSBart2:feat/workflow-automation-pillar

Conversation

@rbmathis
Copy link

feat: add workflow-automation pillar with 6 new scored criteria

Add a new 'workflow-automation' pillar (repo-health group) with five new
checkers and six scored criteria covering process automation signals that
reduce engineering friction per PR:

New checkers (checkers.ts + monolithic readiness.ts):

  • hasIssueTemplates: .github/ISSUE_TEMPLATE/ dir or flat ISSUE_TEMPLATE.md
  • hasCommitConvention: commitlint config files or @commitlint/* devDeps
  • hasReleaseAutomation: .releaserc/.changeset config or workflow scan
  • hasAutoLabeler: .github/labeler.yml or actions/labeler workflow reference
  • hasBranchRulesets: .github/rulesets/*.json or branch-protection.json

New criteria (workflow-automation pillar):

  • issue-templates (L2, high impact, low effort)
  • pr-template (L2, high impact, low effort) — promoted from extras
  • commit-convention (L3, high impact, low effort)
  • pr-labeling (L3, medium impact, low effort)
  • release-automation (L4, high impact, medium effort)

New criterion (security-governance pillar):

  • branch-protection (L3, high impact, medium effort)

Supporting changes:

  • types.ts: add 'workflow-automation' to ReadinessPillar union and PILLAR_GROUPS
  • scoring.ts: add 'Workflow Automation' display name
  • extras.ts: remove pr-template (now a scored criterion)
  • policy/adapter.ts: add 'workflow-automation' to PILLAR_NAMES

Tests: update baseline/adapter tests for new pillar count and criterion IDs;
add 30 new integration tests covering all new criteria pass/fail scenarios

Various doc updates

Add a new 'workflow-automation' pillar (repo-health group) with five new
checkers and six scored criteria covering process automation signals that
reduce engineering friction per PR:

New checkers (checkers.ts + monolithic readiness.ts):
- hasIssueTemplates: .github/ISSUE_TEMPLATE/ dir or flat ISSUE_TEMPLATE.md
- hasCommitConvention: commitlint config files or @commitlint/* devDeps
- hasReleaseAutomation: .releaserc/.changeset config or workflow scan
- hasAutoLabeler: .github/labeler.yml or actions/labeler workflow reference
- hasBranchRulesets: .github/rulesets/*.json or branch-protection.json

New criteria (workflow-automation pillar):
- issue-templates (L2, high impact, low effort)
- pr-template (L2, high impact, low effort) — promoted from extras
- commit-convention (L3, high impact, low effort)
- pr-labeling (L3, medium impact, low effort)
- release-automation (L4, high impact, medium effort)

New criterion (security-governance pillar):
- branch-protection (L3, high impact, medium effort)

Supporting changes:
- types.ts: add 'workflow-automation' to ReadinessPillar union and PILLAR_GROUPS
- scoring.ts: add 'Workflow Automation' display name
- extras.ts: remove pr-template (now a scored criterion)
- policy/adapter.ts: add 'workflow-automation' to PILLAR_NAMES

Tests: update baseline/adapter tests for new pillar count and criterion IDs;
add 30 new integration tests covering all new criteria pass/fail scenarios
Copilot AI review requested due to automatic review settings March 23, 2026 21:24
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds a new Workflow Automation readiness pillar to AgentRC’s readiness model, expanding repo-health scoring signals around process automation and governance.

Changes:

  • Introduces the workflow-automation pillar and new scored criteria (issue templates, PR templates, commit convention, PR labeling, release automation), plus a new branch-protection criterion under security/governance.
  • Implements new repository checkers to detect the above signals (files/configs + lightweight workflow scanning).
  • Updates tests and documentation to reflect 10 pillars and the new criteria/extras set.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 17 comments.

Show a summary per file
File Description
vscode-extension/resources/walkthrough/readiness.md Updates walkthrough text to 10 pillars and lists the new pillar.
vscode-extension/README.md Updates extension README to 10 pillars.
src/services/tests/readiness.test.ts Adds integration tests for new criteria and ensures new pillar is present.
src/services/tests/readiness-baseline.test.ts Updates baselines for pillar IDs, criteria IDs, and extras IDs.
src/services/tests/policy-adapter.test.ts Updates expected pillar count to 10.
packages/core/src/services/readiness/types.ts Adds workflow-automation to the modular readiness pillar union/groups.
packages/core/src/services/readiness/scoring.ts Adds “Workflow Automation” display name mapping.
packages/core/src/services/readiness/extras.ts Removes pr-template from extras (now a scored criterion).
packages/core/src/services/readiness/criteria.ts Adds the new scored criteria (and branch-protection) to the modular criteria builder.
packages/core/src/services/readiness/checkers.ts Adds new repo checkers for workflow automation + branch protection detection.
packages/core/src/services/readiness.ts Mirrors the new pillar/criteria/checkers in the monolithic exported readiness entrypoint.
packages/core/src/services/policy/adapter.ts Adds pillar display name mapping for workflow-automation.
docs/policies.md Updates extras list from 4 → 3 (removes pr-template).
docs/maturity-models.md Adds canonical maturity model documentation (new file).
docs/maturity-in-practice.md Adds companion adoption guidance doc (new file).
docs/dev/product.md Updates product brief to 10 pillars.
docs/concepts.md Updates concepts doc to include workflow automation and 10 pillars.
docs/commands.md Updates readiness command docs to 10 pillars + links maturity models.
README.md Updates root README to 10 pillars and links new docs.
CHANGELOG.md Adds changelog entry for the new pillar and criteria.
.github/prompts/generate-improvements.prompt.md Updates prompt context to reference 10 pillars.

Comment on lines +503 to +511
const templatePath = path.join(context.repoPath, ".github", "PULL_REQUEST_TEMPLATE.md");
const content = await fs.readFile(templatePath, "utf8");
const hasLinkedIssue = /fixes\s+#|closes\s+#|resolves\s+#/iu.test(content);
return {
status: "pass",
reason: hasLinkedIssue
? undefined
: 'PR template found but lacks a linked-issue reference ("Fixes #", "Closes #"). Add one to enable automatic issue closing on merge.'
};
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

/fixes\s+#|closes\s+#|resolves\s+#/ can match substrings inside other words (e.g. "preFIXES #"), causing false positives and suppressing the advisory reason. Consider adding word boundaries (e.g. \bfixes\b) and optionally allowing common punctuation like Fixes: #.

Copilot uses AI. Check for mistakes.
Copy link
Author

Choose a reason for hiding this comment

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

@copilot open a new pull request to apply changes based on this feedback

docs/concepts.md Outdated
@@ -1,4 +1,4 @@
# Concepts
# Concepts
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

Line 1 appears to include a UTF-8 BOM (invisible character before # Concepts). Recommend removing it to avoid encoding-related issues.

Suggested change
# Concepts
# Concepts

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,4 @@
---
---
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

The opening frontmatter delimiter appears to have a UTF-8 BOM prefix (invisible character before ---). Some frontmatter parsers treat this as a different token and will fail to detect the header. Remove the BOM so the delimiter is exactly ---.

Suggested change
---
---

Copilot uses AI. Check for mistakes.
@@ -0,0 +1,295 @@
# AgentRC: The Agentic SDLC Report Card
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

Line 1 appears to include a UTF-8 BOM (invisible character before the # heading). Suggest removing it to avoid encoding-related issues.

Suggested change
# AgentRC: The Agentic SDLC Report Card
# AgentRC: The Agentic SDLC Report Card

Copilot uses AI. Check for mistakes.
Comment on lines +902 to +910
const templatePath = path.join(context.repoPath, ".github", "PULL_REQUEST_TEMPLATE.md");
const content = await fs.readFile(templatePath, "utf8");
const hasLinkedIssue = /fixes\s+#|closes\s+#|resolves\s+#/iu.test(content);
return {
status: "pass",
reason: hasLinkedIssue
? undefined
: 'PR template found but lacks a linked-issue reference ("Fixes #", "Closes #"). Add one to enable automatic issue closing on merge.'
};
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

The linked-issue detection regex can match substrings inside other words, which may incorrectly treat a template as containing "Fixes #" and omit the advisory reason. Adding word boundaries (and optionally supporting Fixes: #) would make this check more accurate.

Copilot uses AI. Check for mistakes.
Comment on lines 1 to 2
# AgentRC — Product Brief

Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

Line 1 appears to include a UTF-8 BOM (invisible character before the # heading). Removing the BOM will prevent encoding/tooling quirks and keeps diffs clean.

Copilot uses AI. Check for mistakes.
README.md Outdated
@@ -1,4 +1,4 @@
# AgentRC
# AgentRC
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

Line 1 appears to include a UTF-8 BOM (invisible character before # AgentRC). Consider removing the BOM to avoid tooling/rendering quirks and reduce diff noise.

Suggested change
# AgentRC
# AgentRC

Copilot uses AI. Check for mistakes.
@@ -0,0 +1,131 @@
# SDLC Readiness Assessment: Toward Level-5 Agentic Delivery
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

Line 1 appears to include a UTF-8 BOM (invisible character before the # heading). Recommend removing it to keep the file encoding consistent.

Suggested change
# SDLC Readiness Assessment: Toward Level-5 Agentic Delivery
# SDLC Readiness Assessment: Toward Level-5 Agentic Delivery

Copilot uses AI. Check for mistakes.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings March 23, 2026 21:31
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 21 out of 21 changed files in this pull request and generated 6 comments.

Comments suppressed due to low confidence (1)

packages/core/src/services/readiness.ts:1642

  • This helper makes branch-protection.md / branch_protection.md count as “branch protection configured”, which can yield false positives (it’s just documentation). Consider restricting this check to actual config files (.github/rulesets/*.json, .github/branch-protection.json) so the readiness signal reflects enforcement rather than docs.
  const rootFiles = await safeReadDir(repoPath);
  if (
    rootFiles.some(
      (f) =>
        f.toLowerCase() === "branch_protection.md" || f.toLowerCase() === "branch-protection.md"
    )
  )
    return true;
  return fileExists(path.join(repoPath, ".github", "branch-protection.json"));

try {
const templatePath = path.join(context.repoPath, ".github", "PULL_REQUEST_TEMPLATE.md");
const content = await fs.readFile(templatePath, "utf8");
const hasLinkedIssue = /fixes\s+#|closes\s+#|resolves\s+#/iu.test(content);
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

Same issue as in the core criteria: /fixes\s+#|closes\s+#|resolves\s+#/ can match inside other words and produce false positives. Use word boundaries / stricter parsing for linked-issue keywords so the advisory reason isn’t skipped accidentally.

This issue also appears on line 1634 of the same file.

Suggested change
const hasLinkedIssue = /fixes\s+#|closes\s+#|resolves\s+#/iu.test(content);
const hasLinkedIssue = /\b(?:fixes|closes|resolves)\s+#/iu.test(content);

Copilot uses AI. Check for mistakes.
Comment on lines +679 to +683
reason: found
? undefined
: "No branch ruleset or protection config found (.github/rulesets/*.json or .github/branch-protection.json). Add branch protection rules to prevent unreviewed merges.",
evidence: [".github/rulesets/*.json", ".github/branch-protection.json"]
};
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

The failure reason mentions only .github/rulesets/*.json, but the evidence list also includes .github/branch-protection.json. Update the message to include both locations (or align evidence/message) so users know all supported config options.

Copilot uses AI. Check for mistakes.
@@ -0,0 +1,295 @@
# AgentRC: The Agentic SDLC Report Card
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

This new doc file starts with a UTF-8 BOM (U+FEFF) before the heading. Please remove the BOM and save as UTF-8 without BOM to avoid subtle Markdown rendering/anchor issues in different viewers.

Suggested change
# AgentRC: The Agentic SDLC Report Card
# AgentRC: The Agentic SDLC Report Card

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,4 @@
# AgentRC — Product Brief
# AgentRC — Product Brief
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

This file now starts with a UTF-8 BOM (U+FEFF) before the heading. Please remove the BOM and save as UTF-8 without BOM to avoid subtle Markdown rendering/anchor issues.

Suggested change
# AgentRC — Product Brief
# AgentRC — Product Brief

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,4 @@
# AgentRC — AI Repository Setup
# AgentRC — AI Repository Setup
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

This file now starts with a UTF-8 BOM (U+FEFF) before the heading. Please remove the BOM and save as UTF-8 without BOM; BOMs can cause odd rendering in VS Code walkthrough/markdown contexts.

Suggested change
# AgentRC — AI Repository Setup
# AgentRC — AI Repository Setup

Copilot uses AI. Check for mistakes.
try {
const templatePath = path.join(context.repoPath, ".github", "PULL_REQUEST_TEMPLATE.md");
const content = await fs.readFile(templatePath, "utf8");
const hasLinkedIssue = /fixes\s+#|closes\s+#|resolves\s+#/iu.test(content);
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

The linked-issue detection regex can match substrings inside other words (e.g. "preFIXES #"), which will suppress the advisory reason incorrectly. Tighten the pattern with word boundaries (and optionally allow punctuation like "Fixes: #") so only real keywords trigger a match.

Suggested change
const hasLinkedIssue = /fixes\s+#|closes\s+#|resolves\s+#/iu.test(content);
const hasLinkedIssue = /\b(?:fixes|closes|resolves)\b\s*:?\s*#/iu.test(content);

Copilot uses AI. Check for mistakes.
@rbmathis
Copy link
Author

@copilot open a new pull request to apply changes based on the comments in this thread

@rbmathis
Copy link
Author

@copilot open a new pull request to apply changes based on the comments in this thread

@rbmathis rbmathis marked this pull request as draft March 24, 2026 00:09
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 21 out of 21 changed files in this pull request and generated 3 comments.

Comments suppressed due to low confidence (2)

packages/core/src/services/readiness/criteria.ts:552

  • pr-labeling can pass via .github/labeler.yaml/.json or a workflow referencing actions/labeler, but the evidence list only includes .github/labeler.yml. Align evidence (and/or the failure reason) with what hasAutoLabeler() actually checks so users know all valid configurations.
        const found = await hasAutoLabeler(context.repoPath);
        return {
          status: found ? "pass" : "fail",
          reason: found
            ? undefined
            : "No PR auto-labeler configured (.github/labeler.yml or actions/labeler workflow). Auto-labeling routes PRs to the right reviewers without manual triage.",
          evidence: [".github/labeler.yml"]
        };

packages/core/src/services/readiness.ts:951

  • pr-labeling can pass via .github/labeler.yaml/.json or a workflow that references actions/labeler, but the evidence field only lists .github/labeler.yml. Update evidence (and/or the failure reason) so the report accurately reflects all accepted configuration paths.
        const found = await hasAutoLabeler(context.repoPath);
        return {
          status: found ? "pass" : "fail",
          reason: found
            ? undefined
            : "No PR auto-labeler configured (.github/labeler.yml or actions/labeler workflow). Auto-labeling routes PRs to the right reviewers without manual triage.",
          evidence: [".github/labeler.yml"]
        };

Comment on lines +1506 to +1635
async function hasIssueTemplates(repoPath: string): Promise<boolean> {
const single = await fileExists(path.join(repoPath, ".github", "ISSUE_TEMPLATE.md"));
if (single) return true;
const dir = path.join(repoPath, ".github", "ISSUE_TEMPLATE");
try {
const entries = await fs.readdir(dir);
return entries.some((e) => /\.(md|yml|yaml)$/iu.test(e));
} catch {
return false;
}
}

async function hasCommitConvention(repoPath: string): Promise<boolean> {
const configs = [
".commitlintrc",
".commitlintrc.json",
".commitlintrc.yml",
".commitlintrc.yaml",
".commitlintrc.js",
".commitlintrc.cjs",
".commitlintrc.mjs",
".commitlintrc.ts",
"commitlint.config.js",
"commitlint.config.cjs",
"commitlint.config.mjs",
"commitlint.config.ts",
".cz-config.js",
".czrc"
];
for (const config of configs) {
if (await fileExists(path.join(repoPath, config))) return true;
}
const pkg = await readJson(path.join(repoPath, "package.json"));
if (pkg) {
const allDeps = {
...((pkg.dependencies as Record<string, unknown>) ?? {}),
...((pkg.devDependencies as Record<string, unknown>) ?? {})
};
if (
Object.keys(allDeps).some(
(dep) => dep.startsWith("@commitlint/") || dep === "commitlint" || dep === "commitizen"
)
) {
return true;
}
}
return false;
}

async function hasReleaseAutomation(
repoPath: string
): Promise<{ found: boolean; evidence: string[] }> {
const evidence: string[] = [];
const configs = [
"release.config.js",
"release.config.cjs",
"release.config.mjs",
"release.config.ts",
".releaserc",
".releaserc.json",
".releaserc.yml",
".releaserc.yaml",
".releaserc.js",
".releaserc.cjs",
".changeset/config.json",
"release-please-config.json"
];
for (const config of configs) {
if (await fileExists(path.join(repoPath, config))) {
evidence.push(config);
}
}
const workflowsDir = path.join(repoPath, ".github", "workflows");
try {
const workflows = await fs.readdir(workflowsDir);
for (const workflow of workflows) {
if (!/\.ya?ml$/iu.test(workflow)) continue;
try {
const content = await fs.readFile(path.join(workflowsDir, workflow), "utf8");
if (
content.includes("semantic-release") ||
content.includes("changesets/action") ||
content.includes("googleapis/release-please-action")
) {
evidence.push(`.github/workflows/${workflow}`);
}
} catch {
// skip unreadable workflow
}
}
} catch {
// no workflows directory
}
return { found: evidence.length > 0, evidence };
}

async function hasAutoLabeler(repoPath: string): Promise<boolean> {
for (const file of [".github/labeler.yml", ".github/labeler.yaml", ".github/labeler.json"]) {
if (await fileExists(path.join(repoPath, file))) return true;
}
const workflowsDir = path.join(repoPath, ".github", "workflows");
try {
const workflows = await fs.readdir(workflowsDir);
for (const workflow of workflows) {
if (!/\.ya?ml$/iu.test(workflow)) continue;
try {
const content = await fs.readFile(path.join(workflowsDir, workflow), "utf8");
if (content.includes("actions/labeler")) return true;
} catch {
// skip unreadable workflow
}
}
} catch {
// no workflows directory
}
return false;
}

async function hasBranchRulesets(repoPath: string): Promise<boolean> {
const rulesetsDir = path.join(repoPath, ".github", "rulesets");
if (await fileExists(rulesetsDir)) {
try {
const entries = await fs.readdir(rulesetsDir);
if (entries.some((e) => e.endsWith(".json"))) return true;
} catch {
// skip unreadable directory
}
}
return fileExists(path.join(repoPath, ".github", "branch-protection.json"));
}
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

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

These new helper functions (hasIssueTemplates, hasCommitConvention, hasReleaseAutomation, hasAutoLabeler, hasBranchRulesets) duplicate logic that also exists in packages/core/src/services/readiness/checkers.ts. Keeping two copies increases the chance they drift; consider extracting them into a single shared module and reusing it from both the monolithic and modular readiness implementations.

Copilot uses AI. Check for mistakes.
Comment on lines +497 to +498
"Missing PR template (.github/PULL_REQUEST_TEMPLATE.md). A template with linked-issue and testing sections standardises agent-generated PR descriptions.",
evidence: [".github/PULL_REQUEST_TEMPLATE.md"]
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

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

The PR template criterion’s failure message/evidence only points to .github/PULL_REQUEST_TEMPLATE.md, but hasPullRequestTemplate() also accepts templates in .github/PULL_REQUEST_TEMPLATE/. Update the reason/evidence (and optionally the content-quality check) so the report reflects both supported locations.

This issue also appears on line 545 of the same file.

Suggested change
"Missing PR template (.github/PULL_REQUEST_TEMPLATE.md). A template with linked-issue and testing sections standardises agent-generated PR descriptions.",
evidence: [".github/PULL_REQUEST_TEMPLATE.md"]
"Missing PR template (.github/PULL_REQUEST_TEMPLATE.md or .github/PULL_REQUEST_TEMPLATE/). A template with linked-issue and testing sections standardises agent-generated PR descriptions.",
evidence: [".github/PULL_REQUEST_TEMPLATE.md", ".github/PULL_REQUEST_TEMPLATE/"]

Copilot uses AI. Check for mistakes.
Comment on lines +897 to +898
"Missing PR template (.github/PULL_REQUEST_TEMPLATE.md). A template with linked-issue and testing sections standardises agent-generated PR descriptions.",
evidence: [".github/PULL_REQUEST_TEMPLATE.md"]
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

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

The PR template criterion’s failure message/evidence only points to .github/PULL_REQUEST_TEMPLATE.md, but hasPullRequestTemplate() also considers templates in .github/PULL_REQUEST_TEMPLATE/. This mismatch can mislead users into thinking they must use the single file even when a directory template is supported; update the reason/evidence (and optionally the content-quality check) to account for both locations.

This issue also appears on line 944 of the same file.

Suggested change
"Missing PR template (.github/PULL_REQUEST_TEMPLATE.md). A template with linked-issue and testing sections standardises agent-generated PR descriptions.",
evidence: [".github/PULL_REQUEST_TEMPLATE.md"]
"Missing PR template (.github/PULL_REQUEST_TEMPLATE.md or .github/PULL_REQUEST_TEMPLATE/). A template with linked-issue and testing sections standardises agent-generated PR descriptions.",
evidence: [".github/PULL_REQUEST_TEMPLATE.md", ".github/PULL_REQUEST_TEMPLATE/"]

Copilot uses AI. Check for mistakes.
@rbmathis rbmathis closed this Mar 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants