Skip to content

Re-resolve package manifests during workflow updates - #54119

Open
pelikhan with Copilot wants to merge 4 commits into
mainfrom
copilot/gh-aw-update-re-resolve-manifest
Open

Re-resolve package manifests during workflow updates#54119
pelikhan with Copilot wants to merge 4 commits into
mainfrom
copilot/gh-aw-update-re-resolve-manifest

Conversation

Copilot AI commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

gh aw update previously updated only already-installed workflows with source: fields. New aw.yml includes—such as action workflows, skills, and agents—were silently omitted.

  • Manifest reconciliation
    • Re-resolve current and latest package manifests during updates.
    • Install newly declared package-owned assets.
    • Preserve existing files instead of overwriting unrelated destinations.
  • Asset coverage
    • Supports mapped action workflows, skills, and agents.
    • Retains existing workflow update and removal behavior.
  • Regression coverage
    • Adds coverage for mixed package asset additions.

Example newly recognized manifest additions:

includes:
  - source: .github/workflows/release.yml
    destination: .github/workflows/release.yml
  - skills/review
  - agents/reviewer.md

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix gh aw update to install new includes from aw.yml Re-resolve package manifests during workflow updates Aug 20, 2026
Copilot AI requested a review from pelikhan August 20, 2026 02:05
@pelikhan
pelikhan marked this pull request as ready for review August 20, 2026 05:33
Copilot AI balanced review requested due to automatic review settings August 20, 2026 05:33
@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Test Quality Sentinel completed test quality analysis.

Test Quality Sentinel skipped because pre-fetch PR data was unavailable: unable to fetch test file diff

🧪 Test quality analysis by Test Quality Sentinel

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Ponytail Reviewer completed successfully!

Generated by Ponytail Reviewer for #54119

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

PR Code Quality Reviewer completed the code quality review.

🔎 Code quality review by PR Code Quality Reviewer

@github-actions

Copy link
Copy Markdown
Contributor

Comment Memory

reviewed_at: 2026-08-20T00:00:00Z
review_event: REQUEST_CHANGES
top_themes:
  - manifest asset reconciliation skips .yaml action workflows
files_reviewed:
  - pkg/cli/update_manifest.go
  - pkg/cli/update_manifest_test.go
comment_count: 1

Note

This comment is managed by comment memory.

It stores persistent context for this thread in the code block at the top of this comment.
Edit only the text inside the backtick fences; workflow metadata and the footer are regenerated automatically.

Learn more about comment memory

🔎 Code quality review by PR Code Quality Reviewer · gpt54 · 13.4 AIC · ⌖ 4.87 AIC · ⊞ 2.7K ·
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.

Request changes

This update fixes part of manifest re-resolution, but it still misses newly added action workflows when the package uses the .yaml extension, so gh aw update can leave the checkout out of sync after an upgrade.

Blocking theme
  • The new reconciliation path special-cases action workflows with a raw .yml suffix check instead of using the existing workflow-path predicate, so support for .yaml drifts here and valid package assets are skipped.

🔎 Code quality review by PR Code Quality Reviewer · gpt54 · 13.4 AIC · ⌖ 4.87 AIC · ⊞ 2.7K
Comment /review to run again

