Skip to content

fix(ci): prevent duplicate pattern-validation issues #60

fix(ci): prevent duplicate pattern-validation issues

fix(ci): prevent duplicate pattern-validation issues #60

name: AI Development Patterns Validation
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
schedule:
# Run weekly to catch external link issues
- cron: '0 6 * * 1'
jobs:
pattern-compliance:
runs-on: ubuntu-latest
name: Pattern Specification Compliance
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install -r tests/requirements.txt
- name: Run pattern compliance tests
run: |
cd tests
python3 -m pytest test_pattern_compliance.py -v --tb=short
- name: Upload compliance test results
uses: actions/upload-artifact@v4
if: always()
with:
name: pattern-compliance-results
path: tests/test-results/
readme-accuracy:
runs-on: ubuntu-latest
name: README Accuracy & Consistency
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install -r tests/requirements.txt
- name: Update pattern count badge
run: |
python3 scripts/update-pattern-count.py
- name: Check for pattern count changes
run: |
if git diff --quiet README.md index.html; then
echo "✓ Pattern count badges are up to date"
else
echo "⚠️ Pattern count badges were updated"
git diff README.md index.html
# Fail the job if pattern count is wrong to remind developers to commit the change
echo "::error::Pattern count badges were out of date. Please run 'python3 scripts/update-pattern-count.py' and commit the changes."
exit 1
fi
- name: Run README accuracy tests
run: |
cd tests
python3 -m pytest test_readme_accuracy.py -v --tb=short
- name: Upload accuracy test results
uses: actions/upload-artifact@v4
if: always()
with:
name: readme-accuracy-results
path: tests/test-results/
link-validation:
runs-on: ubuntu-latest
name: Hyperlink Integrity
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install -r tests/requirements.txt
- name: Run link validation tests (fast)
run: |
cd tests
python3 -m pytest test_links.py -v --tb=short -m "not slow"
- name: Run external link tests (slow)
run: |
cd tests
python3 -m pytest test_links.py -v --tb=short -m "slow"
continue-on-error: true # External links may be temporarily unavailable
- name: Upload link validation results
uses: actions/upload-artifact@v4
if: always()
with:
name: link-validation-results
path: tests/test-results/
example-validation:
runs-on: ubuntu-latest
name: Example Code Validation
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install bash for script validation
run: |
sudo apt-get update
sudo apt-get install -y bash
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install -r tests/requirements.txt
- name: Run example validation tests
run: |
cd tests
python3 -m pytest test_examples.py -v --tb=short
- name: Upload example validation results
uses: actions/upload-artifact@v4
if: always()
with:
name: example-validation-results
path: tests/test-results/
dependency-validation:
runs-on: ubuntu-latest
name: Pattern Dependencies
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install -r tests/requirements.txt
- name: Run dependency validation tests
run: |
cd tests
python3 -m pytest test_dependencies.py -v --tb=short
- name: Upload dependency validation results
uses: actions/upload-artifact@v4
if: always()
with:
name: dependency-validation-results
path: tests/test-results/
diagram-validation:
runs-on: ubuntu-latest
name: Diagram Accuracy
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install -r tests/requirements.txt
- name: Run diagram validation tests
run: |
cd tests
python3 -m pytest test_diagram.py -v --tb=short
- name: Upload diagram validation results
uses: actions/upload-artifact@v4
if: always()
with:
name: diagram-validation-results
path: tests/test-results/
yaml-readme-sync:
runs-on: ubuntu-latest
name: YAML-README Sync
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install -r tests/requirements.txt
- name: Run YAML-README sync tests
run: |
cd tests
python3 -m pytest test_yaml_readme_sync.py -v --tb=short
- name: Upload sync test results
uses: actions/upload-artifact@v4
if: always()
with:
name: yaml-readme-sync-results
path: tests/test-results/
comprehensive-validation:
runs-on: ubuntu-latest
name: Full Test Suite
needs: [pattern-compliance, readme-accuracy, link-validation, example-validation, dependency-validation, diagram-validation, yaml-readme-sync]
if: always()
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install bash for script validation
run: |
sudo apt-get update
sudo apt-get install -y bash
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install -r tests/requirements.txt
- name: Run complete test suite
id: tests
continue-on-error: true
run: |
cd tests
python3 -m pytest -v --tb=short \
--html=report.html --self-contained-html \
--cov=utils --cov-report=html \
--json-report --json-report-file=.report.json
- name: Generate Claude Code fix prompt
if: steps.tests.outcome == 'failure'
run: |
echo "## Claude Code Fix Instructions" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Paste the prompt below into Claude Code to fix these failures:" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo '````' >> $GITHUB_STEP_SUMMARY
python3 scripts/generate-audit-prompt.py tests/.report.json >> $GITHUB_STEP_SUMMARY 2>/dev/null || true
echo '````' >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Or run locally: \`/xaudit\`" >> $GITHUB_STEP_SUMMARY
- name: Fail if tests failed
if: steps.tests.outcome == 'failure'
run: exit 1
- name: Upload comprehensive test report
uses: actions/upload-artifact@v4
if: always()
with:
name: comprehensive-test-report
path: |
tests/report.html
tests/htmlcov/
tests/test-results/
tests/.report.json
quality-gates:
runs-on: ubuntu-latest
name: Quality Gate Enforcement
needs: [comprehensive-validation]
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install -r tests/requirements.txt
- name: Run critical tests only (quality gates)
run: |
cd tests
# Run only critical tests that should block merges
python3 -m pytest test_pattern_compliance.py::TestPatternSpecCompliance::test_all_expected_patterns_exist -v
python3 -m pytest test_pattern_compliance.py::TestPatternSpecCompliance::test_pattern_header_structure -v
python3 -m pytest test_readme_accuracy.py::TestReadmeAccuracy::test_pattern_reference_table_matches_implementations -v
python3 -m pytest test_links.py::TestHyperlinkIntegrity::test_internal_anchor_links_valid -v
python3 -m pytest test_dependencies.py::TestPatternDependencies::test_no_circular_dependencies -v
- name: Check critical test results
run: |
echo "Quality gates passed - PR can be merged"
# Notification job for failed builds
notify-failure:
runs-on: ubuntu-latest
name: Notify on Failure
permissions:
issues: write
needs: [pattern-compliance, readme-accuracy, link-validation, example-validation, dependency-validation, diagram-validation, yaml-readme-sync]
if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: Create Issue on Failure (skip if duplicate)
uses: actions/github-script@v7
with:
script: |
const { data: existing } = await github.rest.issues.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
labels: 'pattern-validation',
state: 'open'
});
if (existing.length > 0) {
const issue = existing[0];
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: `Still failing on commit ${context.sha}.\n\n[View failed run](${context.payload.repository.html_url}/actions/runs/${context.runId})`
});
core.info(`Skipped duplicate — added comment to #${issue.number}`);
return;
}
const title = `Pattern Validation Failed - ${new Date().toISOString().split('T')[0]}`;
const body = `## Pattern Validation Failure
The automated pattern validation failed on the main branch.
**Build**: ${context.runId}
**Commit**: ${context.sha}
**Workflow**: ${context.workflow}
Please review the failed checks and fix any issues with:
- Pattern specification compliance
- README accuracy and consistency
- Hyperlink integrity
- Example code validation
- Pattern dependencies
- Diagram accuracy
[View failed workflow run](${context.payload.repository.html_url}/actions/runs/${context.runId})
`;
github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: title,
body: body,
labels: ['bug', 'automation', 'pattern-validation']
});
# Auto-close validation issues when all checks pass
close-resolved-issues:
runs-on: ubuntu-latest
name: Close Resolved Issues
permissions:
issues: write
needs: [pattern-compliance, readme-accuracy, link-validation, example-validation, dependency-validation, diagram-validation, yaml-readme-sync]
if: success() && github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: Close pattern-validation issues
uses: actions/github-script@v7
with:
script: |
const { data: issues } = await github.rest.issues.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
labels: 'pattern-validation',
state: 'open'
});
for (const issue of issues) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: `All pattern validation checks passed on commit ${context.sha}. Closing automatically.\n\n[View passing run](${context.payload.repository.html_url}/actions/runs/${context.runId})`
});
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
state: 'closed',
state_reason: 'completed'
});
}