diff --git a/.tegami/asset-owned-catalog-chunk-values.md b/.tegami/asset-owned-catalog-chunk-values.md new file mode 100644 index 00000000..503b3e00 --- /dev/null +++ b/.tegami/asset-owned-catalog-chunk-values.md @@ -0,0 +1,13 @@ +--- +packages: + orgmemory: patch +subject: Move catalog and chunk values to Knowledge Asset +--- + +# Move catalog and chunk values to Knowledge Asset + +## Improvements + +Knowledge Asset now owns its catalog projection, normalized text-chunk value, +and PostgreSQL vector encoding, so Retrieval and other consumers depend on the +domain that persists and publishes those values. diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 7e903ae2..753d6b97 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -131,6 +131,9 @@ replaced. Asset promotion receives validated normalized facts through a Source Ledger-owned request, and Asset publication advances the current source revision through a Source Ledger-owned `MANDATORY` service inside the existing publication transaction; Asset consumes no Source Ledger entity or repository. +Asset also owns catalog projections, normalized chunk values, and the pgvector +encoding used by its chunk store; Retrieval and Asset Registry consume those +root-package Asset contracts rather than owning persistence-facing DTOs. Asset and Retrieval remain explicitly open while their remaining cross-owned persistence and orchestration seams are replaced by intentional APIs. diff --git a/apps/api/src/main/java/com/orgmemory/api/knowledge/KnowledgeCatalogController.java b/apps/api/src/main/java/com/orgmemory/api/knowledge/KnowledgeCatalogController.java index 5ebb0234..f33d4531 100644 --- a/apps/api/src/main/java/com/orgmemory/api/knowledge/KnowledgeCatalogController.java +++ b/apps/api/src/main/java/com/orgmemory/api/knowledge/KnowledgeCatalogController.java @@ -1,7 +1,7 @@ package com.orgmemory.api.knowledge; import com.orgmemory.api.security.CurrentActorProvider; -import com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogItem; +import com.orgmemory.core.knowledge.asset.KnowledgeCatalogItem; import com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogService; import io.swagger.v3.oas.annotations.Operation; import java.util.List; diff --git a/apps/api/src/test/java/com/orgmemory/api/assetregistry/AssetRegistryIntegrationTests.java b/apps/api/src/test/java/com/orgmemory/api/assetregistry/AssetRegistryIntegrationTests.java index 8356f562..4f990a07 100644 --- a/apps/api/src/test/java/com/orgmemory/api/assetregistry/AssetRegistryIntegrationTests.java +++ b/apps/api/src/test/java/com/orgmemory/api/assetregistry/AssetRegistryIntegrationTests.java @@ -55,7 +55,7 @@ import com.orgmemory.core.authorization.RelationshipTupleWriteResult; import com.orgmemory.core.authorization.ResourceRef; import com.orgmemory.core.shared.error.BusinessValidationException; -import com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogItem; +import com.orgmemory.core.knowledge.asset.KnowledgeCatalogItem; import com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogService; import com.orgmemory.core.knowledge.retrieval.QueryEmbeddingPort; import com.orgmemory.core.knowledge.retrieval.PermissionAwareKnowledgeSearch; diff --git a/apps/worker/src/main/java/com/orgmemory/worker/ingestion/SourceIngestionProcessor.java b/apps/worker/src/main/java/com/orgmemory/worker/ingestion/SourceIngestionProcessor.java index 9d2c88d2..fc3573d0 100644 --- a/apps/worker/src/main/java/com/orgmemory/worker/ingestion/SourceIngestionProcessor.java +++ b/apps/worker/src/main/java/com/orgmemory/worker/ingestion/SourceIngestionProcessor.java @@ -25,7 +25,7 @@ import com.orgmemory.core.knowledge.retrieval.EmbeddingProfileSpec; import com.orgmemory.core.knowledge.asset.KnowledgeAssetRef; import com.orgmemory.core.knowledge.asset.KnowledgeChunkDraftAssembler; -import com.orgmemory.core.knowledge.retrieval.KnowledgeTextChunk; +import com.orgmemory.core.knowledge.asset.KnowledgeTextChunk; import com.orgmemory.core.knowledge.asset.KnowledgeAssetPublicationService; import com.orgmemory.core.knowledge.asset.PublishKnowledgeAssetCommand; import com.orgmemory.core.knowledge.storage.ObjectKey; diff --git a/core/src/main/java/com/orgmemory/core/assetregistry/CapabilityPackService.java b/core/src/main/java/com/orgmemory/core/assetregistry/CapabilityPackService.java index 18426006..762db065 100644 --- a/core/src/main/java/com/orgmemory/core/assetregistry/CapabilityPackService.java +++ b/core/src/main/java/com/orgmemory/core/assetregistry/CapabilityPackService.java @@ -1,6 +1,6 @@ package com.orgmemory.core.assetregistry; -import com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogItem; +import com.orgmemory.core.knowledge.asset.KnowledgeCatalogItem; import com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogService; import com.orgmemory.core.organization.CurrentActor; import java.time.Instant; diff --git a/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeAssetVersionRepository.java b/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeAssetVersionRepository.java index 2700a013..5e664fea 100644 --- a/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeAssetVersionRepository.java +++ b/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeAssetVersionRepository.java @@ -1,7 +1,5 @@ package com.orgmemory.core.knowledge.asset; -import com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogItem; - import java.util.Optional; import java.util.Collection; import java.util.List; @@ -20,7 +18,7 @@ Optional findByKnowledgeAssetIdAndStatus( UUID knowledgeAssetId, KnowledgeAssetVersionStatus status); @Query(""" - select new com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogItem( + select new com.orgmemory.core.knowledge.asset.KnowledgeCatalogItem( asset.id, version.id, version.versionNumber, @@ -46,7 +44,7 @@ List findCurrentCatalogItems( @Param("assetIds") Collection assetIds); @Query(""" - select new com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogItem( + select new com.orgmemory.core.knowledge.asset.KnowledgeCatalogItem( asset.id, version.id, version.versionNumber, diff --git a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/KnowledgeCatalogItem.java b/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeCatalogItem.java similarity index 75% rename from core/src/main/java/com/orgmemory/core/knowledge/retrieval/KnowledgeCatalogItem.java rename to core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeCatalogItem.java index 9900a1bd..54282d04 100644 --- a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/KnowledgeCatalogItem.java +++ b/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeCatalogItem.java @@ -1,8 +1,9 @@ -package com.orgmemory.core.knowledge.retrieval; +package com.orgmemory.core.knowledge.asset; import com.orgmemory.core.permission.KnowledgeClassification; import java.util.UUID; +/** Asset-owned catalog projection for one current or historical version. */ public record KnowledgeCatalogItem( UUID knowledgeAssetId, UUID knowledgeVersionId, diff --git a/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkDraftAssembler.java b/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkDraftAssembler.java index fac1f3e0..7e92c3a4 100644 --- a/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkDraftAssembler.java +++ b/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkDraftAssembler.java @@ -1,7 +1,5 @@ package com.orgmemory.core.knowledge.asset; -import com.orgmemory.core.knowledge.retrieval.KnowledgeTextChunk; - import java.util.ArrayList; import java.util.List; import java.util.Objects; diff --git a/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkProjectionStore.java b/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkProjectionStore.java index 24c5fe99..9329c85d 100644 --- a/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkProjectionStore.java +++ b/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkProjectionStore.java @@ -1,7 +1,6 @@ package com.orgmemory.core.knowledge.asset; import com.orgmemory.core.knowledge.retrieval.EmbeddingProfileRef; -import com.orgmemory.core.knowledge.retrieval.PgVectorLiteral; import java.sql.Types; import java.time.Instant; diff --git a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/KnowledgeTextChunk.java b/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeTextChunk.java similarity index 86% rename from core/src/main/java/com/orgmemory/core/knowledge/retrieval/KnowledgeTextChunk.java rename to core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeTextChunk.java index bb446d84..e1f318f0 100644 --- a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/KnowledgeTextChunk.java +++ b/core/src/main/java/com/orgmemory/core/knowledge/asset/KnowledgeTextChunk.java @@ -1,8 +1,9 @@ -package com.orgmemory.core.knowledge.retrieval; +package com.orgmemory.core.knowledge.asset; -import java.util.Objects; import java.util.List; +import java.util.Objects; +/** Asset-owned normalized text and source-location facts for one chunk. */ public record KnowledgeTextChunk( String content, Integer startPage, diff --git a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/PgVectorLiteral.java b/core/src/main/java/com/orgmemory/core/knowledge/asset/PgVectorLiteral.java similarity index 83% rename from core/src/main/java/com/orgmemory/core/knowledge/retrieval/PgVectorLiteral.java rename to core/src/main/java/com/orgmemory/core/knowledge/asset/PgVectorLiteral.java index f7db8b09..198699a7 100644 --- a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/PgVectorLiteral.java +++ b/core/src/main/java/com/orgmemory/core/knowledge/asset/PgVectorLiteral.java @@ -1,7 +1,8 @@ -package com.orgmemory.core.knowledge.retrieval; +package com.orgmemory.core.knowledge.asset; import com.orgmemory.graphrag.model.FloatVector; +/** PostgreSQL vector encoding used by Asset chunk persistence and Retrieval queries. */ public final class PgVectorLiteral { private PgVectorLiteral() {} @@ -31,7 +32,8 @@ public static FloatVector parse(String encoded) { float[] values = new float[parts.length]; for (int index = 0; index < parts.length; index++) { if (parts[index].isBlank()) { - throw new IllegalArgumentException("pgvector literal components must not be empty"); + throw new IllegalArgumentException( + "pgvector literal components must not be empty"); } values[index] = Float.parseFloat(parts[index]); } diff --git a/core/src/main/java/com/orgmemory/core/knowledge/asset/package-info.java b/core/src/main/java/com/orgmemory/core/knowledge/asset/package-info.java index f1e79378..e4ed08e4 100644 --- a/core/src/main/java/com/orgmemory/core/knowledge/asset/package-info.java +++ b/core/src/main/java/com/orgmemory/core/knowledge/asset/package-info.java @@ -3,8 +3,9 @@ * *

