Build and verify the candidate-only FreeCAD naming bridge and OCCT worker path, including three-stage StringHasher restoration. Add Datum, ShapeBinder, attachment-mode, and PartDesign structure oracles plus offline SDK build plans and CI boundary checks.
84 lines
7.4 KiB
JavaScript
84 lines
7.4 KiB
JavaScript
import { readFile } from 'node:fs/promises'
|
|
import { resolve } from 'node:path'
|
|
|
|
const root = resolve(new URL('..', import.meta.url).pathname)
|
|
const load = async (path) => JSON.parse(await readFile(resolve(root, path), 'utf8'))
|
|
const [abi, matrix, plan, readiness, sdkPlan, nextTasks, buildScript, smokeTest] = await Promise.all([
|
|
load('config/freecad-sketcher-partdesign-abi-contract.json'),
|
|
load('config/compatibility-matrix.json'),
|
|
load('config/freecad-web-exact-parity-plan.json'),
|
|
load('config/freecad-private-naming-source-readiness.json'),
|
|
load('config/freecad-naming-sdk-plan.json'),
|
|
load('config/freecad-naming-next-tasks.json'),
|
|
readFile(resolve(root, 'scripts/build-freecad-naming-source-probe.sh'), 'utf8'),
|
|
readFile(resolve(root, 'native/freecad-naming-probe/smoke-test.mjs'), 'utf8'),
|
|
])
|
|
const fail = (message) => { throw new Error(`FreeCAD private naming boundary: ${message}`) }
|
|
|
|
const tasks = plan.programs.flatMap((program) => program.tasks)
|
|
const task = tasks.find((entry) => entry.id === 'EX-TSN-02')
|
|
if (!task) fail('EX-TSN-02 is missing from the exact parity plan.')
|
|
if (abi.privateNamingAbi?.shippedWorkerImplementation !== 'not-linked') fail('the shipped ABI contract must remain not-linked until the production artifact exports verified callbacks.')
|
|
if (abi.claim?.exactFreeCadParity !== false) fail('the supported facade contract cannot claim exact FreeCAD parity.')
|
|
if (matrix.nativeOcctHistory?.freecadNamingBuild?.status !== 'contract-only') fail('the FreeCAD naming build must remain contract-only before a locked SDK and callback probe exist.')
|
|
if (matrix.nativeOcctHistory?.freecadNamingBuild?.prerequisiteStatus !== 'real-isolated-freecad-private-naming-bridge-pass') fail('the prerequisite status must identify the real isolated FreeCAD naming bridge.')
|
|
if (matrix.nativeOcctHistory?.freecadNamingBuild?.sdkReadinessStatus !== 'candidate-complete') fail('the SDK readiness status must identify the complete candidate SDK without implying production linkage.')
|
|
if (task.status !== 'in_progress') fail(`EX-TSN-02 must remain in_progress, received ${String(task.status)}.`)
|
|
if (matrix.systemExactEvaluation?.exact !== false) fail('systemExact must remain false.')
|
|
const blockers = matrix.systemExactEvaluation?.blockers ?? []
|
|
if (!blockers.includes('shipped Worker lacks the FreeCAD-linked private naming ABI implementation')) fail('systemExact blockers must retain the missing FreeCAD-linked Worker implementation.')
|
|
if (!task.exactBlockedBy?.includes('The shipped Worker does not link the FreeCAD private naming implementation for every builder')) fail('EX-TSN-02 must retain its production Worker linkage blocker.')
|
|
|
|
if (readiness.scope !== 'standalone-wasm-source-prerequisite') fail('source readiness must remain a standalone prerequisite, not a production implementation.')
|
|
if (sdkPlan.scope !== 'pre-production-sdk-readiness' || sdkPlan.productionPublication !== false) fail('SDK readiness must remain pre-production and must not publish a Worker.')
|
|
if (sdkPlan.boundary?.freecadNamingBuildStatus !== 'contract-only' || sdkPlan.boundary?.exTsn02 !== 'in_progress' || sdkPlan.boundary?.systemExact !== false) fail('SDK readiness boundary disagrees with the authoritative status files.')
|
|
if (nextTasks.boundary?.freecadNamingBuildStatus !== 'contract-only' || nextTasks.boundary?.exTsn02 !== 'in_progress' || nextTasks.boundary?.systemExact !== false || nextTasks.boundary?.productionWorker?.availability !== 'unavailable' || nextTasks.boundary?.productionWorker?.callbacks?.length !== 0) fail('next-task plan disagrees with the production boundary.')
|
|
if (matrix.nativeOcctHistory?.freecadNamingBuild?.sdkReadinessCommand !== './npmw run check:freecad-naming-sdk-readiness') fail('compatibility matrix must expose the SDK readiness command.')
|
|
if (readiness.production?.workerLinked !== false) fail('the readiness manifest cannot claim that the production Worker is linked.')
|
|
if (readiness.production?.exportedCallbacks?.length !== 0) fail('the prerequisite probe cannot declare production callback exports.')
|
|
if (readiness.boundary?.freecadNamingBuildStatus !== 'contract-only' || readiness.boundary?.exTsn02 !== 'in_progress' || readiness.boundary?.systemExact !== false) fail('the readiness manifest boundary disagrees with the authoritative status files.')
|
|
if (readiness.candidateAbi?.scope !== 'isolated-non-production') fail('the candidate ABI must remain isolated and non-production.')
|
|
if (readiness.isolatedSourceArchive?.target !== 'wasm32-emscripten' || readiness.isolatedSourceArchive?.expectedObjectMembers !== 7 || readiness.isolatedSourceArchive?.hostAdapterBound !== true || readiness.isolatedSourceArchive?.productionEligible !== false) fail('the source archive must remain a seven-object, host-adapter-bound wasm prerequisite.')
|
|
if (readiness.candidateAbi?.strictWebValidator !== 'pass') fail('the candidate ABI must pass the strict Web validator.')
|
|
if (readiness.candidateAbi?.occtBuilderContext !== false || readiness.candidateAbi?.publishToWorker !== false) fail('the candidate ABI cannot claim OCCT builder context or Worker publication.')
|
|
for (const resource of ['MappedNameRef', 'StringHasher', 'ElementMap2']) {
|
|
if (!readiness.candidateAbi?.nativeResources?.includes(resource)) fail(`the candidate ABI must validate native ${resource} evidence.`)
|
|
}
|
|
for (const callback of readiness.candidateAbi?.exports ?? []) {
|
|
if (!callback.startsWith('freecadNamingCandidate')) fail(`candidate export ${callback} could be mistaken for a production callback.`)
|
|
}
|
|
for (const callback of readiness.production?.requiredCallbacks ?? []) {
|
|
if (!smokeTest.includes(callback)) fail(`the source smoke test must reject production callback ${callback}.`)
|
|
}
|
|
for (const source of readiness.linkedOriginalSources ?? []) {
|
|
if (!buildScript.includes(source.path.split('/').at(-1)) || !buildScript.includes(source.sha256)) fail(`the source probe build does not pin ${source.path}.`)
|
|
}
|
|
for (const expected of ['src/App/StringHasher.cpp', 'src/App/MappedElement.cpp', 'src/App/ElementNamingUtils.cpp', 'src/App/ElementMap.cpp', 'src/Base/Handle.cpp']) {
|
|
if (!readiness.linkedOriginalSources?.some((source) => source.path === expected)) fail(`the source readiness manifest must include ${expected}.`)
|
|
}
|
|
for (const expected of ['FreeCADBase static library', 'FreeCADApp static library', 'Part static library', 'Python static library', 'real Application and Document integration', 'FreeCAD private naming Worker bridge']) {
|
|
if (!readiness.notLinkedProductionComponents?.includes(expected)) fail(`the source readiness manifest must retain ${expected} as not linked.`)
|
|
}
|
|
|
|
console.log(JSON.stringify({
|
|
status: 'boundary-pass',
|
|
shippedWorkerImplementation: 'not-linked',
|
|
task: { id: task.id, status: task.status },
|
|
systemExact: matrix.systemExactEvaluation.exact,
|
|
sdkStatus: matrix.nativeOcctHistory.freecadNamingBuild.status,
|
|
prerequisiteStatus: matrix.nativeOcctHistory.freecadNamingBuild.prerequisiteStatus,
|
|
sdkReadinessStatus: matrix.nativeOcctHistory.freecadNamingBuild.sdkReadinessStatus,
|
|
linkedOriginalSources: readiness.linkedOriginalSources.map((source) => source.path),
|
|
candidateAbi: {
|
|
scope: readiness.candidateAbi.scope,
|
|
strictWebValidator: readiness.candidateAbi.strictWebValidator,
|
|
publishToWorker: readiness.candidateAbi.publishToWorker,
|
|
},
|
|
sdkReadiness: {
|
|
scope: sdkPlan.scope,
|
|
productionPublication: sdkPlan.productionPublication,
|
|
requiredLibraries: sdkPlan.libraries.map(({ name }) => name),
|
|
},
|
|
workerLinked: readiness.production.workerLinked,
|
|
}, null, 2))
|