Skip to content

Pass engine-specific agent type to gh skill install#42759

Merged
pelikhan merged 8 commits into
mainfrom
copilot/update-gh-skill-js
Jul 1, 2026
Merged

Pass engine-specific agent type to gh skill install#42759
pelikhan merged 8 commits into
mainfrom
copilot/update-gh-skill-js

Conversation

Copilot AI commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Frontmatter skill installs were invoking gh skill install without the engine type, so the CLI could not reliably target the correct host-specific skill layout. This change threads the workflow engine ID into the install step and maps it to the corresponding gh skill --agent value.

  • Activation step wiring

    • Export GH_AW_INFO_ENGINE_ID on frontmatter skill install steps
    • Preserve backward compatibility by falling back to the legacy ai field when engine.id is not set
  • gh skill invocation

    • Add engine-to-agent mapping in install_frontmatter_skills.cjs
    • Append --agent <value> to gh skill install when the engine has a supported CLI agent name
    • Handle CLI name mismatches explicitly where gh-aw and gh skill use different identifiers (for example copilotgithub-copilot, claudeclaude-code, geminigemini-cli)
  • Coverage updates

    • Extend JS tests to verify repo-level and path-level skill installs include the expected --agent flag
    • Extend workflow tests to verify the engine ID is present in generated activation-step env
gh skill install githubnext/skills review/security \
  --pin <sha> \
  --agent claude-code \
  --dir /tmp/gh-aw/.claude/skills \
  --force

Copilot AI and others added 2 commits July 1, 2026 13:10
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title Add engine type to gh skill installs Pass engine-specific agent type to gh skill install Jul 1, 2026
Copilot AI requested a review from pelikhan July 1, 2026 13:12
@pelikhan pelikhan marked this pull request as ready for review July 1, 2026 13:14
Copilot AI review requested due to automatic review settings July 1, 2026 13:14
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Design Decision Gate 🏗️ completed the design decision gate check.

No ADR enforcement needed: PR #42759 does not have the 'implementation' label and has only 6 new lines of code in business logic directories (threshold: 100).

@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅

@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Test Quality Sentinel completed test quality analysis.

@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

PR Code Quality Reviewer completed the code quality review.

* @param {string} engineID
* @returns {string}
*/
function getSkillInstallAgent(engineID) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@copilot extend the go agentic engine interface with the "ghSkillAgentName" and pass it as an env var, then remove this code to just use the env var.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Addressed in a5d33db.

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.

Pull request overview

This PR fixes frontmatter skill installation so gh skill install is invoked with an engine-specific --agent flag, allowing the GitHub CLI to select the correct host-specific skill layout. It does this by threading the workflow engine ID into the activation install step and mapping gh-aw engine IDs to gh skill agent identifiers.

Changes:

  • Export GH_AW_INFO_ENGINE_ID during activation frontmatter skill install steps (with a legacy ai fallback).
  • Add engine→agent mapping in install_frontmatter_skills.cjs and append --agent <value> to gh skill install when supported.
  • Extend Go + JS tests to assert engine env wiring and expected --agent behavior.
Show a summary per file
File Description
pkg/workflow/compiler_activation_job_builder.go Threads engine ID (and ai fallback) into activation skill install step env.
pkg/workflow/activation_skills_step_test.go Adds assertions that activation steps include the engine ID env var.
actions/setup/js/install_frontmatter_skills.cjs Maps engine IDs to gh skill --agent values and injects --agent into install commands.
actions/setup/js/install_frontmatter_skills.test.cjs Updates tests to verify --agent is included and mapping logic behaves as expected.

Review details

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 4/4 changed files
  • Comments generated: 2
  • Review effort level: Low

Comment on lines 541 to 544
if engineID == "" && ctx.data.AI != "" {
engineID = ctx.data.AI
}
skillDir := GetEngineSkillDir(engineID)
assert.Contains(t, steps, "ensure_gh_cli_min_version.sh", "expected gh upgrade step to delegate to ensure_gh_cli_min_version.sh")
assert.Contains(t, steps, "Install frontmatter skill 1", "expected first frontmatter skill install step in activation job")
assert.Contains(t, steps, "Install frontmatter skill 2", "expected second frontmatter skill install step in activation job")
assert.Contains(t, steps, "GH_AW_INFO_ENGINE_ID: \"claude\"", "expected engine id env var for gh skill agent mapping")
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Test Quality Score: 88/100 — Excellent

