# INI Panel Entry

This page is the short entry map for the INI panel UI shell.

For the project-level acceptance path that references this UI surface, start
with `docs/project-release-handoff.md`. Stable SDK imports for external callers
are documented in `runtime/sdk/README.md` and should come from
`runtime/sdk/src/index.js`. The workflow overview embedding helpers below are
the read-only external-shell path for embedding and mounting overview state.

## Shell Module

Use the shell-facing module when an outer UI needs entry links or a read-only
control view:

```js
import {
  INI_PANEL_ENTRIES,
  createControlPageBrowserApiManifest,
  createControlPageBrowserApiMethods,
  createControlPageBrowserApiSchema,
  createIniPanelLaunchApiManifest,
  createIniPanelLaunchApiSchema,
  createIniPanelLauncherLinkViewModel,
  createIniPanelShellControlPageContract,
  createIniPanelShellIntegrationManifest,
  createIniPanelShellIntegrationReadiness,
  createIniPanelShellIntegrationSchema,
  createIniPanelShellIntegrationWorkflowPlan,
  createIniPanelShellSessionHandoffActionPlan,
  createIniPanelShellSessionHandoffChecklist,
  createIniPanelShellSessionHandoffCompatibilityReport,
  createIniPanelShellSessionHandoffDisplayViewModel,
  createIniPanelShellSessionHandoffPackage,
  createIniPanelShellSessionHandoffPackageDisplayViewModel,
  createIniPanelShellSessionHandoffPackageMountDisplayViewModel,
  createIniPanelShellSessionHandoffPackageMountRenderState,
  createIniPanelShellSessionHandoffPackageMountState,
  createIniPanelShellSessionHandoffMountDomContract,
  createIniPanelShellSessionHandoffMountDomReadiness,
  mountIniPanelShellSessionHandoff,
  mountIniPanelShellSessionHandoffFromControlPage,
  createIniPanelShellSessionHandoffWorkflowSummary,
  createIniPanelShellSessionReadinessWorkflowReport,
  createIniPanelShellApiSurfaceInventory,
  createIniPanelShellSessionHandoffWorkflowDisplayViewModel,
  createIniPanelShellSessionHandoffWorkflowRenderState,
  createIniPanelShellSessionHandoffWorkflowDomContract,
  createIniPanelShellSessionHandoffWorkflowDomReadiness,
  createIniPanelShellWorkflowOverviewContract,
  createIniPanelShellWorkflowOverviewReadiness,
  createIniPanelShellWorkflowOverviewEmbeddingReport,
  createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel,
  createIniPanelShellWorkflowOverviewEmbeddingRenderState,
  createIniPanelShellWorkflowOverviewEmbeddingDomContract,
  createIniPanelShellWorkflowOverviewEmbeddingDomReadiness,
  mountIniPanelShellWorkflowOverviewEmbedding,
  renderIniPanelShellWorkflowOverviewEmbeddingState,
  mountIniPanelShellWorkflowOverviewEmbeddingState,
  createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel,
  createIniPanelShellWorkflowOverviewEmbeddingMountRenderState,
  createIniPanelShellWorkflowOverviewEmbeddingMountDomContract,
  createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness,
  renderIniPanelShellWorkflowOverviewEmbeddingMountState,
  mountIniPanelShellWorkflowOverviewEmbeddingMountState,
  validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson,
  loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl,
  createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel,
  createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState,
  createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract,
  createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness,
  renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState,
  mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactState,
  renderIniPanelShellSessionHandoffWorkflowState,
  mountIniPanelShellSessionHandoffWorkflow,
  renderIniPanelShellSessionHandoffMountState,
  createIniPanelShellSessionHandoffPackageReport,
  createIniPanelShellSessionHandoffPackageRenderState,
  createIniPanelShellSessionHandoffPackageSchema,
  createIniPanelShellSessionHandoffRenderState,
  createIniPanelShellSessionHandoffSnapshot,
  createIniPanelShellSessionHandoffSummary,
  createIniPanelShellSessionHandoffSummarySchema,
  createIniPanelShellViewModel,
  getIniPanelEntryByHref,
  getVisibleIniPanelEntries,
  createMachineSessionPersistenceDisplayViewModel,
  createMachineSessionPersistenceRenderState,
  createMachineSessionPersistenceSummary,
  createMachineSessionControlPageController,
  createMachineSessionReadonlyStatus,
  createMachineSessionReadonlyStatusApiManifest,
  createMachineSessionReadinessFieldState,
  machineSessionReadinessLogLines,
  readMachineSessionReadinessWorkflow,
  readMachineSessionReadonlyStatus,
  loadMachineSessionForControlPageWorkflow,
  createControlPageSessionLoadState,
  refreshMachineSessionControlPage,
  controlPageStatusText,
  renderMachineSessionControlView,
  isSupportedIniPanelControlPageApiManifest,
  isSupportedIniPanelLaunchApiManifest,
  isSupportedIniPanelShellIntegrationManifest,
  isSupportedIniPanelShellSessionHandoffPackage,
  isSupportedIniPanelShellSessionHandoffSummary,
} from "../runtime/ui/ini-panel/ui-shell.js";
```

