Skip to content

Report format ​

shibbo check --format json prints one report per file (an array when there are several). The Node API returns the same object.

json
{
  "file": "README.md",
  "kind": "markdown",
  "words": 662,
  "score": 87,
  "band": "clean",
  "penalty": 4,
  "suppressed": 5,
  "findings": [
    {
      "id": "contrastive-negation",
      "name": "\"It's not X, it's Y\" / \"not just X, but Y\"",
      "severity": 3,
      "origin": "registry",
      "line": 12, "col": 5, "offset": 431,
      "match": "isn't a library, it's",
      "fix": "State the real claim. Keep a contrast only when someone holds the other view.",
      "counted": true
    }
  ],
  "judge": [{ "id": "triads", "question": "Are three-item lists used where one or two items would carry the point?" }]
}
FieldMeaning
score0 to 100; see Scoring
bandclean 80+, light 60+, moderate 40+, heavy 20+, saturated
penaltySum of the weights of counted hits
suppressedHits inside shibbo-ignore blocks, not scored
findings[].originregistry for curated rules, lexicon for measured phrases
findings[].countedfalse when a density rule stayed under its rate
findings[].model, ratioFor measured phrases: the model that over-uses it, and by how much
judgeQuestions to answer by reading, from tells no pattern can settle. For prose, the three from Say it clearly are always among them

Measurements from Graphite’s AI Tells (2026), CC BY 4.0. Code under MIT.