@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,298 @@
1
+ import assert from 'node:assert/strict';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { createRecordFromMarkdown } from '@tiinex/core/artifacts/artifact.record.js';
4
+ import { sealC14nV2Self, validatedC14nV2PrimarySelfDigest } from '@tiinex/core/integrity/integrity.c14nV2.js';
5
+ import { runPortableOperation } from '@tiinex/core/tooling/portable/operation.catalog.js';
6
+ import { runPortableCli } from '@tiinex/core/tooling/portable/adapters/cli/cli.run.js';
7
+ import { preflightPortableReduction } from '@tiinex/core/tooling/portable/reduction/reduction.preflight.js';
8
+
9
+ const COMMIT = 'de31f58569550819d89f63dcfbe1abfdfe815ab7';
10
+ const OTHER_COMMIT = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
11
+ const leafPath = '001-1-1-1-1-loom-to-anchor-validation-checkpoint-efficiency-return-handoff.trace.md';
12
+ const parentPath = '001-1-1-1-loom-validation-checkpoint-efficiency-implementation-evidence.trace.md';
13
+ const placementPath = '022-reduction-composition-destructive-eligibility-recovery.task.trace.md';
14
+ const reductionPath = 'reduction-preflight-regression.trace.md';
15
+ const [leafMarkdown, parentMarkdown, placementMarkdown] = await Promise.all([
16
+ readFile(`.topics/tooling/${leafPath}`, 'utf8'),
17
+ readFile(`.topics/tooling/${parentPath}`, 'utf8'),
18
+ readFile(`.topics/tooling/${placementPath}`, 'utf8')
19
+ ]);
20
+ const leafRecord = createRecordFromMarkdown(leafMarkdown, { path: leafPath, sourceMode: 'portable-local' });
21
+ const parentRecord = createRecordFromMarkdown(parentMarkdown, { path: parentPath, sourceMode: 'portable-local' });
22
+ const placementRecord = createRecordFromMarkdown(placementMarkdown, { path: placementPath, sourceMode: 'portable-local' });
23
+ const parentDigest = verifiedDigest(parentMarkdown);
24
+ const placementDigest = verifiedDigest(placementMarkdown);
25
+ const baseReductionMarkdown = sealedReduction({ path: reductionPath, placementPath: parentPath, placementSchema: parentRecord.schemaId, placementDigest: parentDigest, entries: [entry(leafPath, parentPath)] });
26
+ const baseReductionRecord = record(baseReductionMarkdown, reductionPath);
27
+ const baseRecords = [parentRecord, leafRecord, baseReductionRecord];
28
+
29
+ const baseInput = (overrides = {}) => ({
30
+ records: baseRecords,
31
+ candidateSet: [{ path: leafPath, action: 'delete', repository: 'Tiinex/site' }],
32
+ reductionArtifactPath: reductionPath,
33
+ immutableSources: [source(leafPath), source(parentPath)],
34
+ snapshots: [snapshot('Tiinex/site', COMMIT)],
35
+ currentnessFacts: [currentness(leafPath, 'closed')],
36
+ lossFacts: [loss(reductionPath, 'none')],
37
+ ...overrides
38
+ });
39
+
40
+ // Ordinary Reduction remains observable composition/recovery only. Destructive eligibility is a separate surface.
41
+ const ordinary = preflightPortableReduction({ records: baseRecords, reductionArtifactPath: reductionPath, immutableSources: [source(leafPath), source(parentPath)], lossFacts: [loss(reductionPath, 'none')] });
42
+ assert.equal(ordinary.status, 'projection-qualified');
43
+ assert.equal(ordinary.composition.state, 'qualified');
44
+ assert.equal(ordinary.eligibility.state, 'not-requested');
45
+ assert.equal(ordinary.destructiveEligible, false);
46
+ assert.equal(ordinary.boundary.ordinaryReductionAuthoritySeparate, true);
47
+ assert.equal(ordinary.boundary.destructiveApplyImplemented, false);
48
+ assert.equal(ordinary.boundary.sourceMutation, false);
49
+
50
+ // Exact candidate set + exact snapshots + normalized currentness + immutable Parent closure qualifies locally.
51
+ const qualified = preflightPortableReduction(baseInput());
52
+ assert.equal(qualified.status, 'preflight-qualified');
53
+ assert.equal(qualified.eligibility.state, 'eligible');
54
+ assert.equal(qualified.destructiveEligible, true);
55
+ assert.equal(qualified.eligibility.leafEntrypoints[0].parentSpan.state, 'qualified');
56
+ assert.deepEqual(qualified.eligibility.leafEntrypoints[0].parentSpan.path, [leafPath, parentPath]);
57
+ assert.equal(qualified.eligibility.leafEntrypoints[0].parentSpan.crossRepository, false);
58
+ assert.match(qualified.eligibility.receipt.inputFingerprint, /^[0-9a-f]{64}$/);
59
+ assert.equal(qualified.eligibility.receipt.reusableOnlyForExactBoundInputs, true);
60
+
61
+ // Any exact bound input change invalidates a prior receipt.
62
+ const changedReductionMarkdown = sealedReduction({ path: reductionPath, placementPath: parentPath, placementSchema: parentRecord.schemaId, placementDigest: parentDigest, entries: [entry(leafPath, parentPath)], summary: 'Changed exact Reduction bytes.' });
63
+ const changedReduction = preflightPortableReduction(baseInput({ records: [parentRecord, leafRecord, record(changedReductionMarkdown, reductionPath)], priorReceipt: qualified.eligibility.receipt }));
64
+ assert(hasCode(changedReduction.eligibility.blockers, 'receipt-input-fingerprint-mismatch'));
65
+
66
+ const changedAction = preflightPortableReduction(baseInput({ candidateSet: [{ path: leafPath, action: 'retain', repository: 'Tiinex/site' }], priorReceipt: qualified.eligibility.receipt }));
67
+ assert.equal(changedAction.eligibility.state, 'blocked');
68
+ assert(hasCode(changedAction.eligibility.blockers, 'reduction-leaf-retained-by-candidate-set'));
69
+ assert(hasCode(changedAction.eligibility.blockers, 'receipt-input-fingerprint-mismatch'));
70
+
71
+ const changedPreimage = preflightPortableReduction(baseInput({ candidateSet: [{ path: leafPath, action: 'delete', repository: 'Tiinex/site', expectedDigest: '0'.repeat(64) }] }));
72
+ assert.equal(changedPreimage.eligibility.state, 'blocked');
73
+ assert(hasCode(changedPreimage.eligibility.blockers, 'candidate-preimage-mismatch'));
74
+
75
+ const changedSnapshot = preflightPortableReduction(baseInput({ snapshots: [snapshot('Tiinex/site', OTHER_COMMIT)], priorReceipt: qualified.eligibility.receipt }));
76
+ assert(hasCode(changedSnapshot.eligibility.blockers, 'receipt-input-fingerprint-mismatch'));
77
+ assert(hasCode(changedSnapshot.eligibility.missingEvidence, 'parent-hop-snapshot-ref-mismatch'));
78
+
79
+ // Semantic/transport/fixture ambiguity fails closed, as does a required fixture deletion.
80
+ const ambiguousKind = preflightPortableReduction(baseInput({ candidateSet: [{ path: 'mystery-material.bin', action: 'delete' }] }));
81
+ assert.equal(ambiguousKind.eligibility.state, 'blocked');
82
+ assert(hasCode(ambiguousKind.eligibility.ambiguities, 'candidate-classification-unresolved'));
83
+
84
+ const fixtureDelete = preflightPortableReduction(baseInput({ candidateSet: [{ path: 'fixtures/required.fixture.trace.md', action: 'delete', classification: 'fixture', classificationQualification: 'qualified', classificationBasis: 'fixture manifest says required', fixtureRequired: true }] }));
85
+ assert.equal(fixtureDelete.eligibility.state, 'blocked');
86
+ assert(hasCode(fixtureDelete.eligibility.blockers, 'fixture-required-deletion'));
87
+
88
+ // Every disappearing semantic artifact must be covered by exact Reduction leaf spans.
89
+ const uncovered = preflightPortableReduction(baseInput({
90
+ records: [parentRecord, leafRecord, placementRecord, baseReductionRecord],
91
+ candidateSet: [
92
+ { path: leafPath, action: 'delete', repository: 'Tiinex/site' },
93
+ { path: placementPath, action: 'delete', repository: 'Tiinex/site' }
94
+ ],
95
+ immutableSources: [source(leafPath), source(parentPath), source(placementPath)],
96
+ currentnessFacts: [currentness(leafPath, 'closed'), currentness(placementPath, 'closed')]
97
+ }));
98
+ assert.equal(uncovered.eligibility.state, 'blocked');
99
+ assert(hasCode(uncovered.eligibility.blockers, 'uncovered-disappearing-semantic-artifact') || hasCode(uncovered.eligibility.blockers, 'disappearing-leaf-declaration-missing'));
100
+
101
+ // Lifecycle/currentness is normalized evidence only: closed clears, operative blocks, unresolved stays unresolved.
102
+ const operative = preflightPortableReduction(baseInput({ currentnessFacts: [currentness(leafPath, 'operative')] }));
103
+ assert.equal(operative.eligibility.state, 'blocked');
104
+ assert(hasCode(operative.eligibility.blockers, 'operative-obligation-disappearing'));
105
+
106
+ const unresolvedCurrentness = preflightPortableReduction(baseInput({ currentnessFacts: [{ target: leafPath, state: 'mystery', currentness: 'current', qualification: 'qualified', basis: 'qualified source does not resolve operative state' }] }));
107
+ assert.equal(unresolvedCurrentness.eligibility.state, 'unresolved');
108
+ assert(hasCode(unresolvedCurrentness.eligibility.ambiguities, 'currentness-state-unresolved'));
109
+
110
+ const unqualifiedCurrentness = preflightPortableReduction(baseInput({ currentnessFacts: [{ target: leafPath, state: 'closed', currentness: 'historical', qualification: 'qualified', basis: 'stale fact' }] }));
111
+ assert.equal(unqualifiedCurrentness.eligibility.state, 'unresolved');
112
+ assert(hasCode(unqualifiedCurrentness.eligibility.ambiguities, 'currentness-evidence-unqualified'));
113
+
114
+ const reissued = preflightPortableReduction(baseInput({ currentnessFacts: [currentness(leafPath, 'operative', { qualification: 'qualified', basis: 'qualified explicit reissue', survivingArtifact: parentPath, mapping: 'same obligation is carried by surviving parent' })] }));
115
+ assert.equal(reissued.eligibility.state, 'eligible');
116
+ assert.equal(reissued.eligibility.leafEntrypoints[0].reissue.qualified, true);
117
+
118
+ // Placement Parent is continuity placement, not the historical closure endpoint.
119
+ const distinctPlacementMarkdown = sealedReduction({ path: reductionPath, placementPath, placementSchema: placementRecord.schemaId, placementDigest, entries: [entry(leafPath, parentPath)] });
120
+ const distinctPlacement = preflightPortableReduction(baseInput({ records: [parentRecord, leafRecord, placementRecord, record(distinctPlacementMarkdown, reductionPath)] }));
121
+ assert.equal(distinctPlacement.eligibility.state, 'eligible');
122
+ assert.equal(distinctPlacement.eligibility.reduction.placementParent, placementPath);
123
+ assert.equal(distinctPlacement.eligibility.leafEntrypoints[0].historicalClosureEndpoint, parentPath);
124
+ assert.notEqual(distinctPlacement.eligibility.reduction.placementParent, distinctPlacement.eligibility.leafEntrypoints[0].historicalClosureEndpoint);
125
+
126
+ // Cross-repository Parent closure is first-class when every hop is exact and immutable.
127
+ const businessBoundary = 'business-major-011-historical-closure.trace.md';
128
+ const detachedLeaf = Object.freeze({ ...leafRecord, trace: '' });
129
+ const crossReductionMarkdown = sealedReduction({ path: reductionPath, placementPath: parentPath, placementSchema: parentRecord.schemaId, placementDigest: parentDigest, entries: [entry(leafPath, businessBoundary)] });
130
+ const crossRepo = preflightPortableReduction({
131
+ records: [parentRecord, detachedLeaf, record(crossReductionMarkdown, reductionPath)],
132
+ candidateSet: [{ path: leafPath, action: 'delete', repository: 'Tiinex/site' }],
133
+ reductionArtifactPath: reductionPath,
134
+ immutableSources: [source(leafPath)],
135
+ parentProofs: [{ kind: 'parent', qualification: 'qualified', basis: 'qualified immutable cross-repository Parent edge', child: leafPath, parent: businessBoundary, childLocator: source(leafPath), parentLocator: source(businessBoundary, 'Tiinex/business', OTHER_COMMIT) }],
136
+ closureEndpoints: [{ path: businessBoundary, ...source(businessBoundary, 'Tiinex/business', OTHER_COMMIT) }],
137
+ snapshots: [snapshot('Tiinex/site', COMMIT), snapshot('Tiinex/business', OTHER_COMMIT)],
138
+ currentnessFacts: [currentness(leafPath, 'closed')],
139
+ lossFacts: [loss(reductionPath, 'none')]
140
+ });
141
+ assert.equal(crossRepo.eligibility.state, 'eligible');
142
+ assert.equal(crossRepo.eligibility.leafEntrypoints[0].parentSpan.crossRepository, true);
143
+ assert.deepEqual([...crossRepo.eligibility.leafEntrypoints[0].parentSpan.repositories].sort(), ['Tiinex/business', 'Tiinex/site']);
144
+
145
+ const missingHopSource = preflightPortableReduction(baseInput({ immutableSources: [source(leafPath)] }));
146
+ assert.equal(missingHopSource.eligibility.state, 'unresolved');
147
+ assert(hasCode(missingHopSource.eligibility.missingEvidence, 'parent-hop-immutable-source-unresolved'));
148
+
149
+ const alternateBoundary = 'alternate-surviving-boundary.trace.md';
150
+ const ambiguousParent = preflightPortableReduction({
151
+ ...baseInput(),
152
+ records: [parentRecord, detachedLeaf, baseReductionRecord],
153
+ parentProofs: [
154
+ proof(leafPath, parentPath, 'Tiinex/site', COMMIT),
155
+ proof(leafPath, alternateBoundary, 'Tiinex/site', COMMIT)
156
+ ],
157
+ immutableSources: [source(leafPath), source(parentPath), source(alternateBoundary)],
158
+ closureEndpoints: [{ path: alternateBoundary, ...source(alternateBoundary) }]
159
+ });
160
+ assert.equal(ambiguousParent.eligibility.state, 'unresolved');
161
+ assert(hasCode(ambiguousParent.eligibility.ambiguities, 'parent-hop-ambiguous'));
162
+
163
+ // Reduction-of-Reductions expands only through explicit Source Context edges and independently audits every hop.
164
+ const dailyPath = 'reduction-daily-regression.trace.md';
165
+ const monthlyPath = 'reduction-monthly-regression.trace.md';
166
+ const yearlyPath = 'reduction-yearly-regression.trace.md';
167
+ const dailyMarkdown = sealedReduction({ path: dailyPath, placementPath: parentPath, placementSchema: parentRecord.schemaId, placementDigest: parentDigest, sourcePath: leafPath, summary: 'Synthetic observable reduction daily.' });
168
+ const dailyRecord = record(dailyMarkdown, dailyPath);
169
+ const monthlyMarkdown = sealedReduction({ path: monthlyPath, placementPath: parentPath, placementSchema: parentRecord.schemaId, placementDigest: parentDigest, sourcePath: dailyPath, summary: 'Synthetic observable reduction monthly.' });
170
+ const monthlyRecord = record(monthlyMarkdown, monthlyPath);
171
+ const yearlyMarkdown = sealedReduction({ path: yearlyPath, placementPath: parentPath, placementSchema: parentRecord.schemaId, placementDigest: parentDigest, sourcePath: monthlyPath, summary: 'Synthetic observable reduction yearly.' });
172
+ const yearlyRecord = record(yearlyMarkdown, yearlyPath);
173
+ const hierarchyRecords = [parentRecord, leafRecord, dailyRecord, monthlyRecord, yearlyRecord];
174
+ const hierarchyInput = {
175
+ records: hierarchyRecords,
176
+ reductionArtifactPath: yearlyPath,
177
+ immutableSources: [source(leafPath), source(dailyPath), source(monthlyPath), source(yearlyPath)],
178
+ lossFacts: [loss(dailyPath, 'none'), loss(monthlyPath, 'none'), loss(yearlyPath, 'none')]
179
+ };
180
+ const hierarchy = preflightPortableReduction(hierarchyInput);
181
+ assert.equal(hierarchy.status, 'projection-qualified');
182
+ assert.equal(hierarchy.composition.state, 'qualified');
183
+ assert.equal(hierarchy.composition.hops.length, 3);
184
+ assert.deepEqual(hierarchy.composition.hops.map((hop) => `${hop.from}->${hop.to}`), [`${dailyPath}->${leafPath}`, `${monthlyPath}->${dailyPath}`, `${yearlyPath}->${monthlyPath}`]);
185
+ assert.equal(hierarchy.composition.expansion.state, 'qualified-navigation');
186
+ assert.equal(preflightPortableReduction(hierarchyInput).composition.fingerprint, hierarchy.composition.fingerprint, 'composition expansion must be deterministic');
187
+
188
+ const knownLoss = preflightPortableReduction({ ...hierarchyInput, lossFacts: [loss(dailyPath, 'known-irrecoverable'), loss(monthlyPath, 'none'), loss(yearlyPath, 'none')] });
189
+ assert.equal(knownLoss.composition.state, 'qualified-with-known-loss');
190
+ assert.equal(knownLoss.composition.expansion.state, 'known-loss');
191
+ assert(knownLoss.composition.lossAndUncertainty.knownIrrecoverable.some((item) => item.target === dailyPath));
192
+ assert(!knownLoss.composition.nodes.some((node) => node.path === 'fabricated-recovery.trace.md'));
193
+
194
+ const inheritedUnresolved = preflightPortableReduction({ ...hierarchyInput, lossFacts: [loss(dailyPath, 'none'), loss(monthlyPath, 'unresolved'), loss(yearlyPath, 'none')] });
195
+ assert.equal(inheritedUnresolved.composition.state, 'unresolved');
196
+ assert(hasCode(inheritedUnresolved.composition.ambiguities, 'reduction-loss-unresolved'));
197
+
198
+ const corruptedDaily = Object.freeze({ ...dailyRecord, hasIntegrity: false });
199
+ const downstreamCannotRepair = preflightPortableReduction({ ...hierarchyInput, records: [parentRecord, leafRecord, corruptedDaily, monthlyRecord, yearlyRecord] });
200
+ assert.equal(downstreamCannotRepair.composition.state, 'unresolved');
201
+ assert(hasCode(downstreamCannotRepair.composition.missingEvidence, 'upstream-reduction-unqualified'));
202
+ assert.equal(downstreamCannotRepair.composition.boundary.downstreamValidationRepairsUpstream, false);
203
+
204
+ // Post-apply is a separate simulation boundary and never mutates source or retroactively repairs qualification.
205
+ const postApplyMismatch = preflightPortableReduction(baseInput({ postApply: { actualCandidateSet: [{ path: leafPath, action: 'retain', repository: 'Tiinex/site' }] } }));
206
+ assert.equal(postApplyMismatch.eligibility.state, 'eligible');
207
+ assert.equal(postApplyMismatch.eligibility.postApply.state, 'mismatch');
208
+ assert.equal(postApplyMismatch.eligibility.postApply.sourceMutation, false);
209
+ assert.equal(postApplyMismatch.eligibility.boundary.destructiveApplyAuthorized, false);
210
+
211
+ // Operation catalog and CLI both expose the same shared read-only projection surface.
212
+ const operation = await runPortableOperation('reduction-preflight', baseInput());
213
+ assert.equal(operation.operation, 'reduction-preflight');
214
+ assert.equal(operation.eligibility.receipt.inputFingerprint, qualified.eligibility.receipt.inputFingerprint);
215
+ assert.equal(operation.boundary.sourceMutation, false);
216
+ const cliOutput = [];
217
+ const cliCode = await runPortableCli(['reduction-preflight', '.topics/tooling', '--candidate', leafPath, '--reduction', '009-1-tooling-historical-lineage-reduction.trace.md', '--compact'], { log: (value) => cliOutput.push(value), error: (value) => cliOutput.push(value) });
218
+ assert.equal(cliCode, 2);
219
+ const cli = JSON.parse(cliOutput.at(-1));
220
+ assert.equal(cli.operation, 'reduction-preflight');
221
+ assert.equal(cli.boundary.sourceMutation, false);
222
+ assert.equal(cli.boundary.destructiveApplyImplemented, false);
223
+ assert.equal(cli.eligibility.boundary.lifecycleFactsAreEvidenceNotDeleteAuthority, true);
224
+
225
+ console.log('✓ Major 011 Reduction composition/recovery and exact destructive-lineage eligibility remain separate, deterministic, recoverable, fail-closed, and mutation-free across local/cross-repo lineage, normalized currentness, receipts, and nested reductions');
226
+
227
+ function entry(path, collapseTo) {
228
+ return { path, collapseTo, disposition: 'completed-and-superseded', reason: 'Synthetic fixture proves exact disappearing semantic coverage.' };
229
+ }
230
+ function source(path, repository = 'Tiinex/site', commit = COMMIT) { return { path, repository, commit, immutable: true, basis: 'qualified immutable regression source' }; }
231
+ function snapshot(repository, commit) { return { repository, commit, qualification: 'qualified', basis: 'exact pre-delete regression snapshot' }; }
232
+ function currentness(target, state, reissue = null) { return { target, state, currentness: 'current', qualification: 'qualified', basis: 'qualified normalized Major 010 currentness fact', ...(reissue ? { reissue } : {}) }; }
233
+ function loss(target, state) { return { target, state, qualification: 'qualified', basis: 'qualified normalized loss fact' }; }
234
+ function proof(child, parent, repository, commit) { return { kind: 'parent', qualification: 'qualified', basis: 'qualified immutable Parent proof', child, parent, childLocator: source(child, repository, commit), parentLocator: source(parent, repository, commit) }; }
235
+ function record(markdown, path) { return createRecordFromMarkdown(markdown, { path, sourceMode: 'portable-local' }); }
236
+ function verifiedDigest(markdown) { const digest = validatedC14nV2PrimarySelfDigest(markdown); assert.equal(digest.state, 'verified'); return digest.value; }
237
+ function hasCode(values, code) { return values.some((item) => item.code === code); }
238
+
239
+ function sealedReduction({ path, placementPath, placementSchema, placementDigest, entries = [], sourcePath = '', summary = 'Synthetic observable reduction for permanent Major 011 regression.' }) {
240
+ const sourceContext = sourcePath ? `- Source: [Immediate Source](${sourcePath})` : '- Source identity is intentionally represented by the exact synthetic regression material supplied to the shared operation.';
241
+ const leafSection = entries.length ? entries.map((item, index) => `- **Leaf ${index + 1}**\n - Leaf: [${item.path}](https://github.com/Tiinex/site/blob/${COMMIT}/.topics/tooling/${item.path})\n - Collapse To: [Historical Boundary](${item.collapseTo})\n - Disposition: \`${item.disposition}\`\n - Why: ${item.reason}\n - Expansion Span: exact qualified Parent traversal.`).join('\n\n') : '- No destructive leaf declaration is required for this ordinary composition-only Reduction fixture.';
242
+ const unsigned = `# Continuity Context
243
+
244
+ - Envelope Schema: tiinex.root.v1
245
+ - Parent
246
+ - Parent Schema: ${placementSchema}
247
+ - Created At: 2026-09-03 22:00:00
248
+ - Trace: [Placement Parent](${placementPath})
249
+ - Origin:
250
+ - [relative](${placementPath})
251
+ - Current
252
+ - Current Schema: tiinex.reduction.v1
253
+ - Created At: 2026-09-03 22:01:00
254
+ - Authors: Loom
255
+ - Why: Exercise the shared Major 011 Reduction mechanics without mutating source material.
256
+ - Summary: ${summary}
257
+ - Status: ready/local
258
+
259
+ ---
260
+
261
+ # Major 011 Reduction Regression
262
+
263
+ ## Source Context
264
+
265
+ ${sourceContext}
266
+
267
+ ### Reduced Leaves / Expansion Boundary
268
+
269
+ ${leafSection}
270
+
271
+ ## Carry-Forward State
272
+
273
+ - Exact qualified source identity and declared recovery boundaries remain observable.
274
+
275
+ ## Loss And Uncertainty
276
+
277
+ - Free-form prose is retained but never interpreted as destructive lifecycle/currentness policy.
278
+
279
+ ## Validation
280
+
281
+ - Shared audit plus exact normalized qualification inputs are required; no destructive apply is implemented.
282
+
283
+ ---
284
+
285
+ # Continuity Integrity
286
+
287
+ - sha256-base64url-c14n-v2
288
+ - Towards: [Placement Parent](${placementPath})
289
+ - Value: ${placementDigest}
290
+
291
+ - sha256-base64url-c14n-v2
292
+ - Towards: self
293
+ - Value: pending
294
+ `;
295
+ const sealed = sealC14nV2Self(unsigned);
296
+ assert.equal(sealed.state, 'sealed');
297
+ return `${sealed.markdown}\n`;
298
+ }
@@ -0,0 +1,65 @@
1
+ <!-- Intentional first-class standalone inheritance-record fixture; not schema-local compilation authority. -->
2
+ # Continuity Context
3
+
4
+ - Envelope Schema: [tiinex.root.v1](../../tiinex.root.v1.schema.md)
5
+ - Current
6
+ - Current Schema: [tiinex.schema.inheritance.v1](../../schema/contract/inheritance/tiinex.schema.inheritance.v1.schema.md)
7
+ - Created At: 2026-09-04 00:00:00
8
+ - Authors: Axiom, Anchor
9
+ - Why: Make Evidence's structural replacement of the generic Preservation body machine-explicit without weakening inherited Preservation semantics or introducing child-wins policy.
10
+ - Summary: Explicit Preservation-to-Evidence body-structure override for schema-factory compilation.
11
+ - Status: maintained
12
+
13
+ ---
14
+
15
+ # Evidence Extends Preservation — Body Structure Inheritance
16
+
17
+ ## Inheritance Identity
18
+
19
+ Inheritance Handle: evidence-preservation-body-structure
20
+ Inheritance Name: Evidence replaces generic Preservation body structure
21
+ Inheritance Kind: override
22
+
23
+ ## Parent Contract
24
+
25
+ Parent Schema: tiinex.preservation.v1
26
+ Parent Contract Nodes: Schema Validation Contract / Preservation Body / Required Shape
27
+ Parent Resolution State: resolved
28
+
29
+ ## Child Contract
30
+
31
+ Child Schema: tiinex.evidence.v1
32
+ Child Contract Nodes: Schema Validation Contract / Evidence Body / Required Shape
33
+ Child Resolution State: resolved
34
+
35
+ ## Merge Rules
36
+
37
+ - override Preservation artifact-body structural requirements with Evidence body structure
38
+ - Merge Operation: override
39
+ - Applies To: artifact-body structural Required Shape contributed by tiinex.preservation.v1 Preservation Body when validating or generating tiinex.evidence.v1 artifacts
40
+ - Parent Node: Schema Validation Contract / Preservation Body / Required Shape
41
+ - Child Node: Schema Validation Contract / Evidence Body / Required Shape
42
+ - Reason: Evidence is a Preservation specialization whose canonical body sections replace the generic Preservation body while retaining compatible non-structural Preservation obligations and provenance.
43
+ - Effective Result: Evidence requires one first body heading followed by exactly the child structural sections Supported Claim Or Question, Provenance, Evidence Material, Preservation And Fidelity, and Interpretation Limits. Preservation-only structural sections Preserved Material, Preservation Act, Fidelity And Loss, and Custody Or Storage Boundary are not independently required for Evidence. Compatible inherited Preservation contributions targeting surviving Evidence sections remain active with their source provenance.
44
+
45
+ ## Conflict Handling
46
+
47
+ Conflict Policy: report-conflict
48
+ Conflict Severity: fail
49
+ Unknown Parent Handling: require-review
50
+ Unknown Child Handling: require-review
51
+ Review Needed: yes when either contract node cannot be resolved exactly or when implementation cannot preserve active and inactive contributor provenance
52
+
53
+ ## Interpretation Limits
54
+
55
+ Does Not Mean: Evidence stops inheriting Preservation semantics, parent field contributions on surviving compatible sections disappear, or descendants generally override ancestors.
56
+ Must Not Be Used To Claim: global child-wins precedence, schema-order precedence, permission to suppress unrelated Preservation obligations, Evidence truth, evidence sufficiency, validation success, or authorization.
57
+ Merge Boundary: only the explicit Preservation Body Required Shape contribution is structurally replaced for Evidence; all other inheritance remains governed by Root additive semantics unless separately overridden.
58
+
59
+ ---
60
+
61
+ # Continuity Integrity
62
+
63
+ - sha256-base64url-c14n-v2
64
+ - Towards: self
65
+ - Value: rtWRmeA7PhhFWuYfGuVi15FhC4DHgsypTSV7L9tX7-Y
@@ -0,0 +1,294 @@
1
+ <!-- Contract-only test fixture for Tiinex/docs@068241174421716b941421e95931ec5a6e95b0da. Portal Time schema/body contract is byte-unchanged from the prior canonical baseline; only machine-authoritative validation contract surface is retained here. -->
2
+ # Continuity Context
3
+
4
+ - Envelope Schema: tiinex.root.v1
5
+ - Parent
6
+ - Parent Schema: tiinex.portal.v1
7
+ - Trace: portal.trace.md
8
+ - Origin: portal.trace.md
9
+ - Current
10
+ - Current Schema: tiinex.portal.time.v1
11
+ - Created At: 2026-07-02 00:00:00
12
+
13
+ ---
14
+
15
+ # Portal Time
16
+
17
+ ## Schema Validation Contract
18
+
19
+ ### Portal Time Scope
20
+
21
+ Applies To
22
+
23
+ - artifacts whose `Current -> Current Schema` is `tiinex.portal.time.v1`
24
+
25
+ Rules
26
+
27
+ - `tiinex.portal.time.v1` identifies artifacts whose main job is to define or record a time-bounded source-resolution portal.
28
+ - A time portal inherits portal semantics from `tiinex.portal.v1` and adds requested time, time resolution policy, source-state anchor, and temporal interpretation boundaries.
29
+ - A time portal must not use artifact `Created At` as proof of source state when a resolved source anchor is unavailable or contradictory.
30
+ - Prose outside `Schema Validation Contract` may explain the schema, but it does not add required validation rules.
31
+
32
+ ### Portal Time Body
33
+
34
+ Required Shape
35
+
36
+ - first body heading after the continuity envelope
37
+ - `## Portal Intent` section
38
+ - `## Requested Time` section
39
+ - `## Target Source` section
40
+ - `## Time Resolution Policy` section
41
+ - `## Resolution State` section
42
+ - `## Result Boundary` section
43
+ - `## Interpretation Limits` section
44
+
45
+ Optional Sections
46
+
47
+ - `Resolved Source State`
48
+ - `Discovery Scope`
49
+ - `User Input Boundary`
50
+ - `Follow-up Actions`
51
+ - `Related Artifacts`
52
+ - `Examples`
53
+ - `Relationship to Portal Base`
54
+
55
+ Rules
56
+
57
+ - Required sections should be readable without specialized tooling.
58
+ - Required sections should make the temporal request, resolution boundary, result state, and interpretation limits clear.
59
+ - Optional sections must not imply historical completeness unless backed by a resolved source-state anchor or appropriate method.
60
+
61
+ ### Portal Intent
62
+
63
+ Required Fields
64
+
65
+ - Portal Type
66
+ - Reason
67
+
68
+ Optional Fields
69
+
70
+ - Portal ID
71
+ - Intended Reader
72
+ - Intended Use
73
+ - Not For
74
+
75
+ Rules
76
+
77
+ - `Portal Type` should be `time` or a clear time-specialized child value.
78
+ - `Reason` should state why a time-bounded source view is needed.
79
+ - A time portal must remain a source-resolution boundary, not a generic timeline or UI state.
80
+
81
+ ### Requested Time
82
+
83
+ Required Fields
84
+
85
+ - Requested Time
86
+ - Timezone
87
+ - Interpretation
88
+
89
+ Optional Fields
90
+
91
+ - Time Window Start
92
+ - Time Window End
93
+ - Precision
94
+ - Source Clock
95
+ - User Local Time
96
+ - Artifact Created At Fallback
97
+
98
+ Allowed Labels
99
+
100
+ - at
101
+ - at-or-before
102
+ - at-or-after
103
+ - before
104
+ - after
105
+ - between
106
+ - nearest-before
107
+ - nearest-after
108
+ - current-state-fallback
109
+
110
+ Rules
111
+
112
+ - Requested time must be human-readable.
113
+ - Timezone or unknown timezone state must be explicit.
114
+ - If the requested time is approximate, precision must be stated.
115
+ - Artifact `Created At` may be used as fallback projection metadata, not as proof of source state.
116
+
117
+ ### Target Source
118
+
119
+ Required Fields
120
+
121
+ - Source Kind
122
+ - Source Identifier
123
+
124
+ Optional Fields
125
+
126
+ - Repository
127
+ - Ref
128
+ - Branch
129
+ - Root Path
130
+ - Source URL
131
+ - Source Schema
132
+ - Source Artifact
133
+ - Source Trust Boundary
134
+
135
+ Rules
136
+
137
+ - Target source identifies the source whose temporal state is requested.
138
+ - Target source does not prove temporal availability, completeness, evidence status, or preservation.
139
+
140
+ ### Time Resolution Policy
141
+
142
+ Required Fields
143
+
144
+ - Resolution Mode
145
+ - Required Inputs
146
+ - Fallback Behavior
147
+
148
+ Optional Fields
149
+
150
+ - Historical Source Capability
151
+ - No API Policy
152
+ - Accepted User Inputs
153
+ - User-Invoked Source UI
154
+ - Resolver
155
+ - Completeness Policy
156
+ - Failure Policy
157
+ - Source Access Mode
158
+ - Git Ref Policy
159
+ - Local Git Archive Boundary
160
+ - Browser Remote Git Boundary
161
+ - Service Boundary
162
+
163
+ Allowed Labels
164
+
165
+ - git-commit-at-or-before
166
+ - git-tree-url
167
+ - git-local-log
168
+ - git-local-blob-read
169
+ - git-remote-shallow-fetch
170
+ - archive-snapshot
171
+ - mirror-snapshot
172
+ - source-timestamp
173
+ - user-supplied-anchor
174
+ - current-state-fallback
175
+ - no-api-manual-ref
176
+ - unavailable
177
+ - web-surface
178
+ - local-working-tree
179
+ - local-git-archive
180
+ - browser-remote-git
181
+ - service-backed-git
182
+
183
+ Rules
184
+
185
+ - Resolution mode must state how the requested time may be translated into a source-state anchor.
186
+ - Git-backed time resolution may use `web-surface`, `local-working-tree`, `local-git-archive`, `browser-remote-git`, or `service-backed-git`, but the access mode must remain separate from the time-resolution result.
187
+ - `local-git-archive` should mean an explicitly user-provided local repository containing Git history; it must not imply hidden upload, hidden network access, source completeness, evidence status, or preservation.
188
+ - `browser-remote-git` should state shallow, branch, checkout, CORS, authentication, browser storage, memory, and repository-size boundaries when they affect resolution.
189
+ - `service-backed-git` should state service trust, authentication, privacy, and disclosure boundaries when they affect resolution.
190
+ - If a full source-state anchor is required but missing, `needs-input` should be used instead of `failed`.
191
+ - A user-supplied anchor must remain labeled as user-supplied unless independently resolved or verified.
192
+ - Short commit labels may be displayed, but full commit SHAs should be preferred when available.
193
+ - A resolved commit, tree, or blob is a source-state anchor; it does not by itself create evidence, validation, preservation, or truth.
194
+
195
+ ### Resolution State
196
+
197
+ Required Fields
198
+
199
+ - State
200
+ - Resolved By
201
+
202
+ Optional Fields
203
+
204
+ - Resolver
205
+ - Resolved At
206
+ - Resolution Confidence
207
+ - User Input Used
208
+ - Missing Inputs
209
+ - Failure Reason
210
+
211
+ Allowed Labels
212
+
213
+ - not-started
214
+ - needs-input
215
+ - resolving
216
+ - resolved
217
+ - partial
218
+ - failed
219
+ - unavailable
220
+ - skipped
221
+ - deferred
222
+
223
+ Rules
224
+
225
+ - Resolution state describes time-portal resolution, not artifact validity or evidence status.
226
+ - `needs-input` means the portal needs more input; it is not a failure state.
227
+ - `resolved` should identify a source-state anchor or explain why the resolution is current-state-only.
228
+
229
+ ### Resolved Source State
230
+
231
+ Required Fields
232
+
233
+ - Anchor Kind
234
+ - Anchor
235
+
236
+ Optional Fields
237
+
238
+ - Commit SHA
239
+ - Short Label
240
+ - Tree URL
241
+ - Archive URL
242
+ - Mirror ID
243
+ - Snapshot ID
244
+ - Source Timestamp
245
+ - Observed At
246
+ - Resolution Confidence
247
+
248
+ Rules
249
+
250
+ - Resolved anchors should be stable enough to revisit or audit when the source supports stable anchors.
251
+ - Full commit SHAs should be recorded when available; short SHAs may be used as display labels only.
252
+ - A resolved source state does not by itself preserve source material.
253
+
254
+ ### Result Boundary
255
+
256
+ Required Fields
257
+
258
+ - Snapshot Boundary
259
+ - Completeness
260
+ - Preservation State
261
+ - Evidence State
262
+
263
+ Optional Fields
264
+
265
+ - Historical Guarantee
266
+ - Known Limits
267
+ - Fallback Semantics
268
+ - Promotable To Finding
269
+ - Promotable To Evidence
270
+
271
+ Rules
272
+
273
+ - Snapshot boundary must state whether the result is source-ref-bounded, current-web-state-only, user-supplied-anchor, manifest-bounded, partial, or unknown.
274
+ - Preservation and evidence state must remain distinct from source resolution.
275
+ - Current web state must not be presented as a historical snapshot.
276
+
277
+ ### Interpretation Limits
278
+
279
+ Required Fields
280
+
281
+ - Does Not Mean
282
+ - Must Not Be Used To Claim
283
+
284
+ Optional Fields
285
+
286
+ - Known Ambiguities
287
+ - Trust Boundary
288
+ - Overclaim Risk
289
+ - Missing Context
290
+
291
+ Rules
292
+
293
+ - A time portal must disclose what the temporal view cannot prove.
294
+ - A time portal must not claim historical completeness, source completeness, evidence status, preservation, truth, authorship, consent, or validation unless supported elsewhere.