@tiinex/core 0.12.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.
Files changed (54) hide show
  1. package/package.json +6 -5
  2. package/src/audit/audit.run.js +1 -1
  3. package/src/public/index.js +18 -0
  4. package/src/public/node.js +1 -0
  5. package/src/schemas/creation.contracts.js +1 -1
  6. package/src/schemas/creation.schemaReferences.js +28 -8
  7. package/src/schemas/schema.reference.js +30 -4
  8. package/src/schemas/tiinex.root.v1.schema.json +2 -1
  9. package/src/tooling/portable/adapters/cli/cli.command-input.js +5 -0
  10. package/src/tooling/portable/adapters/cli/cli.common-output.js +23 -0
  11. package/src/tooling/portable/adapters/cli/cli.handoff-manufacture.js +52 -11
  12. package/src/tooling/portable/adapters/cli/cli.help.js +15 -2
  13. package/src/tooling/portable/adapters/cli/cli.run.js +1 -1
  14. package/src/tooling/portable/adapters/cli/cli.source-frontier-comparison.js +6 -6
  15. package/src/tooling/portable/adapters/cli/cli.source-frontier-reconciliation.js +18 -0
  16. package/src/tooling/portable/adapters/node/bootstrapCarrier.manufacture.js +18 -0
  17. package/src/tooling/portable/adapters/node/handoff.manufacture.enumeration.js +27 -8
  18. package/src/tooling/portable/adapters/node/handoff.manufacture.js +17 -0
  19. package/src/tooling/portable/adapters/node/sourceFrontierComparison.js +2 -1
  20. package/src/tooling/portable/adapters/node/sourceFrontierReconciliationProof.js +23 -0
  21. package/src/tooling/portable/adapters/node/workspaceCarrier.manufacture.js +14 -3
  22. package/src/tooling/portable/audit/audit.capability.js +2 -1
  23. package/src/tooling/portable/bootstrap/tiinex.llm.bootstrap.md +2 -2
  24. package/src/tooling/portable/comparison/sourceFrontierComparison.js +54 -4
  25. package/src/tooling/portable/comparison/sourceFrontierReconciliationProof.js +569 -0
  26. package/src/tooling/portable/draft/draft.create.js +3 -0
  27. package/src/tooling/portable/draft/draft.operations.js +1 -1
  28. package/src/tooling/portable/editor/editor.assistance.js +2 -25
  29. package/src/tooling/portable/handoff/bootstrapCarrier.manufacture.js +56 -0
  30. package/src/tooling/portable/handoff/contracts/tiinex.handoff.package.v1.schema.md +340 -77
  31. package/src/tooling/portable/handoff/manufacture.js +17 -3
  32. package/src/tooling/portable/handoff/pointerEntrypoint.js +4 -1
  33. package/src/tooling/portable/handoff/recipientV2.artifactFirst.build.js +73 -32
  34. package/src/tooling/portable/handoff/recipientV2.artifactFirst.closure.js +1 -1
  35. package/src/tooling/portable/handoff/recipientV2.artifactFirst.inspect.js +9 -1
  36. package/src/tooling/portable/handoff/recipientV2.artifactFirst.materials.js +28 -6
  37. package/src/tooling/portable/handoff/recipientV2.artifactFirst.shared.js +8 -0
  38. package/src/tooling/portable/handoff/recipientV2.coldProjection.js +11 -6
  39. package/src/tooling/portable/handoff/recipientV2.entryContract.js +12 -0
  40. package/src/tooling/portable/handoff/recipientV2.humanOutput.js +48 -6
  41. package/src/tooling/portable/handoff/recipientV2.packageV1.build.js +55 -43
  42. package/src/tooling/portable/handoff/recipientV2.packageV1.contract.js +57 -31
  43. package/src/tooling/portable/handoff/recipientV2.packageV1.inspect.helpers.js +63 -10
  44. package/src/tooling/portable/handoff/recipientV2.packageV1.inspect.js +55 -16
  45. package/src/tooling/portable/handoff/recipientV2.packageV1.workspaceProjection.js +14 -1
  46. package/src/tooling/portable/handoff/recipientV2.topology.js +3 -4
  47. package/src/tooling/portable/handoff/recipientV2.topology.materials.js +14 -0
  48. package/src/tooling/portable/handoff/schemaReferencePreflight.js +26 -0
  49. package/src/tooling/portable/handoff/transportEnvelopeV1.js +5 -0
  50. package/src/tooling/portable/handoff/workspaceCarrier.manufacture.js +42 -13
  51. package/src/tooling/portable/index.js +1 -0
  52. package/src/tooling/portable/operation.catalog.js +8 -0
  53. package/src/tooling/portable/source/sourceEligibility.js +108 -0
  54. package/src/validation/validateArtifact.js +62 -6
@@ -1,10 +1,11 @@
1
1
  import { parseArtifactMarkdown } from '../artifacts/artifact.parse.js';
