{
  "rounds": [
    {
      "round": 0,
      "scope": "topology",
      "input": "V3 regular grid",
      "observed": [
        "Unconstrained point sampling does not enforce image lines",
        "Full-size analysis overallocates tiny accessory meshes"
      ],
      "decision": "PSLG alpha and Canny constraints per part; screen-size analysis cap",
      "evidence": [
        "artifacts/edge_v4/topology/contact.jpg"
      ],
      "output": "00_topology",
      "roi": "Shared deterministic compiler covers all 50 existing generated parts without new image calls"
    },
    {
      "round": 1,
      "scope": "motion",
      "input": "00_topology",
      "observed": [
        "49 character layers were single-bone rigid",
        "Tail chain has abrupt local distortion",
        "Raised forearm mesh and bind pivot differ"
      ],
      "decision": "11 flat-center brush fields on 9 hair/cloth parts; root pins; repair forearm pivot; try continuous tail sweep",
      "evidence": [
        "artifacts/edge_v4/candidate/frame010.png",
        "artifacts/edge_v4/candidate/frame020.png",
        "artifacts/edge_v4/candidate/frame060.png"
      ],
      "output": "01_brush_sweep",
      "roi": "Reuse assets and authored pose observations; target visible local bending first"
    },
    {
      "round": 2,
      "scope": "tail controller",
      "input": "01_brush_sweep",
      "observed": [
        "Cartesian temporal centerline interpolation produces up to 58 flipped triangles between keys",
        "Hair and cloth have no flips in the same audit"
      ],
      "decision": "Interpolate unwrapped tangent angles, fix arc length at 330px, smooth spatial directions and narrow tight bends with a curvature guard",
      "evidence": [
        "artifacts/edge_v4/01_brush_sweep-audit.json",
        "artifacts/edge_v4/refined_preview/frame015.png",
        "artifacts/edge_v4/02_refined-audit.json"
      ],
      "output": "02_refined",
      "roi": "Small mathematical controller change fixes a real intermediate-frame failure without texture changes or image fitting",
      "limits": [
        "Not a global self-intersection guarantee",
        "Curvature guard reduces width at tight bends",
        "Whole-body trajectory still uses V3 authored poses"
      ]
    },
    {
      "round": 3,
      "scope": "topology review and discrete sweep robustness",
      "input": "02_refined before review",
      "observed": [
        "Uniform contour padding can join close islands and fill small holes",
        "After retaining tiny holes, one finite mesh triangle at the tail root inverted at frames 98.25 through 99",
        "Higher tail density alone did not fix the hard width-clamp transition"
      ],
      "decision": [
        "Bound each alpha margin by neighbor distance and preserve a nonempty interior for every detected hole",
        "Use smooth curvature-width saturation rather than a hard clamp",
        "Retain denser tail sampling for curved motion"
      ],
      "evidence": [
        "tests/test_topology.py:test_margin_preserves_close_islands_and_small_holes",
        "tests/test_deform_v4.py:test_selected_tail_mesh_remains_oriented_at_last_turn",
        "artifacts/edge_v4/02_refined-audit.json"
      ],
      "output": "02_refined",
      "roi": "Small deterministic geometry fixes address actual test failures without changing textures or fitting reference pixels",
      "limits": [
        "Very small zero-area alpha noise is ignored at analysis resolution",
        "Curved tail width is reduced smoothly; volume is not preserved"
      ]
    }
  ]
}
