REPOSITORY SOURCE

portal-acceptance.json

docs/evidence/portal-acceptance.json

1{
2  "recordedAt": "2026-10-25T20:07:58.904947+00:00",
3  "baseCommit": "25f251d35ca544c750e6fd709acf9f725da99048",
4  "fullPlanEstimatePercent": 77,
5  "scope": "One-level owned-renderer portal foundation and diagnostic gallery. Authored gateway fields, editor placement, destination residency/interest, replicated destination actors and playable-world activation are not implemented by this increment. No numbered milestone closed.",
6  "sourceSha256": {
7    "apps/probe/main.ts": "ba2fe0b54c53c39884b2f7ef5d63101587a8f2907e2d1befa6f4944761f45c57",
8    "apps/probe/protocol.ts": "ebe0bfba6ebfce52a986ea2e09d499eba91dbc23df926228b738e51206f83d27",
9    "apps/probe/render.worker.ts": "96a89e70e73b6900d6cbe536f17cb193c2b73f33bdf4184993a04be608fd098c",
10    "apps/probe/portals.ts": "5a0db39f1556e67bb5e571d2246e0dd785a9edf12b721db6dd11ca79f3e980bc",
11    "packages/render-webgpu/graph.ts": "a0aa610eae4fd9c5f2ac6791a4c69dbf63cc538f4a58ce28c7c6d77cc738ccc4",
12    "packages/render-webgpu/index.ts": "4571372871e71c6d48c015463364f21df7063cf0b7b56819f819c3f7aba11a43",
13    "packages/render-webgpu/particles.ts": "bfb7f07163e73ed406c3f3aecd60716113b182063330ed7cc0bd544f750d05c7",
14    "packages/render-webgpu/shaders.ts": "80ac5c99114cb4cef7b8c036879f871481b6c4d1ef5244c657b3f85a9550fd96",
15    "packages/render-webgpu/world-text.ts": "f872691fdcab4caa93b18f3d785819d6a3624c5f305ffca94cf198ed046838a2",
16    "packages/render-webgpu/portal.ts": "4bbd688337d368f0d7ad6528f43b66a1ed3e4f203831bdee1b8abf278b6f4b1e",
17    "packages/render/index.ts": "ef0de99f9ce985ec5bab9dc5a614eb4e369d3ad446157fe85f3729aeb4f4c535",
18    "packages/render/portals.ts": "65230db3d4f1aeda355d1f0619470a6e6e7c0d7dd533fb324768da68679b88c8",
19    "tests/render-graph.test.ts": "ed664aaacb1e4c3d77d5e473edcbaf59f7695f4f985ac9e13e8b63ff3759365b",
20    "tests/portal-target.test.ts": "fe6d24636d959899f075d9295d851b5a1d427cb0a971a648721f17a89248b5de",
21    "tests/portals.test.ts": "f6f90209a93c903147b89196402fb44610cbf5754ccd78ceb9174a29fe50d936",
22    "tests/browser/portal-rendering.spec.ts": "8e53c7988ba5ec42212241763d5668a26f67a952c1bf466e1eb48ca8f47610b9",
23    "tests/browser/probe.spec.ts": "fa7374fc1734281fe61468c0427740df7ff1f0dc6637aa346161affa7c6f82db",
24    "tests/browser/editor-surfaces.spec.ts": "a7e8042967d28f3c4cae6aae0789eb5569fba93a6521a99bbeb15e1931e2963a"
25  },
26  "environment": {
27    "node": "22.23.4",
28    "browser": "Chromium 141 headless shell / Playwright 1.56.1",
29    "graphics": "SwiftShader WebGPU/Vulkan",
30    "temporaryStorage": "isolated workspace-disk directories"
31  },
32  "contracts": {
33    "worldFormatChanged": false,
34    "presentationFormatChanged": false,
35    "visualUniformBytes": 464,
36    "activeDestinationViews": 1,
37    "maximumPreparedCandidates": 1,
38    "recursionHops": 1,
39    "preparationDeadlineMs": 20000,
40    "shaderDeadlineMs": 15000,
41    "destinationGraphPeakBytes": 25165824,
42    "destinationOutputPeakBytes": 4194304,
43    "shadowDimension": 2048,
44    "tiers": {
45      "performance": {
46        "pixels": 65536,
47        "dimension": 512,
48        "hz": 15
49      },
50      "balanced": {
51        "pixels": 131072,
52        "dimension": 768,
53        "hz": 20
54      },
55      "high": {
56        "pixels": 262144,
57        "dimension": 1024,
58        "hz": 30
59      }
60    },
61    "textPreparedBeforeCommit": true
62  },
63  "checks": {
64    "typeAndImports": {
65      "passed": true,
66      "packageFiles": 146,
67      "log": "portal-check.log"
68    },
69    "headless": {
70      "total": 760,
71      "passed": 704,
72      "skipped": 56,
73      "failed": 0,
74      "durationMs": 28005.99917,
75      "log": "portal-headless.log"
76    },
77    "browser": {
78      "passed": 4,
79      "failed": 0,
80      "stats": {
81        "startTime": "2026-10-25T20:05:24.288Z",
82        "duration": 113497.672,
83        "expected": 4,
84        "skipped": 0,
85        "unexpected": 0,
86        "flaky": 0
87      },
88      "report": "portal-browser-results.json",
89      "scope": [
90        "portal gallery/lifecycle with actual allocation instrumentation",
91        "diagnostic cancellation and control restoration",
92        "two complete owned-renderer probe runs across existing fixtures",
93        "existing two-player surface publication and worker device recovery"
94      ]
95    },
96    "controlsFollowup": {
97      "passed": 4,
98      "failed": 0,
99      "stats": {
100        "startTime": "2026-10-25T20:07:35.755Z",
101        "duration": 7756.266,
102        "expected": 4,
103        "skipped": 0,
104        "unexpected": 0,
105        "flaky": 0
106      },
107      "report": "portal-controls-results.json",
108      "scope": "After the full four-case run, only diagnostic UI startup cleanup and gesture exclusion plus the portal browser test changed. Final follow-up reran both portal cases and verified worker startup failure and the existing input/audio gesture case. Renderer and other package sources are unchanged from fullRegressionSourceSha256."
109    },
110    "distinctBrowserScenarios": 6
111  },
112  "measurementFiles": [
113    "portal-shared-recovery.json",
114    "portal-measured.json"
115  ],
116  "nativeCensus": [
117    {
118      "mode": "gallery",
119      "buffers": 15,
120      "textures": 7,
121      "destination": {
122        "views": 1,
123        "recursion": 1,
124        "preparing": false,
125        "staged": false,
126        "visible": true,
127        "coverage": 0.12765103888716678,
128        "frames": 7,
129        "width": 640,
130        "height": 400,
131        "targetBytes": 21897216,
132        "buffers": 8,
133        "textures": 4
134      }
135    },
136    {
137      "mode": "lifecycle",
138      "buffers": 15,
139      "textures": 7,
140      "destination": {
141        "views": 1,
142        "recursion": 1,
143        "preparing": false,
144        "staged": false,
145        "visible": true,
146        "coverage": 0.12765103888716678,
147        "frames": 1,
148        "width": 640,
149        "height": 400,
150        "targetBytes": 21897216,
151        "buffers": 8,
152        "textures": 4
153      }
154    }
155  ],
156  "initialRuns": {
157    "portal-initial": "First native gallery/lifecycle passed before near-plane clamp, native allocation instrumentation and fixture lighting refinement. Preserved report and screenshot.",
158    "portal-second": "Gallery, cancellation and full owned-renderer case passed before added partial-allocation failure injection and constructor cleanup hardening.",
159    "portal-reference-initial": "Independent camera reference initially required maximum error <= 2 at every pixel; this failed at edges (max 11, mean about 0.073). Final acceptance separately bounds smooth interiors and mean error across all pixels. Report retained."
160  },
161  "remaining": [
162    "Upright rectangular rendering API only; no authored portal schema/editor, place identity/residency/interest or shared destination activation yet",
163    "No recursive views, per-pixel destination depth, cross-boundary volumetrics or physical traversal changes",
164    "One active and one staged destination may coexist; target budgets exclude separately bounded model assets and lettering atlases",
165    "Fixed 2048-square destination shadows are outside the tier color-pixel ceiling",
166    "Viewport/quality resizing and first visibility refresh immediately, outside the ordinary cadence gate",
167    "GPU pipeline/cache memory and physical-device frame time are not measured by handle counts",
168    "No hardware-GPU, Docker/Coolify, remote CI, long-soak or cross-vendor acceptance claimed",
169    "Final character and arrival art pass remains deferred"
170  ],
171  "fullRegressionSourceSha256": {
172    "apps/probe/main.ts": "5fca814805775ab2bbbd3caacbe16d843ae2f0c4913d058aa6bd0e0134b85a02",
173    "apps/probe/protocol.ts": "ebe0bfba6ebfce52a986ea2e09d499eba91dbc23df926228b738e51206f83d27",
174    "apps/probe/render.worker.ts": "96a89e70e73b6900d6cbe536f17cb193c2b73f33bdf4184993a04be608fd098c",
175    "apps/probe/portals.ts": "5a0db39f1556e67bb5e571d2246e0dd785a9edf12b721db6dd11ca79f3e980bc",
176    "packages/render-webgpu/graph.ts": "a0aa610eae4fd9c5f2ac6791a4c69dbf63cc538f4a58ce28c7c6d77cc738ccc4",
177    "packages/render-webgpu/index.ts": "4571372871e71c6d48c015463364f21df7063cf0b7b56819f819c3f7aba11a43",
178    "packages/render-webgpu/particles.ts": "bfb7f07163e73ed406c3f3aecd60716113b182063330ed7cc0bd544f750d05c7",
179    "packages/render-webgpu/shaders.ts": "80ac5c99114cb4cef7b8c036879f871481b6c4d1ef5244c657b3f85a9550fd96",
180    "packages/render-webgpu/world-text.ts": "f872691fdcab4caa93b18f3d785819d6a3624c5f305ffca94cf198ed046838a2",
181    "packages/render-webgpu/portal.ts": "4bbd688337d368f0d7ad6528f43b66a1ed3e4f203831bdee1b8abf278b6f4b1e",
182    "packages/render/index.ts": "ef0de99f9ce985ec5bab9dc5a614eb4e369d3ad446157fe85f3729aeb4f4c535",
183    "packages/render/portals.ts": "65230db3d4f1aeda355d1f0619470a6e6e7c0d7dd533fb324768da68679b88c8",
184    "tests/render-graph.test.ts": "ed664aaacb1e4c3d77d5e473edcbaf59f7695f4f985ac9e13e8b63ff3759365b",
185    "tests/portal-target.test.ts": "fe6d24636d959899f075d9295d851b5a1d427cb0a971a648721f17a89248b5de",
186    "tests/portals.test.ts": "f6f90209a93c903147b89196402fb44610cbf5754ccd78ceb9174a29fe50d936",
187    "tests/browser/portal-rendering.spec.ts": "0b7c24af238049333ab37178c5e395744db5dbf6dceea6aa3fa57fbf37b46bf2",
188    "tests/browser/probe.spec.ts": "fa7374fc1734281fe61468c0427740df7ff1f0dc6637aa346161affa7c6f82db",
189    "tests/browser/editor-surfaces.spec.ts": "a7e8042967d28f3c4cae6aae0789eb5569fba93a6521a99bbeb15e1931e2963a"
190  },
191  "cameraReference": {
192    "views": 2,
193    "regionPixelsPerView": 2500,
194    "rawMaximumChannelError": 11,
195    "smoothInteriorMaximumChannelError": 1,
196    "maximumMeanChannelError": 0.07506666666666667,
197    "acceptance": "At least half of sampled RGB channels have locally smooth reference neighborhoods (range <= 2 in 3x3). Their maximum error must be <= 2. Mean across all sampled channels, including edges, must be < 0.25. Both views use an independent +10 X camera without portalCamera."
198  }
199}
200