Analyzed 5 test(s): 5 design, 0 implementation, 0 violation(s).

📊 Metrics (5 tests)
Metric Value
Analyzed 5 (Go: 2, JS: 3)
✅ Design 5 (100%)
⚠️ Implementation 0 (0%)
Edge/error coverage 3 (60%)
Duplicate clusters 0
Inflation No
🚨 Violations 0
Test File Classification Issues
it("splits repo-level and path-level skill specs") (modified) install_frontmatter_skills.test.cjs design_test none
it("maps supported gh-aw engine IDs to gh skill agent values") (new) install_frontmatter_skills.test.cjs design_test none
it("reads skill specs from the env var and installs them") (modified) install_frontmatter_skills.test.cjs design_test none
TestBuildActivationJob_AddsFrontmatterSkillsInstallSteps (+1 assert) activation_skills_step_test.go design_test none
TestBuildActivationJob_AddsPerSkillAuthSteps (+1 assert) activation_skills_step_test.go design_test none

Verdict

Passed. 0% implementation tests (threshold: 30%). No guideline violations.

The new getSkillInstallAgent mapping test is particularly thorough: it covers known engine IDs (copilot, claude, gemini), pass-through unknowns (codex, opencode, etc.), and empty/unknown-string edge cases. Go assertions all include descriptive failure messages. No mocking violations, no build-tag issues.

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • awmgmcpg

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

🧪 Test quality analysis by Test Quality Sentinel · 38.6 AIC · ⌖ 15.5 AIC · ⊞ 6.8K ·
Comment /review to run again

@github-actions github-actions Bot 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.

✅ Test Quality Sentinel: 88/100. 0% implementation tests (threshold: 30%). No violations.

@github-actions github-actions Bot 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.

Skills-Based Review 🧠

Applied /tdd, /codebase-design, and /grill-with-docs — commenting with suggestions, no blocking issues.

📋 Key Themes & Highlights

Key Themes

  • default branch doubles as pass-through and unknown sentinel (install_frontmatter_skills.cjs line 38): known pass-through engines (codex, antigravity, opencode, pi) share the same default arm as genuinely unknown engines. A new engine with a different CLI name could silently pass through and emit the wrong --agent value. See inline comment.
  • Fallback from AI to engineID is undocumented (compiler_activation_job_builder.go line 542): the compatibility shim is correct but invisible to the next reader. A one-line comment or ADR entry would anchor the intent.
  • Test coverage gaps: the mapping test does not exercise case-insensitivity or nil inputs; the main() integration test does not cover the no-engine path.
  • Minor duplication: the (engineID || "").trim().toLowerCase() normalisation appears twice in getSkillInstallAgent. Extract to a local variable.

Positive Highlights

  • Backward compatibility is handled cleanly: unknown engines reliably omit --agent rather than failing.
  • Logging added to surface which agent is targeted at install time.
  • agentArgs is cleanly spliced into all three install command variants with no special-casing.
  • getSkillInstallAgent is small, pure, and independently testable.
  • Go test assertions are tight and specific, verifying the env var value rather than just its presence.

@copilot please address the review comments above.

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · 55.5 AIC · ⌖ 10.2 AIC · ⊞ 6.6K
Comment /matt to run again

case "antigravity":
case "opencode":
case "pi":
return (engineID || "").trim().toLowerCase();

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.

[/tdd] The default cases for codex, antigravity, opencode, and pi return engineID.trim().toLowerCase() directly, while copilot, claude, and gemini are explicitly remapped. This is fine for known identifiers, but a new engine added with a different gh-skill CLI name (e.g. openai) would silently pass through and produce an incorrect --agent flag if its CLI name differs from its gh-aw ID.

💡 Suggestion

Consider listing each pass-through case explicitly rather than grouping them in a default that also serves as the "unknown" branch. That way, unknown engines reliably return "" and a new engine that needs remapping is never accidentally emitted:

case "codex":
  return "codex";
case "antigravity":
  return "antigravity";
case "opencode":
  return "opencode";
case "pi":
  return "pi";
default:
  return "";

This also makes the test in install_frontmatter_skills.test.cjs at line 110 (getSkillInstallAgent("crush") === "") a structural guarantee rather than just a happy-path check.

@copilot please address this.

