收束promotion候选证据

结论:按text22铁律完成promotion-candidates双层证据管理,baseline保持28/28/131/0,Python remap、tool DB、external user-M hard block继续locked。
This commit is contained in:
2026-06-18 19:32:28 +08:00
parent f2cc1e4c57
commit 00af30c074
18 changed files with 1129 additions and 5 deletions

View File

@@ -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);
},