feat: advance TSN drift and ordered pair evidence
This commit is contained in:
@@ -4,13 +4,15 @@ import { resolve } from 'node:path'
|
||||
const root = resolve(new URL('..', import.meta.url).pathname)
|
||||
const outputPath = resolve(root, 'config/freecad-active-work-queue.json')
|
||||
const load = (path) => readFile(resolve(root, path), 'utf8').then(JSON.parse)
|
||||
const [gui, workflowPlan, composite, correlation, production, recoveredNaming] = await Promise.all([
|
||||
const [gui, workflowPlan, composite, correlation, production, recoveredNaming, productionDriftClassification, orderedPairClassification] = await Promise.all([
|
||||
load('.cache/freecad/reference-desktop-gui-commands.json'),
|
||||
load('config/freecad-gui-workflow-plan.json'),
|
||||
load('config/freecad-composite-history-elementmap-oracle.json'),
|
||||
load('config/freecad-tsn-stage-correlation-oracle.json'),
|
||||
load('config/chrome-freecad-naming-production-verification.json'),
|
||||
load('config/freecad-recovered-naming-classification.json'),
|
||||
load('config/freecad-production-drift-classification.json'),
|
||||
load('config/freecad-ordered-operation-pair-classification.json'),
|
||||
])
|
||||
|
||||
const guiShardTasks = gui.guiCommands.mergedShards.map((shard, index) => ({
|
||||
@@ -61,26 +63,47 @@ const driftTasks = driftCases.map((fixture, index) => ({
|
||||
...(classifications.has(fixture.id) ? { classification: classifications.get(fixture.id).classification, evidence: ['config/freecad-recovered-naming-classification.json', classifications.get(fixture.id).reasonCode] } : {}),
|
||||
exit: 'the case is classified as stable semantics, allowed evolution, or an implementation defect',
|
||||
}))
|
||||
const recoveredNamingClosed = completedDriftCases === driftCases.length
|
||||
const productionDriftClassifications = new Map(productionDriftClassification.classifications.map((entry) => [entry.operation, entry]))
|
||||
if (productionDriftClassifications.size !== productionDriftClassification.classifications.length) throw new Error('Production drift classifications contain duplicate operations.')
|
||||
const productionDriftMutations = correlation.mutations.filter((mutation) => mutation.restoreTopologyDriftStages > 0)
|
||||
const productionClassifiedPrefix = productionDriftMutations.findIndex(({ operation }) => !productionDriftClassifications.has(operation))
|
||||
const completedProductionDrifts = productionClassifiedPrefix < 0 ? productionDriftMutations.length : productionClassifiedPrefix
|
||||
if (productionDriftMutations.slice(completedProductionDrifts).some(({ operation }) => productionDriftClassifications.has(operation))) throw new Error('Production drift classifications must form a contiguous serial prefix.')
|
||||
for (const entry of productionDriftClassification.classifications) {
|
||||
if (!productionDriftMutations.some(({ operation }) => operation === entry.operation) || !['stable_semantics', 'allowed_evolution', 'implementation_defect'].includes(entry.classification)) throw new Error(`Production drift classification ${entry.operation} is invalid.`)
|
||||
}
|
||||
const productionDriftTasks = correlation.mutations
|
||||
.filter((mutation) => mutation.restoreTopologyDriftStages > 0)
|
||||
.map((mutation, index) => ({
|
||||
id: `TSN-PROD-DRIFT-${String(index).padStart(3, '0')}`,
|
||||
title: `Classify production restore topology drift for ${mutation.operation}`,
|
||||
status: 'pending',
|
||||
status: index < completedProductionDrifts ? 'completed' : recoveredNamingClosed && index === completedProductionDrifts ? 'in_progress' : 'pending',
|
||||
dependencies: [index === 0 ? driftTasks.at(-1).id : `TSN-PROD-DRIFT-${String(index - 1).padStart(3, '0')}`],
|
||||
operation: mutation.operation,
|
||||
driftStages: mutation.restoreTopologyDriftStages,
|
||||
...(productionDriftClassifications.has(mutation.operation) ? { classification: productionDriftClassifications.get(mutation.operation).classification, evidence: ['config/freecad-production-drift-classification.json', productionDriftClassifications.get(mutation.operation).reasonCode] } : {}),
|
||||
exit: 'every changed downstream stage has a native comparison and classification',
|
||||
}))
|
||||
const coveredTransitions = new Set(['cut->rotate', 'rotate->fillet', 'fillet->mirrored', 'mirrored->linear-pattern'])
|
||||
const productionDriftClosed = completedProductionDrifts === productionDriftTasks.length
|
||||
const orderedPairClassifications = new Map(orderedPairClassification.classifications.map((entry) => [entry.pair, entry]))
|
||||
if (orderedPairClassifications.size !== orderedPairClassification.classifications.length) throw new Error('Ordered operation pair classifications contain duplicate pairs.')
|
||||
for (const entry of orderedPairClassification.classifications) {
|
||||
if (!['accepted', 'rejected'].includes(entry.classification) || entry.nativeDecision !== entry.classification) throw new Error(`Ordered operation pair classification ${entry.pair} is invalid.`)
|
||||
}
|
||||
const coveredTransitions = new Set(['cut->rotate', 'rotate->fillet', 'fillet->mirrored', 'mirrored->linear-pattern', ...orderedPairClassifications.keys()])
|
||||
let nextTransitionSelected = false
|
||||
const transitionTasks = production.operations.flatMap((from) => production.operations.map((to) => {
|
||||
const pair = `${from}->${to}`
|
||||
const inProgress = productionDriftClosed && !coveredTransitions.has(pair) && !nextTransitionSelected
|
||||
if (inProgress) nextTransitionSelected = true
|
||||
return {
|
||||
id: `TSN-PAIR-${from}-${to}`,
|
||||
title: `Classify ordered operation pair ${pair}`,
|
||||
status: coveredTransitions.has(pair) ? 'completed' : 'pending',
|
||||
status: coveredTransitions.has(pair) ? 'completed' : inProgress ? 'in_progress' : 'pending',
|
||||
dependencies: coveredTransitions.has(pair) ? [] : [productionDriftTasks.at(-1).id],
|
||||
pair,
|
||||
...(orderedPairClassifications.has(pair) ? { classification: orderedPairClassifications.get(pair).classification, evidence: ['config/freecad-ordered-operation-pair-classification.json', orderedPairClassifications.get(pair).reasonCode] } : {}),
|
||||
exit: 'native acceptance or rejection is recorded; accepted pairs include builder, mutation, naming, and resave evidence',
|
||||
}
|
||||
}))
|
||||
@@ -98,8 +121,8 @@ const closureTasks = [
|
||||
const milestones = [
|
||||
{ id: 'ORA-GUI-BASELINE', exactTask: 'EX-ORA-01', status: 'completed', tasks: [...setupTasks, ...guiShardTasks, ...closureTasks] },
|
||||
{ id: 'ORA-GUI-WORKFLOWS', exactTask: 'EX-ORA-01', status: workflowClosed ? 'completed' : 'in_progress', tasks: workflowTasks },
|
||||
{ id: 'TSN-RECOVERY-DRIFT', exactTask: 'EX-TSN-04', status: workflowClosed ? 'in_progress' : 'pending', tasks: [...driftTasks, ...productionDriftTasks] },
|
||||
{ id: 'TSN-ORDERED-PAIRS', exactTask: 'EX-TSN-04', status: 'pending', tasks: transitionTasks },
|
||||
{ id: 'TSN-RECOVERY-DRIFT', exactTask: 'EX-TSN-04', status: productionDriftClosed ? 'completed' : workflowClosed ? 'in_progress' : 'pending', tasks: [...driftTasks, ...productionDriftTasks] },
|
||||
{ id: 'TSN-ORDERED-PAIRS', exactTask: 'EX-TSN-04', status: productionDriftClosed ? 'in_progress' : 'pending', tasks: transitionTasks },
|
||||
]
|
||||
const allTasks = milestones.flatMap((milestone) => milestone.tasks)
|
||||
const count = (status) => allTasks.filter((task) => task.status === status).length
|
||||
|
||||
Reference in New Issue
Block a user