Graph consumers now resolve immutable asset, version, and chunk facts through an Asset-owned * query boundary. Promotion and source publication use Source Ledger-owned contracts rather than - * its entities or repositories. This nested module remains open while direct Retrieval and - * external Asset Registry dependencies are replaced with intentional APIs. + * its entities or repositories. Catalog projections, normalized text chunks, and pgvector + * encoding are Asset-owned values consumed by Retrieval and Asset Registry. This nested module + * remains open while its remaining direct Retrieval behavior is replaced with intentional APIs. */ @org.springframework.modulith.ApplicationModule( type = org.springframework.modulith.ApplicationModule.Type.OPEN) diff --git a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/KnowledgeCatalogService.java b/core/src/main/java/com/orgmemory/core/knowledge/retrieval/KnowledgeCatalogService.java index 382fda1e..30f806a1 100644 --- a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/KnowledgeCatalogService.java +++ b/core/src/main/java/com/orgmemory/core/knowledge/retrieval/KnowledgeCatalogService.java @@ -1,5 +1,6 @@ package com.orgmemory.core.knowledge.retrieval; +import com.orgmemory.core.knowledge.asset.KnowledgeCatalogItem; import com.orgmemory.core.knowledge.asset.KnowledgeAssetVersionRepository; import com.orgmemory.core.organization.CurrentActor; import java.util.List; diff --git a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/SecureKnowledgeRetrievalStore.java b/core/src/main/java/com/orgmemory/core/knowledge/retrieval/SecureKnowledgeRetrievalStore.java index eea85e30..c22f3436 100644 --- a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/SecureKnowledgeRetrievalStore.java +++ b/core/src/main/java/com/orgmemory/core/knowledge/retrieval/SecureKnowledgeRetrievalStore.java @@ -1,6 +1,6 @@ package com.orgmemory.core.knowledge.retrieval; -import com.orgmemory.core.knowledge.retrieval.QueryEmbedding; +import com.orgmemory.core.knowledge.asset.PgVectorLiteral; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; diff --git a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/package-info.java b/core/src/main/java/com/orgmemory/core/knowledge/retrieval/package-info.java index 9a6ae6ba..cdf6a62b 100644 --- a/core/src/main/java/com/orgmemory/core/knowledge/retrieval/package-info.java +++ b/core/src/main/java/com/orgmemory/core/knowledge/retrieval/package-info.java @@ -3,8 +3,9 @@ * query embeddings, and projection identity. * *

