@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.
- package/LICENSE +201 -0
- package/NOTICE +31 -0
- package/README.md +26 -0
- package/docs/CONSUMER-CONTRACT.md +65 -0
- package/package.json +94 -0
- package/src/acceptance/knownScenarios.case.mjs +48 -0
- package/src/acceptance/knownScenarios.js +89 -0
- package/src/acceptance/postV423CanonicalTransitionProductVerticalSlice.case.mjs +774 -0
- package/src/acceptance/postV437M0ETimePortalProductParityClosure.case.mjs +51 -0
- package/src/acceptance/postV447M0FGithubSocialPublicationProductIntegration.case.mjs +33 -0
- package/src/acceptance/postV450M0ProductAcceptanceHardening.case.mjs +82 -0
- package/src/acceptance/postV470SchemaReadingContractMaterializationIdentitySourceCoalescingAuthorityCorrection.case.mjs +236 -0
- package/src/acceptance/recoveryAcceptance.case.mjs +196 -0
- package/src/adapters/adapter.definition.schema.json +33 -0
- package/src/adapters/archive/archive.adapter.case.mjs +212 -0
- package/src/adapters/export/export.adapter.js +79 -0
- package/src/adapters/git-native/git-native.adapter.js +43 -0
- package/src/adapters/github/github.adapter.case.mjs +843 -0
- package/src/adapters/github/github.adapter.js +395 -0
- package/src/adapters/github/github.issueEmbedded.js +262 -0
- package/src/adapters/github/github.issueMirror.js +309 -0
- package/src/adapters/github/github.issueSnapshot.js +475 -0
- package/src/adapters/github/github.issueSurface.js +188 -0
- package/src/adapters/github/github.issueTransport.js +237 -0
- package/src/adapters/github/github.publicationRead.js +24 -0
- package/src/adapters/github/github.readTransport.js +18 -0
- package/src/adapters/github/github.repoDiscovery.js +222 -0
- package/src/adapters/github/github.repoMirror.js +255 -0
- package/src/adapters/github/github.repoProxy.js +276 -0
- package/src/adapters/github/github.repoSurface.js +60 -0
- package/src/adapters/github/github.transportDiagnostics.js +68 -0
- package/src/adapters/local/local.adapter.case.mjs +72 -0
- package/src/adapters/local/local.adapter.js +188 -0
- package/src/adapters/registry.js +35 -0
- package/src/adapters/static/static.adapter.js +84 -0
- package/src/app/App.js +1 -0
- package/src/app/TiinexApp.jsx +822 -0
- package/src/app/appShell.views.jsx +58 -0
- package/src/app/artifactAuthoringCapability.js +49 -0
- package/src/app/boot/bootApp.js +19 -0
- package/src/app/boot/environment.js +1 -0
- package/src/app/canonicalAuthoringValues.js +4 -0
- package/src/app/canonicalCreationProductController.js +57 -0
- package/src/app/canonicalCreationProductSettlement.case.mjs +10 -0
- package/src/app/canonicalCreationProductSettlement.js +11 -0
- package/src/app/canonicalReferenceLocalCreateCommand.js +210 -0
- package/src/app/canonicalReferenceTargets.js +73 -0
- package/src/app/canonicalTransitionLocalCreateCommand.js +217 -0
- package/src/app/defaultWorkspaceStart.case.mjs +39 -0
- package/src/app/defaultWorkspaceStart.js +65 -0
- package/src/app/defaultWorkspaceStartCommand.js +55 -0
- package/src/app/durableLocalMutationPolicy.js +21 -0
- package/src/app/githubMaterializationSummary.js +69 -0
- package/src/app/githubProgress.js +25 -0
- package/src/app/githubSourceInput.js +47 -0
- package/src/app/githubSourceMaterializationCommand.js +97 -0
- package/src/app/githubSourceOperation.js +226 -0
- package/src/app/governanceDialogData.js +27 -0
- package/src/app/handoffPackageImportCommand.js +182 -0
- package/src/app/historyAuthority.js +53 -0
- package/src/app/initialWorkspaceBootstrapOperation.js +105 -0
- package/src/app/lineageCommand.js +118 -0
- package/src/app/lineageSourceRecovery.js +339 -0
- package/src/app/localDraftMutationCommand.js +174 -0
- package/src/app/localMaterialCommand.js +124 -0
- package/src/app/nodeGraphVerse.case.mjs +111 -0
- package/src/app/persistenceOwnership.js +92 -0
- package/src/app/productStateBoundary.js +7 -0
- package/src/app/providers/AppProviders.js +1 -0
- package/src/app/providers/LocaleProvider.js +1 -0
- package/src/app/providers/SchemaRegistryProvider.js +1 -0
- package/src/app/providers/WorkspaceProvider.js +1 -0
- package/src/app/publicTarget.js +251 -0
- package/src/app/publicTargetRestoreCommand.js +149 -0
- package/src/app/recordUi.cache.js +35 -0
- package/src/app/recordUi.js +11 -0
- package/src/app/routes/RouteSurface.js +1 -0
- package/src/app/routes/routes.js +1 -0
- package/src/app/runtimeState.js +54 -0
- package/src/app/schemaCurrentDeclaration.js +69 -0
- package/src/app/schemaFactoryLocalCreateCommand.js +101 -0
- package/src/app/schemaFactoryViewerProof.case.mjs +134 -0
- package/src/app/schemaFactoryViewerProof.js +20 -0
- package/src/app/schemaNavigationCommand.js +285 -0
- package/src/app/schemaNavigationMaterialization.js +171 -0
- package/src/app/schemaNavigationRuntimeCatalog.js +25 -0
- package/src/app/schemaNavigationState.js +66 -0
- package/src/app/schemaReadingContractQualification.js +91 -0
- package/src/app/schemaSourceRecovery.js +373 -0
- package/src/app/scrollPersistence.js +30 -0
- package/src/app/semanticOperationHistory.js +18 -0
- package/src/app/shareActionCommand.js +55 -0
- package/src/app/shareProjection.js +190 -0
- package/src/app/shell/AppShell.js +1 -0
- package/src/app/shell/Header.js +1 -0
- package/src/app/shell/Navigation.js +1 -0
- package/src/app/shell/SurfaceSwitcher.js +1 -0
- package/src/app/sourceTransportRefresh.js +176 -0
- package/src/app/startupOwnership.js +40 -0
- package/src/app/startupPresentation.case.mjs +34 -0
- package/src/app/startupPresentation.js +33 -0
- package/src/app/startupPresentation.views.jsx +21 -0
- package/src/app/startupRenderPhase.js +9 -0
- package/src/app/startupWorkspaceCommand.js +62 -0
- package/src/app/startupWorkspaceConfigApplication.js +49 -0
- package/src/app/statePersistenceScheduler.js +106 -0
- package/src/app/tiinexAppConfigPlan.js +108 -0
- package/src/app/tiinexAppConfigSource.js +349 -0
- package/src/app/tiinexAppStartupSource.js +79 -0
- package/src/app/tiinexHostedWorkspaceConventions.js +572 -0
- package/src/app/timePortalHistoricalRead.js +114 -0
- package/src/app/timePortalSnapshotResolution.js +53 -0
- package/src/app/urlMaterialCommand.js +24 -0
- package/src/app/useCanonicalPlacementSelectionOptions.js +9 -0
- package/src/app/useCanonicalReferenceSelectionOptions.js +8 -0
- package/src/app/useLocalMaterialIntake.js +68 -0
- package/src/app/useTimePortalProductController.jsx +111 -0
- package/src/app/useWorkspaceEntrypointIntake.js +77 -0
- package/src/app/useWorkspaceSelectionProductController.jsx +21 -0
- package/src/app/viewState.js +35 -0
- package/src/app/viewport.js +21 -0
- package/src/app/visualDormancy.js +286 -0
- package/src/app/workspaceContinuityNotices.js +32 -0
- package/src/app/workspaceDisplayCounts.js +9 -0
- package/src/app/workspaceEntrypointIntakeCommand.js +87 -0
- package/src/app/workspaceEntrypointProductRouting.case.mjs +20 -0
- package/src/app/workspaceExportCommand.js +21 -0
- package/src/app/workspaceExportDownload.js +23 -0
- package/src/app/workspaceExportExecutionCommand.js +10 -0
- package/src/app/workspaceGithubPublication.js +237 -0
- package/src/app/workspaceHandoffExport.js +56 -0
- package/src/app/workspaceHomeTarget.js +9 -0
- package/src/app/workspaceMulticolumn.js +113 -0
- package/src/app/workspaceNavigationParity.case.mjs +110 -0
- package/src/app/workspaceOpenProgress.js +26 -0
- package/src/app/workspacePlacementOptions.js +46 -0
- package/src/app/workspaceRecordActions.js +158 -0
- package/src/app/workspaceScopedInteraction.js +68 -0
- package/src/app/workspaceSelectionOriginContext.js +29 -0
- package/src/app/workspaceSelectionSession.js +54 -0
- package/src/app/workspaceSourceCloseCommand.js +25 -0
- package/src/app/workspaceSpineProductRouting.case.mjs +22 -0
- package/src/app/workspaceStartupTransition.js +32 -0
- package/src/app/workspaceWindow.js +85 -0
- package/src/artifacts/artifact.fixture.js +1 -0
- package/src/artifacts/artifact.identity.js +6 -0
- package/src/artifacts/artifact.identityAggregation.js +218 -0
- package/src/artifacts/artifact.model.js +2 -0
- package/src/artifacts/artifact.parse.case.mjs +196 -0
- package/src/artifacts/artifact.participantIndex.js +189 -0
- package/src/artifacts/fixtures/evidence.trace.md +50 -0
- package/src/artifacts/fixtures/topic.trace.md +33 -0
- package/src/artifacts/fixtures/unknown-schema.trace.md +25 -0
- package/src/audit/audit.findings.js +1 -0
- package/src/audit/audit.model.js +2 -0
- package/src/audit/audit.plan.js +13 -0
- package/src/audit/audit.report.js +12 -0
- package/src/audit/audit.severity.js +1 -0
- package/src/audit/audit.traverse.js +119 -0
- package/src/audit/integrity/auditIntegrity.checks.js +1 -0
- package/src/audit/integrity/auditIntegrity.compare.js +1 -0
- package/src/audit/lineage/auditLineage.load.js +1 -0
- package/src/audit/lineage/auditLineage.plan.js +1 -0
- package/src/audit/lineage/auditLineage.resolve.js +12 -0
- package/src/audit/sources/auditSources.boundaries.js +1 -0
- package/src/audit/sources/auditSources.checks.js +1 -0
- package/src/audit/validation/auditValidation.recheck.js +1 -0
- package/src/audit/validation/auditValidation.run.js +1 -0
- package/src/build.identity.js +15 -0
- package/src/commands/command.vocabulary.js +14 -0
- package/src/conformance/conformance.fixtures.js +151 -0
- package/src/conformance/conformance.run.js +238 -0
- package/src/data/applicationDataStore.js +23 -0
- package/src/data/companionAccess.js +35 -0
- package/src/diagnostics/events.js +1 -0
- package/src/diagnostics/invariant.js +1 -0
- package/src/diagnostics/schemaBindingChecks.js +1 -0
- package/src/diagnostics/schemaModuleChecks.js +1 -0
- package/src/diagnostics/sourceBoundaryChecks.js +5 -0
- package/src/diagnostics/sourceTransport.report.js +190 -0
- package/src/discovery/discovery.controls.js +7 -0
- package/src/export/export.plan.js +182 -0
- package/src/export/handoff.plan.js +50 -0
- package/src/export/package.builder.case.mjs +97 -0
- package/src/export/package.controlTopology.case.mjs +130 -0
- package/src/export/package.zip.case.mjs +33 -0
- package/src/graph/artifactGraph.model.js +344 -0
- package/src/graph/artifactGraph.project.js +139 -0
- package/src/graph/artifactGraph.worker.js +10 -0
- package/src/i18n/i18n.keys.js +1 -0
- package/src/i18n/i18n.provider.js +1 -0
- package/src/i18n/i18n.resolve.js +5 -0
- package/src/i18n/locales/en/common.json +4 -0
- package/src/i18n/locales/en/schemas/evidence.json +3 -0
- package/src/i18n/locales/en/schemas/presentation-surface.json +3 -0
- package/src/i18n/locales/en/schemas/preservation.json +3 -0
- package/src/i18n/locales/en/schemas/root.json +3 -0
- package/src/i18n/locales/en/schemas/schema-module.json +3 -0
- package/src/i18n/locales/en/schemas/topic.json +3 -0
- package/src/i18n/locales/en/surfaces/audit.json +3 -0
- package/src/i18n/locales/en/surfaces/create.json +3 -0
- package/src/i18n/locales/en/surfaces/detail.json +3 -0
- package/src/i18n/locales/en/surfaces/display-options.json +3 -0
- package/src/i18n/locales/en/surfaces/edit.json +3 -0
- package/src/i18n/locales/en/surfaces/feed.json +3 -0
- package/src/i18n/locales/en/surfaces/lineage.json +3 -0
- package/src/i18n/locales/en/surfaces/preview.json +3 -0
- package/src/i18n/locales/en/surfaces/share.json +3 -0
- package/src/i18n/locales/en/surfaces/source-settings.json +3 -0
- package/src/i18n/locales/en/surfaces/tree.json +3 -0
- package/src/i18n/locales/sv/common.json +4 -0
- package/src/i18n/locales/sv/schemas/evidence.json +3 -0
- package/src/i18n/locales/sv/schemas/presentation-surface.json +3 -0
- package/src/i18n/locales/sv/schemas/preservation.json +3 -0
- package/src/i18n/locales/sv/schemas/root.json +3 -0
- package/src/i18n/locales/sv/schemas/schema-module.json +3 -0
- package/src/i18n/locales/sv/schemas/topic.json +3 -0
- package/src/i18n/locales/sv/surfaces/audit.json +3 -0
- package/src/i18n/locales/sv/surfaces/create.json +3 -0
- package/src/i18n/locales/sv/surfaces/detail.json +3 -0
- package/src/i18n/locales/sv/surfaces/display-options.json +3 -0
- package/src/i18n/locales/sv/surfaces/edit.json +3 -0
- package/src/i18n/locales/sv/surfaces/feed.json +3 -0
- package/src/i18n/locales/sv/surfaces/lineage.json +3 -0
- package/src/i18n/locales/sv/surfaces/preview.json +3 -0
- package/src/i18n/locales/sv/surfaces/share.json +3 -0
- package/src/i18n/locales/sv/surfaces/source-settings.json +3 -0
- package/src/i18n/locales/sv/surfaces/tree.json +3 -0
- package/src/index.js +10 -0
- package/src/integrity/integrity.testFixture.js +9 -0
- package/src/interaction/interaction.spine.js +12 -0
- package/src/lineage/lineage.audit.js +1 -0
- package/src/lineage/lineage.edges.js +1 -0
- package/src/main.js +319 -0
- package/src/main.jsx +34 -0
- package/src/multiverse/multiverse.model.js +10 -0
- package/src/parity/poc.m1ParityScenarios.js +42 -0
- package/src/parity/poc.parityLedger.js +261 -0
- package/src/publication/publication.githubSocialContract.case.mjs +247 -0
- package/src/publication/publication.preflight.case.mjs +64 -0
- package/src/react/TiinexApplication.jsx +39 -0
- package/src/react/VerseHost.jsx +29 -0
- package/src/react/applicationDataContext.jsx +30 -0
- package/src/react.js +2 -0
- package/src/readers/modes/audit.reader.js +1 -0
- package/src/readers/modes/detail.reader.js +1 -0
- package/src/readers/modes/handover.reader.js +1 -0
- package/src/readers/modes/mobile.reader.js +1 -0
- package/src/readers/modes/print.reader.js +1 -0
- package/src/readers/modes/scan.reader.js +1 -0
- package/src/readers/reader.model.js +1 -0
- package/src/readers/reader.resolve.js +2 -0
- package/src/reingest/reingest.plan.case.mjs +65 -0
- package/src/runtime.js +54 -0
- package/src/schemas/README.md +99 -0
- package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.md +614 -0
- package/src/schemas/coordination/project/tiinex.project.v1.schema.md +311 -0
- package/src/schemas/core/decision/tiinex.decision.v1.schema.md +227 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.schema.md +318 -0
- package/src/schemas/core/feedback/tiinex.feedback.v1.schema.md +243 -0
- package/src/schemas/core/interpretation/.transitions/evidence-to-interpretation-transition-definition.trace.md +102 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.md +308 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.schema.md +312 -0
- package/src/schemas/core/relation/.generation/reference-relation-generation-authority.trace.md +185 -0
- package/src/schemas/core/relation/.transitions/topic-references-task-transition-definition.trace.md +119 -0
- package/src/schemas/core/relation/tiinex.relation.v1.schema.md +240 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.md +550 -0
- package/src/schemas/core/signal/tiinex.signal.v1.schema.md +239 -0
- package/src/schemas/core/task/.transitions/create-task-transition-definition.trace.md +93 -0
- package/src/schemas/core/task/.transitions/topic-to-task-transition-definition.trace.md +102 -0
- package/src/schemas/core/task/task-semantic-package.trace.md +53 -0
- package/src/schemas/core/task/tiinex.task.v1-transitions.trace.md +33 -0
- package/src/schemas/core/task/tiinex.task.v1.authoring.js +65 -0
- package/src/schemas/core/task/tiinex.task.v1.schema.md +229 -0
- package/src/schemas/core/topic/.transitions/create-topic-transition-definition.trace.md +93 -0
- package/src/schemas/core/topic/tiinex.topic.v1-transitions.trace.md +33 -0
- package/src/schemas/core/topic/tiinex.topic.v1.schema.md +197 -0
- package/src/schemas/core/topic/topic-semantic-package.trace.md +53 -0
- package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.md +240 -0
- package/src/schemas/discovery/tiinex.discovery.v1.schema.md +294 -0
- package/src/schemas/manifest.json +367 -0
- package/src/schemas/origins.js +46 -0
- package/src/schemas/party/organization/tiinex.party.organization.v1.schema.md +290 -0
- package/src/schemas/party/role/tiinex.party.role.v1.schema.md +298 -0
- package/src/schemas/party/tiinex.party.v1.schema.js +14 -0
- package/src/schemas/party/tiinex.party.v1.schema.json +23 -0
- package/src/schemas/party/tiinex.party.v1.schema.md +311 -0
- package/src/schemas/party/tiinex.party.v1.schema.runtime.json +2033 -0
- package/src/schemas/party/tiinex.party.v1.schema.source.js +9 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.md +476 -0
- package/src/schemas/reduction/tiinex.reduction.v1.schema.md +248 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.schema.md +465 -0
- package/src/schemas/schema.companionContract.case.mjs +259 -0
- package/src/schemas/schema.factory.case.mjs +256 -0
- package/src/schemas/schema.factory.viewerProjection.js +183 -0
- package/src/schemas/schemaMarkdownCatalog.js +19 -0
- package/src/schemas/tiinex.root.v1.schema.md +865 -0
- package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.md +309 -0
- package/src/schemas/validation/method/tiinex.validation.method.v1.schema.md +280 -0
- package/src/schemas/validation/report/tiinex.validation.report.v1.schema.md +300 -0
- package/src/schemas/workspace/tiinex.workspace.v1.schema.md +486 -0
- package/src/schemas/workspace/workspace.add.views.jsx +327 -0
- package/src/schemas/workspace/workspace.audit.views.jsx +160 -0
- package/src/schemas/workspace/workspace.auditBadge.views.jsx +98 -0
- package/src/schemas/workspace/workspace.canonicalReferenceDialog.views.jsx +63 -0
- package/src/schemas/workspace/workspace.canonicalTaskDialog.views.jsx +169 -0
- package/src/schemas/workspace/workspace.cardActions.js +9 -0
- package/src/schemas/workspace/workspace.cards.views.jsx +146 -0
- package/src/schemas/workspace/workspace.chrome.views.jsx +299 -0
- package/src/schemas/workspace/workspace.continuationDialog.views.jsx +80 -0
- package/src/schemas/workspace/workspace.discovery.views.jsx +63 -0
- package/src/schemas/workspace/workspace.discoveryRenderWindow.js +56 -0
- package/src/schemas/workspace/workspace.displayOptions.views.jsx +114 -0
- package/src/schemas/workspace/workspace.entrypointChoice.views.jsx +30 -0
- package/src/schemas/workspace/workspace.exportDialog.controller.jsx +40 -0
- package/src/schemas/workspace/workspace.exportDialog.views.jsx +142 -0
- package/src/schemas/workspace/workspace.governance.views.jsx +45 -0
- package/src/schemas/workspace/workspace.graph.views.jsx +134 -0
- package/src/schemas/workspace/workspace.lineage.views.jsx +307 -0
- package/src/schemas/workspace/workspace.read.views.jsx +105 -0
- package/src/schemas/workspace/workspace.recordActionButton.views.jsx +35 -0
- package/src/schemas/workspace/workspace.recordDialogs.views.jsx +257 -0
- package/src/schemas/workspace/workspace.selection.views.jsx +14 -0
- package/src/schemas/workspace/workspace.sourceReceipt.views.jsx +40 -0
- package/src/schemas/workspace/workspace.timePortal.views.jsx +56 -0
- package/src/schemas/workspace/workspace.tree.views.jsx +107 -0
- package/src/schemas/workspace/workspace.viewFormatting.js +172 -0
- package/src/schemas/workspace/workspace.views.jsx +210 -0
- package/src/source-settings/sourceSettings.model.js +7 -0
- package/src/sources/draft/draft.source.js +1 -0
- package/src/sources/github/github.loader.js +204 -0
- package/src/sources/github/github.permalink.js +1 -0
- package/src/sources/github/github.source.js +1 -0
- package/src/sources/github/github.transport.case.mjs +237 -0
- package/src/sources/github/github.transport.js +472 -0
- package/src/sources/local/local.source.js +1 -0
- package/src/sources/source.assetReferences.js +109 -0
- package/src/sources/source.boundaries.js +24 -0
- package/src/sources/source.identity.js +56 -0
- package/src/sources/source.model.case.mjs +26 -0
- package/src/sources/source.model.js +56 -0
- package/src/sources/source.presenter.js +66 -0
- package/src/sources/source.resolve.js +11 -0
- package/src/sources/static/static.source.js +1 -0
- package/src/sources/transport.policy.case.mjs +39 -0
- package/src/sources/transport.policy.js +81 -0
- package/src/storage/storage.policy.js +79 -0
- package/src/styles/app.css +8699 -0
- package/src/styles/responsive.css +10 -0
- package/src/styles/theme.css +4 -0
- package/src/styles/tokens.css +30 -0
- package/src/surfaces/audit/AuditSurface.js +1 -0
- package/src/surfaces/audit/audit.model.js +1 -0
- package/src/surfaces/audit/audit.render.js +1 -0
- package/src/surfaces/contracts.js +45 -0
- package/src/surfaces/create/CreateSurface.js +1 -0
- package/src/surfaces/create/create.model.js +1 -0
- package/src/surfaces/create/create.render.js +1 -0
- package/src/surfaces/detail/DetailSurface.js +1 -0
- package/src/surfaces/detail/detail.model.js +1 -0
- package/src/surfaces/detail/detail.render.js +1 -0
- package/src/surfaces/display-options/DisplayOptionsSurface.js +1 -0
- package/src/surfaces/display-options/displayOptions.model.js +1 -0
- package/src/surfaces/display-options/displayOptions.render.js +1 -0
- package/src/surfaces/edit/EditSurface.js +1 -0
- package/src/surfaces/edit/edit.model.js +1 -0
- package/src/surfaces/edit/edit.render.js +1 -0
- package/src/surfaces/feed/FeedSurface.js +1 -0
- package/src/surfaces/feed/feed.model.js +1 -0
- package/src/surfaces/feed/feed.render.js +1 -0
- package/src/surfaces/lineage/LineageSurface.js +1 -0
- package/src/surfaces/lineage/lineage.model.js +1 -0
- package/src/surfaces/lineage/lineage.render.js +1 -0
- package/src/surfaces/preview/PreviewSurface.js +1 -0
- package/src/surfaces/preview/preview.model.js +1 -0
- package/src/surfaces/preview/preview.render.js +1 -0
- package/src/surfaces/registry.js +58 -0
- package/src/surfaces/share/ShareSurface.js +1 -0
- package/src/surfaces/share/share.model.js +1 -0
- package/src/surfaces/share/share.render.js +1 -0
- package/src/surfaces/source-settings/SourceSettingsSurface.js +1 -0
- package/src/surfaces/source-settings/sourceSettings.model.js +1 -0
- package/src/surfaces/source-settings/sourceSettings.render.js +1 -0
- package/src/surfaces/surfaceContext.js +1 -0
- package/src/surfaces/tree/TreeSurface.js +1 -0
- package/src/surfaces/tree/tree.model.js +1 -0
- package/src/surfaces/tree/tree.render.js +1 -0
- package/src/tooling/portable/adapters/cli/cli.common-output.case.mjs +153 -0
- package/src/tooling/portable/adapters/cli/cli.handoff-sibling-allocation.case.mjs +52 -0
- package/src/tooling/portable/adapters/cli/cli.run.case.mjs +372 -0
- package/src/tooling/portable/adapters/cli/cli.summaryProjection.case.mjs +46 -0
- package/src/tooling/portable/audit/audit.capability.case.mjs +45 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/collaboration/dogfood/001-tiinex-development-dogfood-collaboration-model.trace.fixture.txt +37 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/handoff/tooling/001-v480-tooling-workflow-schema-enablement-handoff.trace.fixture.txt +108 -0
- 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
- package/src/tooling/portable/fixtures/legacy-artifacts/loom/role/001-loom-role.trace.fixture.txt +61 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/sigma/role/001-1-sigma-role.trace.fixture.txt +61 -0
- 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
- 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
- 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
- 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
- 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
- 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
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-site-tooling-v471-portable-lineage-authoring-closure-result.trace.fixture.txt +48 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-site-tooling-v471-portable-lineage-authoring-closure.trace.fixture.txt +39 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/002-1-v475-canonical-artifact-envelope-reference-integrity-validation.trace.fixture.txt +43 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/003-1-v476-canonical-authority-binding-integrity-method-lineage-alloca.trace.fixture.txt +42 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/027-handoff-package-workspace-archive-and-control-plane-minimality-audit.trace.fixture.txt +56 -0
- package/src/tooling/portable/fixtures/legacyArtifactFixtures.mjs +34 -0
- package/src/tooling/portable/grounding/grounding.capsule.case.mjs +65 -0
- package/src/tooling/portable/grounding/grounding.readiness.case.mjs +543 -0
- package/src/tooling/portable/grounding/grounding.semanticIntegration.case.mjs +131 -0
- package/src/tooling/portable/handoff/boundedWorkspaceRepresentation.case.mjs +103 -0
- package/src/tooling/portable/handoff/carrierLineage.fixedWidth.case.mjs +97 -0
- package/src/tooling/portable/handoff/coldStartQualification.case.mjs +293 -0
- package/src/tooling/portable/handoff/fixtures/027-invalid-audit-result.fixture.txt +192 -0
- package/src/tooling/portable/handoff/fixtures/027-invalid-return-handoff.fixture.txt +92 -0
- package/src/tooling/portable/handoff/fixtures/cold-start-qualification.v1.examples.json +60 -0
- package/src/tooling/portable/handoff/handoff.manufacture.case.mjs +293 -0
- package/src/tooling/portable/handoff/materialClosure.case.mjs +727 -0
- package/src/tooling/portable/handoff/multiRootManufacture.case.mjs +615 -0
- package/src/tooling/portable/handoff/operatorBridgeCore.case.mjs +205 -0
- package/src/tooling/portable/handoff/workspaceLandingPlan.case.mjs +143 -0
- package/src/tooling/portable/input/node.input.case.mjs +293 -0
- package/src/tooling/portable/lifecycle/lifecycle.readiness.case.mjs +179 -0
- package/src/tooling/portable/lineage/fixtures/lineage.integrity.repair-projection.v1.examples.json +605 -0
- package/src/tooling/portable/lineage/lineage.integrity.shared-capability.case.mjs +37 -0
- package/src/tooling/portable/lineage/publicationProviderReceipt.fixture.mjs +50 -0
- package/src/tooling/portable/package/fixtures/reference-relation-generation-authority.trace.md +84 -0
- package/src/tooling/portable/package/fixtures/tiinex.root.v1.package-authority.contract-fixture.md +64 -0
- package/src/tooling/portable/package/fixtures/tiinex.schema.generation.v1.generation-binding.contract-fixture.md +140 -0
- package/src/tooling/portable/package/fixtures/tiinex.schema.transition.companion.v1.contract-fixture.md +73 -0
- package/src/tooling/portable/package/fixtures/tiinex.semantic.package.v1.contract-fixture.md +147 -0
- package/src/tooling/portable/package/fixtures/tiinex.transition.definition.v1.package-contract-fixture.md +77 -0
- package/src/tooling/portable/providers/schema.providers.genericity.case.mjs +31 -0
- package/src/tooling/portable/reduction/reduction.preflight.case.mjs +298 -0
- package/src/tooling/portable/schema/fixtures/evidence-preservation-body.inheritance-record-fixture.md +65 -0
- package/src/tooling/portable/schema/fixtures/tiinex.portal.time.v1.contract-fixture.md +294 -0
- package/src/tooling/portable/schema/fixtures/tiinex.root.v1.contract-fixture.md +584 -0
- package/src/tooling/portable/schema/fixtures/tiinex.root.v1.machine-shape.contract-fixture.md +44 -0
- package/src/tooling/portable/schema/fixtures/tiinex.root.v1.ordinary-target.contract-fixture.md +630 -0
- package/src/tooling/portable/schema/fixtures/tiinex.schema.contract.v1.repeated-record.contract-fixture.md +69 -0
- package/src/tooling/portable/schema/fixtures/tiinex.schema.generation.v1.repeated-record.contract-fixture.md +98 -0
- package/src/tooling/portable/schema/fixtures/tiinex.schema.inheritance.v1.repeated-record.contract-fixture.md +58 -0
- package/src/tooling/portable/schema/fixtures/tiinex.task.v1.contract-fixture.md +165 -0
- package/src/tooling/portable/schema/fixtures/tiinex.transition.definition.v1.contract-fixture.md +744 -0
- package/src/tooling/portable/schema/fixtures/tiinex.transition.definition.v1.field-domain.contract-fixture.md +319 -0
- package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.relation.v1.schema.md +240 -0
- package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.contract.v1.schema.md +391 -0
- package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.generation.v1.schema.md +379 -0
- package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.transition.companion.v1.schema.md +265 -0
- package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.semantic.package.v1.schema.md +402 -0
- package/src/transitions/canonical-schema-cache/52ecdea0a75893882ce282214d155f70e1309c2a/tiinex.topic.v1.schema.md +197 -0
- package/src/transitions/canonical-schema-cache/d69b8ff55a56b8cb9282b8684db6a938a4435b94/tiinex.root.v1.schema.md +797 -0
- package/src/transitions/canonical-schema-cache/d69b8ff55a56b8cb9282b8684db6a938a4435b94/tiinex.transition.definition.v1.schema.md +1062 -0
- package/src/transitions/canonicalTransition.packageContracts.js +22 -0
- package/src/transitions/canonicalTransition.productDefaults.js +105 -0
- package/src/transitions/canonicalTransition.schemaCache.case.mjs +45 -0
- package/src/transitions/canonicalTransition.schemaCache.js +81 -0
- package/src/transitions/canonicalTransition.semanticPackage.js +146 -0
- package/src/transitions/record.transitions.case.mjs +88 -0
- package/src/transitions/transition.authorityRepresentation.js +55 -0
- package/src/transitions/transition.availabilityPlanner.js +376 -0
- package/src/transitions/transition.availabilitySemantics.js +150 -0
- package/src/transitions/transition.definitionReadProjection.js +107 -0
- package/src/transitions/transition.definitionRegistry.js +355 -0
- package/src/transitions/transition.definitionRegistryAggregation.js +21 -0
- package/src/transitions/transition.definitions.js +46 -0
- package/src/transitions/transition.explicitGenerationPlanner.js +58 -0
- package/src/transitions/transition.generationInputPlanner.js +19 -0
- package/src/transitions/transition.interpretationMaterializer.js +2 -0
- package/src/transitions/transition.invocationBindingPacket.js +52 -0
- package/src/transitions/transition.invocationBindingPlanner.js +467 -0
- package/src/transitions/transition.legacyShorthand.js +133 -0
- package/src/transitions/transition.localArtifactMaterializers.js +16 -0
- package/src/transitions/transition.localCreateCapability.js +111 -0
- package/src/transitions/transition.outputMaterializationPlanner.js +336 -0
- package/src/transitions/transition.parentReference.js +90 -0
- package/src/transitions/transition.presentation.js +43 -0
- package/src/transitions/transition.productPreparation.js +377 -0
- package/src/transitions/transition.productPresentation.browser.js +28 -0
- package/src/transitions/transition.productPresentation.js +55 -0
- package/src/transitions/transition.referenceCreateCapability.js +119 -0
- package/src/transitions/transition.referenceTarget.js +50 -0
- package/src/transitions/transition.relationMaterializer.js +2 -0
- package/src/transitions/transition.resultSemantics.js +453 -0
- package/src/transitions/transition.taskMaterializer.js +2 -0
- package/src/transitions/transition.topicMaterializer.js +2 -0
- package/src/transitions/transition.validate.case.mjs +58 -0
- package/src/ui/cards/ArtifactCard.js +1 -0
- package/src/ui/cards/SchemaCard.js +1 -0
- package/src/ui/cards/SourceCard.js +1 -0
- package/src/ui/dialog.presenter.js +24 -0
- package/src/ui/feedback/DegradedNotice.js +1 -0
- package/src/ui/feedback/EmptyState.js +1 -0
- package/src/ui/feedback/ValidationNotice.js +1 -0
- package/src/ui/forms/FormRenderer.js +1 -0
- package/src/ui/forms/fields/MarkdownField.js +1 -0
- package/src/ui/forms/fields/SelectField.js +1 -0
- package/src/ui/forms/fields/SourcePickerField.js +1 -0
- package/src/ui/forms/fields/TextField.js +1 -0
- package/src/ui/icon.paths.js +37 -0
- package/src/ui/layout/Panel.js +1 -0
- package/src/ui/layout/ResponsiveFrame.js +1 -0
- package/src/ui/layout/SplitView.js +1 -0
- package/src/ui/layout/Stack.js +1 -0
- package/src/ui/panels/DetailPanel.js +1 -0
- package/src/ui/panels/LineagePanel.js +1 -0
- package/src/ui/panels/SourcePanel.js +1 -0
- package/src/ui/primitives/Badge.js +1 -0
- package/src/ui/primitives/Badge.jsx +5 -0
- package/src/ui/primitives/Button.js +1 -0
- package/src/ui/primitives/Button.jsx +12 -0
- package/src/ui/primitives/Card.js +1 -0
- package/src/ui/primitives/Field.js +1 -0
- package/src/ui/primitives/Field.jsx +21 -0
- package/src/ui/primitives/Icon.jsx +90 -0
- package/src/ui/primitives/Modal.jsx +27 -0
- package/src/validation/i18n.js +37 -0
- package/src/validation/validateArtifact.case.mjs +41 -0
- package/src/verses/column/ColumnVerse.js +1 -0
- package/src/verses/column/column.model.js +6 -0
- package/src/verses/column/column.project.js +7 -0
- package/src/verses/context.js +26 -0
- package/src/verses/contracts.js +1 -0
- package/src/verses/hostRegistry.js +47 -0
- package/src/verses/registry.js +22 -0
- package/src/verses/universe.model.js +8 -0
- package/src/verses/universe.presenter.js +8 -0
- package/src/verses/universe.project.js +12 -0
- package/src/viewer.js +34 -0
- package/src/workspace.model.js +5 -0
- package/src/workspaces/workspace.actions.js +1 -0
- package/src/workspaces/workspace.artifactActions.js +56 -0
- package/src/workspaces/workspace.auditView.js +153 -0
- package/src/workspaces/workspace.candidates.js +149 -0
- package/src/workspaces/workspace.config.js +153 -0
- package/src/workspaces/workspace.configuredSource.js +68 -0
- package/src/workspaces/workspace.discoveryProgress.js +34 -0
- package/src/workspaces/workspace.discoveryView.js +386 -0
- package/src/workspaces/workspace.displayFilters.js +63 -0
- package/src/workspaces/workspace.displayOptions.js +58 -0
- package/src/workspaces/workspace.emptyStateCopy.js +24 -0
- package/src/workspaces/workspace.entrypointLifecycle.js +131 -0
- package/src/workspaces/workspace.entrypointViewIntent.js +83 -0
- package/src/workspaces/workspace.entrypoints.js +157 -0
- package/src/workspaces/workspace.feedSort.js +152 -0
- package/src/workspaces/workspace.import.js +212 -0
- package/src/workspaces/workspace.importConflicts.js +200 -0
- package/src/workspaces/workspace.importLifecycle.case.mjs +103 -0
- package/src/workspaces/workspace.lifecycle.case.mjs +353 -0
- package/src/workspaces/workspace.lifecycle.js +357 -0
- package/src/workspaces/workspace.lineageView.js +244 -0
- package/src/workspaces/workspace.localSourceLifecycle.js +91 -0
- package/src/workspaces/workspace.materialLedger.js +110 -0
- package/src/workspaces/workspace.materialReconciliation.case.mjs +164 -0
- package/src/workspaces/workspace.materialReconciliation.js +390 -0
- package/src/workspaces/workspace.memberIdentity.js +140 -0
- package/src/workspaces/workspace.model.js +2 -0
- package/src/workspaces/workspace.navigation.js +20 -0
- package/src/workspaces/workspace.openSemantics.js +33 -0
- package/src/workspaces/workspace.pathTree.js +132 -0
- package/src/workspaces/workspace.persistence.case.mjs +271 -0
- package/src/workspaces/workspace.persistence.js +469 -0
- package/src/workspaces/workspace.persistenceCache.js +41 -0
- package/src/workspaces/workspace.persistenceClear.js +45 -0
- package/src/workspaces/workspace.persistencePresentation.js +93 -0
- package/src/workspaces/workspace.persistenceRecovery.js +147 -0
- package/src/workspaces/workspace.persistenceRouteCache.js +82 -0
- package/src/workspaces/workspace.publicationReceipts.case.mjs +36 -0
- package/src/workspaces/workspace.publicationReceipts.js +56 -0
- package/src/workspaces/workspace.recoverabilityView.js +264 -0
- package/src/workspaces/workspace.route.js +432 -0
- package/src/workspaces/workspace.runtimeCanonical.js +18 -0
- package/src/workspaces/workspace.sourceMaterial.js +71 -0
- package/src/workspaces/workspace.sourceRecordPath.js +5 -0
- package/src/workspaces/workspace.sourceRecords.js +75 -0
- package/src/workspaces/workspace.store.js +3 -0
- package/src/workspaces/workspace.summary.js +116 -0
- 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.
|