新增 INI 面板 session readiness workflow report

This commit is contained in:
2026-06-16 07:04:04 +08:00
parent eb50e6b455
commit ce3d08ef61
12 changed files with 225 additions and 5 deletions

View File

@@ -9,7 +9,7 @@ turn-by-turn continuation notes and next-batch execution records.
## Current Status ## Current Status
- Active continuation file: `text14.txt` - Active continuation file: `text14.txt`
- Latest completed batch: INI panel shell workflow session readiness display - Latest completed batch: INI panel session readiness workflow report
- Latest relevant commit: use `git log -1 --oneline` after each committed batch - Latest relevant commit: use `git log -1 --oneline` after each committed batch
- Working tree at tracker creation: clean - Working tree at tracker creation: clean
- Required policy: LinuxCNC remains the only CNC semantic source - 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`. | | 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 `docs/opfs-session-persistence.md` defines the project-level release gate. | | OPFS/session persistence | Stable for current scope | Browser smoke passes, SDK re-exports OPFS/session helpers including `readMachineSessionReadiness()`, 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, and INI panel shell/workflow overview helpers with a Node surface smoke. | | SDK/API surface | Stable for current scope | SDK re-exports core, OPFS/session readiness/load helpers, sim-config staging, and INI panel shell/workflow overview helpers 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 and render OPFS/session readiness 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, and report OPFS/session readiness 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. | | 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. | | 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, and tracker acceptance paths. | | 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, and tracker acceptance paths. |

View File

@@ -1908,3 +1908,81 @@ host_wasm_opfs_browser_smokes=ok
继续以实质能力推进为主。下一批可为 `sessionReadiness` display row 增加独立 machine-readable 继续以实质能力推进为主。下一批可为 `sessionReadiness` display row 增加独立 machine-readable
workflow report/helper或者把同一展示能力接入 workflow overview 页面自身;仍保持只读,不新增控制按钮, workflow report/helper或者把同一展示能力接入 workflow overview 页面自身;仍保持只读,不新增控制按钮,
不解析 G-code不扩大 LinuxCNC 语义边界。 不解析 G-code不扩大 LinuxCNC 语义边界。
二十四、2026-06-16 继续执行记录INI panel session readiness workflow report
本轮继续以功能实质性推进为主,为上一批 `sessionReadiness` display row 增加独立 machine-readable
workflow report/helper并暴露到 launch API 与 workflow overview 页面 API。外部 shell 现在可以直接读取
session readiness phase、missing reasons 和稳定 rows不需要解析 display row 文本。
完成内容:
- `wasm-port/runtime/ui/ini-panel/ui-shell.js` 新增
`createIniPanelShellSessionReadinessWorkflowReport()`
- report 返回:
- `apiName`
- `reportVersion`
- `phase`
- `ready`
- `statusLine`
- `sessionReadiness`
- `missing`
- `rows`
- report 支持从 `workflowSummary.sessionReadiness` 或
`readonlyStatusResult.readonlyStatus.sessionReadiness` 抽取 ready/blocked 状态;
- `createIniPanelShellViewModel()` 暴露:
- `shellSessionReadinessWorkflowReport`
- `createShellSessionReadinessWorkflowReport`
- `createIniPanelLaunchApiManifest().methods` 新增
`getShellSessionReadinessWorkflowReport`
- `runtime/ui/ini-panel/launch.html` 暴露
`linuxCncIniPanelLaunchApi.getShellSessionReadinessWorkflowReport()`
- `createIniPanelShellWorkflowOverviewContract().methodNames` 新增
`getWorkflowOverviewSessionReadinessReport`
- `runtime/ui/ini-panel/workflow-overview.html` 暴露
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewSessionReadinessReport()`
- `docs/panel-entry.md` 记录新 helper 与两个 browser API 入口;
- Node 测试覆盖 ui-shell helper、launch manifest、shell integration manifest 和 docs drift
- Browser smoke 覆盖 launch API、workflow overview iframe API、shell integration workflow API
- 未新增控制按钮;
- 未执行 action-plan
- 未解析 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。
验证已通过:
```bash
git diff --check
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
ui_node_smokes=ok
browser_ini_launch_smoke=ok
browser_ini_workflow_overview_smoke=ok
browser_ini_shell_integration_workflow_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
下一步工作计划:
继续以实质能力推进为主。下一批可把 session readiness workflow report 纳入 SDK surface 或 release
handoff docs 的 API surface 表,方便外部调用者从 SDK/文档直接发现;仍保持只读,不新增控制按钮,
不解析 G-code不扩大 LinuxCNC 语义边界。

View File

@@ -41,6 +41,7 @@ import {
mountIniPanelShellSessionHandoff, mountIniPanelShellSessionHandoff,
mountIniPanelShellSessionHandoffFromControlPage, mountIniPanelShellSessionHandoffFromControlPage,
createIniPanelShellSessionHandoffWorkflowSummary, createIniPanelShellSessionHandoffWorkflowSummary,
createIniPanelShellSessionReadinessWorkflowReport,
createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowRenderState,
createIniPanelShellSessionHandoffWorkflowDomContract, createIniPanelShellSessionHandoffWorkflowDomContract,
@@ -295,6 +296,13 @@ the expected handoff status fields as a structured ready/blocked result. Use
outer shell needs one stable end-to-end summary that combines mount workflow, outer shell needs one stable end-to-end summary that combines mount workflow,
control-page mount workflow, readonly status result, machine-session control-page mount workflow, readonly status result, machine-session
ready/blocked state, and current blocking reasons into display rows. Use ready/blocked state, and current blocking reasons into display rows. Use
`createIniPanelShellSessionReadinessWorkflowReport()` or
`linuxCncIniPanelLaunchApi.getShellSessionReadinessWorkflowReport()` when an
outer shell needs a machine-readable report for just the session readiness
phase, missing reasons, and stable rows. The workflow overview page exposes
the same report through
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewSessionReadinessReport()`.
Use
`createIniPanelShellSessionHandoffWorkflowDisplayViewModel()` or `createIniPanelShellSessionHandoffWorkflowDisplayViewModel()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffWorkflowDisplayViewModel()` `linuxCncIniPanelLaunchApi.getShellSessionHandoffWorkflowDisplayViewModel()`
when an outer shell needs that end-to-end summary compressed into stable when an outer shell needs that end-to-end summary compressed into stable