Comment thread pkg/cli/update_manifest.go Outdated
currentInstallables[installable.DestinationPath] = struct{}{}
}
for _, installable := range latestPkg.InstallationSource {
if _, existed := currentInstallables[installable.DestinationPath]; existed || !strings.HasSuffix(strings.ToLower(installable.SourcePath), ".yml") {

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.

This update only installs newly added action workflows when the manifest source path ends in .yml, so valid package additions like .github/workflows/release.yaml are silently skipped and gh aw update still leaves the repo incomplete.

💡 Why this is a real regression and how to fix it

The manifest parser already treats .yaml action workflows as unsupported today in some places, but the rest of the CLI and naming helpers explicitly handle both .yml and .yaml. Hard-coding strings.HasSuffix(..., ".yml") here means update behavior now diverges from add/enable behavior and any package that ships .yaml workflow files will never be reconciled after a version bump.

Please reuse the existing action-workflow predicate instead of open-coding the extension check, e.g.:

if _, existed := currentInstallables[installable.DestinationPath]; existed || !isActionWorkflowPath(installable.SourcePath) {
    continue
}

That keeps the extension policy in one place and prevents future drift.

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

Overall: The new reconcileManifestManagedAssets function is well-structured and the test coverage is solid. One correctness issue found: the .yml-only suffix filter silently drops valid .yaml action workflow files.

🧵 Reviewed using Impeccable skills by Impeccable Skills Reviewer · sonnet46 · 21.5 AIC · ⌖ 8.84 AIC · ⊞ 5.7K

if err != nil {
return fmt.Errorf("failed to download new package action workflow %s: %w", installable.SourcePath, err)
}
destPath := filepath.Join(gitRoot, filepath.FromSlash(installable.DestinationPath))

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 suffix check only accepts .yml but GitHub Actions workflows are equally valid with a .yaml extension. A package providing action workflows named *.yaml will be silently skipped during updates.

// Before
!strings.HasSuffix(strings.ToLower(installable.SourcePath), ".yml")

// After
ext := strings.ToLower(filepath.Ext(installable.SourcePath))
ext != ".yml" && ext != ".yaml"

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

Ponytail review (over-engineering only).

One finding: the three asset-reconciliation loops in reconcileManifestManagedAssets (action workflows, skills, agents) repeat the same seen-set/skip/download/install shape. A small generic helper would shrink this considerably.

net: -35 lines possible.

Generated by ✂️ Ponytail Reviewer for #54119 · auto · 27.2 AIC · ⌖ 7.97 AIC · ⊞ 7.3K
Comment /ponytail to run again

Comment thread pkg/cli/update_manifest.go Outdated
return err
}

currentInstallables := make(map[string]struct{}, len(currentPkg.InstallationSource))

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.

L216-286: yagni: three near-identical diff-and-download loops (installables/skills/agents) each rebuild a seen-set, skip existing, download, then install. Single generic helper over a slice of {seenKey, download, install} would collapse ~50 lines to ~15.

@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 /diagnosing-bugs and /tdd — requesting changes on a few correctness and test coverage issues.

📋 Key Themes & Highlights

Key Themes

  • Download-before-check ordering: The .yml action workflow loop downloads the file before verifying the destination doesn't exist, wasting a network call for files that will be skipped.
  • Partial-failure behaviour: A single download error in the skills/agents loops aborts all remaining installations, potentially leaving the repo half-installed with no summary of what succeeded.
  • Test coverage gaps: The skip-if-exists path and file content correctness are untested.
  • Silent filter: Non-.yml InstallationSource entries are silently skipped with no log; this may surprise future contributors adding other asset types to the manifest.

Positive Highlights

  • ✅ Clean separation into reconcileManifestManagedAssets — easy to read and test independently.
  • ✅ Good use of set-membership lookups (map[string]struct{}) for the "already installed" check.
  • ✅ Existence guard before overwrite (os.Stat check) is the right safe-write pattern.
  • ✅ Regression test added alongside the new function — good TDD discipline.

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · sonnet46 · 48.6 AIC · ⌖ 10.5 AIC · ⊞ 7.8K
Comment /matt to run again

Comment thread pkg/cli/update_manifest.go Outdated
if _, existed := currentInstallables[installable.DestinationPath]; existed || !strings.HasSuffix(strings.ToLower(installable.SourcePath), ".yml") {
continue
}
content, err := downloadPackageFileFromGitHubForHost(ctx, owner, repository, installable.SourcePath, latestPkg.ResolvedRef, "")

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.

[/diagnosing-bugs] The network download at line 224 happens before the destination existence check — if the file already exists on disk the download was wasted and any transient network error will abort the whole reconcile unnecessarily.

💡 Suggested fix

Move the existence check before the download:

destPath := filepath.Join(gitRoot, filepath.FromSlash(installable.DestinationPath))
if _, err := os.Stat(destPath); err == nil {
    updateManifestLog.Printf("Skipping new package action workflow because destination already exists: %s", destPath)
    continue
} else if !os.IsNotExist(err) {
    return fmt.Errorf("failed to inspect new package action workflow destination %s: %w", destPath, err)
}
content, err := downloadPackageFileFromGitHubForHost(ctx, owner, repository, installable.SourcePath, latestPkg.ResolvedRef, "")

@copilot please address this.

Comment thread pkg/cli/update_manifest.go Outdated
currentInstallables[installable.DestinationPath] = struct{}{}
}
for _, installable := range latestPkg.InstallationSource {
if _, existed := currentInstallables[installable.DestinationPath]; existed || !strings.HasSuffix(strings.ToLower(installable.SourcePath), ".yml") {

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.

[/diagnosing-bugs] The .yml filter on installable.SourcePath (line 221) only installs action workflows, silently skipping non-.yml installables (e.g. shell scripts, markdown assets). If the manifest ever includes such entries under InstallationSource, they will be permanently ignored during update with no log or error.

💡 Suggestion

Either document that InstallationSource is intentionally limited to .yml action workflows, or log a debug message when skipping non-.yml entries so operators can diagnose unexpected omissions:

if !strings.HasSuffix(strings.ToLower(installable.SourcePath), ".yml") {
    updateManifestLog.Printf("Skipping non-yml installable: %s", installable.SourcePath)
    continue
}

@copilot please address this.

assert.FileExists(t, filepath.Join(tmpDir, workflow.GetEngineSkillDir("copilot"), "review", "scripts", "check.sh"))
assert.FileExists(t, filepath.Join(tmpDir, workflow.GetEngineSubAgentDir("copilot"), "reviewer.md"))
}

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 test only asserts that files exist but doesn't verify their content matches what the mock download returned. A content check would catch regressions where the write path silently truncates or transforms the file.

💡 Suggestion

Add content assertions after the FileExists checks:

content, err := os.ReadFile(filepath.Join(tmpDir, ".github", "workflows", "new.yml"))
require.NoError(t, err)
assert.Equal(t, "name: new action\n", string(content))

@copilot please address this.

return fmt.Errorf("failed to download new package action workflow %s: %w", installable.SourcePath, err)
}
destPath := filepath.Join(gitRoot, filepath.FromSlash(installable.DestinationPath))
if _, err := os.Stat(destPath); err == nil {

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] There's no test for the case where a destination file already exists — the skip-if-exists logic (line 229–231) has zero test coverage, so a future regression that accidentally overwrites existing files would go undetected.

