verify-negative-estate-whitelist-plan.mjs 2.6 KB

12345678
  1. import assert from 'node:assert/strict'
  2. import {readFileSync,writeFileSync} from 'node:fs'
  3. import {createHash} from 'node:crypto'
  4. const dir='.scratch/cockpit-shell-panel-layout/verify/artifacts/t35/negative-estate-pilot/',pilot=JSON.parse(readFileSync(dir+'seated-whitelist-plan.json')),parent=JSON.parse(readFileSync('tools/city-massing/city/cad-bim/seated-plan.json')),cfg=JSON.parse(readFileSync('public/cockpit/config.json')),ids=pilot.buildings.map(b=>b.id)
  5. assert.deepEqual(ids,['cad-25612','cad-25467','cad-25968','cad-25957']);assert.equal(new Set(ids).size,4);assert.equal(pilot.parentPlanSha256,createHash('sha256').update(readFileSync('tools/city-massing/city/cad-bim/seated-plan.json')).digest('hex'));assert.equal(pilot.modelChanged,false);assert.equal(pilot.buildings.length,4);assert.ok(pilot.buildings.every(b=>b.acceptedPilotWhitelist&&b.tier==='rural'&&Number.isFinite(b.heightM)&&b.terrainRelief<=3.2));assert.equal(pilot.samples.length,pilot.buildings.reduce((s,b)=>s+b.sampleIndices.length,0));assert.ok(pilot.caps.maxRegions===1&&pilot.caps.maxContents===8&&pilot.caps.maxDecodedBytes===32*1024*1024);assert.equal(cfg.map.tilesets[0].regionManifest,'/gis/cad-bim/city-regions-v7/manifest.json');assert.equal(parent.buildings.length,48425)
  6. function cell(row,grid){const xs=pilot.buildings.map(b=>b.positionENU[0]),ys=pilot.buildings.map(b=>b.positionENU[1]),minX=Math.min(...xs),maxX=Math.max(...xs),minY=Math.min(...ys),maxY=Math.max(...ys),spanX=Math.max(maxX-minX,1e-6),spanY=Math.max(maxY-minY,1e-6);const cells=new Map();for(const b of pilot.buildings){const ix=Math.min(grid-1,Math.floor((b.positionENU[0]-minX)/spanX*grid)),iy=Math.min(grid-1,Math.floor((b.positionENU[1]-minY)/spanY*grid)),key=`cell-${iy.toString().padStart(2,'0')}-${ix.toString().padStart(2,'0')}`;cells.set(key,(cells.get(key)||[]).concat(b.id))}return{grid,cells:[...cells].map(([id,buildingIds])=>({id,buildingIds}))}}
  7. const partitions=[cell(pilot,2),cell(pilot,4)];assert.ok(partitions.every(p=>p.cells.length>=2));const recommendation={blenderArgs:{plan:'seated-whitelist-plan.json',output:'generated/negative-estate-pilot-v1',grid:2,coarseGrid:0,limit:4,nearArchitecture:true,roofTextures:'provided only after whitelist texture review'},partitions,caps:pilot.caps,doNotRun:true,reason:'project forbids automatic build/debug in current round'}
  8. writeFileSync(dir+'export-recommendation.json',JSON.stringify(recommendation,null,2));console.log(JSON.stringify({passed:true,ids,cellsByGrid:partitions.map(p=>p.cells.length),parentBuildings:parent.buildings.length,globalRegionManifest:cfg.map.tilesets[0].regionManifest,doNotRun:true}))