Blog
ProductGuidePhase 213D ReconstructionEngineeringResearchMEP Takeoff

Phase 21 — Live 3D Unblock Is Shape B: Height + Rebuild, Still an Empty Mesh

Teraquant Team16 min read
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.

GateResultNote
1 Controls, not three hard blockers with no buttonPASS (Shape B)rebuildMounted + numericInput + emptyDiagnosticsPresent. Snapshots still blocked / 0 floors / 0 elements.
2 Numeric storey height (m) + Rebuild POST …/reconstructPASS (product path)Production POST was not sent. PHASE21_LIVE_WRITE unset. write.attempted: false.
3 Assumed height always 非量度 / never measuredPASSassumedCopyOk. ifcOutput false. fabricatedGeometry false.
4 Extract ensures render first — no banned bannerPASS (product path)extractProductWouldEmitBannedBanner: false. Live POST extract skipped (read-only).
Shape A live meshnot earnedfloorCount 0, elementCount 0, floorKeys [], persisted false.

Snapshot (copied from OI — not re-run)

ItemBeforeAfter (OI)
verdict / passKindLIVE_DRAWING_PASS / shape_b_controls
Blockers removedEXTRACT_PAGE_NOT_RENDERED, HEIGHT_FIXED_TOGGLE, NO_REBUILD_CONTROLgone
Residual blockerssame three plus the removed setDISCIPLINE_UNRESOLVED, FLOOR_IDENTITY_AMBIGUOUS, NO_PLAN_PAGES
floorCount / elementCount0 / 00 / 0
floorKeys[][]
statusblockedblocked
discipline / sorSheetMIXED / nullMIXED / null
pageCount / renderedCount7 / 07 / 0
claimCount / evidenceCount0 / 00 / 0
persistedfalse (PHASE21_LIVE_WRITE unset)
fabricatedGeometry / ifcOutputfalse / falsefalse / 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.

Live 圖則.pdf 3D tab: empty diagnostics, three residual blockers, 0 floors, numeric height and Rebuild — no mesh
Shipped drawing 3D tab on live 圖則.pdf chrome (2026-08-18 local capture of OI leftover codes). Title 為何這個 3D 檢視是空的. Status 重建已封鎖(不是 0%). 0 floors · 0 3D elements. Residual DISCIPLINE_UNRESOLVED (soft), FLOOR_IDENTITY_AMBIGUOUS p.1–7 (hard), NO_PLAN_PAGES (hard). Numeric 假設層高 + 重建並儲存 visible. Inspector SOR 3D strip: Count —, Length —, 已封鎖(不是 0%). Source: live reconstruct (read-only). persisted: false. Not a certified production Clerk session. No pipes painted. Do not read this as 3D Detection = 0%.

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.

Same empty 圖則.pdf 3D tab with assumed 3.15 m banners and Rebuild; still zero floors and three residual blockers
Opt-in assumed 3.15 m preview on live 圖則.pdf chrome (2026-08-18). Canvas and inspector: 假設標準層高(非量度). Input 3.15 m. Rebuild / 重建並儲存 is the persist path; assumed stays assumed. Floors still 0, elements still 0, residual codes unchanged. Header: assumed 3.15 m preview · not measured. Not a certified production Clerk session. No pipes painted. This is Shape B, not Shape A.

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.