engineID = ctx.data.EngineConfig.ID
}
if engineID == "" && ctx.data.AI != "" {
engineID = ctx.data.AI

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.

[/grill-with-docs] The fallback if engineID == "" && ctx.data.AI != "" silently promotes the AI string field to engine ID without a log or comment. If AI holds a value like "claude-sonnet-4" that differs from a valid getSkillInstallAgent key (e.g. "claude"), the mapping will return "" and the --agent flag will be silently omitted.

💡 Suggestion

Add an inline comment explaining the fallback contract so future maintainers know when this path fires:

// Legacy workflows set AI instead of EngineConfig. Map it to an engine ID
// so getSkillInstallAgent can resolve the --agent flag for gh skill install.
if engineID == "" && ctx.data.AI != "" {
    engineID = ctx.data.AI
}

Alternatively, document in a CONTEXT.md or ADR that AI is the legacy spelling for EngineConfig.ID so the relationship is captured in the domain model.

@copilot please address this.

expect(script.getSkillInstallAgent("crush")).toBe("");
expect(script.getSkillInstallAgent("")).toBe("");
});

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.

[/tdd] The mapping test covers all supported engines and the known-unsupported "crush" case, but it does not test case-insensitivity or whitespace stripping — both of which are explicitly handled by (engineID || "").trim().toLowerCase() in the implementation.

💡 Suggested additions
it("maps engine IDs case-insensitively and strips whitespace", () => {
  expect(script.getSkillInstallAgent("Copilot")).toBe("github-copilot");
  expect(script.getSkillInstallAgent(" claude ")).toBe("claude-code");
  expect(script.getSkillInstallAgent("GEMINI")).toBe("gemini-cli");
  expect(script.getSkillInstallAgent(null)).toBe("");
  expect(script.getSkillInstallAgent(undefined)).toBe("");
});

This makes the defensive normalisation observable and prevents silent regressions if the normalisation is later removed.

@copilot please address this.

expect(global.exec.exec).toHaveBeenNthCalledWith(1, "gh", ["skill", "install", "githubnext/skills", "--all", "--pin", "abc123", "--agent", "claude-code", "--dir", "/tmp/gh-aw/.claude/skills", "--force"]);
expect(global.exec.exec).toHaveBeenNthCalledWith(2, "gh", ["skill", "install", "githubnext/skills", "review/security", "--pin", "def456", "--agent", "claude-code", "--dir", "/tmp/gh-aw/.claude/skills", "--force"]);
expect(global.exec.exec).toHaveBeenNthCalledWith(3, "gh", ["skill", "install", "${{ inputs.skill_ref }}", "--agent", "claude-code", "--dir", "/tmp/gh-aw/.claude/skills", "--force"]);
expect(global.core.summary.addRaw).toHaveBeenCalledWith(expect.stringContaining("### Frontmatter skills installed"));

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.

[/tdd] The main() integration test only exercises the claude engine path. A complementary test for an engine with no mapping (e.g. engineID = "") would confirm that --agent is correctly omitted when the engine is unknown — guarding the backward-compatibility contract explicitly.

💡 Suggested test
it("omits --agent when engine ID has no mapping", async () => {
  process.env.GH_AW_SKILL_DIR = ".claude/skills";
  // No GH_AW_INFO_ENGINE_ID set (or set to an unknown value)
  process.env.GH_AW_FRONTMATTER_SKILLS = "githubnext/skills@abc123";

  await script.main();

  expect(global.exec.exec).toHaveBeenCalledWith("gh", [
    "skill", "install", "githubnext/skills", "--all", "--pin", "abc123",
    "--dir", "/tmp/gh-aw/.claude/skills", "--force",
  ]);
  // Critically: no --agent flag in the call
});

@copilot please address this.