This nested module also implements the source-owned visibility and embedding-profile ports. - * Graph indexing now resolves profiles through the registry instead of profile persistence. The - * module remains open while its broader sibling-module consumer surface is replaced by + * Graph indexing now resolves profiles through the registry instead of profile persistence. + * Catalog, text-chunk, and vector-literal values belong to Asset and are consumed here one way. + * The module remains open while its broader sibling-module consumer surface is replaced by * intentional interfaces during the Knowledge module-closing phase. */ @org.springframework.modulith.ApplicationModule( diff --git a/core/src/test/java/com/orgmemory/core/ModulithVerificationTests.java b/core/src/test/java/com/orgmemory/core/ModulithVerificationTests.java index 20db1c72..eb7152f7 100644 --- a/core/src/test/java/com/orgmemory/core/ModulithVerificationTests.java +++ b/core/src/test/java/com/orgmemory/core/ModulithVerificationTests.java @@ -603,6 +603,40 @@ void knowledgeAssetConsumesOnlySourceLedgerPublicContracts() { consumedTypes); } + @Test + void knowledgeAssetOwnsItsCatalogAndChunkValues() { + var assetClasses = new ClassFileImporter() + .importPackages("com.orgmemory.core.knowledge.asset"); + var expectedOwnedTypes = Set.of( + "com.orgmemory.core.knowledge.asset.KnowledgeCatalogItem", + "com.orgmemory.core.knowledge.asset.KnowledgeTextChunk", + "com.orgmemory.core.knowledge.asset.PgVectorLiteral"); + + noClasses() + .that() + .resideInAPackage("com.orgmemory.core.knowledge.asset..") + .should() + .dependOnClassesThat() + .haveFullyQualifiedName( + "com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogItem") + .orShould() + .dependOnClassesThat() + .haveFullyQualifiedName( + "com.orgmemory.core.knowledge.retrieval.KnowledgeTextChunk") + .orShould() + .dependOnClassesThat() + .haveFullyQualifiedName( + "com.orgmemory.core.knowledge.retrieval.PgVectorLiteral") + .check(assetClasses); + + var ownedTypes = assetClasses.stream() + .map(type -> type.getName()) + .filter(expectedOwnedTypes::contains) + .collect(TreeSet::new, Set::add, Set::addAll); + + assertEquals(expectedOwnedTypes, ownedTypes); + } + @Test void knowledgeGraphIsAClosedNestedModule() { var graph = modules.getModuleByName("knowledge.graph").orElseThrow(); @@ -660,8 +694,6 @@ void knowledgeRetrievalTemporaryOpenBoundaryDoesNotGainNewConsumers() { "com.orgmemory.core.assistant.AssistantService", "com.orgmemory.core.knowledge.asset.KnowledgeAssetLifecycleService", "com.orgmemory.core.knowledge.asset.KnowledgeAssetPublicationOutbox", - "com.orgmemory.core.knowledge.asset.KnowledgeAssetVersionRepository", - "com.orgmemory.core.knowledge.asset.KnowledgeChunkDraftAssembler", "com.orgmemory.core.knowledge.asset.KnowledgeChunkProjectionStore", "com.orgmemory.core.knowledge.asset.PublishKnowledgeAssetCommand", "com.orgmemory.core.knowledge.connector.ConnectorEmbeddingResult", @@ -678,14 +710,11 @@ void knowledgeRetrievalTemporaryOpenBoundaryDoesNotGainNewConsumers() { Set.of( "com.orgmemory.core.knowledge.retrieval.EmbeddingProfileRef", "com.orgmemory.core.knowledge.retrieval.EmbeddingProfileRegistry", - "com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogItem", "com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogService", "com.orgmemory.core.knowledge.retrieval.KnowledgeEvidenceScopeResolver", "com.orgmemory.core.knowledge.retrieval.KnowledgeProjectionNamespaces", "com.orgmemory.core.knowledge.retrieval.KnowledgeRetrievalUnavailableException", - "com.orgmemory.core.knowledge.retrieval.KnowledgeTextChunk", "com.orgmemory.core.knowledge.retrieval.PermissionAwareKnowledgeSearch", - "com.orgmemory.core.knowledge.retrieval.PgVectorLiteral", "com.orgmemory.core.knowledge.retrieval.ResolvedKnowledgeEvidenceScope", "com.orgmemory.core.knowledge.retrieval.RetrievedKnowledgeEvidence", "com.orgmemory.core.knowledge.retrieval.SecureKnowledgeRetrievalStore", @@ -730,12 +759,15 @@ void knowledgeAssetTemporaryOpenBoundaryDoesNotGainNewConsumers() { assertEquals( Set.of( + "com.orgmemory.core.assetregistry.AssetDeliveryService", + "com.orgmemory.core.assetregistry.CapabilityPackService", "com.orgmemory.core.knowledge.retrieval.AuthorizationResourceDirectory", "com.orgmemory.core.knowledge.graph.GraphIndexingCoordinator", "com.orgmemory.core.knowledge.graph.GraphIndexJobQueue", "com.orgmemory.core.knowledge.graph.GraphIndexLifecycleService", "com.orgmemory.core.knowledge.retrieval.KnowledgeCatalogService", "com.orgmemory.core.knowledge.retrieval.KnowledgeEvidenceScopeResolver", + "com.orgmemory.core.knowledge.retrieval.SecureKnowledgeRetrievalStore", "com.orgmemory.core.knowledge.graph.KnowledgeGraphCurationService", "com.orgmemory.core.knowledge.connector.ConnectorReconciler", "com.orgmemory.core.knowledge.connector.ConnectorSourceRevisionCoordinator"), @@ -752,7 +784,9 @@ void knowledgeAssetTemporaryOpenBoundaryDoesNotGainNewConsumers() { "com.orgmemory.core.knowledge.asset.KnowledgeAssetVersion", "com.orgmemory.core.knowledge.asset.KnowledgeAssetVersionGraphRef", "com.orgmemory.core.knowledge.asset.KnowledgeAssetVersionRepository", + "com.orgmemory.core.knowledge.asset.KnowledgeCatalogItem", "com.orgmemory.core.knowledge.asset.KnowledgeChunkDraft", + "com.orgmemory.core.knowledge.asset.PgVectorLiteral", "com.orgmemory.core.knowledge.asset.PublishKnowledgeAssetCommand"), consumedInternalTypes); } diff --git a/core/src/test/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkDraftAssemblerTests.java b/core/src/test/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkDraftAssemblerTests.java index ff93c196..ea910d2c 100644 --- a/core/src/test/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkDraftAssemblerTests.java +++ b/core/src/test/java/com/orgmemory/core/knowledge/asset/KnowledgeChunkDraftAssemblerTests.java @@ -1,7 +1,5 @@ package com.orgmemory.core.knowledge.asset; -import com.orgmemory.core.knowledge.retrieval.KnowledgeTextChunk; - import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/core/src/test/java/com/orgmemory/core/knowledge/retrieval/PgVectorLiteralTests.java b/core/src/test/java/com/orgmemory/core/knowledge/asset/PgVectorLiteralTests.java similarity index 94% rename from core/src/test/java/com/orgmemory/core/knowledge/retrieval/PgVectorLiteralTests.java rename to core/src/test/java/com/orgmemory/core/knowledge/asset/PgVectorLiteralTests.java index 8e75f39b..15b475c2 100644 --- a/core/src/test/java/com/orgmemory/core/knowledge/retrieval/PgVectorLiteralTests.java +++ b/core/src/test/java/com/orgmemory/core/knowledge/asset/PgVectorLiteralTests.java @@ -1,4 +1,4 @@ -package com.orgmemory.core.knowledge.retrieval; +package com.orgmemory.core.knowledge.asset; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/core/src/test/java/com/orgmemory/core/knowledge/retrieval/KnowledgeCatalogServiceTests.java b/core/src/test/java/com/orgmemory/core/knowledge/retrieval/KnowledgeCatalogServiceTests.java index cce243c8..29c27469 100644 --- a/core/src/test/java/com/orgmemory/core/knowledge/retrieval/KnowledgeCatalogServiceTests.java +++ b/core/src/test/java/com/orgmemory/core/knowledge/retrieval/KnowledgeCatalogServiceTests.java @@ -6,6 +6,7 @@ import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; +import com.orgmemory.core.knowledge.asset.KnowledgeCatalogItem; import com.orgmemory.core.knowledge.asset.KnowledgeAssetVersionRepository; import com.orgmemory.core.organization.CurrentActor; import com.orgmemory.core.permission.KnowledgeClassification; diff --git a/docs/increments/active/2026-07-31-spring-modulith-package-refactor/plan.md b/docs/increments/active/2026-07-31-spring-modulith-package-refactor/plan.md index 005d2c8c..d70f3394 100644 --- a/docs/increments/active/2026-07-31-spring-modulith-package-refactor/plan.md +++ b/docs/increments/active/2026-07-31-spring-modulith-package-refactor/plan.md @@ -893,7 +893,7 @@ temporary open-owner documentation were fixed, while the duplicate challenge record request was answered with the existing Fable 5 verdict. Direct audit confirmed all three review threads resolved before merge. -## Current Pull Request Gates +## Thirty-second Pull Request Evidence - The Source Ledger-owned promotion request carries every validated normalized fact needed to create an immutable Asset version; the Asset adapter no longer @@ -920,3 +920,46 @@ mirrored domain pairs; all 37 release-policy tests passed under Node 24.15; and the terminating repository-wide `clean test` completed successfully in 1m02s across 99 tasks. Mechanical package, zero-byte, migration-name, diff, zero Asset-to-Source-Ledger-persistence-import, and 14-path scope checks passed. + +PR #233 merged as `9e2e7248` after all required CI checks passed. CodeRabbit +was rate limited, and direct inspection confirmed zero inline comments, +reviews, or review threads before merge. + +## Current Pull Request Gates + +- `KnowledgeCatalogItem`, `KnowledgeTextChunk`, and `PgVectorLiteral` move from + Retrieval to their Asset owner without changing their data shape or behavior. +- Asset persistence and assembly no longer depend on those Retrieval types; + Retrieval, Asset Registry, API, and Worker consumers now import Asset-owned + root contracts, making the dependency direction one way for these values. +- JPQL constructor projections target the new Asset FQN, vector parsing tests + move with the utility, and catalog/chunk tests retain their previous coverage. +- A failing-first ArchUnit regression proves the three old Asset-to-Retrieval + edges existed, then prevents them from returning; exact temporary-boundary + assertions pin the reduced Retrieval consumer/type surface and expanded + Asset-owned surface. +- Full Core/API/Worker tests pass and the code PR remains below 100 files before + the remaining embedding-profile and projection-namespace seams are handled. + +Pre-PR verification completed: the new ownership test failed first against the +three Retrieval-owned values, then repository compilation passed in 14s and +focused moved-value/catalog/chunk/Modulith tests passed in 29s. The combined +full Core/API/Worker gate passed in 5m48s; the documentation operating-model +check passed across 446 Markdown files and 8 mirrored domain pairs; all 37 +release-policy tests passed under Node 24.15; and the terminating repository +`clean test` completed successfully in 58s across 99 tasks. Mechanical package, +zero-byte, migration-name, diff, zero old-Retrieval-value-import, and 25-path +scope checks passed. + +After merging current `origin/main`, the focused moved-value and Modulith tests +passed again in 7s; the documentation check passed across 451 Markdown files; +all 37 release-policy tests passed again under Node 24.15; and the final PR diff +contains 21 paths because Git recognizes the four package moves as renames. + +CodeRabbit review found that the ownership regression proved only absence of +the three legacy Retrieval names. The test now also asserts the exact three +Asset-owned class names, so deletion or relocation outside Asset fails alongside +any reintroduced legacy dependency. + +Review-fix verification passed: the focused positive/negative ownership test in +25s, full `:core:test` in 1m43s, and the 451-file documentation check.