View File

@@ -117,6 +117,7 @@
mountIniPanelShellSessionHandoffFromControlPage, mountIniPanelShellSessionHandoffFromControlPage,
readIniPanelShellSessionHandoffStatusFromControlPage, readIniPanelShellSessionHandoffStatusFromControlPage,
createIniPanelShellSessionHandoffWorkflowSummary, createIniPanelShellSessionHandoffWorkflowSummary,
createIniPanelShellSessionReadinessWorkflowReport,
createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowRenderState,
createIniPanelShellSessionHandoffWorkflowDomContract, createIniPanelShellSessionHandoffWorkflowDomContract,
@@ -245,6 +246,11 @@
}), }),
}) })
), ),
getShellSessionReadinessWorkflowReport: (options) => (
createIniPanelShellSessionReadinessWorkflowReport(options ?? {
workflowSummary: shellViewModel.shellSessionHandoffWorkflowSummary,
})
),
getShellSessionHandoffWorkflowDisplayViewModel: (options) => ( getShellSessionHandoffWorkflowDisplayViewModel: (options) => (
createIniPanelShellSessionHandoffWorkflowDisplayViewModel( createIniPanelShellSessionHandoffWorkflowDisplayViewModel(
options ?? shellViewModel.shellSessionHandoffWorkflowSummary, options ?? shellViewModel.shellSessionHandoffWorkflowSummary,

View File

@@ -160,6 +160,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr
"mountShellSessionHandoffFromControlPage", "mountShellSessionHandoffFromControlPage",
"readShellSessionHandoffStatusFromControlPage", "readShellSessionHandoffStatusFromControlPage",
"getShellSessionHandoffWorkflowSummary", "getShellSessionHandoffWorkflowSummary",
"getShellSessionReadinessWorkflowReport",
"getShellSessionHandoffWorkflowDisplayViewModel", "getShellSessionHandoffWorkflowDisplayViewModel",
"getShellSessionHandoffWorkflowRenderState", "getShellSessionHandoffWorkflowRenderState",
"getShellSessionHandoffWorkflowDomContract", "getShellSessionHandoffWorkflowDomContract",
@@ -1548,6 +1549,60 @@ export function createIniPanelShellSessionHandoffWorkflowDisplayViewModel(
}; };
} }
export function createIniPanelShellSessionReadinessWorkflowReport({
workflowSummary = null,
readonlyStatusResult = null,
} = {}) {
const sessionReadiness = workflowSummary?.sessionReadiness
?? readonlyStatusResult?.readonlyStatus?.sessionReadiness
?? null;
const missing = Array.isArray(sessionReadiness?.missing)
? [...sessionReadiness.missing]
: [];
const ready = sessionReadiness?.ready === true;
const phase = sessionReadiness ? (ready ? "ready" : "blocked") : "blocked";
const statusLine = sessionReadiness
? (
ready
? "Ready: session readiness available"
: `Blocked: ${missing.length > 0 ? missing.join(", ") : "session readiness blocked"}`
)
: "Blocked: session readiness unavailable";
return {
apiName: "ini-panel-shell-session-readiness-workflow-report",
reportVersion: 1,
phase,
ready,
statusLine,
sessionReadiness: sessionReadiness
? {
phase: sessionReadiness.phase ?? phase,
ready,
missing,
}
: null,
missing,
rows: [
{
id: "session-readiness",
label: "Session readiness",
value: sessionReadiness ? (ready ? "ready" : "blocked") : "missing",
},
{
id: "session-readiness-phase",
label: "Session readiness phase",
value: sessionReadiness?.phase ?? "missing",
},
{
id: "session-readiness-missing",
label: "Session readiness missing",
value: missing.length > 0 ? missing.join(", ") : "none",
},
],
};
}
export function createIniPanelShellSessionHandoffWorkflowRenderState( export function createIniPanelShellSessionHandoffWorkflowRenderState(
displayViewModel = createIniPanelShellSessionHandoffWorkflowDisplayViewModel(), displayViewModel = createIniPanelShellSessionHandoffWorkflowDisplayViewModel(),
) { ) {
@@ -1615,6 +1670,7 @@ export function createIniPanelShellWorkflowOverviewContract() {
"getWorkflowOverviewRenderState", "getWorkflowOverviewRenderState",
"getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewDisplayViewModel",
"getWorkflowOverviewSummary", "getWorkflowOverviewSummary",
"getWorkflowOverviewSessionReadinessReport",
"getWorkflowOverviewDomContract", "getWorkflowOverviewDomContract",
"getWorkflowOverviewDomReadiness", "getWorkflowOverviewDomReadiness",
"renderWorkflowOverview", "renderWorkflowOverview",
@@ -2521,6 +2577,9 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries
handoffSummary: shellSessionHandoffSummary, handoffSummary: shellSessionHandoffSummary,
}), }),
}); });
const shellSessionReadinessWorkflowReport = createIniPanelShellSessionReadinessWorkflowReport({
workflowSummary: shellSessionHandoffWorkflowSummary,
});
const shellSessionHandoffWorkflowDisplayViewModel = createIniPanelShellSessionHandoffWorkflowDisplayViewModel( const shellSessionHandoffWorkflowDisplayViewModel = createIniPanelShellSessionHandoffWorkflowDisplayViewModel(
shellSessionHandoffWorkflowSummary, shellSessionHandoffWorkflowSummary,
); );
@@ -2558,6 +2617,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries
shellSessionHandoffPackageMountRenderState, shellSessionHandoffPackageMountRenderState,
shellSessionHandoffMountDomContract, shellSessionHandoffMountDomContract,
shellSessionHandoffWorkflowSummary, shellSessionHandoffWorkflowSummary,
shellSessionReadinessWorkflowReport,
shellSessionHandoffWorkflowDisplayViewModel, shellSessionHandoffWorkflowDisplayViewModel,
shellSessionHandoffWorkflowRenderState, shellSessionHandoffWorkflowRenderState,
shellSessionHandoffWorkflowDomContract, shellSessionHandoffWorkflowDomContract,
@@ -2591,6 +2651,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries
mountShellSessionHandoffFromControlPage: mountIniPanelShellSessionHandoffFromControlPage, mountShellSessionHandoffFromControlPage: mountIniPanelShellSessionHandoffFromControlPage,
readShellSessionHandoffStatusFromControlPage: readIniPanelShellSessionHandoffStatusFromControlPage, readShellSessionHandoffStatusFromControlPage: readIniPanelShellSessionHandoffStatusFromControlPage,
createShellSessionHandoffWorkflowSummary: createIniPanelShellSessionHandoffWorkflowSummary, createShellSessionHandoffWorkflowSummary: createIniPanelShellSessionHandoffWorkflowSummary,
createShellSessionReadinessWorkflowReport: createIniPanelShellSessionReadinessWorkflowReport,
createShellSessionHandoffWorkflowDisplayViewModel: createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createShellSessionHandoffWorkflowDisplayViewModel: createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
createShellSessionHandoffWorkflowRenderState: createIniPanelShellSessionHandoffWorkflowRenderState, createShellSessionHandoffWorkflowRenderState: createIniPanelShellSessionHandoffWorkflowRenderState,
createShellSessionHandoffWorkflowDomContract: createIniPanelShellSessionHandoffWorkflowDomContract, createShellSessionHandoffWorkflowDomContract: createIniPanelShellSessionHandoffWorkflowDomContract,

