Phase 21 — Live 3D Unblock Is Shape B: Height + Rebuild, Still an Empty Mesh
STATUS: LIVE_DRAWING_PASS · passKind: shape_b_controls · claimStatus: SHAPE_B (not Shape A). Live file 圖則.pdf (project a48e6815-cbbf-4847-a68b-57b87ee53bd0 / file 65b1bfde-5049-49d9-a1f2-70c10058d5dd). Numeric assumed height + Rebuild shipped. floors=0, elements=0, persisted=false. renderedCount was 0 of 7 pages at OI. Residual DISCIPLINE_UNRESOLVED / FLOOR_IDENTITY_AMBIGUOUS / NO_PLAN_PAGES. Phase 20 S33 SUCCESS_MODEL_PASS is a separate offline training win. Phase 19 Peak P&D 3D 80/80 remains CLAIM_NOT_EARNED. No corpus 80–90%. No IFC. Assumed storey height is labelled assumed / 非量度, never measured.
This is an investigation journal plus a product how-to. Every figure below is copied from the Phase 21 OI artefact (apps/web/data/phase21/live-target-verify.v1.json, generatedAt 2026-08-15T20:28:32.688Z) and the PA closeout report (docs/PEAK_PHASE21_REPORT.md). Nothing was re-scored for publication. An empty viewport with a working Rebuild button is the earned product state. It is not a building.
What Phase 21 asked
Phase 18 shipped PDF → in-app world_metres_v1 → Schedule C mapping, then stopped: Peak P is partial, floor identity is ambiguous, and every 3D Detection / QA@20 percent is blocked (null). That path post is /blog/phase18-pdf-to-in-app-3d. Phase 19 shipped upload generate3d (default off), /projects/[id]/3d, and the drawing 3D tab — and printed CLAIM_NOT_EARNED for Peak P&D 3D Detection / QA@20 ≥80% (/blog/phase19-earn-3d-qty). Phase 20 earned SUCCESS_MODEL_PASS on one University of Macau S33 training PDF; the signed-in Peak 3D tab stayed empty (/blog/phase20-first-training-3d-model).
Phase 21 asked a different live-product question on a different file. The named slice is live 圖則.pdf — project a48e6815-cbbf-4847-a68b-57b87ee53bd0, file 65b1bfde-5049-49d9-a1f2-70c10058d5dd — not Peak live 143a3a07-… and not the S33 training PDF. Before Phase 21 the live panel offered only a binary 3.15 m toggle and no Rebuild. Six blockers sat on the file, including EXTRACT_PAGE_NOT_RENDERED, HEIGHT_FIXED_TOGGLE, and NO_REBUILD_CONTROL. The estimand is product reliability (controls + extract ordering). It is not Phase 5–17 2D QA@20, and it is not Peak P&D 3D 80/80.
Verdict: LIVE_DRAWING_PASS is Shape B
OI scored gates 1–4 pass. Gate shape is B. Numeric assumed height and Rebuild shipped; the extract product path uses ensurePageRenderReady and does not return the banned “page not rendered” banner. Snapshots stay blocked. Shape A — floorKeys.length ≥ 1 and at least one world-coordinate element, persisted true — was not earned.
| Gate | Result | Note |
|---|---|---|
| 1 Controls, not three hard blockers with no button | PASS (Shape B) | rebuildMounted + numericInput + emptyDiagnosticsPresent. Snapshots still blocked / 0 floors / 0 elements. |
| 2 Numeric storey height (m) + Rebuild POST …/reconstruct | PASS (product path) | Production POST was not sent. PHASE21_LIVE_WRITE unset. write.attempted: false. |
| 3 Assumed height always 非量度 / never measured | PASS | assumedCopyOk. ifcOutput false. fabricatedGeometry false. |
| 4 Extract ensures render first — no banned banner | PASS (product path) | extractProductWouldEmitBannedBanner: false. Live POST extract skipped (read-only). |
| Shape A live mesh | not earned | floorCount 0, elementCount 0, floorKeys [], persisted false. |
Snapshot (copied from OI — not re-run)
| Item | Before | After (OI) |
|---|---|---|
| verdict / passKind | — | LIVE_DRAWING_PASS / shape_b_controls |
| Blockers removed | EXTRACT_PAGE_NOT_RENDERED, HEIGHT_FIXED_TOGGLE, NO_REBUILD_CONTROL | gone |
| Residual blockers | same three plus the removed set | DISCIPLINE_UNRESOLVED, FLOOR_IDENTITY_AMBIGUOUS, NO_PLAN_PAGES |
| floorCount / elementCount | 0 / 0 | 0 / 0 |
| floorKeys | [] | [] |
| status | blocked | blocked |
| discipline / sorSheet | MIXED / null | MIXED / null |
| pageCount / renderedCount | 7 / 0 | 7 / 0 |
| claimCount / evidenceCount | 0 / 0 | 0 / 0 |
| persisted | — | false (PHASE21_LIVE_WRITE unset) |
| fabricatedGeometry / ifcOutput | false / false | false / false |
Seven live pages, all hasRenderPath: false at OI. GET model3d without a signed-in cookie returned HTTP 404. OI recorded browserSession: not_opened and write.reason: PHASE21_LIVE_WRITE unset — production POST reconstruct skipped (default read-only). GET ?assumeStoreyM= is preview-only and does not satisfy persist.
What shipped (Shape B controls)
- Numeric Assumed storey height / 假設層高 input (1.50–20.00 m). Placeholder 3.15 is a suggestion, not auto-filled and not a Peak measurement.
- Use 3.15 m and Clear assumed height. Commit is preview-only until Rebuild.
- Rebuild / Persist (重建並儲存) posts POST /api/files/[id]/reconstruct with projectId and optional assumeStoreyM. Empty / blocked / partial GET states still enable the button — blocked is not disabled.
- Amber 假設標準層高(非量度) / Assumed typical storey height (not measured) on canvas and inspector when a preview or persisted assumed height is present.
- Extract path ensures a page render first. The product route does not return the banned EXTRACT_PAGE_NOT_RENDERED banner string.
- Upload Generate 3D model stays default off and still does not send assumeStoreyM. Soft DISCIPLINE_UNRESOLVED is labelled soft — not 0%.
Phase 20 S33 and Phase 19 Peak 80/80 are separate
Phase 20 earned SUCCESS_MODEL_PASS on training_data/澳門大學—S33教職員宿舍建造工程/圖則.pdf: sole-storey G, four printed-label fittings, fabricatedGeometry false, countRows = 11, lengthRows = 0, lengthMetresSum = 0. That model was never persisted to this live project. Do not copy S33 floorKeys = [G] onto live 圖則.pdf. See /blog/phase20-first-training-3d-model.
Phase 19 Peak P&D 3D Detection / QA@20 ≥80% remains CLAIM_NOT_EARNED. The MK artefact is absent; percents stay null, not 0%. Peak live project 143a3a07-99c1-46b4-809c-716365a673b8 is a different file. This Phase 21 slice set peak8080Required: false and qa20InScope: false. See /blog/phase19-earn-3d-qty.
How to use Rebuild — and why you should not expect a mesh yet
The rest of this post is a walkthrough of what is on main. It is not a claim that 3D takeoff is product-default accurate. For upload, extract, legend takeoff, geometric length, Schedule C, and ClaimReview Match on a draft claim, start at /blog/how-to-use-teraquant. Host: https://www.teraquant.ai. Named drawing: /projects/a48e6815-cbbf-4847-a68b-57b87ee53bd0/drawings/65b1bfde-5049-49d9-a1f2-70c10058d5dd/1. Screenshots below are local captures of shipped 3D chrome with the OI leftover codes (2026-08-18). They are not a certified production Clerk session. No pipes were painted.
1. Open the 3D tab and read the empty diagnostics
Sign in at https://www.teraquant.ai/sign-in. Open the named 圖則.pdf. Flip the centre canvas from 圖則 / Drawing to 3D 模型 / 3D model, or open the inspector work tab of the same name. You should see Why this 3D view is empty / 為何這個 3D 檢視是空的. Status is Reconstruction blocked (not 0%) — not a Detection percent. Counts stay 0 floors · 0 3D elements. The copy says the tab will not invent pipes.
Three residual codes remain labelled. DISCIPLINE_UNRESOLVED is soft: filename 圖則.pdf and empty page titles did not resolve a unique SOR sheet (discipline MIXED). FLOOR_IDENTITY_AMBIGUOUS is hard on pages 1–7: do not use the page number as the floor. NO_PLAN_PAGES is hard: there were no identified floor-plan pages to stack at OI, because the seven pages were unrendered (renderedCount 0) and title-block identity had not run.

