{
  "isError" : false,
  "request" : {
    "change" : "add-pure",
    "file" : "c.ek9",
    "line" : 11
  },
  "response" : {
    "afferent" : [ ],
    "anchor" : {
      "detail" : "E08130",
      "file" : "c.ek9",
      "fullyQualifiedName" : "purity.probe.c::pureCaller",
      "label" : "pureCaller()",
      "line" : 9,
      "verdict" : "root"
    },
    "availableChanges" : [ "remove-pure", "add-pure" ],
    "calleeNames" : [ "sideEffect()" ],
    "callerNames" : [ ],
    "change" : "add-pure",
    "changeKind" : "purity",
    "contract" : [ {
      "detail" : "contract root",
      "file" : "c.ek9",
      "fullyQualifiedName" : "purity.probe.c::pureCaller",
      "label" : "pureCaller()",
      "line" : 9,
      "verdict" : "root"
    } ],
    "efferent" : [ {
      "detail" : "non-pure callee — must become pure",
      "file" : "c.ek9",
      "fullyQualifiedName" : "purity.probe.c::sideEffect",
      "label" : "sideEffect()",
      "line" : 5,
      "verdict" : "fixable"
    } ],
    "meta" : {
      "serverMs" : "<timing>"
    },
    "note" : "Read-only preview. 'verdict' and the closures are the SAME the fix tool applies; drive the change with ek9_fix_purity_contract using the matching mode.",
    "status" : "ok",
    "summary" : {
      "afferent" : 0,
      "cascadeThreshold" : 25,
      "contract" : 1,
      "efferent" : 1
    },
    "verdict" : "ready"
  },
  "scenario" : "e08130_add_direction",
  "tool" : "query_purity_impact"
}