View File

@@ -87,6 +87,7 @@
createIniPanelShellSessionHandoffWorkflowDomContract, createIniPanelShellSessionHandoffWorkflowDomContract,
createIniPanelShellSessionHandoffWorkflowDomReadiness, createIniPanelShellSessionHandoffWorkflowDomReadiness,
createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowRenderState,
createIniPanelShellSessionReadinessWorkflowReport,
createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewContract,
createIniPanelShellWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewReadiness,
createIniPanelShellWorkflowOverviewEmbeddingReport, createIniPanelShellWorkflowOverviewEmbeddingReport,
@@ -115,6 +116,11 @@
getWorkflowOverviewRenderState: () => shellViewModel.shellSessionHandoffWorkflowRenderState, getWorkflowOverviewRenderState: () => shellViewModel.shellSessionHandoffWorkflowRenderState,
getWorkflowOverviewDisplayViewModel: () => shellViewModel.shellSessionHandoffWorkflowDisplayViewModel, getWorkflowOverviewDisplayViewModel: () => shellViewModel.shellSessionHandoffWorkflowDisplayViewModel,
getWorkflowOverviewSummary: () => shellViewModel.shellSessionHandoffWorkflowSummary, getWorkflowOverviewSummary: () => shellViewModel.shellSessionHandoffWorkflowSummary,
getWorkflowOverviewSessionReadinessReport: (options) => (
createIniPanelShellSessionReadinessWorkflowReport(options ?? {
workflowSummary: shellViewModel.shellSessionHandoffWorkflowSummary,
})
),
getWorkflowOverviewDomContract: (options) => ( getWorkflowOverviewDomContract: (options) => (
createIniPanelShellSessionHandoffWorkflowDomContract(options) createIniPanelShellSessionHandoffWorkflowDomContract(options)
), ),