💡 Suggested test case
func TestReconcileManifestManagedAssets_SkipsExistingDestination(t *testing.T) {
    tmpDir := testutil.TempDir(t, "manifest-assets-skip-*")
    require.NoError(t, os.MkdirAll(filepath.Join(tmpDir, ".git"), 0o755))
    require.NoError(t, os.MkdirAll(filepath.Join(tmpDir, ".github", "workflows"), 0o755))
    existing := filepath.Join(tmpDir, ".github", "workflows", "existing.yml")
    require.NoError(t, os.WriteFile(existing, []byte("original"), 0o644))
    t.Chdir(tmpDir)

    downloadCalled := false
    downloadPackageFileFromGitHubForHost = func(...) ([]byte, error) {
        downloadCalled = true
        return []byte("overwrite"), nil
    }

    err := reconcileManifestManagedAssets(context.Background(), "owner/repo",
        &resolvedRepositoryPackage{},
        &resolvedRepositoryPackage{
            ResolvedRef: "v2",
            InstallationSource: []resolvedPackageInstallable{{
                SourcePath: ".github/workflows/existing.yml",
                DestinationPath: ".github/workflows/existing.yml",
            }},
        },
        UpdateWorkflowsOptions{},
    )
    require.NoError(t, err)
    assert.False(t, downloadCalled, "should not download when destination already exists")
    content, _ := os.ReadFile(existing)
    assert.Equal(t, "original", string(content), "existing file should not be overwritten")
}

