@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,261 @@
1
+ import { TIINEX_SITE_CHECKPOINT } from '../build.identity.js';
2
+ import { m1PoCParityScenarioDefinitions } from './poc.m1ParityScenarios.js';
3
+
4
+ export const POC_PARITY_LEDGER_SCHEMA_ID = 'tiinex.poc.parity.ledger.v1';
5
+
6
+ export const PoCParityStatus = Object.freeze({
7
+ parity: 'parity',
8
+ partial: 'partial',
9
+ scaffold: 'scaffold',
10
+ missing: 'missing',
11
+ intentionallyChanged: 'intentionally-changed',
12
+ wrongPortSuspected: 'wrong-port-suspected',
13
+ unknownPendingEvidence: 'unknown-pending-evidence'
14
+ });
15
+
16
+ export const pocParityLedger = Object.freeze({
17
+ schema: POC_PARITY_LEDGER_SCHEMA_ID,
18
+ checkpoint: TIINEX_SITE_CHECKPOINT,
19
+ principle: 'Recover one observed PoC loop at a time under explicit semantic/runtime owners before claiming parity.',
20
+ scenarios: Object.freeze([
21
+ ...m1PoCParityScenarioDefinitions.map(scenario),
22
+ scenario({
23
+ id: 'path-tree-material-lineage',
24
+ status: PoCParityStatus.partial,
25
+ legacyBehavior: 'Imported repository/material reads as grouped folders with visible branch affordance and counts.',
26
+ semanticOwner: 'workspace path tree view model',
27
+ runtimeOwner: 'src/workspaces/workspace.pathTree + workspace views',
28
+ automatedChecks: ['src/workspaces/workspace.pathTree.test.mjs'],
29
+ manualChecks: ['tree folder expansion', 'search opens matching branches'],
30
+ failureResult: 'material remains available in feed/detail even if tree projection degrades'
31
+ }),
32
+ scenario({
33
+ id: 'root-fallback-readable-artifacts',
34
+ status: PoCParityStatus.partial,
35
+ legacyBehavior: 'Unknown schemas remain readable through Root/envelope semantics instead of becoming broken plain text.',
36
+ semanticOwner: 'tiinex.root.v1 fallback',
37
+ runtimeOwner: 'src/schemas/root.* + src/artifacts/*',
38
+ automatedChecks: ['src/schemas/tiinex.root.v1.fallback.test.mjs'],
39
+ manualChecks: ['open unknown-schema markdown detail'],
40
+ failureResult: 'root fallback finding; preserve unknown child schema fields'
41
+ }),
42
+ scenario({
43
+ id: 'loaded-lineage-resolution',
44
+ status: PoCParityStatus.partial,
45
+ legacyBehavior: 'Loaded artifacts with declared Parent Trace/Origin can be traversed without guessing unloaded material.',
46
+ semanticOwner: 'Parent/Trace/Origin resolution',
47
+ runtimeOwner: 'src/lineage/lineage.resolve + src/lineage/lineage.traverse + src/audit/lineage + src/workspaces/workspace.lineageView',
48
+ automatedChecks: ['src/lineage/lineage.resolve.test.mjs', 'src/lineage/lineage.traverse.test.mjs', 'src/workspaces/workspace.lineageView.test.mjs'],
49
+ manualChecks: ['open Lineage view and inspect parent/origin edges'],
50
+ failureResult: 'missing parent/origin findings, not guessed edges'
51
+ }),
52
+ scenario({
53
+ id: 'continue-reference-conformance',
54
+ status: PoCParityStatus.partial,
55
+ legacyBehavior: 'Continue creates canonical local drafts; one bounded old Reference product value is now restored as a separate durable typed non-parent Relation from Topic to a qualified distinct Task. Preserve evidence remains a different Evidence operation, and broader old Reference relation breadth is not claimed.',
56
+ semanticOwner: 'transition + schema creation contracts',
57
+ runtimeOwner: 'src/transitions canonical product preparation/planners + src/app/canonicalReferenceLocalCreateCommand + Relation materializer',
58
+ automatedChecks: ['src/transitions/record.transitions.test.mjs', 'src/acceptance/postV423CanonicalTransitionProductVerticalSlice.test.mjs', 'src/acceptance/postV434M0DDurableReferenceIntegrationClosure.test.mjs', 'src/acceptance/postV435M0DExactAuthorityDurabilityCorrection.test.mjs'],
59
+ manualChecks: ['create Continue/Reference/Preserve evidence and inspect generated markdown', 'compare bounded current Reference against old Reference relation before final parity'],
60
+ failureResult: 'Reference fails closed when explicit generation, exact defining/generation authority representation, or durable participant identity is unqualified; broader old Reference relation parity remains a final product/manual claim'
61
+ }),
62
+ scenario({
63
+ id: 'github-source-discovery',
64
+ status: PoCParityStatus.partial,
65
+ legacyBehavior: 'GitHub source registration keeps broad discovery independent from exact explicit targets; broad + explicit issue intake is additive/unioned, explicit-only survives refresh, and degraded transport remains truthful.',
66
+ semanticOwner: 'github adapter result + source boundary',
67
+ runtimeOwner: 'src/adapters/github + src/sources/github',
68
+ automatedChecks: ['src/adapters/github/github.issueSnapshot.test.mjs', 'src/adapters/github/github.adapter.test.mjs', 'src/sources/github/github.loader.test.mjs', 'src/acceptance/m2QProductContractCorrection.test.mjs'],
69
+ manualChecks: ['broad discovery off + exact issue targets', 'broad discovery on + exact targets union/dedupe', 'explicit raw/blob/file refs', '403 degraded notice'],
70
+ failureResult: 'source registered with warning/diagnostics; issue snapshots require explicit targets/fixtures; no fake progress'
71
+ }),
72
+ scenario({
73
+ id: 'declared-lineage-tree',
74
+ status: PoCParityStatus.partial,
75
+ legacyBehavior: 'Lineage mode arranges selected leaf and parent context by declared Parent/Trace edges.',
76
+ semanticOwner: 'lineage view model + lineage Verse/surface',
77
+ runtimeOwner: 'src/lineage + src/workspaces/workspace.lineageView + workspace views',
78
+ automatedChecks: ['src/workspaces/workspace.lineageView.test.mjs'],
79
+ manualChecks: ['lineage view selected leaf traversal'],
80
+ failureResult: 'tree/feed must not claim lineage parity until declared edges drive the arrangement'
81
+ }),
82
+ scenario({
83
+ id: 'reload-safe-material-cache',
84
+ status: PoCParityStatus.partial,
85
+ legacyBehavior: 'Refreshing an explicit workspace route restores durable local deltas/assets around a metadata-only route/source shell while cold public/clean targets stay isolated from stale unrelated local state.',
86
+ semanticOwner: 'route shell + durable local delta + source-cache boundary',
87
+ runtimeOwner: 'src/workspaces/workspace.persistence + src/workspaces/workspace.persistenceRecovery + src/workspaces/workspace.route',
88
+ automatedChecks: ['src/workspaces/workspace.persistence.test.mjs', 'src/workspaces/workspace.route.test.mjs', 'src/workspaces/workspace.importLifecycle.test.mjs'],
89
+ manualChecks: ['import local/source material, refresh explicit route, verify local deltas restore without source Markdown authority', 'lose route/hash and verify durable local-only work remains recoverable through the local recovery index', 'open cold public/share target and confirm unrelated local state does not bootstrap'],
90
+ failureResult: 'route/source cache stays metadata-only; durable local deltas remain recoverable; cold targets do not hydrate stale unrelated local workspace state'
91
+ }),
92
+ scenario({
93
+ id: 'lineage-audit-traversal',
94
+ status: PoCParityStatus.partial,
95
+ legacyBehavior: 'Audit can explicitly traverse loaded lineage, report missing targets, and validate what is actually read.',
96
+ semanticOwner: 'audit plan + lineage resolver + schema validators + recoverability summary',
97
+ runtimeOwner: 'src/audit/** + src/audit/audit.traverse + src/workspaces/workspace.auditView + src/workspaces/workspace.recoverabilityView',
98
+ automatedChecks: ['src/workspaces/workspace.auditView.test.mjs', 'src/workspaces/workspace.recoverabilityView.test.mjs', 'src/lineage/lineage.resolve.test.mjs', 'src/lineage/lineage.traverse.test.mjs', 'src/audit/audit.traverse.test.mjs'],
99
+ manualChecks: ['audit selected leaf lineage', 'inspect recoverability summary after import'],
100
+ failureResult: 'loaded-only audit findings and recoverability/degraded summary; no network guesses'
101
+ }),
102
+ scenario({
103
+ id: 'publication-reingest-preflight',
104
+ status: PoCParityStatus.partial,
105
+ legacyBehavior: 'Owned-local GitHub issue/comment publication is Copy → Open → exact-target human confirm → Verify; source-backed input stays reference-only.',
106
+ semanticOwner: 'publication preflight + shared plan/result + GitHub social target contract',
107
+ runtimeOwner: 'src/publication/** + src/app/workspaceGithubPublication + GitHub publication read owner+receipt persistence',
108
+ automatedChecks: ['src/publication/publication.githubSocialTargetRepresentationClosure.test.mjs', 'src/app/workspaceGithubPublication.test.mjs', 'src/workspaces/workspace.publicationReceipts.test.mjs', 'src/acceptance/postV449M0FExactMutationTargetAttestationClosure.test.mjs'],
109
+ manualChecks: ['Copy, Open GitHub, mutate, confirm exact plan+target, Verify, inspect durable receipt'],
110
+ failureResult: 'unattested or mismatched Verify creates no binding/receipt; matching remote bytes alone do not prove this operation wrote them'
111
+ }),
112
+ scenario({
113
+ id: 'export-package-manifest-receipt',
114
+ status: PoCParityStatus.partial,
115
+ legacyBehavior: 'Explicit non-default Handoff export now builds and downloads the shared operational package while preserving local-owned Markdown/assets, source-backed references, package controls, and workspace context; ordinary Tree ZIP remains a separate envelope-free product path.',
116
+ semanticOwner: 'export package preflight + manifest + receipt + source boundary + re-ingest plan',
117
+ runtimeOwner: 'src/export/package.preflight + src/export/package.manifest + src/export/package.builder + src/export/package.zip + src/export/handoff.plan + src/app/workspaceHandoffExport + recoverability view',
118
+ automatedChecks: ['src/export/package.preflight.test.mjs', 'src/export/package.manifest.test.mjs', 'src/export/package.builder.test.mjs', 'src/export/package.zip.test.mjs', 'src/app/workspaceHandoffExport.test.mjs', 'src/app/handoffPackageImportCommand.test.mjs', 'src/acceptance/postV441M0FProductExecutionIntegration.test.mjs', 'src/acceptance/postV442M0FHandoffFreshnessArchiveScalingCorrection.test.mjs', 'src/workspaces/workspace.recoverabilityView.test.mjs', 'src/conformance/conformance.run.test.mjs'],
119
+ manualChecks: ['select Handoff package explicitly, inspect truthful package summary, download one package ZIP, re-ingest it, and verify local assets stay assets while source-backed members remain references'],
120
+ failureResult: 'execution-time blocked/degraded Handoff qualification prevents download; stale render plans never own export bytes; invalid claimed package fails closed; no provenance conversion or generic archive fallback'
121
+ }),
122
+ scenario({
123
+ id: 'export-package-file-map',
124
+ status: PoCParityStatus.partial,
125
+ legacyBehavior: 'The Handoff product path serializes the bounded shared package file map to one ZIP from latest execution-time workspace truth, while local single-ZIP intake decodes once and then rehydrates/imports/applies an operational package or preserves ordinary archive semantics without turning source references into local leaves.',
126
+ semanticOwner: 'export package builder + manifest/receipt contract',
127
+ runtimeOwner: 'src/export/package.builder + src/export/package.apply + src/export/package.zip + src/tooling/portable/package/runtime.package + src/app/handoffPackageImportCommand + canonical workspace lifecycle',
128
+ automatedChecks: ['src/export/package.builder.test.mjs', 'src/export/package.apply.test.mjs', 'src/export/package.zip.test.mjs', 'src/tooling/portable/package/runtime.package.test.mjs', 'src/app/handoffPackageImportCommand.test.mjs', 'src/acceptance/postV441M0FProductExecutionIntegration.test.mjs', 'src/acceptance/postV442M0FHandoffFreshnessArchiveScalingCorrection.test.mjs', 'src/workspaces/workspace.recoverabilityView.test.mjs', 'src/conformance/conformance.run.test.mjs'],
129
+ manualChecks: ['download and re-ingest one qualified Handoff package; confirm package controls/context, local bytes, source-reference descriptors, and ordinary Tree ZIP separation'],
130
+ failureResult: 'blocked/invalid operational package remains non-executable or fails closed; no remote mutation, no fake source leaves, and ordinary Tree ZIP is not reinterpreted as a package'
131
+ }),
132
+ scenario({
133
+ id: 'schema-capability-registry',
134
+ status: PoCParityStatus.partial,
135
+ legacyBehavior: 'Schema-specific capabilities are declared and queryable as portable contracts rather than being implied by React components or folder names.',
136
+ semanticOwner: 'schema module capability registry + root fallback resolution',
137
+ runtimeOwner: 'src/schemas/capability.registry + src/schemas/registry + conformance spine',
138
+ automatedChecks: ['src/schemas/capability.registry.test.mjs', 'src/conformance/conformance.run.test.mjs'],
139
+ manualChecks: ['none required for core registry; UI projection checks happen when surfaces consume it'],
140
+ failureResult: 'unknown schema resolves through root fallback; unavailable capabilities are explicit, not hidden no-ops'
141
+ }),
142
+
143
+ scenario({
144
+ id: 'artifact-creation-contracts',
145
+ status: PoCParityStatus.partial,
146
+ legacyBehavior: 'Continue, bounded Reference, Use-as, and standalone Create now exercise the canonical schema/Transition authoring spine without ad-hoc per-action Markdown in the UI; broader schema/action breadth remains non-final.' ,
147
+ semanticOwner: 'artifact creation contract + schema capability registry + root envelope',
148
+ runtimeOwner: 'src/schemas/creation.contracts + canonical Transition product preparation/planners + bounded schema materializers + conformance spine',
149
+ automatedChecks: ['src/schemas/creation.contracts.test.mjs', 'src/acceptance/postV431M0DCanonicalAuthoringParityClosure.test.mjs', 'src/acceptance/postV432M0DStandaloneCreateClosure.test.mjs', 'src/acceptance/postV434M0DDurableReferenceIntegrationClosure.test.mjs', 'src/conformance/conformance.run.test.mjs'],
150
+ manualChecks: ['create Continue/Reference/Use-as/root Create and inspect generated artifacts'],
151
+ failureResult: 'creation is blocked for unknown schemas; local draft remains source-free and reports validation findings'
152
+ }),
153
+
154
+ scenario({
155
+ id: 'storage-session-cache-policy',
156
+ status: PoCParityStatus.partial,
157
+ legacyBehavior: 'Local/draft/upload/generated deltas are durable local workspace state, while source material is transport/cache-owned and route/view shells are disposable. Quota pressure must prioritize preserving local work over cache convenience.',
158
+ semanticOwner: 'storage policy + split route/source-cache/local-delta authority',
159
+ runtimeOwner: 'src/storage/storage.policy + src/workspaces/workspace.persistence',
160
+ automatedChecks: ['src/storage/storage.policy.test.mjs', 'src/workspaces/workspace.persistence.test.mjs', 'src/workspaces/workspace.importLifecycle.test.mjs', 'src/conformance/conformance.run.test.mjs'],
161
+ manualChecks: ['refresh explicit #state route after local/archive and GitHub imports', 'simulate localStorage quota pressure and verify local-work failure is surfaced'],
162
+ failureResult: 'source-backed Markdown is metadata-only outside source transport; route cache may be discarded first; local-delta write failure emits explicit localMaterialAtRisk receipt'
163
+ }),
164
+ scenario({
165
+ id: 'source-transport-diagnostics',
166
+ status: PoCParityStatus.partial,
167
+ legacyBehavior: 'GitHub/API/cache/rate-limit transport states should be reported as explicit degraded diagnostics without becoming source truth or hidden retry behavior.',
168
+ semanticOwner: 'source transport diagnostics + transport policy + adapter diagnostics + recoverability view',
169
+ runtimeOwner: 'src/diagnostics/sourceTransport.report + src/sources/transport.policy + src/adapters/github + src/sources/github + recoverability view',
170
+ automatedChecks: ['src/diagnostics/sourceTransport.report.test.mjs', 'src/sources/transport.policy.test.mjs', 'src/sources/github/github.loader.test.mjs', 'src/adapters/github/github.adapter.test.mjs', 'src/conformance/conformance.run.test.mjs'],
171
+ manualChecks: ['register GitHub source under 403/rate-limit or bad file ref and inspect degraded diagnostics'],
172
+ failureResult: 'transport report/policy classifies rate-limit/not-found/unpinned/cache/budget states; no provenance inference and no hidden fetch/retry'
173
+ }),
174
+ scenario({
175
+ id: 'time-portal-source-snapshot',
176
+ status: PoCParityStatus.partial,
177
+ legacyBehavior: 'Display options preserves explicit Begin/End review intent, requires an explicit GitHub snapshot target, resolves named refs once to an immutable commit, and reviews that historical source separately from live/latest workspace truth.',
178
+ semanticOwner: 'workspace view temporal intent + exact source representation identity + read-only historical source projection',
179
+ runtimeOwner: 'src/workspaces/workspace.timePortal + src/app/timePortalSnapshotResolution + src/app/timePortalHistoricalRead + workspace Time Portal views',
180
+ automatedChecks: ['src/workspaces/workspace.timePortal.test.mjs', 'src/adapters/github/github.snapshotTarget.test.mjs', 'src/app/timePortalSnapshotResolution.test.mjs', 'src/app/timePortalHistoricalRead.test.mjs', 'src/app/timePortalRouteShare.test.mjs', 'src/acceptance/postV437M0ETimePortalProductParityClosure.test.mjs'],
181
+ manualChecks: ['Display options → Time Portal Begin/End → Resolve source snapshot', 'historical banner shows exact commit and Return to latest', 'Back/Forward and shared exact state restore selected historical snapshot without silently fetching on cold restore'],
182
+ failureResult: 'unresolved intent remains unresolved; invalid/unavailable snapshot remains explicit; live source/local drafts stay unchanged and no date is converted into a commit'
183
+ }),
184
+ scenario({
185
+ id: 'route-shell-material-boundaries',
186
+ status: PoCParityStatus.partial,
187
+ legacyBehavior: 'Share/session route should preserve workspace material boundaries and metadata without inventing unavailable content.',
188
+ semanticOwner: 'route shell + session cache boundary',
189
+ runtimeOwner: 'src/workspaces/workspace.route + src/workspaces/workspace.persistence',
190
+ automatedChecks: ['src/workspaces/workspace.route.test.mjs', 'src/workspaces/workspace.persistence.test.mjs'],
191
+ manualChecks: ['share/hash route in a fresh browser', 'refresh with cache', 'clean URL reset'],
192
+ failureResult: 'route-only material becomes material-unavailable shell; no false local/session content'
193
+ }),
194
+ scenario({
195
+ id: 'surface-registry-truth',
196
+ status: PoCParityStatus.partial,
197
+ legacyBehavior: 'PoC surfaces feel available only when their behavior is actually present; implemented current paths must not be mislabeled scaffold, while partial must still not be counted as final parity.',
198
+ semanticOwner: 'surface registry + explicit implementation status',
199
+ runtimeOwner: 'src/surfaces/registry + src/surfaces/contracts',
200
+ automatedChecks: ['src/surfaces/registry.test.mjs', 'src/conformance/conformance.run.test.mjs', 'src/acceptance/postV436M0EFIntegratedProductParityDiscovery.test.mjs'],
201
+ manualChecks: ['browser review of all eleven registered surface affordances across desktop/mobile'],
202
+ failureResult: 'implemented surface remains partial until final product proof; absent paths remain scaffold/unavailable rather than being promoted by label alone'
203
+ }),
204
+ scenario({
205
+ id: 'discovery-presentation-parity',
206
+ status: PoCParityStatus.partial,
207
+ legacyBehavior: 'Discovery should prioritize valuable Tiinex leaves, distinguish Display option ordering from filtering, preserve Feed/Tree return context when opening selected Lineage, project qualified schema identity in the Schema filter, keep Tree expansion stable, show source registration/materialization as distinct observable transitions, and keep selected Lineage separate from workspace-wide diagnostics.',
208
+ semanticOwner: 'workspace presentation read model + Display options contract + source/material boundary + selected lineage scope',
209
+ runtimeOwner: 'src/app/workspaceScopedInteraction + src/workspaces/workspace.displayFilters + src/workspaces/workspace.discoveryView + workspace views',
210
+ automatedChecks: ['tools/check-ui-shape.mjs', 'tools/check-uc001.mjs', 'src/app/workspaceScopedInteraction.test.mjs', 'src/workspaces/workspace.displayFilters.test.mjs', 'src/acceptance/postV427DiscoveryReturnContextSchemaFilterParityClosure.test.mjs'],
211
+ manualChecks: ['Feed shows leaves/work artifacts first', 'Tree → selected Lineage → Back restores Tree', 'Feed → selected Lineage → Back restores Feed', 'Schema filter lists only qualified schema identities, not markdown/supporting kind labels', 'Display options has Leaves only, Mismatches only, schema/artifact filters without clipping', 'Tree branches persist across view changes', 'GitHub register-only clearly says no loading is running', 'GitHub import shows accepted/loading/done receipt', 'Source Continue opens prefilled source context', 'Selected Lineage appears before collapsed workspace overview'],
212
+ failureResult: 'supporting docs remain preserved but do not dominate Discovery; source registration and source materialization are not confused; workspace diagnostics stay secondary to selected artifact status'
213
+ }),
214
+ scenario({
215
+ id: 'semantic-action-label-truth',
216
+ status: PoCParityStatus.partial,
217
+ legacyBehavior: 'Artifact labels and actions should not claim stronger evidence or different relations than the runtime can prove; Open/read, Lineage focus, byte/digest status, and Reference/Preserve relations remain distinct.',
218
+ semanticOwner: 'record actions + audit labels + lineage selected scope + parity ledger classifications',
219
+ runtimeOwner: 'src/actions/record.actions + workspace views + audit view + parity ledger',
220
+ automatedChecks: ['src/actions/record.actions.test.mjs', 'tools/check-ui-shape.mjs', 'tools/validate-static.mjs'],
221
+ manualChecks: ['Open reads artifact detail', 'Lineage focuses selected artifact', 'no byte ok label without digest evidence', 'Preserve evidence is not mistaken for old Reference'],
222
+ failureResult: 'status remains partial/wrong-port-suspected; UI uses evidence-honest wording rather than relabeling current behavior as PoC parity'
223
+ }),
224
+ scenario({
225
+ id: 'conformance-fixture-spine',
226
+ status: PoCParityStatus.partial,
227
+ legacyBehavior: 'A small normative corpus exercises parser, root fallback, lineage, audit, path tree, source boundary, and transitions consistently.',
228
+ semanticOwner: 'artifact/source/lineage/audit/transition conformance contract',
229
+ runtimeOwner: 'src/conformance/** plus current runtime modules',
230
+ automatedChecks: ['src/conformance/conformance.run.test.mjs'],
231
+ manualChecks: ['none required for fixture spine; it guards future visible loops'],
232
+ failureResult: 'fixture regression fails validation before a visual parity claim is made'
233
+ })
234
+ ])
235
+ });
236
+
237
+ export function summarizePoCParity(ledger = pocParityLedger) {
238
+ const counts = {};
239
+ for (const item of ledger.scenarios || []) counts[item.status] = (counts[item.status] || 0) + 1;
240
+ return {
241
+ schema: 'tiinex.poc.parity.summary.v1',
242
+ checkpoint: ledger.checkpoint,
243
+ total: (ledger.scenarios || []).length,
244
+ counts,
245
+ parity: counts[PoCParityStatus.parity] || 0,
246
+ notParity: (ledger.scenarios || []).filter((item) => item.status !== PoCParityStatus.parity).map((item) => item.id)
247
+ };
248
+ }
249
+
250
+ function scenario(input) {
251
+ return Object.freeze({
252
+ id: input.id,
253
+ status: input.status,
254
+ legacyBehavior: input.legacyBehavior,
255
+ semanticOwner: input.semanticOwner,
256
+ runtimeOwner: input.runtimeOwner,
257
+ automatedChecks: Object.freeze(input.automatedChecks || []),
258
+ manualChecks: Object.freeze(input.manualChecks || []),
259
+ failureResult: input.failureResult || ''
260
+ });
261
+ }
@@ -0,0 +1,247 @@
1
+ import assert from 'node:assert/strict';
2
+ import fs from 'node:fs';
3
+ import { buildPublicationPlan, buildPublicationResult } from '@tiinex/core/publication/publication.contract.js';
4
+ import { acceptPortablePublicationResult, planPortablePublication } from '@tiinex/core/tooling/portable/publication/runtime.publication.js';
5
+ import {
6
+ GITHUB_ISSUE_BODY_TARGET_KIND,
7
+ GITHUB_ISSUE_COMMENT_TARGET_KIND,
8
+ GITHUB_REPO_FILE_TARGET_KIND
9
+ } from '@tiinex/core/publication/publication.targetContract.js';
10
+ import { parseExactGithubIssueTarget } from '@tiinex/core/sources/github/github.issueTarget.js';
11
+
12
+ const markdown = `# Continuity Context
13
+
14
+ - Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
15
+ - Current
16
+ - Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
17
+ - Created At: 2026-08-19T00:00:00.000Z
18
+ - Summary: Publication draft
19
+ - Status: draft/local
20
+
21
+ ---
22
+
23
+ # Publication draft
24
+
25
+ # Continuity Integrity
26
+
27
+ - Draft Local Integrity
28
+ - Method: browser-local-draft
29
+ - Value: pending-publication-or-export
30
+ `;
31
+ const record = { id: 'draft-social', title: 'Draft', path: 'topics/draft.md', markdown, schemaId: 'tiinex.topic.v1', sourceMode: 'local-transition', source: { adapterId: 'local' } };
32
+ const workspace = { id: 'w-social', title: 'Social publication', records: [record], assets: [] };
33
+ const commit = 'a'.repeat(40);
34
+ const issue1 = 'https://github.com/Tiinex/docs/issues/1';
35
+ const issue2 = 'https://github.com/Tiinex/docs/issues/2';
36
+ const otherRepoIssue = 'https://github.com/Tiinex/site/issues/1';
37
+ const comment1 = `${issue1}#issuecomment-101`;
38
+ const comment2 = `${issue2}#issuecomment-202`;
39
+
40
+ const parsedIssue = parseExactGithubIssueTarget(issue1);
41
+ assert.equal(parsedIssue.ok, true);
42
+ assert.equal(parsedIssue.targetKind, GITHUB_ISSUE_BODY_TARGET_KIND);
43
+ assert.equal(parsedIssue.repository, 'Tiinex/docs');
44
+ assert.equal(parsedIssue.number, 1);
45
+ const parsedComment = parseExactGithubIssueTarget(comment1);
46
+ assert.equal(parsedComment.ok, true);
47
+ assert.equal(parsedComment.targetKind, GITHUB_ISSUE_COMMENT_TARGET_KIND);
48
+ assert.equal(parsedComment.commentId, '101');
49
+ assert.equal(parsedComment.issueTarget, issue1);
50
+
51
+ // Repo-file regression.
52
+ const repoPlan = plan({
53
+ mutationPolicy: 'create-or-fail',
54
+ destination: { provider: 'github', repository: 'Tiinex/docs', ref: 'main', path: '.topics/published.trace.md', targetKind: 'github-repo-file' }
55
+ });
56
+ assert.equal(repoPlan.status, 'ready');
57
+ assert.equal(repoPlan.destination.targetKind, GITHUB_REPO_FILE_TARGET_KIND);
58
+ const repoSuccess = result(repoPlan, {
59
+ sourceTarget: { adapterId: 'github', repo: 'Tiinex/docs', path: '.topics/published.trace.md', materializedCommit: commit, targetKind: 'github-repo-file' }
60
+ });
61
+ assert.equal(repoSuccess.status, 'success');
62
+ assert.equal(repoSuccess.remoteTarget.materializedCommit, commit);
63
+ assert.equal(repoSuccess.remoteTarget.immutability, 'immutable-materialized-commit');
64
+ assert.equal(repoSuccess.sourceBinding.mutability, 'immutable-materialized-representation');
65
+
66
+ const branchOnly = result(repoPlan, { sourceTarget: { adapterId: 'github', repo: 'Tiinex/docs', path: '.topics/published.trace.md', configuredRef: 'main', targetKind: 'github-repo-file' } });
67
+ assert.equal(branchOnly.status, 'failure');
68
+ assert.ok(branchOnly.findings.some((finding) => finding.code === 'publication.result.target.commit-missing'));
69
+
70
+ const repoPathMismatch = result(repoPlan, { sourceTarget: { adapterId: 'github', repo: 'Tiinex/docs', path: '.topics/other.trace.md', materializedCommit: commit, targetKind: 'github-repo-file' } });
71
+ assert.equal(repoPathMismatch.status, 'failure');
72
+ assert.ok(repoPathMismatch.findings.some((finding) => finding.code === 'publication.result.target.path-mismatch'));
73
+
74
+ const repoMismatch = result(repoPlan, { sourceTarget: { adapterId: 'github', repo: 'Tiinex/site', path: '.topics/published.trace.md', materializedCommit: commit, targetKind: 'github-repo-file' } });
75
+ assert.equal(repoMismatch.status, 'failure');
76
+ assert.ok(repoMismatch.findings.some((finding) => finding.code === 'publication.result.target.repo-mismatch'));
77
+
78
+ const repoWrongDigest = result(repoPlan, { verifiedPayloadSha256: '0'.repeat(64), sourceTarget: { adapterId: 'github', repo: 'Tiinex/docs', path: '.topics/published.trace.md', materializedCommit: commit, targetKind: 'github-repo-file' } });
79
+ assert.equal(repoWrongDigest.status, 'failure');
80
+ assert.ok(repoWrongDigest.findings.some((finding) => finding.code === 'publication.result.payload-verification.mismatch'));
81
+
82
+ // Issue body: create-new intent can be ready without materialized issue URL.
83
+ const createIssue = plan({
84
+ mutationPolicy: 'create-new',
85
+ destination: { provider: 'github', repository: 'Tiinex/docs', targetKind: GITHUB_ISSUE_BODY_TARGET_KIND }
86
+ });
87
+ assert.equal(createIssue.status, 'ready');
88
+ assert.equal(createIssue.destination.externalTarget, '');
89
+ assert.equal(createIssue.destination.path, '');
90
+ assert.equal(createIssue.destination.ref, '');
91
+
92
+ const createIssueWithoutResultTarget = result(createIssue, { sourceTarget: { adapterId: 'github', targetKind: GITHUB_ISSUE_BODY_TARGET_KIND } });
93
+ assert.equal(createIssueWithoutResultTarget.status, 'failure');
94
+ assert.equal(createIssueWithoutResultTarget.sourceBinding, null);
95
+
96
+ const createIssueSuccess = result(createIssue, { sourceTarget: { adapterId: 'github', inputTarget: issue1, targetKind: GITHUB_ISSUE_BODY_TARGET_KIND } });
97
+ assert.equal(createIssueSuccess.status, 'success');
98
+ assert.equal(createIssueSuccess.remoteTarget.inputTarget, issue1);
99
+ assert.equal(createIssueSuccess.remoteTarget.issueNumber, 1);
100
+ assert.equal(createIssueSuccess.remoteTarget.materializedCommit, '');
101
+ assert.equal(createIssueSuccess.remoteTarget.path, '');
102
+ assert.equal(createIssueSuccess.remoteTarget.mutability, 'mutable-remote-representation');
103
+ assert.equal(createIssueSuccess.sourceBinding.targetKind, GITHUB_ISSUE_BODY_TARGET_KIND);
104
+ assert.equal(createIssueSuccess.sourceBinding.mutability, 'mutable-remote-representation');
105
+
106
+ const createIssueWrongRepo = result(createIssue, { sourceTarget: { adapterId: 'github', inputTarget: otherRepoIssue, targetKind: GITHUB_ISSUE_BODY_TARGET_KIND } });
107
+ assert.equal(createIssueWrongRepo.status, 'failure');
108
+ assert.ok(createIssueWrongRepo.findings.some((finding) => finding.code === 'publication.result.target.repo-mismatch'));
109
+
110
+ const createIssueCommentAsBody = result(createIssue, { sourceTarget: { adapterId: 'github', inputTarget: comment1, targetKind: GITHUB_ISSUE_BODY_TARGET_KIND } });
111
+ assert.equal(createIssueCommentAsBody.status, 'failure');
112
+ assert.ok(createIssueCommentAsBody.findings.some((finding) => finding.code === 'publication.result.social-target.kind-mismatch'));
113
+
114
+ const updateIssueMissing = plan({
115
+ mutationPolicy: 'update-known',
116
+ destination: { provider: 'github', repository: 'Tiinex/docs', targetKind: GITHUB_ISSUE_BODY_TARGET_KIND }
117
+ });
118
+ assert.equal(updateIssueMissing.status, 'blocked');
119
+ assert.ok(updateIssueMissing.findings.some((finding) => finding.code === 'publication.plan.destination.issue-target-missing'));
120
+
121
+ const updateIssue = plan({
122
+ mutationPolicy: 'update-known',
123
+ destination: { provider: 'github', repository: 'Tiinex/docs', targetKind: GITHUB_ISSUE_BODY_TARGET_KIND, externalTarget: issue1 }
124
+ });
125
+ assert.equal(updateIssue.status, 'ready');
126
+ assert.equal(result(updateIssue, { sourceTarget: { inputTarget: issue2, targetKind: GITHUB_ISSUE_BODY_TARGET_KIND } }).status, 'failure');
127
+ assert.equal(result(updateIssue, { sourceTarget: { inputTarget: issue1, targetKind: GITHUB_ISSUE_BODY_TARGET_KIND } }).status, 'success');
128
+
129
+ const missingTargetKind = plan({
130
+ mutationPolicy: 'create-new',
131
+ destination: { provider: 'github', repository: 'Tiinex/docs' }
132
+ });
133
+ assert.equal(missingTargetKind.status, 'blocked');
134
+ assert.ok(missingTargetKind.findings.some((finding) => finding.code === 'publication.plan.destination.target-kind-missing'));
135
+
136
+ const issueWrongDigest = result(createIssue, { verifiedPayloadSha256: 'f'.repeat(64), sourceTarget: { inputTarget: issue1, targetKind: GITHUB_ISSUE_BODY_TARGET_KIND } });
137
+ assert.equal(issueWrongDigest.status, 'failure');
138
+
139
+ // Issue comment: parent issue intent known before final comment exists.
140
+ const createComment = plan({
141
+ mutationPolicy: 'create-comment',
142
+ destination: { provider: 'github', repository: 'Tiinex/docs', targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND, containerTarget: issue1 }
143
+ });
144
+ assert.equal(createComment.status, 'ready');
145
+ assert.equal(createComment.destination.externalTarget, '');
146
+ assert.equal(createComment.destination.containerTarget, issue1);
147
+
148
+ const commentWithoutPermalink = result(createComment, { sourceTarget: { adapterId: 'github', targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND } });
149
+ assert.equal(commentWithoutPermalink.status, 'failure');
150
+ assert.equal(commentWithoutPermalink.sourceBinding, null);
151
+
152
+ const commentSuccess = result(createComment, { sourceTarget: { adapterId: 'github', inputTarget: comment1, targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND } });
153
+ assert.equal(commentSuccess.status, 'success');
154
+ assert.equal(commentSuccess.remoteTarget.inputTarget, comment1);
155
+ assert.equal(commentSuccess.remoteTarget.containerTarget, issue1);
156
+ assert.equal(commentSuccess.remoteTarget.commentId, '101');
157
+ assert.equal(commentSuccess.remoteTarget.materializedCommit, '');
158
+ assert.equal(commentSuccess.remoteTarget.path, '');
159
+
160
+ const portableCommentPlan = planPortablePublication({
161
+ workspace,
162
+ recordId: record.id,
163
+ mutationPolicy: 'create-comment',
164
+ destination: { provider: 'github', repository: 'Tiinex/docs', targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND, containerTarget: issue1 }
165
+ });
166
+ assert.equal(portableCommentPlan.status, 'ready');
167
+ const portableCommentResult = acceptPortablePublicationResult({
168
+ plan: portableCommentPlan,
169
+ execution: {
170
+ state: 'success',
171
+ verificationStatus: 'verified',
172
+ verifiedPayloadSha256: portableCommentPlan.plan.outboundPayload.sha256,
173
+ sourceTarget: { adapterId: 'github', inputTarget: comment1, targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND }
174
+ }
175
+ });
176
+ assert.equal(portableCommentResult.status, 'success');
177
+ assert.equal(portableCommentResult.qualification.exactSourceBinding, true);
178
+ assert.equal(portableCommentResult.qualification.bindingMutability, 'mutable-remote-representation');
179
+ assert.equal(portableCommentResult.qualification.immutableSourceBinding, false);
180
+ assert.equal(portableCommentResult.qualification.durableSourceBinding, false);
181
+
182
+ const commentDifferentIssue = result(createComment, { sourceTarget: { inputTarget: comment2, targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND } });
183
+ assert.equal(commentDifferentIssue.status, 'failure');
184
+ assert.ok(commentDifferentIssue.findings.some((finding) => finding.code === 'publication.result.social-target.container-mismatch'));
185
+
186
+ const commentDifferentRepo = result(createComment, { sourceTarget: { inputTarget: 'https://github.com/Tiinex/site/issues/1#issuecomment-101', targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND } });
187
+ assert.equal(commentDifferentRepo.status, 'failure');
188
+ assert.ok(commentDifferentRepo.findings.some((finding) => finding.code === 'publication.result.target.repo-mismatch'));
189
+
190
+ const issueBodyAsComment = result(createComment, { sourceTarget: { inputTarget: issue1, targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND } });
191
+ assert.equal(issueBodyAsComment.status, 'failure');
192
+ assert.ok(issueBodyAsComment.findings.some((finding) => finding.code === 'publication.result.social-target.kind-mismatch'));
193
+
194
+ const commentWrongDigest = result(createComment, { verifiedPayloadSha256: 'e'.repeat(64), sourceTarget: { inputTarget: comment1, targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND } });
195
+ assert.equal(commentWrongDigest.status, 'failure');
196
+
197
+ // Architect v443 exact-source-binding reproductions: unsupported observations must never be promoted into exact comment permalinks.
198
+ for (const unsupportedObservation of [
199
+ 'https://evil.github.com/Tiinex/docs/issues/1#issuecomment-123',
200
+ 'https://github.com/Tiinex/docs/issues/1?x=issues/comments/123',
201
+ 'https://github.com/Tiinex/docs/issues/1/comment-123'
202
+ ]) {
203
+ const hardened = result(createComment, {
204
+ sourceTarget: { adapterId: 'github', inputTarget: unsupportedObservation, targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND }
205
+ });
206
+ assert.equal(hardened.status, 'failure', `unsupported observation must not qualify publication success: ${unsupportedObservation}`);
207
+ assert.equal(hardened.sourceBinding, null, `unsupported observation must not create a source binding: ${unsupportedObservation}`);
208
+ assert.ok(hardened.findings.some((finding) => finding.code === 'publication.result.social-target.invalid'), `exact social-target invalid finding required: ${unsupportedObservation}`);
209
+ assert.equal(hardened.remoteTarget.inputTarget, unsupportedObservation, 'failure evidence should preserve the supplied unsupported observation instead of manufacturing a different valid permalink');
210
+ }
211
+
212
+ const updateCommentMissing = plan({
213
+ mutationPolicy: 'update-known',
214
+ destination: { provider: 'github', repository: 'Tiinex/docs', targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND, containerTarget: issue1 }
215
+ });
216
+ assert.equal(updateCommentMissing.status, 'blocked');
217
+ assert.ok(updateCommentMissing.findings.some((finding) => finding.code === 'publication.plan.destination.comment-target-missing'));
218
+
219
+ const updateComment = plan({
220
+ mutationPolicy: 'update-known',
221
+ destination: { provider: 'github', repository: 'Tiinex/docs', targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND, containerTarget: issue1, externalTarget: comment1 }
222
+ });
223
+ assert.equal(updateComment.status, 'ready');
224
+ assert.equal(result(updateComment, { sourceTarget: { inputTarget: comment1, targetKind: GITHUB_ISSUE_COMMENT_TARGET_KIND } }).status, 'success');
225
+
226
+ // Planning/result remain side-effect free and host-neutral.
227
+ assert.equal(workspace.records[0].source.adapterId, 'local');
228
+ const contractSource = fs.readFileSync(new URL('./publication.contract.js', import.meta.url), 'utf8');
229
+ const targetSource = fs.readFileSync(new URL('./publication.targetContract.js', import.meta.url), 'utf8');
230
+ assert.doesNotMatch(contractSource + targetSource, /\bfetch\s*\(/);
231
+ assert.doesNotMatch(contractSource + targetSource, /\b(token|oauth|authorization)\b/i);
232
+ assert.doesNotMatch(contractSource + targetSource, /TiinexApp|react/i);
233
+
234
+ console.log('publication.githubSocialContract: PASS');
235
+
236
+ function plan(input) {
237
+ return buildPublicationPlan(workspace, { recordId: record.id, ...input });
238
+ }
239
+
240
+ function result(planValue, overrides = {}) {
241
+ return buildPublicationResult(planValue, {
242
+ state: 'success',
243
+ verificationStatus: 'verified',
244
+ verifiedPayloadSha256: planValue.outboundPayload.sha256,
245
+ ...overrides
246
+ });
247
+ }
@@ -0,0 +1,64 @@
1
+ import assert from 'node:assert/strict';
2
+ import { buildPublicationPreflight } from '@tiinex/core/publication/publication.preflight.js';
3
+
4
+ const validDraftMarkdown = `# Continuity Context
5
+
6
+ - Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
7
+ - Current
8
+ - Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
9
+ - Created At: 2026-07-21T00:00:00.000Z
10
+ - Summary: Draft
11
+ - Status: draft/local
12
+
13
+ ---
14
+
15
+ # Draft
16
+
17
+ # Continuity Integrity
18
+
19
+ - Draft Local Integrity
20
+ - Method: browser-local-draft
21
+ - Value: pending-publication-or-export
22
+ `;
23
+
24
+ const ready = buildPublicationPreflight({
25
+ id: 'w-ready',
26
+ title: 'Ready',
27
+ sources: [{ id: 'local', adapterId: 'local' }],
28
+ records: [{ id: 'draft-1', title: 'Draft', path: 'drafts/draft.md', markdown: validDraftMarkdown, source: { adapterId: 'local' }, sourceMode: 'local-transition' }],
29
+ assets: []
30
+ });
31
+ assert.equal(ready.status, 'ready');
32
+ assert.equal(ready.counts.publishableLocalDrafts, 1);
33
+ assert.equal(ready.counts.errors, 0);
34
+ assert.equal(ready.counts.sourceReferences, 0);
35
+
36
+ const mixed = buildPublicationPreflight({
37
+ id: 'w-mixed',
38
+ title: 'Mixed',
39
+ sources: [{ id: 'local', adapterId: 'local' }, { id: 'github:tiinex/docs', adapterId: 'github', repo: 'Tiinex/docs', ref: '' }],
40
+ records: [
41
+ { id: 'plain', title: 'Plain', path: 'plain.md', markdown: '# Plain', source: { adapterId: 'local' }, sourceMode: 'local-files' },
42
+ { id: 'gh', title: 'GitHub', path: 'topics/source.md', markdown: validDraftMarkdown, source: { adapterId: 'github', repo: 'Tiinex/docs', ref: '' } }
43
+ ],
44
+ assets: [{ id: 'large', path: 'assets/large.bin', previewState: 'omitted-large', source: { adapterId: 'local' } }],
45
+ workspaceMergeCandidates: [{ id: 'wc', path: 'workspace.workspace.md' }]
46
+ });
47
+ assert.equal(mixed.status, 'blocked');
48
+ assert.equal(mixed.counts.publishableLocalDrafts, 0);
49
+ assert.equal(mixed.counts.blockedLocalDrafts, 1);
50
+ assert.equal(mixed.counts.sourceReferences, 1);
51
+ assert.ok(mixed.findings.some((finding) => finding.code === 'publication.local-record.missing-envelope-schema'));
52
+ assert.ok(mixed.findings.some((finding) => finding.code === 'publication.source-reference.ref-unpinned'));
53
+ assert.ok(mixed.findings.some((finding) => finding.code === 'publication.asset.metadata-only'));
54
+ assert.ok(mixed.findings.some((finding) => finding.code === 'publication.workspace-candidate.reference-only'));
55
+
56
+ const leaked = buildPublicationPreflight({
57
+ id: 'w-leaked',
58
+ sources: [{ id: 'local', adapterId: 'local', repo: 'Tiinex/docs' }],
59
+ records: [{ id: 'local-leak', title: 'Leak', path: 'leak.md', markdown: validDraftMarkdown, source: { adapterId: 'local', repo: 'Tiinex/docs' } }]
60
+ });
61
+ assert.equal(leaked.status, 'blocked');
62
+ assert.ok(leaked.findings.some((finding) => finding.code === 'record.local.github-provenance-leak'));
63
+
64
+ console.log('publication.preflight: ok');
@@ -0,0 +1,39 @@
1
+ import React, { useMemo, useState, useRef, useEffect } from 'react';
2
+ import { createTiinexApplicationRuntime } from '../runtime.js';
3
+ import { TiinexApplicationRuntimeProvider } from './applicationDataContext.jsx';
4
+ import { VerseHost } from './VerseHost.jsx';
5
+ import { TiinexApp } from '../app/TiinexApp.jsx';
6
+
7
+ /** Host-owned composition. Workspace files never become executable Verse code. */
8
+ export function TiinexApplication({ config = {} }) {
9
+ const [runtime] = useState(() => createTiinexApplicationRuntime(config));
10
+ const [verseId, setVerseId] = useState('viewer');
11
+ const [immersive, setImmersive] = useState(false);
12
+ const stage = useRef(null);
13
+ const leaveFullscreen = () => { if (document.fullscreenElement === stage.current) void document.exitFullscreen().catch(() => {}); };
14
+ useEffect(() => () => leaveFullscreen(), []);
15
+ const host = useMemo(() => Object.freeze({
16
+ deploymentId: config.deploymentId || 'custom',
17
+ exitVerse: () => { leaveFullscreen(); setImmersive(false); setVerseId('viewer'); },
18
+ switchVerse: (id) => { if (id !== 'viewer' && !runtime.verses.has(id)) throw new Error('Unknown Verse'); leaveFullscreen(); setImmersive(false); setVerseId(id); },
19
+ setImmersive: (value) => setImmersive(Boolean(value)),
20
+ requestFullscreen: async () => { const target = stage.current; if (!target?.requestFullscreen) return false; await target.requestFullscreen(); return true; },
21
+ readCompanion: runtime.readCompanion
22
+ }), [runtime, config.deploymentId]);
23
+ return <TiinexApplicationRuntimeProvider runtime={runtime}>
24
+ {(!immersive || verseId === 'viewer') && runtime.verses.list().length > 0 && <nav aria-label="Tiinex Verses" className="tiinex-verse-switcher">
25
+ <label>View <select value={verseId} onChange={(e) => host.switchVerse(e.target.value)}>
26
+ <option value="viewer">Viewer</option>
27
+ {runtime.verses.list().map(v => <option key={v.id} value={v.id}>{v.label}</option>)}
28
+ </select></label>
29
+ </nav>}
30
+ {/* The Viewer owns the existing intake controller. Hiding, not destroying it,
31
+ retains loaded sources while another Verse consumes the App data store. */}
32
+ <div hidden={verseId !== 'viewer'} inert={verseId !== 'viewer'}><TiinexApp initialWorkspaces={config.workspaces || []} /></div>
33
+ {verseId !== 'viewer' && <section ref={stage} id="tiinex-verse-stage">
34
+ <button type="button" onClick={host.exitVerse} aria-label="Exit Verse">Back to Viewer</button>
35
+ <VerseHost verseId={verseId} registry={runtime.verses} host={host}
36
+ fallback={state => <p role="status">{state.status === 'loading' ? 'Opening view…' : 'This view could not be opened. Return to Viewer or retry.'}</p>} />
37
+ </section>}
38
+ </TiinexApplicationRuntimeProvider>;
39
+ }