2
2
  import { normalizeArtifact } from '../artifacts/artifact.normalize.js';
3
3
  import { resolveSchemaModule } from '../schemas/resolver.js';
4
+ import { schemaRegistry } from '../schemas/registry.js';
4
5
  import { rootValidate, rootFallbackFinding } from '../schemas/tiinex.root.v1.validate.js';
5
6
  import { validateIntegrity } from '../integrity/integrity.validate.js';
6
7
  import { validatePortableContractInstance } from '../tooling/portable/schema/contract.validate.js';
7
- import { qualifySchemaReferenceValue, schemaReferenceAuthorityFromBinding } from '../schemas/schema.reference.js';
8
+ import { qualifySchemaReferenceValue, qualifiedExactSchemaReferenceTarget, schemaReferenceAuthorityFromBinding } from '../schemas/schema.reference.js';
8
9
  import { normalizeFindings, normalizeFinding } from './findings.js';
9
10
 
10
11
  export const ARTIFACT_VALIDATION_PIPELINE_ID = 'tiinex.artifact.validation.pipeline.v1';
@@ -18,7 +19,7 @@ export function validateArtifact(input = {}, options = {}) {
18
19
  const schemaValidationAuthority = input.schemaValidationAuthority || null;
19
20
  const machineContract = runMachineContractValidation({ markdown: markdown || parsed?.markdown || '', schemaId, resolution, validationContractOverride: input.validationContractOverride || null, schemaValidationAuthority });
20
21
  const contractFindings = normalizeFindings(machineContract.findings, { schemaId: machineContract.schemaId || schemaId, qualification: 'machine-contract' });
21
- const schemaReferenceFindings = normalizeFindings(validateDeclaredSchemaReferences(parsed, input.schemaReferenceAuthorities || null), { qualification: 'schema-reference' });
22
+ const schemaReferenceFindings = normalizeFindings(validateDeclaredSchemaReferences(parsed, input.schemaReferenceAuthorities || null, { context: input.schemaReferenceContext || 'historical' }), { qualification: 'schema-reference' });
22
23
  const integrityFindings = normalizeFindings(validateIntegrity(parsed, options.integrity), { schemaId: 'tiinex.root.v1', qualification: 'integrity' });
23
24
  const schemaAuthorityFindings = normalizeFindings(schemaValidationAuthorityFindings(schemaValidationAuthority, schemaId), { schemaId, qualification: 'schema-validation-authority' });
24
25
  const childValidation = runExactSchemaValidator({ parsed, schemaId, resolution, schemaValidationAuthority });
@@ -39,7 +40,7 @@ export function validateArtifact(input = {}, options = {}) {
39
40
  });
40
41
  }
41
42
 
