@tiinex/app 0.1.1

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 (580) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +31 -0
  3. package/README.md +26 -0
  4. package/docs/CONSUMER-CONTRACT.md +65 -0
  5. package/package.json +94 -0
  6. package/src/acceptance/knownScenarios.case.mjs +48 -0
  7. package/src/acceptance/knownScenarios.js +89 -0
  8. package/src/acceptance/postV423CanonicalTransitionProductVerticalSlice.case.mjs +774 -0
  9. package/src/acceptance/postV437M0ETimePortalProductParityClosure.case.mjs +51 -0
  10. package/src/acceptance/postV447M0FGithubSocialPublicationProductIntegration.case.mjs +33 -0
  11. package/src/acceptance/postV450M0ProductAcceptanceHardening.case.mjs +82 -0
  12. package/src/acceptance/postV470SchemaReadingContractMaterializationIdentitySourceCoalescingAuthorityCorrection.case.mjs +236 -0
  13. package/src/acceptance/recoveryAcceptance.case.mjs +196 -0
  14. package/src/adapters/adapter.definition.schema.json +33 -0
  15. package/src/adapters/archive/archive.adapter.case.mjs +212 -0
  16. package/src/adapters/export/export.adapter.js +79 -0
  17. package/src/adapters/git-native/git-native.adapter.js +43 -0
  18. package/src/adapters/github/github.adapter.case.mjs +843 -0
  19. package/src/adapters/github/github.adapter.js +395 -0
  20. package/src/adapters/github/github.issueEmbedded.js +262 -0
  21. package/src/adapters/github/github.issueMirror.js +309 -0
  22. package/src/adapters/github/github.issueSnapshot.js +475 -0
  23. package/src/adapters/github/github.issueSurface.js +188 -0
  24. package/src/adapters/github/github.issueTransport.js +237 -0
  25. package/src/adapters/github/github.publicationRead.js +24 -0
  26. package/src/adapters/github/github.readTransport.js +18 -0
  27. package/src/adapters/github/github.repoDiscovery.js +222 -0
  28. package/src/adapters/github/github.repoMirror.js +255 -0
  29. package/src/adapters/github/github.repoProxy.js +276 -0
  30. package/src/adapters/github/github.repoSurface.js +60 -0
  31. package/src/adapters/github/github.transportDiagnostics.js +68 -0
  32. package/src/adapters/local/local.adapter.case.mjs +72 -0
  33. package/src/adapters/local/local.adapter.js +188 -0
  34. package/src/adapters/registry.js +35 -0
  35. package/src/adapters/static/static.adapter.js +84 -0
  36. package/src/app/App.js +1 -0
  37. package/src/app/TiinexApp.jsx +822 -0
  38. package/src/app/appShell.views.jsx +58 -0
  39. package/src/app/artifactAuthoringCapability.js +49 -0
  40. package/src/app/boot/bootApp.js +19 -0
  41. package/src/app/boot/environment.js +1 -0
  42. package/src/app/canonicalAuthoringValues.js +4 -0
  43. package/src/app/canonicalCreationProductController.js +57 -0
  44. package/src/app/canonicalCreationProductSettlement.case.mjs +10 -0
  45. package/src/app/canonicalCreationProductSettlement.js +11 -0
  46. package/src/app/canonicalReferenceLocalCreateCommand.js +210 -0
  47. package/src/app/canonicalReferenceTargets.js +73 -0
  48. package/src/app/canonicalTransitionLocalCreateCommand.js +217 -0
  49. package/src/app/defaultWorkspaceStart.case.mjs +39 -0
  50. package/src/app/defaultWorkspaceStart.js +65 -0
  51. package/src/app/defaultWorkspaceStartCommand.js +55 -0
  52. package/src/app/durableLocalMutationPolicy.js +21 -0
  53. package/src/app/githubMaterializationSummary.js +69 -0
  54. package/src/app/githubProgress.js +25 -0
  55. package/src/app/githubSourceInput.js +47 -0
  56. package/src/app/githubSourceMaterializationCommand.js +97 -0
  57. package/src/app/githubSourceOperation.js +226 -0
  58. package/src/app/governanceDialogData.js +27 -0
  59. package/src/app/handoffPackageImportCommand.js +182 -0
  60. package/src/app/historyAuthority.js +53 -0
  61. package/src/app/initialWorkspaceBootstrapOperation.js +105 -0
  62. package/src/app/lineageCommand.js +118 -0
  63. package/src/app/lineageSourceRecovery.js +339 -0
  64. package/src/app/localDraftMutationCommand.js +174 -0
  65. package/src/app/localMaterialCommand.js +124 -0
  66. package/src/app/nodeGraphVerse.case.mjs +111 -0
  67. package/src/app/persistenceOwnership.js +92 -0
  68. package/src/app/productStateBoundary.js +7 -0
  69. package/src/app/providers/AppProviders.js +1 -0
  70. package/src/app/providers/LocaleProvider.js +1 -0
  71. package/src/app/providers/SchemaRegistryProvider.js +1 -0
  72. package/src/app/providers/WorkspaceProvider.js +1 -0
  73. package/src/app/publicTarget.js +251 -0
  74. package/src/app/publicTargetRestoreCommand.js +149 -0
  75. package/src/app/recordUi.cache.js +35 -0
  76. package/src/app/recordUi.js +11 -0
  77. package/src/app/routes/RouteSurface.js +1 -0
  78. package/src/app/routes/routes.js +1 -0
  79. package/src/app/runtimeState.js +54 -0
  80. package/src/app/schemaCurrentDeclaration.js +69 -0
  81. package/src/app/schemaFactoryLocalCreateCommand.js +101 -0
  82. package/src/app/schemaFactoryViewerProof.case.mjs +134 -0
  83. package/src/app/schemaFactoryViewerProof.js +20 -0
  84. package/src/app/schemaNavigationCommand.js +285 -0
  85. package/src/app/schemaNavigationMaterialization.js +171 -0
  86. package/src/app/schemaNavigationRuntimeCatalog.js +25 -0
  87. package/src/app/schemaNavigationState.js +66 -0
  88. package/src/app/schemaReadingContractQualification.js +91 -0
  89. package/src/app/schemaSourceRecovery.js +373 -0
  90. package/src/app/scrollPersistence.js +30 -0
  91. package/src/app/semanticOperationHistory.js +18 -0
  92. package/src/app/shareActionCommand.js +55 -0
  93. package/src/app/shareProjection.js +190 -0
  94. package/src/app/shell/AppShell.js +1 -0
  95. package/src/app/shell/Header.js +1 -0
  96. package/src/app/shell/Navigation.js +1 -0
  97. package/src/app/shell/SurfaceSwitcher.js +1 -0
  98. package/src/app/sourceTransportRefresh.js +176 -0
  99. package/src/app/startupOwnership.js +40 -0
  100. package/src/app/startupPresentation.case.mjs +34 -0
  101. package/src/app/startupPresentation.js +33 -0
  102. package/src/app/startupPresentation.views.jsx +21 -0
  103. package/src/app/startupRenderPhase.js +9 -0
  104. package/src/app/startupWorkspaceCommand.js +62 -0
  105. package/src/app/startupWorkspaceConfigApplication.js +49 -0
  106. package/src/app/statePersistenceScheduler.js +106 -0
  107. package/src/app/tiinexAppConfigPlan.js +108 -0
  108. package/src/app/tiinexAppConfigSource.js +349 -0
  109. package/src/app/tiinexAppStartupSource.js +79 -0
  110. package/src/app/tiinexHostedWorkspaceConventions.js +572 -0
  111. package/src/app/timePortalHistoricalRead.js +114 -0
  112. package/src/app/timePortalSnapshotResolution.js +53 -0
  113. package/src/app/urlMaterialCommand.js +24 -0
  114. package/src/app/useCanonicalPlacementSelectionOptions.js +9 -0
  115. package/src/app/useCanonicalReferenceSelectionOptions.js +8 -0
  116. package/src/app/useLocalMaterialIntake.js +68 -0
  117. package/src/app/useTimePortalProductController.jsx +111 -0
  118. package/src/app/useWorkspaceEntrypointIntake.js +77 -0
  119. package/src/app/useWorkspaceSelectionProductController.jsx +21 -0
  120. package/src/app/viewState.js +35 -0
  121. package/src/app/viewport.js +21 -0
  122. package/src/app/visualDormancy.js +286 -0
  123. package/src/app/workspaceContinuityNotices.js +32 -0
  124. package/src/app/workspaceDisplayCounts.js +9 -0
  125. package/src/app/workspaceEntrypointIntakeCommand.js +87 -0
  126. package/src/app/workspaceEntrypointProductRouting.case.mjs +20 -0
  127. package/src/app/workspaceExportCommand.js +21 -0
  128. package/src/app/workspaceExportDownload.js +23 -0
  129. package/src/app/workspaceExportExecutionCommand.js +10 -0
  130. package/src/app/workspaceGithubPublication.js +237 -0
  131. package/src/app/workspaceHandoffExport.js +56 -0
  132. package/src/app/workspaceHomeTarget.js +9 -0
  133. package/src/app/workspaceMulticolumn.js +113 -0
  134. package/src/app/workspaceNavigationParity.case.mjs +110 -0
  135. package/src/app/workspaceOpenProgress.js +26 -0
  136. package/src/app/workspacePlacementOptions.js +46 -0
  137. package/src/app/workspaceRecordActions.js +158 -0
  138. package/src/app/workspaceScopedInteraction.js +68 -0
  139. package/src/app/workspaceSelectionOriginContext.js +29 -0
  140. package/src/app/workspaceSelectionSession.js +54 -0
  141. package/src/app/workspaceSourceCloseCommand.js +25 -0
  142. package/src/app/workspaceSpineProductRouting.case.mjs +22 -0
  143. package/src/app/workspaceStartupTransition.js +32 -0
  144. package/src/app/workspaceWindow.js +85 -0
  145. package/src/artifacts/artifact.fixture.js +1 -0
  146. package/src/artifacts/artifact.identity.js +6 -0
  147. package/src/artifacts/artifact.identityAggregation.js +218 -0
  148. package/src/artifacts/artifact.model.js +2 -0
  149. package/src/artifacts/artifact.parse.case.mjs +196 -0
  150. package/src/artifacts/artifact.participantIndex.js +189 -0
  151. package/src/artifacts/fixtures/evidence.trace.md +50 -0
  152. package/src/artifacts/fixtures/topic.trace.md +33 -0
  153. package/src/artifacts/fixtures/unknown-schema.trace.md +25 -0
  154. package/src/audit/audit.findings.js +1 -0
  155. package/src/audit/audit.model.js +2 -0
  156. package/src/audit/audit.plan.js +13 -0
  157. package/src/audit/audit.report.js +12 -0
  158. package/src/audit/audit.severity.js +1 -0
  159. package/src/audit/audit.traverse.js +119 -0
  160. package/src/audit/integrity/auditIntegrity.checks.js +1 -0
  161. package/src/audit/integrity/auditIntegrity.compare.js +1 -0
  162. package/src/audit/lineage/auditLineage.load.js +1 -0
  163. package/src/audit/lineage/auditLineage.plan.js +1 -0
  164. package/src/audit/lineage/auditLineage.resolve.js +12 -0
  165. package/src/audit/sources/auditSources.boundaries.js +1 -0
  166. package/src/audit/sources/auditSources.checks.js +1 -0
  167. package/src/audit/validation/auditValidation.recheck.js +1 -0
  168. package/src/audit/validation/auditValidation.run.js +1 -0
  169. package/src/build.identity.js +15 -0
  170. package/src/commands/command.vocabulary.js +14 -0
  171. package/src/conformance/conformance.fixtures.js +151 -0
  172. package/src/conformance/conformance.run.js +238 -0
  173. package/src/data/applicationDataStore.js +23 -0
  174. package/src/data/companionAccess.js +35 -0
  175. package/src/diagnostics/events.js +1 -0
  176. package/src/diagnostics/invariant.js +1 -0
  177. package/src/diagnostics/schemaBindingChecks.js +1 -0
  178. package/src/diagnostics/schemaModuleChecks.js +1 -0
  179. package/src/diagnostics/sourceBoundaryChecks.js +5 -0
  180. package/src/diagnostics/sourceTransport.report.js +190 -0
  181. package/src/discovery/discovery.controls.js +7 -0
  182. package/src/export/export.plan.js +182 -0
  183. package/src/export/handoff.plan.js +50 -0
  184. package/src/export/package.builder.case.mjs +97 -0
  185. package/src/export/package.controlTopology.case.mjs +130 -0
  186. package/src/export/package.zip.case.mjs +33 -0
  187. package/src/graph/artifactGraph.model.js +344 -0
  188. package/src/graph/artifactGraph.project.js +139 -0
  189. package/src/graph/artifactGraph.worker.js +10 -0
  190. package/src/i18n/i18n.keys.js +1 -0
  191. package/src/i18n/i18n.provider.js +1 -0
  192. package/src/i18n/i18n.resolve.js +5 -0
  193. package/src/i18n/locales/en/common.json +4 -0
  194. package/src/i18n/locales/en/schemas/evidence.json +3 -0
  195. package/src/i18n/locales/en/schemas/presentation-surface.json +3 -0
  196. package/src/i18n/locales/en/schemas/preservation.json +3 -0
  197. package/src/i18n/locales/en/schemas/root.json +3 -0
  198. package/src/i18n/locales/en/schemas/schema-module.json +3 -0
  199. package/src/i18n/locales/en/schemas/topic.json +3 -0
  200. package/src/i18n/locales/en/surfaces/audit.json +3 -0
  201. package/src/i18n/locales/en/surfaces/create.json +3 -0
  202. package/src/i18n/locales/en/surfaces/detail.json +3 -0
  203. package/src/i18n/locales/en/surfaces/display-options.json +3 -0
  204. package/src/i18n/locales/en/surfaces/edit.json +3 -0
  205. package/src/i18n/locales/en/surfaces/feed.json +3 -0
  206. package/src/i18n/locales/en/surfaces/lineage.json +3 -0
  207. package/src/i18n/locales/en/surfaces/preview.json +3 -0
  208. package/src/i18n/locales/en/surfaces/share.json +3 -0
  209. package/src/i18n/locales/en/surfaces/source-settings.json +3 -0
  210. package/src/i18n/locales/en/surfaces/tree.json +3 -0
  211. package/src/i18n/locales/sv/common.json +4 -0
  212. package/src/i18n/locales/sv/schemas/evidence.json +3 -0
  213. package/src/i18n/locales/sv/schemas/presentation-surface.json +3 -0
  214. package/src/i18n/locales/sv/schemas/preservation.json +3 -0
  215. package/src/i18n/locales/sv/schemas/root.json +3 -0
  216. package/src/i18n/locales/sv/schemas/schema-module.json +3 -0
  217. package/src/i18n/locales/sv/schemas/topic.json +3 -0
  218. package/src/i18n/locales/sv/surfaces/audit.json +3 -0
  219. package/src/i18n/locales/sv/surfaces/create.json +3 -0
  220. package/src/i18n/locales/sv/surfaces/detail.json +3 -0
  221. package/src/i18n/locales/sv/surfaces/display-options.json +3 -0
  222. package/src/i18n/locales/sv/surfaces/edit.json +3 -0
  223. package/src/i18n/locales/sv/surfaces/feed.json +3 -0
  224. package/src/i18n/locales/sv/surfaces/lineage.json +3 -0
  225. package/src/i18n/locales/sv/surfaces/preview.json +3 -0
  226. package/src/i18n/locales/sv/surfaces/share.json +3 -0
  227. package/src/i18n/locales/sv/surfaces/source-settings.json +3 -0
  228. package/src/i18n/locales/sv/surfaces/tree.json +3 -0
  229. package/src/index.js +10 -0
  230. package/src/integrity/integrity.testFixture.js +9 -0
  231. package/src/interaction/interaction.spine.js +12 -0
  232. package/src/lineage/lineage.audit.js +1 -0
  233. package/src/lineage/lineage.edges.js +1 -0
  234. package/src/main.js +319 -0
  235. package/src/main.jsx +34 -0
  236. package/src/multiverse/multiverse.model.js +10 -0
  237. package/src/parity/poc.m1ParityScenarios.js +42 -0
  238. package/src/parity/poc.parityLedger.js +261 -0
  239. package/src/publication/publication.githubSocialContract.case.mjs +247 -0
  240. package/src/publication/publication.preflight.case.mjs +64 -0
  241. package/src/react/TiinexApplication.jsx +39 -0
  242. package/src/react/VerseHost.jsx +29 -0
  243. package/src/react/applicationDataContext.jsx +30 -0
  244. package/src/react.js +2 -0
  245. package/src/readers/modes/audit.reader.js +1 -0
  246. package/src/readers/modes/detail.reader.js +1 -0
  247. package/src/readers/modes/handover.reader.js +1 -0
  248. package/src/readers/modes/mobile.reader.js +1 -0
  249. package/src/readers/modes/print.reader.js +1 -0
  250. package/src/readers/modes/scan.reader.js +1 -0
  251. package/src/readers/reader.model.js +1 -0
  252. package/src/readers/reader.resolve.js +2 -0
  253. package/src/reingest/reingest.plan.case.mjs +65 -0
  254. package/src/runtime.js +54 -0
  255. package/src/schemas/README.md +99 -0
  256. package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.md +614 -0
  257. package/src/schemas/coordination/project/tiinex.project.v1.schema.md +311 -0
  258. package/src/schemas/core/decision/tiinex.decision.v1.schema.md +227 -0
  259. package/src/schemas/core/evidence/tiinex.evidence.v1.schema.md +318 -0
  260. package/src/schemas/core/feedback/tiinex.feedback.v1.schema.md +243 -0
  261. package/src/schemas/core/interpretation/.transitions/evidence-to-interpretation-transition-definition.trace.md +102 -0
  262. package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.md +308 -0
  263. package/src/schemas/core/preservation/tiinex.preservation.v1.schema.md +312 -0
  264. package/src/schemas/core/relation/.generation/reference-relation-generation-authority.trace.md +185 -0
  265. package/src/schemas/core/relation/.transitions/topic-references-task-transition-definition.trace.md +119 -0
  266. package/src/schemas/core/relation/tiinex.relation.v1.schema.md +240 -0
  267. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.md +550 -0
  268. package/src/schemas/core/signal/tiinex.signal.v1.schema.md +239 -0
  269. package/src/schemas/core/task/.transitions/create-task-transition-definition.trace.md +93 -0
  270. package/src/schemas/core/task/.transitions/topic-to-task-transition-definition.trace.md +102 -0
  271. package/src/schemas/core/task/task-semantic-package.trace.md +53 -0
  272. package/src/schemas/core/task/tiinex.task.v1-transitions.trace.md +33 -0
  273. package/src/schemas/core/task/tiinex.task.v1.authoring.js +65 -0
  274. package/src/schemas/core/task/tiinex.task.v1.schema.md +229 -0
  275. package/src/schemas/core/topic/.transitions/create-topic-transition-definition.trace.md +93 -0
  276. package/src/schemas/core/topic/tiinex.topic.v1-transitions.trace.md +33 -0
  277. package/src/schemas/core/topic/tiinex.topic.v1.schema.md +197 -0
  278. package/src/schemas/core/topic/topic-semantic-package.trace.md +53 -0
  279. package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.md +240 -0
  280. package/src/schemas/discovery/tiinex.discovery.v1.schema.md +294 -0
  281. package/src/schemas/manifest.json +367 -0
  282. package/src/schemas/origins.js +46 -0
  283. package/src/schemas/party/organization/tiinex.party.organization.v1.schema.md +290 -0
  284. package/src/schemas/party/role/tiinex.party.role.v1.schema.md +298 -0
  285. package/src/schemas/party/tiinex.party.v1.schema.js +14 -0
  286. package/src/schemas/party/tiinex.party.v1.schema.json +23 -0
  287. package/src/schemas/party/tiinex.party.v1.schema.md +311 -0
  288. package/src/schemas/party/tiinex.party.v1.schema.runtime.json +2033 -0
  289. package/src/schemas/party/tiinex.party.v1.schema.source.js +9 -0
  290. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.md +476 -0
  291. package/src/schemas/reduction/tiinex.reduction.v1.schema.md +248 -0
  292. package/src/schemas/schema/module/tiinex.schema.module.v1.schema.md +465 -0
  293. package/src/schemas/schema.companionContract.case.mjs +259 -0
  294. package/src/schemas/schema.factory.case.mjs +256 -0
  295. package/src/schemas/schema.factory.viewerProjection.js +183 -0
  296. package/src/schemas/schemaMarkdownCatalog.js +19 -0
  297. package/src/schemas/tiinex.root.v1.schema.md +865 -0
  298. package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.md +309 -0
  299. package/src/schemas/validation/method/tiinex.validation.method.v1.schema.md +280 -0
  300. package/src/schemas/validation/report/tiinex.validation.report.v1.schema.md +300 -0
  301. package/src/schemas/workspace/tiinex.workspace.v1.schema.md +486 -0
  302. package/src/schemas/workspace/workspace.add.views.jsx +327 -0
  303. package/src/schemas/workspace/workspace.audit.views.jsx +160 -0
  304. package/src/schemas/workspace/workspace.auditBadge.views.jsx +98 -0
  305. package/src/schemas/workspace/workspace.canonicalReferenceDialog.views.jsx +63 -0
  306. package/src/schemas/workspace/workspace.canonicalTaskDialog.views.jsx +169 -0
  307. package/src/schemas/workspace/workspace.cardActions.js +9 -0
  308. package/src/schemas/workspace/workspace.cards.views.jsx +146 -0
  309. package/src/schemas/workspace/workspace.chrome.views.jsx +299 -0
  310. package/src/schemas/workspace/workspace.continuationDialog.views.jsx +80 -0
  311. package/src/schemas/workspace/workspace.discovery.views.jsx +63 -0
  312. package/src/schemas/workspace/workspace.discoveryRenderWindow.js +56 -0
  313. package/src/schemas/workspace/workspace.displayOptions.views.jsx +114 -0
  314. package/src/schemas/workspace/workspace.entrypointChoice.views.jsx +30 -0
  315. package/src/schemas/workspace/workspace.exportDialog.controller.jsx +40 -0
  316. package/src/schemas/workspace/workspace.exportDialog.views.jsx +142 -0
  317. package/src/schemas/workspace/workspace.governance.views.jsx +45 -0
  318. package/src/schemas/workspace/workspace.graph.views.jsx +134 -0
  319. package/src/schemas/workspace/workspace.lineage.views.jsx +307 -0
  320. package/src/schemas/workspace/workspace.read.views.jsx +105 -0
  321. package/src/schemas/workspace/workspace.recordActionButton.views.jsx +35 -0
  322. package/src/schemas/workspace/workspace.recordDialogs.views.jsx +257 -0
  323. package/src/schemas/workspace/workspace.selection.views.jsx +14 -0
  324. package/src/schemas/workspace/workspace.sourceReceipt.views.jsx +40 -0
  325. package/src/schemas/workspace/workspace.timePortal.views.jsx +56 -0
  326. package/src/schemas/workspace/workspace.tree.views.jsx +107 -0
  327. package/src/schemas/workspace/workspace.viewFormatting.js +172 -0
  328. package/src/schemas/workspace/workspace.views.jsx +210 -0
  329. package/src/source-settings/sourceSettings.model.js +7 -0
  330. package/src/sources/draft/draft.source.js +1 -0
  331. package/src/sources/github/github.loader.js +204 -0
  332. package/src/sources/github/github.permalink.js +1 -0
  333. package/src/sources/github/github.source.js +1 -0
  334. package/src/sources/github/github.transport.case.mjs +237 -0
  335. package/src/sources/github/github.transport.js +472 -0
  336. package/src/sources/local/local.source.js +1 -0
  337. package/src/sources/source.assetReferences.js +109 -0
  338. package/src/sources/source.boundaries.js +24 -0
  339. package/src/sources/source.identity.js +56 -0
  340. package/src/sources/source.model.case.mjs +26 -0
  341. package/src/sources/source.model.js +56 -0
  342. package/src/sources/source.presenter.js +66 -0
  343. package/src/sources/source.resolve.js +11 -0
  344. package/src/sources/static/static.source.js +1 -0
  345. package/src/sources/transport.policy.case.mjs +39 -0
  346. package/src/sources/transport.policy.js +81 -0
  347. package/src/storage/storage.policy.js +79 -0
  348. package/src/styles/app.css +8699 -0
  349. package/src/styles/responsive.css +10 -0
  350. package/src/styles/theme.css +4 -0
  351. package/src/styles/tokens.css +30 -0
  352. package/src/surfaces/audit/AuditSurface.js +1 -0
  353. package/src/surfaces/audit/audit.model.js +1 -0
  354. package/src/surfaces/audit/audit.render.js +1 -0
  355. package/src/surfaces/contracts.js +45 -0
  356. package/src/surfaces/create/CreateSurface.js +1 -0
  357. package/src/surfaces/create/create.model.js +1 -0
  358. package/src/surfaces/create/create.render.js +1 -0
  359. package/src/surfaces/detail/DetailSurface.js +1 -0
  360. package/src/surfaces/detail/detail.model.js +1 -0
  361. package/src/surfaces/detail/detail.render.js +1 -0
  362. package/src/surfaces/display-options/DisplayOptionsSurface.js +1 -0
  363. package/src/surfaces/display-options/displayOptions.model.js +1 -0
  364. package/src/surfaces/display-options/displayOptions.render.js +1 -0
  365. package/src/surfaces/edit/EditSurface.js +1 -0
  366. package/src/surfaces/edit/edit.model.js +1 -0
  367. package/src/surfaces/edit/edit.render.js +1 -0
  368. package/src/surfaces/feed/FeedSurface.js +1 -0
  369. package/src/surfaces/feed/feed.model.js +1 -0
  370. package/src/surfaces/feed/feed.render.js +1 -0
  371. package/src/surfaces/lineage/LineageSurface.js +1 -0
  372. package/src/surfaces/lineage/lineage.model.js +1 -0
  373. package/src/surfaces/lineage/lineage.render.js +1 -0
  374. package/src/surfaces/preview/PreviewSurface.js +1 -0
  375. package/src/surfaces/preview/preview.model.js +1 -0
  376. package/src/surfaces/preview/preview.render.js +1 -0
  377. package/src/surfaces/registry.js +58 -0
  378. package/src/surfaces/share/ShareSurface.js +1 -0
  379. package/src/surfaces/share/share.model.js +1 -0
  380. package/src/surfaces/share/share.render.js +1 -0
  381. package/src/surfaces/source-settings/SourceSettingsSurface.js +1 -0
  382. package/src/surfaces/source-settings/sourceSettings.model.js +1 -0
  383. package/src/surfaces/source-settings/sourceSettings.render.js +1 -0
  384. package/src/surfaces/surfaceContext.js +1 -0
  385. package/src/surfaces/tree/TreeSurface.js +1 -0
  386. package/src/surfaces/tree/tree.model.js +1 -0
  387. package/src/surfaces/tree/tree.render.js +1 -0
  388. package/src/tooling/portable/adapters/cli/cli.common-output.case.mjs +153 -0
  389. package/src/tooling/portable/adapters/cli/cli.handoff-sibling-allocation.case.mjs +52 -0
  390. package/src/tooling/portable/adapters/cli/cli.run.case.mjs +372 -0
  391. package/src/tooling/portable/adapters/cli/cli.summaryProjection.case.mjs +46 -0
  392. package/src/tooling/portable/audit/audit.capability.case.mjs +45 -0
  393. package/src/tooling/portable/fixtures/legacy-artifacts/collaboration/dogfood/001-tiinex-development-dogfood-collaboration-model.trace.fixture.txt +37 -0
  394. package/src/tooling/portable/fixtures/legacy-artifacts/handoff/tooling/001-v480-tooling-workflow-schema-enablement-handoff.trace.fixture.txt +108 -0
  395. package/src/tooling/portable/fixtures/legacy-artifacts/handoff/tooling/002-v481-tooling-recipient-relative-handoff-material-closure-planner-foundation-handoff.trace.fixture.txt +130 -0
  396. package/src/tooling/portable/fixtures/legacy-artifacts/loom/role/001-loom-role.trace.fixture.txt +61 -0
  397. package/src/tooling/portable/fixtures/legacy-artifacts/sigma/role/001-1-sigma-role.trace.fixture.txt +61 -0
  398. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-1-1-1-1-1-site-tooling-v474-loaded-parent-identity-evidence-closure-result.trace.fixture.txt +48 -0
  399. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-1-1-1-1-site-tooling-v474-loaded-parent-identity-evidence-closure.trace.fixture.txt +48 -0
  400. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-1-1-1-site-tooling-v473-portable-parent-authority-coherence-metadata-fidelity-closure-result.trace.fixture.txt +48 -0
  401. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-1-1-site-tooling-v473-portable-parent-authority-coherence-metadata-fidelity-closure.trace.fixture.txt +48 -0
  402. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-1-site-tooling-v472-portable-exact-authoring-fidelity-closure-result.trace.fixture.txt +48 -0
  403. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-site-tooling-v472-portable-exact-authoring-fidelity-closure.trace.fixture.txt +48 -0
  404. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-site-tooling-v471-portable-lineage-authoring-closure-result.trace.fixture.txt +48 -0
  405. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-site-tooling-v471-portable-lineage-authoring-closure.trace.fixture.txt +39 -0
  406. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/002-1-v475-canonical-artifact-envelope-reference-integrity-validation.trace.fixture.txt +43 -0
  407. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/003-1-v476-canonical-authority-binding-integrity-method-lineage-alloca.trace.fixture.txt +42 -0
  408. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/027-handoff-package-workspace-archive-and-control-plane-minimality-audit.trace.fixture.txt +56 -0
  409. package/src/tooling/portable/fixtures/legacyArtifactFixtures.mjs +34 -0
  410. package/src/tooling/portable/grounding/grounding.capsule.case.mjs +65 -0
  411. package/src/tooling/portable/grounding/grounding.readiness.case.mjs +543 -0
  412. package/src/tooling/portable/grounding/grounding.semanticIntegration.case.mjs +131 -0
  413. package/src/tooling/portable/handoff/boundedWorkspaceRepresentation.case.mjs +103 -0
  414. package/src/tooling/portable/handoff/carrierLineage.fixedWidth.case.mjs +97 -0
  415. package/src/tooling/portable/handoff/coldStartQualification.case.mjs +293 -0
  416. package/src/tooling/portable/handoff/fixtures/027-invalid-audit-result.fixture.txt +192 -0
  417. package/src/tooling/portable/handoff/fixtures/027-invalid-return-handoff.fixture.txt +92 -0
  418. package/src/tooling/portable/handoff/fixtures/cold-start-qualification.v1.examples.json +60 -0
  419. package/src/tooling/portable/handoff/handoff.manufacture.case.mjs +293 -0
  420. package/src/tooling/portable/handoff/materialClosure.case.mjs +727 -0
  421. package/src/tooling/portable/handoff/multiRootManufacture.case.mjs +615 -0
  422. package/src/tooling/portable/handoff/operatorBridgeCore.case.mjs +205 -0
  423. package/src/tooling/portable/handoff/workspaceLandingPlan.case.mjs +143 -0
  424. package/src/tooling/portable/input/node.input.case.mjs +293 -0
  425. package/src/tooling/portable/lifecycle/lifecycle.readiness.case.mjs +179 -0
  426. package/src/tooling/portable/lineage/fixtures/lineage.integrity.repair-projection.v1.examples.json +605 -0
  427. package/src/tooling/portable/lineage/lineage.integrity.shared-capability.case.mjs +37 -0
  428. package/src/tooling/portable/lineage/publicationProviderReceipt.fixture.mjs +50 -0
  429. package/src/tooling/portable/package/fixtures/reference-relation-generation-authority.trace.md +84 -0
  430. package/src/tooling/portable/package/fixtures/tiinex.root.v1.package-authority.contract-fixture.md +64 -0
  431. package/src/tooling/portable/package/fixtures/tiinex.schema.generation.v1.generation-binding.contract-fixture.md +140 -0
  432. package/src/tooling/portable/package/fixtures/tiinex.schema.transition.companion.v1.contract-fixture.md +73 -0
  433. package/src/tooling/portable/package/fixtures/tiinex.semantic.package.v1.contract-fixture.md +147 -0
  434. package/src/tooling/portable/package/fixtures/tiinex.transition.definition.v1.package-contract-fixture.md +77 -0
  435. package/src/tooling/portable/providers/schema.providers.genericity.case.mjs +31 -0
  436. package/src/tooling/portable/reduction/reduction.preflight.case.mjs +298 -0
  437. package/src/tooling/portable/schema/fixtures/evidence-preservation-body.inheritance-record-fixture.md +65 -0
  438. package/src/tooling/portable/schema/fixtures/tiinex.portal.time.v1.contract-fixture.md +294 -0
  439. package/src/tooling/portable/schema/fixtures/tiinex.root.v1.contract-fixture.md +584 -0
  440. package/src/tooling/portable/schema/fixtures/tiinex.root.v1.machine-shape.contract-fixture.md +44 -0
  441. package/src/tooling/portable/schema/fixtures/tiinex.root.v1.ordinary-target.contract-fixture.md +630 -0
  442. package/src/tooling/portable/schema/fixtures/tiinex.schema.contract.v1.repeated-record.contract-fixture.md +69 -0
  443. package/src/tooling/portable/schema/fixtures/tiinex.schema.generation.v1.repeated-record.contract-fixture.md +98 -0
  444. package/src/tooling/portable/schema/fixtures/tiinex.schema.inheritance.v1.repeated-record.contract-fixture.md +58 -0
  445. package/src/tooling/portable/schema/fixtures/tiinex.task.v1.contract-fixture.md +165 -0
  446. package/src/tooling/portable/schema/fixtures/tiinex.transition.definition.v1.contract-fixture.md +744 -0
  447. package/src/tooling/portable/schema/fixtures/tiinex.transition.definition.v1.field-domain.contract-fixture.md +319 -0
  448. package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.relation.v1.schema.md +240 -0
  449. package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.contract.v1.schema.md +391 -0
  450. package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.generation.v1.schema.md +379 -0
  451. package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.transition.companion.v1.schema.md +265 -0
  452. package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.semantic.package.v1.schema.md +402 -0
  453. package/src/transitions/canonical-schema-cache/52ecdea0a75893882ce282214d155f70e1309c2a/tiinex.topic.v1.schema.md +197 -0
  454. package/src/transitions/canonical-schema-cache/d69b8ff55a56b8cb9282b8684db6a938a4435b94/tiinex.root.v1.schema.md +797 -0
  455. package/src/transitions/canonical-schema-cache/d69b8ff55a56b8cb9282b8684db6a938a4435b94/tiinex.transition.definition.v1.schema.md +1062 -0
  456. package/src/transitions/canonicalTransition.packageContracts.js +22 -0
  457. package/src/transitions/canonicalTransition.productDefaults.js +105 -0
  458. package/src/transitions/canonicalTransition.schemaCache.case.mjs +45 -0
  459. package/src/transitions/canonicalTransition.schemaCache.js +81 -0
  460. package/src/transitions/canonicalTransition.semanticPackage.js +146 -0
  461. package/src/transitions/record.transitions.case.mjs +88 -0
  462. package/src/transitions/transition.authorityRepresentation.js +55 -0
  463. package/src/transitions/transition.availabilityPlanner.js +376 -0
  464. package/src/transitions/transition.availabilitySemantics.js +150 -0
  465. package/src/transitions/transition.definitionReadProjection.js +107 -0
  466. package/src/transitions/transition.definitionRegistry.js +355 -0
  467. package/src/transitions/transition.definitionRegistryAggregation.js +21 -0
  468. package/src/transitions/transition.definitions.js +46 -0
  469. package/src/transitions/transition.explicitGenerationPlanner.js +58 -0
  470. package/src/transitions/transition.generationInputPlanner.js +19 -0
  471. package/src/transitions/transition.interpretationMaterializer.js +2 -0
  472. package/src/transitions/transition.invocationBindingPacket.js +52 -0
  473. package/src/transitions/transition.invocationBindingPlanner.js +467 -0
  474. package/src/transitions/transition.legacyShorthand.js +133 -0
  475. package/src/transitions/transition.localArtifactMaterializers.js +16 -0
  476. package/src/transitions/transition.localCreateCapability.js +111 -0
  477. package/src/transitions/transition.outputMaterializationPlanner.js +336 -0
  478. package/src/transitions/transition.parentReference.js +90 -0
  479. package/src/transitions/transition.presentation.js +43 -0
  480. package/src/transitions/transition.productPreparation.js +377 -0
  481. package/src/transitions/transition.productPresentation.browser.js +28 -0
  482. package/src/transitions/transition.productPresentation.js +55 -0
  483. package/src/transitions/transition.referenceCreateCapability.js +119 -0
  484. package/src/transitions/transition.referenceTarget.js +50 -0
  485. package/src/transitions/transition.relationMaterializer.js +2 -0
  486. package/src/transitions/transition.resultSemantics.js +453 -0
  487. package/src/transitions/transition.taskMaterializer.js +2 -0
  488. package/src/transitions/transition.topicMaterializer.js +2 -0
  489. package/src/transitions/transition.validate.case.mjs +58 -0
  490. package/src/ui/cards/ArtifactCard.js +1 -0
  491. package/src/ui/cards/SchemaCard.js +1 -0
  492. package/src/ui/cards/SourceCard.js +1 -0
  493. package/src/ui/dialog.presenter.js +24 -0
  494. package/src/ui/feedback/DegradedNotice.js +1 -0
  495. package/src/ui/feedback/EmptyState.js +1 -0
  496. package/src/ui/feedback/ValidationNotice.js +1 -0
  497. package/src/ui/forms/FormRenderer.js +1 -0
  498. package/src/ui/forms/fields/MarkdownField.js +1 -0
  499. package/src/ui/forms/fields/SelectField.js +1 -0
  500. package/src/ui/forms/fields/SourcePickerField.js +1 -0
  501. package/src/ui/forms/fields/TextField.js +1 -0
  502. package/src/ui/icon.paths.js +37 -0
  503. package/src/ui/layout/Panel.js +1 -0
  504. package/src/ui/layout/ResponsiveFrame.js +1 -0
  505. package/src/ui/layout/SplitView.js +1 -0
  506. package/src/ui/layout/Stack.js +1 -0
  507. package/src/ui/panels/DetailPanel.js +1 -0
  508. package/src/ui/panels/LineagePanel.js +1 -0
  509. package/src/ui/panels/SourcePanel.js +1 -0
  510. package/src/ui/primitives/Badge.js +1 -0
  511. package/src/ui/primitives/Badge.jsx +5 -0
  512. package/src/ui/primitives/Button.js +1 -0
  513. package/src/ui/primitives/Button.jsx +12 -0
  514. package/src/ui/primitives/Card.js +1 -0
  515. package/src/ui/primitives/Field.js +1 -0
  516. package/src/ui/primitives/Field.jsx +21 -0
  517. package/src/ui/primitives/Icon.jsx +90 -0
  518. package/src/ui/primitives/Modal.jsx +27 -0
  519. package/src/validation/i18n.js +37 -0
  520. package/src/validation/validateArtifact.case.mjs +41 -0
  521. package/src/verses/column/ColumnVerse.js +1 -0
  522. package/src/verses/column/column.model.js +6 -0
  523. package/src/verses/column/column.project.js +7 -0
  524. package/src/verses/context.js +26 -0
  525. package/src/verses/contracts.js +1 -0
  526. package/src/verses/hostRegistry.js +47 -0
  527. package/src/verses/registry.js +22 -0
  528. package/src/verses/universe.model.js +8 -0
  529. package/src/verses/universe.presenter.js +8 -0
  530. package/src/verses/universe.project.js +12 -0
  531. package/src/viewer.js +34 -0
  532. package/src/workspace.model.js +5 -0
  533. package/src/workspaces/workspace.actions.js +1 -0
  534. package/src/workspaces/workspace.artifactActions.js +56 -0
  535. package/src/workspaces/workspace.auditView.js +153 -0
  536. package/src/workspaces/workspace.candidates.js +149 -0
  537. package/src/workspaces/workspace.config.js +153 -0
  538. package/src/workspaces/workspace.configuredSource.js +68 -0
  539. package/src/workspaces/workspace.discoveryProgress.js +34 -0
  540. package/src/workspaces/workspace.discoveryView.js +386 -0
  541. package/src/workspaces/workspace.displayFilters.js +63 -0
  542. package/src/workspaces/workspace.displayOptions.js +58 -0
  543. package/src/workspaces/workspace.emptyStateCopy.js +24 -0
  544. package/src/workspaces/workspace.entrypointLifecycle.js +131 -0
  545. package/src/workspaces/workspace.entrypointViewIntent.js +83 -0
  546. package/src/workspaces/workspace.entrypoints.js +157 -0
  547. package/src/workspaces/workspace.feedSort.js +152 -0
  548. package/src/workspaces/workspace.import.js +212 -0
  549. package/src/workspaces/workspace.importConflicts.js +200 -0
  550. package/src/workspaces/workspace.importLifecycle.case.mjs +103 -0
  551. package/src/workspaces/workspace.lifecycle.case.mjs +353 -0
  552. package/src/workspaces/workspace.lifecycle.js +357 -0
  553. package/src/workspaces/workspace.lineageView.js +244 -0
  554. package/src/workspaces/workspace.localSourceLifecycle.js +91 -0
  555. package/src/workspaces/workspace.materialLedger.js +110 -0
  556. package/src/workspaces/workspace.materialReconciliation.case.mjs +164 -0
  557. package/src/workspaces/workspace.materialReconciliation.js +390 -0
  558. package/src/workspaces/workspace.memberIdentity.js +140 -0
  559. package/src/workspaces/workspace.model.js +2 -0
  560. package/src/workspaces/workspace.navigation.js +20 -0
  561. package/src/workspaces/workspace.openSemantics.js +33 -0
  562. package/src/workspaces/workspace.pathTree.js +132 -0
  563. package/src/workspaces/workspace.persistence.case.mjs +271 -0
  564. package/src/workspaces/workspace.persistence.js +469 -0
  565. package/src/workspaces/workspace.persistenceCache.js +41 -0
  566. package/src/workspaces/workspace.persistenceClear.js +45 -0
  567. package/src/workspaces/workspace.persistencePresentation.js +93 -0
  568. package/src/workspaces/workspace.persistenceRecovery.js +147 -0
  569. package/src/workspaces/workspace.persistenceRouteCache.js +82 -0
  570. package/src/workspaces/workspace.publicationReceipts.case.mjs +36 -0
  571. package/src/workspaces/workspace.publicationReceipts.js +56 -0
  572. package/src/workspaces/workspace.recoverabilityView.js +264 -0
  573. package/src/workspaces/workspace.route.js +432 -0
  574. package/src/workspaces/workspace.runtimeCanonical.js +18 -0
  575. package/src/workspaces/workspace.sourceMaterial.js +71 -0
  576. package/src/workspaces/workspace.sourceRecordPath.js +5 -0
  577. package/src/workspaces/workspace.sourceRecords.js +75 -0
  578. package/src/workspaces/workspace.store.js +3 -0
  579. package/src/workspaces/workspace.summary.js +116 -0
  580. package/src/workspaces/workspace.timePortal.js +137 -0