`ui-shell.js` re-exports the entry manifest, the read-only control-page
controller, the unified read-only status API, the readonly-status API manifest,
and the control-view renderer. It does not implement CNC behavior.

## Pages

| Page | Path | Role |
| --- | --- | --- |
| Launch | `runtime/ui/ini-panel/launch.html` | Read-only entry page for available panel surfaces. |
| Edit and run | `runtime/ui/ini-panel/index.html` | Editable INI panel and existing run workflow surface. |
| Read-only control view | `runtime/ui/ini-panel/control-page.html` | Read-only control view backed by the panel API. |
| Workflow overview | `runtime/ui/ini-panel/workflow-overview.html` | Read-only shell handoff workflow overview surface. |

## Visible Entries

The visible launch entries come from `getVisibleIniPanelEntries()`:

| Entry id | Href | Title |
| --- | --- | --- |
| `edit-run` | `./index.html` | Open edit and run panel |
| `control-view` | `./control-page.html` | Open read-only control view |
| `workflow-overview` | `./workflow-overview.html` | Open shell handoff overview |

Launcher pages can render links from `createIniPanelLauncherLinkViewModel()`
without reading manifest field names directly. Each item has `entryId`, `href`,
and `label`.

Outer shells can call `createIniPanelShellViewModel()` when they need one
read-only model with `pages`, `launcherLinks`, and `controlPage` helpers for
mounting the existing control-page controller, refresh workflow, and renderer.
Use `controlPage.readStatus` or `readMachineSessionReadonlyStatus()` when an
outer shell needs one stable read of `stateBundle`, `workflowStatus`,
`overview`, `controlView`, `sessionReadiness`, `session`, `runReadiness`, and
`run`.
Use `createMachineSessionReadonlyStatusApiManifest()` or
`controlPage.readonlyStatusApiManifest` when you only need the API shape and
method names.
Use `readMachineSessionReadinessWorkflow()` when an outer shell or panel flow
needs a read-only `ready`/`blocked` readiness report before loading a machine
session into WASM. `createMachineSessionReadinessFieldState()` and
`machineSessionReadinessLogLines()` turn that report into stable fields and
status text without parsing G-code or executing LinuxCNC behavior.
Use `createMachineSessionPersistenceSummary()` or
`linuxCncIniPanelApi.getMachineSessionPersistenceSummary()` when a browser
panel or outer shell needs one read-only OPFS/session persistence summary with
machine-file, session snapshot, session readiness, session load, readonly
status, and handoff readiness rows. The launch page exposes the same helper as
`linuxCncIniPanelLaunchApi.getMachineSessionPersistenceSummary()`, and the
workflow overview page exposes it as
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewPersistenceSummary()`.
Use `validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson()` or
`linuxCncIniPanelWorkflowOverviewApi.validateWorkflowOverviewReleaseReadinessArtifactJson()`
when an outer shell needs to validate a project release readiness artifact JSON
through the same read-only workflow overview surface. It parses the artifact,
returns stable validation rows, and does not execute release gates or CNC
behavior.
Use `runIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflow()` or
`linuxCncIniPanelWorkflowOverviewApi.runWorkflowOverviewReleaseReadinessArtifactJsonWorkflow()`
when the shell already has artifact JSON and needs parse, validation, summary,
action-plan, and gate execution summary output in one workflow result.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryViewModel()` or
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryViewModel()`
when the shell needs the artifact's release gate execution summary rows.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryRenderState()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomContract()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomReadiness()`,
`renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState()`, or
`mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState()` when the
shell needs to render those per-gate rows into caller-owned DOM.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowSummaryViewModel()` or
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactJsonWorkflowSummaryViewModel()`
when the shell needs stable status text and rows for that JSON workflow.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowActionPlan()` or
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactJsonWorkflowActionPlan()`
when the shell needs the JSON workflow next-command plan without inspecting
internal workflow fields.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomContract()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomReadiness()`,
`renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState()`, or
`mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState()` when the
shell needs to render that JSON workflow state into caller-owned DOM.
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. The URL
workflow result includes `validationSummaryViewModel` so callers can show
stable validation status and rows from the same fetch.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()` or
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()`
when the shell needs one stable status line and dashboard rows for the whole
artifact URL fetch/validate/render/mount workflow.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowRenderState()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomContract()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomReadiness()`,
`renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState()`, or
`mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState()` when the
shell needs to render that URL workflow state into caller-owned DOM.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowActionPlan()` or
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowActionPlan()`
when the shell needs the ordered next-action/next-command plan for that URL
workflow without executing release gates.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()` or
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()`
when the shell needs stable artifact validation status text and dashboard rows
without interpreting validation flags itself.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlan()` or
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactValidationActionPlan()`
when direct artifact JSON validation needs its own ordered next-command plan
without executing release gates.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanRenderState()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomContract()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomReadiness()`,
`renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState()`, or
`mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState()` when the
shell needs to render that validation action plan into caller-owned DOM.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness()`,
`renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactState()`, or
`mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactState()` when that
validation needs to be rendered into caller-owned DOM. The workflow overview
page exposes equivalent methods with the `getWorkflowOverview...`,
`renderWorkflowOverview...`, and `mountWorkflowOverview...` prefixes.
Use `createMachineSessionPersistenceDisplayViewModel()` and
`createMachineSessionPersistenceRenderState()` when that summary needs stable
display text, rows, status line, and dataset fields for caller-owned DOM.
Use `createIniPanelShellControlPageContract()` or `controlPage.contract` when
an outer shell needs a fast contract check for `createController`,
`loadSessionState`, `readStatus`, `refresh`, `renderView`, the readonly status
manifest, and its status fields before mounting the embedded panel. The
contract lists readonly status fields for `stateBundle`, `workflowStatus`,
`overview`, `controlView`, `report`, `runReadiness`, `run`, `session`, and
`status`.
The browser control page also exposes this contract through
`linuxCncIniPanelControlPageApi.getControlPageContract()`, so real iframe-based
smokes can verify the same API shape before reading the embedded panel state.
Use `linuxCncIniPanelControlPageApi.getControlPageApiMethods()` when a browser
outer page needs the exact exposed method list before calling the read-only
control page API.
Use `createControlPageBrowserApiSchema()`,
`createControlPageBrowserApiManifest()`, or
`linuxCncIniPanelControlPageApi.getControlPageApiSchema()` and
`linuxCncIniPanelControlPageApi.getControlPageApiManifest()` when a browser
outer page needs a versioned control-page API description before reading the
embedded panel. Use `isSupportedIniPanelControlPageApiManifest()` or
`linuxCncIniPanelControlPageApi.isSupportedControlPageApiManifest()` for a
read-only compatibility predicate before consuming that manifest.
Use `linuxCncIniPanelControlPageApi.readControlPageStatus()` when a browser
outer page needs the same readonly status snapshot from the real embedded
control page after save/load session workflows.
The launch page exposes `linuxCncIniPanelLaunchApi.getControlPageApiMethods()`
from the same shell view-model so entry pages can consume the available
read-only control-page API list without loading the control-page iframe first.
Use `createIniPanelLaunchApiManifest()` or
`linuxCncIniPanelLaunchApi.getLaunchApiManifest()` when an outer shell needs a
single read-only description of launch methods, visible entries, target pages,
the control-page browser API methods, and OPFS/session persistence capabilities
for machine files, session snapshots, and read-only status.
Use `createIniPanelLaunchApiSchema()`,
`linuxCncIniPanelLaunchApi.getLaunchApiSchema()`, or `manifestVersion` when an
outer shell needs to check launch manifest compatibility before consuming these
fields.
Use `isSupportedIniPanelLaunchApiManifest()` or
`linuxCncIniPanelLaunchApi.isSupportedLaunchApiManifest()` for a read-only
compatibility predicate before using a launch manifest.
Use `createIniPanelShellIntegrationSchema()`,
`createIniPanelShellIntegrationManifest()`,
`linuxCncIniPanelLaunchApi.getShellIntegrationSchema()`, or
`linuxCncIniPanelLaunchApi.getShellIntegrationManifest()` when an outer shell
needs one versioned read of pages, launcher links, launch API metadata,
control-page API metadata, OPFS/session persistence capabilities, and current
compatibility status. Use `isSupportedIniPanelShellIntegrationManifest()` when
the outer shell needs to check that integration manifest before consuming it.
Use `createIniPanelShellIntegrationReadiness()` or
`linuxCncIniPanelLaunchApi.getShellIntegrationReadiness()` when the outer shell
needs a read-only `ready`/`blocked` status, failed check names, API names, and
counts for pages, methods, and persistence capabilities before mounting any
embedded control page.
Use `createIniPanelShellIntegrationWorkflowPlan()` when the outer shell needs a
Node-testable read-only plan for the control-page target, required launch and
control-page API methods, readiness gate, and readonly status handoff fields
before opening a browser frame.
Use `createIniPanelShellSessionHandoffSummary()` when the outer shell needs one
read-only display summary of readiness, target page, persistence capabilities,
readonly status fields, handoff methods, and blocking reasons. Browser shells
can read the same summary through
`linuxCncIniPanelLaunchApi.getShellSessionHandoffSummary()`.
Use `createIniPanelShellSessionHandoffSummarySchema()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffSummarySchema()` for the
versioned summary shape, and `isSupportedIniPanelShellSessionHandoffSummary()`
or `linuxCncIniPanelLaunchApi.isSupportedShellSessionHandoffSummary()` before
consuming a summary from a browser shell.
Use `createIniPanelShellSessionHandoffCompatibilityReport()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffCompatibilityReport()` when an
outer shell needs display-ready diagnostics for schema support, missing fields,
api/version mismatches, and current blocking reasons before consuming the
handoff summary.
Use `createIniPanelShellSessionHandoffDisplayViewModel()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffDisplayViewModel()` when an
outer shell needs the same diagnostics as stable read-only label/value rows for
DOM display.
Use `createIniPanelShellSessionHandoffSnapshot()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffSnapshot()` when an outer shell
needs one read-only API read that includes readiness, handoff summary,
compatibility report, and display view-model together.
Use `createIniPanelShellSessionHandoffRenderState()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffRenderState()` when an outer
shell needs the snapshot compressed into launch-side DOM state with a status
line, stable rows, and `[data-handoff-shell]` phase/readiness flags. The launch
page renders `[data-handoff-status]` and `[data-handoff-rows]` from this helper
without adding control actions.
Use `createIniPanelShellSessionHandoffActionPlan()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffActionPlan()` when an outer
shell needs a read-only next-step description derived from the same snapshot:
target page, required readonly methods, blocking reasons, display rows, and
ready/blocked next step ids. The action plan describes what an outer shell can
do next; it does not execute actions or add controls.
Use `createIniPanelShellSessionHandoffChecklist()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffChecklist()` when an outer
shell needs the same handoff state as stable health rows for display: render
state, target page, load-session method, read-status method, blocking reasons,
display rows, and next step ids. The checklist is read-only and does not
execute the action plan.
Use `createIniPanelShellSessionHandoffPackage()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffPackage()` when an outer shell
needs one browser API read containing the launch/control method manifests,
snapshot, render-state, action-plan, and checklist. The package is a read-only
handoff artifact and does not execute action-plan steps.
Use `createIniPanelShellSessionHandoffPackageSchema()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffPackageSchema()` for the
versioned package shape, and `isSupportedIniPanelShellSessionHandoffPackage()`
or `linuxCncIniPanelLaunchApi.isSupportedShellSessionHandoffPackage()` before
consuming a package from a browser shell.
Use `createIniPanelShellSessionHandoffPackageReport()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffPackageReport()` when an outer
shell needs display-ready diagnostics for package schema support, missing
package fields, missing manifest fields, api/version mismatches, and checklist
blocking reasons.
Use `createIniPanelShellSessionHandoffPackageDisplayViewModel()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffPackageDisplayViewModel()`
when an outer shell needs the package report compressed into stable read-only
label/value rows for DOM display.
Use `createIniPanelShellSessionHandoffPackageRenderState()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffPackageRenderState()` when an
outer shell needs the package display view-model compressed into launch-side
DOM state. The launch page renders `[data-handoff-status]` and
`[data-handoff-rows]` from the package render-state so the first page shows
package-level schema/report status.
Use `createIniPanelShellSessionHandoffPackageMountState()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffPackageMountState()` when an
outer shell needs one read-only mount-state that combines package render-state,
the control-page target, required readonly methods, and the current
control-page session readiness snapshot.
Use `createIniPanelShellSessionHandoffPackageMountDisplayViewModel()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffPackageMountDisplayViewModel()`
when an outer shell needs mount-state checks as stable read-only label/value
rows. Use `createIniPanelShellSessionHandoffPackageMountRenderState()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffPackageMountRenderState()`
when those rows need a status line and `[data-handoff-shell]` style dataset
flags for DOM rendering. Use
`createIniPanelShellSessionHandoffMountDomContract()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffMountDomContract()` when an
outer shell needs the required mount/status/rows selectors, mount dataset keys,
row dataset keys, and render-result fields before rendering into shell-owned
DOM. Use `createIniPanelShellSessionHandoffMountDomReadiness()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffMountDomReadiness()` to check
that the required document and nodes exist before calling the renderer. Use
`mountIniPanelShellSessionHandoff()` or
`linuxCncIniPanelLaunchApi.mountShellSessionHandoff()` when an outer shell
needs one browser-side workflow result containing the contract, DOM readiness,
mount render-state, renderer result, and any mount error as data. Use
`mountIniPanelShellSessionHandoffFromControlPage()` or
`linuxCncIniPanelLaunchApi.mountShellSessionHandoffFromControlPage()` when an
outer shell has a control-page API or already-observed session-load state and
needs one read-only result containing the derived mount-state, mount display
view-model, mount render-state, and DOM mount workflow result. Use
`readIniPanelShellSessionHandoffStatusFromControlPage()` or
`linuxCncIniPanelLaunchApi.readShellSessionHandoffStatusFromControlPage()`
when an outer shell needs to read the control-page readonly status and verify
the expected handoff status fields as a structured ready/blocked result. Use
`createIniPanelShellSessionHandoffWorkflowSummary()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffWorkflowSummary()` when an
outer shell needs one stable end-to-end summary that combines mount workflow,
control-page mount workflow, readonly status result, machine-session
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 `createIniPanelShellApiSurfaceInventory()` or
`linuxCncIniPanelLaunchApi.getShellApiSurfaceInventory()` when an outer shell
needs a machine-readable inventory of launch, control-page, workflow overview,
persistence capabilities, session readiness report rows, and persistence
summary rows. The workflow overview page exposes the same inventory through
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewApiSurfaceInventory()`.
When provided to `createIniPanelShellSessionHandoffWorkflowSummary()`, the
inventory is also rendered as the read-only `api-surface-inventory` workflow
summary row for browser overview pages and external shells. The same workflow
summary accepts `persistenceSummary` from
`createMachineSessionPersistenceSummary()` and renders it as the
`persistence-summary` row, so a shell overview can show API coverage and
OPFS/session persistence state together.
Use
`createIniPanelShellSessionHandoffWorkflowDisplayViewModel()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffWorkflowDisplayViewModel()`
when an outer shell needs that end-to-end summary compressed into stable
`title`, `statusText`, `detailText`, and rows for direct display. Use
`createIniPanelShellSessionHandoffWorkflowRenderState()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffWorkflowRenderState()` when an
outer shell needs that workflow display-model compressed into stable
`dataset`, `statusLine`, and rows for direct DOM rendering. Use
`createIniPanelShellSessionHandoffWorkflowDomContract()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffWorkflowDomContract()` when an
outer shell needs the required workflow mount/status/rows selectors, mount
dataset keys, and row dataset keys before rendering workflow overview DOM. Use
`createIniPanelShellSessionHandoffWorkflowDomReadiness()` or
`linuxCncIniPanelLaunchApi.getShellSessionHandoffWorkflowDomReadiness()` to
check that those workflow DOM nodes exist before rendering. Use
`renderIniPanelShellSessionHandoffWorkflowState()` or
`linuxCncIniPanelLaunchApi.renderShellSessionHandoffWorkflowState()` when an
outer shell needs the shared read-only DOM renderer for workflow overview rows.
Use `mountIniPanelShellSessionHandoffWorkflow()` or
`linuxCncIniPanelLaunchApi.mountShellSessionHandoffWorkflow()` when an outer
shell needs one structured workflow DOM mount result containing contract,
readiness, render-state, render result, and any mount error as data. Use
`createIniPanelShellWorkflowOverviewContract()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewContract()` when an outer shell
needs the `workflow-overview.html` page href, browser API namespace, and method
names before embedding that page. Use
`createIniPanelShellWorkflowOverviewReadiness()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewReadiness()` to check whether a
loaded workflow overview iframe exposes the expected read-only API. Use
`mountIniPanelShellWorkflowOverviewEmbedding()` or
`linuxCncIniPanelLaunchApi.mountWorkflowOverviewEmbedding()` when an outer
shell needs one structured embedding result containing contract readiness,
render-state, workflow overview mount result, and any mount error as data. The
workflow overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.mountWorkflowOverviewEmbedding()` for the
same read-only embedding path from inside the iframe. Use
`createIniPanelShellWorkflowOverviewEmbeddingReport()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingReport()` when an outer
shell needs display-ready diagnostics for overview API readiness, missing
methods, embedding readiness, mount phase, render row count, and embedding
errors. The workflow overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingReport()` for
the same report shape. Use
`createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingDisplayViewModel()` when
an outer shell needs that report compressed into stable `title`, `statusText`,
`detailText`, and read-only label/value rows for direct rendering. The workflow
overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingDisplayViewModel()`.
Use `createIniPanelShellWorkflowOverviewEmbeddingRenderState()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingRenderState()` when an
outer shell needs that display view-model compressed into stable `statusLine`,
`dataset`, and rows for a shared DOM renderer. The workflow overview page also
exposes `linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingRenderState()`.
Use `createIniPanelShellWorkflowOverviewEmbeddingDomContract()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingDomContract()` when an
outer shell needs the required embedding report mount/status/rows selectors,
mount dataset keys, row dataset keys, and render-result fields before adding a
DOM renderer. The workflow overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingDomContract()`.
Use `createIniPanelShellWorkflowOverviewEmbeddingDomReadiness()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingDomReadiness()` to check
that the required document and embedding report DOM nodes exist before calling
a renderer. The workflow overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingDomReadiness()`.
Use `renderIniPanelShellWorkflowOverviewEmbeddingState()` or
`linuxCncIniPanelLaunchApi.renderWorkflowOverviewEmbeddingState()` when an
outer shell needs to render an embedding report render-state into existing
mount/status/rows nodes and receive a structured read-only render result. The
workflow overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.renderWorkflowOverviewEmbeddingState()`.
Use `mountIniPanelShellWorkflowOverviewEmbeddingState()` or
`linuxCncIniPanelLaunchApi.mountWorkflowOverviewEmbeddingState()` when an outer
shell needs a non-throwing workflow result that combines embedding DOM
readiness, render-state, render result, and any render error as structured
data. The workflow overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.mountWorkflowOverviewEmbeddingState()`.
Use `createIniPanelShellWorkflowOverviewEmbeddingMountDisplayViewModel()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingMountDisplayViewModel()`
when an outer shell needs that mount workflow result compressed into stable
`title`, `statusText`, `detailText`, and read-only label/value rows. The
workflow overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingMountDisplayViewModel()`.
Use `createIniPanelShellWorkflowOverviewEmbeddingMountRenderState()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingMountRenderState()` when
an outer shell needs that mount display view-model compressed into stable
`statusLine`, `dataset`, and rows for a shared DOM renderer. The workflow
overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingMountRenderState()`.
Use `createIniPanelShellWorkflowOverviewEmbeddingMountDomContract()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingMountDomContract()` when
an outer shell needs the required mount/status/rows selectors, mount dataset
keys, row dataset keys, and render-result fields before rendering the mount
render-state. The workflow overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingMountDomContract()`.
Use `createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingMountDomReadiness()` to
check that the required document and mount render-state DOM nodes exist before
calling a renderer. The workflow overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingMountDomReadiness()`.
Use `renderIniPanelShellWorkflowOverviewEmbeddingMountState()` or
`linuxCncIniPanelLaunchApi.renderWorkflowOverviewEmbeddingMountState()` when an
outer shell needs to render a mount render-state into existing mount/status/rows
nodes and receive a structured read-only render result. The workflow overview
page also exposes
`linuxCncIniPanelWorkflowOverviewApi.renderWorkflowOverviewEmbeddingMountState()`.
Use `mountIniPanelShellWorkflowOverviewEmbeddingMountState()` or
`linuxCncIniPanelLaunchApi.mountWorkflowOverviewEmbeddingMountState()` when an
outer shell needs a non-throwing mount workflow result for the mount render-state
DOM. The workflow overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.mountWorkflowOverviewEmbeddingMountState()`.
Use
`renderIniPanelShellSessionHandoffMountState()` or
`linuxCncIniPanelLaunchApi.renderShellSessionHandoffMountState()` when an outer
shell needs the shared read-only DOM renderer for those rows. The launch page
renders the default waiting mount state into `[data-handoff-mount]`,
`[data-handoff-mount-status]`, and `[data-handoff-mount-rows]` without opening
the control page. The launch page also renders a default workflow overview into
`[data-handoff-workflow]`, `[data-handoff-workflow-status]`, and
`[data-handoff-workflow-rows]`.
The browser workflow smoke
`tests/browser/ini_panel_shell_integration_workflow_smoke.html` verifies the
same external shell handoff: read integration manifest, pass readiness gate,
open the control page target, mount waiting and ready mount-state into an
external shell-owned `[data-external-shell-mount]` DOM region through the shared
mount workflows, then read and validate readonly machine-session status through
the shared status workflow.

The control-page refresh workflow lives in
`runtime/ui/ini-panel/control-page-refresh-workflow.js`. Use
`refreshMachineSessionControlPage()` when an outer shell needs a structured
refresh result with `phase`, `statusText`, `view`, `renderResult`, and `error`.
`controlPageStatusText()` formats the already-observed panel status fields for
the read-only status line, and `createControlPageRefreshState()` is the stable
state-shape helper used by the workflow.

The control-page session workflow lives in
`runtime/ui/ini-panel/control-page-session-workflow.js`. Use
`loadMachineSessionForControlPageWorkflow()` when an outer shell needs a
read-only readiness snapshot for the embedded panel API, machine-session
ready/blocked state, and first control view.
`createControlPageSessionLoadState()` is the stable state-shape helper for
`waiting-panel`, `waiting-api`, `waiting-session`, `ready`, and `error` phases.

## Boundary

The entry shell only links pages and renders already-observed panel state. It
does not parse G-code, infer canonical events, or implement LinuxCNC-owned
tool, parameter, planner, or kinematics behavior.

Release validation for this surface is covered by `verify_ui_node_smokes.sh`,
`verify_ini_panel_browser.sh`, and the project handoff docs smoke
`verify_project_release_handoff_docs.sh`.
