新增 release gate execution manifest API
This commit is contained in:
55
text15.txt
55
text15.txt
@@ -299,3 +299,58 @@ wasm-port/tests/native/verify_sim_configs.sh
|
|||||||
- 增加 OPFS/session persistence 的独立 SDK/browser gate,减少只依赖聚合 smoke 的排障成本;
|
- 增加 OPFS/session persistence 的独立 SDK/browser gate,减少只依赖聚合 smoke 的排障成本;
|
||||||
- 若真实 LinuxCNC host runtime 可用,再按 native -> Node/WASM -> browser/host 顺序处理 blocked
|
- 若真实 LinuxCNC host runtime 可用,再按 native -> Node/WASM -> browser/host 顺序处理 blocked
|
||||||
runtime family promotion。
|
runtime family promotion。
|
||||||
|
|
||||||
|
五十七、2026-06-16 继续执行记录:project release gate execution manifest SDK API
|
||||||
|
|
||||||
|
本批继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”
|
||||||
|
推进,选择 `text15.txt` 下一步建议中的 machine-readable release gate execution manifest/artifact。
|
||||||
|
|
||||||
|
本批新增实质能力:
|
||||||
|
|
||||||
|
- 新增 SDK API:`createProjectReleaseGateExecutionManifest()`;
|
||||||
|
- 该 API 复用 release gate manifest,按 gate 输出每个 gate 的 `command`、`expectedOutput`、
|
||||||
|
`observedOutput`、`evidence`、`passed/unknown` 状态、缺失 gate ID 与 pass/unknown 计数;
|
||||||
|
- `createProjectReleaseReadinessReport()` 现在嵌入 `gateExecutionManifest`,让外部 CI/browser
|
||||||
|
dashboard 可直接展示 release gate 执行证据,而不需要解析 shell 脚本;
|
||||||
|
- `createProjectReleaseReadinessArtifactValidation()` 现在要求 ready artifact 包含
|
||||||
|
`gateExecutionManifest`,并暴露 `gateExecutionManifestReady`;
|
||||||
|
- workflow overview release artifact validation summary/render rows 增加
|
||||||
|
`gate-execution-manifest` evidence 行;
|
||||||
|
- 更新 `tests/fixtures/project-release-readiness-ready.json`,使 browser artifact URL workflow 使用
|
||||||
|
新 schema;
|
||||||
|
- 更新 SDK README 与 `docs/project-release-handoff.md`,说明 execution manifest、artifact validation
|
||||||
|
evidence chain 与外部 CI/browser dashboard 用法。
|
||||||
|
|
||||||
|
本批新增/更新可执行验证:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wasm-port/tests/sdk/node/verify_project_release_gate_manifest.sh
|
||||||
|
wasm-port/tests/sdk/node/verify_sdk_surface.sh
|
||||||
|
wasm-port/tests/docs/node/verify_project_release_handoff_docs.sh
|
||||||
|
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_release_artifact_url_workflow_browser.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_project_release_gate.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
关键通过输出:
|
||||||
|
|
||||||
|
```text
|
||||||
|
project_release_gate_manifest_node_smoke=ok
|
||||||
|
sdk_surface_node_smoke=ok
|
||||||
|
project_release_handoff_docs_node_smoke=ok
|
||||||
|
browser_release_artifact_url_workflow_smoke=ok
|
||||||
|
ui_node_smokes=ok
|
||||||
|
browser_ini_shell_integration_workflow_smoke=ok
|
||||||
|
project_release_readiness_artifact_node_smoke=ok
|
||||||
|
project_release_gate=ok
|
||||||
|
```
|
||||||
|
|
||||||
|
本批仍保持 LinuxCNC 语义边界:
|
||||||
|
|
||||||
|
- 未修改 vendored LinuxCNC 源码;
|
||||||
|
- 未在 JS/browser 中实现 G-code、tool、parameter、planner、kinematics、remap 或 canonical motion
|
||||||
|
语义;
|
||||||
|
- 新增内容只属于 release gate evidence packaging、SDK/API surface、browser/UI artifact validation
|
||||||
|
render rows、docs 和测试 gate;
|
||||||
|
- blocked runtime families 仍不 promotion。
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ Use these documents as the current handoff set:
|
|||||||
reuse and non-drift rules.
|
reuse and non-drift rules.
|
||||||
- `../PROJECT_COMPLETION_TRACKER.md` for project-level acceptance tracking.
|
- `../PROJECT_COMPLETION_TRACKER.md` for project-level acceptance tracking.
|
||||||
|
|
||||||
Old turn logs `text1.txt` through `text13.txt` are historical context. Current
|
Old turn logs `text1.txt` through `text14.txt` are historical context. Current
|
||||||
continuation records are in `../text14.txt`.
|
continuation records are in `../text15.txt`.
|
||||||
|
|
||||||
## Supported current workflows
|
## Supported current workflows
|
||||||
|
|
||||||
@@ -39,10 +39,13 @@ continuation records are in `../text14.txt`.
|
|||||||
expected smoke outputs, `createProjectReleaseGateResultMatrix()` to map
|
expected smoke outputs, `createProjectReleaseGateResultMatrix()` to map
|
||||||
observed outputs onto passed/unknown gate rows,
|
observed outputs onto passed/unknown gate rows,
|
||||||
`createProjectReleaseGateActionPlan()` to derive pending gate commands, the
|
`createProjectReleaseGateActionPlan()` to derive pending gate commands, the
|
||||||
next command, display rows, and a shell script from that matrix, and
|
next command, display rows, and a shell script from that matrix,
|
||||||
|
`createProjectReleaseGateExecutionManifest()` to package each gate command,
|
||||||
|
expected output, observed-output evidence, and passed/unknown status, and
|
||||||
`createProjectReleaseReadinessReport()` for a machine-readable release
|
`createProjectReleaseReadinessReport()` for a machine-readable release
|
||||||
readiness report covering the same manifest, result matrix, action plan,
|
readiness report covering the same manifest, execution manifest, result
|
||||||
sim-config inventory baseline, and blocked runtime families.
|
matrix, action plan, sim-config inventory baseline, and blocked runtime
|
||||||
|
families.
|
||||||
`createProjectReleaseReadinessSummaryViewModel()` turns that report into
|
`createProjectReleaseReadinessSummaryViewModel()` turns that report into
|
||||||
stable status text and rows for dashboards. The report helper is evidence
|
stable status text and rows for dashboards. The report helper is evidence
|
||||||
driven and only reports `ready: true` when the caller supplies release gate
|
driven and only reports `ready: true` when the caller supplies release gate
|
||||||
@@ -52,8 +55,9 @@ continuation records are in `../text14.txt`.
|
|||||||
External tools can load that artifact with
|
External tools can load that artifact with
|
||||||
`parseProjectReleaseReadinessArtifactJson()` and validate it with
|
`parseProjectReleaseReadinessArtifactJson()` and validate it with
|
||||||
`createProjectReleaseReadinessArtifactValidation()`. Artifact validation
|
`createProjectReleaseReadinessArtifactValidation()`. Artifact validation
|
||||||
requires the embedded gate manifest, result matrix, and action plan to be
|
requires the embedded gate manifest, execution manifest, result matrix, and
|
||||||
ready, so stale release JSON cannot pass the executable artifact gate.
|
action plan to be ready, so stale release JSON cannot pass the executable
|
||||||
|
artifact gate.
|
||||||
`createProjectReleaseReadinessArtifactValidationSummaryViewModel()` turns the
|
`createProjectReleaseReadinessArtifactValidationSummaryViewModel()` turns the
|
||||||
validation into stable dashboard rows without reinterpreting artifact fields.
|
validation into stable dashboard rows without reinterpreting artifact fields.
|
||||||
`createProjectReleaseReadinessArtifactValidationActionPlan()` turns a blocked
|
`createProjectReleaseReadinessArtifactValidationActionPlan()` turns a blocked
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ import {
|
|||||||
createMachineSessionPersistenceSummary,
|
createMachineSessionPersistenceSummary,
|
||||||
createMachineSessionSnapshotPayload,
|
createMachineSessionSnapshotPayload,
|
||||||
createProjectReleaseGateActionPlan,
|
createProjectReleaseGateActionPlan,
|
||||||
|
createProjectReleaseGateExecutionManifest,
|
||||||
createProjectReleaseGateManifest,
|
createProjectReleaseGateManifest,
|
||||||
createProjectReleaseGateResultMatrix,
|
createProjectReleaseGateResultMatrix,
|
||||||
createProjectReleaseReadinessArtifactJsonWorkflow,
|
createProjectReleaseReadinessArtifactJsonWorkflow,
|
||||||
@@ -208,12 +209,17 @@ and explicit gate results onto that manifest as stable `passed`/`unknown` rows.
|
|||||||
`createProjectReleaseGateActionPlan()` turns that matrix into pending gate
|
`createProjectReleaseGateActionPlan()` turns that matrix into pending gate
|
||||||
commands, the next gate command, stable display rows, and a shell script that
|
commands, the next gate command, stable display rows, and a shell script that
|
||||||
external CI can execute or show without duplicating the manifest order.
|
external CI can execute or show without duplicating the manifest order.
|
||||||
|
`createProjectReleaseGateExecutionManifest()` packages the same gate manifest
|
||||||
|
with caller-provided explicit results and observed output evidence. Each row
|
||||||
|
includes the command, expected output, matched observed output when present,
|
||||||
|
evidence kind, and `passed`/`unknown` status so CI or browser dashboards can
|
||||||
|
render release-gate execution state without scraping shell scripts.
|
||||||
`createProjectReleaseReadinessReport()` returns a machine-readable release
|
`createProjectReleaseReadinessReport()` returns a machine-readable release
|
||||||
readiness report that embeds the same manifest, result matrix, and action plan
|
readiness report that embeds the same manifest, result matrix, and action plan
|
||||||
beside the sim-config inventory baseline and blocked runtime families. It is
|
beside the gate execution manifest, sim-config inventory baseline, and blocked
|
||||||
evidence driven: the default report is `ready: false` until the caller supplies
|
runtime families. It is evidence driven: the default report is `ready: false`
|
||||||
observed gate output such as `project_release_gate=ok` or explicit gate
|
until the caller supplies observed gate output such as `project_release_gate=ok`
|
||||||
results.
|
or explicit gate results.
|
||||||
`createProjectReleaseReadinessSummaryViewModel()` turns the report into stable
|
`createProjectReleaseReadinessSummaryViewModel()` turns the report into stable
|
||||||
status text, a status line, and display rows for dashboards without executing
|
status text, a status line, and display rows for dashboards without executing
|
||||||
any gate.
|
any gate.
|
||||||
@@ -231,9 +237,9 @@ load that JSON with `parseProjectReleaseReadinessArtifactJson()` and validate
|
|||||||
it with `createProjectReleaseReadinessArtifactValidation()` without copying the
|
it with `createProjectReleaseReadinessArtifactValidation()` without copying the
|
||||||
host test assertions. The validation result includes `expectedGateCount` and
|
host test assertions. The validation result includes `expectedGateCount` and
|
||||||
`expectedGateIds` so external callers can compare an artifact against the
|
`expectedGateIds` so external callers can compare an artifact against the
|
||||||
current manifest, plus `gateManifestReady`, `gateResultMatrixReady`, and
|
current manifest, plus `gateManifestReady`, `gateExecutionManifestReady`,
|
||||||
`gateActionPlanReady` so stale artifacts that omit the embedded gate evidence
|
`gateResultMatrixReady`, and `gateActionPlanReady` so stale artifacts that omit
|
||||||
chain fail the same executable gate.
|
the embedded gate evidence chain fail the same executable gate.
|
||||||
`createProjectReleaseReadinessArtifactValidationSummaryViewModel()` turns that
|
`createProjectReleaseReadinessArtifactValidationSummaryViewModel()` turns that
|
||||||
validation result into stable status text and display rows for dashboards or
|
validation result into stable status text and display rows for dashboards or
|
||||||
browser shells without reinterpreting the artifact fields.
|
browser shells without reinterpreting the artifact fields.
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ export { createLinuxCncIniSdk } from "./linuxcnc-ini.js";
|
|||||||
export { createLinuxCncInterpSdk } from "./linuxcnc-interp.js";
|
export { createLinuxCncInterpSdk } from "./linuxcnc-interp.js";
|
||||||
export {
|
export {
|
||||||
createProjectReleaseGateActionPlan,
|
createProjectReleaseGateActionPlan,
|
||||||
|
createProjectReleaseGateExecutionManifest,
|
||||||
createProjectReleaseGateManifest,
|
createProjectReleaseGateManifest,
|
||||||
createProjectReleaseGateResultMatrix,
|
createProjectReleaseGateResultMatrix,
|
||||||
createProjectReleaseReadinessArtifactJsonWorkflow,
|
createProjectReleaseReadinessArtifactJsonWorkflow,
|
||||||
|
|||||||
@@ -98,6 +98,16 @@ function arrayOrEmpty(value) {
|
|||||||
return Array.isArray(value) ? value : [];
|
return Array.isArray(value) ? value : [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function normalizeObservedOutput(value) {
|
||||||
|
if (Array.isArray(value)) {
|
||||||
|
return value.map((output) => String(output));
|
||||||
|
}
|
||||||
|
if (typeof value === "string") {
|
||||||
|
return [value];
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
export function createProjectReleaseGateManifest() {
|
export function createProjectReleaseGateManifest() {
|
||||||
return {
|
return {
|
||||||
apiName: "project-release-gate-manifest",
|
apiName: "project-release-gate-manifest",
|
||||||
@@ -113,6 +123,53 @@ export function createProjectReleaseGateManifest() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function createProjectReleaseGateExecutionManifest({
|
||||||
|
gateResults = {},
|
||||||
|
observedOutputs = [],
|
||||||
|
gateObservedOutputs = {},
|
||||||
|
manifest = createProjectReleaseGateManifest(),
|
||||||
|
} = {}) {
|
||||||
|
const globalOutputs = normalizeObservedOutput(observedOutputs);
|
||||||
|
const gates = arrayOrEmpty(manifest?.gates);
|
||||||
|
const rows = gates.map((gate) => {
|
||||||
|
const scopedOutputs = [
|
||||||
|
...normalizeObservedOutput(gateObservedOutputs?.[gate.id]),
|
||||||
|
...globalOutputs,
|
||||||
|
];
|
||||||
|
const matchedOutput = gate.expectedOutput
|
||||||
|
? scopedOutputs.find((output) => output.includes(gate.expectedOutput)) ?? null
|
||||||
|
: null;
|
||||||
|
const explicitPassed = gateResults?.[gate.id] === true;
|
||||||
|
const passed = explicitPassed || matchedOutput !== null;
|
||||||
|
return {
|
||||||
|
id: gate.id,
|
||||||
|
label: gate.label,
|
||||||
|
command: gate.command,
|
||||||
|
expectedOutput: gate.expectedOutput ?? null,
|
||||||
|
observedOutput: matchedOutput,
|
||||||
|
observedOutputCount: scopedOutputs.length,
|
||||||
|
status: passed ? "passed" : "unknown",
|
||||||
|
passed,
|
||||||
|
evidence: matchedOutput !== null
|
||||||
|
? "expected-output"
|
||||||
|
: (explicitPassed ? "explicit-result" : "missing"),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
apiName: "project-release-gate-execution-manifest",
|
||||||
|
manifestVersion: 1,
|
||||||
|
phase: rows.every(({ passed }) => passed) ? "ready" : "waiting",
|
||||||
|
ready: rows.every(({ passed }) => passed),
|
||||||
|
gateCount: rows.length,
|
||||||
|
passedCount: rows.filter(({ passed }) => passed).length,
|
||||||
|
unknownCount: rows.filter(({ passed }) => !passed).length,
|
||||||
|
missingGateIds: rows.filter(({ passed }) => !passed).map(({ id }) => id),
|
||||||
|
manifest,
|
||||||
|
rows,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export function createProjectReleaseGateResultMatrix({
|
export function createProjectReleaseGateResultMatrix({
|
||||||
gateResults = {},
|
gateResults = {},
|
||||||
observedOutputs = [],
|
observedOutputs = [],
|
||||||
@@ -206,6 +263,11 @@ export function createProjectReleaseReadinessReport({
|
|||||||
promotedRuntimeFamilies = [],
|
promotedRuntimeFamilies = [],
|
||||||
} = {}) {
|
} = {}) {
|
||||||
const gateManifest = createProjectReleaseGateManifest();
|
const gateManifest = createProjectReleaseGateManifest();
|
||||||
|
const gateExecutionManifest = createProjectReleaseGateExecutionManifest({
|
||||||
|
gateResults,
|
||||||
|
observedOutputs,
|
||||||
|
manifest: gateManifest,
|
||||||
|
});
|
||||||
const gateResultMatrix = createProjectReleaseGateResultMatrix({
|
const gateResultMatrix = createProjectReleaseGateResultMatrix({
|
||||||
gateResults,
|
gateResults,
|
||||||
observedOutputs,
|
observedOutputs,
|
||||||
@@ -249,6 +311,7 @@ export function createProjectReleaseReadinessReport({
|
|||||||
promotedRuntimeFamilies: promotedFamilies,
|
promotedRuntimeFamilies: promotedFamilies,
|
||||||
promotedBlockedFamilies,
|
promotedBlockedFamilies,
|
||||||
gateManifest,
|
gateManifest,
|
||||||
|
gateExecutionManifest,
|
||||||
gateResultMatrix,
|
gateResultMatrix,
|
||||||
gateActionPlan,
|
gateActionPlan,
|
||||||
gates: gateRows,
|
gates: gateRows,
|
||||||
@@ -358,6 +421,11 @@ export function createProjectReleaseReadinessArtifactValidationSummaryViewModel(
|
|||||||
label: "Gate manifest",
|
label: "Gate manifest",
|
||||||
value: validation?.gateManifestReady === true ? "ready" : "missing",
|
value: validation?.gateManifestReady === true ? "ready" : "missing",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: "gate-execution-manifest",
|
||||||
|
label: "Gate execution manifest",
|
||||||
|
value: validation?.gateExecutionManifestReady === true ? "ready" : "missing",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "gate-result-matrix",
|
id: "gate-result-matrix",
|
||||||
label: "Gate result matrix",
|
label: "Gate result matrix",
|
||||||
@@ -814,10 +882,12 @@ export function createProjectReleaseReadinessArtifactValidation(artifact = {}) {
|
|||||||
const releaseGate = objectOrEmpty(artifactObject.releaseGate);
|
const releaseGate = objectOrEmpty(artifactObject.releaseGate);
|
||||||
const simConfigInventory = objectOrEmpty(artifactObject.simConfigInventory);
|
const simConfigInventory = objectOrEmpty(artifactObject.simConfigInventory);
|
||||||
const gateManifest = objectOrEmpty(artifactObject.gateManifest);
|
const gateManifest = objectOrEmpty(artifactObject.gateManifest);
|
||||||
|
const gateExecutionManifest = objectOrEmpty(artifactObject.gateExecutionManifest);
|
||||||
const gateResultMatrix = objectOrEmpty(artifactObject.gateResultMatrix);
|
const gateResultMatrix = objectOrEmpty(artifactObject.gateResultMatrix);
|
||||||
const gateActionPlan = objectOrEmpty(artifactObject.gateActionPlan);
|
const gateActionPlan = objectOrEmpty(artifactObject.gateActionPlan);
|
||||||
const gates = arrayOrEmpty(artifactObject.gates);
|
const gates = arrayOrEmpty(artifactObject.gates);
|
||||||
const manifestGateIds = arrayOrEmpty(gateManifest.gateIds);
|
const manifestGateIds = arrayOrEmpty(gateManifest.gateIds);
|
||||||
|
const executionRows = arrayOrEmpty(gateExecutionManifest.rows);
|
||||||
const matrixRows = arrayOrEmpty(gateResultMatrix.rows);
|
const matrixRows = arrayOrEmpty(gateResultMatrix.rows);
|
||||||
const actionPlanCommands = arrayOrEmpty(gateActionPlan.commands);
|
const actionPlanCommands = arrayOrEmpty(gateActionPlan.commands);
|
||||||
const rows = arrayOrEmpty(artifactObject.rows);
|
const rows = arrayOrEmpty(artifactObject.rows);
|
||||||
@@ -834,6 +904,13 @@ export function createProjectReleaseReadinessArtifactValidation(artifact = {}) {
|
|||||||
&& gateResultMatrix.passedCount === REQUIRED_RELEASE_GATES.length
|
&& gateResultMatrix.passedCount === REQUIRED_RELEASE_GATES.length
|
||||||
&& gateResultMatrix.unknownCount === 0
|
&& gateResultMatrix.unknownCount === 0
|
||||||
&& matrixRows.length === REQUIRED_RELEASE_GATES.length;
|
&& matrixRows.length === REQUIRED_RELEASE_GATES.length;
|
||||||
|
const executionManifestReady = gateExecutionManifest.apiName === "project-release-gate-execution-manifest"
|
||||||
|
&& gateExecutionManifest.manifestVersion === 1
|
||||||
|
&& gateExecutionManifest.ready === true
|
||||||
|
&& gateExecutionManifest.passedCount === REQUIRED_RELEASE_GATES.length
|
||||||
|
&& gateExecutionManifest.unknownCount === 0
|
||||||
|
&& executionRows.length === REQUIRED_RELEASE_GATES.length
|
||||||
|
&& executionRows.every(({ command, status }) => typeof command === "string" && status === "passed");
|
||||||
const actionPlanReady = gateActionPlan.apiName === "project-release-gate-action-plan"
|
const actionPlanReady = gateActionPlan.apiName === "project-release-gate-action-plan"
|
||||||
&& gateActionPlan.planVersion === 1
|
&& gateActionPlan.planVersion === 1
|
||||||
&& gateActionPlan.ready === true
|
&& gateActionPlan.ready === true
|
||||||
@@ -858,6 +935,7 @@ export function createProjectReleaseReadinessArtifactValidation(artifact = {}) {
|
|||||||
: ["blockedRuntimeFamilies"]),
|
: ["blockedRuntimeFamilies"]),
|
||||||
...(arrayOrEmpty(artifactObject.promotedBlockedFamilies).length === 0 ? [] : ["promotedBlockedFamilies"]),
|
...(arrayOrEmpty(artifactObject.promotedBlockedFamilies).length === 0 ? [] : ["promotedBlockedFamilies"]),
|
||||||
...(manifestReady ? [] : ["gateManifest"]),
|
...(manifestReady ? [] : ["gateManifest"]),
|
||||||
|
...(executionManifestReady ? [] : ["gateExecutionManifest"]),
|
||||||
...(matrixReady ? [] : ["gateResultMatrix"]),
|
...(matrixReady ? [] : ["gateResultMatrix"]),
|
||||||
...(actionPlanReady ? [] : ["gateActionPlan"]),
|
...(actionPlanReady ? [] : ["gateActionPlan"]),
|
||||||
...(gateCountReady ? [] : ["gates.length"]),
|
...(gateCountReady ? [] : ["gates.length"]),
|
||||||
@@ -879,6 +957,7 @@ export function createProjectReleaseReadinessArtifactValidation(artifact = {}) {
|
|||||||
expectedGateCount: REQUIRED_RELEASE_GATES.length,
|
expectedGateCount: REQUIRED_RELEASE_GATES.length,
|
||||||
expectedGateIds,
|
expectedGateIds,
|
||||||
gateManifestReady: manifestReady,
|
gateManifestReady: manifestReady,
|
||||||
|
gateExecutionManifestReady: executionManifestReady,
|
||||||
gateResultMatrixReady: matrixReady,
|
gateResultMatrixReady: matrixReady,
|
||||||
gateActionPlanReady: actionPlanReady,
|
gateActionPlanReady: actionPlanReady,
|
||||||
blockedRuntimeFamilies: arrayOrEmpty(artifactObject.blockedRuntimeFamilies),
|
blockedRuntimeFamilies: arrayOrEmpty(artifactObject.blockedRuntimeFamilies),
|
||||||
@@ -898,6 +977,11 @@ export function createProjectReleaseReadinessArtifactValidation(artifact = {}) {
|
|||||||
label: "Gate manifest",
|
label: "Gate manifest",
|
||||||
value: manifestReady ? "ready" : "missing",
|
value: manifestReady ? "ready" : "missing",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: "gate-execution-manifest",
|
||||||
|
label: "Gate execution manifest",
|
||||||
|
value: executionManifestReady ? "ready" : "missing",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "gate-result-matrix",
|
id: "gate-result-matrix",
|
||||||
label: "Gate result matrix",
|
label: "Gate result matrix",
|
||||||
|
|||||||
@@ -469,9 +469,14 @@ TOOL_TABLE = browser-shell-tool.tbl
|
|||||||
);
|
);
|
||||||
assertEqual(
|
assertEqual(
|
||||||
workflowOverviewReleaseArtifactRenderResult.rowCount,
|
workflowOverviewReleaseArtifactRenderResult.rowCount,
|
||||||
6,
|
7,
|
||||||
"shell workflow overview release artifact render rows",
|
"shell workflow overview release artifact render rows",
|
||||||
);
|
);
|
||||||
|
assertEqual(
|
||||||
|
workflowOverviewReleaseArtifactRenderResult.rowIds.includes("gate-execution-manifest"),
|
||||||
|
true,
|
||||||
|
"shell workflow overview release artifact execution manifest row",
|
||||||
|
);
|
||||||
assertEqual(
|
assertEqual(
|
||||||
workflowOverviewReleaseArtifactMountResult.ready,
|
workflowOverviewReleaseArtifactMountResult.ready,
|
||||||
true,
|
true,
|
||||||
|
|||||||
@@ -262,9 +262,14 @@
|
|||||||
.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(releaseArtifactUrlWorkflow);
|
.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(releaseArtifactUrlWorkflow);
|
||||||
assertEqual(releaseArtifactDomReadinessReady.ready, true, "workflow overview release artifact DOM readiness");
|
assertEqual(releaseArtifactDomReadinessReady.ready, true, "workflow overview release artifact DOM readiness");
|
||||||
assertEqual(releaseArtifactRenderResult.rendered, true, "workflow overview release artifact render result");
|
assertEqual(releaseArtifactRenderResult.rendered, true, "workflow overview release artifact render result");
|
||||||
assertEqual(releaseArtifactRenderResult.rowCount, 6, "workflow overview release artifact render row count");
|
assertEqual(releaseArtifactRenderResult.rowCount, 7, "workflow overview release artifact render row count");
|
||||||
|
assertEqual(
|
||||||
|
releaseArtifactRenderResult.rowIds.includes("gate-execution-manifest"),
|
||||||
|
true,
|
||||||
|
"workflow overview release artifact execution manifest row",
|
||||||
|
);
|
||||||
assertEqual(releaseArtifactMountResult.ready, true, "workflow overview release artifact mount readiness");
|
assertEqual(releaseArtifactMountResult.ready, true, "workflow overview release artifact mount readiness");
|
||||||
assertEqual(releaseArtifactMountResult.renderResult.rowCount, 6, "workflow overview release artifact mount rows");
|
assertEqual(releaseArtifactMountResult.renderResult.rowCount, 7, "workflow overview release artifact mount rows");
|
||||||
assertEqual(releaseArtifactUrlWorkflow.ready, true, "workflow overview release artifact URL workflow readiness");
|
assertEqual(releaseArtifactUrlWorkflow.ready, true, "workflow overview release artifact URL workflow readiness");
|
||||||
assertEqual(releaseArtifactUrlWorkflow.httpStatus, 200, "workflow overview release artifact URL workflow status");
|
assertEqual(releaseArtifactUrlWorkflow.httpStatus, 200, "workflow overview release artifact URL workflow status");
|
||||||
assertEqual(
|
assertEqual(
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ for (const phrase of [
|
|||||||
"createProjectReleaseGateManifest()",
|
"createProjectReleaseGateManifest()",
|
||||||
"createProjectReleaseGateResultMatrix()",
|
"createProjectReleaseGateResultMatrix()",
|
||||||
"createProjectReleaseGateActionPlan()",
|
"createProjectReleaseGateActionPlan()",
|
||||||
|
"createProjectReleaseGateExecutionManifest()",
|
||||||
"createProjectReleaseReadinessReport()",
|
"createProjectReleaseReadinessReport()",
|
||||||
"createProjectReleaseReadinessSummaryViewModel()",
|
"createProjectReleaseReadinessSummaryViewModel()",
|
||||||
"parseProjectReleaseReadinessArtifactJson()",
|
"parseProjectReleaseReadinessArtifactJson()",
|
||||||
@@ -44,7 +45,7 @@ for (const phrase of [
|
|||||||
"loadProjectReleaseReadinessArtifactUrlWorkflow()",
|
"loadProjectReleaseReadinessArtifactUrlWorkflow()",
|
||||||
"createProjectReleaseReadinessArtifactUrlWorkflowActionPlan()",
|
"createProjectReleaseReadinessArtifactUrlWorkflowActionPlan()",
|
||||||
"createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel()",
|
"createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel()",
|
||||||
"embedded gate manifest, result matrix, and action plan",
|
"embedded gate manifest, execution manifest, result matrix, and",
|
||||||
"validateWorkflowOverviewReleaseReadinessArtifactJson()",
|
"validateWorkflowOverviewReleaseReadinessArtifactJson()",
|
||||||
"loadWorkflowOverviewReleaseReadinessArtifactUrl()",
|
"loadWorkflowOverviewReleaseReadinessArtifactUrl()",
|
||||||
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()",
|
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()",
|
||||||
@@ -122,6 +123,7 @@ for (const phrase of [
|
|||||||
"createProjectReleaseReadinessArtifactValidationActionPlan()",
|
"createProjectReleaseReadinessArtifactValidationActionPlan()",
|
||||||
"createProjectReleaseReadinessArtifactValidationSummaryViewModel()",
|
"createProjectReleaseReadinessArtifactValidationSummaryViewModel()",
|
||||||
"gateManifestReady",
|
"gateManifestReady",
|
||||||
|
"gateExecutionManifestReady",
|
||||||
"gateResultMatrixReady",
|
"gateResultMatrixReady",
|
||||||
"gateActionPlanReady",
|
"gateActionPlanReady",
|
||||||
"loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl()",
|
"loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl()",
|
||||||
|
|||||||
@@ -101,6 +101,207 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"gateExecutionManifest": {
|
||||||
|
"apiName": "project-release-gate-execution-manifest",
|
||||||
|
"manifestVersion": 1,
|
||||||
|
"phase": "ready",
|
||||||
|
"ready": true,
|
||||||
|
"gateCount": 10,
|
||||||
|
"passedCount": 10,
|
||||||
|
"unknownCount": 0,
|
||||||
|
"missingGateIds": [],
|
||||||
|
"manifest": {
|
||||||
|
"apiName": "project-release-gate-manifest",
|
||||||
|
"manifestVersion": 1,
|
||||||
|
"gateCount": 10,
|
||||||
|
"gateIds": [
|
||||||
|
"diff-check",
|
||||||
|
"vendor-sync",
|
||||||
|
"standalone-cnc-semantics",
|
||||||
|
"interp-wasm",
|
||||||
|
"sim-config-inventory",
|
||||||
|
"ini-panel-browser",
|
||||||
|
"release-artifact-url-browser",
|
||||||
|
"ui-node-smokes",
|
||||||
|
"host-smokes",
|
||||||
|
"project-release-gate"
|
||||||
|
],
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"id": "diff-check",
|
||||||
|
"label": "Git diff check",
|
||||||
|
"command": "git diff --check",
|
||||||
|
"expectedOutput": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "vendor-sync",
|
||||||
|
"label": "Vendor sync guard",
|
||||||
|
"command": "wasm-port/tools/verify_vendor_sync.sh",
|
||||||
|
"expectedOutput": "vendor sync up to date"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "standalone-cnc-semantics",
|
||||||
|
"label": "Standalone CNC semantics guard",
|
||||||
|
"command": "wasm-port/tools/verify_no_standalone_cnc_semantics.sh",
|
||||||
|
"expectedOutput": "standalone CNC semantics guard complete"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "interp-wasm",
|
||||||
|
"label": "Interpreter WASM Node smoke",
|
||||||
|
"command": "SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh",
|
||||||
|
"expectedOutput": "interp_wasm_node_smoke=ok"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "sim-config-inventory",
|
||||||
|
"label": "Sim config inventory WASM Node smoke",
|
||||||
|
"command": "SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh",
|
||||||
|
"expectedOutput": "sim_configs_wasm_node_inventory_unexpected_fail=0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ini-panel-browser",
|
||||||
|
"label": "INI panel browser smoke",
|
||||||
|
"command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh",
|
||||||
|
"expectedOutput": "browser_ini_shell_integration_workflow_smoke=ok"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "release-artifact-url-browser",
|
||||||
|
"label": "Release artifact URL browser workflow smoke",
|
||||||
|
"command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_release_artifact_url_workflow_browser.sh",
|
||||||
|
"expectedOutput": "browser_release_artifact_url_workflow_smoke=ok"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ui-node-smokes",
|
||||||
|
"label": "UI Node smokes",
|
||||||
|
"command": "wasm-port/tests/ui/node/verify_ui_node_smokes.sh",
|
||||||
|
"expectedOutput": "ui_node_smokes=ok"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "host-smokes",
|
||||||
|
"label": "Host aggregate smoke",
|
||||||
|
"command": "wasm-port/tests/host/verify_host_smokes.sh",
|
||||||
|
"expectedOutput": "host_wasm_opfs_browser_smokes=ok"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "project-release-gate",
|
||||||
|
"label": "Project release gate",
|
||||||
|
"command": "wasm-port/tests/host/verify_project_release_gate.sh",
|
||||||
|
"expectedOutput": "project_release_gate=ok"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"rows": [
|
||||||
|
{
|
||||||
|
"id": "diff-check",
|
||||||
|
"label": "Git diff check",
|
||||||
|
"command": "git diff --check",
|
||||||
|
"expectedOutput": null,
|
||||||
|
"observedOutput": null,
|
||||||
|
"observedOutputCount": 9,
|
||||||
|
"status": "passed",
|
||||||
|
"passed": true,
|
||||||
|
"evidence": "explicit-result"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "vendor-sync",
|
||||||
|
"label": "Vendor sync guard",
|
||||||
|
"command": "wasm-port/tools/verify_vendor_sync.sh",
|
||||||
|
"expectedOutput": "vendor sync up to date",
|
||||||
|
"observedOutput": "vendor sync up to date",
|
||||||
|
"observedOutputCount": 9,
|
||||||
|
"status": "passed",
|
||||||
|
"passed": true,
|
||||||
|
"evidence": "expected-output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "standalone-cnc-semantics",
|
||||||
|
"label": "Standalone CNC semantics guard",
|
||||||
|
"command": "wasm-port/tools/verify_no_standalone_cnc_semantics.sh",
|
||||||
|
"expectedOutput": "standalone CNC semantics guard complete",
|
||||||
|
"observedOutput": "standalone CNC semantics guard complete",
|
||||||
|
"observedOutputCount": 9,
|
||||||
|
"status": "passed",
|
||||||
|
"passed": true,
|
||||||
|
"evidence": "expected-output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "interp-wasm",
|
||||||
|
"label": "Interpreter WASM Node smoke",
|
||||||
|
"command": "SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh",
|
||||||
|
"expectedOutput": "interp_wasm_node_smoke=ok",
|
||||||
|
"observedOutput": "interp_wasm_node_smoke=ok",
|
||||||
|
"observedOutputCount": 9,
|
||||||
|
"status": "passed",
|
||||||
|
"passed": true,
|
||||||
|
"evidence": "expected-output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "sim-config-inventory",
|
||||||
|
"label": "Sim config inventory WASM Node smoke",
|
||||||
|
"command": "SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh",
|
||||||
|
"expectedOutput": "sim_configs_wasm_node_inventory_unexpected_fail=0",
|
||||||
|
"observedOutput": "sim_configs_wasm_node_inventory_unexpected_fail=0",
|
||||||
|
"observedOutputCount": 9,
|
||||||
|
"status": "passed",
|
||||||
|
"passed": true,
|
||||||
|
"evidence": "expected-output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ini-panel-browser",
|
||||||
|
"label": "INI panel browser smoke",
|
||||||
|
"command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh",
|
||||||
|
"expectedOutput": "browser_ini_shell_integration_workflow_smoke=ok",
|
||||||
|
"observedOutput": "browser_ini_shell_integration_workflow_smoke=ok",
|
||||||
|
"observedOutputCount": 9,
|
||||||
|
"status": "passed",
|
||||||
|
"passed": true,
|
||||||
|
"evidence": "expected-output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "release-artifact-url-browser",
|
||||||
|
"label": "Release artifact URL browser workflow smoke",
|
||||||
|
"command": "SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_release_artifact_url_workflow_browser.sh",
|
||||||
|
"expectedOutput": "browser_release_artifact_url_workflow_smoke=ok",
|
||||||
|
"observedOutput": "browser_release_artifact_url_workflow_smoke=ok",
|
||||||
|
"observedOutputCount": 9,
|
||||||
|
"status": "passed",
|
||||||
|
"passed": true,
|
||||||
|
"evidence": "expected-output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ui-node-smokes",
|
||||||
|
"label": "UI Node smokes",
|
||||||
|
"command": "wasm-port/tests/ui/node/verify_ui_node_smokes.sh",
|
||||||
|
"expectedOutput": "ui_node_smokes=ok",
|
||||||
|
"observedOutput": "ui_node_smokes=ok",
|
||||||
|
"observedOutputCount": 9,
|
||||||
|
"status": "passed",
|
||||||
|
"passed": true,
|
||||||
|
"evidence": "expected-output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "host-smokes",
|
||||||
|
"label": "Host aggregate smoke",
|
||||||
|
"command": "wasm-port/tests/host/verify_host_smokes.sh",
|
||||||
|
"expectedOutput": "host_wasm_opfs_browser_smokes=ok",
|
||||||
|
"observedOutput": "host_wasm_opfs_browser_smokes=ok",
|
||||||
|
"observedOutputCount": 9,
|
||||||
|
"status": "passed",
|
||||||
|
"passed": true,
|
||||||
|
"evidence": "expected-output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "project-release-gate",
|
||||||
|
"label": "Project release gate",
|
||||||
|
"command": "wasm-port/tests/host/verify_project_release_gate.sh",
|
||||||
|
"expectedOutput": "project_release_gate=ok",
|
||||||
|
"observedOutput": "project_release_gate=ok",
|
||||||
|
"observedOutputCount": 9,
|
||||||
|
"status": "passed",
|
||||||
|
"passed": true,
|
||||||
|
"evidence": "expected-output"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
"gateResultMatrix": {
|
"gateResultMatrix": {
|
||||||
"apiName": "project-release-gate-result-matrix",
|
"apiName": "project-release-gate-result-matrix",
|
||||||
"matrixVersion": 1,
|
"matrixVersion": 1,
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ assert.equal(validation.artifactVersion, 1);
|
|||||||
assert.equal(validation.gateCount, 10);
|
assert.equal(validation.gateCount, 10);
|
||||||
assert.equal(validation.expectedGateCount, 10);
|
assert.equal(validation.expectedGateCount, 10);
|
||||||
assert.equal(validation.gateManifestReady, true);
|
assert.equal(validation.gateManifestReady, true);
|
||||||
|
assert.equal(validation.gateExecutionManifestReady, true);
|
||||||
assert.equal(validation.gateResultMatrixReady, true);
|
assert.equal(validation.gateResultMatrixReady, true);
|
||||||
assert.equal(validation.gateActionPlanReady, true);
|
assert.equal(validation.gateActionPlanReady, true);
|
||||||
assert.deepEqual(validation.expectedGateIds, [
|
assert.deepEqual(validation.expectedGateIds, [
|
||||||
@@ -38,6 +39,8 @@ assert.deepEqual(validation.expectedGateIds, [
|
|||||||
"project-release-gate",
|
"project-release-gate",
|
||||||
]);
|
]);
|
||||||
assert.equal(artifact.gateManifest.apiName, "project-release-gate-manifest");
|
assert.equal(artifact.gateManifest.apiName, "project-release-gate-manifest");
|
||||||
|
assert.equal(artifact.gateExecutionManifest.apiName, "project-release-gate-execution-manifest");
|
||||||
|
assert.equal(artifact.gateExecutionManifest.passedCount, 10);
|
||||||
assert.equal(artifact.gateResultMatrix.apiName, "project-release-gate-result-matrix");
|
assert.equal(artifact.gateResultMatrix.apiName, "project-release-gate-result-matrix");
|
||||||
assert.equal(artifact.gateActionPlan.apiName, "project-release-gate-action-plan");
|
assert.equal(artifact.gateActionPlan.apiName, "project-release-gate-action-plan");
|
||||||
assert.equal(artifact.gateActionPlan.pendingCount, 0);
|
assert.equal(artifact.gateActionPlan.pendingCount, 0);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import assert from "node:assert/strict";
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
createProjectReleaseGateActionPlan,
|
createProjectReleaseGateActionPlan,
|
||||||
|
createProjectReleaseGateExecutionManifest,
|
||||||
createProjectReleaseGateManifest,
|
createProjectReleaseGateManifest,
|
||||||
createProjectReleaseGateResultMatrix,
|
createProjectReleaseGateResultMatrix,
|
||||||
createProjectReleaseReadinessArtifactJsonWorkflow,
|
createProjectReleaseReadinessArtifactJsonWorkflow,
|
||||||
@@ -85,6 +86,40 @@ assert.deepEqual(
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const partialExecutionManifest = createProjectReleaseGateExecutionManifest({
|
||||||
|
gateResults: {
|
||||||
|
"diff-check": true,
|
||||||
|
},
|
||||||
|
observedOutputs: [
|
||||||
|
"vendor sync up to date",
|
||||||
|
"browser_release_artifact_url_workflow_smoke=ok",
|
||||||
|
],
|
||||||
|
});
|
||||||
|
assert.equal(partialExecutionManifest.apiName, "project-release-gate-execution-manifest");
|
||||||
|
assert.equal(partialExecutionManifest.manifestVersion, 1);
|
||||||
|
assert.equal(partialExecutionManifest.phase, "waiting");
|
||||||
|
assert.equal(partialExecutionManifest.ready, false);
|
||||||
|
assert.equal(partialExecutionManifest.gateCount, 10);
|
||||||
|
assert.equal(partialExecutionManifest.passedCount, 3);
|
||||||
|
assert.equal(partialExecutionManifest.unknownCount, 7);
|
||||||
|
assert.deepEqual(partialExecutionManifest.missingGateIds, partialMatrix.missingGateIds);
|
||||||
|
assert.deepEqual(
|
||||||
|
partialExecutionManifest.rows.filter(({ passed }) => passed).map(({ id, evidence }) => [id, evidence]),
|
||||||
|
[
|
||||||
|
["diff-check", "explicit-result"],
|
||||||
|
["vendor-sync", "expected-output"],
|
||||||
|
["release-artifact-url-browser", "expected-output"],
|
||||||
|
],
|
||||||
|
);
|
||||||
|
assert.equal(
|
||||||
|
partialExecutionManifest.rows.find(({ id }) => id === "vendor-sync")?.observedOutput,
|
||||||
|
"vendor sync up to date",
|
||||||
|
);
|
||||||
|
assert.equal(
|
||||||
|
partialExecutionManifest.rows.find(({ id }) => id === "standalone-cnc-semantics")?.observedOutput,
|
||||||
|
null,
|
||||||
|
);
|
||||||
|
|
||||||
const partialActionPlan = createProjectReleaseGateActionPlan({ gateResultMatrix: partialMatrix });
|
const partialActionPlan = createProjectReleaseGateActionPlan({ gateResultMatrix: partialMatrix });
|
||||||
assert.equal(partialActionPlan.apiName, "project-release-gate-action-plan");
|
assert.equal(partialActionPlan.apiName, "project-release-gate-action-plan");
|
||||||
assert.equal(partialActionPlan.planVersion, 1);
|
assert.equal(partialActionPlan.planVersion, 1);
|
||||||
@@ -120,6 +155,9 @@ const report = createProjectReleaseReadinessReport({
|
|||||||
gateResults: Object.fromEntries(manifest.gateIds.map((id) => [id, true])),
|
gateResults: Object.fromEntries(manifest.gateIds.map((id) => [id, true])),
|
||||||
});
|
});
|
||||||
assert.deepEqual(report.gateManifest, manifest);
|
assert.deepEqual(report.gateManifest, manifest);
|
||||||
|
assert.equal(report.gateExecutionManifest.apiName, "project-release-gate-execution-manifest");
|
||||||
|
assert.equal(report.gateExecutionManifest.ready, true);
|
||||||
|
assert.equal(report.gateExecutionManifest.passedCount, manifest.gateCount);
|
||||||
assert.equal(report.gateResultMatrix.ready, true);
|
assert.equal(report.gateResultMatrix.ready, true);
|
||||||
assert.equal(report.gateResultMatrix.passedCount, manifest.gateCount);
|
assert.equal(report.gateResultMatrix.passedCount, manifest.gateCount);
|
||||||
assert.equal(report.gateActionPlan.ready, true);
|
assert.equal(report.gateActionPlan.ready, true);
|
||||||
@@ -209,6 +247,7 @@ assert.deepEqual(
|
|||||||
["artifact", "project-release-readiness-report"],
|
["artifact", "project-release-readiness-report"],
|
||||||
["gate-count", "10/10"],
|
["gate-count", "10/10"],
|
||||||
["gate-manifest", "ready"],
|
["gate-manifest", "ready"],
|
||||||
|
["gate-execution-manifest", "ready"],
|
||||||
["gate-result-matrix", "ready"],
|
["gate-result-matrix", "ready"],
|
||||||
["gate-action-plan", "ready"],
|
["gate-action-plan", "ready"],
|
||||||
["missing", "none"],
|
["missing", "none"],
|
||||||
@@ -332,6 +371,10 @@ const failedArtifactUrlWorkflowSummary = createProjectReleaseReadinessArtifactUr
|
|||||||
assert.equal(staleArtifactValidationSummary.phase, "blocked");
|
assert.equal(staleArtifactValidationSummary.phase, "blocked");
|
||||||
assert.match(staleArtifactValidationSummary.statusLine, /^Blocked: apiName, reportVersion/);
|
assert.match(staleArtifactValidationSummary.statusLine, /^Blocked: apiName, reportVersion/);
|
||||||
assert.equal(staleArtifactValidationSummary.rows.find(({ id }) => id === "gate-action-plan")?.value, "missing");
|
assert.equal(staleArtifactValidationSummary.rows.find(({ id }) => id === "gate-action-plan")?.value, "missing");
|
||||||
|
assert.equal(
|
||||||
|
staleArtifactValidationSummary.rows.find(({ id }) => id === "gate-execution-manifest")?.value,
|
||||||
|
"missing",
|
||||||
|
);
|
||||||
assert.equal(staleArtifactValidationActionPlan.phase, "blocked");
|
assert.equal(staleArtifactValidationActionPlan.phase, "blocked");
|
||||||
assert.equal(staleArtifactValidationActionPlan.ready, false);
|
assert.equal(staleArtifactValidationActionPlan.ready, false);
|
||||||
assert.equal(staleArtifactValidationActionPlan.missingCount, staleArtifactValidation.missing.length);
|
assert.equal(staleArtifactValidationActionPlan.missingCount, staleArtifactValidation.missing.length);
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import {
|
|||||||
createMachineSessionPersistenceRenderState,
|
createMachineSessionPersistenceRenderState,
|
||||||
createMachineSessionPersistenceSummary,
|
createMachineSessionPersistenceSummary,
|
||||||
createProjectReleaseGateActionPlan,
|
createProjectReleaseGateActionPlan,
|
||||||
|
createProjectReleaseGateExecutionManifest,
|
||||||
createProjectReleaseGateManifest,
|
createProjectReleaseGateManifest,
|
||||||
createProjectReleaseGateResultMatrix,
|
createProjectReleaseGateResultMatrix,
|
||||||
createProjectReleaseReadinessArtifactJsonWorkflow,
|
createProjectReleaseReadinessArtifactJsonWorkflow,
|
||||||
@@ -96,6 +97,7 @@ const requiredExports = [
|
|||||||
["createLinuxCncIniSdk", createLinuxCncIniSdk],
|
["createLinuxCncIniSdk", createLinuxCncIniSdk],
|
||||||
["createLinuxCncInterpSdk", createLinuxCncInterpSdk],
|
["createLinuxCncInterpSdk", createLinuxCncInterpSdk],
|
||||||
["createProjectReleaseGateActionPlan", createProjectReleaseGateActionPlan],
|
["createProjectReleaseGateActionPlan", createProjectReleaseGateActionPlan],
|
||||||
|
["createProjectReleaseGateExecutionManifest", createProjectReleaseGateExecutionManifest],
|
||||||
["createProjectReleaseGateManifest", createProjectReleaseGateManifest],
|
["createProjectReleaseGateManifest", createProjectReleaseGateManifest],
|
||||||
["createProjectReleaseGateResultMatrix", createProjectReleaseGateResultMatrix],
|
["createProjectReleaseGateResultMatrix", createProjectReleaseGateResultMatrix],
|
||||||
["createProjectReleaseReadinessArtifactJsonWorkflow", createProjectReleaseReadinessArtifactJsonWorkflow],
|
["createProjectReleaseReadinessArtifactJsonWorkflow", createProjectReleaseReadinessArtifactJsonWorkflow],
|
||||||
@@ -302,6 +304,7 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
|
|||||||
expectedGateCount: 10,
|
expectedGateCount: 10,
|
||||||
expectedGateIds: createProjectReleaseGateManifest().gateIds,
|
expectedGateIds: createProjectReleaseGateManifest().gateIds,
|
||||||
gateManifestReady: true,
|
gateManifestReady: true,
|
||||||
|
gateExecutionManifestReady: true,
|
||||||
gateResultMatrixReady: true,
|
gateResultMatrixReady: true,
|
||||||
gateActionPlanReady: true,
|
gateActionPlanReady: true,
|
||||||
blockedRuntimeFamilies: [
|
blockedRuntimeFamilies: [
|
||||||
@@ -325,6 +328,11 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
|
|||||||
label: "Gate manifest",
|
label: "Gate manifest",
|
||||||
value: "ready",
|
value: "ready",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: "gate-execution-manifest",
|
||||||
|
label: "Gate execution manifest",
|
||||||
|
value: "ready",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "gate-result-matrix",
|
id: "gate-result-matrix",
|
||||||
label: "Gate result matrix",
|
label: "Gate result matrix",
|
||||||
@@ -428,6 +436,7 @@ assert.deepEqual(
|
|||||||
"simConfigInventory.unexpectedFail",
|
"simConfigInventory.unexpectedFail",
|
||||||
"blockedRuntimeFamilies",
|
"blockedRuntimeFamilies",
|
||||||
"gateManifest",
|
"gateManifest",
|
||||||
|
"gateExecutionManifest",
|
||||||
"gateResultMatrix",
|
"gateResultMatrix",
|
||||||
"gateActionPlan",
|
"gateActionPlan",
|
||||||
"gates.length",
|
"gates.length",
|
||||||
|
|||||||
@@ -1366,14 +1366,18 @@ const releaseArtifactMountResult = mountIniPanelShellWorkflowOverviewReleaseRead
|
|||||||
rowsNode: releaseArtifactRowsNode,
|
rowsNode: releaseArtifactRowsNode,
|
||||||
});
|
});
|
||||||
assert.equal(releaseArtifactRenderResult.rendered, true);
|
assert.equal(releaseArtifactRenderResult.rendered, true);
|
||||||
assert.equal(releaseArtifactRenderResult.rowCount, 6);
|
assert.equal(releaseArtifactRenderResult.rowCount, 7);
|
||||||
assert.equal(releaseArtifactRenderResult.dataset.handoffScope, "workflow-overview-release-readiness-artifact");
|
assert.equal(releaseArtifactRenderResult.dataset.handoffScope, "workflow-overview-release-readiness-artifact");
|
||||||
|
assert.equal(
|
||||||
|
releaseArtifactRenderResult.rowIds.includes("gate-execution-manifest"),
|
||||||
|
true,
|
||||||
|
);
|
||||||
assert.equal(
|
assert.equal(
|
||||||
releaseArtifactRenderResult.rowIds.includes("gate-action-plan"),
|
releaseArtifactRenderResult.rowIds.includes("gate-action-plan"),
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
assert.equal(releaseArtifactMountResult.ready, true);
|
assert.equal(releaseArtifactMountResult.ready, true);
|
||||||
assert.equal(releaseArtifactMountResult.renderResult.rowCount, 6);
|
assert.equal(releaseArtifactMountResult.renderResult.rowCount, 7);
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{").missing,
|
validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{").missing,
|
||||||
["artifact-json"],
|
["artifact-json"],
|
||||||
@@ -1414,7 +1418,7 @@ assert.equal(
|
|||||||
);
|
);
|
||||||
assert.equal(releaseArtifactUrlWorkflow.renderState.statusLine, "Ready: No blocking reasons");
|
assert.equal(releaseArtifactUrlWorkflow.renderState.statusLine, "Ready: No blocking reasons");
|
||||||
assert.equal(releaseArtifactUrlWorkflow.mountResult.ready, true);
|
assert.equal(releaseArtifactUrlWorkflow.mountResult.ready, true);
|
||||||
assert.equal(releaseArtifactUrlWorkflow.mountResult.renderResult.rowCount, 6);
|
assert.equal(releaseArtifactUrlWorkflow.mountResult.renderResult.rowCount, 7);
|
||||||
const releaseArtifactUrlWorkflowSummary =
|
const releaseArtifactUrlWorkflowSummary =
|
||||||
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
|
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
|
||||||
releaseArtifactUrlWorkflow,
|
releaseArtifactUrlWorkflow,
|
||||||
|
|||||||
Reference in New Issue
Block a user