@copilot please address this.

}
content, err := downloadPackageFileFromGitHubForHost(ctx, owner, repository, skill.SourcePath, latestPkg.ResolvedRef, "")
if err != nil {
return fmt.Errorf("failed to download new package skill %s: %w", skill.SourcePath, err)

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.

[/diagnosing-bugs] A single download error in the skills or agents loops causes the entire reconcile to fail (via return err), aborting installation of all subsequent assets. This is an early-exit-on-first-failure pattern that could leave the repository in a partially installed state with no indication of which assets were installed vs skipped.

💡 Consider accumulating errors

Accumulate failures and continue — similar to how updateManifestWorkflowGroup collects failures []updateFailure rather than returning on the first error:

var errs []error
for _, skill := range latestPkg.SkillFiles {
    if err := installSkill(...); err != nil {
        errs = append(errs, err)
    }
}
return errors.Join(errs...)

This ensures all installable assets are attempted and the caller gets a complete picture.

@copilot please address this.

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

Reconciles package manifests during gh aw update so newly added package assets are installed.

Changes:

  • Adds reconciliation for action workflows, skills, and agents.
  • Preserves existing destination files.
  • Adds mixed-asset regression coverage.
Show a summary per file
File Description
pkg/cli/update_manifest.go Resolves and installs newly declared package assets.
pkg/cli/update_manifest_test.go Tests mixed package asset installation.

Review details

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

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

Comment thread pkg/cli/update_manifest.go Outdated
Comment on lines +217 to +221
for _, installable := range currentPkg.InstallationSource {
currentInstallables[installable.DestinationPath] = struct{}{}
}
for _, installable := range latestPkg.InstallationSource {
if _, existed := currentInstallables[installable.DestinationPath]; existed || !strings.HasSuffix(strings.ToLower(installable.SourcePath), ".yml") {
Comment thread pkg/cli/update_manifest.go Outdated
// reconcileManifestManagedAssets installs package-owned action workflows, skills, and
// agents that were added to the latest manifest. These assets do not carry source
// frontmatter, so their package ownership is derived from the package manifest itself.
func reconcileManifestManagedAssets(ctx context.Context, repo string, currentPkg, latestPkg *resolvedRepositoryPackage, opts UpdateWorkflowsOptions) error {
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

🏗️ Design Decision Gate — ADR Required

This PR makes significant changes to core business logic (140 new lines in pkg/) but does not have a linked Architecture Decision Record (ADR).

📄 Draft ADR committed: docs/adr/54119-reconcile-manifest-managed-assets-on-update.md — review and complete it before merging.

🔒 This PR cannot merge until an ADR is linked in the PR body.

📋 What to do next
  1. Review the draft ADR committed to your branch — it was generated from the PR diff
  2. Complete the missing sections — add context the AI couldn't infer, refine the decision rationale, and list real alternatives you considered
  3. Commit the finalized ADR to docs/adr/ on your branch
  4. Reference the ADR in this PR body by adding a line such as:

    ADR: ADR-54119: Reconcile Manifest-Managed Assets During gh aw update

Once an ADR is linked in the PR body, this gate will re-run and verify the implementation matches the decision.

❓ Why ADRs Matter

"AI made me procrastinate on key design decisions. Because refactoring was cheap, I could always say 'I'll deal with this later.' Deferring decisions corroded my ability to think clearly."

ADRs create a searchable, permanent record of why the codebase looks the way it does. Future contributors (and your future self) will thank you.

📋 Michael Nygard ADR Format Reference

An ADR must contain these four sections to be considered complete:

  • Context — What is the problem? What forces are at play?
  • Decision — What did you decide? Why?
  • Alternatives Considered — What else could have been done?
  • Consequences — What are the trade-offs (positive and negative)?

All ADRs are stored in docs/adr/ as Markdown files numbered by PR number (e.g., 0042-use-postgresql.md for PR #42).

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · sonnet46 · 68 AIC · ⌖ 20.5 AIC · ⊞ 9.1K ·
Comment /review to run again

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Score: 100/100 ✅ Excellent

Summary: 1 new behavioral test added with strong coverage of the new reconcileManifestManagedAssets feature. All tests verify design contracts, implementation ratio is 0% (threshold: 30%), and no violations detected.


Key Metrics

Metric Value Status
Test Quality Score 100/100 ✅ Excellent
New Tests 1
Design Tests 1 (100%) ✅ High Value
Implementation Tests 0 (0%) ✅ Threshold: 30%
Edge Case Coverage 1 (100%) ✅ Excellent
Duplicate Patterns 0 ✅ None
Test Inflation Ratio 0.52:1 ✅ Threshold: 2:1
Build Tag Compliance ✅ Present ✅ Compliant
Mock Library Usage None ✅ Clean

Test Details

TestReconcileManifestManagedAssets_AddsPackageOwnedAssets (48 lines, new)

Design Invariant: Verifies that reconcileManifestManagedAssets correctly installs newly declared package-owned assets across three types: action workflows (.yml), skills, and agents (.md).

Classification:

  • Behavioral Contract — Tests user-visible API behavior
  • Design Test — Verifies function fulfills its manifest reconciliation contract
  • High Value — Covers new feature critical to update workflow

Assertions & Coverage:

  • ✅ Error handling: require.NoError(t, err) validates successful reconciliation
  • ✅ Action workflow: assert.FileExists() verifies .yml file installed at correct destination
  • ✅ Skill asset: assert.FileExists() verifies skill installed in engine-specific directory
  • ✅ Agent asset: assert.FileExists() verifies agent installed in engine-specific directory
  • ✅ Mock validation: Enforces expected owner/repo/ref values (lines 29–31)

Mocking Strategy:

  • ✅ Replaces downloadPackageFileFromGitHubForHost (external I/O) — acceptable
  • ✅ No forbidden mock libraries (gomock, testify/mock) — clean
  • ✅ Uses function reassignment pattern — standard Go testing idiom
  • ⚠️ Note: Mock always succeeds; network error paths tested elsewhere in integration suite

Line Coverage:

  • 48 test lines added (new test)
  • 92 production lines added (update_manifest.go)
  • Ratio: 0.52 ✅ (well below 2:1 threshold)

Compliance Status

All checks passed

  • No hard violations (build tags, mock libraries, inflation)
  • Implementation ratio within threshold (0% < 30%)
  • Test design focused on behavioral contracts
  • Clean separation of concerns in mocking

Next Steps

  • ✅ PR ready to merge — test quality validates new feature coverage
  • Recommend considering integration tests for real network error paths (optional follow-up)

🧪 Test quality analysis by Test Quality Sentinel · haiku45 · 26.1 AIC · ⌖ 5.56 AIC · ⊞ 8.1K ·
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: 100/100. 0% implementation tests (threshold: 30%). All behavioral tests verify design contracts with zero violations detected.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot This PR looks close, but it still needs a maintainer-facing finish pass.

  • Please refresh the branch if GitHub offers one.
  • Review any maintainer-visible blockers or unresolved feedback.
  • Then run the pr-finisher skill and leave a concise handoff comment with validation and any remaining risks.

Run: https://github.com/github/gh-aw/actions/runs/32337181772

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 15 AIC · ⌖ 8.06 AIC · ⊞ 9.3K ·
Comment /souschef to run again

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

Copilot AI commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

@copilot This PR looks close, but it still needs a maintainer-facing finish pass.

  • Please refresh the branch if GitHub offers one....

Addressed in 9a84882.

Handoff:

  • Local validation passed: make fmt, make lint, TEST_UNIT_RUN_FULL=1 make test-unit, make test, make recompile, and BASE_REF=HEAD~1 make agent-report-progress.
  • Fixed maintainer-visible blockers in this PR:
    • branch-tracking refs now reconcile missing package assets by probing local destinations instead of comparing only live manifests;
    • asset reconciliation now reuses installed workflow engine when --engine is not provided.
  • Added regression coverage for branch-tracking reconciliation and engine inference.
  • CI note: agent pushes do not trigger fresh CI in this environment; prior run 32337181772 has no failed jobs, but maintainers should re-trigger CI on current HEAD before merge.

Remaining risk: check status is currently stale/unverified for the new head until maintainer-triggered CI runs.

@github-actions

Copy link
Copy Markdown
Contributor

PR Triage

Category: feature | Risk: medium | Priority: medium (score 55/100)
Score breakdown: impact 22 + urgency 15 + quality 18
Recommended action: fast_track
Small, focused fix for manifest re-resolution during gh aw update. Initial CHANGES_REQUESTED addressed and now APPROVED by automated reviewer — ready for expedited human review.

Generated by 🔧 PR Triage Agent · auto · 62.9 AIC · ⌖ 7.05 AIC · ⊞ 8.3K ·

@github-actions

Copy link
Copy Markdown
Contributor

PR Triage

Category: feature · Risk: medium · Score: 60/100 · Action: fast_track

Approved by automated reviewer. Adds manifest re-resolution capability with no deletions (net-new, low regression risk).

Automated triage — see the [triage report issue] for full context.

Generated by 🔧 PR Triage Agent · auto · 67 AIC · ⌖ 10.2 AIC · ⊞ 8.3K ·

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.

gh aw update does not install new includes added to an aw.yml

4 participants