42
- function validateDeclaredSchemaReferences(parsed = {}, contextualAuthorities = null) {
43
+ function validateDeclaredSchemaReferences(parsed = {}, contextualAuthorities = null, options = {}) {
43
44
  const references = [
44
45
  { role: 'Envelope Schema', value: parsed?.envelope?.envelopeSchema?.raw || '', schemaId: parsed?.envelope?.envelopeSchema?.id || '' },
45
46
  { role: 'Current Schema', value: parsed?.envelope?.current?.schema?.raw || '', schemaId: parsed?.envelope?.current?.schema?.id || '' }
@@ -59,21 +60,76 @@ function validateDeclaredSchemaReferences(parsed = {}, contextualAuthorities = n
59
60
  const contextualAuthority = contextualSchemaReferenceAuthority(contextualAuthorities, reference.role, reference.schemaId);
60
61
  const authority = contextualAuthority || registeredAuthority;
61
62
  const qualification = qualifySchemaReferenceValue(reference.value, authority);
63
+ const context = String(options?.context || 'historical').trim() === 'candidate' ? 'candidate' : 'historical';
64
+ const exactTarget = qualifiedExactSchemaReferenceTarget(authority);
65
+ if (qualification.schemaIdState === 'qualified' && qualification.observed?.form === 'plain-schema-id' && exactTarget) {
66
+ const prospective = context === 'candidate';
67
+ findings.push({
68
+ severity: prospective ? 'error' : 'warning',
69
+ code: 'schema.reference.exact-target-omitted',
70
+ message: prospective
71
+ ? `${reference.role}: qualified immutable exact schema-reference authority exists for ${reference.schemaId}; a new candidate must use Markdown Link form targeting ${exactTarget} before sealing, staging, acceptance, or manufacture.`
72
+ : `${reference.role}: a qualified immutable exact schema-reference target is currently available for ${reference.schemaId}, but this existing artifact uses only the schema id. Preserve the historical bytes; treat this as reference-quality debt rather than an in-place rewrite instruction.`,
73
+ source: 'tiinex.schema.reference.validation.v1',
74
+ state: prospective ? 'blocking-prospective-reference-omission' : 'historical-reference-debt',
75
+ params: { field: reference.role, schemaId: reference.schemaId, exactTarget, context }
76
+ });
77
+ continue;
78
+ }
62
79
  if (qualification.state === 'qualified') continue;
63
80
  if (qualification.schemaIdState !== 'qualified') {
64
- findings.push({ severity: 'error', code: 'schema.reference.identity-contradiction', message: `${reference.role}: Declared schema identifier contradicts current semantic schema identity authority. ${qualification.findings.join(' ')}`, source: 'tiinex.schema.reference.validation.v1', params: { field: reference.role } });
81
+ findings.push({ severity: 'error', code: 'schema.reference.identity-contradiction', message: `${reference.role}: Declared schema identifier contradicts current semantic schema identity authority. ${qualification.findings.join(' ')}`, source: 'tiinex.schema.reference.validation.v1', params: { field: reference.role, schemaId: reference.schemaId, context } });
65
82
  continue;
66
83
  }
67
84
  if (qualification.observed?.form === 'markdown-link' && qualification.targetState === 'unqualified') {
68
- findings.push({ severity: 'info', code: 'schema.reference.locator.unresolved', message: `${reference.role}: Declared schema representation locator is preserved but is not resolved by current exact material authority. Locator resolution is separate from semantic schema identity.`, source: 'tiinex.schema.reference.validation.v1' });
85
+ const observedTarget = String(qualification.observed?.target || '');
86
+ const targetIdentity = qualifiedRegisteredSchemaIdentitiesForTarget(observedTarget);
87
+ const contradictory = targetIdentity.length > 0 && !targetIdentity.includes(reference.schemaId);
88
+ if (contradictory) {
89
+ findings.push({
90
+ severity: 'error',
91
+ code: 'schema.reference.material-identity-contradiction',
92
+ message: `${reference.role}: the declared schema representation locator is positively qualified as ${targetIdentity.join(', ')}, not ${reference.schemaId}; resolved material identity contradictions are blocking even for preserved historical artifacts.`,
93
+ source: 'tiinex.schema.reference.validation.v1',
94
+ state: 'blocking-resolved-material-identity-contradiction',
95
+ params: { field: reference.role, schemaId: reference.schemaId, observedTarget, resolvedSchemaIds: targetIdentity, context }
96
+ });
97
+ continue;
98
+ }
99
+ const prospective = context === 'candidate';
100
+ findings.push({
101
+ severity: prospective ? 'error' : 'info',
102
+ code: prospective ? 'schema.reference.target-unqualified' : 'schema.reference.locator.unresolved',
103
+ message: prospective
104
+ ? `${reference.role}: the declared schema representation locator is not qualified for the exact governing schema material and cannot be carried into a new candidate unchanged.`
105
+ : `${reference.role}: Declared schema representation locator is preserved but is not resolved by current exact material authority. Locator resolution is separate from semantic schema identity.`,
106
+ source: 'tiinex.schema.reference.validation.v1',
107
+ state: prospective ? 'blocking-prospective-reference-contradiction' : 'historical-locator-unresolved',
108
+ params: { field: reference.role, schemaId: reference.schemaId, observedTarget, exactTarget, context }
109
+ });
69
110
  continue;
70
111
  }
71
- findings.push({ severity: 'error', code: 'schema.reference.unqualified', message: `${reference.role}: ${qualification.findings.join(' ')}`, source: 'tiinex.schema.reference.validation.v1', params: { field: reference.role } });
112
+ findings.push({ severity: 'error', code: 'schema.reference.unqualified', message: `${reference.role}: ${qualification.findings.join(' ')}`, source: 'tiinex.schema.reference.validation.v1', params: { field: reference.role, schemaId: reference.schemaId, context } });
72
113
  }
73
114
  return findings;
74
115
  }
75
116
 
76
117
 
118
+ function qualifiedRegisteredSchemaIdentitiesForTarget(target = '') {
119
+ const observedTarget = String(target || '').trim();
120
+ if (!observedTarget) return Object.freeze([]);
121
+ const schemaIds = [];
122
+ for (const module of schemaRegistry.modules || []) {
123
+ const schemaId = String(module?.id || '').trim();
124
+ if (!schemaId) continue;
125
+ const sourceQualification = typeof module?.schemaSource?.qualify === 'function' ? module.schemaSource.qualify() : null;
126
+ const authority = schemaReferenceAuthorityFromBinding(schemaId, module?.binding || {}, sourceQualification?.authority || null, sourceQualification);
127
+ if (qualifiedExactSchemaReferenceTarget(authority) === observedTarget) schemaIds.push(schemaId);
128
+ }
129
+ return Object.freeze([...new Set(schemaIds)]);
130
+ }
131
+
132
+
77
133
  function contextualSchemaReferenceAuthority(value = null, role = '', schemaId = '') {
78
134
  if (!value || typeof value !== 'object') return null;
79
135
  const key = role === 'Envelope Schema' ? 'envelope' : role === 'Current Schema' ? 'current' : role === 'Parent Schema' ? 'parent' : '';