{
  "reviewDate": "2026-10-30",
  "status": "passed",
  "total": 91,
  "passed": 91,
  "failed": 0,
  "limits": "Shared/perimeter6m route geometry only. Perimeter alone does not establish building-side access.9m turning,45t capacity,overhead,levels and full CFO approval are unverified. No podium.",
  "cases": [
    {
      "name": "Height gap at 14.999",
      "expected": 6,
      "actual": 6,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 15",
      "expected": 6,
      "actual": 6,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 17.5",
      "expected": 6,
      "actual": 6,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 18",
      "expected": 6,
      "actual": 6,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 18.001",
      "expected": 7,
      "actual": 7,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 21",
      "expected": 7,
      "actual": 7,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 21.001",
      "expected": 8,
      "actual": 8,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 24",
      "expected": 8,
      "actual": 8,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 24.001",
      "expected": 9,
      "actual": 9,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 27",
      "expected": 9,
      "actual": 9,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 27.001",
      "expected": 10,
      "actual": 10,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 30",
      "expected": 10,
      "actual": 10,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 30.001",
      "expected": 11,
      "actual": 11,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 33",
      "expected": 11,
      "actual": 11,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 33.001",
      "expected": 12,
      "actual": 12,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 36",
      "expected": 12,
      "actual": 12,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 36.001",
      "expected": 13,
      "actual": 13,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 39",
      "expected": 13,
      "actual": 13,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 39.001",
      "expected": 14,
      "actual": 14,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 42",
      "expected": 14,
      "actual": 14,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 42.001",
      "expected": 15,
      "actual": 15,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 45",
      "expected": 15,
      "actual": 15,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 45.001",
      "expected": 16,
      "actual": 16,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 48",
      "expected": 16,
      "actual": 16,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 51",
      "expected": 16,
      "actual": 16,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Height gap at 100",
      "expected": 16,
      "actual": 16,
      "source": "UP§3.2.4.3pp52–53;max(6,table,6+ceil((H−18)/3)capped16);conflict flagged",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Shortest rectangular gap",
      "expected": 20,
      "actual": 20,
      "source": "Centres30m apart minus5+5half-widths",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Rotated90degree footprint gap",
      "expected": 10,
      "actual": 10,
      "source": "Projected widths20m;30−10−10=10",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Rotated45degree parallel gap",
      "expected": 20,
      "actual": 19.999999999999996,
      "source": "Local-x translation30m minus10m width",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Touching rectangles gap zero",
      "expected": 0,
      "actual": 0,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Overlapping rectangles gap zero",
      "expected": 0,
      "actual": 0,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Union of two overlapped squares",
      "expected": 150,
      "actual": 150,
      "source": "100+100−50",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Union of four identical squares",
      "expected": 100,
      "actual": 100,
      "source": "Inclusion-exclusion avoids double-counting",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Taller block controls required gap",
      "expected": 9,
      "actual": 9,
      "source": "maxheight25m;prose9m,table7m;larger flagged scenario",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Raising one block increases required gap",
      "expected": 15,
      "actual": 15,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Actual distance threshold 8.999",
      "expected": false,
      "actual": false,
      "source": "Required9m;distance=centre separation−10m",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Actual distance threshold 9",
      "expected": true,
      "actual": true,
      "source": "Required9m;distance=centre separation−10m",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Actual distance threshold 9.001",
      "expected": true,
      "actual": true,
      "source": "Required9m;distance=centre separation−10m",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Plot setback also grows with taller neighbour",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Shared plot FAR is not multiplied by block count",
      "expected": [
        16000,
        15000,
        true
      ],
      "actual": [
        16000,
        15000,
        true
      ],
      "source": "Two40×40plates×5floors=16000;plot10000×1.5=15000",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "High-rise fire trigger 14.999",
      "expected": false,
      "actual": false,
      "source": "NBCPart4§1.2high-rise/Part2height15m;flat-site model basis",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "High-rise fire trigger 15",
      "expected": true,
      "actual": true,
      "source": "NBCPart4§1.2high-rise/Part2height15m;flat-site model basis",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "High-rise fire trigger 15.001",
      "expected": true,
      "actual": true,
      "source": "NBCPart4§1.2high-rise/Part2height15m;flat-site model basis",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Education/health9m trigger primary 8.999",
      "expected": false,
      "actual": false,
      "source": "NBCPart4§1.2(b)(2)–(3),PDFp262",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Education/health9m trigger primary 9",
      "expected": true,
      "actual": true,
      "source": "NBCPart4§1.2(b)(2)–(3),PDFp262",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Education/health9m trigger clinic 8.999",
      "expected": false,
      "actual": false,
      "source": "NBCPart4§1.2(b)(2)–(3),PDFp262",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Education/health9m trigger clinic 9",
      "expected": true,
      "actual": true,
      "source": "NBCPart4§1.2(b)(2)–(3),PDFp262",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Special-occupancy one-floor500m²boundary 499.999",
      "expected": false,
      "actual": false,
      "source": "NBCPart4§1.2(b)(1):more than500m²on any floor,not gross sum",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Special-occupancy one-floor500m²boundary 500",
      "expected": false,
      "actual": false,
      "source": "NBCPart4§1.2(b)(1):more than500m²on any floor,not gross sum",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Special-occupancy one-floor500m²boundary 500.001",
      "expected": true,
      "actual": true,
      "source": "NBCPart4§1.2(b)(1):more than500m²on any floor,not gross sum",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Gross600m²alone does not trigger500m²floor rule",
      "expected": false,
      "actual": false,
      "source": "Two300m²floors;neither floor exceeds500m²",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Assembly triggers even below9m/500m²",
      "expected": true,
      "actual": true,
      "source": "NBCPart4§1.2(b)(4):all assembly buildings",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Fire strip geometric area",
      "expected": 504,
      "actual": 504,
      "source": "(20+12)×(10+12)−20×10=504",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Fire strip outside plot detected",
      "expected": 24,
      "actual": 24,
      "source": "1m outside at left×24m expanded depth",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Park in setback may still obstruct fire strip",
      "expected": 144,
      "actual": 144,
      "source": "Park startsx60;blockBendsx60;6×24=144m²fire strip obstructed",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Neighbouring clear fire strips may be shared",
      "expected": false,
      "actual": false,
      "source": "6m gap is one shared clear lane,not two separately charged lanes",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Automatic entry crossing another building is rejected",
      "expected": true,
      "actual": true,
      "source": "Straight6m connector to rear high-rise crosses front low-rise",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Fire review never implies checked turning/load approval",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Generated1building layout satisfies encoded geometry",
      "expected": true,
      "actual": true,
      "source": "Shared baseFAR3.5×12000=42000;gap/fire/park/plot checks run",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Generated2building layout satisfies encoded geometry",
      "expected": true,
      "actual": true,
      "source": "Shared baseFAR3.5×12000=42000;gap/fire/park/plot checks run",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Generated4building layout satisfies encoded geometry",
      "expected": true,
      "actual": true,
      "source": "Shared baseFAR3.5×12000=42000;gap/fire/park/plot checks run",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Layout generation preserves input and fixed site facts",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Independent heights survive rearrangement",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Linked edits preserve separate positions",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Plotted house does not silently acquire multiple blocks",
      "expected": false,
      "actual": false,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Unsupported three-building model rejected",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Corrupt/duplicate building identifiers rejected",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Infeasible narrow layout does not force massing",
      "expected": false,
      "actual": false,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Layout JSON round trip preserves measured area",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Single-building fit cannot ignore a fire-space failure",
      "expected": true,
      "actual": true,
      "source": "Clear ring crosses plot boundary; locked dimensions cannot claim a valid fit",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Partial ground floor fire strip uses measured footprint",
      "expected": true,
      "actual": true,
      "source": "Single quarter-area plate=10x10m; 6m offset=22x22=484m2",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Scaled footprints pack at one12m gap, not two margins",
      "expected": [
        12,
        12
      ],
      "actual": [
        12,
        12
      ],
      "source": "UP section3.2.4.3 Note2 p53: one higher-block gap; final footprints, not unscaled grid cells",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Four scaled blocks have one gap at each facing grid pair",
      "expected": 4,
      "actual": 4,
      "source": "2x2 grid: four orthogonal facing pairs share one required distance; diagonal gaps larger",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Perimeter route reserves one site ring",
      "expected": 2256,
      "actual": 2256,
      "source": "100x100 plot minus88x88 interior=2256m2;6m inward reservation",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Perimeter road never claims complete building access",
      "expected": true,
      "actual": true,
      "source": "NBC Part3 section4.6(c) p123 retains building-side access; no duplicated automatic building loops in perimeter drawing",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Park obstructing shared perimeter road is detected",
      "expected": 120,
      "actual": 119.99999999999994,
      "source": "6m x20m park intersection with left perimeter route",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Too narrow plot cannot contain perimeter route",
      "expected": false,
      "actual": false,
      "source": "6m inward offsets leave empty inner polygon",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Perimeter scenario generates1blocks with clear route",
      "expected": true,
      "actual": true,
      "source": "Checked plot/park/building intrusion; side-access/turning approval still review",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Perimeter scenario generates2blocks with clear route",
      "expected": true,
      "actual": true,
      "source": "Checked plot/park/building intrusion; side-access/turning approval still review",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Perimeter scenario generates4blocks with clear route",
      "expected": true,
      "actual": true,
      "source": "Checked plot/park/building intrusion; side-access/turning approval still review",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Plot editing scales actual polygon area",
      "expected": 20000,
      "actual": 20000,
      "source": "Scale x2; original10000m2 becomes20000m2",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Custom polygon direct edit preserves convex shape and area ratio",
      "expected": true,
      "actual": true,
      "source": "Horizontal x2 and vertical x0.5 preserve area, vertex order and convexity",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Direct plot editing preserves road and approval facts",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Resizing rotated footprint preserves anchored opposite corner",
      "expected": true,
      "actual": true,
      "source": "Opposite corner remains fixed under local rotated width/depth resize",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Linked footprint resize preserves other building position",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Unlinked direct editing changes only selected footprint",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Negative plot edit rejected",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Over-range building edit rejected",
      "expected": true,
      "actual": true,
      "source": "Independent geometry / stated model invariant",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Directly edited plot regenerates same building count",
      "expected": true,
      "actual": true,
      "source": "120x140x3.5=58800 counted area; one shared entitlement after user site edit",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "One-floor partial plate shows its measured size",
      "expected": [
        10,
        10
      ],
      "actual": [
        10,
        10
      ],
      "source": "20x20 nominal plate at25percent area has10x10 measured footprint",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    },
    {
      "name": "Direct edit of partial ground plate preserves physical anchor",
      "expected": true,
      "actual": true,
      "source": "Physical opposite corner remains fixed; new measured footprint12x14=168m2",
      "tolerance": 0.000001,
      "status": "pass",
      "error": ""
    }
  ]
}