{
  "id": "d06-v1",
  "algorithmVersion": "v2",
  "measuredOn": "2026-10-13",
  "sourceCommit": "fed1a93f0d9a3cde5ac4f2ead2d670ea5cc95eaf",
  "size": 8,
  "requestedDifficulty": "medium",
  "clueCount": 36,
  "blankCount": 28,
  "sourceRevision": "fed1a93f0d9a3cde5ac4f2ead2d670ea5cc95eaf",
  "symbols": {
    "0": "given zero",
    "1": "given one",
    "_": "blank"
  },
  "method": {
    "generation": "generatePuzzle({ size: 8, difficulty: \"medium\", seed }) using the v2 generator at the recorded source revision.",
    "measurement": "Repeatedly call getPuzzleHint, fill exactly its returned cell, and repeat until all 28 blanks are filled. The trace records one cell assignment per step, not a minimum human solution path or a solve-time estimate.",
    "rulePriority": [
      "no-three",
      "balance",
      "line-candidates",
      "uniqueness",
      "contradiction"
    ],
    "scanOrder": "Within each rule: rows before columns, then ascending line and cell positions. Restart the rule priority after each assignment.",
    "uniquenessVerification": "Independent exhaustive row enumeration in tests/difficulty-examples.test.ts, without the production solver or valid-line catalog. Every row has four zeros, four ones, and no triples; search checks row uniqueness, column balance, column triples and column uniqueness, stopping if a second completion is found.",
    "selectionLimit": "Two selected examples illustrate different measured rule profiles. They do not estimate the prevalence of these profiles or compare human solve times."
  },
  "sharedSolutionRows": [
    "01011010",
    "00101101",
    "10010110",
    "01001011",
    "10100101",
    "11010010",
    "01101001",
    "10110100"
  ],
  "examples": [
    {
      "label": "Board A",
      "seed": "d06-2026-10-13-0",
      "rows": [
        "010_1_1_",
        "_0_011__",
        "100_0___",
        "010_1011",
        "1_1001_1",
        "___1001_",
        "_1_01__1",
        "___1___0"
      ],
      "steps": {
        "no-three": 13,
        "balance": 14,
        "line-candidates": 1
      },
      "hardestRule": "line-candidates",
      "advancedMove": {
        "step": 21,
        "row": 6,
        "column": 1,
        "value": 1,
        "rule": "line-candidates",
        "beforeRows": [
          "01011010",
          "00101101",
          "10010110",
          "01001011",
          "10100101",
          "___10010",
          "_1_01001",
          "___10100"
        ],
        "lineCandidates": [
          "10110010",
          "11010010"
        ]
      },
      "uniqueSolutionCount": 1,
      "logicSolved": true,
      "trace": [
        {
          "step": 1,
          "row": 1,
          "column": 6,
          "value": 0,
          "rule": "no-three",
          "explanation": "Row 1 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 2,
          "row": 2,
          "column": 3,
          "value": 1,
          "rule": "no-three",
          "explanation": "Row 2 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 3,
          "row": 2,
          "column": 7,
          "value": 0,
          "rule": "no-three",
          "explanation": "Row 2 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 4,
          "row": 3,
          "column": 4,
          "value": 1,
          "rule": "no-three",
          "explanation": "Row 3 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 5,
          "row": 5,
          "column": 2,
          "value": 0,
          "rule": "no-three",
          "explanation": "Row 5 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 6,
          "row": 5,
          "column": 7,
          "value": 0,
          "rule": "no-three",
          "explanation": "Row 5 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 7,
          "row": 3,
          "column": 8,
          "value": 0,
          "rule": "no-three",
          "explanation": "Column 8 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 8,
          "row": 6,
          "column": 8,
          "value": 0,
          "rule": "no-three",
          "explanation": "Column 8 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 9,
          "row": 3,
          "column": 6,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 3 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 10,
          "row": 3,
          "column": 7,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 3 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 11,
          "row": 4,
          "column": 4,
          "value": 0,
          "rule": "balance",
          "explanation": "Row 4 already contains all ones it can use. Every remaining cell must be 0."
        },
        {
          "step": 12,
          "row": 1,
          "column": 4,
          "value": 1,
          "rule": "balance",
          "explanation": "Column 4 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 13,
          "row": 1,
          "column": 8,
          "value": 0,
          "rule": "balance",
          "explanation": "Row 1 already contains all ones it can use. Every remaining cell must be 0."
        },
        {
          "step": 14,
          "row": 2,
          "column": 8,
          "value": 1,
          "rule": "no-three",
          "explanation": "Column 8 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 15,
          "row": 2,
          "column": 1,
          "value": 0,
          "rule": "balance",
          "explanation": "Row 2 already contains all ones it can use. Every remaining cell must be 0."
        },
        {
          "step": 16,
          "row": 8,
          "column": 5,
          "value": 0,
          "rule": "balance",
          "explanation": "Column 5 already contains all ones it can use. Every remaining cell must be 0."
        },
        {
          "step": 17,
          "row": 7,
          "column": 7,
          "value": 0,
          "rule": "balance",
          "explanation": "Column 7 already contains all ones it can use. Every remaining cell must be 0."
        },
        {
          "step": 18,
          "row": 8,
          "column": 7,
          "value": 0,
          "rule": "balance",
          "explanation": "Column 7 already contains all ones it can use. Every remaining cell must be 0."
        },
        {
          "step": 19,
          "row": 8,
          "column": 6,
          "value": 1,
          "rule": "no-three",
          "explanation": "Row 8 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 20,
          "row": 7,
          "column": 6,
          "value": 0,
          "rule": "balance",
          "explanation": "Column 6 already contains all ones it can use. Every remaining cell must be 0."
        },
        {
          "step": 21,
          "row": 6,
          "column": 1,
          "value": 1,
          "rule": "line-candidates",
          "explanation": "After applying the balance and no-three rules to Row 6, every valid pattern places 1 in this cell."
        },
        {
          "step": 22,
          "row": 7,
          "column": 1,
          "value": 0,
          "rule": "no-three",
          "explanation": "Column 1 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 23,
          "row": 7,
          "column": 3,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 7 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 24,
          "row": 6,
          "column": 3,
          "value": 0,
          "rule": "no-three",
          "explanation": "Column 3 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 25,
          "row": 6,
          "column": 2,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 6 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 26,
          "row": 8,
          "column": 2,
          "value": 0,
          "rule": "no-three",
          "explanation": "Column 2 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 27,
          "row": 8,
          "column": 1,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 8 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 28,
          "row": 8,
          "column": 3,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 8 already contains all zeros it can use. Every remaining cell must be 1."
        }
      ]
    },
    {
      "label": "Board B",
      "seed": "d06-2026-10-13-8",
      "rows": [
        "0_0___10",
        "_010_101",
        "100_0__0",
        "0_0_10_1",
        "__1001_1",
        "_101_0__",
        "0__0__0_",
        "1__1_10_"
      ],
      "steps": {
        "no-three": 12,
        "balance": 15,
        "uniqueness": 1
      },
      "hardestRule": "uniqueness",
      "advancedMove": {
        "step": 25,
        "row": 2,
        "column": 1,
        "value": 0,
        "rule": "uniqueness",
        "beforeRows": [
          "01011010",
          "_010_101",
          "10010110",
          "01001011",
          "10100101",
          "_101_010",
          "01101001",
          "10110100"
        ],
        "lineCandidates": [
          "00101101",
          "10100101"
        ],
        "excludedDuplicateRow": 5
      },
      "uniqueSolutionCount": 1,
      "logicSolved": true,
      "trace": [
        {
          "step": 1,
          "row": 1,
          "column": 2,
          "value": 1,
          "rule": "no-three",
          "explanation": "Row 1 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 2,
          "row": 3,
          "column": 4,
          "value": 1,
          "rule": "no-three",
          "explanation": "Row 3 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 3,
          "row": 4,
          "column": 2,
          "value": 1,
          "rule": "no-three",
          "explanation": "Row 4 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 4,
          "row": 5,
          "column": 7,
          "value": 0,
          "rule": "no-three",
          "explanation": "Row 5 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 5,
          "row": 8,
          "column": 5,
          "value": 0,
          "rule": "no-three",
          "explanation": "Row 8 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 6,
          "row": 5,
          "column": 2,
          "value": 0,
          "rule": "no-three",
          "explanation": "Column 2 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 7,
          "row": 6,
          "column": 7,
          "value": 1,
          "rule": "no-three",
          "explanation": "Column 7 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 8,
          "row": 6,
          "column": 8,
          "value": 0,
          "rule": "no-three",
          "explanation": "Column 8 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 9,
          "row": 3,
          "column": 6,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 3 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 10,
          "row": 1,
          "column": 6,
          "value": 0,
          "rule": "no-three",
          "explanation": "Column 6 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 11,
          "row": 1,
          "column": 4,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 1 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 12,
          "row": 1,
          "column": 5,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 1 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 13,
          "row": 3,
          "column": 7,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 3 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 14,
          "row": 5,
          "column": 1,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 5 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 15,
          "row": 7,
          "column": 3,
          "value": 1,
          "rule": "balance",
          "explanation": "Column 3 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 16,
          "row": 8,
          "column": 3,
          "value": 1,
          "rule": "balance",
          "explanation": "Column 3 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 17,
          "row": 8,
          "column": 2,
          "value": 0,
          "rule": "no-three",
          "explanation": "Row 8 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 18,
          "row": 8,
          "column": 8,
          "value": 0,
          "rule": "balance",
          "explanation": "Row 8 already contains all ones it can use. Every remaining cell must be 0."
        },
        {
          "step": 19,
          "row": 7,
          "column": 8,
          "value": 1,
          "rule": "no-three",
          "explanation": "Column 8 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 20,
          "row": 7,
          "column": 2,
          "value": 1,
          "rule": "balance",
          "explanation": "Column 2 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 21,
          "row": 4,
          "column": 4,
          "value": 0,
          "rule": "balance",
          "explanation": "Column 4 already contains all ones it can use. Every remaining cell must be 0."
        },
        {
          "step": 22,
          "row": 4,
          "column": 7,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 4 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 23,
          "row": 7,
          "column": 6,
          "value": 0,
          "rule": "balance",
          "explanation": "Column 6 already contains all ones it can use. Every remaining cell must be 0."
        },
        {
          "step": 24,
          "row": 7,
          "column": 5,
          "value": 1,
          "rule": "no-three",
          "explanation": "Row 7 already has two matching values in this three-cell window, so the open cell must be the opposite value."
        },
        {
          "step": 25,
          "row": 2,
          "column": 1,
          "value": 0,
          "rule": "uniqueness",
          "explanation": "Row 2 cannot copy a completed line. Every remaining valid pattern places 0 here."
        },
        {
          "step": 26,
          "row": 2,
          "column": 5,
          "value": 1,
          "rule": "balance",
          "explanation": "Row 2 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 27,
          "row": 6,
          "column": 1,
          "value": 1,
          "rule": "balance",
          "explanation": "Column 1 already contains all zeros it can use. Every remaining cell must be 1."
        },
        {
          "step": 28,
          "row": 6,
          "column": 5,
          "value": 0,
          "rule": "balance",
          "explanation": "Row 6 already contains all ones it can use. Every remaining cell must be 0."
        }
      ]
    }
  ]
}
