1616 - ' flamehaven_filesearch/**'
1717 workflow_dispatch :
1818
19+ env :
20+ # Metric Thresholds
21+ README_SCORE_THRESHOLD : ' 0.6'
22+ MAX_BROKEN_LINKS : ' 3'
23+ MAX_WARNINGS : ' 20'
24+ # Slop Detection Settings
25+ SLOP_DETECTION_ENABLED : ' true'
26+ MAX_SLOP_TERMS : ' 0' # Zero tolerance for hype terms
27+
1928jobs :
2029 validate-drift :
2130 runs-on : ubuntu-latest
@@ -25,122 +34,116 @@ jobs:
2534 - name : Checkout repository
2635 uses : actions/checkout@v4
2736 with :
28- fetch-depth : 0
37+ fetch-depth : 1 # Optimized: only need current state for file scanning
2938
3039 - name : Set up Python
31- uses : actions/setup-python@v4
40+ uses : actions/setup-python@v5
3241 with :
3342 python-version : ' 3.11'
3443 cache : ' pip'
3544
3645 - name : Install dependencies
3746 run : |
3847 python -m pip install --upgrade pip
39- # No external dependencies needed for drift validator
4048
4149 - name : Run document drift validation
50+ id : run_validation
4251 run : |
52+ set +e # Continue on error
4353 python tools/drift_validator.py \
4454 --project-root . \
4555 --report .audit/doc_drift_report.json
56+ exit_code=$?
57+ echo "validator_exit_code=$exit_code" >> $GITHUB_OUTPUT
58+
59+ if [ $exit_code -ne 0 ]; then
60+ echo "::warning::Drift validator exited with code $exit_code"
61+ fi
62+
63+ # Ensure report file exists
64+ if [ ! -f .audit/doc_drift_report.json ]; then
65+ echo "::error::Report file not generated"
66+ mkdir -p .audit
67+ echo '{"metrics":{"readme_score":0,"coherence_score":0,"errors":["Report generation failed"],"warnings":[]}}' > .audit/doc_drift_report.json
68+ fi
69+
70+ - name : Run Slop Detection (Sanity Enforcer)
71+ id : run_slop_check
72+ if : env.SLOP_DETECTION_ENABLED == 'true'
73+ run : |
74+ python tools/slop_detector.py \
75+ --project-root . \
76+ --input-report .audit/doc_drift_report.json \
77+ --output-report .audit/doc_drift_report.json
4678
4779 - name : Check documentation health
4880 id : check_health
4981 run : |
50- python << 'EOF'
51- import json
52- import sys
53-
54- # Read the report
55- with open('.audit/doc_drift_report.json', 'r') as f:
56- report = json.load(f)
57-
58- metrics = report['metrics']
59- readme_score = metrics['readme_score']
60- coherence_score = metrics['coherence_score']
61- errors = len(metrics['errors'])
62- warnings = len(metrics['warnings'])
63-
64- # Print metrics for display
65- print(f"::notice title=Documentation Metrics::README Score: {readme_score:.1%}")
66- print(f"::notice title=Documentation Metrics::Coherence Score: {coherence_score:.1%}")
67-
68- # Fail if thresholds not met
69- failed = False
70-
71- if readme_score < 0.6:
72- print(f"::error::README score {readme_score:.1%} below 60% threshold")
73- failed = True
74-
75- if errors > 3:
76- print(f"::error::Too many broken links ({errors} > 3)")
77- failed = True
78-
79- if warnings > 20:
80- print(f"::warning::Documentation has {warnings} warnings (threshold: 20)")
81-
82- # Set output for next steps
83- import os
84- with open(os.environ['GITHUB_OUTPUT'], 'a') as f:
85- f.write(f"readme_score={readme_score:.2%}\n")
86- f.write(f"coherence_score={coherence_score:.2%}\n")
87- f.write(f"failed={failed}\n")
88-
89- sys.exit(1 if failed else 0)
90- EOF
82+ python tools/report_health_checker.py \
83+ --report .audit/doc_drift_report.json \
84+ --readme-threshold ${{ env.README_SCORE_THRESHOLD }} \
85+ --max-broken-links ${{ env.MAX_BROKEN_LINKS }} \
86+ --max-warnings ${{ env.MAX_WARNINGS }} \
87+ --max-slop-errors ${{ env.MAX_SLOP_TERMS }} \
88+ --slop-severity error
9189
9290 - name : Upload report artifact
9391 if : always()
9492 uses : actions/upload-artifact@v4
9593 with :
96- name : doc-drift-report
94+ name : doc-drift-report-${{ github.run_number }}
9795 path : .audit/doc_drift_report.json
98- retention-days : 30
96+ retention-days : 90
97+
98+ - name : Generate summary
99+ if : always()
100+ run : |
101+ python tools/report_summary_generator.py \
102+ --report .audit/doc_drift_report.json \
103+ --output-format step-summary
104+
105+ - name : Generate PR comment body
106+ if : github.event_name == 'pull_request' && always()
107+ run : |
108+ python tools/report_summary_generator.py \
109+ --report .audit/doc_drift_report.json \
110+ --output-format pr-comment \
111+ --output .audit/pr_comment.md
99112
100113 - name : Comment PR with report
101114 if : github.event_name == 'pull_request' && always()
102- uses : actions/github-script@v6
115+ uses : actions/github-script@v7
103116 with :
104117 script : |
105118 const fs = require('fs');
106- const report = JSON.parse(fs.readFileSync('.audit/doc_drift_report.json', 'utf8'));
107- const metrics = report.metrics;
108-
109- const body = `## Documentation Drift Validation
110119
111- **Metrics:**
112- - README Score: \`${(metrics.readme_score * 100).toFixed(1)}%\`
113- - Coherence Score: \`${(metrics.coherence_score * 100).toFixed(1)}%\`
114- - Broken Links: \`${metrics.errors.length}\`
115- - Warnings: \`${metrics.warnings.length}\`
120+ try {
121+ const body = fs.readFileSync('.audit/pr_comment.md', 'utf8');
116122
117- **Thresholds:**
118- - README Score: \`≥ 60%\`
119- - Broken Links: \`≤ 3\`
120- - Warnings: \`≤ 20\`
121-
122- ${ metrics.errors.length > 0 ? `\n**Errors:**\n${metrics.errors.map(e => `- ${e}`).join('\n')}` : '' }
123- `;
124-
125- github.rest.issues.createComment({
126- issue_number: context.issue.number,
127- owner: context.repo.owner,
128- repo: context.repo.repo,
129- body: body
130- });
123+ await github.rest.issues.createComment({
124+ issue_number: context.issue.number,
125+ owner: context.repo.owner,
126+ repo: context.repo.repo,
127+ body: body
128+ });
129+ } catch (error) {
130+ console.error('Failed to post PR comment:', error);
131+ core.warning('Could not post PR comment');
132+ }
131133
132134 summary :
133135 runs-on : ubuntu-latest
134- name : Documentation Validation Summary
136+ name : Validation Summary
135137 if : always()
136138 needs : validate-drift
137139
138140 steps :
139141 - name : Check validation results
140142 run : |
141- if [ "${{ needs.validate-drift.result }}" = "failure" ]; then
142- echo "::error::Document drift validation failed"
143+ result="${{ needs.validate-drift.result }}"
144+ if [ "$result" = "failure" ]; then
145+ echo "::error::Validation failed"
143146 exit 1
144147 else
145- echo "::notice::Document drift validation passed"
146- fi
148+ echo "::notice::✅ Validation passed"
149+ fi
0 commit comments