View File

@@ -99,6 +99,7 @@
!launchApi?.getShellSessionHandoffPackageMountState || !launchApi?.getShellSessionHandoffPackageMountState ||
!launchApi?.getShellSessionHandoffPackageMountDisplayViewModel || !launchApi?.getShellSessionHandoffPackageMountDisplayViewModel ||
!launchApi?.getShellSessionHandoffPackageMountRenderState || !launchApi?.getShellSessionHandoffPackageMountRenderState ||
!launchApi?.getShellSessionReadinessWorkflowReport ||
!launchApi?.renderShellSessionHandoffMountState || !launchApi?.renderShellSessionHandoffMountState ||
!launchApi?.getWorkflowOverviewContract || !launchApi?.getWorkflowOverviewContract ||
!launchApi?.getWorkflowOverviewReadiness || !launchApi?.getWorkflowOverviewReadiness ||
@@ -178,6 +179,7 @@
const shellSessionHandoffPackageMountState = launchApi.getShellSessionHandoffPackageMountState(); const shellSessionHandoffPackageMountState = launchApi.getShellSessionHandoffPackageMountState();
const shellSessionHandoffPackageMountDisplayViewModel = launchApi.getShellSessionHandoffPackageMountDisplayViewModel(); const shellSessionHandoffPackageMountDisplayViewModel = launchApi.getShellSessionHandoffPackageMountDisplayViewModel();
const shellSessionHandoffPackageMountRenderState = launchApi.getShellSessionHandoffPackageMountRenderState(); const shellSessionHandoffPackageMountRenderState = launchApi.getShellSessionHandoffPackageMountRenderState();
const shellSessionReadinessWorkflowReport = launchApi.getShellSessionReadinessWorkflowReport();
const workflowOverviewContract = launchApi.getWorkflowOverviewContract(); const workflowOverviewContract = launchApi.getWorkflowOverviewContract();
assertEqual( assertEqual(
shellIntegrationSchema.manifestVersion, shellIntegrationSchema.manifestVersion,
@@ -424,6 +426,16 @@
"Blocked: session-load-state", "Blocked: session-load-state",
"shell session handoff package mount render-state status", "shell session handoff package mount render-state status",
); );
assertEqual(
shellSessionReadinessWorkflowReport.apiName,
"ini-panel-shell-session-readiness-workflow-report",
"shell session readiness workflow report API",
);
assertEqual(
shellSessionReadinessWorkflowReport.rows.length,
3,
"shell session readiness workflow report rows",
);
assertEqual( assertEqual(
workflowOverviewContract.pageHref, workflowOverviewContract.pageHref,
"./workflow-overview.html", "./workflow-overview.html",

View File

@@ -100,6 +100,7 @@ TOOL_TABLE = browser-shell-tool.tbl
!launchApi?.mountShellSessionHandoffFromControlPage || !launchApi?.mountShellSessionHandoffFromControlPage ||
!launchApi?.readShellSessionHandoffStatusFromControlPage || !launchApi?.readShellSessionHandoffStatusFromControlPage ||
!launchApi?.getShellSessionHandoffWorkflowSummary || !launchApi?.getShellSessionHandoffWorkflowSummary ||
!launchApi?.getShellSessionReadinessWorkflowReport ||
!launchApi?.getShellSessionHandoffWorkflowDisplayViewModel || !launchApi?.getShellSessionHandoffWorkflowDisplayViewModel ||
!launchApi?.getShellSessionHandoffWorkflowRenderState || !launchApi?.getShellSessionHandoffWorkflowRenderState ||
!launchApi?.getShellSessionHandoffWorkflowDomContract || !launchApi?.getShellSessionHandoffWorkflowDomContract ||
@@ -511,6 +512,9 @@ TOOL_TABLE = browser-shell-tool.tbl
controlPageMountWorkflow: readyControlPageMountWorkflow, controlPageMountWorkflow: readyControlPageMountWorkflow,
readonlyStatusResult, readonlyStatusResult,
}); });
const sessionReadinessWorkflowReport = launchApi.getShellSessionReadinessWorkflowReport({
workflowSummary: workflowSummaryResult,
});
const workflowDisplayResult = launchApi.getShellSessionHandoffWorkflowDisplayViewModel( const workflowDisplayResult = launchApi.getShellSessionHandoffWorkflowDisplayViewModel(
workflowSummaryResult, workflowSummaryResult,
); );
@@ -548,6 +552,16 @@ TOOL_TABLE = browser-shell-tool.tbl
); );
assertEqual(workflowSummaryResult.phase, "ready", "shell handoff workflow summary phase"); assertEqual(workflowSummaryResult.phase, "ready", "shell handoff workflow summary phase");
assertEqual(workflowSummaryResult.ready, true, "shell handoff workflow summary readiness"); assertEqual(workflowSummaryResult.ready, true, "shell handoff workflow summary readiness");
assertEqual(
sessionReadinessWorkflowReport.ready,
true,
"shell handoff session readiness workflow report",
);
assertEqual(
sessionReadinessWorkflowReport.rows.length,
3,
"shell handoff session readiness workflow report rows",
);
assertEqual( assertEqual(
workflowSummaryResult.sessionReadiness.ready, workflowSummaryResult.sessionReadiness.ready,
true, true,

View File

@@ -31,6 +31,7 @@
!workflowApi?.getWorkflowOverviewRenderState || !workflowApi?.getWorkflowOverviewRenderState ||
!workflowApi?.getWorkflowOverviewDisplayViewModel || !workflowApi?.getWorkflowOverviewDisplayViewModel ||
!workflowApi?.getWorkflowOverviewSummary || !workflowApi?.getWorkflowOverviewSummary ||
!workflowApi?.getWorkflowOverviewSessionReadinessReport ||
!workflowApi?.getWorkflowOverviewDomContract || !workflowApi?.getWorkflowOverviewDomContract ||
!workflowApi?.getWorkflowOverviewDomReadiness || !workflowApi?.getWorkflowOverviewDomReadiness ||
!workflowApi?.renderWorkflowOverview || !workflowApi?.renderWorkflowOverview ||
@@ -56,6 +57,7 @@
const renderState = workflowApi.getWorkflowOverviewRenderState(); const renderState = workflowApi.getWorkflowOverviewRenderState();
const displayViewModel = workflowApi.getWorkflowOverviewDisplayViewModel(); const displayViewModel = workflowApi.getWorkflowOverviewDisplayViewModel();
const summary = workflowApi.getWorkflowOverviewSummary(); const summary = workflowApi.getWorkflowOverviewSummary();
const sessionReadinessReport = workflowApi.getWorkflowOverviewSessionReadinessReport();
const domContract = workflowApi.getWorkflowOverviewDomContract(); const domContract = workflowApi.getWorkflowOverviewDomContract();
const domReadiness = workflowApi.getWorkflowOverviewDomReadiness(); const domReadiness = workflowApi.getWorkflowOverviewDomReadiness();
const renderResult = workflowApi.renderWorkflowOverview(); const renderResult = workflowApi.renderWorkflowOverview();
@@ -78,6 +80,12 @@
const embeddingDomReadiness = workflowApi.getWorkflowOverviewEmbeddingDomReadiness(); const embeddingDomReadiness = workflowApi.getWorkflowOverviewEmbeddingDomReadiness();
assertEqual(summary.summaryVersion, 1, "workflow overview summary version"); assertEqual(summary.summaryVersion, 1, "workflow overview summary version");
assertEqual(
sessionReadinessReport.apiName,
"ini-panel-shell-session-readiness-workflow-report",
"workflow overview session readiness report API name",
);
assertEqual(sessionReadinessReport.rows.length, 3, "workflow overview session readiness report rows");
assertEqual(displayViewModel.title, "Shell handoff workflow", "workflow overview display title"); assertEqual(displayViewModel.title, "Shell handoff workflow", "workflow overview display title");
assertEqual(renderState.renderStateVersion, 1, "workflow overview render-state version"); assertEqual(renderState.renderStateVersion, 1, "workflow overview render-state version");
assertEqual(renderState.dataset.handoffScope, "workflow", "workflow overview render-state scope"); assertEqual(renderState.dataset.handoffScope, "workflow", "workflow overview render-state scope");

View File

@@ -70,6 +70,7 @@ assert.deepEqual(manifest, {
"mountShellSessionHandoffFromControlPage", "mountShellSessionHandoffFromControlPage",
"readShellSessionHandoffStatusFromControlPage", "readShellSessionHandoffStatusFromControlPage",
"getShellSessionHandoffWorkflowSummary", "getShellSessionHandoffWorkflowSummary",
"getShellSessionReadinessWorkflowReport",
"getShellSessionHandoffWorkflowDisplayViewModel", "getShellSessionHandoffWorkflowDisplayViewModel",
"getShellSessionHandoffWorkflowRenderState", "getShellSessionHandoffWorkflowRenderState",
"getShellSessionHandoffWorkflowDomContract", "getShellSessionHandoffWorkflowDomContract",
@@ -226,6 +227,7 @@ assert.match(launchText, /\bmountShellSessionHandoff\b/);
assert.match(launchText, /\bmountShellSessionHandoffFromControlPage\b/); assert.match(launchText, /\bmountShellSessionHandoffFromControlPage\b/);
assert.match(launchText, /\breadShellSessionHandoffStatusFromControlPage\b/); assert.match(launchText, /\breadShellSessionHandoffStatusFromControlPage\b/);
assert.match(launchText, /\bgetShellSessionHandoffWorkflowSummary\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowSummary\b/);
assert.match(launchText, /\bgetShellSessionReadinessWorkflowReport\b/);
assert.match(launchText, /\bgetShellSessionHandoffWorkflowDisplayViewModel\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowDisplayViewModel\b/);
assert.match(launchText, /\bgetShellSessionHandoffWorkflowRenderState\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowRenderState\b/);
assert.match(launchText, /\bgetShellSessionHandoffWorkflowDomContract\b/); assert.match(launchText, /\bgetShellSessionHandoffWorkflowDomContract\b/);

View File

@@ -29,6 +29,7 @@ import {
mountIniPanelShellSessionHandoffFromControlPage, mountIniPanelShellSessionHandoffFromControlPage,
readIniPanelShellSessionHandoffStatusFromControlPage, readIniPanelShellSessionHandoffStatusFromControlPage,
createIniPanelShellSessionHandoffWorkflowSummary, createIniPanelShellSessionHandoffWorkflowSummary,
createIniPanelShellSessionReadinessWorkflowReport,
createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowRenderState,
createIniPanelShellSessionHandoffWorkflowDomContract, createIniPanelShellSessionHandoffWorkflowDomContract,
@@ -177,7 +178,7 @@ assert.deepEqual(readiness, {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 55, launchMethods: 56,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },
@@ -240,7 +241,7 @@ assert.deepEqual(handoffSummary, {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 55, launchMethods: 56,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },
@@ -745,6 +746,7 @@ assert.equal(
createIniPanelShellSessionHandoffWorkflowSummary().phase, createIniPanelShellSessionHandoffWorkflowSummary().phase,
"blocked", "blocked",
); );
assert.equal(createIniPanelShellSessionReadinessWorkflowReport().phase, "blocked");
assert.equal( assert.equal(
createIniPanelShellSessionHandoffWorkflowDisplayViewModel().phase, createIniPanelShellSessionHandoffWorkflowDisplayViewModel().phase,
"blocked", "blocked",
@@ -773,6 +775,7 @@ assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), {
"getWorkflowOverviewRenderState", "getWorkflowOverviewRenderState",
"getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewDisplayViewModel",
"getWorkflowOverviewSummary", "getWorkflowOverviewSummary",
"getWorkflowOverviewSessionReadinessReport",
"getWorkflowOverviewDomContract", "getWorkflowOverviewDomContract",
"getWorkflowOverviewDomReadiness", "getWorkflowOverviewDomReadiness",
"renderWorkflowOverview", "renderWorkflowOverview",
@@ -814,6 +817,7 @@ assert.deepEqual(
createIniPanelShellWorkflowOverviewReadiness({ createIniPanelShellWorkflowOverviewReadiness({
overviewApi: { overviewApi: {
getWorkflowOverviewRenderState: () => handoffPackageRenderState, getWorkflowOverviewRenderState: () => handoffPackageRenderState,
getWorkflowOverviewSessionReadinessReport: () => createIniPanelShellSessionReadinessWorkflowReport(),
}, },
}).missing, }).missing,
[ [
@@ -1238,7 +1242,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 55, launchMethods: 56,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },
@@ -1413,6 +1417,7 @@ assert.match(shellText, /\bexport function mountIniPanelShellSessionHandoff\b/);
assert.match(shellText, /\bexport function mountIniPanelShellSessionHandoffFromControlPage\b/); assert.match(shellText, /\bexport function mountIniPanelShellSessionHandoffFromControlPage\b/);
assert.match(shellText, /\bexport function readIniPanelShellSessionHandoffStatusFromControlPage\b/); assert.match(shellText, /\bexport function readIniPanelShellSessionHandoffStatusFromControlPage\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowSummary\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowSummary\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionReadinessWorkflowReport\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowDisplayViewModel\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowDisplayViewModel\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowRenderState\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowRenderState\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowDomContract\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffWorkflowDomContract\b/);

View File

@@ -29,6 +29,7 @@ import {
mountIniPanelShellSessionHandoffFromControlPage, mountIniPanelShellSessionHandoffFromControlPage,
readIniPanelShellSessionHandoffStatusFromControlPage, readIniPanelShellSessionHandoffStatusFromControlPage,
createIniPanelShellSessionHandoffWorkflowSummary, createIniPanelShellSessionHandoffWorkflowSummary,
createIniPanelShellSessionReadinessWorkflowReport,
createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
createIniPanelShellSessionHandoffWorkflowRenderState, createIniPanelShellSessionHandoffWorkflowRenderState,
createIniPanelShellSessionHandoffWorkflowDomContract, createIniPanelShellSessionHandoffWorkflowDomContract,
@@ -662,6 +663,7 @@ assert.deepEqual(shellViewModel.shellWorkflowOverviewContract, {
"getWorkflowOverviewRenderState", "getWorkflowOverviewRenderState",
"getWorkflowOverviewDisplayViewModel", "getWorkflowOverviewDisplayViewModel",
"getWorkflowOverviewSummary", "getWorkflowOverviewSummary",
"getWorkflowOverviewSessionReadinessReport",
"getWorkflowOverviewDomContract", "getWorkflowOverviewDomContract",
"getWorkflowOverviewDomReadiness", "getWorkflowOverviewDomReadiness",
"renderWorkflowOverview", "renderWorkflowOverview",
@@ -790,6 +792,10 @@ assert.equal(
shellViewModel.createShellSessionHandoffWorkflowSummary, shellViewModel.createShellSessionHandoffWorkflowSummary,
createIniPanelShellSessionHandoffWorkflowSummary, createIniPanelShellSessionHandoffWorkflowSummary,
); );
assert.equal(
shellViewModel.createShellSessionReadinessWorkflowReport,
createIniPanelShellSessionReadinessWorkflowReport,
);
assert.equal( assert.equal(
shellViewModel.createShellSessionHandoffWorkflowDisplayViewModel, shellViewModel.createShellSessionHandoffWorkflowDisplayViewModel,
createIniPanelShellSessionHandoffWorkflowDisplayViewModel, createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
@@ -1111,6 +1117,19 @@ assert.deepEqual(workflowSummaryResult.sessionReadiness, {
assert.equal(workflowSummaryResult.rows.find(({ id }) => id === "session-readiness")?.value, "ready"); assert.equal(workflowSummaryResult.rows.find(({ id }) => id === "session-readiness")?.value, "ready");
assert.equal(workflowSummaryResult.rows.length, 6); assert.equal(workflowSummaryResult.rows.length, 6);
assert.equal(workflowSummaryResult.blockingReasons[0], "mount:blocked"); assert.equal(workflowSummaryResult.blockingReasons[0], "mount:blocked");
const sessionReadinessWorkflowReport = createIniPanelShellSessionReadinessWorkflowReport({
workflowSummary: workflowSummaryResult,
});
assert.equal(sessionReadinessWorkflowReport.apiName, "ini-panel-shell-session-readiness-workflow-report");
assert.equal(sessionReadinessWorkflowReport.reportVersion, 1);
assert.equal(sessionReadinessWorkflowReport.phase, "ready");
assert.equal(sessionReadinessWorkflowReport.ready, true);
assert.equal(sessionReadinessWorkflowReport.statusLine, "Ready: session readiness available");
assert.deepEqual(sessionReadinessWorkflowReport.missing, []);
assert.equal(sessionReadinessWorkflowReport.rows.length, 3);
assert.equal(sessionReadinessWorkflowReport.rows[0].value, "ready");
assert.equal(shellViewModel.shellSessionReadinessWorkflowReport.ready, false);
assert.equal(shellViewModel.shellSessionReadinessWorkflowReport.rows.length, 3);
const readyWorkflowSummaryResult = createIniPanelShellSessionHandoffWorkflowSummary({ const readyWorkflowSummaryResult = createIniPanelShellSessionHandoffWorkflowSummary({
mountWorkflow: { mountWorkflow: {
phase: "ready", phase: "ready",
@@ -1230,6 +1249,7 @@ const workflowOverviewApi = {
getWorkflowOverviewRenderState: () => workflowRenderState, getWorkflowOverviewRenderState: () => workflowRenderState,
getWorkflowOverviewDisplayViewModel: () => workflowDisplayViewModel, getWorkflowOverviewDisplayViewModel: () => workflowDisplayViewModel,
getWorkflowOverviewSummary: () => workflowSummaryResult, getWorkflowOverviewSummary: () => workflowSummaryResult,
getWorkflowOverviewSessionReadinessReport: () => sessionReadinessWorkflowReport,
getWorkflowOverviewDomContract: createIniPanelShellSessionHandoffWorkflowDomContract, getWorkflowOverviewDomContract: createIniPanelShellSessionHandoffWorkflowDomContract,
getWorkflowOverviewDomReadiness: createIniPanelShellSessionHandoffWorkflowDomReadiness, getWorkflowOverviewDomReadiness: createIniPanelShellSessionHandoffWorkflowDomReadiness,
renderWorkflowOverview: renderIniPanelShellSessionHandoffWorkflowState, renderWorkflowOverview: renderIniPanelShellSessionHandoffWorkflowState,