* @returns {string}
*/
function getSkillInstallAgent(engineID) {
switch ((engineID || "").trim().toLowerCase()) {

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.

[/codebase-design] getSkillInstallAgent duplicates the (engineID || "").trim().toLowerCase() normalisation on line 27 and again on line 38, once for the switch guard and once for pass-through returns. Extracting the normalisation to a local variable keeps the mapping table cleaner and avoids the risk of one copy drifting:

💡 Refactor
function getSkillInstallAgent(engineID) {
  const id = (engineID || "").trim().toLowerCase();
  switch (id) {
    case "copilot":
      return "github-copilot";
    case "claude":
      return "claude-code";
    case "gemini":
      return "gemini-cli";
    case "codex":
    case "antigravity":
    case "opencode":
    case "pi":
      return id;
    default:
      return "";
  }
}

This is a straightforward simplification with no behaviour change.

@copilot please address this.

@github-actions github-actions Bot 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.

❌ One blocking regression, one non-blocking concern

The core approach is sound — threading GH_AW_INFO_ENGINE_ID through the env and mapping it to gh skill --agent is the right design. One correctness regression needs to be fixed before merging.

### Findings

[HIGH — blocking] addActivationArtifactUploadStep (~line 847) has a second engineID derivation that reads only EngineConfig.ID and was not updated with the AI fallback added in addActivationSkillInstallSteps. For workflows using the legacy ai: field without an engine: block (e.g. ai: claude), skill files get installed to .claude/skills (correctly) but the artifact upload still includes .github/skills (wrong). The installed skills never reach the artifact, so the agent runs without them. Copilot users are unaffected because both GetEngineSkillDir("") and GetEngineSkillDir("copilot") resolve to .github/skills. See inline comment for the fix.

[MEDIUM — non-blocking] codex, antigravity, opencode, and pi are returned as pass-through --agent values with no comment documenting that gh skill install --agent accepts them. If any are not accepted, the install fails silently (warning-only). Should also extract the normalized switch discriminant to a local variable to avoid re-computing it in the return.

🔎 Code quality review by PR Code Quality Reviewer · 110.4 AIC · ⌖ 7.55 AIC · ⊞ 1.6K
Comment /review to run again

ctx.steps = append(ctx.steps, fmt.Sprintf(" - name: Install frontmatter skill %d\n", i+1))
ctx.steps = append(ctx.steps, " env:\n")
ctx.steps = append(ctx.steps, fmt.Sprintf(" GH_TOKEN: %s\n", tokenExpr))
ctx.steps = append(ctx.steps, formatYAMLEnv(" ", "GH_AW_INFO_ENGINE_ID", engineID))

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.

AI fallback applied to install step but not to artifact upload — skills will be missing from the artifact for legacy ai: users.

The fallback at line 541–542 (if engineID == "" && ctx.data.AI != "") now correctly resolves engineID for skill installation. But addActivationArtifactUploadStep (~line 847) derives its own engineID from EngineConfig.ID only — the AI fallback was never added there.

💡 Impact and fix

For a workflow with ai: claude (legacy frontmatter, no engine: block):

  • This function resolves engineID = "claude" → skills are installed to /tmp/gh-aw/.claude/skills
  • addActivationArtifactUploadStep resolves engineID = ""GetEngineSkillDir("") returns .github/skills → the artifact upload includes /tmp/gh-aw/.github/skills instead of .claude/skills

The installed skills are never captured in the artifact, so the agent runs without them.

Apply the same fallback in addActivationArtifactUploadStep:

engineID := ""
if ctx.data.EngineConfig != nil {
    engineID = ctx.data.EngineConfig.ID
}
if engineID == "" && ctx.data.AI != "" {
    engineID = ctx.data.AI
}

This affects any non-Copilot engine using the legacy ai: field (ai: claude, ai: codex, ai: gemini, ...) — Copilot is unaffected because GetEngineSkillDir("") and GetEngineSkillDir("copilot") both return .github/skills.

case "antigravity":
case "opencode":
case "pi":
return (engineID || "").trim().toLowerCase();

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.

Pass-through engine IDs (codex, antigravity, opencode, pi) have no documented contract with gh skill install --agent.

If gh skill install rejects any of these as an unknown --agent value, all skill installs for those engine users will fail. The error is caught as a non-fatal warning, so the breakage is silent from the workflow perspective.

💡 Details and suggested fix

The PR description documents copilot → github-copilot, claude → claude-code, gemini → gemini-cli as explicit remappings, but doesn’t establish that codex, antigravity, opencode, and pi are accepted identically by gh skill. Add a comment pinning this assumption to a source:

// These engine IDs match gh skill agent names directly — see <link to gh skill docs or enum>
case "codex":
case "antigravity":
// ...
  return normalized;

Also: the switch discriminant already computes (engineID || "").trim().toLowerCase() into the matched value, so return (engineID || "").trim().toLowerCase() re-evaluates it from the raw parameter unnecessarily. Use a local variable:

function getSkillInstallAgent(engineID) {
  const normalized = (engineID || "").trim().toLowerCase();
  switch (normalized) {
    case "copilot": return "github-copilot";
    case "claude":  return "claude-code";
    case "gemini":  return "gemini-cli";
    case "codex":
    case "antigravity":
    case "opencode":
    case "pi":
      return normalized; // reuse, not recompute
    default: return "";
  }
}

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>

@github-actions github-actions Bot 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.

Review: Pass engine-specific agent type to gh skill install

Overall: looks good — one non-blocking suggestion.

The implementation is clean and correct. The engine→agent mapping, the backward-compat fallback through data.AI, and the GH_AW_INFO_ENGINE_ID env propagation all follow existing patterns in the codebase.

What was checked

Area Verdict
getSkillInstallAgent mapping completeness ✅ All documented engines handled
--agent arg ordering in buildSkillInstallCommand ✅ Placed after --pin (consistent across all 3 path branches)
Backward-compat fallback (data.AI) ✅ Mirrors existing GetEngineSkillDir pattern
Empty-engine guard (no --agent when unset) ✅ Safe no-op for unrecognised engines
Test coverage ✅ New unit tests cover mapping, per-argument order, and env-var wiring
YAML injection safety formatYAMLEnv already uses %q, no new vectors

Non-blocking suggestion

The crush engine is registered and has a skill dir (.crush/skills), but falls through to the default branch — intentionally, and the test confirms it. A one-line comment in getSkillInstallAgent would help future contributors understand this is a deliberate omission, not an oversight. (See inline comment.)

🧵 Reviewed using Impeccable skills by Impeccable Skills Reviewer · 87.2 AIC · ⌖ 6.75 AIC · ⊞ 4.9K

case "pi":
return (engineID || "").trim().toLowerCase();
default:
return "";

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.

The crush engine is a registered built-in engine (see engine_definition.go) with its own skill dir (.crush/skills), but it silently falls through to the default branch and emits no --agent flag. This is intentional per the test, but future contributors will wonder why crush is absent. A short inline comment would prevent confusion:

default:
  // Engines not yet mapped (e.g. "crush") get no --agent flag; gh skill install
  // will fall back to its own default layout.
  return "";

@copilot please address this.

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill, fix the blocking review feedback, and rerun checks once ready. Priorities:

  • resolve the blocking regression in addActivationArtifactUploadStep so legacy ai: workflows use the same engine fallback as addActivationSkillInstallSteps
  • address the requested changes from github-actions and follow up on the non-blocking review suggestions if they still apply
  • after updates, rerun the relevant checks and make sure the PR is merge-ready.

Generated by 👨‍🍳 PR Sous Chef · 22.6 AIC · ⌖ 15.7 AIC · ⊞ 4K ·

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Great work on this one! 🎉 Threading the engine ID through to gh skill install so each agent gets its correct host-specific skill layout is a clean and well-executed change.

The PR is well-structured, covers all the engine variants consistently, and the test additions in both install_frontmatter_skills.test.cjs and activation_skills_step_test.go give solid confidence in the new --agent flag wiring. The backward-compatibility fallback to the legacy ai field is a nice touch too.

This looks ready for review. 🚀

Generated by ✅ Contribution Check · 152.2 AIC · ⌖ 12.6 AIC · ⊞ 6.3K ·

Copilot AI and others added 2 commits July 1, 2026 13:53
Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>

Copilot AI commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

@copilot please run the pr-finisher skill, fix the blocking review feedback, and rerun checks once ready. Priorities:

  • resolve the blocking regression in addActivationArtifactUploadStep so legacy...

Addressed in 2c401e4 and 526bb23. The activation artifact upload now uses the same resolved engine fallback as skill installation, and I added coverage for the legacy ai: artifact path plus the no---agent JS path. Local validation passed (make lint, make test-unit, make test, make agent-report-progress); CI on this new HEAD still needs a maintainer re-trigger because agent pushes do not start workflows.

@pelikhan pelikhan merged commit 92012f4 into main Jul 1, 2026
37 checks passed
@pelikhan pelikhan deleted the copilot/update-gh-skill-js branch July 1, 2026 15:35
@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill and make one more readiness pass for maintainers. Priorities:

  • confirm the latest fixes fully cover the previously blocking artifact-upload regression and note whether any actionable review feedback is still open
  • rerun the relevant checks on the current head, since your last update noted local validation but CI still needed a fresh pass
  • leave a concise status update identifying any remaining non-blocking follow-ups, or explicitly state that the PR is ready for maintainer investigation.

Generated by 👨‍🍳 PR Sous Chef · 22.5 AIC · ⌖ 15.8 AIC · ⊞ 6.4K ·

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants