From 4edc622af6b8c8a006599aba53c851d9a179fc4a Mon Sep 17 00:00:00 2001 From: rjmurillo-bot Date: Thu, 19 Feb 2026 17:21:11 -0800 Subject: [PATCH 1/3] fix(ci): add pass-through jobs for path-filtered required checks Branch protection blocks PR merges when required checks report SKIPPED instead of SUCCESS. This occurs when path filters exclude the real jobs. Add pass-through jobs with matching check names that emit SUCCESS when the path filter skips the real job. Affected checks: - Aggregate Results (ai-pr-quality-gate.yml) - Validate Spec Coverage (ai-spec-validation.yml) - Validate memory citations (memory-validation.yml) Fixes #1168 Co-Authored-By: Claude Opus 4.6 --- .github/workflows/ai-pr-quality-gate.yml | 10 ++++++++++ .github/workflows/ai-spec-validation.yml | 11 ++++++++++- .github/workflows/memory-validation.yml | 14 +++++--------- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ai-pr-quality-gate.yml b/.github/workflows/ai-pr-quality-gate.yml index 8076feee5..905512ed8 100644 --- a/.github/workflows/ai-pr-quality-gate.yml +++ b/.github/workflows/ai-pr-quality-gate.yml @@ -405,6 +405,16 @@ jobs: # Depends on all six agent review jobs explicitly (not matrix). # Downloads artifacts using pattern `review-*` to gather all agent verdicts. + # Pass-through job: emits SUCCESS for "Aggregate Results" required check + # when path filter skips the real aggregate job (issue #1168) + skip-aggregate: + name: Aggregate Results + runs-on: ubuntu-24.04-arm + needs: check-changes + if: always() && needs.check-changes.outputs.should-run != 'true' + steps: + - run: echo "No relevant changes detected, skipping quality gate" + aggregate: name: Aggregate Results # ADR-025: ARM runner for cost optimization (37.5% savings vs x64) diff --git a/.github/workflows/ai-spec-validation.yml b/.github/workflows/ai-spec-validation.yml index 1f79e5036..8094e1a7c 100644 --- a/.github/workflows/ai-spec-validation.yml +++ b/.github/workflows/ai-spec-validation.yml @@ -89,11 +89,20 @@ jobs: - 'build/**' - '.claude/skills/**' + # Pass-through job: emits SUCCESS for "Validate Spec Coverage" required check + # when path filter skips the real validation job (issue #1168) + skip-spec: + name: Validate Spec Coverage + runs-on: ubuntu-24.04-arm + needs: check-paths + if: needs.check-paths.outputs.has-code-changes != 'true' + steps: + - run: echo "No code changes detected, skipping spec validation" + validate-spec: name: Validate Spec Coverage needs: check-paths # Only run full validation when code paths are changed - # When skipped, required check is satisfied with SKIPPED conclusion if: needs.check-paths.outputs.has-code-changes == 'true' # ADR-025: ARM runner for cost optimization (37.5% savings vs x64) runs-on: ubuntu-24.04-arm diff --git a/.github/workflows/memory-validation.yml b/.github/workflows/memory-validation.yml index fff45ca0a..6d58ccab2 100644 --- a/.github/workflows/memory-validation.yml +++ b/.github/workflows/memory-validation.yml @@ -168,18 +168,14 @@ jobs: echo "::warning::Found ${{ steps.parse.outputs.stale }} memories with stale citations" # Currently non-blocking - change to 'exit 1' to make blocking + # Pass-through job: emits SUCCESS for "Validate memory citations" required check + # when path filter skips the real validation job (issue #1168). + # Name must match validate-memories job name for branch protection. skip-validation: - name: Skip validation (no changes) + name: Validate memory citations needs: check-paths if: needs.check-paths.outputs.memories-changed != 'true' && needs.check-paths.outputs.code-changed != 'true' runs-on: ubuntu-24.04-arm timeout-minutes: 1 steps: - - name: Checkout code - # Required for dorny/paths-filter pattern consistency - # See: .serena/memories/ci-infrastructure-dorny-paths-filter-checkout.md - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - - - name: Skip message - run: | - echo "No memory or code changes detected - skipping validation" + - run: echo "No memory or code changes detected, skipping validation" From d79bcb229fcf319e1a1ac25af82974ee46340228 Mon Sep 17 00:00:00 2001 From: rjmurillo-bot Date: Thu, 19 Feb 2026 18:12:47 -0800 Subject: [PATCH 2/3] fix(validation): strip markdown bold markers in PR description file matching The list item regex pattern captured leading `**` from bold-formatted filenames in list items (e.g. `- **file.yml**: description`). This caused false CRITICAL issues when the extracted `**file.yml` did not suffix-match the actual diff path `.github/workflows/file.yml`. Strip `*` characters in normalize_path so both the bold pattern and list item pattern produce clean filenames for matching. Co-Authored-By: Claude Opus 4.6 --- scripts/validation/pr_description.py | 1 + tests/test_validation_pr_description.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/scripts/validation/pr_description.py b/scripts/validation/pr_description.py index f3566addc..47c2ca5a3 100644 --- a/scripts/validation/pr_description.py +++ b/scripts/validation/pr_description.py @@ -118,6 +118,7 @@ def fetch_pr_data( def normalize_path(path: str) -> str: """Normalize a file path for comparison.""" path = path.strip() + path = path.strip("*") # strip markdown bold markers path = path.replace("\\", "/") if path.startswith("./"): path = path[2:] diff --git a/tests/test_validation_pr_description.py b/tests/test_validation_pr_description.py index 70cd2a30b..937add6ba 100644 --- a/tests/test_validation_pr_description.py +++ b/tests/test_validation_pr_description.py @@ -41,6 +41,12 @@ def test_no_change_for_clean_path(self) -> None: def test_combined_normalization(self) -> None: assert normalize_path(" .\\src\\bar.py ") == "src/bar.py" + def test_strips_markdown_bold_markers(self) -> None: + assert normalize_path("**foo.yml") == "foo.yml" + + def test_strips_surrounding_bold_markers(self) -> None: + assert normalize_path("**foo.yml**") == "foo.yml" + # --------------------------------------------------------------------------- # file_matches @@ -119,6 +125,12 @@ def test_multiple_patterns_combined(self) -> None: result = extract_mentioned_files(desc) assert len(result) == 3 + def test_bold_in_list_item_deduplicates(self) -> None: + """Bold filenames in list items should not produce duplicates with bold markers.""" + desc = "- **workflow.yml**: Added skip job" + result = extract_mentioned_files(desc) + assert result == ["workflow.yml"] + # --------------------------------------------------------------------------- # validate_pr_description From ccf1d4488f75839821c1800d03eab74727f795ba Mon Sep 17 00:00:00 2001 From: "rjmurillo[bot]" <250269933+rjmurillo-bot@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:50:45 -0800 Subject: [PATCH 3/3] chore: update session log with ending commit SHA Co-Authored-By: Claude Opus 4.6 --- .../episodes/episode-2026-02-25-session-1.json | 18 ++++++++++++++++++ .agents/sessions/2026-02-25-session-1.json | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 .agents/memory/episodes/episode-2026-02-25-session-1.json diff --git a/.agents/memory/episodes/episode-2026-02-25-session-1.json b/.agents/memory/episodes/episode-2026-02-25-session-1.json new file mode 100644 index 000000000..44a724192 --- /dev/null +++ b/.agents/memory/episodes/episode-2026-02-25-session-1.json @@ -0,0 +1,18 @@ +{ + "id": "episode-2026-02-25-session-1", + "session": "2026-02-25-session-1", + "timestamp": "2026-02-25T23:50:46.327226+00:00", + "outcome": "partial", + "task": "", + "decisions": [], + "events": [], + "metrics": { + "duration_minutes": 0, + "tool_calls": 0, + "errors": 0, + "recoveries": 0, + "commits": 3, + "files_changed": 0 + }, + "lessons": [] +} diff --git a/.agents/sessions/2026-02-25-session-1.json b/.agents/sessions/2026-02-25-session-1.json index 66df8bf3d..693eec634 100644 --- a/.agents/sessions/2026-02-25-session-1.json +++ b/.agents/sessions/2026-02-25-session-1.json @@ -130,7 +130,7 @@ "action": "Resolved test file keeping both test methods from each branch" } ], - "endingCommit": "pending", + "endingCommit": "b0f056b", "nextSteps": [ "Push to origin and enable auto-merge for PR #1207" ]