Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -1078,7 +1078,7 @@ wiki(Graphify)
<!-- gitnexus:start -->
# GitNexus — Code Intelligence

This project is indexed by GitNexus as **AI-BIM-governance** (4464 symbols, 8042 relationships, 197 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.
This project is indexed by GitNexus as **AI-BIM-governance** (4953 symbols, 9082 relationships, 194 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.

> If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first.

Expand Down
24 changes: 24 additions & 0 deletions docs/plans/AI-BIM-governance-saas-roadmap-2026-05.html
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,20 @@ <h1 id="ai-bim-governancesaas-2026-05">AI-BIM-governance:SaaS 路線圖規劃
<p><strong>2026-05-19 更新(下一輪 burn-down reset|對齊 Drive 12h Claude Design 2026-05-14/15)</strong>:新增 <a href="AI-BIM-governance-next-burn-down-2026-05-19.md"><code>AI-BIM-governance-next-burn-down-2026-05-19.md</code></a> 作為 Drive-ready 下一輪 burn-down。結論:5/14/15 工作台的 C1/C2 仍有效但改名並收斂為 B-scheme runtime evidence(<code>runtime-image-linux-kit-launcher-readiness-pass</code>、<code>bscheme-real-streaming-conversion-evidence</code>、<code>single-kit-webrtc-visual-evidence</code>);C3 <code>revit-intake-rvt-ifc-bridge-evidence</code> <strong>已失效</strong>,不得重開 <code>_bim-control</code> / <code>_worker</code> 產品 runtime。13-file worker batch / <code>minimum_coverage_locked</code> 已轉為 archive-only historical evidence,不再是 Phase B 後的下一輪 product runtime 候選。§5 / §6 / §10 已同步加入目前仍有效的候選、deferred / blocked runtime evidence 與建議順序。</p>
<p><strong>2026-05-19 更新(B 方案 intake smoke 現行證據)</strong>:<code>scripts/smoke-bscheme-intake.ps1</code> 已從 contract-stub API-only smoke 擴成「contract checks + optional real <code>storage/*.ifc</code> → coordinator intake → streaming conversion polling → coordinator callback outbox」的最小整合驗證入口。本 8caa worktree 的 <code>storage/*.ifc</code> 目前為 <strong>0 檔</strong>,因此 <code>real_ifc_fixture=blocked</code>、<code>real_ifc_intake_conversion=blocked</code>;contract/API 層仍通過(repo-root pytest 7、coordinator verify 140、streaming conversion pytest 10、callback outbox passed)。GPU/Kit 層本次 <code>runtime_image_kit_launcher=deferred</code>,實際 blocker 為 <strong>Docker engine not available</strong>;single Kit render 為 <code>deferred</code>、multi-viewer 與 USD stage composition 為 <code>not_observed</code>。證據:<code>docs/verification/evidence/2026-05-18-bscheme-intake-smoke/bscheme-readiness.json</code> 與 <code>docs/verification/evidence/2026-05-18-t0-kit-launcher/kit-launcher-readiness.json</code>。</p>
<p><strong>2026-05-22 更新(<code>coordinator-auto-poll-streaming-conversion</code> archive 對齊;fast-mvp loop zero-touch automation 完成)</strong>:本 change(implementation PR #98,2026-05-22 merged,squash <code>2103bf7</code>)已完成 <strong>OpenSpec sync/archive</strong>(archive folder <code>openspec/changes/archive/2026-05-22-coordinator-auto-poll-streaming-conversion/</code>;<code>openspec/specs/</code> 26 保持 <strong>26</strong>,本次為 <code>conversion-webhook-lifecycle</code> capability <strong>MODIFIED</strong> 1 個 requirement(<code>Coordinator ingests host-native conversion result into callback outbox</code> 加 SHALL auto-poll 子條款 + 3 新 Scenario + implementation status note);totals + 0 added / ~ 1 modified / - 0 removed)。<code>openspec validate --specs --strict</code> = <strong>26 passed / 0 failed</strong>。本 change 補實該 requirement 早已寫的「ingest through polling, an internal result loop, or an equivalent internal callback」但 polling / internal result loop <strong>皆未實作</strong>的 gap:<code>bim-review-coordinator/src/services/streamingConversionClient.ts</code> 加 module-level <code>isTerminalConversionResult</code> helper + class method <code>pollConversionResult(jobId, options): PollerHandle</code>(setTimeout chain 避免 setInterval overlap、cancel()、max attempts → poll_timeout fake failed result);<code>bim-review-coordinator/src/config.ts</code> 加 <code>conversionPollEnabled</code>(default true)/ <code>conversionPollIntervalSeconds</code>(default 5)/ <code>conversionPollMaxAttempts</code>(default 60 = 5 分鐘 ceiling)+ <code>parseBooleanEnv</code>;<code>bim-review-coordinator/src/app.ts</code> 加 <code>pollerRegistry: Map&lt;conversion_job_id, PollerHandle&gt;</code>、refactor 既有 manual ingest 邏輯抽成共用 helper <code>ingestStreamingConversionResult</code>、dispatch 成功後 <code>schedulePollerForConversion</code>、manual endpoint 開頭 cancel + delete registry(去重)、<code>CoordinatorApp</code> 加 <code>dispose()</code> shutdown hook。<strong>Verification(本 change L1-L4)</strong>:coordinator <code>npm run verify</code> = 12 files / <strong>173 tests passed</strong>(168 既有 + 5 新 <code>auto-poll-conversion.test.ts</code> cover happy path / failed / duplicate dispatch budget / manual cancel auto / disabled config);streaming-server <code>pytest tests -q</code> = <strong>31 passed</strong>(不動,regression OK);root pytest 9 passed;GitNexus pre-impact LOW for <code>fetchConversionResult</code> / <code>createCoordinatorApp</code>;<strong>L4 真實 runtime end-to-end 第一次 zero-touch 跑通</strong>:docker compose recreate coordinator(讀新 code,帶 absolute <code>RUNTIME_STORAGE_ROOT</code>)→ <code>POST /api/external/ifc-ready</code> → fixture trick 確保 IFC 落地 → <strong>無任何 manual POST ingest</strong> → 40 秒內 coordinator <code>GET /api/external/ifc-ready/&lt;job&gt;</code> 返回 <code>conversion_status: ready</code> + <code>viewer_url: http://127.0.0.1:8004/ui/open?session=review_session_&lt;id&gt;</code>(2026-05-22 timestamp)。<strong>注意</strong>:本 archive 不持久化 poller state(coordinator restart 後 in-memory timers lost,手動 endpoint 仍可救);不解雲端 callback outbox retry / dead-letter(另一條既有 requirement 不動);不引入 streaming-server push callback(本 change 走 coordinator pull)。<strong>fast-mvp loop 從 spec 到 code 從 zero-touch 自動化的角度完整收尾(架構完整對齊 + 自動跑通)</strong>:OpenSpec changes archived = <code>remove-conflict-review-from-fast-mvp</code> + <code>fast-ifc-link-demo-loop</code> + <code>streaming-server-prefer-local-ifc-path</code> + <code>coordinator-auto-poll-streaming-conversion</code>(4 段);hotfix bundle = PR #94 / #95 / #96 / #98。</p>
<p><strong>2026-05-26 更新(fast MVP Semantic ready chain follow-up,2 個 change merged + archived;vendor-side blocker)</strong>:接續 2026-05-25 4 個 change archive,本日新增兩段補 Semantic ready chain:</p>
<ul>
<li><strong>C5</strong> <code>coordinator-forward-quality-metrics-summary</code>(PR #115 merged squash;<code>2026-05-26-coordinator-forward-quality-metrics-summary</code> archived):coordinator <code>createReviewSessionFromIngest</code> 從 streaming conversion result 萃取 <code>quality_metrics_summary</code>(含 C1 三 semantic 欄位 + 既有 source_ifc_entity_count / materialization_strategy / phase_timings),寫進 SessionStore 供 viewer / <code>/ui</code> stream-config 自動 forward。<code>conversion-webhook-lifecycle</code> capability +1 ADD requirement;coordinator types.ts <code>ConversionQualityMetricsSummary</code> 加三 C1 欄位(additive)。3 個新 vitest cover full / partial / missing quality_metrics 三條 path。</li>
<li><strong>C6</strong> <code>streaming-server-enumeration-semantic-mapping</code>(PR #117 merged squash;<code>2026-05-26-streaming-server-enumeration-semantic-mapping</code> archived):<code>_enumerate_usd_stage</code> 從 USD prim CustomData 抽 <code>ifcType</code> / <code>ifcName</code>(容忍 <code>ifc:type</code> / <code>ifcType</code> / <code>ifc_type</code> 等命名變體),mapping items 加 ifc_type / ifc_name / entity_id;<code>_adopt_converter_sidecars</code> 從 emitted_mapping items supplement 缺少 semantic 欄位(non-fabricating,既有 converter-written 欄位用 <code>is None</code> / <code>not in</code> guard 不蓋)。<code>streaming-ifc-usdc-conversion-authority</code> capability +1 ADD requirement;4 個新 unit test。</li>
</ul>
<p><strong><code>openspec/specs/</code></strong> 仍 26 個 capability;<code>openspec validate --specs --strict</code> = <strong>26 passed / 0 failed</strong>。</p>
<p><strong>Closeout Chrome MCP evidence</strong>:</p>
<ul>
<li>C5 forward 機制 100% 工作:<code>quality_metrics_summary</code> 從整個 null → 帶 <code>source_ifc_entity_count=10872</code> / <code>materialization_strategy=&quot;usd_stage_enumeration&quot;</code> / <code>coverage_status=&quot;warn&quot;</code> 等真值,三 C1 semantic 欄位明示 <code>null</code>(schema stable)。viewer triReady File=yes / Runtime=yes / Semantic=no(誠實標)。</li>
<li>C6 後實際 Semantic ready 仍 no — <strong>vendor-side blocker</strong>:HOOPS A3D library 產出的 <code>model.usdc</code> 10,872 prim 完全無 IFC metadata(CustomData 僅 <code>userDocBrief</code>,attribute 無 <code>ifc</code> 字串),HOOPS 視 IFC 為 generic 3D 來源,只保留 mesh + material 不保留 GUID/Type/Name。C6 實作正確生效(三 semantic 欄位明示寫 null/false 進 JSON 不再 missing key),但 enumeration 沒資料來源可抽。</li>
</ul>
<p><strong>下一步建議</strong>:新 OpenSpec change <code>streaming-server-ifcopenshell-semantic-sidecar-pass</code> — HOOPS 成功後並行跑 IfcOpenShell 解析 IFC source,寫 <code>ifc_semantic_sidecar.json</code>(IFC GUID → ifc_type/ifc_name dict),<code>_enumerate_usd_stage</code> 讀此 sidecar 補 mapping。Non-goals:不改 HOOPS A3D library(vendor-side)。對 fast MVP 影響:現狀 File / Runtime / Stage matched / WebRTC 全綠,Semantic=no 只是「點選 USD prim 反查 IFC element」這層的限制,不阻擋核心 3D 觀看。</p>
<p>完整 evidence:<code>docs/evidence/2026-05-25-fast-mvp-edge-bim-server-console/c2-viewer-semantic-yes-after-forward.md</code>(C5)+ <code>c2-viewer-semantic-final-vendor-blocker.md</code>(C6)。</p>

<p><strong>2026-05-25 更新(fast MVP Edge BIM Data Server Console 4 個 change merged + archived)</strong>:依 <code>docs/plans/fast-mvp-edge-bim-server-console-design-2026-05-25.md</code> 切的 4 個 OpenSpec change 已全部 merged + archived(PR #106 / #107 / #108 / #109,squash merge:<code>330ebb2</code> / <code>0fbc9db</code> / <code>1055208</code> / <code>5f20c04</code>)。<code>openspec/specs/</code> 仍 26 個 capability(本輪皆為 MODIFY/ADD requirement 於既有 capability,不新增 capability):</p>
<ul>
<li><strong>C1</strong> <code>streaming-server-fallback-semantic-mapping</code>:<code>streaming-ifc-usdc-conversion-authority</code> ADD 1 / MODIFY 1 requirement。fallback 產出帶 <code>ifc_type</code> / <code>ifc_name</code> / <code>entity_id</code> 的 mapping,prim path <code>/World/&lt;IfcClass&gt;/&lt;sanitized_guid&gt;</code>,<code>quality_metrics</code> 新增 <code>semantic_mapping_fidelity</code> / <code>mapping_has_ifc_type</code> / <code>mapping_has_ifc_name</code>。Review fix:while-loop collision counter 避免 sanitize 同 token silent overwrite;補 multi-shape test(34 passed)。</li>
Expand Down Expand Up @@ -924,6 +938,16 @@ <h3 id="14-openspec-change-openspecspecs">1.4 OpenSpec 已歸檔 change → 現
<td>真實 341MB IFC closed-loop:HOOPS <code>A3D_LOAD_CANNOT_LOAD_MODEL</code> 時由 scoped IfcOpenShell + OpenUSD fallback 產生 openable <code>model.usdc</code> 與 sidecars;coordinator <code>/ui</code> dashboard 顯示 IFC-ready download / conversion job / artifact / session / Kit-WebRTC / viewer count;viewer 強制 session-first expected stage 並用 AppStreamer Promise replies 記錄 <code>openedStageResult</code> / <code>loadingStateResponse</code>。Chrome E2E 證據顯示 <code>ifcready_1779449084006_3a0fd2cb</code> → <code>stream_conv_20260522112506_2b79ba1d</code> → <code>review_session_5f549af0631b</code>,<code>Stage truth matched</code>、video <code>1920x1080</code>、reload 後仍 matched;archive 不把 Docker GPU launcher、OQ1 cloud callback auth 或 OQ5 SSO 標成 passed</td>
</tr>
<tr>
<td><code>2026-05-26-streaming-server-enumeration-semantic-mapping</code></td>
<td><code>streaming-ifc-usdc-conversion-authority</code>(ADD 1 requirement)</td>
<td>enumeration / adopt 兩條 sidecar path 補寫 IFC semantic mapping fidelity:<code>_enumerate_usd_stage</code> 從 USD prim CustomData 抽 <code>ifcType</code> / <code>ifcName</code>(容忍 <code>ifc:type</code> / <code>ifcType</code> / <code>ifc_type</code> 命名變體),mapping items 加 ifc_type / ifc_name / entity_id 並寫 semantic 三欄位(<code>ifc_class_grouped_with_name</code> / <code>usd_enumeration_with_ifc_custom_data</code> / null 三狀態);<code>_adopt_converter_sidecars</code> 從 emitted_mapping items supplement 缺欄位(non-fabricating + 不蓋既有值)。Implementation PR #117 merged(squash);archive closeout Chrome MCP evidence 確認實作正確生效(三 semantic 欄位明示寫 null/false 進 JSON 不再 missing),但 HOOPS A3D library 產出的 <code>model.usdc</code> 10,872 prim 完全無 IFC metadata(vendor-side blocker),Semantic=yes 需後續 <code>streaming-server-ifcopenshell-semantic-sidecar-pass</code> change</td>
</tr>
<tr>
<td><code>2026-05-26-coordinator-forward-quality-metrics-summary</code></td>
<td><code>conversion-webhook-lifecycle</code>(ADD 1 requirement)</td>
<td>coordinator <code>createReviewSessionFromIngest</code> 從 streaming conversion result 萃取 <code>quality_metrics_summary</code>(含 C1 三 semantic 欄位 + 既有 source_ifc_entity_count / materialization_strategy / phase_timings),寫進 SessionStore,後續 <code>GET /api/review-sessions/:id/stream-config</code> 自動 forward 給 viewer / <code>/ui</code>。types.ts <code>ConversionQualityMetricsSummary</code> 加 C1 三欄位(additive);新增 <code>buildQualityMetricsSummary</code> helper(streamingConversionClient.ts);既有 explicit POST 路徑不變。3 個新 vitest cover full / partial / missing quality_metrics。Implementation PR #115 merged(squash);closeout Chrome MCP evidence 確認 forward chain 100% 工作</td>
</tr>
<tr>
<td><code>2026-05-25-streaming-server-fallback-semantic-mapping</code></td>
<td><code>streaming-ifc-usdc-conversion-authority</code>(ADD 1 / MODIFY 1 requirement)</td>
<td>fallback semantic mapping:<code>_run_ifcopenshell_openusd_fallback</code> 產出帶 <code>ifc_type</code> / <code>ifc_name</code> / <code>entity_id</code> 的 mapping;prim path 改 <code>/World/&lt;IfcClass&gt;/&lt;sanitized_guid&gt;</code>(USD-safe sanitization + while-loop collision counter 防 sanitize 同 token 撞名);<code>quality_metrics.json</code> 新增 <code>semantic_mapping_fidelity</code> / <code>mapping_has_ifc_type</code> / <code>mapping_has_ifc_name</code>,讓 viewer / <code>/ui</code> 的 Semantic ready 有真實 IFC 語意資料來源。Unit test 34 passed(含 multi-shape sanitized clash + entity_id 對齊驗證)。Implementation PR #106 merged(squash <code>330ebb2</code>);archive 不修 HOOPS A3D primary path、不還原 IfcRelAggregates BIM hierarchy、不引入新 production dependency</td>
Expand Down
Loading