@@ -0,0 +1,259 @@
1
+ import assert from 'node:assert/strict';
2
+ import { existsSync, readdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { schemaRegistry } from '@tiinex/core/schemas/registry.js';
6
+ import { schemaReadPresentation } from '@tiinex/core/schemas/companion.js';
7
+ import { resolveFindingMessage } from '../validation/i18n.js';
8
+ import { normalizeFinding } from '@tiinex/core/validation/findings.js';
9
+
10
+ const root = fileURLToPath(new URL('../..', import.meta.url)).replace(/[\\/]$/, '');
11
+ const schemaRoot = join(root, 'src/schemas');
12
+
13
+ function walk(dir) {
14
+ const out = [];
15
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
16
+ const full = join(dir, entry.name);
17
+ if (entry.isDirectory()) out.push(...walk(full));
18
+ else out.push(full.replace(root + '/', '').replaceAll('\\', '/'));
19
+ }
20
+ return out;
21
+ }
22
+
23
+ const files = walk(schemaRoot);
24
+ for (const module of schemaRegistry.modules) {
25
+ assert(files.some((file) => file.endsWith(`/${module.id}.schema.md`) || file === `src/schemas/${module.id}.schema.md`), `${module.id} must use versioned schema snapshot naming`);
26
+ assert(files.some((file) => file.endsWith(`/${module.id}.schema.json`) || file === `src/schemas/${module.id}.schema.json`), `${module.id} must use versioned binding naming`);
27
+ assert(files.some((file) => file.endsWith(`/${module.id}.schema.js`) || file === `src/schemas/${module.id}.schema.js`), `${module.id} must use versioned module naming`);
28
+ if (module.findings?.codes) {
29
+ for (const [code, definition] of Object.entries(module.findings.codes)) {
30
+ assert.equal(definition.messageKey || code, code, `${module.id} finding ${code} should use the finding code as message key unless explicitly justified`);
31
+ const rendered = resolveFindingMessage(normalizeFinding({ code, source: module.id }, { schemaId: module.id }), { locale: 'en', schemaId: module.id });
32
+ assert.notEqual(rendered, code, `${module.id} finding ${code} must render through i18n or have an explicit fallback`);
33
+ }
34
+ }
35
+ }
36
+
37
+ const inertSurfaceOrFormFiles = files.filter((file) => /\.(feed|tree|lineage|detail|preview|share|graph)\.presenter\.js$|\.(create|edit|quick|full)\.form\.js$/.test(file));
38
+ assert.deepEqual(inertSurfaceOrFormFiles, [], 'inactive surface presenter/form scaffold files should not ship before a real divergent owner exists');
39
+
40
+ const sv = resolveFindingMessage(normalizeFinding({ code: 'topic.body.thin', source: 'tiinex.topic.v1' }, { schemaId: 'tiinex.topic.v1' }), { locale: 'sv', schemaId: 'tiinex.topic.v1' });
41
+ assert.equal(sv, 'Topic body is thin; reader may not understand the active topic thread.', 'missing locale-specific key should fall back explicitly to English pack');
42
+
43
+
44
+ const foundationCriticalReadCases = Object.freeze([
45
+ Object.freeze({
46
+ schemaId: 'tiinex.party.role.v1',
47
+ expectedSections: Object.freeze(['ROLE IDENTITY', 'ROLE BOUNDARY', 'AUTHORITY AND RESPONSIBILITY BOUNDARY', 'HOLDER RELATIONSHIP', 'INTERPRETATION LIMITS']),
48
+ meaningful: 'Role Label: Loom',
49
+ markdown: `# Continuity Context
50
+
51
+ - Current
52
+ - Current Schema: [tiinex.party.role.v1](https://github.com/Tiinex/docs/blob/3988951208eb9a8926e84ab42625d4b42fa00c2d/.topics/.schemas/party/role/tiinex.party.role.v1.schema.md)
53
+ - Created At: 2026-08-30 00:00:00
54
+ - Summary: Loom role
55
+
56
+ ---
57
+
58
+ # Loom Role
59
+
60
+ ## Role Identity
61
+
62
+ - Role Label: Loom
63
+ - Role Kind: portable Tooling role
64
+
65
+ ## Role Boundary
66
+
67
+ - In Scope: bounded Tooling work
68
+ - Out Of Scope: canonical schema meaning
69
+
70
+ ## Authority And Responsibility Boundary
71
+
72
+ - May Do: implement bounded shared mechanics
73
+ - Does Not Authorize: unrelated authority
74
+
75
+ ## Holder Relationship
76
+
77
+ - Holder State: assignable only by explicit handoff
78
+
79
+ ## Interpretation Limits
80
+
81
+ - Does Not Prove: current human holder
82
+ - Must Not Be Treated As: personal identity
83
+ `
84
+ }),
85
+ Object.freeze({
86
+ schemaId: 'tiinex.project.v1',
87
+ expectedSections: Object.freeze(['PROJECT IDENTITY', 'PROJECT PURPOSE AND SCOPE', 'PARTIES AND RESOURCES', 'COORDINATION STATE', 'MILESTONES AND OUTCOMES', 'INTERPRETATION LIMITS']),
88
+ meaningful: 'Description: Tiinex Viewer',
89
+ markdown: `# Continuity Context
90
+
91
+ - Current
92
+ - Current Schema: [tiinex.project.v1](https://github.com/Tiinex/docs/blob/3988951208eb9a8926e84ab42625d4b42fa00c2d/.topics/.schemas/coordination/project/tiinex.project.v1.schema.md)
93
+ - Created At: 2026-08-26 00:00:00
94
+ - Summary: Tiinex Viewer
95
+
96
+ ---
97
+
98
+ # Tiinex Viewer
99
+
100
+ ## Project Identity
101
+
102
+ - Description: Tiinex Viewer
103
+ - Boundary: human-readable Site product
104
+
105
+ ## Project Purpose And Scope
106
+
107
+ - Description: make Tiinex artifacts understandable
108
+ - Boundary: presentation without semantic rewriting
109
+
110
+ ## Parties And Resources
111
+
112
+ - Relevant Parties: Anchor; Loom; Sigma
113
+ - Relevant Resources: Site source and canonical Docs schemas
114
+
115
+ ## Coordination State
116
+
117
+ - Description: active Foundation work
118
+ - Boundary: current project state only
119
+
120
+ ## Milestones And Outcomes
121
+
122
+ - Description: schema-owned reading coverage
123
+ - Boundary: deterministic product evidence
124
+
125
+ ## Interpretation Limits
126
+
127
+ - Does Not Prove: release readiness
128
+ - Must Not Be Treated As: publication authority
129
+ `
130
+ }),
131
+ Object.freeze({
132
+ schemaId: 'tiinex.party.organization.v1',
133
+ expectedSections: Object.freeze(['ORGANIZATION IDENTITY', 'ORGANIZATION BOUNDARY', 'UNIT OR PARENT RELATIONSHIP', 'REPRESENTATION BOUNDARY', 'INTERPRETATION LIMITS']),
134
+ meaningful: 'Organization Label: Tiinex',
135
+ markdown: `# Continuity Context
136
+
137
+ - Current
138
+ - Current Schema: [tiinex.party.organization.v1](https://github.com/Tiinex/docs/blob/911d4cf990e35ce25a56e8f376d296e327c48260/.topics/.schemas/party/organization/tiinex.party.organization.v1.schema.md)
139
+ - Created At: 2026-08-26 00:00:00
140
+ - Summary: Tiinex
141
+
142
+ ---
143
+
144
+ # Tiinex
145
+
146
+ ## Organization Identity
147
+
148
+ - Organization Label: Tiinex
149
+ - Organization Kind: project organization
150
+
151
+ ## Organization Boundary
152
+
153
+ - In Scope: the open-source Tiinex project
154
+ - Out Of Scope: unrelated personal activity
155
+
156
+ ## Unit Or Parent Relationship
157
+
158
+ - Parent Organization: none declared
159
+
160
+ ## Representation Boundary
161
+
162
+ - Representation State: organizational continuity only
163
+
164
+ ## Interpretation Limits
165
+
166
+ - Does Not Prove: legal status
167
+ - Must Not Be Treated As: representation authority
168
+ `
169
+ }),
170
+ Object.freeze({
171
+ schemaId: 'tiinex.reduction.v1',
172
+ expectedSections: Object.freeze(['SOURCE CONTEXT', 'CARRY-FORWARD STATE', 'LOSS AND UNCERTAINTY', 'VALIDATION']),
173
+ meaningful: 'Source Scope: Foundation grounding inputs',
174
+ markdown: `# Continuity Context
175
+
176
+ - Current
177
+ - Current Schema: [tiinex.reduction.v1](https://github.com/Tiinex/docs/blob/8435cd46a3773a38301659da716785dc6465072c/.topics/.schemas/reduction/tiinex.reduction.v1.schema.md)
178
+ - Created At: 2026-09-01 00:00:00
179
+ - Summary: Foundation grounding checkpoint reduction
180
+
181
+ ---
182
+
183
+ # Foundation Grounding Checkpoint Reduction
184
+
185
+ ## Source Context
186
+
187
+ - Source Scope: Foundation grounding inputs
188
+ - Source Boundary: qualified carried material only
189
+
190
+ ## Carry-Forward State
191
+
192
+ - Preserved State: current Foundation constraints and accepted decisions
193
+
194
+ ## Loss And Uncertainty
195
+
196
+ - Known Loss: omitted historical detail remains recoverable from source
197
+ - Uncertainty: no release-readiness claim
198
+
199
+ ## Validation
200
+
201
+ - Reduction Rule: no source item is removed before durable representation exists
202
+ `
203
+ })
204
+ ]);
205
+
206
+ for (const item of foundationCriticalReadCases) {
207
+ const module = schemaRegistry.byId.get(item.schemaId);
208
+ assert(module, `${item.schemaId} must be an exact registered companion`);
209
+ assert.equal(Boolean(module.artifactCreation), false, `${item.schemaId} companion must remain presentation/read-only`);
210
+ const presentation = schemaReadPresentation({ path: `.topics/${item.schemaId}.trace.md`, markdown: item.markdown });
211
+ assert.equal(presentation.schema, item.schemaId);
212
+ assert.equal(presentation.companionId, item.schemaId);
213
+ assert.equal(presentation.readMode, 'schema-owned');
214
+ assert.equal(presentation.readState, 'schema-owned');
215
+ assert.equal(presentation.schemaCoverage, 'exact-companion');
216
+ assert.equal(presentation.fallbackUsed, false);
217
+ assert.deepEqual(presentation.sections.map((section) => section.label), item.expectedSections);
218
+ assert(presentation.sections.some((section) => section.value.includes(item.meaningful)), `${item.schemaId} must expose meaningful schema-owned read content`);
219
+ }
220
+
221
+ assert.equal(schemaRegistry.byId.has('tiinex.party.v1'), false, 'party parent source dependency must not become a fifth read companion');
222
+ const partyParentFallback = schemaReadPresentation({
223
+ markdown: `# Continuity Context
224
+
225
+ - Current
226
+ - Current Schema: tiinex.party.v1
227
+ - Created At: 2026-09-01 00:00:00
228
+
229
+ ---
230
+
231
+ # Party
232
+
233
+ ## Party Identity
234
+
235
+ - Label: bounded party
236
+ `
237
+ });
238
+ assert.equal(partyParentFallback.readMode, 'root-fallback', 'unregistered parent source dependency must preserve Root fallback');
239
+
240
+ const secondaryFamilyFallback = schemaReadPresentation({
241
+ markdown: `# Continuity Context
242
+
243
+ - Current
244
+ - Current Schema: tiinex.resource.v1
245
+ - Created At: 2026-09-01 00:00:00
246
+
247
+ ---
248
+
249
+ # Resource
250
+
251
+ ## Resource Identity
252
+
253
+ - Description: secondary family remains intentionally unimplemented
254
+ `
255
+ });
256
+ assert.equal(secondaryFamilyFallback.readMode, 'root-fallback', 'secondary unimplemented families must preserve Root fallback');
257
+ assert.equal(secondaryFamilyFallback.schemaCoverage, 'unknown-schema');
258
+
259
+ console.log('✓ schema companion contract is flat, versioned, i18n-backed, and free of inert scaffold files, with bounded Foundation-critical read coverage');
@@ -0,0 +1,256 @@
1
+ import assert from 'node:assert/strict';
2
+ import fs from 'node:fs';
3
+ import { resolveSchemaCapabilities } from '@tiinex/core/schemas/capability.registry.js';
4
+ import { buildArtifactCreationContract, renderArtifactCreationCandidateMarkdown, validateArtifactCreationResult } from '@tiinex/core/schemas/creation.contracts.js';
5
+ import { GENERIC_ARTIFACT_CREATION_RENDERER_ID } from '@tiinex/core/schemas/creation.renderer.js';
6
+ import { schemaRegistry } from '@tiinex/core/schemas/registry.js';
7
+ import { compilePortableSchemaContractChain } from '@tiinex/core/tooling/portable/schema/contract.compile.js';
8
+
9
+ const decision = resolveSchemaCapabilities({ schemaId: 'tiinex.decision.v1' }).descriptor;
10
+ const evidence = resolveSchemaCapabilities({ schemaId: 'tiinex.evidence.v1' }).descriptor;
11
+ const handoff = resolveSchemaCapabilities({ schemaId: 'tiinex.handoff.v1' }).descriptor;
12
+ const validationFinding = resolveSchemaCapabilities({ schemaId: 'tiinex.validation.finding.v1' }).descriptor;
13
+ const validationMethod = resolveSchemaCapabilities({ schemaId: 'tiinex.validation.method.v1' }).descriptor;
14
+ const validationReport = resolveSchemaCapabilities({ schemaId: 'tiinex.validation.report.v1' }).descriptor;
15
+ const root = resolveSchemaCapabilities({ schemaId: 'tiinex.root.v1' }).descriptor;
16
+
17
+ assert.equal(root.actions.create.status, 'unavailable', 'Root must remain abstract/non-creatable');
18
+
19
+ assert.equal(decision.actions.create.status, 'unavailable');
20
+ assert.equal(decision.factory.generation.ready, true);
21
+ assert.equal(decision.factory.invocation.create.state, 'unavailable');
22
+ assert.deepEqual(decision.factory.creation.inputBindings.map((item) => item.kind), [
23
+ 'root-current-summary-body-title', 'section-body', 'section-body', 'section-body'
24
+ ]);
25
+ assert.equal(decision.factory.creation.residualRequiredShape.length, 0);
26
+ const decisionBodyProse = decision.factory.creation.requiredShape.find((item) => item.primitive?.kind === 'body-prose-block');
27
+ assert.ok(decisionBodyProse, 'Decision must compile its unheaded body prose through the generic Required Shape primitive');
28
+ assert.equal(decisionBodyProse.primitive.position, 'after-first-body-heading-before-first-second-level-section');
29
+
30
+ assert.equal(evidence.actions.create.status, 'unavailable');
31
+ assert.equal(evidence.factory.generation.ready, true);
32
+ assert.equal(evidence.factory.invocation.create.state, 'unavailable');
33
+ assert.deepEqual(evidence.factory.inheritance.lineage, ['tiinex.root.v1', 'tiinex.preservation.v1', 'tiinex.evidence.v1']);
34
+ assert.equal(evidence.factory.inheritance.resolution.state, 'qualified');
35
+ assert.equal(evidence.factory.inheritance.resolution.applications.length, 1);
36
+ assert.equal(evidence.factory.inheritance.resolution.declarations.length, 1);
37
+ assert.equal(evidence.factory.inheritance.resolution.declarations[0].sourceGroup, 'Parent Preservation Specialization');
38
+ assert.equal(Object.hasOwn(schemaRegistry.byId.get('tiinex.evidence.v1')?.binding || {}, 'inheritanceCompanions'), false, 'Evidence must not depend on loose inheritanceCompanions binding authority');
39
+ const evidenceOverride = evidence.factory.inheritance.resolution.applications[0];
40
+ assert.equal(evidenceOverride.operation, 'override');
41
+ assert.equal(evidenceOverride.parentNode, 'Schema Validation Contract / Preservation Body / Required Shape');
42
+ assert.equal(evidenceOverride.childNode, 'Schema Validation Contract / Evidence Body / Required Shape');
43
+ assert.deepEqual(new Set(evidenceOverride.deactivatedContributions.map((item) => item.group)), new Set([
44
+ 'Preservation Body', 'Preserved Material', 'Preservation Act', 'Fidelity And Loss', 'Custody Or Storage Boundary'
45
+ ]));
46
+ assert.ok(evidence.factory.sections.some((section) => section.group === 'Provenance'
47
+ && section.contributors.some((item) => item.sourceSchemaId === 'tiinex.preservation.v1')
48
+ && section.contributors.some((item) => item.sourceSchemaId === 'tiinex.evidence.v1')), 'Evidence inherited provenance contributors must remain visible');
49
+ for (const removed of ['Preserved Material', 'Preservation Act', 'Fidelity And Loss', 'Custody Or Storage Boundary']) {
50
+ assert.equal(evidence.factory.sections.some((section) => section.group === removed), false, `${removed} must be inactive after the declared structural override`);
51
+ }
52
+ assert.equal(evidence.factory.creation.inputBindings.length, 12);
53
+ assert.ok(evidence.factory.creation.inputBindings.every((item) => item.kind === 'ordinary-field'), 'Evidence creation fields must compile through generic field bindings');
54
+ assert.deepEqual(evidence.factory.creation.supplementalRequiredFields, [{
55
+ section: 'Interpretation Limits',
56
+ group: 'Interpretation Limits',
57
+ field: 'Not Yet Used As',
58
+ sourceSchemaIds: ['tiinex.preservation.v1'],
59
+ representation: 'neutral-placeholder',
60
+ value: 'unknown / not supplied at creation'
61
+ }]);
62
+
63
+ assert.equal(handoff.actions.create.status, 'unavailable');
64
+ assert.equal(handoff.factory.generation.ready, true);
65
+ assert.equal(handoff.factory.invocation.create.state, 'unavailable');
66
+ assert.deepEqual(handoff.factory.creation.inputBindings.map((item) => item.kind), [
67
+ 'ordinary-field', 'ordinary-field', 'ordinary-field', 'ordinary-field', 'ordinary-field',
68
+ 'named-declaration-section', 'named-declaration-section', 'named-declaration-section', 'named-declaration-section', 'named-declaration-section',
69
+ 'ordinary-group', 'ordinary-group'
70
+ ]);
71
+ assert.ok(handoff.factory.declarations.some((item) => item.group === 'Transfers' && item.requiredFields.includes('Transfer Kind')));
72
+ assert.equal(handoff.factory.transitionParticipation.authority, 'canonical-transition-definition');
73
+ assert.equal(handoff.factory.transitionParticipation.applicability, 'not-inferred-from-schema-module');
74
+
75
+ assert.equal(validationFinding.actions.create.status, 'unavailable');
76
+ assert.equal(validationFinding.factory.generation.ready, true);
77
+ assert.equal(validationFinding.factory.invocation.create.state, 'unavailable');
78
+ assert.equal(validationFinding.factory.creation.inputBindings.length, 11);
79
+ assert.ok(validationFinding.factory.creation.inputBindings.every((item) => item.kind === 'ordinary-field'));
80
+ const methodBinding = validationFinding.factory.creation.inputBindings.find((item) => item.input === 'Method');
81
+ assert.deepEqual({ section: methodBinding.section, group: methodBinding.group }, { section: 'Validation Method', group: 'Validation Method' });
82
+
83
+ assert.equal(validationMethod.actions.read.status, 'implemented');
84
+ assert.equal(validationMethod.actions.validate.status, 'implemented');
85
+ assert.equal(validationMethod.actions.create.status, 'unavailable');
86
+ assert.equal(validationMethod.factory.creation.authorityState, 'unavailable');
87
+ assert.equal(validationMethod.factory.generation.ready, false);
88
+ assert.equal(validationMethod.factory.invocation.create.state, 'unavailable');
89
+
90
+ assert.equal(validationReport.actions.read.status, 'implemented');
91
+ assert.equal(validationReport.actions.validate.status, 'implemented');
92
+ assert.equal(validationReport.actions.create.status, 'unavailable');
93
+ assert.equal(validationReport.factory.creation.authorityState, 'qualified');
94
+ assert.equal(validationReport.factory.generation.ready, true);
95
+ assert.equal(validationReport.factory.invocation.create.state, 'unavailable');
96
+ assert.equal(validationReport.factory.creation.inputBindings.length, 11);
97
+ assert.ok(validationReport.factory.creation.inputBindings.every((item) => item.kind === 'ordinary-field'));
98
+ const reportSummaryBinding = validationReport.factory.creation.inputBindings.find((item) => item.input === 'Summary');
99
+ assert.deepEqual({ section: reportSummaryBinding.section, group: reportSummaryBinding.group, field: reportSummaryBinding.field }, { section: 'Findings Summary', group: 'Findings Summary', field: 'Summary' });
100
+ assert.equal(validationReport.factory.creation.inputBindings.some((item) => item.input === 'Summary' && item.kind === 'root-current-summary-body-title'), false);
101
+
102
+ for (const schemaId of ['tiinex.decision.v1', 'tiinex.evidence.v1', 'tiinex.handoff.v1', 'tiinex.validation.finding.v1', 'tiinex.validation.method.v1', 'tiinex.validation.report.v1']) {
103
+ const module = schemaRegistry.byId.get(schemaId);
104
+ assert.equal(module?.artifactCreation?.implementation?.renderer?.id, GENERIC_ARTIFACT_CREATION_RENDERER_ID, `${schemaId} must use the shared generic renderer`);
105
+ }
106
+
107
+ function renderAndValidate(schemaId, values, createdAt = '2026-09-04T08:00:00.000Z') {
108
+ const contract = buildArtifactCreationContract({ schemaId });
109
+ assert.equal(contract.status, 'ready', `${schemaId} must build a ready creation contract`);
110
+ const markdown = renderArtifactCreationCandidateMarkdown(contract, { values, createdAt });
111
+ assert.ok(markdown, `${schemaId} must render through the generic creation path`);
112
+ const validation = validateArtifactCreationResult({ schemaId, status: 'local', sourceMode: 'local-create', path: `${schemaId}.factory-proof.trace.md`, markdown }, {}, { contract, childPath: `${schemaId}.factory-proof.trace.md` });
113
+ assert.equal(validation.counts.errors, 0, JSON.stringify(validation.findings, null, 2));
114
+ return { contract, markdown, validation };
115
+ }
116
+
117
+ const decisionProof = renderAndValidate('tiinex.decision.v1', {
118
+ Summary: 'Factory decision proof',
119
+ Decision: 'Use the shared generic factory.',
120
+ Basis: 'The compiled contract is qualified.',
121
+ Consequences: 'No schema-specific renderer is introduced.'
122
+ });
123
+ const firstTitleEnd = decisionProof.markdown.indexOf('\n', decisionProof.markdown.indexOf('\n# Factory decision proof') + 1);
124
+ const firstDecisionSection = decisionProof.markdown.indexOf('\n## Decision');
125
+ const decisionInterveningBody = decisionProof.markdown.slice(firstTitleEnd, firstDecisionSection).trim();
126
+ assert.equal(decisionInterveningBody, 'Provide the required unheaded body prose here.');
127
+ assert.equal(/^#{1,6}\s/m.test(decisionInterveningBody), false, 'Decision body-prose primitive must remain unheaded');
128
+
129
+ const evidenceProof = renderAndValidate('tiinex.evidence.v1', {
130
+ 'Supported Claim Or Question': 'whether the generic factory can create Evidence',
131
+ 'Evidence Role': 'supports the factory conformance claim',
132
+ 'Known Source': 'local qualified implementation test',
133
+ 'Preservation Basis': 'rendered from qualified creation contract',
134
+ 'Provenance Limits': 'local conformance only',
135
+ Material: 'qualified renderer output',
136
+ 'Material Kind': 'excerpt',
137
+ 'Preservation State': 'preserved in local test output',
138
+ 'Fidelity Notes': 'exact field values retained',
139
+ 'Known Losses': 'none relevant to structural qualification',
140
+ 'Does Not Prove': 'product acceptance',
141
+ 'Must Not Be Treated As': 'remote publication proof'
142
+ });
143
+ assert.equal(evidenceProof.validation.status, 'valid', 'Standalone factory-created Evidence must validate cleanly without an inferred Preservation Parent requirement');
144
+ assert.equal(evidenceProof.validation.findings.some((finding) => finding.code === 'evidence.preservation.parent.unresolved'), false, 'Evidence schema inheritance must not manufacture an artifact Parent warning');
145
+ assert.ok(evidenceProof.markdown.includes('- Not Yet Used As: unknown / not supplied at creation'));
146
+ assert.equal(evidenceProof.markdown.includes('## Preserved Material'), false);
147
+ assert.equal(evidenceProof.markdown.includes('## Preservation Act'), false);
148
+ assert.equal(evidenceProof.markdown.includes('## Fidelity And Loss'), false);
149
+ assert.equal(evidenceProof.markdown.includes('## Custody Or Storage Boundary'), false);
150
+
151
+ const handoffValues = {
152
+ Purpose: 'Factory conformance handoff.',
153
+ From: 'Anchor',
154
+ 'From Kind': 'role',
155
+ To: 'Loom',
156
+ 'To Kind': 'role',
157
+ Transfers: [{ name: 'factory-proof', fields: { 'Transfer Kind': 'work', Description: 'Exercise the generic structured creation path.' } }],
158
+ 'Required Context': 'none',
159
+ 'Reference Context': 'none',
160
+ 'Retained Responsibilities': 'none',
161
+ 'Exclusions And Dependencies': 'none',
162
+ 'Completion Expectation': { 'Signal Kind': 'result', 'Signal Meaning': 'Return qualified factory evidence.' },
163
+ 'Interpretation Limits': { 'Does Not Mean': 'This does not authorize broad schema fan-out.', 'Must Not Be Used To Claim': 'This does not prove semantic acceptance.' }
164
+ };
165
+ const handoffProof = renderAndValidate('tiinex.handoff.v1', handoffValues);
166
+ assert.ok(handoffProof.markdown.includes('## Transfers\n\n- factory-proof\n - Transfer Kind: work'));
167
+ assert.ok(handoffProof.markdown.includes('## Completion Expectation\n\n- Signal Kind: result'));
168
+ const invalidStructured = renderArtifactCreationCandidateMarkdown(handoffProof.contract, { values: { ...handoffValues, Transfers: 'opaque free text' }, createdAt: '2026-09-04T08:00:00.000Z' });
169
+ assert.equal(invalidStructured, '', 'Structured declaration inputs must fail closed rather than flatten to free text');
170
+
171
+ const validationFindingProof = renderAndValidate('tiinex.validation.finding.v1', {
172
+ Target: 'generic schema factory',
173
+ 'Target Kind': 'local implementation',
174
+ Method: 'contract-driven conformance',
175
+ 'Method Scope': 'factory creation and validation',
176
+ Status: 'pass',
177
+ Observation: 'shared renderer produced a valid artifact',
178
+ 'What Was Checked': 'compiled creation and validation path',
179
+ 'What Was Not Checked': 'remote publication or product acceptance',
180
+ 'Recommended Response': 'retain the shared generic path',
181
+ 'Does Not Prove': 'broad schema fan-out is safe',
182
+ 'Must Not Be Treated As': 'semantic acceptance'
183
+ });
184
+ assert.equal(validationFindingProof.validation.status, 'valid');
185
+
186
+ const validationMethodContract = buildArtifactCreationContract({ schemaId: 'tiinex.validation.method.v1' });
187
+ assert.equal(validationMethodContract.status, 'blocked');
188
+ assert.equal(validationMethodContract.capabilities.create, 'unavailable');
189
+
190
+ const validationReportProof = renderAndValidate('tiinex.validation.report.v1', {
191
+ Scope: 'bounded shared-factory scale proof',
192
+ Targets: 'Validation Method and Validation Report descriptors',
193
+ 'Methods Used': 'compiled contract conformance and shared renderer validation',
194
+ 'Method Boundaries': 'local source-qualified factory path only',
195
+ Summary: 'Validation Report generation is qualified independently from transition invocation.',
196
+ 'Overall State': 'qualified generation; invocable transition unavailable',
197
+ Findings: 'eleven ordinary-field bindings are exact and schema-owned',
198
+ 'Run Context': 'Loom bounded implementation tranche',
199
+ 'What Was Not Checked': 'remote publication or future Transition Definition applicability',
200
+ 'Does Not Prove': 'an invocable Create transition exists',
201
+ 'Must Not Hide': 'generation authority and invocation authority are distinct'
202
+ });
203
+ assert.equal(validationReportProof.validation.status, 'valid');
204
+ assert.ok(validationReportProof.markdown.includes('## Findings Summary\n\n- Summary: Validation Report generation is qualified independently from transition invocation.'));
205
+ assert.equal(validationReportProof.contract.capabilities.create, 'implemented');
206
+
207
+ const rootMarkdown = fs.readFileSync(new URL('./tiinex.root.v1.schema.md', import.meta.url), 'utf8');
208
+ const preservationMarkdown = fs.readFileSync(new URL('./core/preservation/tiinex.preservation.v1.schema.md', import.meta.url), 'utf8');
209
+ const evidenceMarkdown = fs.readFileSync(new URL('./core/evidence/tiinex.evidence.v1.schema.md', import.meta.url), 'utf8');
210
+ const standaloneInheritanceRecord = fs.readFileSync(new URL('../tooling/portable/schema/fixtures/evidence-preservation-body.inheritance-record-fixture.md', import.meta.url), 'utf8');
211
+
212
+ function compileEvidenceVariant(evidenceSource = evidenceMarkdown, preservationSource = preservationMarkdown, options = {}) {
213
+ return compilePortableSchemaContractChain([rootMarkdown, preservationSource, evidenceSource], options);
214
+ }
215
+ function expectInlineOverrideBlocked(label, evidenceSource, preservationSource = preservationMarkdown) {
216
+ const compiled = compileEvidenceVariant(evidenceSource, preservationSource);
217
+ assert.equal(compiled.inheritanceResolution.state, 'unresolved', `${label} must fail closed`);
218
+ assert.equal(compiled.inheritanceResolution.applications.length, 0, `${label} must not partially apply an override`);
219
+ assert.ok(compiled.validation.requiredSections.includes('Preserved Material'), `${label} must retain additive parent structure when override authority is unresolved`);
220
+ }
221
+
222
+ const additivePreservation = compilePortableSchemaContractChain([rootMarkdown, preservationMarkdown]);
223
+ assert.equal(additivePreservation.inheritanceResolution.state, 'not-declared', 'Schemas without inline Inheritance Overrides remain purely additive');
224
+
225
+ expectInlineOverrideBlocked('unsupported operation', evidenceMarkdown.replace('Merge Operation: override', 'Merge Operation: refine'));
226
+ expectInlineOverrideBlocked('non-ancestor parent', evidenceMarkdown.replace('Parent Schema: tiinex.preservation.v1', 'Parent Schema: tiinex.task.v1'));
227
+ expectInlineOverrideBlocked('missing parent node', evidenceMarkdown.replace('Schema Validation Contract / Preservation Body / Required Shape', 'Schema Validation Contract / Missing Body / Required Shape'));
228
+ const declarationBlock = `- evidence-preservation-body-structure\n - Merge Operation: override\n - Parent Schema: tiinex.preservation.v1\n - Parent Node: Schema Validation Contract / Preservation Body / Required Shape\n - Child Node: Schema Validation Contract / Evidence Body / Required Shape\n - Reason: Evidence specializes Preservation by replacing only the generic Preservation artifact-body structure while retaining compatible non-structural Preservation semantics and provenance.\n - Effective Result: Evidence body structure is authoritative for Evidence artifacts; parent-only structural body groups become inactive, while compatible parent contributions targeting surviving Evidence sections remain active.`;
229
+ expectInlineOverrideBlocked('duplicate inline declaration', evidenceMarkdown.replace(declarationBlock, `${declarationBlock}\n\n${declarationBlock}`));
230
+ const preservationBodyStart = preservationMarkdown.indexOf('### Preservation Body');
231
+ const preservationBodyEnd = preservationMarkdown.indexOf('\n### ', preservationBodyStart + 4);
232
+ const preservationBodyGroup = preservationMarkdown.slice(preservationBodyStart, preservationBodyEnd);
233
+ const ambiguousPreservation = preservationMarkdown.slice(0, preservationBodyEnd) + `\n\n${preservationBodyGroup}` + preservationMarkdown.slice(preservationBodyEnd);
234
+ expectInlineOverrideBlocked('ambiguous parent node', evidenceMarkdown, ambiguousPreservation);
235
+ const duplicateParentGroupWithoutTargetCategory = preservationMarkdown.replace('### Preservation Body', '### Preservation Body\n\n#### Optional Fields\n\n- Noise\n\n### Preservation Body');
236
+ expectInlineOverrideBlocked('ambiguous parent group even when target category appears once', evidenceMarkdown, duplicateParentGroupWithoutTargetCategory);
237
+
238
+ const corroboratedEvidence = compileEvidenceVariant(evidenceMarkdown, preservationMarkdown, { inheritanceArtifacts: [standaloneInheritanceRecord] });
239
+ assert.equal(corroboratedEvidence.inheritanceResolution.state, 'qualified');
240
+ assert.equal(corroboratedEvidence.inheritanceResolution.applications.length, 1, 'Standalone record may corroborate but must not create an extra application');
241
+ assert.equal(corroboratedEvidence.inheritanceResolution.corroborations.length, 1);
242
+ const disagreeingRecord = standaloneInheritanceRecord.replace('Child Contract Nodes: Schema Validation Contract / Evidence Body / Required Shape', 'Child Contract Nodes: Schema Validation Contract / Evidence Material / Required Fields');
243
+ const blockedByMismatch = compileEvidenceVariant(evidenceMarkdown, preservationMarkdown, { inheritanceArtifacts: [disagreeingRecord] });
244
+ assert.equal(blockedByMismatch.inheritanceResolution.state, 'unresolved', 'A disagreeing standalone record must fail visible rather than override inline schema authority');
245
+ assert.equal(blockedByMismatch.inheritanceResolution.applications.length, 0);
246
+
247
+ console.log(JSON.stringify({
248
+ schema: 'tiinex.site.schema-factory-conformance.v2',
249
+ decision: { create: decision.actions.create.status, requiredShapePrimitive: decisionBodyProse.primitive.kind, validation: decisionProof.validation.status },
250
+ evidence: { create: evidence.actions.create.status, inheritance: evidence.factory.inheritance.resolution.state, supplementalRequiredFields: evidence.factory.creation.supplementalRequiredFields.length, validation: evidenceProof.validation.status },
251
+ handoff: { create: handoff.actions.create.status, renderer: GENERIC_ARTIFACT_CREATION_RENDERER_ID, validation: handoffProof.validation.status },
252
+ validationFinding: { create: validationFinding.actions.create.status, generation: validationFinding.factory.generation.ready, methodBinding: methodBinding.section, validation: validationFindingProof.validation.status },
253
+ validationMethod: { read: validationMethod.actions.read.status, validate: validationMethod.actions.validate.status, generation: validationMethod.factory.generation.ready, invocableCreate: validationMethod.factory.invocation.create.state },
254
+ validationReport: { read: validationReport.actions.read.status, validate: validationReport.actions.validate.status, generation: validationReport.factory.generation.ready, invocableCreate: validationReport.factory.invocation.create.state, summaryBinding: reportSummaryBinding.section, validation: validationReportProof.validation.status },
255
+ builderDescriptor: handoff.factory.schema
256
+ }, null, 2));