@tiinex/core 0.13.0 → 0.15.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.
Files changed (29) hide show
  1. package/package.json +5 -5
  2. package/src/integrity/integrity.c14nV1.js +28 -0
  3. package/src/lineage/lineage.integrity.js +108 -22
  4. package/src/lineage/lineage.resolve.js +21 -14
  5. package/src/lineage/lineage.sourceScope.js +41 -12
  6. package/src/lineage/lineage.targetKeys.js +26 -7
  7. package/src/tooling/portable/adapters/cli/cli.handoff-manufacture.js +47 -10
  8. package/src/tooling/portable/adapters/node/bootstrapCarrier.manufacture.js +18 -0
  9. package/src/tooling/portable/adapters/node/workspaceCarrier.manufacture.js +13 -3
  10. package/src/tooling/portable/bootstrap/tiinex.llm.bootstrap.md +2 -2
  11. package/src/tooling/portable/handoff/bootstrapCarrier.manufacture.js +56 -0
  12. package/src/tooling/portable/handoff/contracts/tiinex.handoff.package.v1.schema.md +340 -77
  13. package/src/tooling/portable/handoff/manufacture.js +3 -1
  14. package/src/tooling/portable/handoff/recipientV2.artifactFirst.build.js +73 -32
  15. package/src/tooling/portable/handoff/recipientV2.artifactFirst.closure.js +1 -1
  16. package/src/tooling/portable/handoff/recipientV2.artifactFirst.inspect.js +9 -1
  17. package/src/tooling/portable/handoff/recipientV2.artifactFirst.materials.js +28 -6
  18. package/src/tooling/portable/handoff/recipientV2.artifactFirst.shared.js +8 -0
  19. package/src/tooling/portable/handoff/recipientV2.coldProjection.js +11 -6
  20. package/src/tooling/portable/handoff/recipientV2.entryContract.js +12 -0
  21. package/src/tooling/portable/handoff/recipientV2.humanOutput.js +48 -6
  22. package/src/tooling/portable/handoff/recipientV2.packageV1.build.js +55 -43
  23. package/src/tooling/portable/handoff/recipientV2.packageV1.contract.js +57 -31
  24. package/src/tooling/portable/handoff/recipientV2.packageV1.inspect.helpers.js +63 -10
  25. package/src/tooling/portable/handoff/recipientV2.packageV1.inspect.js +55 -16
  26. package/src/tooling/portable/handoff/recipientV2.packageV1.workspaceProjection.js +14 -1
  27. package/src/tooling/portable/handoff/recipientV2.topology.js +3 -4
  28. package/src/tooling/portable/handoff/recipientV2.topology.materials.js +14 -0
  29. 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 forbiddenWorkspacePayloads = payloadArtifacts.filter((item) => item.facts?.role === 'workspace-representation-payload');
118
- if (forbiddenWorkspacePayloads.length) findings.push(finding('error', 'portable.handoff-package-v1.workspace-payload-redundant', 'Complete package-local Workspace bindings must not carry redundant Workspace External Payload companions.', { count: forbiddenWorkspacePayloads.length }));
119
- if (generatedArtifacts.some((item) => item.schemaId === 'tiinex.workspace.representation.v1' || item.schemaId === 'tiinex.relation.v1')) findings.push(finding('error', 'portable.handoff-package-v1.workspace-representation-redundant', 'Complete package-local Workspace bindings must not carry redundant Workspace Representation/Relation companions.'));
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 workspaceMode = String(packageContract?.packageRole || '') === WORKSPACE_PACKAGE_ROLE;
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 (workspaceMode) {
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 and complete package-local Workspace bindings are reverified from exact bytes; derived inventories have no authority.'
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 materials = detached.filter((item) => workspaceRoutes.some((plan) => routeClaimsDetachedMaterial(plan.route, item)));
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 workspacePath = `${prefix}-${slug}.workspace.md`;
32
- const archivePath = `${prefix}-${slug}.workspace.zip`;
33
- const workspaceFile = exactFile(workspacePath, qualified.target.data, 'recipient-v2-package-v1-exact-workspace-artifact', 'text/markdown');
34
- const archiveFile = exactFile(archivePath, archiveData, 'recipient-v2-package-v1-complete-workspace-snapshot', 'application/zip');
35
- plans.push(Object.freeze({ id, raw, qualified, workspaceFile, archiveFile, projection: Object.freeze({ workspaceId: id, workspacePath, archivePath, sourceWorkspaceTargetInnerPath: qualified.target.path, sourceWorkspaceTargetSha256: workspaceFile.sha256, archiveSha256: archiveFile.sha256, archiveBytes: archiveFile.bytes, coverage: 'complete' }) }));
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: plans.map((plan) => plan.projection), carrierLineage: input.carrierLineage || {}, carrierProfile: input.carrierProfile || null, startPath: RECIPIENT_V2_READ_PATH, bootstrapPath: bootstrapSource.length ? '001-2-bootstrap.trace.md' : '' })
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, ...plans.flatMap((plan) => [plan.workspaceFile, plan.archiveFile])];
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-exact-complete-workspace-snapshots',
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 }] : []), ...plans.map((plan) => ({ label: `Workspace ${plan.id}`, target: plan.projection.workspacePath }))], facts: readFacts })
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 carried Workspace source bytes retain authority; carrier placement creates no Handoff semantics.' });
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: 'direct-qualified-workspace-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 }),
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: 'direct-qualified-workspace-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.' });
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
  }