vigiles 14.9.0 → 14.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -229,13 +229,25 @@ function buildSentence(input, pointsToNextGrade, fixesToNextGrade) {
229
229
  if (score.empty) {
230
230
  return "No loadable harness surface — nothing to grade yet.";
231
231
  }
232
- // Already an A: nothing is blocking the grade.
232
+ // Already an A: nothing is BLOCKING the grade — but "A" is not "flawless". Only
233
+ // claim "clean" at a real 100 (zero graded deductions); when graded findings
234
+ // pulled the score below 100, name them so the verdict never contradicts a
235
+ // finding the report shows (the superpowers "92 but structurally clean" bug).
233
236
  if (pointsToNextGrade === null) {
234
- if (recommendations.length === 0) {
235
- return "A — nothing blocking; the harness is structurally clean.";
237
+ if (score.overall === 100) {
238
+ return "A — clean. Nothing blocking, nothing flagged.";
236
239
  }
237
- const n = recommendations.length;
238
- return `A — nothing blocking the grade; ${numberWord(n)} deterministic ${fixNoun(n)} would harden it further.`;
240
+ if (recommendations.length > 0) {
241
+ const n = recommendations.length;
242
+ return `A — nothing blocks the grade; ${numberWord(n)} deterministic ${fixNoun(n)} would harden it further.`;
243
+ }
244
+ // Graded findings, but no auto-fix maps to them — name the dominant one so an
245
+ // A never reads as flawless while the report shows a real finding.
246
+ const dom = dominantDeduction(report);
247
+ if (dom !== null) {
248
+ return `A — nothing blocks the grade, but ${String(dom.n)} ${pluralizeLabel(dom.n, dom.label)} ${dom.n === 1 ? "is" : "are"} flagged — worth fixing.`;
249
+ }
250
+ return "A — nothing blocks the grade.";
239
251
  }
240
252
  // The next band's grade is gradeFor(its FLOOR); the floor is base + the gap.
241
253
  const nextGrade = (0, score_core_js_1.gradeFor)(score.overall + pointsToNextGrade);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vigiles",
3
- "version": "14.9.0",
3
+ "version": "14.10.1",
4
4
  "description": "Lint & test the harness your AI agent runs on — verify the references in your CLAUDE.md / AGENTS.md and test that your hooks and skills actually work.",
5
5
  "keywords": [
6
6
  "claude-code",