From b1542d9b03d7624656f62da8d96f980b62e7421c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Aug 2026 19:32:21 +0000 Subject: [PATCH 1/2] Initial plan From 5b2017e3d4708cba8a4aa3f60ea1c991775d86ce Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Aug 2026 19:47:09 +0000 Subject: [PATCH 2/2] Fix DeepReport repo-memory persistence and surface glob filter mismatches Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- ...patch-repo-memory-glob-depth-visibility.md | 5 ++++ .../agent-performance-analyzer.lock.yml | 2 +- .../workflows/agentic-token-audit.lock.yml | 2 +- .../agentic-token-optimizer.lock.yml | 2 +- .github/workflows/audit-workflows.lock.yml | 2 +- .../workflows/copilot-agent-analysis.lock.yml | 2 +- .../copilot-centralization-optimizer.lock.yml | 2 +- .../copilot-cli-deep-research.lock.yml | 2 +- .../copilot-pr-nlp-analysis.lock.yml | 2 +- .../copilot-pr-prompt-analysis.lock.yml | 2 +- .../copilot-session-insights.lock.yml | 2 +- ...daily-awf-spec-compiler-surfacing.lock.yml | 2 +- .../workflows/daily-cli-performance.lock.yml | 2 +- .../daily-formal-spec-verifier.lock.yml | 2 +- .github/workflows/daily-news.lock.yml | 2 +- .../workflows/daily-sentrux-report.lock.yml | 2 +- .../daily-testify-uber-super-expert.lock.yml | 2 +- .github/workflows/deep-report.lock.yml | 6 ++-- .github/workflows/deep-report.md | 24 ++++++++++----- .github/workflows/delight.lock.yml | 2 +- .github/workflows/eslint-refiner.lock.yml | 2 +- .github/workflows/pr-triage-agent.lock.yml | 2 +- .github/workflows/sergo.lock.yml | 2 +- .github/workflows/smoke-ci.lock.yml | 2 +- .../workflow-health-manager.lock.yml | 2 +- actions/setup/js/push_repo_memory.cjs | 13 +++++++- actions/setup/js/push_repo_memory.test.cjs | 28 +++++++++++++++++ .../src/content/docs/reference/repo-memory.md | 2 ++ pkg/workflow/repo_memory_prompt.go | 17 +++++++++++ pkg/workflow/repo_memory_template_test.go | 30 +++++++++++++++++++ 30 files changed, 136 insertions(+), 33 deletions(-) create mode 100644 .changeset/patch-repo-memory-glob-depth-visibility.md diff --git a/.changeset/patch-repo-memory-glob-depth-visibility.md b/.changeset/patch-repo-memory-glob-depth-visibility.md new file mode 100644 index 00000000000..a4dbef6399c --- /dev/null +++ b/.changeset/patch-repo-memory-glob-depth-visibility.md @@ -0,0 +1,5 @@ +--- +"gh-aw": patch +--- + +Make repo-memory glob mismatches visible instead of silent. `push_repo_memory` now emits a warning listing the rejected paths when every file in the memory artifact is filtered out by `file-glob`, and the generated repo-memory prompt documents that slashless patterns (e.g. `*.md`) only match files placed exactly one folder deep in the memory folder. diff --git a/.github/workflows/agent-performance-analyzer.lock.yml b/.github/workflows/agent-performance-analyzer.lock.yml index c210b219f4d..4d861e709d2 100644 --- a/.github/workflows/agent-performance-analyzer.lock.yml +++ b/.github/workflows/agent-performance-analyzer.lock.yml @@ -415,7 +415,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `agenticworkflows` — run `agenticworkflows --help` to see available tools\n- `safeoutputs` — run `safeoutputs --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/meta-orchestrators' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 51200 bytes (50 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 51200 bytes (50 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: '' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/agentic-token-audit.lock.yml b/.github/workflows/agentic-token-audit.lock.yml index 45cc5b6af09..41da2942f0a 100644 --- a/.github/workflows/agentic-token-audit.lock.yml +++ b/.github/workflows/agentic-token-audit.lock.yml @@ -336,7 +336,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `github` — run `github --help` to see available tools\n- `safeoutputs` — run `safeoutputs --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/token-audit' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 51200 bytes (50 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 51200 bytes (50 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical daily workflow AIC snapshots (shared with agentic-token-optimizer)' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/agentic-token-optimizer.lock.yml b/.github/workflows/agentic-token-optimizer.lock.yml index 051e78ae97c..350484b7a0f 100644 --- a/.github/workflows/agentic-token-optimizer.lock.yml +++ b/.github/workflows/agentic-token-optimizer.lock.yml @@ -331,7 +331,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_MEMORY_BRANCH_NAME: 'memory/token-audit' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 51200 bytes (50 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 51200 bytes (50 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical daily workflow AIC snapshots (shared with agentic-token-audit)' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/audit-workflows.lock.yml b/.github/workflows/audit-workflows.lock.yml index 9251be72a87..9f630a5de64 100644 --- a/.github/workflows/audit-workflows.lock.yml +++ b/.github/workflows/audit-workflows.lock.yml @@ -408,7 +408,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `agenticworkflows` — run `agenticworkflows --help` to see available tools\n- `safeoutputs` — run `safeoutputs --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/audit-workflows' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 51200 bytes (50 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 51200 bytes (50 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical audit data and patterns' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/copilot-agent-analysis.lock.yml b/.github/workflows/copilot-agent-analysis.lock.yml index 4ce88233627..1489a55aad5 100644 --- a/.github/workflows/copilot-agent-analysis.lock.yml +++ b/.github/workflows/copilot-agent-analysis.lock.yml @@ -400,7 +400,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_MEMORY_BRANCH_NAME: 'memory/copilot-agent-analysis' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical agent performance metrics' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/copilot-centralization-optimizer.lock.yml b/.github/workflows/copilot-centralization-optimizer.lock.yml index 35380a82723..6dfc1f1b24a 100644 --- a/.github/workflows/copilot-centralization-optimizer.lock.yml +++ b/.github/workflows/copilot-centralization-optimizer.lock.yml @@ -322,7 +322,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `github` — run `github --help` to see available tools\n- `safeoutputs` — run `safeoutputs --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/copilot-centralization-optimizer' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Long-lived centralization trend snapshots and history' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/copilot-cli-deep-research.lock.yml b/.github/workflows/copilot-cli-deep-research.lock.yml index e4549eddd60..cdfa740d1f5 100644 --- a/.github/workflows/copilot-cli-deep-research.lock.yml +++ b/.github/workflows/copilot-cli-deep-research.lock.yml @@ -343,7 +343,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_MEMORY_BRANCH_NAME: 'memory/copilot-cli-research' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.md\n- **Max File Size**: 204800 bytes (0.20 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 204800 bytes (0.20 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Copilot CLI research notes and analysis history' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/copilot-pr-nlp-analysis.lock.yml b/.github/workflows/copilot-pr-nlp-analysis.lock.yml index 29900d11b92..1ba0ae820b4 100644 --- a/.github/workflows/copilot-pr-nlp-analysis.lock.yml +++ b/.github/workflows/copilot-pr-nlp-analysis.lock.yml @@ -359,7 +359,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `github` — run `github --help` to see available tools\n- `safeoutputs` — run `safeoutputs --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/nlp-analysis' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical NLP analysis results' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/copilot-pr-prompt-analysis.lock.yml b/.github/workflows/copilot-pr-prompt-analysis.lock.yml index 31d78695db6..8f17a9594bc 100644 --- a/.github/workflows/copilot-pr-prompt-analysis.lock.yml +++ b/.github/workflows/copilot-pr-prompt-analysis.lock.yml @@ -352,7 +352,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `github` — run `github --help` to see available tools\n- `safeoutputs` — run `safeoutputs --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/prompt-analysis' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical prompt pattern analysis' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/copilot-session-insights.lock.yml b/.github/workflows/copilot-session-insights.lock.yml index 31f1032872a..0ae0000332f 100644 --- a/.github/workflows/copilot-session-insights.lock.yml +++ b/.github/workflows/copilot-session-insights.lock.yml @@ -376,7 +376,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_MEMORY_BRANCH_NAME: 'memory/session-insights' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical session analysis data' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml b/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml index c45e9252c37..a2184682c75 100644 --- a/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml +++ b/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml @@ -346,7 +346,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_MEMORY_BRANCH_NAME: 'memory/awf-feature-surfacing' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: .json, .md\n- **Max File Size**: 65536 bytes (0.06 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: .json, .md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 65536 bytes (0.06 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: '' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/daily-cli-performance.lock.yml b/.github/workflows/daily-cli-performance.lock.yml index 68c64b8a459..fa1846b573e 100644 --- a/.github/workflows/daily-cli-performance.lock.yml +++ b/.github/workflows/daily-cli-performance.lock.yml @@ -381,7 +381,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `mcpscripts` — run `mcpscripts --help` to see available tools\n- `safeoutputs` — run `safeoutputs --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/cli-performance' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.txt\n- **Max File Size**: 131072 bytes (0.12 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.txt\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 131072 bytes (0.12 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical CLI compilation performance benchmark results' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/daily-formal-spec-verifier.lock.yml b/.github/workflows/daily-formal-spec-verifier.lock.yml index afc8fd501c2..13bfc7bb7d0 100644 --- a/.github/workflows/daily-formal-spec-verifier.lock.yml +++ b/.github/workflows/daily-formal-spec-verifier.lock.yml @@ -352,7 +352,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_MEMORY_BRANCH_NAME: 'memory/formal-spec-verifier' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.md, *.json\n- **Max File Size**: 65536 bytes (0.06 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.md, *.json\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 65536 bytes (0.06 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: '' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/daily-news.lock.yml b/.github/workflows/daily-news.lock.yml index d11bac35e83..31933dd6831 100644 --- a/.github/workflows/daily-news.lock.yml +++ b/.github/workflows/daily-news.lock.yml @@ -399,7 +399,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `safeoutputs` — run `safeoutputs --help` to see available tools\n- `tavily` — run `tavily --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/daily-news' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical news digest data' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/daily-sentrux-report.lock.yml b/.github/workflows/daily-sentrux-report.lock.yml index 29cb835239d..8df6cf08a7a 100644 --- a/.github/workflows/daily-sentrux-report.lock.yml +++ b/.github/workflows/daily-sentrux-report.lock.yml @@ -351,7 +351,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `github` — run `github --help` to see available tools\n- `safeoutputs` — run `safeoutputs --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'daily/daily-sentrux-report' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl\n- **Max File Size**: 51200 bytes (0.05 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 51200 bytes (0.05 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical sentrux quality signal and architecture metrics' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/daily-testify-uber-super-expert.lock.yml b/.github/workflows/daily-testify-uber-super-expert.lock.yml index 123e2202cc8..b9323b9d9d1 100644 --- a/.github/workflows/daily-testify-uber-super-expert.lock.yml +++ b/.github/workflows/daily-testify-uber-super-expert.lock.yml @@ -360,7 +360,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `safeoutputs` — run `safeoutputs --help` to see available tools\n- `serena` — run `serena --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/testify-expert' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.txt\n- **Max File Size**: 51200 bytes (0.05 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.txt\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 51200 bytes (0.05 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Tracks processed test files to avoid duplicates' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/deep-report.lock.yml b/.github/workflows/deep-report.lock.yml index d078a16bc85..3da75c4d808 100644 --- a/.github/workflows/deep-report.lock.yml +++ b/.github/workflows/deep-report.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"07de217275fdbef3dd17870362951d1ef62b640299dae201bc6353e313d029a7","body_hash":"ad29b5fb3fdcf78812b02abfbd9443f027b0efbf0f091a5c614333c031d8a0f3","strict":true,"agent_id":"claude","engine_versions":{"claude":"2.1.223"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"f0d6680e8dcc0c371807232bd06dbdecd3935e641d3dd54aff7ee476e1998b3b","body_hash":"8bcd188ff239b75309012f4eaf574f0b10f6b2540e4305b704dbbd358b94e369","strict":true,"agent_id":"claude","engine_versions":{"claude":"2.1.223"}} # gh-aw-manifest: {"version":1,"secrets":["ANTHROPIC_API_KEY","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-go","sha":"b7ad1dad31e06c5925ef5d2fc7ad053ef454303e","version":"v7.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"docker/build-push-action","sha":"53b7df96c91f9c12dcc8a07bcb9ccacbed38856a","version":"v7.3.0"},{"repo":"docker/setup-buildx-action","sha":"bb05f3f5519dd87d3ba754cc423b652a5edd6d2c","version":"v4.2.0"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.44","digest":"sha256:0d727725c737b58c7bdf51f640cffb928385ec46517e0917c7f1a02f1bada8b4","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.44@sha256:0d727725c737b58c7bdf51f640cffb928385ec46517e0917c7f1a02f1bada8b4"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.44","digest":"sha256:b50fbadba138f6e9aba94aca09711335c489bb3b15861220cb66f6092e042dc7","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.44@sha256:b50fbadba138f6e9aba94aca09711335c489bb3b15861220cb66f6092e042dc7"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.44","digest":"sha256:c064d15974f7c933ec7d3f7b4038f4fd203547b3154bdc821afd379144887eff","pinned_image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.27.44@sha256:c064d15974f7c933ec7d3f7b4038f4fd203547b3154bdc821afd379144887eff"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.44","digest":"sha256:83e48bbe12c634be8c228a576832fe45f66c529ac3659db92bddbcf2eeb6d627","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.44@sha256:83e48bbe12c634be8c228a576832fe45f66c529ac3659db92bddbcf2eeb6d627"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.8","digest":"sha256:38bbea36cdb46a3c9d04d1db05e672966f5239b431a2022eb35881688e5721d8","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.8@sha256:38bbea36cdb46a3c9d04d1db05e672966f5239b431a2022eb35881688e5721d8"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:0d9f1fb5fd6610c0ac1f5194a38e45a8a1e81f8a390d5142d8e4e6f26a4b3196","pinned_image":"ghcr.io/github/gh-aw-node@sha256:0d9f1fb5fd6610c0ac1f5194a38e45a8a1e81f8a390d5142d8e4e6f26a4b3196"},{"image":"ghcr.io/github/github-mcp-server:v1.8.0","digest":"sha256:d5a18c04b92714c309eb46a2305087e91a4dbd80420f6e462656699f95093520","pinned_image":"ghcr.io/github/github-mcp-server:v1.8.0@sha256:d5a18c04b92714c309eb46a2305087e91a4dbd80420f6e462656699f95093520"},{"image":"node:lts-alpine","digest":"sha256:d32cdf619f63fe0471182d08996dd516c6275bb5fd31ae06e55a570bd9e1ad43","pinned_image":"node:lts-alpine@sha256:d32cdf619f63fe0471182d08996dd516c6275bb5fd31ae06e55a570bd9e1ad43"}]} # This file was automatically generated by gh-aw. DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -407,7 +407,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `agentdb` — run `agentdb --help` to see available tools\n- `agenticworkflows` — run `agenticworkflows --help` to see available tools\n- `mcpscripts` — run `mcpscripts --help` to see available tools\n- `safeoutputs` — run `safeoutputs --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/deep-report' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.md\n- **Max File Size**: 1048576 bytes (1.00 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.md, *.json\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 1048576 bytes (1.00 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Long-term insights, patterns, and trend data' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' @@ -2893,7 +2893,7 @@ jobs: MAX_FILE_COUNT: 100 MAX_PATCH_SIZE: 10240 ALLOWED_EXTENSIONS: '[]' - FILE_GLOB_FILTER: "*.md" + FILE_GLOB_FILTER: "*.md *.json" with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); diff --git a/.github/workflows/deep-report.md b/.github/workflows/deep-report.md index 59562cd0f6b..41c6ce57f45 100644 --- a/.github/workflows/deep-report.md +++ b/.github/workflows/deep-report.md @@ -71,7 +71,7 @@ tools: repo-memory: branch-name: memory/deep-report description: "Long-term insights, patterns, and trend data" - file-glob: ["*.md"] + file-glob: ["*.md", "*.json"] max-file-size: 1048576 # 1MB bash: - "*" @@ -160,8 +160,8 @@ Schema is available at `/tmp/gh-aw/agent/weekly-issues-data/issues-schema.json`. **EFFICIENCY FIRST**: Before starting full analysis: -1. Check `/tmp/gh-aw/repo-memory/default/memory/deep-report/` for previous insights -2. Load any existing markdown files (only markdown files are allowed in repo-memory): +1. Check `/tmp/gh-aw/repo-memory/default/deep-report/` for previous insights +2. Load any existing markdown files: - `last_analysis_timestamp.md` - When the last full analysis was run - `known_patterns.md` - Previously identified patterns - `trend_data.md` - Historical trend data @@ -169,6 +169,13 @@ Schema is available at `/tmp/gh-aw/agent/weekly-issues-data/issues-schema.json`. 3. If the last analysis was less than 20 hours ago, focus only on new data since then +**Memory layout (important)**: repo-memory files are only persisted when they live in a +single subfolder of the memory root — i.e. `/tmp/gh-aw/repo-memory/default/deep-report/`. +Never write to the memory root directly and never nest deeper (e.g. a legacy +`/tmp/gh-aw/repo-memory/default/memory/deep-report/` path is silently dropped by the `*.md`/`*.json` +file globs). If you find files under the legacy `memory/deep-report/` path, copy them into +`/tmp/gh-aw/repo-memory/default/deep-report/` so their history is preserved going forward. + ### Step 1: Gather Discussion Intelligence 1. Load discussions from the pre-fetched data file at `/tmp/gh-aw/agent/discussions-data/discussions.json` @@ -212,7 +219,7 @@ Use the `issues-analyst` sub-agent to analyze `/tmp/gh-aw/agent/weekly-issues-da In addition to the broad intelligence gathering above, perform targeted **code quality task mining** on the same discussions data: -1. Load `memory/deep-report/processed-discussions.json` (repo-memory) to find which discussions were previously mined — skip re-processing those. +1. Load `/tmp/gh-aw/repo-memory/default/deep-report/processed-discussions.json` (repo-memory) to find which discussions were previously mined — skip re-processing those. 2. For each unprocessed discussion from the last 7 days, extract tasks that meet **all** of the following criteria: - **Specific**: clear scope and acceptance criteria - **Actionable**: can be completed by an AI agent or developer @@ -222,7 +229,7 @@ In addition to the broad intelligence gathering above, perform targeted **code q 3. Focus on these code quality areas: refactoring, testing gaps, documentation, performance, security, technical debt, tooling improvements. 4. Exclude: vague suggestions, feature requests, bug reports, architectural decisions. 5. Dedup against existing open issues before creating any new ones (same check as the dedup gate above). -6. Save updated `processed-discussions.json` and `extracted-tasks.json` to repo-memory after this step. +6. Save updated `processed-discussions.json` and `extracted-tasks.json` to `/tmp/gh-aw/repo-memory/default/deep-report/` after this step. Include the code quality tasks surfaced here in the 7 actionable issues created in the task creation step. @@ -242,13 +249,16 @@ Connect the dots between different data sources: ### Step 4: Store Insights in Repo Memory -Save your findings to `/tmp/gh-aw/repo-memory/default/memory/deep-report/` as markdown files: +Save your findings to `/tmp/gh-aw/repo-memory/default/deep-report/` as markdown files: - Update `known_patterns.md` with any new patterns discovered - Update `trend_data.md` with current metrics - Update `flagged_items.md` with items needing attention - Save `last_analysis_timestamp.md` with current timestamp -**Note:** Only markdown (.md) files are allowed in the repo-memory folder. Use markdown tables, lists, and formatting to structure your data. +**Note:** Only `.md` and `.json` files are persisted, and only when written directly inside +`/tmp/gh-aw/repo-memory/default/deep-report/` (no deeper nesting). After writing, call the +`push_repo_memory` tool and check its output: if it reports that files were filtered out or that +there were no files to copy, fix the paths/extensions and retry. #### Actionable Task Creation diff --git a/.github/workflows/delight.lock.yml b/.github/workflows/delight.lock.yml index b7b811c9754..0670a5b2513 100644 --- a/.github/workflows/delight.lock.yml +++ b/.github/workflows/delight.lock.yml @@ -344,7 +344,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_MEMORY_BRANCH_NAME: 'memory/delight' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl, *.csv, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Track delight findings and historical patterns' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/eslint-refiner.lock.yml b/.github/workflows/eslint-refiner.lock.yml index 2e4aa7ccb00..c0f63945086 100644 --- a/.github/workflows/eslint-refiner.lock.yml +++ b/.github/workflows/eslint-refiner.lock.yml @@ -350,7 +350,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_MEMORY_BRANCH_NAME: 'memory/eslint-refiner' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical ESLint rule refinement runs and diagnostics snapshots' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/pr-triage-agent.lock.yml b/.github/workflows/pr-triage-agent.lock.yml index 0722de15e77..a0400b16f8e 100644 --- a/.github/workflows/pr-triage-agent.lock.yml +++ b/.github/workflows/pr-triage-agent.lock.yml @@ -355,7 +355,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_MEMORY_BRANCH_NAME: 'memory/pr-triage' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: '' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/sergo.lock.yml b/.github/workflows/sergo.lock.yml index 4ccfd89d196..13228733bbd 100644 --- a/.github/workflows/sergo.lock.yml +++ b/.github/workflows/sergo.lock.yml @@ -360,7 +360,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `safeoutputs` — run `safeoutputs --help` to see available tools\n- `serena` — run `serena --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/sergo' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.jsonl\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Historical Sergo Go analysis results, strategies, and tool snapshots' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/smoke-ci.lock.yml b/.github/workflows/smoke-ci.lock.yml index f40c673566c..b385293ef6e 100644 --- a/.github/workflows/smoke-ci.lock.yml +++ b/.github/workflows/smoke-ci.lock.yml @@ -389,7 +389,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: "- `github` — run `github --help` to see available tools\n- `safeoutputs` — run `safeoutputs --help` to see available tools" GH_AW_MEMORY_BRANCH_NAME: 'memory/smoke-ci' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 10240 bytes (10 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: ' Smoke CI persisted repo-memory entries' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/.github/workflows/workflow-health-manager.lock.yml b/.github/workflows/workflow-health-manager.lock.yml index 45bcfee9377..f266422b594 100644 --- a/.github/workflows/workflow-health-manager.lock.yml +++ b/.github/workflows/workflow-health-manager.lock.yml @@ -349,7 +349,7 @@ jobs: GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_MEMORY_BRANCH_NAME: 'memory/meta-orchestrators' - GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.md\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 51200 bytes (50 KB) total per push (max: 1024 KB)\n" + GH_AW_MEMORY_CONSTRAINTS: "\n\n**Constraints:**\n- **Allowed Files**: Only files matching patterns: *.json, *.md\n- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder deep are silently skipped when memory is pushed.\n- **Max File Size**: 102400 bytes (0.10 MB) per file\n- **Max File Count**: 100 files per commit\n- **Max Patch Size**: 51200 bytes (50 KB) total per push (max: 1024 KB)\n" GH_AW_MEMORY_DESCRIPTION: '' GH_AW_MEMORY_DIR: '/tmp/gh-aw/repo-memory/default/' GH_AW_MEMORY_TARGET_REPO: ' of the current repository' diff --git a/actions/setup/js/push_repo_memory.cjs b/actions/setup/js/push_repo_memory.cjs index 01e48ba7d94..03abbbc6d7c 100644 --- a/actions/setup/js/push_repo_memory.cjs +++ b/actions/setup/js/push_repo_memory.cjs @@ -399,7 +399,18 @@ async function main() { } if (filesToCopy.length === 0) { - core.info("No files to copy from artifact"); + if (filteredOutFiles.length > 0) { + // All files present in the artifact were rejected by the glob filter. Without a warning this + // looks like a successful no-op run, so memory silently stops being updated (see deep-report + // stale-memory incident). Surface the mismatch with the offending paths and patterns. + core.warning( + `repo-memory (${memoryId}): no files were pushed to branch ${branchName} — all ${filteredOutFiles.length} file(s) in the artifact were rejected by FILE_GLOB_FILTER "${fileGlobFilter}". ` + + `Rejected paths: ${filteredOutFiles.map(f => f.path).join(", ")}. ` + + `Patterns are matched against the path relative to the memory directory and must not include the branch name; slashless patterns such as "*.md" only match files one folder deep (e.g. "my-agent/notes.md").` + ); + } else { + core.info("No files to copy from artifact"); + } return; } diff --git a/actions/setup/js/push_repo_memory.test.cjs b/actions/setup/js/push_repo_memory.test.cjs index 7dfbd507cd9..85c87c3f73f 100644 --- a/actions/setup/js/push_repo_memory.test.cjs +++ b/actions/setup/js/push_repo_memory.test.cjs @@ -1774,3 +1774,31 @@ describe("push_repo_memory.cjs - API branch seeding for signed commits", () => { expect(splitIdx).toBeLessThan(checkoutIdx); }); }); + +describe("push_repo_memory.cjs - filtered-out files visibility", () => { + it("should warn (not silently succeed) when every file is rejected by the glob filter (source check)", () => { + const nodeFs = require("fs"); + const nodePath = require("path"); + const scriptPath = nodePath.join(import.meta.dirname, "push_repo_memory.cjs"); + const scriptContent = nodeFs.readFileSync(scriptPath, "utf8"); + + // The "no files to copy" branch must emit core.warning when files were filtered out, + // otherwise a glob/path mismatch looks like a successful no-op run. + expect(scriptContent).toContain("were rejected by FILE_GLOB_FILTER"); + const noFilesIdx = scriptContent.indexOf("if (filesToCopy.length === 0)"); + const warningIdx = scriptContent.indexOf("were rejected by FILE_GLOB_FILTER"); + expect(noFilesIdx).toBeGreaterThan(-1); + expect(warningIdx).toBeGreaterThan(noFilesIdx); + }); + + it("should only accept memory files one folder deep (deep-report layout regression)", () => { + const patterns = ["*.md", "*.json"].map(p => globPatternToRegex(p, { matchSubfolderRoot: true })); + + // Correct layout: /tmp/gh-aw/repo-memory/default/deep-report/ + expect(patterns.some(p => p.test("deep-report/last_analysis_timestamp.md"))).toBe(true); + expect(patterns.some(p => p.test("deep-report/processed-discussions.json"))).toBe(true); + + // Legacy layout that included the branch name – silently dropped + expect(patterns.some(p => p.test("memory/deep-report/last_analysis_timestamp.md"))).toBe(false); + }); +}); diff --git a/docs/src/content/docs/reference/repo-memory.md b/docs/src/content/docs/reference/repo-memory.md index f5e35c9468e..0363f4271b5 100644 --- a/docs/src/content/docs/reference/repo-memory.md +++ b/docs/src/content/docs/reference/repo-memory.md @@ -49,6 +49,8 @@ tools: Example: with the default filter `["*.json", "*.md"]`, the file `discussion-task-miner/processed-discussions.json` is persisted (depth 1 ✓), but `processed-discussions.json` (depth 0) and `discussion-task-miner/archive/old.json` (depth 2) are not. +Files that no pattern matches are skipped rather than failing the push. When *every* file in the memory artifact is skipped, the push step logs a warning listing the rejected paths so a glob or layout mismatch does not look like a successful no-op run. + ## Multiple Configurations ```aw wrap diff --git a/pkg/workflow/repo_memory_prompt.go b/pkg/workflow/repo_memory_prompt.go index 1497654cb94..f39e85e27b8 100644 --- a/pkg/workflow/repo_memory_prompt.go +++ b/pkg/workflow/repo_memory_prompt.go @@ -15,6 +15,22 @@ var repoMemoryPromptLog = logger.New("workflow:repo_memory_prompt") // ensuring the substitution step always has a value to substitute. const ghaEmptyStringExpr = "${{ '' }}" +// repoMemorySubfolderConstraint returns an extra constraint bullet explaining the depth +// requirement of slashless file globs (e.g. "*.md"). Those patterns are matched against the +// path relative to the memory directory and only match files inside exactly one subfolder, +// so files written at the memory root or nested deeper are silently dropped at push time. +// Returns an empty string when every pattern contains a "/" (explicit paths). +func repoMemorySubfolderConstraint(fileGlob []string) string { + for _, pattern := range fileGlob { + if !strings.Contains(pattern, "/") { + return "- **Required Layout**: Patterns without a `/` (e.g. `*.md`) only match files placed in exactly one subfolder " + + "of the memory folder (e.g. `my-topic/notes.md`). Files written at the memory root or nested more than one folder " + + "deep are silently skipped when memory is pushed.\n" + } + } + return "" +} + // buildRepoMemoryPromptSection builds a PromptSection for repo memory instructions. // Returns a PromptSection that references a template file with substitutions, or nil if no memory is configured. func buildRepoMemoryPromptSection(config *RepoMemoryConfig) *PromptSection { @@ -50,6 +66,7 @@ func buildRepoMemoryPromptSection(config *RepoMemoryConfig) *PromptSection { constraints.WriteString("\n\n**Constraints:**\n") if len(memory.FileGlob) > 0 { fmt.Fprintf(&constraints, "- **Allowed Files**: Only files matching patterns: %s\n", strings.Join(memory.FileGlob, ", ")) + constraints.WriteString(repoMemorySubfolderConstraint(memory.FileGlob)) } if memory.MaxFileSize > 0 { fmt.Fprintf(&constraints, "- **Max File Size**: %d bytes (%.2f MB) per file\n", memory.MaxFileSize, float64(memory.MaxFileSize)/1048576.0) diff --git a/pkg/workflow/repo_memory_template_test.go b/pkg/workflow/repo_memory_template_test.go index 528a159c218..2bea3e1444b 100644 --- a/pkg/workflow/repo_memory_template_test.go +++ b/pkg/workflow/repo_memory_template_test.go @@ -17,3 +17,33 @@ func TestRepoMemoryTemplate_DoesNotContainMarkdownHeader(t *testing.T) { templateContent := string(data) assert.NotContains(t, templateContent, "## Repo Memory Available", "template should not include a markdown header in section") } + +func TestRepoMemorySubfolderConstraint(t *testing.T) { + t.Run("slashless pattern adds required layout note", func(t *testing.T) { + assert.Contains(t, repoMemorySubfolderConstraint([]string{"*.md", "*.json"}), "**Required Layout**") + }) + + t.Run("patterns with explicit paths add no note", func(t *testing.T) { + assert.Empty(t, repoMemorySubfolderConstraint([]string{"metrics/**", "data/*.json"})) + }) + + t.Run("no glob adds no note", func(t *testing.T) { + assert.Empty(t, repoMemorySubfolderConstraint(nil)) + }) +} + +func TestRepoMemoryPromptConstraintsIncludeSubfolderRequirement(t *testing.T) { + config := &RepoMemoryConfig{ + Memories: []RepoMemoryEntry{ + { + ID: "default", + BranchName: "memory/deep-report", + FileGlob: []string{"*.md"}, + }, + }, + } + + section := buildRepoMemoryPromptSection(config) + require.NotNil(t, section) + assert.Contains(t, section.EnvVars["GH_AW_MEMORY_CONSTRAINTS"], "**Required Layout**") +}