@tiinex/core 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/src/tooling/portable/adapters/cli/cli.handoff-manufacture.js +47 -10
- package/src/tooling/portable/adapters/node/bootstrapCarrier.manufacture.js +18 -0
- package/src/tooling/portable/adapters/node/workspaceCarrier.manufacture.js +13 -3
- package/src/tooling/portable/bootstrap/tiinex.llm.bootstrap.md +2 -2
- package/src/tooling/portable/handoff/bootstrapCarrier.manufacture.js +56 -0
- package/src/tooling/portable/handoff/contracts/tiinex.handoff.package.v1.schema.md +340 -77
- package/src/tooling/portable/handoff/manufacture.js +3 -1
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.build.js +73 -32
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.closure.js +1 -1
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.inspect.js +9 -1
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.materials.js +28 -6
- package/src/tooling/portable/handoff/recipientV2.artifactFirst.shared.js +8 -0
- package/src/tooling/portable/handoff/recipientV2.coldProjection.js +11 -6
- package/src/tooling/portable/handoff/recipientV2.entryContract.js +12 -0
- package/src/tooling/portable/handoff/recipientV2.humanOutput.js +48 -6
- package/src/tooling/portable/handoff/recipientV2.packageV1.build.js +55 -43
- package/src/tooling/portable/handoff/recipientV2.packageV1.contract.js +57 -31
- package/src/tooling/portable/handoff/recipientV2.packageV1.inspect.helpers.js +63 -10
- package/src/tooling/portable/handoff/recipientV2.packageV1.inspect.js +55 -16
- package/src/tooling/portable/handoff/recipientV2.packageV1.workspaceProjection.js +14 -1
- package/src/tooling/portable/handoff/recipientV2.topology.js +3 -4
- package/src/tooling/portable/handoff/recipientV2.topology.materials.js +14 -0
- package/src/tooling/portable/handoff/workspaceCarrier.manufacture.js +42 -13
|
@@ -14,9 +14,10 @@ import { indexRecipientFiles, recipientWorkspaceDescriptor, virtualCacheMaterial
|
|
|
14
14
|
import { inspectPortableToolingBootstrap } from './toolingBootstrap.js';
|
|
15
15
|
import { projectRecipientV2EndpointRoles, projectRecipientV2ParticipantRoles, projectRecipientV2Routes } from './recipientV2.inspect.projection.js';
|
|
16
16
|
import { RECIPIENT_V2_PACKAGE_V1_FORMAT_ID, RECIPIENT_V2_PACKAGE_V1_ROOT_PATH, RECIPIENT_V2_PACKAGE_V1_SCHEMA_ID } from './recipientV2.packageV1.constants.js';
|
|
17
|
-
import { parseHandoffPackageV1, validatePackageFields, WORKSPACE_PACKAGE_ROLE } from './recipientV2.packageV1.contract.js';
|
|
17
|
+
import { BOOTSTRAP_PACKAGE_ROLE, HANDOFF_PACKAGE_ROLE, parseHandoffPackageV1, validatePackageFields, WORKSPACE_PACKAGE_ROLE } from './recipientV2.packageV1.contract.js';
|
|
18
18
|
import { deriveVisibleFacts, validateRouteClosure } from './recipientV2.packageV1.inspect.helpers.js';
|
|
19
|
-
import { workspaceCarrierProjection } from './recipientV2.packageV1.workspaceProjection.js';
|
|
19
|
+
import { bootstrapCarrierProjection, workspaceCarrierProjection } from './recipientV2.packageV1.workspaceProjection.js';
|
|
20
|
+
import { inspectRecipientV2WorkspaceSurface } from './recipientV2.inspect.workspaces.js';
|
|
20
21
|
import { byteEqual, currentSchemaId, decodeUtf8, dedupeFindings, deepFreeze, oneFile } from './recipientV2.packageV1.shared.js';
|
|
21
22
|
import { parseTransportEnvelopeV1, qualifyTransportEnvelopeV1Artifact, TRANSPORT_ENVELOPE_V1_ROLE, TRANSPORT_ENVELOPE_V1_SCHEMA_ID } from './transportEnvelopeV1.js';
|
|
22
23
|
|
|
@@ -85,7 +86,6 @@ export function inspectRecipientFacingV2PackageV1(bundle = {}, options = {}) {
|
|
|
85
86
|
if (String(payloadArtifact.facts?.workspaceId || '') && String(payloadArtifact.facts.workspaceId) !== String(binding.workspaceId || '')) findings.push(finding('error', 'portable.handoff-package-v1.workspace-sealed-payload-workspace-mismatch', 'Protected payload descriptor Workspace Id diverges from package binding.', { workspaceId: binding.workspaceId }));
|
|
86
87
|
workspaceParts.push({ workspaceId: binding.workspaceId, bindingState: 'sealed', artifact: Object.freeze({ path: workspaceFile.path, sha256: sha256Hex(workspaceData), markdown: workspaceMarkdown }), facts: { workspaceId: binding.workspaceId, sourceWorkspaceTargetInnerPath: '', sourceWorkspaceTargetSha256: sha256Hex(workspaceData) }, archiveFile: null, archive: null, targetQualification: null, protectedPayloadArtifact: payloadArtifact, protectedPayloadFile: payloadFile, transportEnvelopeArtifact: envelopeArtifact });
|
|
87
88
|
sealedWorkspaceBindings.push(Object.freeze({ workspaceId: binding.workspaceId, workspaceArtifactPath: binding.workspaceArtifactPath, workspaceArtifactSha256: sha256Hex(workspaceData), protectedPayloadDescriptorPath: binding.protectedPayloadDescriptorPath, protectedPayloadPath: payload.location, protectedPayloadSha256: payload.integrityValue, protectedPayloadBytes: protectedBytes.byteLength, transportEnvelopePath: binding.transportEnvelopePath, envelope }));
|
|
88
|
-
virtualWorkspaceTargets.push(workspaceFile);
|
|
89
89
|
continue;
|
|
90
90
|
}
|
|
91
91
|
|
|
@@ -107,16 +107,36 @@ export function inspectRecipientFacingV2PackageV1(bundle = {}, options = {}) {
|
|
|
107
107
|
const descriptorPart = recipientWorkspaceDescriptor({ workspaceId: binding.workspaceId, facts: { providerKind: 'package-local-stored-zip-v1' }, representation: { workspaceArtifactInnerPath: binding.workspaceArtifactInnerPath, coverage: 'complete' }, payload: { location: binding.snapshotPath }, entries: parsed.entries || [], targetMarkdown: workspaceMarkdown, targetPackagePath: binding.workspaceArtifactPath, targetFile: { bytes: workspaceData.byteLength, sha256: sha256Hex(workspaceData) }, archiveFile: { path: archiveFile.path, bytes: archiveData.byteLength, sha256: archiveSha } });
|
|
108
108
|
workspaceDescriptors.push(descriptorPart);
|
|
109
109
|
workspaceParts.push({ workspaceId: binding.workspaceId, bindingState: 'verified', artifact: Object.freeze({ path: workspaceFile.path, sha256: sha256Hex(workspaceData), markdown: workspaceMarkdown }), facts: { workspaceId: binding.workspaceId, sourceWorkspaceTargetInnerPath: binding.workspaceArtifactInnerPath, sourceWorkspaceTargetSha256: sha256Hex(workspaceData) }, archiveFile, archive: { archive: parsed, sha256: archiveSha }, targetQualification });
|
|
110
|
-
virtualWorkspaceTargets.push(workspaceFile);
|
|
111
110
|
}
|
|
112
111
|
|
|
113
112
|
const payloadArtifacts = generatedArtifacts.filter((item) => item.schemaId === 'tiinex.external.payload.v1' && item.status === 'qualified');
|
|
114
113
|
const bootstrapArtifacts = payloadArtifacts.filter((item) => item.facts?.role === 'portable Tooling bootstrap runtime for recipient orientation and verification');
|
|
115
114
|
const cacheArtifacts = payloadArtifacts.filter((item) => item.facts?.role === 'workspace-scoped Handoff dependency cache');
|
|
116
115
|
const protectedWorkspacePayloadArtifacts = payloadArtifacts.filter((item) => item.facts?.role === 'password-sealed Workspace protected payload');
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
const genericWorkspaceArtifacts = generatedArtifacts.filter((item) => item.schemaId === 'tiinex.workspace.v1' && item.facts?.role === 'workspace-node');
|
|
117
|
+
const genericRepresentationArtifacts = generatedArtifacts.filter((item) => item.schemaId === 'tiinex.workspace.representation.v1');
|
|
118
|
+
const genericWorkspacePayloadArtifacts = payloadArtifacts.filter((item) => item.facts?.role === 'workspace-representation-payload');
|
|
119
|
+
if (generatedArtifacts.some((item) => item.schemaId === 'tiinex.relation.v1')) findings.push(finding('error', 'portable.handoff-package-v1.relation-unowned', 'Package-v1 material carriage is selected through Workspace Representation bindings; detached Relation companions are not package-owned carrier truth.'));
|
|
120
|
+
const genericMaterialSurface = inspectRecipientV2WorkspaceSurface({
|
|
121
|
+
generatedArtifacts: [...genericWorkspaceArtifacts, ...genericRepresentationArtifacts, ...genericWorkspacePayloadArtifacts],
|
|
122
|
+
rootArtifact: null, index, findings, transportManifest: { identityByPath: new Map() }
|
|
123
|
+
});
|
|
124
|
+
const materialBindings = packageContract?.materialRepresentations || [];
|
|
125
|
+
const materialPartsByRepresentation = new Map((genericMaterialSurface.workspaceParts || []).map((part) => [String(part.representationArtifact?.path || ''), part]));
|
|
126
|
+
const selectedMaterialRepresentationPaths = new Set();
|
|
127
|
+
for (const binding of materialBindings) {
|
|
128
|
+
const representationPath = String(binding.workspaceRepresentationPath || '');
|
|
129
|
+
if (selectedMaterialRepresentationPaths.has(representationPath)) findings.push(finding('error', 'portable.handoff-package-v1.material-representation-binding-duplicate', 'Each carried Workspace Representation may be selected at most once by Material Representation Bindings.', { path: representationPath }));
|
|
130
|
+
selectedMaterialRepresentationPaths.add(representationPath);
|
|
131
|
+
const part = materialPartsByRepresentation.get(representationPath) || null;
|
|
132
|
+
if (!part) { findings.push(finding('error', 'portable.handoff-package-v1.material-representation-unresolved', 'Material Representation binding must resolve to one qualified carried tiinex.workspace.representation.v1 closure.', { materialId: binding.materialId || '', path: representationPath })); continue; }
|
|
133
|
+
if (String(binding.carriageState || '') !== 'verified') findings.push(finding('error', 'portable.handoff-package-v1.material-representation-unverified', 'A package ready for source-material use requires Carriage State verified.', { materialId: binding.materialId || '', carriageState: binding.carriageState || '' }));
|
|
134
|
+
if (String(part.representation?.bindingState || '') !== 'verified' || !['complete', 'bounded'].includes(String(part.representation?.coverage || '')) || part.targetQualification?.state !== 'qualified') findings.push(finding('error', 'portable.handoff-package-v1.material-representation-provider-unqualified', 'Selected Workspace Representation must independently qualify as a clear provider-ready complete/bounded binding.', { materialId: binding.materialId || '', workspaceId: part.workspaceId || '', coverage: part.representation?.coverage || '', bindingState: part.representation?.bindingState || '' }));
|
|
135
|
+
}
|
|
136
|
+
for (const part of genericMaterialSurface.workspaceParts || []) if (!selectedMaterialRepresentationPaths.has(String(part.representationArtifact?.path || ''))) findings.push(finding('error', 'portable.handoff-package-v1.material-representation-unselected', 'Carried generic Workspace Representation closure must be selected by exactly one Material Representation Binding.', { path: part.representationArtifact?.path || '', workspaceId: part.workspaceId || '' }));
|
|
137
|
+
workspaceParts.push(...(genericMaterialSurface.workspaceParts || []));
|
|
138
|
+
workspaceDescriptors.push(...(genericMaterialSurface.workspaceDescriptors || []));
|
|
139
|
+
virtualWorkspaceTargets.push(...(genericMaterialSurface.virtualWorkspaceTargetFiles || []));
|
|
120
140
|
|
|
121
141
|
let bootstrapInspection = null;
|
|
122
142
|
if (packageContract?.bootstrapPath) {
|
|
@@ -149,7 +169,7 @@ export function inspectRecipientFacingV2PackageV1(bundle = {}, options = {}) {
|
|
|
149
169
|
const virtualCache = { files: Object.freeze(virtualCacheParts.flatMap((item) => item.files || [])), materialized: Object.freeze(virtualCacheParts.flatMap((item) => item.materialized || [])) };
|
|
150
170
|
|
|
151
171
|
const descriptor = deepFreeze({ schema: 'tiinex.transport.handoff-material-closure-descriptor.v2', version: 2, workspaceMaterializations: Object.freeze(workspaceDescriptors.map((item) => item.workspace)), workspaceArchiveBindings: Object.freeze(workspaceDescriptors.map((item) => item.binding)), materialized: Object.freeze(virtualCache.materialized), requirements: Object.freeze({ required: Object.freeze([]), reference: Object.freeze([]), endpointRoles: Object.freeze([]), participantRoles: Object.freeze([]), dependencies: Object.freeze([]) }) });
|
|
152
|
-
const semanticBundle = { ...bundle, files: Object.freeze([...files, ...virtualCache.files]) };
|
|
172
|
+
const semanticBundle = { ...bundle, files: Object.freeze([...files, ...virtualWorkspaceTargets, ...virtualCache.files]) };
|
|
153
173
|
const workspaceByteProvider = buildHandoffWorkspaceByteProvider(semanticBundle, descriptor);
|
|
154
174
|
findings.push(...(workspaceByteProvider.findings || []));
|
|
155
175
|
|
|
@@ -157,9 +177,19 @@ export function inspectRecipientFacingV2PackageV1(bundle = {}, options = {}) {
|
|
|
157
177
|
const endpointRolePointers = generatedArtifacts.filter((item) => item.schemaId === 'tiinex.pointer.v1' && item.facts?.role === 'endpoint-role' && item.status === 'qualified');
|
|
158
178
|
const participantRolePointers = generatedArtifacts.filter((item) => item.schemaId === 'tiinex.pointer.v1' && item.facts?.role === 'participant-role' && item.status === 'qualified');
|
|
159
179
|
const lineage = packageContract ? Object.freeze({ dimension: packageContract.carrierDimension, parentDimension: packageContract.parentCarrierDimension, checkpointKind: packageContract.carrierCheckpoint, majorReason: packageContract.majorReason || '' }) : null;
|
|
160
|
-
const
|
|
180
|
+
const packageRole = String(packageContract?.packageRole || '');
|
|
181
|
+
const workspaceMode = packageRole === WORKSPACE_PACKAGE_ROLE;
|
|
182
|
+
const bootstrapMode = packageRole === BOOTSTRAP_PACKAGE_ROLE;
|
|
183
|
+
const carriedWorkspaceIds = new Set([...workspaceParts.map((part) => String(part.workspaceId || '').toLowerCase()), ...sealedWorkspaceBindings.map((part) => String(part.workspaceId || '').toLowerCase())].filter(Boolean));
|
|
184
|
+
if (packageContract?.carrierCheckpoint === 'major') {
|
|
185
|
+
const missingMajorWorkspaceIds = (packageContract.requiredMajorWorkspaceIds || []).filter((workspaceId) => !carriedWorkspaceIds.has(String(workspaceId || '').toLowerCase()));
|
|
186
|
+
if (missingMajorWorkspaceIds.length) findings.push(finding('error', 'portable.handoff-package-v1.major-source-closure-incomplete', 'Major package-v1 carrier is missing one or more Workspace source-material bindings required by its explicit carrier profile.', { carrierProfileId: String(packageContract.carrierProfileId || ''), missingWorkspaceIds: missingMajorWorkspaceIds }));
|
|
187
|
+
}
|
|
161
188
|
let carrierProjection;
|
|
162
|
-
if (
|
|
189
|
+
if (bootstrapMode) {
|
|
190
|
+
if (workspaceParts.length || sealedWorkspaceBindings.length || routePointers.length || endpointRolePointers.length || participantRolePointers.length || caches.length) findings.push(finding('error', 'portable.handoff-package-v1.bootstrap-carrier.semantic-surface-present', 'Bootstrap-only carrier must not expose Workspace/material provider, Handoff route, Role pointer, or Handoff cache semantics.', { workspaces: workspaceParts.length, sealedWorkspaces: sealedWorkspaceBindings.length, routes: routePointers.length, endpointRoles: endpointRolePointers.length, participantRoles: participantRolePointers.length, caches: caches.length }));
|
|
191
|
+
carrierProjection = bootstrapCarrierProjection(lineage, bootstrapInspection?.status === 'valid');
|
|
192
|
+
} else if (workspaceMode) {
|
|
163
193
|
if (routePointers.length || endpointRolePointers.length || participantRolePointers.length || caches.length) findings.push(finding('error', 'portable.handoff-package-v1.workspace-carrier.handoff-surface-present', 'Pointerless Workspace carrier must not expose Handoff route, Role pointer, or Handoff cache carriers.', { routes: routePointers.length, endpointRoles: endpointRolePointers.length, participantRoles: participantRolePointers.length, caches: caches.length }));
|
|
164
194
|
carrierProjection = workspaceCarrierProjection(workspaceParts, lineage);
|
|
165
195
|
} else {
|
|
@@ -196,6 +226,7 @@ export function inspectRecipientFacingV2PackageV1(bundle = {}, options = {}) {
|
|
|
196
226
|
packageFile?.path,
|
|
197
227
|
packageContract?.startPath,
|
|
198
228
|
...(bindings || []).flatMap((binding) => [binding.workspaceArtifactPath, binding.snapshotPath, binding.protectedPayloadDescriptorPath, binding.transportEnvelopePath]),
|
|
229
|
+
...(genericMaterialSurface.workspaceParts || []).flatMap((part) => [part.artifact?.path, part.representationArtifact?.path, part.payloadArtifact?.path, part.archiveFile?.path]),
|
|
199
230
|
...protectedWorkspacePayloadArtifacts.flatMap((artifact) => [artifact.path, parseRecipientV2ExternalPayload(artifact.markdown).location]),
|
|
200
231
|
...generatedArtifacts.filter((item) => ['recovery-orientation', 'handoff-route', 'endpoint-role', 'participant-role'].includes(String(item.facts?.role || ''))).map((item) => item.path),
|
|
201
232
|
...bootstrapArtifacts.flatMap((artifact) => [artifact.path, parseRecipientV2ExternalPayload(artifact.markdown).location]),
|
|
@@ -212,12 +243,12 @@ export function inspectRecipientFacingV2PackageV1(bundle = {}, options = {}) {
|
|
|
212
243
|
return deepFreeze({
|
|
213
244
|
schema: 'tiinex.portable.recipient-facing-handoff-package-v1.inspection.v1', detected: Boolean(packageFile), status, format: RECIPIENT_V2_PACKAGE_V1_FORMAT_ID,
|
|
214
245
|
rootArtifact: packageFile ? Object.freeze({ path: packageFile.path, schemaId: RECIPIENT_V2_PACKAGE_V1_SCHEMA_ID, sha256: sha256Hex(packageFileBytes(packageFile)), carrierLineage: lineage }) : null,
|
|
215
|
-
readArtifact, workspaces: Object.freeze(workspaceParts.map((item) => Object.freeze({ workspaceId: item.workspaceId, coverage: 'complete', bindingState: item.bindingState || 'verified', workspaceArtifactPath: item.artifact.path, workspaceArchivePath: item.archiveFile?.path || '', sourceWorkspaceTargetInnerPath: item.facts.sourceWorkspaceTargetInnerPath, sourceWorkspaceTargetSha256: item.facts.sourceWorkspaceTargetSha256 }))), sealedWorkspaces: Object.freeze(sealedWorkspaceBindings),
|
|
246
|
+
readArtifact, workspaces: Object.freeze(workspaceParts.map((item) => Object.freeze({ workspaceId: item.workspaceId, coverage: String(item.representation?.coverage || item.facts?.coverage || 'complete'), bindingState: item.bindingState || String(item.representation?.bindingState || 'verified'), workspaceArtifactPath: item.artifact.path, workspaceArchivePath: item.archiveFile?.path || '', sourceWorkspaceTargetInnerPath: item.facts.sourceWorkspaceTargetInnerPath, sourceWorkspaceTargetSha256: item.facts.sourceWorkspaceTargetSha256 }))), sealedWorkspaces: Object.freeze(sealedWorkspaceBindings),
|
|
216
247
|
routes: projectRecipientV2Routes(routePointers, endpointRolePointers, participantRolePointers), endpointRoles: projectRecipientV2EndpointRoles(endpointRolePointers), participantRoles: projectRecipientV2ParticipantRoles(participantRolePointers),
|
|
217
248
|
caches: Object.freeze(caches.map((cache) => Object.freeze({ workspaceId: String(cache.facts?.workspaceId || ''), artifactPath: cache.artifact.path, archivePath: cache.file.path, materials: cache.facts.materials || [] }))),
|
|
218
249
|
bootstrapInspection, transportManifest: null, artifactFacts: Object.freeze(generatedArtifacts.map((item) => Object.freeze({ path: item.path, facts: item.facts }))), descriptor, workspaceByteProvider, carrierProjection, coldConsumerProjection,
|
|
219
250
|
packageContract, findings: Object.freeze(finalFindings), findingSummary: Object.freeze({ errors: finalFindings.filter((item) => item.severity === 'error').length, findings: finalFindings.length }),
|
|
220
|
-
boundary: 'Read-only qualification of tiinex.handoff.package.v1: visible package identity/discovery
|
|
251
|
+
boundary: 'Read-only qualification of tiinex.handoff.package.v1: visible package identity/discovery, direct complete Workspace bindings, generic complete/bounded Workspace Representation bindings, and bootstrap/route projection rules are reverified from exact bytes; derived inventories have no authority.'
|
|
221
252
|
});
|
|
222
253
|
}
|
|
223
254
|
|
|
@@ -239,14 +270,22 @@ function qualifyParentBoundaryCacheRequirementIds(caches = [], workspaceByteProv
|
|
|
239
270
|
const requirementId = String(item.requirementId || '');
|
|
240
271
|
const routeWorkspaceId = String(item.routeWorkspaceId || '');
|
|
241
272
|
const routePath = normalizeWorkspacePath(item.routePath || '');
|
|
242
|
-
const sourceWorkspaceId = String(item.sourceWorkspaceId || '');
|
|
243
|
-
const sourcePath = normalizeWorkspacePath(item.sourcePath || '');
|
|
273
|
+
const sourceWorkspaceId = String(item.sourceWorkspaceId || routeWorkspaceId || '');
|
|
274
|
+
const sourcePath = normalizeWorkspacePath(item.sourcePath || routePath || '');
|
|
244
275
|
const targetWorkspaceId = String(item.targetWorkspaceId || '');
|
|
245
276
|
const targetPath = normalizeWorkspacePath(item.targetPath || item.originalPath || '');
|
|
246
277
|
const referenceTarget = String(item.referenceTarget || '').trim();
|
|
247
278
|
const routeQualified = (carrierProjection.routes || []).some((route) => String(route.state || '') === 'qualified' && String(route.workspaceId || '') === routeWorkspaceId && normalizeWorkspacePath(route.workspaceRelativePath || '') === routePath);
|
|
279
|
+
const sourceRequirementId = String(item.sourceRequirementId || '');
|
|
280
|
+
const sourceWorkspace = (workspaceByteProvider.workspaces || []).find((workspace) => String(workspace.id || '') === sourceWorkspaceId) || null;
|
|
281
|
+
const boundedRecoveryQualified = Boolean(
|
|
282
|
+
sourceRequirementId.startsWith(`bounded-workspace:${sourceWorkspaceId}:`) &&
|
|
283
|
+
routeWorkspaceId === sourceWorkspaceId && routePath === sourcePath &&
|
|
284
|
+
String(sourceWorkspace?.materialization?.materialization || '') === 'bounded' &&
|
|
285
|
+
sourceWorkspace?.state === 'qualified'
|
|
286
|
+
);
|
|
248
287
|
let reason = '';
|
|
249
|
-
if (!requirementId || !routeQualified || !sourceWorkspaceId || !sourcePath || !targetWorkspaceId || !targetPath || !referenceTarget || !candidate.entry) reason = 'parent-boundary-visible-facts-incomplete';
|
|
288
|
+
if (!requirementId || (!routeQualified && !boundedRecoveryQualified) || !sourceWorkspaceId || !sourcePath || !targetWorkspaceId || !targetPath || !referenceTarget || !candidate.entry) reason = 'parent-boundary-visible-facts-incomplete';
|
|
250
289
|
if (!reason && targetIndex.get(candidate.targetKey)?.length !== 1) reason = 'parent-boundary-target-ambiguous';
|
|
251
290
|
if (!reason) {
|
|
252
291
|
const alreadyCarried = resolveHandoffWorkspaceEntry(workspaceByteProvider, targetWorkspaceId, targetPath);
|
|
@@ -276,7 +315,7 @@ function qualifyParentBoundaryCacheRequirementIds(caches = [], workspaceByteProv
|
|
|
276
315
|
}
|
|
277
316
|
}
|
|
278
317
|
if (reason) findings.push(finding('error', 'portable.handoff-package-v1.cache-parent-boundary-unqualified', 'Workspace dependency cache Parent-boundary material is not independently justified by the selected route declared Parent chain.', { requirementId, reason }));
|
|
279
|
-
else allowed.add(requirementId);
|
|
318
|
+
else { allowed.add(requirementId); if (sourceRequirementId) allowed.add(sourceRequirementId); }
|
|
280
319
|
}
|
|
281
320
|
return allowed;
|
|
282
321
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WORKSPACE_PACKAGE_ROLE } from './recipientV2.packageV1.contract.js';
|
|
1
|
+
import { BOOTSTRAP_PACKAGE_ROLE, WORKSPACE_PACKAGE_ROLE } from './recipientV2.packageV1.contract.js';
|
|
2
2
|
import { deepFreeze } from './recipientV2.packageV1.shared.js';
|
|
3
3
|
|
|
4
4
|
export function workspaceCarrierProjection(workspaceParts = [], lineage = null) {
|
|
@@ -20,3 +20,16 @@ export function workspaceCarrierProjection(workspaceParts = [], lineage = null)
|
|
|
20
20
|
findings: Object.freeze([])
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
|
+
|
|
24
|
+
export function bootstrapCarrierProjection(lineage = null, bootstrapQualified = false) {
|
|
25
|
+
return deepFreeze({
|
|
26
|
+
schema: 'tiinex.portable.handoff-carrier-projection.v1', version: 1,
|
|
27
|
+
status: bootstrapQualified ? 'ready' : 'blocked', mode: 'bootstrap', lineage,
|
|
28
|
+
workspaces: Object.freeze([]),
|
|
29
|
+
workspace: Object.freeze({ id: '', title: '', slug: '', qualification: 'unresolved' }),
|
|
30
|
+
selection: Object.freeze({ policy: 'none', qualifiedRouteCount: 0, implicitRouteId: '', packageRole: BOOTSTRAP_PACKAGE_ROLE }),
|
|
31
|
+
routes: Object.freeze([]),
|
|
32
|
+
authority: Object.freeze({ semanticAuthority: 'none', filenameAuthority: false, dimensionalParentAuthority: false, routeSelectionAuthority: 'none', holderAuthority: 'none', workAuthority: 'none' }),
|
|
33
|
+
findings: Object.freeze([])
|
|
34
|
+
});
|
|
35
|
+
}
|
|
@@ -15,6 +15,7 @@ import { buildRecipientFacingV2PackageV1 } from './recipientV2.packageV1.js';
|
|
|
15
15
|
import { buildEndpointRolePointerChain, buildParticipantRolePointerChain } from './recipientV2.endpointRolePointers.js';
|
|
16
16
|
import {
|
|
17
17
|
bindingForWorkspace,
|
|
18
|
+
boundedWorkspaceClaimsDetachedRecovery,
|
|
18
19
|
deepFreeze,
|
|
19
20
|
detachedMaterial,
|
|
20
21
|
duplicates,
|
|
@@ -46,9 +47,6 @@ export function buildRecipientFacingV2Topology(input = {}) {
|
|
|
46
47
|
if (input.legacyRecipientV2Compatibility === true) return sourceSurface;
|
|
47
48
|
if (input.artifactFirstDualProjectionPhase1 === true) return buildRecipientFacingV2ArtifactFirstPhase1({ ...input, sourceSurface });
|
|
48
49
|
if (input.artifactFirstCleanCarrierPhase2 === true) return buildRecipientFacingV2ArtifactFirstPhase2Clean({ ...input, sourceSurface });
|
|
49
|
-
const hasIndependentBoundedWorkspaceRepresentation = (input.descriptor?.workspaceArchiveBindings || input.bundle?.handoffClosure?.workspaceArchiveBindings || [])
|
|
50
|
-
.some((binding) => String(binding.coverage || '') === 'bounded' || String(binding.representation?.kind || '') === 'bounded-workspace-snapshot');
|
|
51
|
-
if (hasIndependentBoundedWorkspaceRepresentation) return buildRecipientFacingV2ArtifactFirstPhase2Clean({ ...input, sourceSurface });
|
|
52
50
|
const explicitRouteSelector = String(input.routeSelector || input.routeId || '').trim();
|
|
53
51
|
if (!explicitRouteSelector && (sourceSurface.topology?.routes || []).length > 1) return sourceSurface;
|
|
54
52
|
return buildRecipientFacingV2PackageV1({ ...input, sourceSurface });
|
|
@@ -145,7 +143,8 @@ function buildRecipientFacingV2TopologyLegacy(input = {}) {
|
|
|
145
143
|
const workspace = workspaceById.get(workspacePlan.workspaceId);
|
|
146
144
|
if (!workspace) continue;
|
|
147
145
|
const workspaceRoutes = routePlans.filter((plan) => plan.workspace.workspaceId === workspace.workspaceId);
|
|
148
|
-
const
|
|
146
|
+
const binding = bindingForWorkspace(descriptor, workspace.workspaceId);
|
|
147
|
+
const materials = detached.filter((item) => workspaceRoutes.some((plan) => routeClaimsDetachedMaterial(plan.route, item)) || boundedWorkspaceClaimsDetachedRecovery(binding, item));
|
|
149
148
|
if (!materials.length) continue;
|
|
150
149
|
const artifactPath = `001-${workspacePlan.ordinal}-1-cache.trace.md`;
|
|
151
150
|
const archivePath = `001-${workspacePlan.ordinal}-1-cache.zip`;
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import { packageFileBytes, sha256Hex } from '../../../export/package.bytes.js';
|
|
2
2
|
|
|
3
3
|
export function bindingForWorkspace(descriptor = {}, workspaceId = '') { return (descriptor.workspaceArchiveBindings || []).find((binding) => String(binding.workspaceId || '') === String(workspaceId || '')) || null; }
|
|
4
|
+
export function boundedWorkspaceClaimsDetachedRecovery(binding = {}, material = {}) {
|
|
5
|
+
const workspaceId = String(binding.workspaceId || '').trim();
|
|
6
|
+
if (!workspaceId || String(binding.coverage || '') !== 'bounded') return false;
|
|
7
|
+
if (String(material.classification || '') !== 'parent-boundary') return false;
|
|
8
|
+
if (String(material.routeWorkspaceId || '') !== workspaceId) return false;
|
|
9
|
+
if (!String(material.sourceRequirementId || '').startsWith(`bounded-workspace:${workspaceId}:`)) return false;
|
|
10
|
+
const targetWorkspaceId = String(material.targetWorkspaceId || workspaceId);
|
|
11
|
+
if (targetWorkspaceId !== workspaceId) return false;
|
|
12
|
+
const included = new Set((binding.entryMap?.entries || []).map((entry) => normalizeWorkspacePath(entry.path || '')));
|
|
13
|
+
const sourcePath = normalizeWorkspacePath(material.sourcePath || material.routePath || '');
|
|
14
|
+
const targetPath = normalizeWorkspacePath(material.targetPath || material.originalPath || '');
|
|
15
|
+
return Boolean(sourcePath && targetPath && included.has(sourcePath) && !included.has(targetPath));
|
|
16
|
+
}
|
|
17
|
+
|
|
4
18
|
export function routeClaimsDetachedMaterial(route = {}, material = {}) {
|
|
5
19
|
const scopedWorkspace = String(material.routeWorkspaceId || '').trim();
|
|
6
20
|
const scopedPath = normalizeWorkspacePath(material.routePath || '');
|
|
@@ -7,7 +7,7 @@ import { renderRecipientV2Pointer } from './recipientV2.artifacts.js';
|
|
|
7
7
|
import { RECIPIENT_V2_READ_PATH, RECIPIENT_V2_FORMAT_ID } from './recipientV2.topology.js';
|
|
8
8
|
import { recipientV2WorkspaceEntryCurrentRead } from './recipientV2.entryContract.js';
|
|
9
9
|
import { recipientV2TransportFacts } from './recipientV2.transportManifest.js';
|
|
10
|
-
import { buildRecipientV2BootstrapCarrier, recipientV2ParentAuthority } from './recipientV2.topology.workspaces.js';
|
|
10
|
+
import { buildRecipientV2BootstrapCarrier, buildRecipientV2WorkspaceCarriers, recipientV2ParentAuthority } from './recipientV2.topology.workspaces.js';
|
|
11
11
|
import { safeToken, finding } from './recipientV2.topology.materials.js';
|
|
12
12
|
import { RECIPIENT_V2_PACKAGE_V1_ROOT_PATH, RECIPIENT_V2_PACKAGE_V1_SCHEMA_ID, RECIPIENT_V2_PACKAGE_V1_SCHEMA_TARGET } from './recipientV2.packageV1.constants.js';
|
|
13
13
|
import { renderHandoffPackageV1, WORKSPACE_PACKAGE_ROLE } from './recipientV2.packageV1.contract.js';
|
|
@@ -19,6 +19,7 @@ export function manufactureRecipientRelativeWorkspacePackage(input = {}) {
|
|
|
19
19
|
const targetByWorkspace = indexWorkspaceTargetDeclarations(input.workspaceTargets || []);
|
|
20
20
|
const workspaces = [...(input.workspaceMaterializations || [])].sort((a, b) => String(a.id || '').localeCompare(String(b.id || '')));
|
|
21
21
|
const plans = [];
|
|
22
|
+
const forcedMaterialWorkspaceIds = new Set([...(input.materialRepresentationWorkspaceIds || []), ...(input.genericMaterialWorkspaceIds || [])].map((value) => String(value || '')));
|
|
22
23
|
for (const [index, raw] of workspaces.entries()) {
|
|
23
24
|
const id = String(raw.id || '').trim();
|
|
24
25
|
const wrapper = Object.freeze({ ...raw, materialization: String(raw.state || ''), qualification: 'qualified', correlationStatus: 'qualified' });
|
|
@@ -28,13 +29,35 @@ export function manufactureRecipientRelativeWorkspacePackage(input = {}) {
|
|
|
28
29
|
const prefix = `001-${index + 3}`;
|
|
29
30
|
const slug = safeToken(id);
|
|
30
31
|
const archiveData = exportFileMapZipUint8Array((qualified.entries || []).map((entry) => ({ path: entry.path, data: entry.data })), 'portable.workspace-carrier.workspace-archive.path.invalid');
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
const coverage = String(raw.state || '') === 'bounded' ? 'bounded' : 'complete';
|
|
33
|
+
const useMaterialRepresentation = coverage === 'bounded' || forcedMaterialWorkspaceIds.has(id);
|
|
34
|
+
if (useMaterialRepresentation) {
|
|
35
|
+
const sourceWorkspacePath = `source-${prefix}-${slug}.workspace.md`;
|
|
36
|
+
const sourceArchivePath = `source-${prefix}-${slug}.workspace.zip`;
|
|
37
|
+
const sourceWorkspaceFile = exactFile(sourceWorkspacePath, qualified.target.data, 'recipient-v2-workspace-carrier-material-source-target', 'text/markdown');
|
|
38
|
+
const sourceArchiveFile = exactFile(sourceArchivePath, archiveData, 'recipient-v2-workspace-carrier-material-source-archive', 'application/zip');
|
|
39
|
+
const evidence = coverage === 'bounded' ? (raw.scopeEvidence || {}) : (raw.completenessEvidence || {});
|
|
40
|
+
const binding = Object.freeze({
|
|
41
|
+
workspaceId: id, coverage,
|
|
42
|
+
representation: Object.freeze({ packagePath: sourceArchivePath, kind: coverage === 'bounded' ? 'bounded-workspace-snapshot' : 'complete-workspace-snapshot', codec: 'deterministic-stored-zip' }),
|
|
43
|
+
workspaceTarget: Object.freeze({ packagePath: sourceWorkspacePath, innerPath: qualified.target.path }),
|
|
44
|
+
provider: Object.freeze({ kind: 'package-local-stored-zip-v1' }),
|
|
45
|
+
scope: coverage === 'bounded' ? Object.freeze({ ...evidence }) : undefined,
|
|
46
|
+
completeness: coverage === 'complete' ? Object.freeze({ ...evidence }) : undefined,
|
|
47
|
+
entryMap: Object.freeze({ count: qualified.entries.length, entries: Object.freeze(qualified.entries.map((entry) => Object.freeze({ path: entry.path, bytes: entry.bytes, sha256: entry.sha256, referenceTarget: String(entry.referenceTarget || '') }))) })
|
|
48
|
+
});
|
|
49
|
+
plans.push(Object.freeze({ id, raw, qualified, coverage, useMaterialRepresentation, sourceWorkspaceFile, sourceArchiveFile, binding, projection: Object.freeze({ workspaceId: id, coverage }) }));
|
|
50
|
+
} else {
|
|
51
|
+
const workspacePath = `${prefix}-${slug}.workspace.md`;
|
|
52
|
+
const archivePath = `${prefix}-${slug}.workspace.zip`;
|
|
53
|
+
const workspaceFile = exactFile(workspacePath, qualified.target.data, 'recipient-v2-package-v1-exact-workspace-artifact', 'text/markdown');
|
|
54
|
+
const archiveFile = exactFile(archivePath, archiveData, 'recipient-v2-package-v1-complete-workspace-snapshot', 'application/zip');
|
|
55
|
+
plans.push(Object.freeze({ id, raw, qualified, coverage, useMaterialRepresentation, workspaceFile, archiveFile, projection: Object.freeze({ workspaceId: id, workspacePath, archivePath, sourceWorkspaceTargetInnerPath: qualified.target.path, sourceWorkspaceTargetSha256: workspaceFile.sha256, archiveSha256: archiveFile.sha256, archiveBytes: archiveFile.bytes, coverage: 'complete' }) }));
|
|
56
|
+
}
|
|
36
57
|
}
|
|
37
58
|
if (!plans.length || findings.some((item) => item.severity === 'error')) return blocked(findings);
|
|
59
|
+
const directPlans = plans.filter((plan) => !plan.useMaterialRepresentation);
|
|
60
|
+
const materialPlans = plans.filter((plan) => plan.useMaterialRepresentation).map((plan, materialIndex) => { const ordinal = workspaces.findIndex((item) => String(item.id || '') === plan.id) + 3; const prefix = `001-${ordinal}`; const slug = safeToken(plan.id); return Object.freeze({ binding: plan.binding, ordinal, workspaceId: plan.id, slug, prefix, workspacePath: `${prefix}-${slug}.workspace.md`, archivePath: `${prefix}-${slug}.workspace.zip`, payloadArtifactPath: `${prefix}-1-workspace-representation-payload.trace.md`, representationArtifactPath: `${prefix}-2-workspace-representation.trace.md`, sourceWorkspaceFile: plan.sourceWorkspaceFile, sourceArchiveFile: plan.sourceArchiveFile }); });
|
|
38
61
|
const createdAt = String(input.createdAt || '1970-01-01 00:00:00');
|
|
39
62
|
const bootstrapSource = (input.additionalTransportFiles || []).filter((file) => String(file.path || '').startsWith('tiinex.bootstrap/'));
|
|
40
63
|
const packageFile = finalizeFile({
|
|
@@ -42,10 +65,16 @@ export function manufactureRecipientRelativeWorkspacePackage(input = {}) {
|
|
|
42
65
|
kind: 'tiinex-handoff-package-artifact',
|
|
43
66
|
logicalKind: 'recipient-v2-package-v1-root',
|
|
44
67
|
mediaType: 'text/markdown',
|
|
45
|
-
content: renderHandoffPackageV1({ createdAt, packageRole: WORKSPACE_PACKAGE_ROLE, workspaces:
|
|
68
|
+
content: renderHandoffPackageV1({ createdAt, packageRole: WORKSPACE_PACKAGE_ROLE, workspaces: directPlans.map((plan) => plan.projection), materialRepresentations: materialPlans.map((plan) => Object.freeze({ materialId: `workspace-${plan.workspaceId}`, workspaceId: plan.workspaceId, representationArtifactPath: plan.representationArtifactPath, carriageState: 'verified' })), carrierLineage: input.carrierLineage || {}, carrierProfile: input.carrierProfile || null, startPath: RECIPIENT_V2_READ_PATH, bootstrapPath: bootstrapSource.length ? '001-2-bootstrap.trace.md' : '' })
|
|
46
69
|
});
|
|
47
70
|
const packageParent = recipientV2ParentAuthority(packageFile, RECIPIENT_V2_PACKAGE_V1_SCHEMA_ID, RECIPIENT_V2_PACKAGE_V1_SCHEMA_TARGET, createdAt);
|
|
48
|
-
const files = [packageFile, ...
|
|
71
|
+
const files = [packageFile, ...directPlans.flatMap((plan) => [plan.workspaceFile, plan.archiveFile])];
|
|
72
|
+
const topology = { workspaces: directPlans.map((plan) => plan.projection) };
|
|
73
|
+
if (materialPlans.length) {
|
|
74
|
+
const byPath = new Map();
|
|
75
|
+
for (const plan of materialPlans) { byPath.set(plan.sourceWorkspaceFile.path, [plan.sourceWorkspaceFile]); byPath.set(plan.sourceArchiveFile.path, [plan.sourceArchiveFile]); }
|
|
76
|
+
buildRecipientV2WorkspaceCarriers({ workspacePlans: materialPlans, byPath, findings, createdAt, rootParent: packageParent, files, topology });
|
|
77
|
+
}
|
|
49
78
|
let bootstrap = null;
|
|
50
79
|
if (bootstrapSource.length) {
|
|
51
80
|
bootstrap = buildRecipientV2BootstrapCarrier(bootstrapSource, createdAt, findings, packageParent);
|
|
@@ -56,17 +85,17 @@ export function manufactureRecipientRelativeWorkspacePackage(input = {}) {
|
|
|
56
85
|
packageRole: WORKSPACE_PACKAGE_ROLE,
|
|
57
86
|
packageRootPath: RECIPIENT_V2_PACKAGE_V1_ROOT_PATH,
|
|
58
87
|
entryArtifactPath: RECIPIENT_V2_READ_PATH,
|
|
59
|
-
artifactSurface: 'tiinex.handoff.package.v1-plus-
|
|
88
|
+
artifactSurface: 'tiinex.handoff.package.v1-plus-qualified-source-material-bindings',
|
|
60
89
|
routeAuthority: 'none', routeSelectionAuthority: 'none', siblingRouteInference: false,
|
|
61
90
|
carrierLineage: input.carrierLineage || null, pathParentProjection: true, pathAuthority: false
|
|
62
91
|
});
|
|
63
92
|
const readFile = finalizeFile({
|
|
64
93
|
path: RECIPIENT_V2_READ_PATH, kind: 'handoff-recovery-pointer', logicalKind: 'recipient-v2-package-v1-workspace-recovery-orientation', mediaType: 'text/markdown', transportFacts: readFacts,
|
|
65
|
-
content: renderRecipientV2Pointer({ createdAt, parent: packageParent, role: 'recovery-orientation', title: 'READ BEFORE PROCEEDING — Tiinex Workspace Carrier', summary: 'Qualified recovery/orientation Pointer for the pointerless package-v1 Workspace carrier.', prose: 'Read this Start artifact first and qualify the declared Tooling bootstrap. This carrier intentionally exposes no Handoff route or Continue-from Pointer; do not infer semantic Handoff state from Workspace carriage.', currentRead: [...recipientV2WorkspaceEntryCurrentRead(), { label: 'Package Artifact', value: `[Workspace Package](${RECIPIENT_V2_PACKAGE_V1_ROOT_PATH})` }, { label: 'Carrier Dimension', value: `\`${String(input.carrierLineage?.dimension || '001')}\`` }], destinations: [{ label: 'Workspace Package contract', target: RECIPIENT_V2_PACKAGE_V1_ROOT_PATH }, ...(bootstrap ? [{ label: 'Portable Tooling bootstrap', target: bootstrap.projection.artifactPath }] : []), ...
|
|
94
|
+
content: renderRecipientV2Pointer({ createdAt, parent: packageParent, role: 'recovery-orientation', title: 'READ BEFORE PROCEEDING — Tiinex Workspace Carrier', summary: 'Qualified recovery/orientation Pointer for the pointerless package-v1 Workspace carrier.', prose: 'Read this Start artifact first and qualify the declared Tooling bootstrap. This carrier intentionally exposes no Handoff route or Continue-from Pointer; do not infer semantic Handoff state from Workspace carriage.', currentRead: [...recipientV2WorkspaceEntryCurrentRead(), { label: 'Package Artifact', value: `[Workspace Package](${RECIPIENT_V2_PACKAGE_V1_ROOT_PATH})` }, { label: 'Carrier Dimension', value: `\`${String(input.carrierLineage?.dimension || '001')}\`` }], destinations: [{ label: 'Workspace Package contract', target: RECIPIENT_V2_PACKAGE_V1_ROOT_PATH }, ...(bootstrap ? [{ label: 'Portable Tooling bootstrap', target: bootstrap.projection.artifactPath }] : []), ...topology.workspaces.map((workspace) => ({ label: `Workspace ${workspace.workspaceId}`, target: workspace.workspacePath }))], facts: readFacts })
|
|
66
95
|
});
|
|
67
96
|
files.push(readFile);
|
|
68
97
|
const sortedFiles = Object.freeze([...files].sort((a, b) => String(a.path || '').localeCompare(String(b.path || ''))));
|
|
69
|
-
const bundle = deepFreeze({ status: 'ready', files: sortedFiles, handoffClosure: null, transportFormat: RECIPIENT_V2_FORMAT_ID, boundary: 'Pointerless recipient-facing Workspace carrier. Exact
|
|
98
|
+
const bundle = deepFreeze({ status: 'ready', files: sortedFiles, handoffClosure: null, transportFormat: RECIPIENT_V2_FORMAT_ID, boundary: 'Pointerless recipient-facing Workspace carrier. Exact qualified direct or generic complete/bounded Workspace source bytes retain authority; carrier placement creates no Handoff semantics.' });
|
|
70
99
|
const inspection = inspectRecipientFacingV2Topology(bundle);
|
|
71
100
|
const roundtrip = input.verifyRoundtrip === false ? null : roundTripRecipientFacingV2Topology(bundle, inspection);
|
|
72
101
|
const toolingBootstrapInspection = inspection.bootstrapInspection || inspectPortableToolingBootstrap({ files: bootstrapSource });
|
|
@@ -75,7 +104,7 @@ export function manufactureRecipientRelativeWorkspacePackage(input = {}) {
|
|
|
75
104
|
const carrierProjection = inspection.carrierProjection || workspaceProjection(plans, input.carrierLineage || {});
|
|
76
105
|
return deepFreeze({
|
|
77
106
|
schema: 'tiinex.portable.handoff-manufacturing.v2', status: ready ? 'ready' : 'blocked', executable: ready, transportExecutable: ready,
|
|
78
|
-
verification: Object.freeze({ baselineManufacture: 'ready', manufacturePath: '
|
|
107
|
+
verification: Object.freeze({ baselineManufacture: 'ready', manufacturePath: 'qualified-workspace-material-to-pointerless-package-v1', packageInspection: inspection.status, closureInspection: 'not-applicable', carrierInspection: inspection.status, selectedHandoffConformance: 'not-applicable', pointerEntrypointInspection: 'not-applicable', coldConsumerEntrypointInspection: inspection.status, companionInspection: 'not-applicable', roundtrip: roundtrip?.status || 'not-requested', toolingBootstrap: toolingBootstrapInspection.status }),
|
|
79
108
|
plan: Object.freeze({ status: ready ? 'ready' : 'blocked', requiredClosureReady: true, semanticHandoffStatus: 'not-declared', workspaceMaterializations: Object.freeze(workspaces), requirements: Object.freeze({ required: Object.freeze([]), reference: Object.freeze([]) }) }),
|
|
80
109
|
bundle, inspection, carrierProjection, roundtrip, toolingBootstrapInspection, toolingBootstrap: input.toolingBootstrap || null, carrierLineage: input.carrierLineage || carrierProjection.lineage || null, manufacturingEvidence: input.manufacturingEvidence || null,
|
|
81
110
|
findings: Object.freeze(allFindings), findingSummary: summarizePortableFindings(allFindings), operationBoundary: Object.freeze({ sourceMutation: false, remoteWrite: false, handoffSemantics: false }),
|
|
@@ -89,5 +118,5 @@ function workspaceProjection(plans, lineage) {
|
|
|
89
118
|
}
|
|
90
119
|
function blocked(findings = []) {
|
|
91
120
|
const all = findings.length ? findings : [finding('error', 'portable.workspace-carrier.manufacture.blocked', 'Pointerless Workspace carrier manufacture failed closed.')];
|
|
92
|
-
return deepFreeze({ schema: 'tiinex.portable.handoff-manufacturing.v2', status: 'blocked', executable: false, transportExecutable: false, verification: Object.freeze({ manufacturePath: '
|
|
121
|
+
return deepFreeze({ schema: 'tiinex.portable.handoff-manufacturing.v2', status: 'blocked', executable: false, transportExecutable: false, verification: Object.freeze({ manufacturePath: 'qualified-workspace-material-to-pointerless-package-v1' }), plan: Object.freeze({ status: 'blocked', workspaceMaterializations: Object.freeze([]), requirements: Object.freeze({ required: Object.freeze([]), reference: Object.freeze([]) }) }), bundle: null, inspection: null, carrierProjection: Object.freeze({ schema: 'tiinex.portable.handoff-carrier-projection.v1', status: 'blocked', mode: 'workspace', workspaces: Object.freeze([]), routes: Object.freeze([]), findings: Object.freeze(all) }), findings: Object.freeze(all), findingSummary: summarizePortableFindings(all), boundary: 'Failed closed before emitting pointerless Workspace carrier bytes.' });
|
|
93
122
|
}
|