diff --git a/text17.txt b/text17.txt index 44ea652..7da5b06 100644 --- a/text17.txt +++ b/text17.txt @@ -950,3 +950,86 @@ git diff --check ok multi-joint、vismach remap sims 的 motion source evidence 显式映射到 matrix fixture rows。 3. 将 real simulation page 的 virtual HAL session snapshot 与 release diagnostics artifact 做联动,使保存的 Web CNC 仿真会话可直接输出 release-ready diagnostics evidence。 + +### 十、2026-06-17 INI Panel Browser Diagnostics URL Workflow Rows + +继续按本文件铁律推进:虚拟 HAL 的功能完全来源于 LinuxCNC 源程序,并且虚拟 HAL +完全满足 Web 方式数控系统仿真系统。本批完成上一节下一步第 1 项,把 browser +diagnostics artifact 的 URL workflow 接入 ini-panel workflow overview,使 release readiness +页面可显示 browser diagnostics validation rows,并能把 Web 仿真的 virtual HAL source +coverage、command fixtures、motion matrix evidence 纳入 release artifact URL workflow。 + +新增实质能力: + +- `loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl()` 新增: + - `diagnosticsUrl` 参数; + - `diagnosticsHttpStatus`; + - `diagnosticsError`; + - `diagnosticsValidation`; + - `urlWorkflow`; +- ini-panel release artifact URL workflow 现在复用 SDK + `loadProjectReleaseReadinessArtifactUrlWorkflow()`: + - 同时 fetch project release readiness artifact; + - 可选 fetch browser real simulation diagnostics artifact; + - 使用 release 级 diagnostics validation; + - 保留原 ini-panel artifact display/mount workflow; +- workflow summary rows 新增: + - `diagnostics-url`; + - `browser-diagnostics`; + - `diagnostics-status`; +- render/mount workflow rows 现在能显示 browser diagnostics validation 结果; +- SDK `createProjectReleaseReadinessArtifactJsonWorkflow()` 保留 parsed artifact object, + 供 ini-panel URL workflow 继续生成原有 gate execution summary 与 artifact display。 + +新增/扩展验证: + +- `verify_ini_panel_ui_shell.mjs` 覆盖: + - 构造 browser diagnostics artifact; + - URL workflow 同时传入 release artifact URL 与 diagnostics URL; + - diagnostics HTTP status 为 200; + - diagnostics validation ready; + - summary rows 中 `browser-diagnostics` 为 ready; + - render rows 包含 `browser-diagnostics`; + - URL workflow render/mount row count 包含 diagnostics rows; +- `ini_panel_workflow_overview_smoke.html` 覆盖: + - workflow overview browser API 调用 diagnostics URL workflow; + - browser diagnostics artifact validation ready; + - render rows 包含 browser diagnostics row; + - workflow overview DOM mount 成功; +- `verify_project_release_artifact_url_workflow.sh` 继续覆盖 SDK URL workflow; +- `verify_sdk_surface.sh` 聚合覆盖 SDK/API surface。 + +关键验证: + +```text +ini_panel_ui_shell_node_smoke=ok +browser_ini_opfs_smoke=ok +browser_ini_control_page_smoke=ok +browser_ini_launch_smoke=ok +browser_ini_workflow_overview_smoke=ok +browser_ini_shell_integration_workflow_smoke=ok +project_release_artifact_url_workflow_node_smoke=ok +sdk_surface_node_smoke=ok +project_release_gate_manifest_node_smoke=ok +project_batch_acceptance_workflow_node_smoke=ok +project_batch_acceptance_artifact_node_smoke=ok +git diff --check ok +``` + +语义边界: + +- 本批没有新增 G-code/interpreter/planner/kinematics 语义; +- ini-panel workflow overview 只显示和验证 browser diagnostics artifact 中已有的 virtual + HAL source evidence; +- virtual HAL 仍不声称提供 Linux kernel hard-realtime ABI、外部硬件驱动 ABI 或 native + HAL module ABI; +- Web 仿真 HAL 的满足性现在可以在 release readiness 页面被直接查看和验证。 + +下一步工作内容: + +1. 扩展 motion matrix 与 LinuxCNC sim configs 的关联,把 external-offsets、QtDragon + multi-joint、vismach remap sims 的 motion source evidence 显式映射到 matrix fixture rows。 +2. 将 real simulation page 的 virtual HAL session snapshot 与 release diagnostics artifact + 做联动,使保存的 Web CNC 仿真会话可直接输出 release-ready diagnostics evidence。 +3. 将 ini-panel workflow overview 的 diagnostics URL workflow 接入固定页面表单/按钮, + 让用户可在页面上输入 release artifact URL 与 browser diagnostics URL 后直接运行验证。 diff --git a/wasm-port/runtime/sdk/src/project-release-readiness.js b/wasm-port/runtime/sdk/src/project-release-readiness.js index 69e8f27..9280f63 100644 --- a/wasm-port/runtime/sdk/src/project-release-readiness.js +++ b/wasm-port/runtime/sdk/src/project-release-readiness.js @@ -1718,6 +1718,7 @@ export function createProjectReleaseReadinessArtifactJsonWorkflow({ artifactJson ready: validation.ready === true, parsed: true, parseError: null, + artifact, artifactApiName: validation.artifactApiName, validation, summaryViewModel, diff --git a/wasm-port/runtime/ui/ini-panel/ui-shell.js b/wasm-port/runtime/ui/ini-panel/ui-shell.js index dbf6182..8a46649 100644 --- a/wasm-port/runtime/ui/ini-panel/ui-shell.js +++ b/wasm-port/runtime/ui/ini-panel/ui-shell.js @@ -38,6 +38,7 @@ import { createProjectReleaseReadinessArtifactValidation, createProjectReleaseReadinessArtifactValidationActionPlan, createProjectReleaseReadinessArtifactValidationSummaryViewModel, + loadProjectReleaseReadinessArtifactUrlWorkflow, parseProjectReleaseReadinessArtifactJson, } from "../../sdk/src/project-release-readiness.js"; export { @@ -88,6 +89,7 @@ export { createProjectReleaseReadinessArtifactValidation, createProjectReleaseReadinessArtifactValidationActionPlan, createProjectReleaseReadinessArtifactValidationSummaryViewModel, + loadProjectReleaseReadinessArtifactUrlWorkflow, parseProjectReleaseReadinessArtifactJson, } from "../../sdk/src/project-release-readiness.js"; @@ -2344,6 +2346,7 @@ export function mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWo export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({ artifactUrl = "", + diagnosticsUrl = "", fetchRef = globalThis.fetch, mount = false, mountOptions = {}, @@ -2363,10 +2366,14 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU phase: "blocked", ready: false, artifactUrl, + diagnosticsUrl, httpStatus: null, + diagnosticsHttpStatus: null, missing, error: null, + diagnosticsError: null, validation: null, + diagnosticsValidation: null, validationSummaryViewModel: null, gateExecutionSummaryViewModel: null, actionPlan, @@ -2378,35 +2385,45 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU } try { - const response = await fetchRef(artifactUrl); - const httpStatus = response?.status ?? null; - if (!response?.ok) { - const actionPlan = createProjectReleaseReadinessArtifactUrlWorkflowActionPlan({ - ready: false, - missing: ["artifact-fetch"], - }); + const urlWorkflow = await loadProjectReleaseReadinessArtifactUrlWorkflow({ + artifactUrl, + diagnosticsUrl, + fetchRef, + }); + const httpStatus = urlWorkflow.httpStatus; + if (urlWorkflow.fetched !== true || urlWorkflow.jsonWorkflow?.parsed !== true) { + const actionPlan = createProjectReleaseReadinessArtifactUrlWorkflowActionPlan(urlWorkflow); + const error = urlWorkflow.fetchError + ?? urlWorkflow.jsonWorkflow?.parseError + ?? (httpStatus ? `HTTP ${httpStatus}` : "artifact URL workflow blocked"); return { apiName: "ini-panel-shell-workflow-overview-release-readiness-artifact-url-workflow", workflowVersion: 1, phase: "blocked", ready: false, artifactUrl, + diagnosticsUrl, httpStatus, - missing: ["artifact-url"], - error: `HTTP ${httpStatus ?? "error"}`, + diagnosticsHttpStatus: urlWorkflow.diagnosticsHttpStatus ?? null, + missing: urlWorkflow.missing ?? ["artifact-url"], + error, + diagnosticsError: urlWorkflow.diagnosticsFetchError ?? null, validation: null, + diagnosticsValidation: urlWorkflow.diagnosticsValidation ?? null, validationSummaryViewModel: null, gateExecutionSummaryViewModel: null, actionPlan, displayViewModel: null, renderState: null, mountResult: null, - statusLine: `Blocked: HTTP ${httpStatus ?? "error"}`, + urlWorkflow, + statusLine: httpStatus && urlWorkflow.fetchError ? `Blocked: HTTP ${httpStatus}` : `Blocked: ${error}`, }; } - const artifactJson = await response.text(); - const validation = validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(artifactJson); + const validation = validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson( + JSON.stringify(urlWorkflow.jsonWorkflow.artifact), + ); const gateExecutionSummaryViewModel = createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryViewModel( validation, @@ -2432,9 +2449,15 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU : []; const workflowMissing = [ ...validation.missing, + ...(urlWorkflow.diagnosticsUrl && urlWorkflow.diagnosticsValidation?.ready !== true + ? (urlWorkflow.diagnosticsValidation?.missing ?? ["browser-diagnostics"]) + .map((item) => `diagnostics.${item}`) + : []), ...mountMissing, ]; - const ready = validation.ready === true && (!mount || mountResult?.ready === true); + const ready = validation.ready === true && + (!urlWorkflow.diagnosticsUrl || urlWorkflow.diagnosticsValidation?.ready === true) && + (!mount || mountResult?.ready === true); const validationActionPlan = createProjectReleaseReadinessArtifactValidationActionPlan( validation.validation, ); @@ -2449,16 +2472,21 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU phase: ready ? "ready" : "blocked", ready, artifactUrl, + diagnosticsUrl, httpStatus, + diagnosticsHttpStatus: urlWorkflow.diagnosticsHttpStatus ?? null, missing: workflowMissing, error: null, + diagnosticsError: urlWorkflow.diagnosticsFetchError ?? null, validation, + diagnosticsValidation: urlWorkflow.diagnosticsValidation ?? null, validationSummaryViewModel, gateExecutionSummaryViewModel, actionPlan, displayViewModel, renderState, mountResult, + urlWorkflow, statusLine: ready ? renderState.statusLine : `Blocked: ${workflowMissing.join(", ")}`, }; } catch (error) { @@ -2472,10 +2500,14 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU phase: "blocked", ready: false, artifactUrl, + diagnosticsUrl, httpStatus: null, + diagnosticsHttpStatus: null, missing: ["artifact-url"], error: error?.message ?? String(error), + diagnosticsError: null, validation: null, + diagnosticsValidation: null, validationSummaryViewModel: null, gateExecutionSummaryViewModel: null, actionPlan, @@ -2516,6 +2548,23 @@ export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWo label: "HTTP status", value: workflow?.httpStatus == null ? "none" : String(workflow.httpStatus), }, + { + id: "diagnostics-url", + label: "Diagnostics URL", + value: workflow?.diagnosticsUrl || "not requested", + }, + { + id: "browser-diagnostics", + label: "Browser diagnostics", + value: workflow?.diagnosticsUrl + ? (workflow?.diagnosticsValidation?.ready === true ? "ready" : "blocked") + : "not requested", + }, + { + id: "diagnostics-status", + label: "Diagnostics HTTP status", + value: workflow?.diagnosticsHttpStatus == null ? "none" : String(workflow.diagnosticsHttpStatus), + }, { id: "validation-summary", label: "Validation summary", 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 3fb2097..c8986e7 100644 --- a/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html +++ b/wasm-port/tests/browser/ini_panel_workflow_overview_smoke.html @@ -7,6 +7,15 @@
running