@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,218 @@
1
+ import '../sources/source.identity.js';
2
+
3
+ export function collectLoadedArtifactAggregates(input = {}, declaredSchemaIdForRecord = () => '', metadataSchemaIdForRecord = () => '', canonicalSchemaId = '', identityPrefix = 'tiinex.artifact.registry') {
4
+ const aggregates = new Map();
5
+ const append = (record, containingWorkspaceId = '') => {
6
+ if (!record || typeof record !== 'object') return;
7
+ const memberships = recordWorkspaceMemberships(record, containingWorkspaceId);
8
+ const identity = artifactRegistryIdentityForRecord(record, memberships, declaredSchemaIdForRecord, metadataSchemaIdForRecord, identityPrefix);
9
+ const observation = {
10
+ record,
11
+ memberships,
12
+ representation: normalizedRepresentation(record.markdown || ''),
13
+ declaredSchemaId: String(declaredSchemaIdForRecord(record) || '').trim(),
14
+ metadataSchemaId: String(metadataSchemaIdForRecord(record) || '').trim()
15
+ };
16
+ const existing = aggregates.get(identity.key);
17
+ if (existing) {
18
+ for (const membership of memberships) existing.workspaceIds.add(membership);
19
+ existing.observations.push(observation);
20
+ return;
21
+ }
22
+ aggregates.set(identity.key, { identity, observations: [observation], workspaceIds: new Set(memberships) });
23
+ };
24
+ for (const record of Array.isArray(input.records) ? input.records : []) append(record);
25
+ for (const workspace of Array.isArray(input.state?.workspaces) ? input.state.workspaces : []) {
26
+ for (const record of Array.isArray(workspace?.records) ? workspace.records : []) append(record, workspace?.id || '');
27
+ }
28
+ return [...aggregates.values()].map((aggregate) => finalizeRecordAggregate(aggregate, canonicalSchemaId));
29
+ }
30
+
31
+ export function artifactRegistryIdentityForRecord(record = {}, workspaceIds = [], declaredSchemaIdForRecord = () => '', metadataSchemaIdForRecord = () => '', identityPrefix = 'tiinex.artifact.registry') {
32
+ const boundary = artifactSourceBoundaryIdentity(record);
33
+ const sourceArtifactPath = canonicalSourceArtifactPath(record);
34
+ const inputTarget = String(record.sourceTarget?.inputTarget || '').trim();
35
+ if (boundary?.key && sourceArtifactPath) {
36
+ return Object.freeze({
37
+ global: true,
38
+ kind: 'configured-source',
39
+ key: ['source-boundary', boundary.key, sourceArtifactPath].join('\u0000'),
40
+ id: registryIdentityId(identityPrefix, 'source-boundary', [boundary.key, sourceArtifactPath]),
41
+ sourceBoundary: boundary,
42
+ boundaryKey: boundary.key,
43
+ boundarySignature: boundary.signature,
44
+ sourceArtifactPath
45
+ });
46
+ }
47
+ if (inputTarget) {
48
+ const artifactScoped = Boolean(sourceArtifactPath && embeddedIssueArtifact(record));
49
+ const kind = artifactScoped ? 'input-target-artifact' : 'input-target';
50
+ const identityParts = artifactScoped ? [inputTarget, sourceArtifactPath] : [inputTarget];
51
+ return Object.freeze({
52
+ global: true,
53
+ kind,
54
+ key: ['target', ...identityParts].join('\u0000'),
55
+ id: registryIdentityId(identityPrefix, kind, identityParts),
56
+ inputTarget,
57
+ sourceArtifactPath: artifactScoped ? sourceArtifactPath : ''
58
+ });
59
+ }
60
+ const membershipScope = (Array.isArray(workspaceIds) ? workspaceIds : []).join(',');
61
+ const key = ['workspace-record', membershipScope, record.id || '', record.path || ''].join('\u0000');
62
+ return Object.freeze({
63
+ global: false,
64
+ kind: 'workspace-record',
65
+ key,
66
+ id: String(record.id || registryIdentityId(identityPrefix, 'workspace-record', [membershipScope, record.path || '']))
67
+ });
68
+ }
69
+
70
+ export function readArtifactRepresentationQualification(record = {}) {
71
+ const aggregation = record.registryAggregation || {};
72
+ const variants = Array.isArray(aggregation.representationVariants) ? aggregation.representationVariants : [];
73
+ return Object.freeze({
74
+ state: String(aggregation.representationState || (variants.length ? 'equivalent' : 'unresolved')),
75
+ observationCount: Number(aggregation.observationCount || (variants.length ? 1 : 0)),
76
+ variantCount: variants.length,
77
+ variants: Object.freeze(variants.map((variant) => Object.freeze({
78
+ markdown: String(variant.markdown || ''),
79
+ recordIds: Object.freeze([...(variant.recordIds || [])]),
80
+ workspaceIds: Object.freeze([...(variant.workspaceIds || [])])
81
+ }))),
82
+ reconciliationStatuses: Object.freeze([...(aggregation.reconciliationStatuses || [])])
83
+ });
84
+ }
85
+
86
+ export function readArtifactSchemaQualification(record = {}, canonicalSchemaId = '') {
87
+ const aggregation = record.registryAggregation || {};
88
+ const declaredSchemaIds = [...(aggregation.declaredSchemaIds || [])];
89
+ return Object.freeze({
90
+ state: String(aggregation.schemaState || (declaredSchemaIds.length === 1 ? 'equivalent' : 'unresolved')),
91
+ declaredSchemaIds: Object.freeze(declaredSchemaIds),
92
+ canonicalSchemaId: String(canonicalSchemaId || aggregation.canonicalSchemaId || ''),
93
+ canonicalObserved: aggregation.canonicalSchemaObserved === true,
94
+ unresolvedObservationCount: Number(aggregation.unresolvedSchemaObservationCount || 0),
95
+ observationCount: Number(aggregation.observationCount || 0)
96
+ });
97
+ }
98
+
99
+ export function artifactSourceBoundaryIdentity(record = {}) {
100
+ const source = record.source || {};
101
+ return globalThis.TiinexSourceIdentity?.configuredSourceBoundaryIdentity?.({
102
+ repository: source.repository || source.repo || source.config?.repo || '',
103
+ ref: source.ref || source.requestedRef || source.config?.ref || '',
104
+ rootPath: source.rootPath || source.config?.rootPath || '.topics'
105
+ }) || null;
106
+ }
107
+
108
+ export function artifactSourceBoundarySignature(record = {}) {
109
+ return String(artifactSourceBoundaryIdentity(record)?.signature || '');
110
+ }
111
+
112
+ function finalizeRecordAggregate(aggregate = {}, canonicalSchemaId = '') {
113
+ const memberships = [...(aggregate.workspaceIds || [])].sort();
114
+ const observations = [...(aggregate.observations || [])].sort(compareObservations);
115
+ const schemaQualification = schemaAggregateQualification(observations, canonicalSchemaId);
116
+ const representative = representativeObservation(observations, canonicalSchemaId)?.record || {};
117
+ const loadedRecordIds = [...new Set(observations.map((item) => String(item.record?.id || '').trim()).filter(Boolean))].sort();
118
+ const loadedSourceIds = [...new Set(observations.map((item) => String(item.record?.source?.id || '').trim()).filter(Boolean))].sort();
119
+ const variants = representationVariants(observations);
120
+ const reconciliationStatuses = [...new Set(observations.map((item) => String(item.record?.materialReconciliation?.status || '').trim()).filter(Boolean))].sort();
121
+ const representationState = representationAggregateState(variants, reconciliationStatuses);
122
+ const identity = aggregate.identity || {};
123
+ return Object.assign({}, representative, {
124
+ id: identity.global ? String(loadedRecordIds[0] || identity.id || '') : String(representative.id || identity.id || ''),
125
+ workspaceId: memberships[0] || '',
126
+ workspaceIds: memberships,
127
+ registryIdentity: identity,
128
+ loadedRecordIds,
129
+ loadedSourceIds,
130
+ registryAggregation: Object.freeze({
131
+ observationCount: observations.length,
132
+ representationState,
133
+ representationVariants: Object.freeze(variants),
134
+ reconciliationStatuses: Object.freeze(reconciliationStatuses),
135
+ schemaState: schemaQualification.state,
136
+ declaredSchemaIds: Object.freeze(schemaQualification.declaredSchemaIds),
137
+ canonicalSchemaId: String(canonicalSchemaId || ''),
138
+ canonicalSchemaObserved: schemaQualification.canonicalObserved,
139
+ unresolvedSchemaObservationCount: schemaQualification.unresolvedObservationCount
140
+ })
141
+ });
142
+ }
143
+
144
+ function schemaAggregateQualification(observations = [], canonicalSchemaId = '') {
145
+ const declaredSchemaIds = [...new Set(observations.map((item) => String(item.declaredSchemaId || '').trim()).filter(Boolean))].sort();
146
+ const unresolvedObservationCount = observations.filter((item) => !String(item.declaredSchemaId || '').trim()).length;
147
+ const canonicalObserved = Boolean(canonicalSchemaId && declaredSchemaIds.includes(canonicalSchemaId));
148
+ let state = 'unresolved';
149
+ if (!unresolvedObservationCount && declaredSchemaIds.length === 1) state = 'equivalent';
150
+ else if (declaredSchemaIds.length > 1) state = 'conflicting';
151
+ return { state, declaredSchemaIds, canonicalObserved, unresolvedObservationCount };
152
+ }
153
+
154
+ function representativeObservation(observations = [], canonicalSchemaId = '') {
155
+ if (canonicalSchemaId) {
156
+ const canonical = observations.filter((item) => item.declaredSchemaId === canonicalSchemaId);
157
+ if (canonical.length) return canonical[0];
158
+ }
159
+ return observations[0];
160
+ }
161
+
162
+ function recordWorkspaceMemberships(record = {}, containingWorkspaceId = '') {
163
+ const memberships = new Set();
164
+ const add = (value) => {
165
+ const id = String(value || '').trim();
166
+ if (id) memberships.add(id);
167
+ };
168
+ add(containingWorkspaceId);
169
+ add(record.workspaceId);
170
+ for (const value of Array.isArray(record.workspaceIds) ? record.workspaceIds : []) add(value);
171
+ return [...memberships].sort();
172
+ }
173
+
174
+ function compareObservations(left = {}, right = {}) {
175
+ return String(left.representation || '').localeCompare(String(right.representation || ''))
176
+ || String(left.declaredSchemaId || '').localeCompare(String(right.declaredSchemaId || ''))
177
+ || String(left.record?.path || '').localeCompare(String(right.record?.path || ''))
178
+ || String(left.record?.id || '').localeCompare(String(right.record?.id || ''))
179
+ || String((left.memberships || []).join(',')).localeCompare(String((right.memberships || []).join(',')));
180
+ }
181
+
182
+ function representationVariants(observations = []) {
183
+ const variants = new Map();
184
+ for (const observation of observations) {
185
+ const markdown = String(observation.representation || '');
186
+ const existing = variants.get(markdown) || { markdown, recordIds: new Set(), workspaceIds: new Set() };
187
+ const recordId = String(observation.record?.id || '').trim();
188
+ if (recordId) existing.recordIds.add(recordId);
189
+ for (const workspaceId of observation.memberships || []) if (workspaceId) existing.workspaceIds.add(workspaceId);
190
+ variants.set(markdown, existing);
191
+ }
192
+ return [...variants.values()]
193
+ .sort((a, b) => a.markdown.localeCompare(b.markdown))
194
+ .map((variant) => Object.freeze({
195
+ markdown: variant.markdown,
196
+ recordIds: Object.freeze([...variant.recordIds].sort()),
197
+ workspaceIds: Object.freeze([...variant.workspaceIds].sort())
198
+ }));
199
+ }
200
+
201
+ function representationAggregateState(variants = [], reconciliationStatuses = []) {
202
+ if (variants.length > 1 || reconciliationStatuses.includes('checksum-mismatch')) return 'conflicting';
203
+ if (reconciliationStatuses.includes('same-origin-unverified')) return 'unresolved';
204
+ return variants.length === 1 ? 'equivalent' : 'unresolved';
205
+ }
206
+
207
+ function normalizedRepresentation(markdown = '') { return String(markdown || '').replace(/\r\n?/g, '\n'); }
208
+
209
+ function embeddedIssueArtifact(record = {}) {
210
+ const mode = String(record.sourceMode || '').trim();
211
+ const targetKind = String(record.sourceTarget?.targetKind || '').trim();
212
+ return mode === 'github-issue-embedded-artifact'
213
+ || mode === 'github-comment-embedded-artifact'
214
+ || targetKind === 'github-issue-embedded-artifact'
215
+ || targetKind === 'github-comment-embedded-artifact';
216
+ }
217
+ function canonicalSourceArtifactPath(record = {}) { return String(record.sourceTarget?.sourceArtifactPath || record.path || '').trim().replace(/\\/g, '/').replace(/^\/+/, '').replace(/\/{2,}/g, '/'); }
218
+ function registryIdentityId(prefix, kind, parts = []) { return `${prefix}:${kind}:${parts.map((value) => encodeURIComponent(String(value || ''))).join(':')}`; }
@@ -0,0 +1,2 @@
1
+ export const artifactModelVersion = 'tiinex.web.artifact.model.v84';
2
+ export const artifactStates = Object.freeze(['parsed', 'degraded', 'invalid', 'unresolved']);
@@ -0,0 +1,196 @@
1
+ import assert from 'node:assert/strict';
2
+ import { parseArtifactMarkdown } from '@tiinex/core/artifacts/artifact.parse.js';
3
+
4
+ const ROOT_WITHOUT_PARENT = `# Continuity Context
5
+
6
+ - Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
7
+ - Current
8
+ - Current Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
9
+ - Created At: 2026-07-23T00:00:00.000Z
10
+ - Summary: Root artifact without an artifact parent.
11
+
12
+ ---
13
+
14
+ # Root Artifact
15
+
16
+ ## Summary
17
+
18
+ No parent is declared.
19
+
20
+ # Continuity Integrity
21
+
22
+ - Method: pending
23
+ - Value: pending
24
+ `;
25
+
26
+ const CHILD_SCHEMA_WITHOUT_ARTIFACT_PARENT = `# Continuity Context
27
+
28
+ - Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
29
+ - Current
30
+ - Current Schema: [tiinex.schema.module.v1](tiinex.schema.module.v1.schema.md)
31
+ - Created At: 2026-07-23T00:01:00.000Z
32
+ - Summary: Child schema artifact that inherits schema meaning but declares no artifact parent.
33
+
34
+ ---
35
+
36
+ # Schema Module
37
+
38
+ ## Summary
39
+
40
+ No artifact Parent block is declared here.
41
+
42
+ # Continuity Integrity
43
+
44
+ - Method: pending
45
+ - Value: pending
46
+ `;
47
+
48
+ const CHILD_WITH_PARENT = `# Continuity Context
49
+
50
+ - Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
51
+ - Parent
52
+ - Parent Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
53
+ - Trace: [parent](parent.trace.md)
54
+ - Origin: [browse + git](https://github.com/Tiinex/docs/blob/abc/parent.trace.md)
55
+ - Created At: 2026-07-22T00:00:00.000Z
56
+ - Current
57
+ - Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
58
+ - Created At: 2026-07-23T00:02:00.000Z
59
+ - Summary: Child with declared parent.
60
+
61
+ ---
62
+
63
+ # Child
64
+
65
+ # Continuity Integrity
66
+
67
+ - Method: pending
68
+ - Value: pending
69
+ `;
70
+
71
+ const root = parseArtifactMarkdown(ROOT_WITHOUT_PARENT);
72
+ assert.equal(root.envelope.parent.schema.id, '', 'root without Parent must not inherit Current Schema as Parent Schema');
73
+ assert.equal(root.envelope.parent.createdAt, '', 'Current Created At must not leak into Parent Created At');
74
+ assert.equal(root.envelope.parent.trace, '', 'root without Parent must not infer a Trace');
75
+ assert.equal(root.envelope.parent.origin, '', 'root without Parent must not infer an Origin');
76
+ assert.equal(root.envelope.current.schema.id, 'tiinex.root.v1', 'Current Schema remains readable');
77
+ assert.equal(root.envelope.current.createdAt, '2026-07-23T00:00:00.000Z', 'Current Created At remains readable');
78
+
79
+ const schemaArtifact = parseArtifactMarkdown(CHILD_SCHEMA_WITHOUT_ARTIFACT_PARENT);
80
+ assert.equal(schemaArtifact.envelope.parent.schema.id, '', 'child schema artifact without artifact Parent must not fabricate parent schema');
81
+ assert.equal(schemaArtifact.envelope.parent.trace, '', 'child schema artifact without artifact Parent must not fabricate parent trace');
82
+ assert.equal(schemaArtifact.envelope.current.schema.id, 'tiinex.schema.module.v1', 'child schema Current Schema remains readable');
83
+
84
+ const child = parseArtifactMarkdown(CHILD_WITH_PARENT);
85
+ assert.equal(child.envelope.parent.schema.id, 'tiinex.topic.v1', 'valid Parent Schema parses');
86
+ assert.equal(child.envelope.parent.trace, 'parent.trace.md', 'valid Parent Trace uses markdown link target for resolution');
87
+ assert.equal(child.envelope.parent.traceLabel, 'parent', 'valid Parent Trace preserves markdown link label for presentation');
88
+ assert.equal(child.envelope.parent.origin, 'https://github.com/Tiinex/docs/blob/abc/parent.trace.md', 'valid Parent Origin parses');
89
+ assert.equal(child.envelope.parent.createdAt, '2026-07-22T00:00:00.000Z', 'valid Parent Created At parses');
90
+ assert.equal(child.envelope.current.createdAt, '2026-07-23T00:02:00.000Z', 'valid Current Created At stays separate');
91
+
92
+ const CANONICAL_FOOTER_DIVIDER = `# Continuity Context
93
+
94
+ - Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
95
+ - Current
96
+ - Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
97
+ - Created At: 2026-07-23T00:02:30.000Z
98
+ - Summary: Canonical footer divider
99
+
100
+ ---
101
+
102
+ # Canonical Divider
103
+
104
+ ## Current Read
105
+
106
+ body sentinel
107
+
108
+ ---
109
+
110
+ # Continuity Integrity
111
+
112
+ - sha256-base64url-c14n-v2
113
+ - Towards: self
114
+ - Value: pending
115
+ `;
116
+ const canonicalDivider = parseArtifactMarkdown(CANONICAL_FOOTER_DIVIDER);
117
+ assert.equal(canonicalDivider.body.text.includes('---'), false, 'canonical footer divider is representation boundary, not body content');
118
+ assert.equal(canonicalDivider.body.text.endsWith('body sentinel'), true, 'body ends before canonical footer divider');
119
+ assert.equal(canonicalDivider.integrity.entries.length, 1, 'integrity remains readable after canonical footer divider');
120
+
121
+
122
+ const CHILD_WITH_RELATIVE_PARENT_LINK = `# Continuity Context
123
+
124
+ - Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
125
+ - Parent
126
+ - Parent Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
127
+ - Trace: [001.trace.md](../001.trace.md)
128
+ - Current
129
+ - Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
130
+ - Created At: 2026-07-23T00:03:00.000Z
131
+ - Summary: Child with relative parent href.
132
+
133
+ ---
134
+
135
+ # Child With Relative Parent
136
+ `;
137
+
138
+ const relativeChild = parseArtifactMarkdown(CHILD_WITH_RELATIVE_PARENT_LINK);
139
+ assert.equal(relativeChild.envelope.parent.trace, '../001.trace.md', 'Parent Trace link href is the resolution target');
140
+ assert.equal(relativeChild.envelope.parent.traceLabel, '001.trace.md', 'Parent Trace label remains available for display');
141
+
142
+
143
+ const CHILD_WITH_LABELLED_PARENT_ORIGIN = `# Continuity Context
144
+
145
+ - Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
146
+ - Parent
147
+ - Parent Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
148
+ - Trace: [001.trace.md](001.trace.md)
149
+ - Origin:
150
+ - relative: 001.trace.md
151
+ - [github git file](https://github.com/Tiinex/docs/blob/main/.topics/area/001.trace.md)
152
+ - Current
153
+ - Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
154
+ - Created At: 2026-07-25T00:00:00.000Z
155
+ - Summary: Child with labelled nested origin.
156
+
157
+ ---
158
+
159
+ # Child With Labelled Origin
160
+ `;
161
+ const labelledOriginChild = parseArtifactMarkdown(CHILD_WITH_LABELLED_PARENT_ORIGIN);
162
+ assert.equal(labelledOriginChild.envelope.parent.origin, '001.trace.md', 'labelled nested Parent Origin should expose the value, not the label prefix');
163
+
164
+
165
+ const INTEGRITY_WITH_TOWARDS = `# Continuity Context
166
+
167
+ - Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
168
+ - Parent
169
+ - Parent Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
170
+ - Trace: [001.trace.md](001.trace.md)
171
+ - Current
172
+ - Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
173
+ - Summary: Integrity entries
174
+
175
+ ---
176
+
177
+ # Integrity Entries
178
+
179
+ # Continuity Integrity
180
+
181
+ - [sha256-base64url-c14n-v2](validator.md)
182
+ - Towards: [001.trace.md](001.trace.md)
183
+ - Value: parent-hash
184
+
185
+ - [sha256-base64url-c14n-v2](validator.md)
186
+ - Towards: self
187
+ - Value: self-hash
188
+ `;
189
+ const integrityEntries = parseArtifactMarkdown(INTEGRITY_WITH_TOWARDS).integrity.entries;
190
+ assert.equal(integrityEntries.length, 2, 'integrity parser should expose structured entries');
191
+ assert.equal(integrityEntries[0].towards, '001.trace.md', 'integrity Towards should prefer link target');
192
+ assert.equal(integrityEntries[0].value, 'parent-hash', 'integrity parent Value should parse');
193
+ assert.equal(integrityEntries[1].towards, 'self', 'integrity self Towards should parse');
194
+ assert.equal(integrityEntries[1].value, 'self-hash', 'integrity self Value should parse');
195
+
196
+ console.log('✓ artifact parser Parent-block regression guards passed');
@@ -0,0 +1,189 @@
1
+ import { parseArtifactMarkdown } from '@tiinex/core/artifacts/artifact.parse.js';
2
+ import {
3
+ collectLoadedArtifactAggregates,
4
+ readArtifactRepresentationQualification,
5
+ readArtifactSchemaQualification,
6
+ artifactSourceBoundaryIdentity,
7
+ artifactRegistryIdentityForRecord
8
+ } from './artifact.identityAggregation.js';
9
+
10
+ export const ARTIFACT_PARTICIPANT_INDEX_SCHEMA_ID = 'tiinex.site.artifact-participant-index.v1';
11
+ export const ARTIFACT_PARTICIPANT_SCHEMA_ID = 'tiinex.site.artifact-participant.v1';
12
+ const PARTICIPANT_IDENTITY_PREFIX = 'tiinex.artifact.participant';
13
+
14
+ export function buildLoadedArtifactParticipantIndex(input = {}) {
15
+ const aggregates = collectLoadedArtifactAggregates(
16
+ input,
17
+ declaredRecordSchemaId,
18
+ metadataRecordSchemaId,
19
+ '',
20
+ PARTICIPANT_IDENTITY_PREFIX
21
+ );
22
+ const participants = aggregates
23
+ .filter(hasAnyDeclaredArtifactSchema)
24
+ .map(buildArtifactParticipantReadModel)
25
+ .sort(compareParticipants);
26
+ return Object.freeze({
27
+ schema: ARTIFACT_PARTICIPANT_INDEX_SCHEMA_ID,
28
+ count: participants.length,
29
+ cleanCandidateCount: participants.filter((participant) => participant.cleanCandidate).length,
30
+ participants: Object.freeze(participants),
31
+ boundary: Object.freeze({
32
+ readOnly: true,
33
+ networkFetch: false,
34
+ mutation: false,
35
+ completenessRequired: false
36
+ })
37
+ });
38
+ }
39
+
40
+ export function buildArtifactParticipantReadModel(record = {}) {
41
+ const representationQualification = readArtifactRepresentationQualification(record);
42
+ const schemaQualification = readArtifactSchemaQualification(record);
43
+ const declaredSchemaIds = [...schemaQualification.declaredSchemaIds];
44
+ const aggregateIdentity = record.registryIdentity || {};
45
+ const identity = participantIdentityProjection(aggregateIdentity);
46
+ const cleanCandidate = Boolean(identity.id)
47
+ && representationQualification.state === 'equivalent'
48
+ && schemaQualification.state === 'equivalent'
49
+ && declaredSchemaIds.length === 1;
50
+ return Object.freeze({
51
+ schema: ARTIFACT_PARTICIPANT_SCHEMA_ID,
52
+ identity: Object.freeze({
53
+ id: identity.id,
54
+ key: identity.key,
55
+ kind: identity.kind,
56
+ global: identity.global
57
+ }),
58
+ artifact: Object.freeze({
59
+ id: String(record.id || ''),
60
+ loadedRecordIds: Object.freeze([...(record.loadedRecordIds || [record.id]).map(normalizeToken).filter(Boolean)].sort()),
61
+ workspaceIds: Object.freeze([...(record.workspaceIds || []).map(normalizeToken).filter(Boolean)].sort()),
62
+ path: String(record.path || ''),
63
+ title: String(record.title || ''),
64
+ declaredSchemaId: cleanCandidate ? declaredSchemaIds[0] : '',
65
+ declaredSchemaIds: Object.freeze(declaredSchemaIds),
66
+ metadataSchemaId: metadataRecordSchemaId(record),
67
+ currentCreatedAt: String(record.currentCreatedAt || record.createdAt || '')
68
+ }),
69
+ source: sourceProjection(record),
70
+ representationQualification,
71
+ schemaQualification,
72
+ indexedReadable: declaredSchemaIds.length > 0,
73
+ cleanCandidate,
74
+ candidateSchemaId: cleanCandidate ? declaredSchemaIds[0] : '',
75
+ completeness: 'not-evaluated'
76
+ });
77
+ }
78
+
79
+ export function participantMatchesSchema(participant = {}, schemaConstraint = '') {
80
+ if (!participant?.cleanCandidate) return false;
81
+ const constraint = normalizeSchemaConstraint(schemaConstraint);
82
+ return !constraint || participant.candidateSchemaId === constraint;
83
+ }
84
+
85
+ export function resolveCurrentArtifactParticipant(currentArtifact, participantIndex = {}) {
86
+ if (!currentArtifact) return null;
87
+ if (currentArtifact.schema === ARTIFACT_PARTICIPANT_SCHEMA_ID) return currentArtifact;
88
+ const participants = Array.isArray(participantIndex.participants) ? participantIndex.participants : [];
89
+
90
+ const suppliedIdentityKey = normalizeToken(currentArtifact.identity?.key || currentArtifact.participantIdentity?.key || currentArtifact.registryIdentity?.key);
91
+ if (suppliedIdentityKey) {
92
+ const matches = participants.filter((participant) => participant.identity.key === suppliedIdentityKey);
93
+ if (matches.length === 1) return matches[0];
94
+ if (matches.length > 1) return null;
95
+ }
96
+
97
+ const suppliedIdentityId = normalizeToken(currentArtifact.identity?.id || currentArtifact.participantIdentity?.id);
98
+ if (suppliedIdentityId) {
99
+ const matches = participants.filter((participant) => participant.identity.id === suppliedIdentityId);
100
+ if (matches.length === 1) return matches[0];
101
+ if (matches.length > 1) return null;
102
+ }
103
+
104
+ const aggregateIdentity = artifactRegistryIdentityForRecord(
105
+ currentArtifact,
106
+ currentArtifactWorkspaceIds(currentArtifact),
107
+ declaredRecordSchemaId,
108
+ metadataRecordSchemaId,
109
+ PARTICIPANT_IDENTITY_PREFIX
110
+ );
111
+ if (aggregateIdentity?.key) {
112
+ const matches = participants.filter((participant) => participant.identity.key === aggregateIdentity.key);
113
+ if (matches.length === 1) return matches[0];
114
+ if (matches.length > 1) return null;
115
+ }
116
+
117
+ const recordId = normalizeToken(currentArtifact.id);
118
+ if (!recordId) return null;
119
+ const recordIdMatches = participants.filter((participant) => participant.artifact.loadedRecordIds.includes(recordId));
120
+ return recordIdMatches.length === 1 ? recordIdMatches[0] : null;
121
+ }
122
+
123
+
124
+ function participantIdentityProjection(identity = {}) {
125
+ const key = normalizeToken(identity.key);
126
+ const kind = normalizeToken(identity.kind);
127
+ const global = identity.global === true;
128
+ const id = global
129
+ ? normalizeToken(identity.id) || participantIdentityId(kind || 'global', key)
130
+ : participantIdentityId(kind || 'workspace-record', key);
131
+ return Object.freeze({ id, key, kind, global });
132
+ }
133
+
134
+ function participantIdentityId(kind = '', key = '') {
135
+ return `${PARTICIPANT_IDENTITY_PREFIX}:${encodeURIComponent(normalizeToken(kind))}:${encodeURIComponent(normalizeToken(key))}`;
136
+ }
137
+
138
+ function currentArtifactWorkspaceIds(record = {}) {
139
+ const memberships = new Set();
140
+ const add = (value) => {
141
+ const id = normalizeToken(value);
142
+ if (id) memberships.add(id);
143
+ };
144
+ add(record.workspaceId);
145
+ for (const value of Array.isArray(record.workspaceIds) ? record.workspaceIds : []) add(value);
146
+ return [...memberships].sort();
147
+ }
148
+
149
+ function hasAnyDeclaredArtifactSchema(record = {}) {
150
+ return readArtifactSchemaQualification(record).declaredSchemaIds.length > 0;
151
+ }
152
+
153
+ function sourceProjection(record = {}) {
154
+ const identity = record.registryIdentity || {};
155
+ const boundary = identity.sourceBoundary || artifactSourceBoundaryIdentity(record) || {};
156
+ return Object.freeze({
157
+ sourceIds: Object.freeze([...(record.loadedSourceIds || [record.source?.id]).map(normalizeToken).filter(Boolean)].sort()),
158
+ adapterId: String(record.source?.adapterId || ''),
159
+ sourceMode: String(record.sourceMode || ''),
160
+ repository: String(boundary.repository || record.source?.repository || record.source?.repo || ''),
161
+ ref: String(boundary.ref || record.source?.ref || ''),
162
+ rootPath: String(boundary.rootPath || record.source?.rootPath || ''),
163
+ boundaryKey: String(boundary.key || identity.boundaryKey || ''),
164
+ boundarySignature: String(boundary.signature || identity.boundarySignature || ''),
165
+ sourceArtifactPath: String(identity.sourceArtifactPath || record.sourceTarget?.sourceArtifactPath || record.path || ''),
166
+ inputTarget: String(identity.inputTarget || record.sourceTarget?.inputTarget || '')
167
+ });
168
+ }
169
+
170
+ function declaredRecordSchemaId(record = {}) {
171
+ const markdown = String(record.markdown || '');
172
+ if (!markdown.trim()) return '';
173
+ try { return normalizeToken(parseArtifactMarkdown(markdown).envelope?.current?.schema?.id); }
174
+ catch { return ''; }
175
+ }
176
+
177
+ function metadataRecordSchemaId(record = {}) {
178
+ return normalizeToken(record.schemaId || record.currentSchemaId || '');
179
+ }
180
+
181
+ function normalizeSchemaConstraint(value = '') {
182
+ return normalizeToken(value).replace(/^\[([^\]]+)\]\([^)]+\)$/, '$1');
183
+ }
184
+ function normalizeToken(value = '') { return String(value || '').trim(); }
185
+ function compareParticipants(left, right) {
186
+ return String(left.identity.id).localeCompare(String(right.identity.id))
187
+ || String(left.artifact.path).localeCompare(String(right.artifact.path))
188
+ || String(left.artifact.id).localeCompare(String(right.artifact.id));
189
+ }
@@ -0,0 +1,50 @@
1
+ # Continuity Context
2
+
3
+ - Envelope Schema: [tiinex.root.v1](../../.topics/.schemas/tiinex.root.v1.schema.md)
4
+ - Parent
5
+ - Parent Schema: [tiinex.preservation.v1](../../.topics/.schemas/core/preservation/tiinex.preservation.v1.schema.md)
6
+ - Created At: 2026-07-19 00:00:00
7
+ - Trace: [demo-preservation.trace.md](demo-preservation.trace.md)
8
+ - Current
9
+ - Current Schema: [tiinex.evidence.v1](../../.topics/.schemas/core/evidence/tiinex.evidence.v1.schema.md)
10
+ - Created At: 2026-07-19 00:00:00
11
+ - Summary: Demo evidence artifact for parser/root fallback validation.
12
+
13
+ ---
14
+
15
+ # Local Startup Evidence
16
+
17
+ ## Supported Claim Or Question
18
+
19
+ - Supported Claim Or Question: whether the fresh shell can start through local index.html
20
+ - Evidence Role: supports that the file-local startup path is visible
21
+
22
+ ## Provenance
23
+
24
+ - Known Source: Q manual screenshot feedback
25
+ - Preservation Basis: summarized observation in this demo artifact
26
+ - Provenance Limits: exact browser console details are outside this sample
27
+
28
+ ## Evidence Material
29
+
30
+ - Material Kind: screenshot observation
31
+ - Material: v82 shell rendered locally without loading app.js
32
+
33
+ ## Preservation And Fidelity
34
+
35
+ - Preservation State: readable summary preserved in markdown
36
+ - Fidelity Notes: summarized by reviewer from screenshot
37
+ - Known Losses: exact pixel state and full devtools console not embedded
38
+
39
+ ## Interpretation Limits
40
+
41
+ - Does Not Prove: full UX correctness or schema validation completeness
42
+ - Must Not Be Treated As: deployment proof, source authority, or user acceptance
43
+
44
+ ---
45
+
46
+ # Continuity Integrity
47
+
48
+ - sha256-base64url-c14n-v2
49
+ - Towards: self
50
+ - Value: demo-evidence-v84-not-authoritative