| 80 | }; |
| 81 | |
| 82 | function selectColdPathLenses(file) { |
| 83 | const config = health.readConfig(); |
| 84 | const verification = config.verification || {}; |
| 85 | const disabled = new Set(verification.disabled || []); |
| 86 | const ext = path.extname(file).toLowerCase(); |
| 87 | |
| 88 | const lenses = [...(DEFAULT_COLD_LENSES[ext] || [])]; |
| 89 | |
| 90 | // Skill files always get contractual lens |
| 91 | if (/^skills\/.*\.md$/.test(file) && !lenses.includes('contractual')) { |
| 92 | lenses.push('contractual'); |
| 93 | } |
| 94 | |
| 95 | // Always include custom rules for source files |
| 96 | if (/\.(ts|tsx|js|jsx|py|go|rs|css|scss)$/.test(file)) { |
| 97 | lenses.push('custom'); |
| 98 | } |
| 99 | |
| 100 | // Secrets sweep for source files. Deliberately excludes .md, since docs |
| 101 | // that describe token formats must never block. |
| 102 | if (/\.(ts|tsx|js|jsx|py|go|rs|css|scss)$/.test(file)) { |
| 103 | lenses.push('secrets'); |
| 104 | } |
| 105 | |
| 106 | return lenses.filter(l => !disabled.has(l)); |
| 107 | } |
| 108 | |
| 109 | function run() { |
| 110 | health.increment('quality-gate', 'count'); |