From 4970d156c1366aa6ed5ff7e188d36de7b4e89147 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Tue, 16 Jun 2026 11:30:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90=20release=20artifact=20URL?= =?UTF-8?q?=20workflow=20summary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROJECT_COMPLETION_TRACKER.md | 4 +- text14.txt | 56 +++++++++++++++++++ wasm-port/docs/panel-entry.md | 4 +- wasm-port/runtime/sdk/README.md | 3 +- wasm-port/runtime/ui/ini-panel/ui-shell.js | 8 +++ ...anel_shell_integration_workflow_smoke.html | 12 +++- .../ini_panel_workflow_overview_smoke.html | 5 ++ .../release_artifact_url_workflow_smoke.html | 5 ++ .../tests/sdk/node/verify_sdk_surface.mjs | 20 ++++--- .../ui/node/verify_ini_panel_ui_shell.mjs | 9 +++ 10 files changed, 112 insertions(+), 14 deletions(-) diff --git a/PROJECT_COMPLETION_TRACKER.md b/PROJECT_COMPLETION_TRACKER.md index c2517e9..e1b2744 100644 --- a/PROJECT_COMPLETION_TRACKER.md +++ b/PROJECT_COMPLETION_TRACKER.md @@ -9,7 +9,7 @@ turn-by-turn continuation notes and next-batch execution records. ## Current Status - Active continuation file: `text14.txt` -- Latest completed batch: workflow overview release artifact validation summary browser API +- Latest completed batch: workflow overview release artifact URL workflow validation summary - Latest relevant commit: use `git log -1 --oneline` after each committed batch - Working tree at tracker creation: clean - Required policy: LinuxCNC remains the only CNC semantic source @@ -44,7 +44,7 @@ The project is complete for the current scope when all of the following are true | Native sim configs baseline | Stable | Last recorded Layer 2: `total 159`, `pass 151`, `expected_fail 8`, `unexpected_fail 0`. | | OPFS/session persistence | Stable for current scope | Browser smoke passes, SDK re-exports OPFS/session helpers including `readMachineSessionReadiness()` and `createMachineSessionPersistenceSummary()`, the UI exposes `getMachineSessionPersistenceSummary()`, and `docs/opfs-session-persistence.md` defines the project-level release gate. | | SDK/API surface | Stable for current scope | SDK re-exports core, OPFS/session readiness/load helpers, sim-config staging, project release gate manifest/result matrix/action-plan/readiness summary view-model, project release readiness report/artifact validation summary plus URL loading workflow, INI panel entry/launcher/control-page/shell/workflow overview helpers, the session readiness workflow report, and the shell API surface inventory with a Node surface smoke. | -| Browser/UI workflow | Stable for current scope | Workflow overview embedding mount DOM closure is complete, and INI panel session workflows plus read-only control/shell handoff expose, render, fetch, validate, summarize, and report OPFS/session readiness, OPFS/session persistence summary, release readiness artifact validation/rendering, and API surface inventory before loading or reading WASM session state. | +| Browser/UI workflow | Stable for current scope | Workflow overview embedding mount DOM closure is complete, and INI panel session workflows plus read-only control/shell handoff expose, render, fetch, validate, summarize, and report OPFS/session readiness, OPFS/session persistence summary, release readiness artifact validation/rendering/URL workflow summaries, and API surface inventory before loading or reading WASM session state. | | Workflow overview embedding | Stable for current scope | Report/display/render, DOM contract/readiness/renderer, mount result/display/render, mount DOM contract/readiness/renderer/wrapper exist. | | Host/runtime boundary proof | Stable blocked state | Host smoke passes; runtime families remain blocked and `docs/host-runtime-boundary-handoff.md` records host readiness, promotion blockers, dispatch, and evidence gates. | | Documentation/release gate | Stable for current scope | `docs/project-release-handoff.md` links README, panel entry, SDK, OPFS/session, sim-config, host/runtime, source reuse, drift, tracker acceptance paths, and the machine-readable release readiness report/artifact. | diff --git a/text14.txt b/text14.txt index 7273d91..fbcf875 100644 --- a/text14.txt +++ b/text14.txt @@ -3308,6 +3308,62 @@ ui_node_smokes=ok 继续只做实质能力推进。优先选择可执行 gate、SDK/API surface、或真实 browser workflow; 不要做只整理断言或局部常量化的批次。 +四十九、2026-06-16 继续执行记录:workflow overview release artifact URL workflow validation summary + +本轮继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”推进, +把 release readiness artifact URL workflow 的返回结果补齐为可直接展示的 workflow result。外部 shell +现在只调用一次 `loadWorkflowOverviewReleaseReadinessArtifactUrl()`,即可同时获得 validation、validation +summary view-model、display view-model、render-state 和可选 DOM mount result。 + +完成内容: + +- `loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl()` ready result 新增: + - `validationSummaryViewModel`; +- missing URL、HTTP blocked、fetch/parse blocked result 明确返回: + - `validationSummaryViewModel: null`; +- `verify_ini_panel_ui_shell.mjs` 覆盖: + - missing URL summary 为 null; + - ready URL workflow summary statusLine; + - HTTP blocked summary 为 null; +- `verify_sdk_surface.mjs` 覆盖 SDK re-export URL workflow 的 `validationSummaryViewModel.statusLine`; +- `release_artifact_url_workflow_smoke.html` 覆盖真实 browser URL workflow summary; +- `ini_panel_workflow_overview_smoke.html` 覆盖 workflow overview iframe URL workflow summary; +- `ini_panel_shell_integration_workflow_smoke.html` 覆盖 workflow overview iframe 和 launch API URL workflow summary; +- `docs/panel-entry.md`、`runtime/sdk/README.md` 记录 URL workflow result includes `validationSummaryViewModel`; +- `PROJECT_COMPLETION_TRACKER.md` 同步 latest completed batch 和 Browser/UI workflow 状态; +- 未新增控制按钮; +- 未在 browser/API 中执行 release gate 或 shell command; +- 未解析 G-code; +- 未解释 canonical events; +- 未新增 JS CNC 语义; +- 未运行 opt-in runtime probes; +- 未 promotion blocked runtime family; +- 未改变 LinuxCNC interpreter、tool、parameter、planner、kinematics、remap 或 LinuxCNC-owned + runtime semantics。 + +验证已通过(先行 targeted): + +```bash +wasm-port/tests/ui/node/verify_ui_node_smokes.sh +wasm-port/tests/sdk/node/verify_sdk_surface.sh +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh +SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_release_artifact_url_workflow_browser.sh +``` + +关键输出: + +```text +ui_node_smokes=ok +sdk_surface_node_smoke=ok +browser_ini_shell_integration_workflow_smoke=ok +browser_release_artifact_url_workflow_smoke=ok +``` + +下一步工作计划: + +继续只做实质能力推进。优先选择可执行 gate、SDK/API surface、或真实 browser workflow; +不要做只整理断言或局部常量化的批次。 + 四十八、2026-06-16 继续执行记录:workflow overview release artifact validation summary browser API 本轮继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”推进, diff --git a/wasm-port/docs/panel-entry.md b/wasm-port/docs/panel-entry.md index 7e428ea..b88b7b3 100644 --- a/wasm-port/docs/panel-entry.md +++ b/wasm-port/docs/panel-entry.md @@ -166,7 +166,9 @@ behavior. Use `loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl()` or `linuxCncIniPanelWorkflowOverviewApi.loadWorkflowOverviewReleaseReadinessArtifactUrl()` when the shell should fetch the artifact JSON URL, validate it, and optionally -mount the render-state into caller-owned DOM without executing gates. +mount the render-state into caller-owned DOM without executing gates. The URL +workflow result includes `validationSummaryViewModel` so callers can show +stable validation status and rows from the same fetch. Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()` or `linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()` when the shell needs stable artifact validation status text and dashboard rows diff --git a/wasm-port/runtime/sdk/README.md b/wasm-port/runtime/sdk/README.md index 622efd0..9427cd5 100644 --- a/wasm-port/runtime/sdk/README.md +++ b/wasm-port/runtime/sdk/README.md @@ -299,7 +299,8 @@ for external browser shells: `workflow-overview.html`. Use `loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl()` when a browser or shell should fetch the artifact JSON URL, validate it, and - optionally mount the resulting render-state into caller-owned DOM. + optionally mount the resulting render-state into caller-owned DOM. The URL + workflow result includes `validationSummaryViewModel` for dashboards. `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel()`, `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState()`, `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()`, diff --git a/wasm-port/runtime/ui/ini-panel/ui-shell.js b/wasm-port/runtime/ui/ini-panel/ui-shell.js index 8205c8c..c0cff5e 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -1956,6 +1956,7 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU missing, error: null, validation: null, + validationSummaryViewModel: null, displayViewModel: null, renderState: null, mountResult: null, @@ -1977,6 +1978,7 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU missing: ["artifact-url"], error: `HTTP ${httpStatus ?? "error"}`, validation: null, + validationSummaryViewModel: null, displayViewModel: null, renderState: null, mountResult: null, @@ -1986,6 +1988,10 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU const artifactJson = await response.text(); const validation = validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(artifactJson); + const validationSummaryViewModel = + createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel( + validation, + ); const displayViewModel = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel( validation, ); @@ -2016,6 +2022,7 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU missing: workflowMissing, error: null, validation, + validationSummaryViewModel, displayViewModel, renderState, mountResult, @@ -2032,6 +2039,7 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU missing: ["artifact-url"], error: error?.message ?? String(error), validation: null, + validationSummaryViewModel: null, displayViewModel: null, renderState: null, mountResult: null, diff --git a/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html b/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html index 11b64cb..31f6757 100644 --- a/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html +++ b/wasm-port/tests/browser/ini_panel_shell_integration_workflow_smoke.html @@ -460,7 +460,7 @@ TOOL_TABLE = browser-shell-tool.tbl ); assertEqual( workflowOverviewReleaseArtifactRenderResult.rowCount, - 3, + 6, "shell workflow overview release artifact render rows", ); assertEqual( @@ -473,6 +473,11 @@ TOOL_TABLE = browser-shell-tool.tbl true, "shell workflow overview release artifact URL workflow readiness", ); + assertEqual( + workflowOverviewReleaseArtifactUrlWorkflow.validationSummaryViewModel.statusLine, + "Ready: Artifact evidence complete", + "shell workflow overview release artifact URL workflow summary", + ); assertEqual( workflowOverviewReleaseArtifactUrlWorkflow.mountResult.ready, true, @@ -483,6 +488,11 @@ TOOL_TABLE = browser-shell-tool.tbl true, "launch release artifact URL workflow readiness", ); + assertEqual( + launchReleaseArtifactUrlWorkflow.validationSummaryViewModel.statusLine, + "Ready: Artifact evidence complete", + "launch release artifact URL workflow summary", + ); assertEqual( document.querySelector("[data-external-release-artifact-status]").textContent, "Ready: No blocking reasons", diff --git a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html index 5ebe4ec..0df1449 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -264,6 +264,11 @@ assertEqual(releaseArtifactMountResult.renderResult.rowCount, 6, "workflow overview release artifact mount rows"); assertEqual(releaseArtifactUrlWorkflow.ready, true, "workflow overview release artifact URL workflow readiness"); assertEqual(releaseArtifactUrlWorkflow.httpStatus, 200, "workflow overview release artifact URL workflow status"); + assertEqual( + releaseArtifactUrlWorkflow.validationSummaryViewModel.statusLine, + "Ready: Artifact evidence complete", + "workflow overview release artifact URL workflow summary", + ); assertEqual(releaseArtifactUrlWorkflow.mountResult.ready, true, "workflow overview release artifact URL workflow mount"); assertEqual(releaseArtifactStatus.textContent, releaseArtifactRenderState.statusLine, "workflow overview release artifact rendered status"); assertEqual( diff --git a/wasm-port/tests/browser/release_artifact_url_workflow_smoke.html b/wasm-port/tests/browser/release_artifact_url_workflow_smoke.html index 76d1edd..cb613a4 100644 --- a/wasm-port/tests/browser/release_artifact_url_workflow_smoke.html +++ b/wasm-port/tests/browser/release_artifact_url_workflow_smoke.html @@ -64,6 +64,11 @@ assertEqual(readyWorkflow.ready, true, "ready workflow readiness"); assertEqual(readyWorkflow.httpStatus, 200, "ready workflow HTTP status"); assertEqual(readyWorkflow.validation.gateCount, 10, "ready workflow gate count"); + assertEqual( + readyWorkflow.validationSummaryViewModel.statusLine, + "Ready: Artifact evidence complete", + "ready workflow validation summary", + ); assertEqual(readyWorkflow.renderState.statusLine, "Ready: No blocking reasons", "ready workflow status"); assertEqual(readyWorkflow.mountResult.ready, true, "ready workflow mount readiness"); assertEqual(readyWorkflow.mountResult.renderResult.rowCount, 6, "ready workflow mount rows"); diff --git a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs index aa10f94..587186e 100644 --- a/wasm-port/tests/sdk/node/verify_sdk_surface.mjs +++ b/wasm-port/tests/sdk/node/verify_sdk_surface.mjs @@ -352,16 +352,18 @@ assert.equal( validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(JSON.stringify(releaseReadinessArtifact)).ready, true, ); +const releaseReadinessArtifactUrlWorkflow = await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({ + artifactUrl: "/project-release-readiness.json", + fetchRef: async () => ({ + ok: true, + status: 200, + text: async () => JSON.stringify(releaseReadinessArtifact), + }), +}); +assert.equal(releaseReadinessArtifactUrlWorkflow.ready, true); assert.equal( - (await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({ - artifactUrl: "/project-release-readiness.json", - fetchRef: async () => ({ - ok: true, - status: 200, - text: async () => JSON.stringify(releaseReadinessArtifact), - }), - })).ready, - true, + releaseReadinessArtifactUrlWorkflow.validationSummaryViewModel.statusLine, + "Ready: Artifact evidence complete", ); assert.equal( createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState( diff --git a/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs b/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs index 58f9916..5815ca1 100644 --- a/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs +++ b/wasm-port/tests/ui/node/verify_ini_panel_ui_shell.mjs @@ -1380,6 +1380,10 @@ assert.equal( (await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl()).statusLine, "Blocked: artifact-url", ); +assert.equal( + (await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl()).validationSummaryViewModel, + null, +); const releaseArtifactUrlWorkflow = await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({ artifactUrl: "/project-release-readiness.json", fetchRef: async (url) => ({ @@ -1402,6 +1406,10 @@ assert.equal( assert.equal(releaseArtifactUrlWorkflow.ready, true); assert.equal(releaseArtifactUrlWorkflow.httpStatus, 200); assert.equal(releaseArtifactUrlWorkflow.validation.ready, true); +assert.equal( + releaseArtifactUrlWorkflow.validationSummaryViewModel.statusLine, + "Ready: Artifact evidence complete", +); assert.equal(releaseArtifactUrlWorkflow.renderState.statusLine, "Ready: No blocking reasons"); assert.equal(releaseArtifactUrlWorkflow.mountResult.ready, true); assert.equal(releaseArtifactUrlWorkflow.mountResult.renderResult.rowCount, 6); @@ -1426,6 +1434,7 @@ const releaseArtifactUrlWorkflowHttpBlocked = await loadIniPanelShellWorkflowOve }); assert.equal(releaseArtifactUrlWorkflowHttpBlocked.ready, false); assert.equal(releaseArtifactUrlWorkflowHttpBlocked.statusLine, "Blocked: HTTP 404"); +assert.equal(releaseArtifactUrlWorkflowHttpBlocked.validationSummaryViewModel, null); assert.deepEqual(createIniPanelShellWorkflowOverviewReadiness(), { apiName: "ini-panel-shell-workflow-overview-readiness", readinessVersion: 1,