收束promotion候选证据
结论:按text22铁律完成promotion-candidates双层证据管理,baseline保持28/28/131/0,Python remap、tool DB、external user-M hard block继续locked。
This commit is contained in:
@@ -335,6 +335,66 @@ export const VIRTUAL_HAL_SIM_CONFIG_PROMOTION_CANDIDATES = Object.freeze([
|
||||
}),
|
||||
]);
|
||||
|
||||
export const VIRTUAL_HAL_SIM_CONFIG_EVIDENCE_EXPANSION_CANDIDATES = Object.freeze([
|
||||
Object.freeze({
|
||||
id: "woodpecker-on-abort",
|
||||
label: "Woodpecker on-abort",
|
||||
simConfigTarget: "woodpecker",
|
||||
sourceFiles: Object.freeze([
|
||||
"linuxcnc/configs/sim/woodpecker/woodpecker.ini",
|
||||
"linuxcnc/configs/sim/woodpecker/on_abort.ngc",
|
||||
"linuxcnc/configs/sim/woodpecker/tool.tbl",
|
||||
]),
|
||||
iniPath: "linuxcnc/configs/sim/woodpecker/woodpecker.ini",
|
||||
gcodePath: "linuxcnc/configs/sim/woodpecker/on_abort.ngc",
|
||||
currentNodeInventoryStatus: "PASS",
|
||||
currentMatrixBrowserStatus: "REP",
|
||||
dependencyClass: "hal_process,ui_process",
|
||||
targetBrowserEvidence: "browser-diagnostics-expansion",
|
||||
promotionAllowed: false,
|
||||
blockedKind: "-",
|
||||
evidence: "Current inventory already covers Woodpecker as a non-hard-block representative; next step is explicit browser diagnostics binding only.",
|
||||
}),
|
||||
Object.freeze({
|
||||
id: "puma-cube",
|
||||
label: "PUMA cube",
|
||||
simConfigTarget: "vismach-remap-sims",
|
||||
sourceFiles: Object.freeze([
|
||||
"linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ini",
|
||||
"linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ngc",
|
||||
"linuxcnc/configs/sim/axis/vismach/puma/remap_subs/428remap.ngc",
|
||||
]),
|
||||
iniPath: "linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ini",
|
||||
gcodePath: "linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ngc",
|
||||
currentNodeInventoryStatus: "PASS",
|
||||
currentMatrixBrowserStatus: "REP",
|
||||
dependencyClass: "hal_process,halui_mdi_process,ui_process",
|
||||
targetBrowserEvidence: "browser-diagnostics-expansion",
|
||||
promotionAllowed: false,
|
||||
blockedKind: "-",
|
||||
evidence: "PUMA cube is already the representative browser row for the PUMA machine context; it remains an expansion candidate, not a baseline promotion.",
|
||||
}),
|
||||
Object.freeze({
|
||||
id: "melfa-example",
|
||||
label: "MELFA example",
|
||||
simConfigTarget: "vismach-remap-sims",
|
||||
sourceFiles: Object.freeze([
|
||||
"linuxcnc/configs/sim/axis/vismach/melfa-sim/melfa.ini",
|
||||
"linuxcnc/configs/sim/axis/vismach/melfa-sim/example.ngc",
|
||||
"linuxcnc/configs/sim/axis/vismach/melfa-sim/remap_subs/428remap.ngc",
|
||||
]),
|
||||
iniPath: "linuxcnc/configs/sim/axis/vismach/melfa-sim/melfa.ini",
|
||||
gcodePath: "linuxcnc/configs/sim/axis/vismach/melfa-sim/example.ngc",
|
||||
currentNodeInventoryStatus: "PASS",
|
||||
currentMatrixBrowserStatus: "REP",
|
||||
dependencyClass: "hal_process,halui_mdi_process,ui_process",
|
||||
targetBrowserEvidence: "browser-diagnostics-expansion",
|
||||
promotionAllowed: false,
|
||||
blockedKind: "-",
|
||||
evidence: "MELFA example has current representative coverage and can receive explicit browser diagnostics evidence without unlocking any hard runtime family.",
|
||||
}),
|
||||
]);
|
||||
|
||||
export const VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES = Object.freeze([
|
||||
Object.freeze({
|
||||
id: "rose-engine-rcone-macro-load",
|
||||
@@ -3056,6 +3116,110 @@ export function createVirtualHalSimConfigPromotionCandidateReport(options = {})
|
||||
};
|
||||
}
|
||||
|
||||
export function createVirtualHalSimConfigEvidenceExpansionReport(options = {}) {
|
||||
const candidates = options.candidates ?? VIRTUAL_HAL_SIM_CONFIG_EVIDENCE_EXPANSION_CANDIDATES;
|
||||
const manifestProvided = typeof options.manifestText === "string" || Array.isArray(options.manifestEntries);
|
||||
const manifestSet = new Set([
|
||||
...sourceManifestSetFromText(options.manifestText ?? ""),
|
||||
...(options.manifestEntries ?? []).map(normalizeLinuxCncSourcePath),
|
||||
]);
|
||||
const requiredVirtualHalReports = options.requiredVirtualHalReports ?? [
|
||||
"source-compliance",
|
||||
"sim-config-source-coverage",
|
||||
"command-script-fixtures",
|
||||
"manifest-backed-motion-matrix",
|
||||
];
|
||||
const simConfigCoverage = options.simConfigSourceCoverage ?? createVirtualHalSimConfigSourceCoverageReport(options);
|
||||
const sourceCompliance = options.sourceCompliance ?? createVirtualHalSourceComplianceReport(options);
|
||||
const commandScriptFixtures = options.commandScriptFixtures ?? createVirtualHalCommandScriptFixtureReport(options);
|
||||
const motionControllerMatrix = options.motionControllerMatrix ?? createVirtualHalMotionControllerMatrixReport(options);
|
||||
const availableReports = new Set([
|
||||
...(sourceCompliance.complete ? ["source-compliance"] : []),
|
||||
...(simConfigCoverage.complete ? ["sim-config-source-coverage"] : []),
|
||||
...(commandScriptFixtures.complete ? ["command-script-fixtures"] : []),
|
||||
...(motionControllerMatrix.complete && motionControllerMatrix.manifestChecked ? ["manifest-backed-motion-matrix"] : []),
|
||||
]);
|
||||
const rows = candidates.map((candidate) => {
|
||||
const sourceFiles = [...(candidate.sourceFiles ?? [])];
|
||||
const normalizedSourceFiles = sourceFiles.map(normalizeLinuxCncSourcePath);
|
||||
const missingManifestFiles = manifestProvided
|
||||
? sourceFiles.filter((file, index) => !manifestSet.has(normalizedSourceFiles[index]))
|
||||
: [];
|
||||
const missingRequiredReports = requiredVirtualHalReports
|
||||
.filter((report) => !availableReports.has(report));
|
||||
const sourceReady = sourceFiles.length > 0 &&
|
||||
missingManifestFiles.length === 0 &&
|
||||
missingRequiredReports.length === 0;
|
||||
return {
|
||||
id: candidate.id,
|
||||
label: candidate.label,
|
||||
source: "linuxcnc-configs-sim-source-derived-virtual-hal-evidence-expansion-candidate",
|
||||
simConfigTarget: candidate.simConfigTarget ?? null,
|
||||
sourceFiles,
|
||||
iniPath: candidate.iniPath,
|
||||
gcodePath: candidate.gcodePath,
|
||||
currentNodeInventoryStatus: candidate.currentNodeInventoryStatus,
|
||||
currentMatrixBrowserStatus: candidate.currentMatrixBrowserStatus,
|
||||
dependencyClass: candidate.dependencyClass,
|
||||
targetBrowserEvidence: candidate.targetBrowserEvidence,
|
||||
requiredVirtualHalReports,
|
||||
blockedKind: candidate.blockedKind,
|
||||
promotionAllowed: candidate.promotionAllowed === true,
|
||||
nodeStatusReady: candidate.currentNodeInventoryStatus === "PASS",
|
||||
browserRepresentativeReady: candidate.currentMatrixBrowserStatus === "REP",
|
||||
manifestChecked: manifestProvided,
|
||||
missingManifestFiles,
|
||||
missingRequiredReports,
|
||||
evidence: candidate.evidence,
|
||||
sourceReady,
|
||||
complete: sourceReady &&
|
||||
candidate.blockedKind === "-" &&
|
||||
candidate.promotionAllowed !== true &&
|
||||
candidate.currentNodeInventoryStatus === "PASS" &&
|
||||
candidate.currentMatrixBrowserStatus === "REP",
|
||||
};
|
||||
});
|
||||
const missingCandidates = rows.filter((row) => !row.complete).map((row) => row.id);
|
||||
const promotionAllowedViolations = rows.filter((row) => row.promotionAllowed === true).map((row) => row.id);
|
||||
const blockedCandidateIds = rows.filter((row) => row.blockedKind !== "-").map((row) => row.id);
|
||||
const missingManifestFiles = [...new Set(rows.flatMap((row) => row.missingManifestFiles))];
|
||||
const missingRequiredReports = [...new Set(rows.flatMap((row) => row.missingRequiredReports))];
|
||||
const complete = rows.length > 0 &&
|
||||
missingCandidates.length === 0 &&
|
||||
promotionAllowedViolations.length === 0 &&
|
||||
blockedCandidateIds.length === 0 &&
|
||||
missingManifestFiles.length === 0 &&
|
||||
missingRequiredReports.length === 0;
|
||||
return {
|
||||
apiName: "linuxcnc-wasm-virtual-hal-sim-config-evidence-expansion-report",
|
||||
reportVersion: 1,
|
||||
source: "linuxcnc-configs-sim-source-derived-virtual-hal",
|
||||
phase: complete ? "ready" : "blocked",
|
||||
complete,
|
||||
webSimulationSatisfied: complete,
|
||||
inventoryBaselineUnchanged: true,
|
||||
promotionAllowed: false,
|
||||
manifestChecked: manifestProvided,
|
||||
candidateCount: rows.length,
|
||||
readyCandidateCount: rows.filter((row) => row.complete).length,
|
||||
sourceFiles: [...new Set(rows.flatMap((row) => row.sourceFiles))],
|
||||
requiredVirtualHalReports,
|
||||
availableVirtualHalReports: [...availableReports],
|
||||
missingCandidates,
|
||||
promotionAllowedViolations,
|
||||
blockedCandidateIds,
|
||||
missingManifestFiles,
|
||||
missingRequiredReports,
|
||||
rows,
|
||||
summaryRows: [
|
||||
{ id: "candidates", label: "Expansion candidates", value: `${rows.length}` },
|
||||
{ id: "ready-candidates", label: "Ready candidates", value: `${rows.filter((row) => row.complete).length}` },
|
||||
{ id: "promotion-allowed", label: "Promotion allowed", value: "0" },
|
||||
{ id: "inventory-baseline", label: "Inventory baseline", value: "unchanged" },
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
export function createVirtualHalSimConfigMacroLoadFixtureReport(options = {}) {
|
||||
const fixtures = options.fixtures ?? VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_FIXTURES;
|
||||
const blockedFixtures = options.blockedFixtures ?? VIRTUAL_HAL_SIM_CONFIG_MACRO_LOAD_BLOCKED_FIXTURES;
|
||||
@@ -3459,6 +3623,9 @@ export function createLinuxCncVirtualHalRuntime(initialState = createVirtualHalS
|
||||
getSimConfigPromotionCandidateReport(options = {}) {
|
||||
return createVirtualHalSimConfigPromotionCandidateReport(options);
|
||||
},
|
||||
getSimConfigEvidenceExpansionReport(options = {}) {
|
||||
return createVirtualHalSimConfigEvidenceExpansionReport(options);
|
||||
},
|
||||
getSimConfigMacroLoadFixtureReport(options = {}) {
|
||||
return createVirtualHalSimConfigMacroLoadFixtureReport(options);
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user