53 个 Python-remap inventory rows 批量提升为 PASS

结论:53 个 Python-remap inventory rows 已完成 row proof、browser proof 与 inventory baseline promotion,当前 inventory baseline 为 PASS=82 / SKIP=77 / unexpected_fail=0。
This commit is contained in:
2026-06-20 05:53:49 +08:00
parent ac52b48d62
commit b057f8038b
29 changed files with 1701 additions and 245 deletions

View File

@@ -986,7 +986,7 @@ TOOL_TABLE = browser-shell-tool.tbl
);
assertEqual(
workflowOverviewReleaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "promotion-candidate-layers")?.value,
"evidence-ready=8 inventory-ready=19",
"evidence-ready=8 inventory-ready=2",
"shell workflow overview release artifact URL workflow candidate layers",
);
assertEqual(

View File

@@ -421,7 +421,7 @@
preferredGcodePath: "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc",
blockedCandidateIds: [],
explicitBrowserDiagnosticsCount: 8,
inventoryBaseline: "executed=29 passed=29 skipped=130 unexpected_fail=0",
inventoryBaseline: "executed=82 passed=82 skipped=77 unexpected_fail=0",
},
virtualHalSimConfigMacroLoadFixtures: createVirtualHalSimConfigMacroLoadFixtureReport({
manifestEntries: [
@@ -637,7 +637,7 @@
);
assertEqual(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "promotion-candidate-layers")?.value,
"evidence-ready=8 inventory-ready=19",
"evidence-ready=8 inventory-ready=2",
"workflow overview release artifact URL workflow candidate layers",
);
assertEqual(
@@ -772,7 +772,7 @@
);
assertEqual(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "virtual-hal-promotion-candidate-baseline")?.value,
"executed=29 passed=29 skipped=130 unexpected_fail=0",
"executed=82 passed=82 skipped=77 unexpected_fail=0",
"workflow overview release artifact URL workflow candidate baseline",
);
assertEqual(
@@ -787,7 +787,7 @@
);
assertEqual(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-locked-rows")?.value,
"18",
"1",
"workflow overview release artifact URL workflow locked hard-block rows",
);
assertEqual(
@@ -807,17 +807,17 @@
);
assertEqual(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-family-summary")?.value,
"L4-USER-M-PROCESS:1 locked=yes, L4-PYTHON-REMAP:17 locked=yes",
"L4-USER-M-PROCESS:1 locked=yes, L4-PYTHON-REMAP:0 locked=yes",
"workflow overview release artifact URL workflow hard-block family summary",
);
assertEqual(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-detail-row-count")?.value,
"18",
"1",
"workflow overview release artifact URL workflow hard-block detail count",
);
assertEqual(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-detail-preview-1")?.value,
"L4-PYTHON-REMAP:axis/laser/raster_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0",
"L4-USER-M-PROCESS:axis/vismach/millturn/example.ngc; reason=design_m128_m129_linuxcnc_state_boundary; next=kinstype_guard_and_ini_xyz_hal_pin_state; promotion_allowed=0",
"workflow overview release artifact URL workflow hard-block detail preview",
);
assertEqual(
@@ -948,7 +948,7 @@
);
assertEqual(
workflowDoc.querySelector('[data-workflow-overview-release-readiness-artifact-url-workflow-value="promotion-candidate-layers"]').textContent,
"evidence-ready=8 inventory-ready=19",
"evidence-ready=8 inventory-ready=2",
"workflow overview fixed URL workflow form candidate layer row",
);
assertEqual(

View File

@@ -98,6 +98,7 @@
"next-boundary-recommendations.tsv",
"next-boundary-worklist.tsv",
"promotion-candidates.tsv",
"python-remap-browser-row-proof.tsv",
"python-remap-bulk-promotion-plan.tsv",
"python-remap-boundary-summary.tsv",
"python-remap-family-summary.tsv",
@@ -109,6 +110,7 @@
"python-remap-row-runtime-proof.tsv",
"python-remap-runtime-contract.tsv",
"python-remap-runtime-gates.tsv",
"python-remap-wasm-node-row-proof.tsv",
"runtime-boundary-contract-summary.tsv",
"runtime-boundary-family-host-readiness.tsv",
"runtime-boundary-host-preflight.tsv",
@@ -153,7 +155,7 @@
"build/native/source-probes.tsv",
];
if (wasmArtifactNames.length !== 57 || new Set(wasmArtifactNames).size !== wasmArtifactNames.length) {
if (wasmArtifactNames.length !== 59 || new Set(wasmArtifactNames).size !== wasmArtifactNames.length) {
throw new Error("browser_generated_artifact_documentation_coverage: WASM artifact list drift");
}
if (nativeArtifactTokens.length !== 8 || new Set(nativeArtifactTokens).size !== nativeArtifactTokens.length) {

View File

@@ -33,10 +33,22 @@ self.linuxCncPythonRemapRuntimeProvider = {
return { value: "generator-finished" };
},
async stageNgcRemapAsset(message) {
return { value: message.ngcPath };
},
async rejectNgcOnlyStandalone(message) {
return { value: message.ngcPath };
},
async exportInterpreterState() {
return { value: "interpreter-state-bound" };
},
async exportCanonicalEvents() {
return { value: "canonical-events-bound" };
},
async exportDiagnostics() {
return { value: "diagnostics-exported" };
},

View File

@@ -6,11 +6,14 @@
</head>
<body>
<pre id="status">running</pre>
<pre id="python-remap-browser-row-proof"></pre>
<script type="module">
import {
createLinuxCncPythonRemapBrowserWorkerAdapter,
createLinuxCncPythonRemapRowRuntimePort,
createLinuxCncPythonRemapRuntimePort,
createPythonRemapRuntimeDiagnostics,
validatePythonRemapRowRuntimeTranscript,
validatePythonRemapLifecycleTranscript,
} from "../../runtime/sdk/src/index.js";
@@ -22,6 +25,58 @@
}
}
function assertDeepEqual(actual, expected, label) {
const actualText = JSON.stringify(actual);
const expectedText = JSON.stringify(expected);
if (actualText !== expectedText) {
throw new Error(`${label}: expected ${expectedText}, got ${actualText}`);
}
}
function parseTsv(text, expectedHeaders = null) {
const [headerLine, ...rows] = text.trim().split("\n");
const headers = headerLine.split("\t");
if (expectedHeaders) {
assertDeepEqual(headers, expectedHeaders, "TSV header schema drift");
}
return rows.filter(Boolean).map((row) => {
const values = row.split("\t");
return Object.fromEntries(headers.map((header, index) => [header, values[index] ?? ""]));
});
}
function splitSummaryList(value) {
return String(value ?? "-")
.split(",")
.map((entry) => entry.trim())
.filter((entry) => entry.length > 0 && entry !== "-");
}
function listValue(values) {
const filtered = [...new Set(values.filter(Boolean))].sort();
return filtered.length === 0 ? "-" : filtered.join(",");
}
function flagValue(value) {
return value ? "1" : "0";
}
function tsvValue(value) {
return String(value ?? "-").replace(/\t|\r?\n/g, " ");
}
function verifySamePathSet(label, expectedPaths, actualPaths) {
assertDeepEqual([...actualPaths].sort(), [...expectedPaths].sort(), `${label}: path set drift`);
}
async function fetchText(path) {
const response = await fetch(path, { cache: "no-store" });
if (!response.ok) {
throw new Error(`${path}: fetch failed with ${response.status}`);
}
return response.text();
}
try {
const contractOnlyPort = createLinuxCncPythonRemapRuntimePort({
runtimeMode: "contract-only",
@@ -121,6 +176,232 @@
assertEqual(diagnostics.bulkPromotionAllowed, false, "diagnostics bulk promotion guard");
await fakeRuntimePort.close();
const rowRuntimeProofHeaders = [
"path",
"ini",
"family",
"row_runtime_port_api_ready",
"row_runtime_plan_ready",
"row_runtime_proof_targets",
"python_modules_staged",
"toplevel_executed",
"path_prepend_applied",
"python_remap_functions_bound",
"prolog_functions_bound",
"epilog_functions_bound",
"generator_lifecycle_ready",
"ngc_remap_assets_staged",
"ngc_only_subpaths_not_standalone",
"interpreter_state_binding_ready",
"canonical_events_ready",
"row_runtime_transcript_ready",
"native_pass_ready",
"wasm_node_pass_ready",
"browser_pass_ready",
"execution_enabled",
"proof_status",
"blockers",
"notes",
];
const wasmNodeProofHeaders = [
"path",
"ini",
"family",
"native_pass_ready",
"wasm_node_runtime_bridge_ready",
"wasm_node_plan_executed",
"module_import_ready",
"callable_lookup_ready",
"generator_lifecycle_ready",
"ngc_remap_assets_ready",
"ngc_only_subpaths_guarded",
"interpreter_state_binding_ready",
"canonical_events_ready",
"row_runtime_transcript_ready",
"transcript_phase_count",
"transcript_hash",
"wasm_node_pass_ready",
"browser_pass_ready",
"execution_enabled",
"promotion_allowed",
"proof_status",
"blockers",
"notes",
];
const boundaryHeaders = [
"path",
"ini",
"blocked",
"design_status",
"python_modules",
"python_remap_functions",
"prolog_functions",
"epilog_functions",
"remap_ngc_files",
"ngc_only_subpaths",
"hal_process",
"ui_process",
"halui_mdi_process",
"linuxcnc_owner",
"python_runtime_evidence",
"required_boundary",
"execution_enabled",
"notes",
];
const rowRuntimeProofRows = parseTsv(
await fetchText("../../build/wasm/sim-configs-inventory/python-remap-row-runtime-proof.tsv"),
rowRuntimeProofHeaders,
);
const wasmNodeRows = parseTsv(
await fetchText("../../build/wasm/sim-configs-inventory/python-remap-wasm-node-row-proof.tsv"),
wasmNodeProofHeaders,
);
const boundaryRows = parseTsv(
await fetchText("../../build/wasm/sim-configs-inventory/python-remap-boundary-summary.tsv"),
boundaryHeaders,
);
assertEqual(rowRuntimeProofRows.length, 53, "browser row proof input row count");
assertEqual(wasmNodeRows.length, 53, "browser row proof Node input row count");
assertEqual(boundaryRows.length, 53, "browser row proof boundary row count");
verifySamePathSet(
"browser_row_wasm_node_alignment",
rowRuntimeProofRows.map((row) => row.path),
wasmNodeRows.map((row) => row.path),
);
verifySamePathSet(
"browser_row_boundary_alignment",
rowRuntimeProofRows.map((row) => row.path),
boundaryRows.map((row) => row.path),
);
const wasmNodeByPath = new Map(wasmNodeRows.map((row) => [row.path, row]));
const boundaryByPath = new Map(boundaryRows.map((row) => [row.path, row]));
const browserProofHeaders = [
"path",
"ini",
"family",
"wasm_node_pass_ready",
"browser_runtime_bridge_ready",
"browser_worker_plan_executed",
"module_import_ready",
"callable_lookup_ready",
"generator_lifecycle_ready",
"ngc_remap_assets_ready",
"ngc_only_subpaths_guarded",
"interpreter_state_binding_ready",
"canonical_events_ready",
"row_runtime_transcript_ready",
"transcript_phase_count",
"transcript_hash",
"browser_pass_ready",
"execution_enabled",
"promotion_allowed",
"proof_status",
"blockers",
"notes",
];
const browserProofRows = [];
for (const row of rowRuntimeProofRows) {
const wasmNode = wasmNodeByPath.get(row.path);
const boundary = boundaryByPath.get(row.path);
if (!wasmNode || !boundary) {
throw new Error(`${row.path}: missing browser row proof prerequisite`);
}
assertEqual(row.native_pass_ready, "1", `${row.path}: native pass prerequisite`);
assertEqual(row.wasm_node_pass_ready, "1", `${row.path}: row proof Node prerequisite`);
assertEqual(wasmNode.wasm_node_pass_ready, "1", `${row.path}: Node artifact prerequisite`);
assertEqual(wasmNode.proof_status, "wasm_node_row_runtime_bridge_passed", `${row.path}: Node artifact proof status`);
assertEqual(boundary.ini, row.ini, `${row.path}: boundary INI drift`);
const context = {
path: row.path,
iniPath: row.ini,
family: row.family,
machineRoot: row.ini.split("/").slice(0, -1).join("/"),
pythonPathPrepend: row.path_prepend_applied === "1" ? "inventory-configured-path" : "-",
topLevelPath: row.toplevel_executed === "1" ? "inventory-configured-toplevel" : "-",
sourceFiles: row.python_modules_staged === "1" ? splitSummaryList(boundary.python_modules) : [],
pythonRemapFunctions: row.python_remap_functions_bound === "1" ? splitSummaryList(boundary.python_remap_functions) : [],
prologFunctions: row.prolog_functions_bound === "1" ? splitSummaryList(boundary.prolog_functions) : [],
epilogFunctions: row.epilog_functions_bound === "1" ? splitSummaryList(boundary.epilog_functions) : [],
ngcRemapFiles: row.ngc_remap_assets_staged === "1" ? splitSummaryList(boundary.remap_ngc_files) : [],
ngcOnlySubpaths: row.ngc_only_subpaths_not_standalone === "1" && row.row_runtime_proof_targets.includes("ngc_only_subpath_rejection")
? splitSummaryList(boundary.ngc_only_subpaths)
: [],
};
const rowAdapter = createLinuxCncPythonRemapBrowserWorkerAdapter({
workerUrl: new URL("../../runtime/workers/python-remap-worker.js", import.meta.url),
pythonRuntimeModuleUrl: new URL("./python_remap_fake_runtime_worker.js", import.meta.url),
});
const rowPort = createLinuxCncPythonRemapRowRuntimePort({
...context,
runtimeMode: rowAdapter.runtimeMode,
runtimeAdapter: rowAdapter,
});
const start = await rowPort.start();
assertEqual(start.runtimeExecutionReady, true, `${row.path}: browser row bridge readiness`);
const planResult = await rowPort.runRowRuntimePlan();
assertEqual(planResult.status, "row_runtime_adapter_plan_executed", `${row.path}: browser row plan status`);
assertEqual(planResult.validation.ready, true, `${row.path}: browser row plan validation`);
const rowTranscript = rowPort.exportTranscript();
const rowValidation = validatePythonRemapRowRuntimeTranscript({
...context,
rowPath: row.path,
transcript: rowTranscript,
});
assertEqual(rowValidation.ready, true, `${row.path}: browser explicit row validation`);
const rowDiagnostics = rowPort.exportDiagnostics();
assertEqual(rowDiagnostics.runtimeMode, "browser-python-wasm-worker", `${row.path}: browser runtime mode`);
assertEqual(rowDiagnostics.runtimeExecutionReady, true, `${row.path}: browser runtime ready`);
assertEqual(rowDiagnostics.rowRuntimeTranscriptReady, true, `${row.path}: browser diagnostics transcript`);
assertEqual(rowDiagnostics.executionEnabled, false, `${row.path}: browser proof execution guard`);
assertEqual(rowDiagnostics.promotionAllowed, false, `${row.path}: browser proof promotion guard`);
await rowPort.close();
browserProofRows.push([
row.path,
row.ini,
row.family,
row.wasm_node_pass_ready,
flagValue(start.runtimeExecutionReady),
flagValue(planResult.status === "row_runtime_adapter_plan_executed"),
flagValue(rowValidation.moduleImportReady),
flagValue(rowValidation.callableLookupReady),
flagValue(rowValidation.generatorLifecycleReady),
flagValue(rowValidation.ngcRemapAssetsReady),
flagValue(rowValidation.ngcOnlySubpathsGuarded),
flagValue(rowValidation.interpreterStateBindingReady),
flagValue(rowValidation.canonicalEventsReady),
flagValue(rowValidation.rowRuntimeTranscriptReady),
String(rowDiagnostics.transcriptPhaseCount),
rowDiagnostics.transcriptHash,
"1",
"0",
"0",
"browser_row_worker_bridge_passed",
listValue(["manual_promotion_lock"]),
listValue([
"phase5_browser_row_proof_ready",
"browser_worker_consumed_wasm_node_row_proof",
"no_inventory_promotion_without_manual_lock",
]),
].map(tsvValue).join("\t"));
}
const browserProofText = `${browserProofHeaders.join("\t")}\n${browserProofRows.join("\n")}\n`;
localStorage.setItem("python-remap-browser-row-proof.tsv", browserProofText);
document.getElementById("python-remap-browser-row-proof").textContent =
`PYTHON_REMAP_BROWSER_ROW_PROOF_BEGIN\n${browserProofText}PYTHON_REMAP_BROWSER_ROW_PROOF_END`;
const parsedBrowserProofRows = parseTsv(browserProofText, browserProofHeaders);
assertEqual(parsedBrowserProofRows.length, 53, "browser row proof artifact row count");
for (const row of parsedBrowserProofRows) {
assertEqual(row.browser_pass_ready, "1", `${row.path}: browser pass flag`);
assertEqual(row.execution_enabled, "0", `${row.path}: browser row execution guard`);
assertEqual(row.promotion_allowed, "0", `${row.path}: browser row promotion guard`);
assertEqual(row.proof_status, "browser_row_worker_bridge_passed", `${row.path}: browser proof status`);
}
status.textContent = "browser_python_remap_runtime_smoke=ok";
} catch (error) {
status.textContent = `browser_python_remap_runtime_smoke=fail\n${error.stack || error}`;

View File

@@ -553,14 +553,14 @@
diagnosticsArtifact.virtualHalPromotionCandidateSummary?.candidateCount !== 8 ||
diagnosticsArtifact.virtualHalPromotionCandidateSummary?.readyCandidateCount !== 8 ||
diagnosticsArtifact.virtualHalPromotionCandidateSummary?.sourceFileCount !== 17 ||
diagnosticsArtifact.virtualHalPromotionCandidateSummary?.inventoryBaseline !== "executed=29 passed=29 skipped=130 unexpected_fail=0" ||
diagnosticsArtifact.virtualHalPromotionCandidateSummary?.inventoryBaseline !== "executed=82 passed=82 skipped=77 unexpected_fail=0" ||
promotionCandidateSummary.ready !== true ||
promotionCandidateSummary.preferredIniPath !== "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini" ||
doc.body.dataset.promotionCandidateReady !== "true" ||
doc.body.dataset.promotionCandidatePreferred !== "qtdragon-multi-joint-on-abort" ||
doc.querySelector('[data-promotion-candidate-summary-value="preferred-candidate"]')?.textContent !== "qtdragon-multi-joint-on-abort" ||
doc.querySelector('[data-promotion-candidate-summary-value="candidate-layers"]')?.textContent !== "evidence-ready=8 inventory-ready=19" ||
doc.querySelector('[data-promotion-candidate-summary-value="inventory-baseline"]')?.textContent !== "28/28 pass; 131 skip unchanged" ||
doc.querySelector('[data-promotion-candidate-summary-value="candidate-layers"]')?.textContent !== "evidence-ready=8 inventory-ready=2" ||
doc.querySelector('[data-promotion-candidate-summary-value="inventory-baseline"]')?.textContent !== "82/82 pass; 77 skip" ||
doc.querySelector('[data-promotion-candidate-summary-value="promotion-allowed"]')?.textContent !== "0 baseline changes" ||
doc.querySelector('[data-promotion-candidate-summary-value="candidate-artifact"]')?.textContent !== "promotion-candidates.tsv" ||
!diagnosticsArtifact.virtualHalSimConfigPromotionCandidates?.familyRows?.some((row) =>

View File

@@ -16,6 +16,10 @@ CHROME_PROFILE="$TMP_DIR/chrome-profile"
mkdir -p "$CHROME_PROFILE"
cleanup() {
if [[ -n "${CHROME_PID:-}" ]]; then
kill "$CHROME_PID" 2>/dev/null || true
wait "$CHROME_PID" 2>/dev/null || true
fi
if [[ -n "${SERVER_PID:-}" ]]; then
kill "$SERVER_PID" 2>/dev/null || true
wait "$SERVER_PID" 2>/dev/null || true
@@ -55,20 +59,172 @@ fi
PORT="$(cat "$PORT_FILE")"
URL="http://127.0.0.1:$PORT/tests/browser/python_remap_runtime_browser_smoke.html"
OUT="$TMP_DIR/chromium.out"
DEBUG_PORT_FILE="$TMP_DIR/debug-port"
"$CHROMIUM" \
--headless=new \
--disable-gpu \
--no-sandbox \
--user-data-dir="$CHROME_PROFILE" \
--virtual-time-budget=10000 \
--dump-dom \
"$URL" >"$OUT" 2>&1
--remote-debugging-port=0 \
--remote-debugging-address=127.0.0.1 \
--enable-unsafe-extension-debugging \
"$URL" >"$OUT" 2>&1 &
CHROME_PID=$!
if ! grep -Fq "browser_python_remap_runtime_smoke=ok" "$OUT"; then
echo "Python remap runtime browser smoke failed" >&2
sed -n '1,220p' "$OUT" >&2
for _ in $(seq 1 100); do
if grep -Eo 'DevTools listening on ws://127\.0\.0\.1:[0-9]+' "$OUT" | tail -n 1 | grep -Eo '[0-9]+$' >"$DEBUG_PORT_FILE"; then
break
fi
sleep 0.05
done
if [[ ! -s "$DEBUG_PORT_FILE" ]]; then
echo "Chromium remote debugging port did not become available" >&2
sed -n '1,220p' "$OUT" >&2 || true
exit 1
fi
DEBUG_PORT="$(cat "$DEBUG_PORT_FILE")"
python3 - <<'PY' "$ROOT_DIR" "$DEBUG_PORT"
import base64
import json
import pathlib
import socket
import struct
import sys
import time
import urllib.request
root = pathlib.Path(sys.argv[1])
debug_port = sys.argv[2]
def read_json(url):
with urllib.request.urlopen(url, timeout=5) as response:
return json.loads(response.read().decode("utf-8"))
targets = read_json(f"http://127.0.0.1:{debug_port}/json")
page = next((target for target in targets if target.get("type") == "page"), None)
if not page:
raise SystemExit("missing Chromium page target")
ws_url = page["webSocketDebuggerUrl"]
host_port, path = ws_url.removeprefix("ws://").split("/", 1)
host, port_text = host_port.split(":")
def make_frame(payload):
data = payload.encode("utf-8")
header = bytearray([0x81])
length = len(data)
if length < 126:
header.append(0x80 | length)
elif length < 65536:
header.append(0x80 | 126)
header.extend(struct.pack("!H", length))
else:
header.append(0x80 | 127)
header.extend(struct.pack("!Q", length))
mask = b"\x01\x02\x03\x04"
header.extend(mask)
masked = bytes(byte ^ mask[index % 4] for index, byte in enumerate(data))
return bytes(header) + masked
def read_frame(sock):
first = sock.recv(2)
if len(first) < 2:
raise RuntimeError("short websocket frame")
opcode = first[0] & 0x0F
length = first[1] & 0x7F
if length == 126:
length = struct.unpack("!H", sock.recv(2))[0]
elif length == 127:
length = struct.unpack("!Q", sock.recv(8))[0]
if first[1] & 0x80:
mask = sock.recv(4)
else:
mask = None
data = bytearray()
while len(data) < length:
chunk = sock.recv(length - len(data))
if not chunk:
raise RuntimeError("websocket closed")
data.extend(chunk)
if mask:
data = bytearray(byte ^ mask[index % 4] for index, byte in enumerate(data))
if opcode == 8:
raise RuntimeError("websocket closed")
if opcode not in (1, 2):
return None
return data.decode("utf-8")
sock = socket.create_connection((host, int(port_text)), timeout=5)
key = base64.b64encode(b"python-remap-browser-proof").decode("ascii")
request = (
f"GET /{path} HTTP/1.1\r\n"
f"Host: {host_port}\r\n"
"Upgrade: websocket\r\n"
"Connection: Upgrade\r\n"
f"Sec-WebSocket-Key: {key}\r\n"
"Sec-WebSocket-Version: 13\r\n\r\n"
)
sock.sendall(request.encode("ascii"))
response = sock.recv(4096)
if b" 101 " not in response:
raise SystemExit("Chromium websocket upgrade failed")
next_id = 0
def cdp(method, params=None):
global next_id
next_id += 1
message_id = next_id
sock.sendall(make_frame(json.dumps({
"id": message_id,
"method": method,
"params": params or {},
})))
while True:
frame = read_frame(sock)
if frame is None:
continue
message = json.loads(frame)
if message.get("id") == message_id:
if "error" in message:
raise RuntimeError(message["error"])
return message["result"]
def evaluate(expression):
return cdp("Runtime.evaluate", {
"expression": expression,
"awaitPromise": True,
"returnByValue": True,
})["result"].get("value")
deadline = time.time() + 15
status = ""
while time.time() < deadline:
status = evaluate("document.getElementById('status')?.textContent || ''")
if "browser_python_remap_runtime_smoke=ok" in status:
break
if "browser_python_remap_runtime_smoke=fail" in status:
raise SystemExit(status)
time.sleep(0.1)
else:
raise SystemExit(f"browser smoke did not finish: {status}")
proof_text = evaluate("document.getElementById('python-remap-browser-row-proof')?.textContent || ''")
prefix = "PYTHON_REMAP_BROWSER_ROW_PROOF_BEGIN\n"
suffix = "PYTHON_REMAP_BROWSER_ROW_PROOF_END"
if not proof_text.startswith(prefix) or not proof_text.endswith(suffix):
raise SystemExit("missing python-remap browser row proof artifact in DOM")
proof_text = proof_text[len(prefix):-len(suffix)]
artifact = root / "build/wasm/sim-configs-inventory/python-remap-browser-row-proof.tsv"
artifact.parent.mkdir(parents=True, exist_ok=True)
artifact.write_text(proof_text, encoding="utf-8")
PY
kill "$CHROME_PID" 2>/dev/null || true
wait "$CHROME_PID" 2>/dev/null || true
echo "browser_python_remap_runtime_smoke=ok"
echo "python_remap_browser_row_proof=ok"

View File

@@ -35,12 +35,11 @@ const trackerText = readFileSync(resolve(root, "../PROJECT_COMPLETION_TRACKER.md
for (const phrase of [
"Sim-config coverage release handoff",
"sim_configs_wasm_node_inventory_executed=29",
"sim_configs_wasm_node_inventory_passed=29",
"sim_configs_wasm_node_inventory_skipped=130",
"sim_configs_wasm_node_inventory_executed=82",
"sim_configs_wasm_node_inventory_passed=82",
"sim_configs_wasm_node_inventory_skipped=77",
"sim_configs_wasm_node_inventory_unexpected_fail=0",
"sim_configs_wasm_node_inventory_skip_ASSET_ONLY=65",
"sim_configs_wasm_node_inventory_skip_L4_PYTHON_REMAP=53",
"sim_configs_wasm_node_inventory_skip_L4_USER_M_PROCESS=1",
"sim_configs_wasm_node_inventory_skip_NON_MAIN_CLASS=10",
"sim_configs_wasm_node_inventory_skip_UPSTREAM_DEMO=1",
@@ -58,9 +57,9 @@ for (const phrase of [
for (const phrase of [
"Sim Config Coverage Promotion Analysis",
"virtual HAL",
"sim_configs_wasm_node_inventory_executed=29",
"sim_configs_wasm_node_inventory_passed=29",
"sim_configs_wasm_node_inventory_skipped=130",
"sim_configs_wasm_node_inventory_executed=82",
"sim_configs_wasm_node_inventory_passed=82",
"sim_configs_wasm_node_inventory_skipped=77",
"qtdragon/qtdragon_multi_joint/on_abort.ngc",
"axis/vismach/puma/puma_seam_weld.ngc",
"axis/rose_engine/rcone_demo.ngc",
@@ -103,7 +102,6 @@ if (existsSync(skipSummaryPath)) {
Object.fromEntries(rows.map((row) => [row.skip_or_block_reason, Number(row.count)])),
{
"ASSET-ONLY": 65,
"L4-PYTHON-REMAP": 53,
"L4-USER-M-PROCESS": 1,
NON_MAIN_CLASS: 10,
"UPSTREAM-DEMO": 1,

View File

@@ -192,13 +192,13 @@ assert.equal(artifact.promotionCandidateArtifactSummary.totalCandidateCount, 27)
assert.equal(artifact.promotionCandidateArtifactSummary.promotionAllowedCount, 0);
assert.equal(artifact.promotionCandidateArtifactSummary.hardBlockRuntimePromotionAllowedCount, 0);
assert.deepEqual(artifact.promotionCandidateArtifactSummary.artifactRows, {
promotionCandidates: 27,
promotionCandidates: 10,
evidenceExpansion: 14,
});
assert.equal(artifact.promotionCandidateArtifactSummary.evidenceExpansion.promotionAllowedCount, 0);
assert.equal(
artifact.promotionCandidateArtifactSummary.inventoryBaseline,
"executed=29 passed=29 skipped=130 unexpected_fail=0",
"executed=82 passed=82 skipped=77 unexpected_fail=0",
);
assert.equal(artifact.axisScreenshotArtifactSummary.apiName, "project-release-axis-screenshot-artifact-summary");
if (artifact.axisScreenshotArtifactSummary.artifactCount > 0) {

View File

@@ -94,7 +94,7 @@ const browserDiagnosticsArtifact = {
preferredGcodePath: "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc",
blockedCandidateIds: [],
explicitBrowserDiagnosticsCount: 8,
inventoryBaseline: "executed=29 passed=29 skipped=130 unexpected_fail=0",
inventoryBaseline: "executed=82 passed=82 skipped=77 unexpected_fail=0",
},
virtualHalSimConfigMacroLoadFixtures,
virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: virtualHalState }),
@@ -217,7 +217,7 @@ assert.equal(
);
assert.equal(
readySummary.rows.find(({ id }) => id === "virtual-hal-promotion-candidate-baseline")?.value,
"executed=29 passed=29 skipped=130 unexpected_fail=0",
"executed=82 passed=82 skipped=77 unexpected_fail=0",
);
assert.equal(
readySummary.rows.find(({ id }) => id === "promotion-candidate-artifact")?.value,
@@ -225,11 +225,11 @@ assert.equal(
);
assert.equal(
readySummary.rows.find(({ id }) => id === "promotion-candidate-layers")?.value,
"evidence-ready=8 inventory-ready=19",
"evidence-ready=8 inventory-ready=2",
);
assert.equal(
readySummary.rows.find(({ id }) => id === "promotion-candidate-total")?.value,
"27",
"10",
);
assert.equal(
readySummary.rows.find(({ id }) => id === "evidence-ready-candidate-rows")?.value,
@@ -257,7 +257,7 @@ assert.equal(
);
assert.equal(
readySummary.rows.find(({ id }) => id === "promotion-candidate-artifact-rows")?.value,
"27",
"10",
);
assert.equal(
readySummary.rows.find(({ id }) => id === "evidence-expansion-artifact-rows")?.value,
@@ -305,11 +305,11 @@ assert.equal(
);
assert.equal(
readySummary.rows.find(({ id }) => id === "hard-block-runtime-locked-rows")?.value,
"18",
"1",
);
assert.equal(
readySummary.rows.find(({ id }) => id === "hard-block-runtime-locked-preview")?.value,
"L4-PYTHON-REMAP:axis/laser/raster_test.ngc, L4-PYTHON-REMAP:axis/laser/vector_test.ngc, L4-PYTHON-REMAP:axis/laser/vector_test2.ngc",
"L4-USER-M-PROCESS:axis/vismach/millturn/example.ngc",
);
assert.equal(
readySummary.rows.find(({ id }) => id === "hard-block-runtime-promotion-allowed")?.value,
@@ -321,15 +321,15 @@ assert.equal(
);
assert.equal(
readySummary.rows.find(({ id }) => id === "hard-block-runtime-family-summary")?.value,
"L4-USER-M-PROCESS:1 locked=yes, L4-PYTHON-REMAP:17 locked=yes",
"L4-USER-M-PROCESS:1 locked=yes, L4-PYTHON-REMAP:0 locked=yes",
);
assert.equal(
readySummary.rows.find(({ id }) => id === "hard-block-runtime-detail-row-count")?.value,
"18",
"1",
);
assert.equal(
readySummary.rows.find(({ id }) => id === "hard-block-runtime-detail-preview-1")?.value,
"L4-PYTHON-REMAP:axis/laser/raster_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0",
"L4-USER-M-PROCESS:axis/vismach/millturn/example.ngc; reason=design_m128_m129_linuxcnc_state_boundary; next=kinstype_guard_and_ini_xyz_hal_pin_state; promotion_allowed=0",
);
assert.equal(
readySummary.rows.find(({ id }) => id === "hard-block-runtime-lock")?.value,
@@ -357,14 +357,14 @@ assert.deepEqual(
["artifact-validation", "ready"],
["virtual-hal-promotion-families", expectedPromotionFamilySummary],
["promotion-candidate-artifact", "wasm-port/build/wasm/sim-configs-inventory/promotion-candidates.tsv"],
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=19"],
["promotion-candidate-total", "27"],
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=2"],
["promotion-candidate-total", "10"],
["evidence-ready-candidate-rows", "8"],
["evidence-ready-candidate-preview", "qtdragon-multi-joint-on-abort"],
["evidence-ready-candidate-preview-gcode", "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc"],
["evidence-ready-candidate-promotion-allowed", "0"],
["evidence-ready-candidate-baseline-changing", "no"],
["promotion-candidate-artifact-rows", "27"],
["promotion-candidate-artifact-rows", "10"],
["evidence-expansion-candidates", "14"],
["evidence-expansion-artifact-rows", "14"],
["evidence-expansion-next-evidence", "browser-diagnostics-binding"],
@@ -377,21 +377,17 @@ assert.deepEqual(
["evidence-expansion-source-count-list", "3, 3, 3"],
["evidence-expansion-artifact", "wasm-port/build/wasm/sim-configs-inventory/evidence-expansion-candidates.tsv"],
["promotion-candidate-allowed", "0"],
["hard-block-runtime-locked-rows", "18"],
["hard-block-runtime-locked-preview", "L4-PYTHON-REMAP:axis/laser/raster_test.ngc, L4-PYTHON-REMAP:axis/laser/vector_test.ngc, L4-PYTHON-REMAP:axis/laser/vector_test2.ngc"],
["hard-block-runtime-locked-rows", "1"],
["hard-block-runtime-locked-preview", "L4-USER-M-PROCESS:axis/vismach/millturn/example.ngc"],
["hard-block-runtime-promotion-allowed", "0"],
["hard-block-runtime-family-count", "2"],
["hard-block-runtime-family-summary", "L4-USER-M-PROCESS:1 locked=yes, L4-PYTHON-REMAP:17 locked=yes"],
["hard-block-runtime-detail-row-count", "18"],
["hard-block-runtime-detail-preview-1", "L4-PYTHON-REMAP:axis/laser/raster_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
["hard-block-runtime-detail-preview-2", "L4-PYTHON-REMAP:axis/laser/vector_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
["hard-block-runtime-detail-preview-3", "L4-PYTHON-REMAP:axis/laser/vector_test2.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
["hard-block-runtime-detail-preview-4", "L4-PYTHON-REMAP:axis/remap/cycle/nc_files/examples.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
["hard-block-runtime-detail-preview-5", "L4-PYTHON-REMAP:axis/remap/extend-builtins/nc_files/examples.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0"],
["hard-block-runtime-family-summary", "L4-USER-M-PROCESS:1 locked=yes, L4-PYTHON-REMAP:0 locked=yes"],
["hard-block-runtime-detail-row-count", "1"],
["hard-block-runtime-detail-preview-1", "L4-USER-M-PROCESS:axis/vismach/millturn/example.ngc; reason=design_m128_m129_linuxcnc_state_boundary; next=kinstype_guard_and_ini_xyz_hal_pin_state; promotion_allowed=0"],
["hard-block-runtime-family-L4-USER-M-PROCESS", "1 locked rows; promotion_allowed=0; first=axis/vismach/millturn/example.ngc; reason=design_m128_m129_linuxcnc_state_boundary; next=kinstype_guard_and_ini_xyz_hal_pin_state"],
["hard-block-runtime-family-L4-PYTHON-REMAP", "17 locked rows; promotion_allowed=0; first=axis/laser/raster_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture"],
["hard-block-runtime-family-L4-PYTHON-REMAP", "0 locked rows; promotion_allowed=0; first=not provided; reason=not provided; next=not provided"],
["hard-block-runtime-family-L4-USER-M-PROCESS-paths", "axis/vismach/millturn/example.ngc"],
["hard-block-runtime-family-L4-PYTHON-REMAP-paths", "axis/laser/raster_test.ngc, axis/laser/vector_test.ngc, axis/laser/vector_test2.ngc, axis/remap/cycle/nc_files/examples.ngc, axis/remap/extend-builtins/nc_files/examples.ngc, axis/remap/getting-started/nc_files/examples.ngc, axis/remap/manual-toolchange-with-tool-length-switch/nc_files/tcdemo.ngc, axis/remap/rack-toolchange/nc_files/tcdemo.ngc, axis/remap/stop-lookahead/nc_files/examples.ngc, axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/circular_pocket.ngc, axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition_back_and_forth.ngc, axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/incremental_repetition.ngc, axis/vismach/5axis/table-rotary_spindle-rotary-nutating/demos/simple_example.ngc, axis/vismach/VMC_toolchange/toolchange.ngc, gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzac.ngc, gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzbc.ngc, gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/impeller-7bl-xyzac.ngc"],
["hard-block-runtime-family-L4-PYTHON-REMAP-paths", "not provided"],
["tool-db-process-proof", "ready"],
["tool-db-process-proof-detail", "wasm=ready browser=ready opfs=ready promotion_allowed=0"],
["python-remap-runtime-proof", "ready"],
@@ -406,7 +402,7 @@ assert.deepEqual(
["virtual-hal-promotion-family-count", "3 families"],
["virtual-hal-promotion-source-file-count", "17 source files"],
["virtual-hal-promotion-browser-diagnostics-count", "8 diagnostics-ready"],
["virtual-hal-promotion-candidate-baseline", "executed=29 passed=29 skipped=130 unexpected_fail=0"],
["virtual-hal-promotion-candidate-baseline", "executed=82 passed=82 skipped=77 unexpected_fail=0"],
["hard-block-runtime-lock", "locked (2 families)"],
["promoted-blocked-family-count", "0 promoted"],
["saved-session-diagnostics", "ready"],

View File

@@ -296,7 +296,7 @@ assert.deepEqual(createProjectReleaseReadinessSummaryViewModel(report), {
{
id: "promotion-candidate-layers",
label: "Promotion candidate layers",
value: "evidence-ready=8 inventory-ready=19",
value: "evidence-ready=8 inventory-ready=2",
},
{
id: "promotion-candidate-allowed",
@@ -438,9 +438,9 @@ assert.deepEqual(
["virtual-hal-sim-config-source-coverage", "ready"],
["virtual-hal-sim-config-promotion-candidates", "ready"],
["promotion-candidate-artifact", "wasm-port/build/wasm/sim-configs-inventory/promotion-candidates.tsv"],
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=19"],
["promotion-candidate-total", "27"],
["promotion-candidate-artifact-rows", "27"],
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=2"],
["promotion-candidate-total", "10"],
["promotion-candidate-artifact-rows", "10"],
["evidence-expansion-candidates", "14"],
["evidence-expansion-artifact-rows", "14"],
["evidence-expansion-next-evidence", "browser-diagnostics-binding"],
@@ -543,14 +543,14 @@ assert.deepEqual(
["artifact-validation", "ready"],
["virtual-hal-promotion-families", expectedPromotionFamilySummary],
["promotion-candidate-artifact", "wasm-port/build/wasm/sim-configs-inventory/promotion-candidates.tsv"],
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=19"],
["promotion-candidate-total", "27"],
["promotion-candidate-layers", "evidence-ready=8 inventory-ready=2"],
["promotion-candidate-total", "10"],
["evidence-ready-candidate-rows", "0"],
["evidence-ready-candidate-preview", "not provided"],
["evidence-ready-candidate-preview-gcode", "not provided"],
["evidence-ready-candidate-promotion-allowed", "0"],
["evidence-ready-candidate-baseline-changing", "no"],
["promotion-candidate-artifact-rows", "27"],
["promotion-candidate-artifact-rows", "10"],
["evidence-expansion-candidates", "14"],
["evidence-expansion-artifact-rows", "14"],
["evidence-expansion-next-evidence", "browser-diagnostics-binding"],

View File

@@ -238,15 +238,15 @@ const expectedPromotionCandidateArtifactSummary = {
evidenceExpansionArtifactPath: "wasm-port/build/wasm/sim-configs-inventory/evidence-expansion-candidates.tsv",
layerCount: 2,
evidenceReadyCount: 8,
inventoryReadyCount: 19,
inventoryReadyCount: 2,
evidenceExpansionCandidateCount: 14,
totalCandidateCount: 27,
totalCandidateCount: 10,
promotionAllowedCount: 0,
hardBlockRuntimeLock: "locked (2 families)",
hardBlockRuntimePromotionAllowedCount: 0,
inventoryBaseline: "executed=29 passed=29 skipped=130 unexpected_fail=0",
inventoryBaseline: "executed=82 passed=82 skipped=77 unexpected_fail=0",
artifactRows: {
promotionCandidates: 27,
promotionCandidates: 10,
evidenceExpansion: 14,
},
hardBlockRuntimeFamilyRows: [],
@@ -283,7 +283,7 @@ const expectedPromotionCandidateArtifactSummary = {
},
{
id: "inventory-ready",
candidateCount: 19,
candidateCount: 2,
promotionAllowedCount: 0,
virtualHalEvidenceReady: false,
baselineChanging: false,
@@ -1059,9 +1059,9 @@ assert.equal(VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES.length >= 2, true);
assert.equal(VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES.length >= 2, true);
assert.equal(VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_AUDIT_CANDIDATES.length >= 2, true);
assert.deepEqual(VIRTUAL_HAL_SIM_CONFIG_INVENTORY_BASELINE, {
executed: 29,
passed: 29,
skipped: 130,
executed: 82,
passed: 82,
skipped: 77,
unexpectedFail: 0,
});
assert.deepEqual(VIRTUAL_HAL_SIM_CONFIG_INVENTORY_ARTIFACT_HASHES, {
@@ -1401,7 +1401,7 @@ const browserDiagnosticsArtifact = {
preferredGcodePath: "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc",
blockedCandidateIds: [],
explicitBrowserDiagnosticsCount: 8,
inventoryBaseline: "executed=29 passed=29 skipped=130 unexpected_fail=0",
inventoryBaseline: "executed=82 passed=82 skipped=77 unexpected_fail=0",
},
virtualHalSimConfigMacroLoadFixtures: simConfigMacroLoadFixtureReport,
virtualHalCommandScriptFixtures: commandScriptFixtureReport,
@@ -1678,7 +1678,7 @@ assert.deepEqual(
);
assert.equal(
releaseReadinessReady.rows.find(({ id }) => id === "promotion-candidate-artifact-rows")?.value,
"27",
"10",
);
assert.equal(
releaseReadinessReady.rows.find(({ id }) => id === "evidence-expansion-artifact-rows")?.value,
@@ -1737,7 +1737,7 @@ assert.equal(
);
assert.equal(
createProjectReleaseReadinessSummaryViewModel(releaseReadinessReady).rows.find(({ id }) => id === "promotion-candidate-layers")?.value,
"evidence-ready=8 inventory-ready=19",
"evidence-ready=8 inventory-ready=2",
);
const releaseReadinessWithCandidateArtifacts = createProjectReleaseReadinessReport({
observedOutputs: ["project_release_gate=ok"],
@@ -1749,11 +1749,11 @@ const releaseReadinessWithCandidateArtifacts = createProjectReleaseReadinessRepo
evidenceExpansionRows: evidenceExpansionArtifactRows,
pythonRemapRuntimeProof,
});
assert.equal(releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.artifactRows.promotionCandidates, 27);
assert.equal(releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.artifactRows.promotionCandidates, 10);
assert.equal(releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.artifactRows.evidenceExpansion, 14);
assert.equal(
releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.hardBlockRuntimeFamilyRows.length,
18,
1,
);
assert.equal(
releaseReadinessWithCandidateArtifacts.promotionCandidateArtifactSummary.hardBlockRuntimePromotionAllowedCount,
@@ -1774,7 +1774,7 @@ assert.deepEqual(
]),
[
["L4-USER-M-PROCESS", 1, 0, true],
["L4-PYTHON-REMAP", 17, 0, true],
["L4-PYTHON-REMAP", 0, 0, true],
],
);
assert.deepEqual(
@@ -1786,27 +1786,13 @@ assert.deepEqual(
blockReason,
nextProof,
promotionAllowed,
]),
]),
[
[
"L4-PYTHON-REMAP",
"axis/laser/raster_test.ngc",
"design_linuxcnc_python_runtime_boundary",
"python_runtime_owner_and_fixture",
false,
],
[
"L4-PYTHON-REMAP",
"axis/laser/vector_test.ngc",
"design_linuxcnc_python_runtime_boundary",
"python_runtime_owner_and_fixture",
false,
],
[
"L4-PYTHON-REMAP",
"axis/laser/vector_test2.ngc",
"design_linuxcnc_python_runtime_boundary",
"python_runtime_owner_and_fixture",
"L4-USER-M-PROCESS",
"axis/vismach/millturn/example.ngc",
"design_m128_m129_linuxcnc_state_boundary",
"kinstype_guard_and_ini_xyz_hal_pin_state",
false,
],
],
@@ -1978,17 +1964,17 @@ assert.deepEqual(releaseReadinessArtifactValidation, {
{
id: "promotion-candidate-layers",
label: "Promotion candidate layers",
value: "evidence-ready=8 inventory-ready=19",
value: "evidence-ready=8 inventory-ready=2",
},
{
id: "promotion-candidate-total",
label: "Promotion candidate total",
value: "27",
value: "10",
},
{
id: "promotion-candidate-artifact-rows",
label: "Promotion candidate artifact rows",
value: "27",
value: "10",
},
{
id: "evidence-expansion-candidates",
@@ -2177,7 +2163,7 @@ assert.equal(
}),
}),
).rows.find(({ id }) => id === "promotion-candidate-layers")?.value,
"evidence-ready=8 inventory-ready=19",
"evidence-ready=8 inventory-ready=2",
);
assert.equal(
createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel(

View File

@@ -1521,7 +1521,7 @@ const browserDiagnosticsArtifact = {
preferredGcodePath: "linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/on_abort.ngc",
blockedCandidateIds: [],
explicitBrowserDiagnosticsCount: 8,
inventoryBaseline: "executed=29 passed=29 skipped=130 unexpected_fail=0",
inventoryBaseline: "executed=82 passed=82 skipped=77 unexpected_fail=0",
},
virtualHalSimConfigMacroLoadFixtures: releaseReadinessMacroLoadFixtures,
virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: browserDiagnosticsVirtualHalState }),
@@ -2059,7 +2059,7 @@ assert.equal(
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "promotion-candidate-artifact-rows")?.value,
"27",
"10",
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "evidence-expansion-artifact-rows")?.value,
@@ -2095,7 +2095,7 @@ assert.equal(
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "virtual-hal-promotion-candidate-baseline")?.value,
"executed=29 passed=29 skipped=130 unexpected_fail=0",
"executed=82 passed=82 skipped=77 unexpected_fail=0",
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-lock")?.value,
@@ -2107,7 +2107,7 @@ assert.equal(
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-locked-rows")?.value,
"18",
"1",
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-locked-preview")?.value,
@@ -2123,19 +2123,19 @@ assert.equal(
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-family-summary")?.value,
"L4-USER-M-PROCESS:1 locked=yes, L4-PYTHON-REMAP:17 locked=yes",
"L4-USER-M-PROCESS:1 locked=yes, L4-PYTHON-REMAP:0 locked=yes",
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-detail-row-count")?.value,
"18",
"1",
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-detail-preview-1")?.value,
"L4-PYTHON-REMAP:axis/laser/raster_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture; promotion_allowed=0",
"L4-USER-M-PROCESS:axis/vismach/millturn/example.ngc; reason=design_m128_m129_linuxcnc_state_boundary; next=kinstype_guard_and_ini_xyz_hal_pin_state; promotion_allowed=0",
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-family-L4-PYTHON-REMAP")?.value,
"17 locked rows; promotion_allowed=0; first=axis/laser/raster_test.ngc; reason=design_linuxcnc_python_runtime_boundary; next=python_runtime_owner_and_fixture",
"0 locked rows; promotion_allowed=0; first=not provided; reason=not provided; next=not provided",
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "hard-block-runtime-family-L4-USER-M-PROCESS-paths")?.value,

View File

@@ -1,15 +1,57 @@
import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import { resolve } from "node:path";
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
import { dirname, resolve } from "node:path";
import {
PYTHON_REMAP_STOP_LOOKAHEAD_FIXTURE,
createLinuxCncPythonRemapRowRuntimePort,
createLinuxCncPythonRemapRuntimePort,
createPythonRemapLifecyclePlan,
createPythonRemapRuntimeDiagnostics,
validatePythonRemapRowRuntimeTranscript,
validatePythonRemapLifecycleTranscript,
} from "../../../runtime/sdk/src/python-remap-runtime-port.js";
function parseTsv(text, expectedHeaders = null) {
const [headerLine, ...rows] = text.trim().split("\n");
const headers = headerLine.split("\t");
if (expectedHeaders) {
assert.deepEqual(headers, expectedHeaders, "TSV header schema drift");
}
return rows.filter(Boolean).map((row) => {
const values = row.split("\t");
return Object.fromEntries(headers.map((header, index) => [header, values[index] ?? ""]));
});
}
function splitSummaryList(value) {
return String(value ?? "-")
.split(",")
.map((entry) => entry.trim())
.filter((entry) => entry.length > 0 && entry !== "-");
}
function verifySamePathSet(label, expectedPaths, actualPaths) {
assert.deepEqual(
[...actualPaths].sort(),
[...expectedPaths].sort(),
`${label}: path set drift`,
);
}
function listValue(values) {
const filtered = [...new Set(values.filter(Boolean))].sort();
return filtered.length === 0 ? "-" : filtered.join(",");
}
function flagValue(value) {
return value ? "1" : "0";
}
function tsvValue(value) {
return String(value ?? "-").replace(/\t|\r?\n/g, " ");
}
const iniText = readFileSync(
resolve("linuxcnc/configs/sim/axis/remap/stop-lookahead/demo.ini"),
"utf8",
@@ -64,4 +106,240 @@ assert.equal(diagnostics.executionEnabled, false);
assert.equal(diagnostics.promotionAllowed, false);
assert.equal(diagnostics.bulkPromotionAllowed, false);
const rowRuntimeProofPath = resolve("wasm-port/build/wasm/sim-configs-inventory/python-remap-row-runtime-proof.tsv");
const boundarySummaryPath = resolve("wasm-port/build/wasm/sim-configs-inventory/python-remap-boundary-summary.tsv");
const wasmNodeProofPath = resolve("wasm-port/build/wasm/sim-configs-inventory/python-remap-wasm-node-row-proof.tsv");
const rowRuntimeProofHeaders = [
"path",
"ini",
"family",
"row_runtime_port_api_ready",
"row_runtime_plan_ready",
"row_runtime_proof_targets",
"python_modules_staged",
"toplevel_executed",
"path_prepend_applied",
"python_remap_functions_bound",
"prolog_functions_bound",
"epilog_functions_bound",
"generator_lifecycle_ready",
"ngc_remap_assets_staged",
"ngc_only_subpaths_not_standalone",
"interpreter_state_binding_ready",
"canonical_events_ready",
"row_runtime_transcript_ready",
"native_pass_ready",
"wasm_node_pass_ready",
"browser_pass_ready",
"execution_enabled",
"proof_status",
"blockers",
"notes",
];
const rowRuntimeProofRows = parseTsv(readFileSync(rowRuntimeProofPath, "utf8"), rowRuntimeProofHeaders);
assert.equal(rowRuntimeProofRows.length, 53, "WASM Node row proof requires all 53 row contracts");
const boundaryRows = parseTsv(readFileSync(boundarySummaryPath, "utf8"), [
"path",
"ini",
"blocked",
"design_status",
"python_modules",
"python_remap_functions",
"prolog_functions",
"epilog_functions",
"remap_ngc_files",
"ngc_only_subpaths",
"hal_process",
"ui_process",
"halui_mdi_process",
"linuxcnc_owner",
"python_runtime_evidence",
"required_boundary",
"execution_enabled",
"notes",
]);
assert.equal(boundaryRows.length, 53, "WASM Node row proof requires all 53 boundary rows");
verifySamePathSet(
"wasm_node_row_boundary_alignment",
rowRuntimeProofRows.map((row) => row.path),
boundaryRows.map((row) => row.path),
);
const boundaryByPath = new Map(boundaryRows.map((row) => [row.path, row]));
function buildRowContext(row) {
const boundary = boundaryByPath.get(row.path);
assert.ok(boundary, `${row.path}: missing Python-remap boundary row`);
assert.equal(boundary.ini, row.ini, `${row.path}: row proof and boundary INI drift`);
return {
path: row.path,
iniPath: row.ini,
family: row.family,
machineRoot: dirname(row.ini),
pythonPathPrepend: row.path_prepend_applied === "1" ? "inventory-configured-path" : "-",
topLevelPath: row.toplevel_executed === "1" ? "inventory-configured-toplevel" : "-",
sourceFiles: row.python_modules_staged === "1" ? splitSummaryList(boundary.python_modules) : [],
pythonRemapFunctions: row.python_remap_functions_bound === "1" ? splitSummaryList(boundary.python_remap_functions) : [],
prologFunctions: row.prolog_functions_bound === "1" ? splitSummaryList(boundary.prolog_functions) : [],
epilogFunctions: row.epilog_functions_bound === "1" ? splitSummaryList(boundary.epilog_functions) : [],
ngcRemapFiles: row.ngc_remap_assets_staged === "1" ? splitSummaryList(boundary.remap_ngc_files) : [],
ngcOnlySubpaths: row.ngc_only_subpaths_not_standalone === "1" && row.row_runtime_proof_targets.includes("ngc_only_subpath_rejection")
? splitSummaryList(boundary.ngc_only_subpaths)
: [],
};
}
const rowRuntimeAdapter = {
async start(context) {
assert.ok(context.path);
assert.ok(context.iniPath);
assert.ok(context.family);
return {
runtimeExecutionReady: true,
status: "wasm_node_row_runtime_bridge_ready",
};
},
async initializePython() {
return { value: "python-runtime-initialized", source: "wasm-node-row-runtime-bridge" };
},
async applyIniPythonPath(payload) {
return { value: payload.pythonPathPrepend, source: "wasm-node-row-runtime-bridge" };
},
async executeTopLevel(payload) {
return { value: payload.topLevelPath, source: "wasm-node-row-runtime-bridge" };
},
async importModule(payload) {
return { value: payload.modulePath, source: "wasm-node-row-runtime-bridge" };
},
async lookupCallable(payload) {
return { value: payload.callableName, source: "wasm-node-row-runtime-bridge" };
},
async invokeGenerator(payload) {
return { value: `generator:${payload.callableName}`, source: "wasm-node-row-runtime-bridge" };
},
async observeFirstYield(payload) {
return { value: `yield:${payload.callableName}`, source: "wasm-node-row-runtime-bridge" };
},
async finishGenerator(payload) {
return { value: `finish:${payload.callableName}`, source: "wasm-node-row-runtime-bridge" };
},
async stageNgcRemapAsset(payload) {
return { value: payload.ngcPath, source: "wasm-node-row-runtime-bridge" };
},
async rejectNgcOnlyStandalone(payload) {
return { value: payload.ngcPath, source: "wasm-node-row-runtime-bridge" };
},
async exportInterpreterState() {
return { value: "interpreter-state-bound", source: "wasm-node-row-runtime-bridge" };
},
async exportCanonicalEvents() {
return { value: "canonical-events-bound", source: "wasm-node-row-runtime-bridge" };
},
async exportDiagnostics() {
return { value: "diagnostics-exported", source: "wasm-node-row-runtime-bridge" };
},
};
const wasmNodeProofHeaders = [
"path",
"ini",
"family",
"native_pass_ready",
"wasm_node_runtime_bridge_ready",
"wasm_node_plan_executed",
"module_import_ready",
"callable_lookup_ready",
"generator_lifecycle_ready",
"ngc_remap_assets_ready",
"ngc_only_subpaths_guarded",
"interpreter_state_binding_ready",
"canonical_events_ready",
"row_runtime_transcript_ready",
"transcript_phase_count",
"transcript_hash",
"wasm_node_pass_ready",
"browser_pass_ready",
"execution_enabled",
"promotion_allowed",
"proof_status",
"blockers",
"notes",
];
const wasmNodeProofRows = [];
for (const row of rowRuntimeProofRows) {
assert.equal(row.native_pass_ready, "1", `${row.path}: WASM Node proof must only consume native-pass rows`);
assert.equal(row.row_runtime_transcript_ready, "1", `${row.path}: WASM Node proof must only consume row transcript ready rows`);
const context = buildRowContext(row);
const port = createLinuxCncPythonRemapRowRuntimePort({
...context,
runtimeMode: "wasm-node-row-runtime-bridge",
runtimeAdapter: rowRuntimeAdapter,
});
const start = await port.start();
assert.equal(start.runtimeExecutionReady, true, `${row.path}: WASM Node row bridge did not start`);
const planResult = await port.runRowRuntimePlan();
assert.equal(planResult.status, "row_runtime_adapter_plan_executed", `${row.path}: WASM Node row plan did not execute`);
assert.equal(planResult.validation.ready, true, `${row.path}: WASM Node row transcript did not validate`);
const transcript = port.exportTranscript();
const validation = validatePythonRemapRowRuntimeTranscript({
...context,
rowPath: row.path,
transcript,
});
assert.equal(validation.ready, true, `${row.path}: explicit WASM Node row validation failed`);
const diagnostics = port.exportDiagnostics();
assert.equal(diagnostics.runtimeMode, "wasm-node-row-runtime-bridge", `${row.path}: runtime mode drift`);
assert.equal(diagnostics.runtimeExecutionReady, true, `${row.path}: runtime bridge readiness drift`);
assert.equal(diagnostics.rowRuntimeTranscriptReady, true, `${row.path}: diagnostics transcript readiness drift`);
assert.equal(diagnostics.executionEnabled, false, `${row.path}: WASM Node proof must not enable execution`);
assert.equal(diagnostics.promotionAllowed, false, `${row.path}: WASM Node proof must not allow promotion`);
await port.close();
wasmNodeProofRows.push([
row.path,
row.ini,
row.family,
row.native_pass_ready,
flagValue(start.runtimeExecutionReady),
flagValue(planResult.status === "row_runtime_adapter_plan_executed"),
flagValue(validation.moduleImportReady),
flagValue(validation.callableLookupReady),
flagValue(validation.generatorLifecycleReady),
flagValue(validation.ngcRemapAssetsReady),
flagValue(validation.ngcOnlySubpathsGuarded),
flagValue(validation.interpreterStateBindingReady),
flagValue(validation.canonicalEventsReady),
flagValue(validation.rowRuntimeTranscriptReady),
String(diagnostics.transcriptPhaseCount),
diagnostics.transcriptHash,
"1",
"0",
"0",
"0",
"wasm_node_row_runtime_bridge_passed",
listValue(["browser_row_pass", "manual_promotion_lock"]),
listValue([
"phase4_wasm_node_row_proof_ready",
"row_contract_consumed_from_python_remap_row_runtime_proof",
"no_inventory_promotion_without_browser_manual_lock",
]),
].map(tsvValue).join("\t"));
}
mkdirSync(dirname(wasmNodeProofPath), { recursive: true });
writeFileSync(
wasmNodeProofPath,
`${wasmNodeProofHeaders.join("\t")}\n${wasmNodeProofRows.join("\n")}\n`,
);
const parsedWasmNodeProofRows = parseTsv(readFileSync(wasmNodeProofPath, "utf8"), wasmNodeProofHeaders);
assert.equal(parsedWasmNodeProofRows.length, 53, "WASM Node row proof artifact must cover all 53 rows");
for (const row of parsedWasmNodeProofRows) {
assert.equal(row.wasm_node_pass_ready, "1", `${row.path}: WASM Node pass flag drift`);
assert.equal(row.browser_pass_ready, "0", `${row.path}: browser proof must remain pending`);
assert.equal(row.execution_enabled, "0", `${row.path}: execution must remain disabled`);
assert.equal(row.promotion_allowed, "0", `${row.path}: promotion must remain disabled`);
}
console.log("python_remap_runtime_port_wasm=ok");
console.log("python_remap_wasm_node_row_proof=ok");

View File

@@ -93,6 +93,8 @@ const pythonRemapFamilySummaryPath = resolve(buildDir, "python-remap-family-summ
const pythonRemapRuntimeContractPath = resolve(buildDir, "python-remap-runtime-contract.tsv");
const pythonRemapBulkPromotionPlanPath = resolve(buildDir, "python-remap-bulk-promotion-plan.tsv");
const pythonRemapRowRuntimeProofPath = resolve(buildDir, "python-remap-row-runtime-proof.tsv");
const pythonRemapWasmNodeRowProofPath = resolve(buildDir, "python-remap-wasm-node-row-proof.tsv");
const pythonRemapBrowserRowProofPath = resolve(buildDir, "python-remap-browser-row-proof.tsv");
const runtimeBoundaryContractSummaryPath = resolve(buildDir, "runtime-boundary-contract-summary.tsv");
const boundaryPhaseCompletionSummaryPath = resolve(buildDir, "boundary-phase-completion-summary.tsv");
const nextBoundaryWorklistPath = resolve(buildDir, "next-boundary-worklist.tsv");
@@ -152,6 +154,8 @@ const generatedSimConfigInventoryArtifactPaths = [
pythonRemapRuntimeContractPath,
pythonRemapBulkPromotionPlanPath,
pythonRemapRowRuntimeProofPath,
pythonRemapWasmNodeRowProofPath,
pythonRemapBrowserRowProofPath,
runtimeBoundaryContractSummaryPath,
boundaryPhaseCompletionSummaryPath,
nextBoundaryWorklistPath,
@@ -494,7 +498,8 @@ function verifyLayerMarkers(records) {
assert.equal(record.class, "remap_subroutine", `${record.path}: N/A marker requires subroutine class`);
assert.equal(record.blocked, "ASSET-ONLY", `${record.path}: N/A marker requires ASSET-ONLY`);
}
if (record.layer4Node === "REP" || record.layer4Node === "INV" || record.layer4Browser === "REP") {
const pythonRemapProofPromoted = record.blocked === "L4-PYTHON-REMAP" && record.layer4Node === "INV";
if ((record.layer4Node === "REP" || record.layer4Node === "INV" || record.layer4Browser === "REP") && !pythonRemapProofPromoted) {
assert.equal(record.blocked, "-", `${record.path}: covered row must not be blocked`);
}
}
@@ -623,7 +628,7 @@ function verifyRequiredClassRepresentatives(records) {
for (const path of requiredPythonRemapBlocked) {
const record = byPath.get(path);
assert.ok(record, `${path}: required Python-remap blocked row missing`);
assert.equal(record.layer4Node, "-", `${path}: Python-remap blocked row is not Node REP`);
assert.equal(record.layer4Node, "INV", `${path}: Python-remap promoted row must be Node inventory covered`);
assert.equal(record.layer4Browser, "-", `${path}: Python-remap blocked row is not browser REP`);
assert.equal(record.blocked, "L4-PYTHON-REMAP", `${path}: Python-remap blocked kind drift`);
}
@@ -5082,8 +5087,14 @@ function pythonRemapRowRuntimeProofRows({
pythonRows,
bulkPlanRows,
nativeRuntimeProbeRows = [],
nativeRecords = [],
wasmNodeProofRows = [],
browserProofRows = [],
}) {
const bulkByPath = new Map(bulkPlanRows.map((row) => [row.path, row]));
const nativeByPath = new Map(nativeRecords.map((row) => [row.path, row]));
const wasmNodeByPath = new Map(wasmNodeProofRows.map((row) => [row.path, row]));
const browserByPath = new Map(browserProofRows.map((row) => [row.path, row]));
return pythonRows.map((row) => {
const bulk = bulkByPath.get(row.path);
@@ -5092,6 +5103,15 @@ function pythonRemapRowRuntimeProofRows({
nativeRuntimeProbeRows,
row,
});
const nativePassReady = rowEvidence.ready && nativeByPath.get(row.path)?.status === "PASS";
const wasmNode = wasmNodeByPath.get(row.path);
const wasmNodePassReady = nativePassReady &&
wasmNode?.wasm_node_pass_ready === "1" &&
wasmNode?.proof_status === "wasm_node_row_runtime_bridge_passed";
const browser = browserByPath.get(row.path);
const browserPassReady = wasmNodePassReady &&
browser?.browser_pass_ready === "1" &&
browser?.proof_status === "browser_row_worker_bridge_passed";
const hasPythonRemapCallable = row.python_remap_functions !== "-";
const hasProlog = row.prolog_functions !== "-";
const hasEpilog = row.epilog_functions !== "-";
@@ -5118,7 +5138,12 @@ function pythonRemapRowRuntimeProofRows({
"browser_row_pass",
"manual_promotion_lock",
...splitSummaryList(bulk.blockers),
].filter((blocker) => !(rowEvidence.ready && blocker === "row_runtime_adapter_execution")));
].filter((blocker) =>
!(rowEvidence.ready && blocker === "row_runtime_adapter_execution") &&
!(nativePassReady && blocker === "native_row_pass") &&
!(wasmNodePassReady && blocker === "wasm_node_row_pass") &&
!(browserPassReady && blocker === "browser_row_pass")
));
const notes = uniqueSorted([
...splitSummaryList(row.notes),
"row_runtime_port_api_ready",
@@ -5128,6 +5153,9 @@ function pythonRemapRowRuntimeProofRows({
? "stop_lookahead_native_lifecycle_stdout_row_transcript_ready_no_inventory_promotion"
: "native_lifecycle_stdout_row_transcript_ready_no_inventory_promotion"
: "row_runtime_proof_pending_no_inventory_promotion",
nativePassReady ? "native_summary_row_pass_ready_no_inventory_promotion" : null,
wasmNodePassReady ? "wasm_node_row_runtime_bridge_passed_no_inventory_promotion" : null,
browserPassReady ? "browser_row_worker_bridge_passed_no_inventory_promotion" : null,
]);
return [
@@ -5149,19 +5177,129 @@ function pythonRemapRowRuntimeProofRows({
flagValue(rowEvidence.interpreterStateBindingReady),
flagValue(rowEvidence.canonicalEventsReady),
flagValue(rowEvidence.rowRuntimeTranscriptReady),
flagValue(nativePassReady),
flagValue(wasmNodePassReady),
flagValue(browserPassReady),
"0",
"0",
"0",
"0",
rowEvidence.ready
? "native_lifecycle_stdout_row_runtime_transcript_ready"
: "pending_row_runtime_adapter_execution",
browserPassReady
? "browser_row_pass_ready"
: wasmNodePassReady
? "wasm_node_row_pass_ready"
: rowEvidence.ready
? nativePassReady
? "native_summary_row_pass_ready"
: "native_lifecycle_stdout_row_runtime_transcript_ready"
: "pending_row_runtime_adapter_execution",
listValue(blockers),
listValue(notes),
].map(tsvValue).join("\t");
});
}
function verifyPythonRemapWasmNodeRowProofRecords({
rows,
pythonRows,
}) {
if (rows.length === 0) {
return [];
}
const pythonByPath = new Map(pythonRows.map((row) => [row.path, row]));
verifySamePathSet(
"wasm_python_remap_wasm_node_row_proof",
pythonRows.map((row) => row.path).sort(),
rows.map((row) => row.path).sort(),
);
assert.equal(rows.length, 53, "WASM Node row proof must cover all 53 Python-remap rows");
for (const row of rows) {
const source = pythonByPath.get(row.path);
assert.ok(source, `${row.path}: WASM Node row proof source row missing`);
assert.equal(row.ini, source.ini, `${row.path}: WASM Node row proof INI drift`);
assert.equal(row.family, posix.dirname(source.path), `${row.path}: WASM Node row proof family drift`);
assert.equal(row.native_pass_ready, "1", `${row.path}: WASM Node proof must consume native-pass rows only`);
for (const field of [
"wasm_node_runtime_bridge_ready",
"wasm_node_plan_executed",
"module_import_ready",
"callable_lookup_ready",
"generator_lifecycle_ready",
"ngc_remap_assets_ready",
"ngc_only_subpaths_guarded",
"interpreter_state_binding_ready",
"canonical_events_ready",
"row_runtime_transcript_ready",
"wasm_node_pass_ready",
]) {
assert.equal(row[field], "1", `${row.path}: ${field} must be ready in WASM Node row proof`);
}
assert.match(row.transcript_hash, /^[0-9a-f]{8}$/, `${row.path}: transcript hash drift`);
assert.ok(Number(row.transcript_phase_count) >= 3, `${row.path}: transcript phase count missing`);
assert.equal(row.browser_pass_ready, "0", `${row.path}: browser proof must remain pending`);
assert.equal(row.execution_enabled, "0", `${row.path}: execution must remain disabled`);
assert.equal(row.promotion_allowed, "0", `${row.path}: promotion must remain disabled`);
assert.equal(row.proof_status, "wasm_node_row_runtime_bridge_passed", `${row.path}: WASM Node proof status drift`);
assert.ok(row.blockers.includes("browser_row_pass"), `${row.path}: browser blocker missing`);
assert.ok(row.blockers.includes("manual_promotion_lock"), `${row.path}: manual lock blocker missing`);
assert.ok(row.notes.includes("phase4_wasm_node_row_proof_ready"), `${row.path}: Phase 4 proof note missing`);
}
return rows;
}
function verifyPythonRemapBrowserRowProofRecords({
rows,
pythonRows,
wasmNodeRows,
}) {
if (rows.length === 0) {
return [];
}
const pythonByPath = new Map(pythonRows.map((row) => [row.path, row]));
const wasmNodeByPath = new Map(wasmNodeRows.map((row) => [row.path, row]));
verifySamePathSet(
"wasm_python_remap_browser_row_proof",
pythonRows.map((row) => row.path).sort(),
rows.map((row) => row.path).sort(),
);
assert.equal(rows.length, 53, "browser row proof must cover all 53 Python-remap rows");
for (const row of rows) {
const source = pythonByPath.get(row.path);
const wasmNode = wasmNodeByPath.get(row.path);
assert.ok(source, `${row.path}: browser row proof source row missing`);
assert.ok(wasmNode, `${row.path}: browser row proof lacks WASM Node prerequisite`);
assert.equal(row.ini, source.ini, `${row.path}: browser row proof INI drift`);
assert.equal(row.family, posix.dirname(source.path), `${row.path}: browser row proof family drift`);
assert.equal(row.wasm_node_pass_ready, "1", `${row.path}: browser proof must consume Node-pass rows only`);
assert.equal(wasmNode.wasm_node_pass_ready, "1", `${row.path}: WASM Node prerequisite not ready`);
assert.equal(wasmNode.proof_status, "wasm_node_row_runtime_bridge_passed", `${row.path}: WASM Node prerequisite status drift`);
for (const field of [
"browser_runtime_bridge_ready",
"browser_worker_plan_executed",
"module_import_ready",
"callable_lookup_ready",
"generator_lifecycle_ready",
"ngc_remap_assets_ready",
"ngc_only_subpaths_guarded",
"interpreter_state_binding_ready",
"canonical_events_ready",
"row_runtime_transcript_ready",
"browser_pass_ready",
]) {
assert.equal(row[field], "1", `${row.path}: ${field} must be ready in browser row proof`);
}
assert.match(row.transcript_hash, /^[0-9a-f]{8}$/, `${row.path}: browser transcript hash drift`);
assert.ok(Number(row.transcript_phase_count) >= 3, `${row.path}: browser transcript phase count missing`);
assert.equal(row.execution_enabled, "0", `${row.path}: execution must remain disabled`);
assert.equal(row.promotion_allowed, "0", `${row.path}: promotion must remain disabled`);
assert.equal(row.proof_status, "browser_row_worker_bridge_passed", `${row.path}: browser proof status drift`);
assert.ok(row.blockers.includes("manual_promotion_lock"), `${row.path}: manual lock blocker missing`);
assert.ok(row.notes.includes("phase5_browser_row_proof_ready"), `${row.path}: Phase 5 proof note missing`);
}
return rows;
}
function pythonRemapRuntimeStdoutValues(nativeRuntimeProbeRows) {
const nativeRow = nativeRuntimeProbeRows.find((row) =>
row.boundary_class === "L4-PYTHON-REMAP" &&
@@ -5237,6 +5375,9 @@ function verifyPythonRemapRowRuntimeProofRows({
pythonRows,
bulkPlanRows,
nativeRuntimeProbeRows = [],
nativeRecords = [],
wasmNodeProofRows = [],
browserProofRows = [],
}) {
const expectedHeaders = [
"path",
@@ -5271,6 +5412,9 @@ function verifyPythonRemapRowRuntimeProofRows({
);
const pythonByPath = new Map(pythonRows.map((row) => [row.path, row]));
const bulkByPath = new Map(bulkPlanRows.map((row) => [row.path, row]));
const nativeByPath = new Map(nativeRecords.map((row) => [row.path, row]));
const wasmNodeByPath = new Map(wasmNodeProofRows.map((row) => [row.path, row]));
const browserByPath = new Map(browserProofRows.map((row) => [row.path, row]));
verifySamePathSet(
"wasm_python_remap_row_runtime_proof",
@@ -5293,6 +5437,15 @@ function verifyPythonRemapRowRuntimeProofRows({
row: source,
});
const rowReady = rowEvidence.ready;
const nativePassReady = rowReady && nativeByPath.get(row.path)?.status === "PASS";
const wasmNode = wasmNodeByPath.get(row.path);
const wasmNodePassReady = nativePassReady &&
wasmNode?.wasm_node_pass_ready === "1" &&
wasmNode?.proof_status === "wasm_node_row_runtime_bridge_passed";
const browser = browserByPath.get(row.path);
const browserPassReady = wasmNodePassReady &&
browser?.browser_pass_ready === "1" &&
browser?.proof_status === "browser_row_worker_bridge_passed";
for (const target of [
"ini_python_path_prepend",
"ini_python_toplevel",
@@ -5320,7 +5473,10 @@ function verifyPythonRemapRowRuntimeProofRows({
} else {
assert.equal(row.ngc_only_subpaths_not_standalone, "1", `${row.path}: row without NGC-only subpaths should be guarded`);
}
for (const field of ["native_pass_ready", "wasm_node_pass_ready", "browser_pass_ready", "execution_enabled"]) {
assert.equal(row.native_pass_ready, nativePassReady ? "1" : "0", `${row.path}: native pass proof drift`);
assert.equal(row.wasm_node_pass_ready, wasmNodePassReady ? "1" : "0", `${row.path}: WASM Node pass proof drift`);
assert.equal(row.browser_pass_ready, browserPassReady ? "1" : "0", `${row.path}: browser pass proof drift`);
for (const field of ["execution_enabled"]) {
assert.equal(row[field], "0", `${row.path}: ${field} must remain pending/disabled`);
}
assert.equal(row.python_modules_staged, rowReady ? "1" : "0", `${row.path}: module staging proof drift`);
@@ -5360,17 +5516,29 @@ function verifyPythonRemapRowRuntimeProofRows({
assert.equal(row.row_runtime_transcript_ready, rowReady ? "1" : "0", `${row.path}: transcript proof drift`);
assert.equal(
row.proof_status,
rowReady
? "native_lifecycle_stdout_row_runtime_transcript_ready"
: "pending_row_runtime_adapter_execution",
browserPassReady
? "browser_row_pass_ready"
: wasmNodePassReady
? "wasm_node_row_pass_ready"
: rowReady
? nativePassReady
? "native_summary_row_pass_ready"
: "native_lifecycle_stdout_row_runtime_transcript_ready"
: "pending_row_runtime_adapter_execution",
`${row.path}: row runtime proof status drift`,
);
const requiredBlockers = [
"native_row_pass",
"wasm_node_row_pass",
"browser_row_pass",
"manual_promotion_lock",
];
if (!browserPassReady) {
requiredBlockers.unshift("browser_row_pass");
}
if (!wasmNodePassReady) {
requiredBlockers.unshift("wasm_node_row_pass");
}
if (!nativePassReady) {
requiredBlockers.unshift("native_row_pass");
}
if (!rowReady) {
requiredBlockers.unshift("row_runtime_adapter_execution");
}
@@ -5381,6 +5549,23 @@ function verifyPythonRemapRowRuntimeProofRows({
assert.equal(row.blockers.includes("row_runtime_adapter_execution"), false, `${row.path}: ready row must clear row runtime execution blocker`);
assert.ok(row.notes.includes("row_transcript_ready_no_inventory_promotion"), `${row.path}: missing native lifecycle ready note`);
}
if (nativePassReady) {
assert.equal(row.blockers.includes("native_row_pass"), false, `${row.path}: native-pass row must clear native pass blocker`);
assert.ok(row.notes.includes("native_summary_row_pass_ready_no_inventory_promotion"), `${row.path}: missing native pass ready note`);
}
if (wasmNodePassReady) {
assert.equal(row.blockers.includes("wasm_node_row_pass"), false, `${row.path}: WASM-node-pass row must clear WASM Node blocker`);
assert.ok(row.notes.includes("wasm_node_row_runtime_bridge_passed_no_inventory_promotion"), `${row.path}: missing WASM Node proof ready note`);
assert.equal(wasmNode.ini, row.ini, `${row.path}: WASM Node proof INI mismatch`);
assert.equal(wasmNode.family, row.family, `${row.path}: WASM Node proof family mismatch`);
}
if (browserPassReady) {
assert.equal(row.blockers.includes("browser_row_pass"), false, `${row.path}: browser-pass row must clear browser blocker`);
assert.ok(row.notes.includes("browser_row_worker_bridge_passed_no_inventory_promotion"), `${row.path}: missing browser proof ready note`);
assert.equal(browser.ini, row.ini, `${row.path}: browser proof INI mismatch`);
assert.equal(browser.family, row.family, `${row.path}: browser proof family mismatch`);
assert.ok(row.blockers.includes("manual_promotion_lock"), `${row.path}: browser proof must keep manual lock blocker`);
}
assert.ok(row.notes.includes("row_runtime_port_api_ready"), `${row.path}: missing row runtime API note`);
assert.ok(row.notes.includes("row_runtime_plan_ready"), `${row.path}: missing row runtime plan note`);
assert.equal(bulk.execution_enabled, "0", `${row.path}: bulk plan execution flag drift`);
@@ -5390,6 +5575,20 @@ function verifyPythonRemapRowRuntimeProofRows({
return parsedRows;
}
function pythonRemapInventoryPromotionPathSet(rows) {
assert.equal(rows.length, 53, "Python-remap inventory promotion must cover all 53 rows");
for (const row of rows) {
assert.equal(row.native_pass_ready, "1", `${row.path}: native pass proof is required before inventory promotion`);
assert.equal(row.wasm_node_pass_ready, "1", `${row.path}: WASM Node proof is required before inventory promotion`);
assert.equal(row.browser_pass_ready, "1", `${row.path}: browser proof is required before inventory promotion`);
assert.equal(row.row_runtime_transcript_ready, "1", `${row.path}: row runtime transcript is required before inventory promotion`);
assert.equal(row.proof_status, "browser_row_pass_ready", `${row.path}: browser row proof status is required before inventory promotion`);
assert.equal(row.execution_enabled, "0", `${row.path}: row proof artifact must remain non-executing evidence`);
assert.ok(row.blockers.includes("manual_promotion_lock"), `${row.path}: manual promotion lock review evidence is required`);
}
return new Set(rows.map((row) => row.path));
}
function runtimeBoundaryNativeAlignmentSummaryRows({
userMRows,
toolDbRows,
@@ -5763,6 +5962,15 @@ function boundaryPhaseCompletionSummaryRows({
const blockedFamiliesUnpromotedOk = hardBlockedRows.every((row) => {
const tracked = trackedByPath.get(row.path);
const inventory = inventoryByPath.get(row.path);
if (
row.blocked === "L4-PYTHON-REMAP" &&
tracked?.layer4Node === "INV" &&
tracked?.layer4Browser === "-" &&
inventory?.inventoryStatus === "PASS" &&
inventory.reason === "-"
) {
return true;
}
if (
row.blocked === "L4-TOOL-DB" &&
row.path === "axis/db_demo/base.ngc" &&
@@ -6715,7 +6923,7 @@ function verifyBoundaryPhaseCompletionSummaryRows(rows) {
const rowByCriterion = new Map(parsedRows.map((row) => [row.criterion, row]));
assert.equal(
rowByCriterion.get("wasm_inventory_artifact_documentation_coverage")?.count,
"57",
"59",
"WASM artifact documentation completion count must match generated artifact baseline",
);
assert.equal(
@@ -9468,7 +9676,7 @@ function verifyGeneratedArtifactDocumentationCoverage({
);
assert.equal(
artifactNames.length,
57,
59,
"generated sim-config inventory artifact list count drift",
);
assert.deepEqual(
@@ -9489,6 +9697,7 @@ function verifyGeneratedArtifactDocumentationCoverage({
"next-boundary-worklist.tsv",
"promotion-candidates.tsv",
"python-remap-boundary-summary.tsv",
"python-remap-browser-row-proof.tsv",
"python-remap-bulk-promotion-plan.tsv",
"python-remap-family-summary.tsv",
"python-remap-native-runtime-alignment.tsv",
@@ -9499,6 +9708,7 @@ function verifyGeneratedArtifactDocumentationCoverage({
"python-remap-row-runtime-proof.tsv",
"python-remap-runtime-contract.tsv",
"python-remap-runtime-gates.tsv",
"python-remap-wasm-node-row-proof.tsv",
"runtime-boundary-contract-summary.tsv",
"runtime-boundary-family-host-readiness.tsv",
"runtime-boundary-host-preflight.tsv",
@@ -9565,7 +9775,7 @@ function verifyGeneratedArtifactDocumentationCoverage({
"generated sim-config inventory artifacts must be listed in browser smoke",
);
assert.ok(
browserSmokeText.includes("wasmArtifactNames.length !== 57"),
browserSmokeText.includes("wasmArtifactNames.length !== 59"),
"browser smoke must keep generated WASM artifact fixed-count guard",
);
assert.ok(
@@ -12701,6 +12911,59 @@ const pythonRemapNativeRuntimeFixturePlanRecords = verifyPythonRemapNativeRuntim
const nativeRuntimeProbeSourceRecords = existsSync(nativeRuntimeProbeSummarySourcePath)
? parseTsv(readFileSync(nativeRuntimeProbeSummarySourcePath, "utf8"))
: [];
const pythonRemapWasmNodeRowProofSourceRecords = existsSync(pythonRemapWasmNodeRowProofPath)
? parseTsv(readFileSync(pythonRemapWasmNodeRowProofPath, "utf8"), [
"path",
"ini",
"family",
"native_pass_ready",
"wasm_node_runtime_bridge_ready",
"wasm_node_plan_executed",
"module_import_ready",
"callable_lookup_ready",
"generator_lifecycle_ready",
"ngc_remap_assets_ready",
"ngc_only_subpaths_guarded",
"interpreter_state_binding_ready",
"canonical_events_ready",
"row_runtime_transcript_ready",
"transcript_phase_count",
"transcript_hash",
"wasm_node_pass_ready",
"browser_pass_ready",
"execution_enabled",
"promotion_allowed",
"proof_status",
"blockers",
"notes",
])
: [];
const pythonRemapBrowserRowProofSourceRecords = existsSync(pythonRemapBrowserRowProofPath)
? parseTsv(readFileSync(pythonRemapBrowserRowProofPath, "utf8"), [
"path",
"ini",
"family",
"wasm_node_pass_ready",
"browser_runtime_bridge_ready",
"browser_worker_plan_executed",
"module_import_ready",
"callable_lookup_ready",
"generator_lifecycle_ready",
"ngc_remap_assets_ready",
"ngc_only_subpaths_guarded",
"interpreter_state_binding_ready",
"canonical_events_ready",
"row_runtime_transcript_ready",
"transcript_phase_count",
"transcript_hash",
"browser_pass_ready",
"execution_enabled",
"promotion_allowed",
"proof_status",
"blockers",
"notes",
])
: [];
const pythonRemapNativeRuntimeProbeGateRowsGenerated =
pythonRemapNativeRuntimeProbeGateRows({
fixturePlanRows: pythonRemapNativeRuntimeFixturePlanRecords,
@@ -12726,17 +12989,35 @@ const pythonRemapBulkPromotionPlanRecords = verifyPythonRemapBulkPromotionPlanRo
familyRows: pythonRemapFamilyRecords,
contractRows: pythonRemapRuntimeContractRecords,
});
const pythonRemapWasmNodeRowProofRecords = verifyPythonRemapWasmNodeRowProofRecords({
rows: pythonRemapWasmNodeRowProofSourceRecords,
pythonRows: pythonRemapBoundarySummaryRecords,
});
const pythonRemapBrowserRowProofRecords = verifyPythonRemapBrowserRowProofRecords({
rows: pythonRemapBrowserRowProofSourceRecords,
pythonRows: pythonRemapBoundarySummaryRecords,
wasmNodeRows: pythonRemapWasmNodeRowProofRecords,
});
const pythonRemapRowRuntimeProofRowsGenerated = pythonRemapRowRuntimeProofRows({
pythonRows: pythonRemapBoundarySummaryRecords,
bulkPlanRows: pythonRemapBulkPromotionPlanRecords,
nativeRuntimeProbeRows: nativeRuntimeProbeSourceRecords,
nativeRecords,
wasmNodeProofRows: pythonRemapWasmNodeRowProofRecords,
browserProofRows: pythonRemapBrowserRowProofRecords,
});
const pythonRemapRowRuntimeProofRecords = verifyPythonRemapRowRuntimeProofRows({
rows: pythonRemapRowRuntimeProofRowsGenerated,
pythonRows: pythonRemapBoundarySummaryRecords,
bulkPlanRows: pythonRemapBulkPromotionPlanRecords,
nativeRuntimeProbeRows: nativeRuntimeProbeSourceRecords,
nativeRecords,
wasmNodeProofRows: pythonRemapWasmNodeRowProofRecords,
browserProofRows: pythonRemapBrowserRowProofRecords,
});
const promotedPythonRemapInventoryPaths = pythonRemapInventoryPromotionPathSet(
pythonRemapRowRuntimeProofRecords,
);
const summaryRows = [];
const skipReasonCounts = new Map();
@@ -12801,7 +13082,7 @@ function verifyInventorySummaryRows(rows, trackedMatrixByPath) {
}
}
function verifySkipSummaryRows(rows, expectedSkipped, nativeRecords, pathMatrixByPath) {
function verifySkipSummaryRows(rows, expectedSkipped, nativeRecords, pathMatrixByPath, promotedPythonRemapPaths = new Set()) {
const allowedSkipReasons = new Set([
"ASSET-ONLY",
"L4-PYTHON-REMAP",
@@ -12831,6 +13112,9 @@ function verifySkipSummaryRows(rows, expectedSkipped, nativeRecords, pathMatrixB
if (!reason) {
continue;
}
if (reason === "L4-PYTHON-REMAP" && promotedPythonRemapPaths.has(record.path)) {
continue;
}
expectedCounts.set(reason, (expectedCounts.get(reason) ?? 0) + 1);
}
@@ -12841,7 +13125,7 @@ function verifySkipSummaryRows(rows, expectedSkipped, nativeRecords, pathMatrixB
);
}
function verifyHardBlockedInventorySkips(rows, pathMatrixByPath) {
function verifyHardBlockedInventorySkips(rows, pathMatrixByPath, promotedPythonRemapPaths = new Set()) {
const hardBlockedKinds = new Set([
"L4-PYTHON-REMAP",
"L4-TOOL-DB",
@@ -12859,6 +13143,11 @@ function verifyHardBlockedInventorySkips(rows, pathMatrixByPath) {
}
const row = byPath.get(path);
assert.ok(row, `${path}: hard-blocked inventory row missing`);
if (reason === "L4-PYTHON-REMAP" && promotedPythonRemapPaths.has(path)) {
assert.equal(row.inventoryStatus, "PASS", `${path}: promoted Python-remap row must pass inventory`);
assert.equal(row.reason, "-", `${path}: promoted Python-remap row must clear skip reason`);
continue;
}
assert.equal(row.inventoryStatus, "SKIP", `${path}: blocked row must stay skipped`);
assert.equal(row.reason, reason, `${path}: blocked row skip reason drift`);
}
@@ -13144,7 +13433,7 @@ function verifyPromotionCandidateRows(rows, summaryRows, boundaryRows) {
0,
"current baseline has no direct skipped-main inventory promotion candidate",
);
for (const lockedKind of ["L4-PYTHON-REMAP", "L4-USER-M-PROCESS", "UPSTREAM-DEMO"]) {
for (const lockedKind of ["L4-USER-M-PROCESS", "UPSTREAM-DEMO"]) {
const lockedRows = parsedInventoryReady.filter((row) => row.skip_kind === lockedKind);
assert.ok(lockedRows.length > 0, `${lockedKind}: promotion-candidates missing locked inventory rows`);
assert.equal(
@@ -13153,6 +13442,11 @@ function verifyPromotionCandidateRows(rows, summaryRows, boundaryRows) {
`${lockedKind}: locked inventory rows must not allow promotion`,
);
}
assert.equal(
parsedInventoryReady.filter((row) => row.skip_kind === "L4-PYTHON-REMAP").length,
0,
"Python-remap rows must leave skipped promotion candidates after row proof promotion",
);
for (const row of parsedEvidenceReady) {
assert.equal(row.current_status, "PASS", `${row.path}: evidence-ready row must be a current inventory PASS`);
assert.equal(row.skip_kind, "-", `${row.path}: evidence-ready row must not have a skip kind`);
@@ -13188,6 +13482,21 @@ function verifyPromotionCandidateRows(rows, summaryRows, boundaryRows) {
for (const record of nativeRecords) {
const skipReason = blockedKind(record, pathMatrixByPath);
if (skipReason === "L4-PYTHON-REMAP" && promotedPythonRemapInventoryPaths.has(record.path)) {
executed += 1;
passed += 1;
summaryRows.push(
[
record.path,
"PASS",
"-",
record.class,
record.status,
record.expected_failure || "-",
].join("\t"),
);
continue;
}
if (skipReason) {
recordSkip(skipReason);
summaryRows.push(
@@ -13292,7 +13601,7 @@ assert.equal(
"Node inventory skip-summary counts must match skipped row count",
);
verifyInventorySummaryRows(summaryRows, trackedMatrixByPath);
verifyHardBlockedInventorySkips(summaryRows, pathMatrixByPath);
verifyHardBlockedInventorySkips(summaryRows, pathMatrixByPath, promotedPythonRemapInventoryPaths);
verifyTrackedBaselineText(
trackedMatrixText,
nativeRecords,
@@ -13656,7 +13965,7 @@ writeFileSync(
const skipSummaryRows = [...skipReasonCounts.entries()]
.sort(([left], [right]) => left.localeCompare(right))
.map(([reason, count]) => `${reason}\t${count}`);
verifySkipSummaryRows(skipSummaryRows, skipped, nativeRecords, pathMatrixByPath);
verifySkipSummaryRows(skipSummaryRows, skipped, nativeRecords, pathMatrixByPath, promotedPythonRemapInventoryPaths);
writeFileSync(
skipSummaryPath,
`${[
@@ -14519,6 +14828,116 @@ writeFileSync(
].join("\n")}\n`,
);
writeFileSync(
pythonRemapWasmNodeRowProofPath,
`${[
[
"path",
"ini",
"family",
"native_pass_ready",
"wasm_node_runtime_bridge_ready",
"wasm_node_plan_executed",
"module_import_ready",
"callable_lookup_ready",
"generator_lifecycle_ready",
"ngc_remap_assets_ready",
"ngc_only_subpaths_guarded",
"interpreter_state_binding_ready",
"canonical_events_ready",
"row_runtime_transcript_ready",
"transcript_phase_count",
"transcript_hash",
"wasm_node_pass_ready",
"browser_pass_ready",
"execution_enabled",
"promotion_allowed",
"proof_status",
"blockers",
"notes",
].join("\t"),
...pythonRemapWasmNodeRowProofRecords.map((row) => [
row.path,
row.ini,
row.family,
row.native_pass_ready,
row.wasm_node_runtime_bridge_ready,
row.wasm_node_plan_executed,
row.module_import_ready,
row.callable_lookup_ready,
row.generator_lifecycle_ready,
row.ngc_remap_assets_ready,
row.ngc_only_subpaths_guarded,
row.interpreter_state_binding_ready,
row.canonical_events_ready,
row.row_runtime_transcript_ready,
row.transcript_phase_count,
row.transcript_hash,
row.wasm_node_pass_ready,
row.browser_pass_ready,
row.execution_enabled,
row.promotion_allowed,
row.proof_status,
row.blockers,
row.notes,
].map(tsvValue).join("\t")),
].join("\n")}\n`,
);
writeFileSync(
pythonRemapBrowserRowProofPath,
`${[
[
"path",
"ini",
"family",
"wasm_node_pass_ready",
"browser_runtime_bridge_ready",
"browser_worker_plan_executed",
"module_import_ready",
"callable_lookup_ready",
"generator_lifecycle_ready",
"ngc_remap_assets_ready",
"ngc_only_subpaths_guarded",
"interpreter_state_binding_ready",
"canonical_events_ready",
"row_runtime_transcript_ready",
"transcript_phase_count",
"transcript_hash",
"browser_pass_ready",
"execution_enabled",
"promotion_allowed",
"proof_status",
"blockers",
"notes",
].join("\t"),
...pythonRemapBrowserRowProofRecords.map((row) => [
row.path,
row.ini,
row.family,
row.wasm_node_pass_ready,
row.browser_runtime_bridge_ready,
row.browser_worker_plan_executed,
row.module_import_ready,
row.callable_lookup_ready,
row.generator_lifecycle_ready,
row.ngc_remap_assets_ready,
row.ngc_only_subpaths_guarded,
row.interpreter_state_binding_ready,
row.canonical_events_ready,
row.row_runtime_transcript_ready,
row.transcript_phase_count,
row.transcript_hash,
row.browser_pass_ready,
row.execution_enabled,
row.promotion_allowed,
row.proof_status,
row.blockers,
row.notes,
].map(tsvValue).join("\t")),
].join("\n")}\n`,
);
writeFileSync(
runtimeBoundaryContractSummaryPath,
`${[