2. Set an assumed height, then Rebuild — still 非量度, still no mesh
The inspector and the empty canvas both mount Assumed storey height / 假設層高. Type a value between 1.50 and 20.00, or click Use 3.15 m. That commit is a GET preview only (?assumeStoreyM=). Amber banners must read 假設標準層高(非量度) / Assumed typical storey height (not measured). Do not call this 量度. Assumed height does not invent storeys or pipes, and it is excluded from any measured length.
Rebuild / Persist is the only control that POSTs reconstruct from this panel. On the Phase 21 OI slice the production write was skipped (PHASE21_LIVE_WRITE unset). After a preview you should still see 0 floors and the same three residual codes. An empty viewport after Rebuild is honest. Do not expect a mesh until floor identity, plan pages, and a persisted world element exist — that is Shape A, and it is not this post.

3. What the SOR 3D strip will show
- On this live 圖則.pdf at OI: blocked / not a quantity. Count and length cells are dashes. Reason DISCIPLINE_UNRESOLVED (soft). The strip repeats: blocked is not a 0% quantity.
- 圖紙總覽 / Drawing summary stays on 2D extract plus live SOR match. It does not carry qty_3d. Do not blend Phase 17 2D QA@20 into this strip.
- The offline S33 ledger (countRows 11 / 0 m) is not what this signed-in tab shows.
What this is not
- Not Shape A. LIVE_DRAWING_PASS here is the Shape B clause (controls), not a non-empty world_metres_v1 mesh.
- Not Peak P&D 3D Detection / QA@20 ≥80%. That gate remains Phase 19 CLAIM_NOT_EARNED. Percents stay null.
- Not corpus 80–90%. Phase 17 sufficiency remains INSUFFICIENT_CROSS_PROJECT_COVERAGE.
- Not a copy of Phase 20 S33 floorKeys = [G] / 4 fittings / countRows = 11.
- Not a fabricated pipe tree. If the model is empty, the UI stays empty. The Phase 5 demo-grid annotator is not used.
- Not IFC, Revit or glTF export. ifcOutput: false.
- Not a live persist. persisted: false. Assumed 3.15 m is labelled assumed, never measured.
What happens next
- Phase 22 asks for LIVE_MODEL_PASS on the same IDs: persist page renders (renderedCount ≥ 1), title-block OCR, quantity-blind extract, then Rebuild persist until floorKeys.length ≥ 1 and at least one world element, persisted true — or print LIVE_MODEL_NOT_EARNED.
- Do not invent floors from the page index. Do not copy S33. Do not beautify an empty live model.
- Do not promote 3D quantity as a product accuracy headline. Do not blend 2D QA@20 into a 3D score.
Internal report: docs/PEAK_PHASE21_REPORT.md (PA closeout of skipped OL/OM; figures copied from OI). Verification: docs/PHASE21_VERIFICATION.md (PASS_WITH_BLOCKERS). Phase 18 path: /blog/phase18-pdf-to-in-app-3d. Phase 19 Peak 80/80: /blog/phase19-earn-3d-qty (CLAIM_NOT_EARNED). Phase 20 S33: /blog/phase20-first-training-3d-model. Field guide: /blog/how-to-use-teraquant.
Related articles
Phase 19 — 3D Product Surfaces Shipped; Peak P&D 80/80 Not Earned
Phase 19 shipped the upload generate-3D checkbox (default off), a project /3d page, and the drawing 3D tab. Peak P&D 3D Detection / QA@20 ≥80% is CLAIM_NOT_EARNED: no MK artefact, percents stay null (not 0%), and the Peak 3D view is still empty (FLOOR_IDENTITY_AMBIGUOUS, 0 floors). Phase 20’s S33 offline SUCCESS_MODEL_PASS is a separate training result. No corpus 80–90% claim.
14 min readPhase 20 — First Training 3D Model and a Count/Length Ledger, Without an 80–90% Claim
Phase 20 earned SUCCESS_MODEL_PASS on one University of Macau S33 training PDF: sole-storey G, four printed-label fittings, fabricatedGeometry false. The SOR ledger writes countRows = 11 and lengthMetresSum = 0. That is a count ledger plus an empty measured-length section — not a pipe-length win, not Peak P&D 3D 80/80, and not a corpus 80–90% claim. The signed-in Peak 3D tab is still empty.
15 min read