feat: close hidden link property evidence
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
import { readFile, writeFile } from 'node:fs/promises'
|
||||
import { resolve } from 'node:path'
|
||||
|
||||
const root = resolve(new URL('..', import.meta.url).pathname)
|
||||
const load = (path) => readFile(resolve(root, path), 'utf8').then(JSON.parse)
|
||||
const outputPath = resolve(root, 'config/freecad-property-linklisthidden-promotion.json')
|
||||
const [inventory, success, failure, mutation, roundTrip, chrome, semantics, progress] = await Promise.all([
|
||||
load('config/freecad-property-linklisthidden-inventory.json'),
|
||||
load('config/freecad-property-linklisthidden-success.json'),
|
||||
load('config/freecad-property-linklisthidden-failure.json'),
|
||||
load('config/freecad-property-linklisthidden-mutation.json'),
|
||||
load('config/freecad-property-linklisthidden-roundtrip.json'),
|
||||
load('config/chrome-property-linklisthidden-verification.json'),
|
||||
load('config/freecad-native-property-semantics.json'),
|
||||
load('config/freecad-follow-up-task-progress.json'),
|
||||
])
|
||||
const fail = (message) => { throw new Error(`FreeCAD PropertyLinkListHidden promotion generation failed: ${message}`) }
|
||||
const requiredCompletedPhases = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
|
||||
const completed = new Map(progress.completedTasks?.map((entry) => [entry.id, entry]) ?? [])
|
||||
for (const phase of requiredCompletedPhases) if (!completed.has(`PROP-app-propertylinklisthidden-${phase}`)) fail(`phase ${phase} is not completed in the evidence ledger`)
|
||||
if (inventory.status !== 'pass' || inventory.propertyType !== 'App::PropertyLinkListHidden' || inventory.recordCount !== 2 || inventory.objectTypeCount !== 2 || inventory.writableRecordCount !== 2) fail('inventory evidence is invalid')
|
||||
for (const [name, artifact] of Object.entries({ success, failure, mutation, roundTrip, chrome })) if (artifact.status !== 'pass') fail(`${name} evidence is not passing`)
|
||||
const propertyType = semantics.types?.find(({ typeId }) => typeId === 'App::PropertyLinkListHidden')
|
||||
if (propertyType?.support !== 'native-editable-codec' || propertyType.recordCount !== 2 || propertyType.objectTypeCount !== 2 || propertyType.statusNames?.join(',') !== 'PropHidden') fail('global property semantics did not promote App::PropertyLinkListHidden')
|
||||
const opaque = semantics.supportSummary?.['opaque-fcstd-proxy']
|
||||
const editable = semantics.supportSummary?.['native-editable-codec']
|
||||
if (opaque?.typeCount !== 45 || opaque.recordCount !== 455 || editable?.typeCount !== 35 || editable.recordCount !== 4372) fail('global property support summary is not synchronized')
|
||||
if (roundTrip.classification?.zeroUnknownDrift !== true || roundTrip.classification.hiddenLinksPreserved !== true || roundTrip.classification.nativeDependencyMetadataNormalized !== true || chrome.persistence?.loadedType !== 'App::PropertyLinkListHidden' || chrome.persistence.fcstdElement !== 'LinkList' || chrome.ui?.hiddenControlCountAfter !== 0 || chrome.release?.workerTerminated !== true) fail('round-trip or browser closure evidence is incomplete')
|
||||
const report = {
|
||||
schemaVersion: 1,
|
||||
status: 'pass',
|
||||
taskId: 'PROP-app-propertylinklisthidden-I',
|
||||
baseline: semantics.baseline,
|
||||
propertyType: 'App::PropertyLinkListHidden',
|
||||
recordCount: 2,
|
||||
phaseEvidence: Object.fromEntries(requiredCompletedPhases.map((phase) => [phase, completed.get(`PROP-app-propertylinklisthidden-${phase}`).evidence])),
|
||||
promotion: {
|
||||
from: inventory.classification,
|
||||
to: propertyType.support,
|
||||
facadeValueModel: 'ordered-duplicate-preserving-same-document-object-name-array',
|
||||
writableRecords: 2,
|
||||
objectTypeCount: 2,
|
||||
propertyStatus: 'PropHidden',
|
||||
linkScope: 'Hidden',
|
||||
runtimeDependencyEdges: 0,
|
||||
fcstdElement: chrome.persistence.fcstdElement,
|
||||
nativeRoundTripValue: roundTrip.classification.resavedValue,
|
||||
browserRoundTripValue: chrome.persistence.loadedValue,
|
||||
hiddenUiFiltered: chrome.ui.hiddenControlCountAfter === 0 && chrome.ui.hiddenTextPresentAfter === false,
|
||||
hiddenLinksPreserved: roundTrip.classification.hiddenLinksPreserved,
|
||||
nativeDependencyMetadataNormalized: roundTrip.classification.nativeDependencyMetadataNormalized,
|
||||
zeroUnknownDrift: roundTrip.classification.zeroUnknownDrift,
|
||||
},
|
||||
exactBlockerSync: {
|
||||
nativeEditableTypes: editable.typeCount,
|
||||
nativeEditableRecords: editable.recordCount,
|
||||
opaqueTypes: opaque.typeCount,
|
||||
opaqueRecords: opaque.recordCount,
|
||||
exactPromotionReady: semantics.exactPromotionReady,
|
||||
exactBlocker: semantics.exactBlocker,
|
||||
},
|
||||
systemExact: false,
|
||||
generatedAt: new Date().toISOString(),
|
||||
}
|
||||
await writeFile(outputPath, `${JSON.stringify(report, null, 2)}\n`)
|
||||
console.log(JSON.stringify({ status: 'freecad-property-linklisthidden-promotion-generated', output: 'config/freecad-property-linklisthidden-promotion.json', promotion: report.promotion, exactBlockerSync: report.exactBlockerSync }, null, 2))
|
||||
Reference in New Issue
Block a user