conexus 6.3.3__tar.gz → 6.3.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. {conexus-6.3.3 → conexus-6.3.4}/PKG-INFO +1 -1
  2. {conexus-6.3.3 → conexus-6.3.4}/mcpb/pyproject.toml +2 -2
  3. {conexus-6.3.3 → conexus-6.3.4}/pyproject.toml +1 -1
  4. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/CatalogRepository.java +168 -36
  5. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/CatalogHandler.java +81 -0
  6. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogRepositoryTest.java +95 -0
  7. conexus-6.3.4/service/src/test/java/dev/nexus/service/http/CatalogHandlerUpdateManyDeleteManyTest.java +232 -0
  8. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/factory.py +102 -9
  9. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/http_catalog_client.py +86 -1
  10. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog.py +11 -2
  11. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/maintenance.py +14 -4
  12. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/remediation.py +12 -4
  13. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/binary_install.py +1 -1
  14. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_aspect_queue.py +1 -1
  15. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_centroid_store.py +1 -1
  16. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_document_aspects_store.py +1 -1
  17. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_document_highlights_store.py +1 -1
  18. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_memory_store.py +1 -1
  19. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_plan_library.py +1 -1
  20. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_taxonomy_store.py +1 -1
  21. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_telemetry_store.py +1 -1
  22. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_token_store.py +1 -1
  23. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/indexer.py +82 -7
  24. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp_infra.py +65 -5
  25. {conexus-6.3.3 → conexus-6.3.4}/.beads/README.md +0 -0
  26. {conexus-6.3.3 → conexus-6.3.4}/.gitignore +0 -0
  27. {conexus-6.3.3 → conexus-6.3.4}/LICENSE +0 -0
  28. {conexus-6.3.3 → conexus-6.3.4}/README.md +0 -0
  29. {conexus-6.3.3 → conexus-6.3.4}/conexus/README.md +0 -0
  30. {conexus-6.3.3 → conexus-6.3.4}/conexus/agents/_shared/README.md +0 -0
  31. {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/com.nexus.service.plist +0 -0
  32. {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/com.nexus.t2.plist +0 -0
  33. {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/com.nexus.t3.plist +0 -0
  34. {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/nexus-service.service +0 -0
  35. {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/nexus-t2.service +0 -0
  36. {conexus-6.3.3 → conexus-6.3.4}/conexus/daemon/nexus-t3.service +0 -0
  37. {conexus-6.3.3 → conexus-6.3.4}/conexus/hooks/scripts/routing/README.md +0 -0
  38. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/abstract-themes.yml +0 -0
  39. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/analyze-default.yml +0 -0
  40. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/citation-traversal.yml +0 -0
  41. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/debug-default.yml +0 -0
  42. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/document-default.yml +0 -0
  43. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/find-by-author.yml +0 -0
  44. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/hybrid-factual-lookup.yml +0 -0
  45. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/plan-author-default.yml +0 -0
  46. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/plan-inspect-default.yml +0 -0
  47. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/plan-inspect-dimensions.yml +0 -0
  48. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/plan-promote-propose.yml +0 -0
  49. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/research-default.yml +0 -0
  50. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/review-default.yml +0 -0
  51. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/traverse-then-generate.yml +0 -0
  52. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/builtin/type-scoped-search.yml +0 -0
  53. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/dimensions.yml +0 -0
  54. {conexus-6.3.3 → conexus-6.3.4}/conexus/plans/purposes.yml +0 -0
  55. {conexus-6.3.3 → conexus-6.3.4}/data/calibration/rdr-109/README.md +0 -0
  56. {conexus-6.3.3 → conexus-6.3.4}/docs/README.md +0 -0
  57. {conexus-6.3.3 → conexus-6.3.4}/docs/migration/README.md +0 -0
  58. {conexus-6.3.3 → conexus-6.3.4}/docs/rdr/README.md +0 -0
  59. {conexus-6.3.3 → conexus-6.3.4}/dt/scripts/Index Current Group in nx.applescript +0 -0
  60. {conexus-6.3.3 → conexus-6.3.4}/dt/scripts/Index Selection in nx (Knowledge).applescript +0 -0
  61. {conexus-6.3.3 → conexus-6.3.4}/dt/scripts/Index Selection in nx.applescript +0 -0
  62. {conexus-6.3.3 → conexus-6.3.4}/mcpb/src/server.py +0 -0
  63. {conexus-6.3.3 → conexus-6.3.4}/scripts/cron/README.md +0 -0
  64. {conexus-6.3.3 → conexus-6.3.4}/scripts/launchd/README.md +0 -0
  65. {conexus-6.3.3 → conexus-6.3.4}/scripts/rdr152-sandbox/README.md +0 -0
  66. {conexus-6.3.3 → conexus-6.3.4}/scripts/spikes/s04-build/src/main/java/dev/nexus/spike/s04/Main.java +0 -0
  67. {conexus-6.3.3 → conexus-6.3.4}/scripts/spikes/s04-build/src/main/resources/META-INF/native-image/reachability-metadata.json +0 -0
  68. {conexus-6.3.3 → conexus-6.3.4}/scripts/spikes/s04-build/src/main/resources/db/changelog/db.changelog-master.xml +0 -0
  69. {conexus-6.3.3 → conexus-6.3.4}/scripts/spikes/s04-build/src/main/resources/logback.xml +0 -0
  70. {conexus-6.3.3 → conexus-6.3.4}/service/README.md +0 -0
  71. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/Main.java +0 -0
  72. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/NexusService.java +0 -0
  73. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/AspectRepository.java +0 -0
  74. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/ChashRepository.java +0 -0
  75. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/CollectionRegistry.java +0 -0
  76. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/DeadlockRetry.java +0 -0
  77. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/MemoryRepository.java +0 -0
  78. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/MigrationJobRepository.java +0 -0
  79. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/PgSession.java +0 -0
  80. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/PlanRepository.java +0 -0
  81. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/PoolerModeCheck.java +0 -0
  82. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/SchemaMigrator.java +0 -0
  83. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/ScratchRepository.java +0 -0
  84. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/SessionPrincipal.java +0 -0
  85. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TaxonomyRepository.java +0 -0
  86. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TelemetryRepository.java +0 -0
  87. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TenantConstants.java +0 -0
  88. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TenantScope.java +0 -0
  89. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TokenCache.java +0 -0
  90. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TokenHashing.java +0 -0
  91. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/db/TokenStore.java +0 -0
  92. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/AspectHandler.java +0 -0
  93. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/AuthFilter.java +0 -0
  94. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/ChashHandler.java +0 -0
  95. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/HealthHandler.java +0 -0
  96. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/HttpUtil.java +0 -0
  97. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/MemoryHandler.java +0 -0
  98. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/MigrationHandler.java +0 -0
  99. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/PlanHandler.java +0 -0
  100. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/RequestContext.java +0 -0
  101. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/ScratchHandler.java +0 -0
  102. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/SessionTokenHandler.java +0 -0
  103. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/TaxonomyHandler.java +0 -0
  104. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/TelemetryHandler.java +0 -0
  105. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/TokenAdminHandler.java +0 -0
  106. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/VectorHandler.java +0 -0
  107. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/VersionHandler.java +0 -0
  108. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/http/WhoamiHandler.java +0 -0
  109. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/jooq/binding/Vector.java +0 -0
  110. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/jooq/binding/VectorBinding.java +0 -0
  111. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/nativeimage/JooqRecordReflectionFeature.java +0 -0
  112. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/ChromaSchemeHandler.java +0 -0
  113. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/ChunkTextFetcher.java +0 -0
  114. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/HttpsSchemeHandler.java +0 -0
  115. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/ResolveResult.java +0 -0
  116. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/UnknownSchemeException.java +0 -0
  117. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/UriSchemeHandler.java +0 -0
  118. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/resolver/UriSchemeResolverRegistry.java +0 -0
  119. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/Bge768Embedder.java +0 -0
  120. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/CceEmbedder.java +0 -0
  121. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/ChromaQuotaValidator.java +0 -0
  122. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/ChromaRestClient.java +0 -0
  123. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/DimTables.java +0 -0
  124. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/EgressProxy.java +0 -0
  125. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/EmbedResult.java +0 -0
  126. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/Embedder.java +0 -0
  127. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/EmbedderRouter.java +0 -0
  128. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/EmbeddingModelUnavailableException.java +0 -0
  129. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/LocalChromaServer.java +0 -0
  130. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/OnnxEmbedder.java +0 -0
  131. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/PgVectorRepository.java +0 -0
  132. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/TaxonomyCentroidRepository.java +0 -0
  133. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/VectorRepository.java +0 -0
  134. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/java/dev/nexus/service/vectors/VoyageEmbedder.java +0 -0
  135. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/META-INF/native-image/native-image.properties +0 -0
  136. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/META-INF/native-image/reflect-config.json +0 -0
  137. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/META-INF/native-image/resource-config.json +0 -0
  138. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/META-INF/native-image/traced/reachability-metadata.json +0 -0
  139. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/META-INF/nexus/release.properties +0 -0
  140. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/aspects-001-baseline.xml +0 -0
  141. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/aspects-002-next-retry-at.xml +0 -0
  142. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-001-baseline.xml +0 -0
  143. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-002-hygiene.xml +0 -0
  144. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-003-soft-delete.xml +0 -0
  145. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-004-manifest-functions.xml +0 -0
  146. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-005-collection-vector-stats.xml +0 -0
  147. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-006-combined-query-functions.xml +0 -0
  148. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-007-graph-hop-functions.xml +0 -0
  149. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-008-combined-query-extensions.xml +0 -0
  150. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-009-read-shape-views.xml +0 -0
  151. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/catalog-011-collection-health-stale-age.xml +0 -0
  152. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/chash-001-baseline.xml +0 -0
  153. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/db.changelog-master.xml +0 -0
  154. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/fk-001-catalog-cross-store.xml +0 -0
  155. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/fk-002-collection-registry.xml +0 -0
  156. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/fk-002-validate.xml +0 -0
  157. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/fk-003-collection-registry-extra.xml +0 -0
  158. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/fk-003-validate.xml +0 -0
  159. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/grants-nexus-svc.xml +0 -0
  160. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/memory-001-baseline.xml +0 -0
  161. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/migration-001-baseline.xml +0 -0
  162. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/perf-001-rename-collection-indexes.xml +0 -0
  163. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/plans-001-baseline.xml +0 -0
  164. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/role-001-nexus-svc.xml +0 -0
  165. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/service-tokens-001-baseline.xml +0 -0
  166. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/service-tokens-002-single-root-index.xml +0 -0
  167. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/t1-001-baseline.xml +0 -0
  168. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/taxonomy-001-baseline.xml +0 -0
  169. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/taxonomy-002-centroids.xml +0 -0
  170. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/taxonomy-003-doc-count-trigger.xml +0 -0
  171. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/taxonomy-004-dedup-root-topics.xml +0 -0
  172. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/telemetry-001-baseline.xml +0 -0
  173. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/updated-at-001-triggers.xml +0 -0
  174. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/vectors-001-baseline.xml +0 -0
  175. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/db/changelog/vectors-002-trgm-index.xml +0 -0
  176. {conexus-6.3.3 → conexus-6.3.4}/service/src/main/resources/logback.xml +0 -0
  177. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/AspectOperatorQueryTest.java +0 -0
  178. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/AspectRepositoryTest.java +0 -0
  179. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/AuthFilterTest.java +0 -0
  180. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/Bge768ParityTest.java +0 -0
  181. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/Bge768ServiceEmbedIntegrationTest.java +0 -0
  182. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/BridgeAddressFieldsTest.java +0 -0
  183. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogDeleteCollectionCascadeTest.java +0 -0
  184. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogDocumentCascadeTest.java +0 -0
  185. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogHandlerDeleteTest.java +0 -0
  186. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogHandlerRenameTest.java +0 -0
  187. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogRenameCollectionTest.java +0 -0
  188. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CatalogSchemaLiquibaseTest.java +0 -0
  189. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ChashRepositoryTest.java +0 -0
  190. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ChashVectorConcurrencyTest.java +0 -0
  191. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ChunksRlsBehavioralTest.java +0 -0
  192. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CollectionRegistryFkExtraTest.java +0 -0
  193. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CollectionRegistryFkTest.java +0 -0
  194. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CollectionVectorStatsTest.java +0 -0
  195. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CombinedQueryParityIntegrationTest.java +0 -0
  196. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/CombinedQueryParityTest.java +0 -0
  197. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/DualRunHarnessIntegrationTest.java +0 -0
  198. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/EmbedParityTest.java +0 -0
  199. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/EmbeddingModeFailLoudTest.java +0 -0
  200. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ForeignKeyConstraintTest.java +0 -0
  201. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/GraphHopParityIntegrationTest.java +0 -0
  202. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/GraphHopParityTest.java +0 -0
  203. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/HybridParityIntegrationTest.java +0 -0
  204. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/HybridSelectiveGateTest.java +0 -0
  205. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ManifestFunctionsTest.java +0 -0
  206. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/MemoryHandlerTest.java +0 -0
  207. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/MemoryRepositoryTest.java +0 -0
  208. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/MemorySchemaLiquibaseTest.java +0 -0
  209. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgBouncerTenantIsolationTest.java +0 -0
  210. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgContainerHelper.java +0 -0
  211. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorCombinedQueryContractTest.java +0 -0
  212. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorEmbedSkipGcRaceTest.java +0 -0
  213. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorHybridSearchContractTest.java +0 -0
  214. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorRepositoryContractTest.java +0 -0
  215. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorServingContractTest.java +0 -0
  216. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PgVectorUpsertDeadlockTest.java +0 -0
  217. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PlanHandlerTest.java +0 -0
  218. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PlanRepositoryTest.java +0 -0
  219. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/PlansSchemaLiquibaseTest.java +0 -0
  220. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ReadShapeViewsTest.java +0 -0
  221. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ReferenceOnlyChunkUpsertTest.java +0 -0
  222. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/SchemaMigratorIntegrationTest.java +0 -0
  223. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ScratchHandlerTest.java +0 -0
  224. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ScratchRepositoryTest.java +0 -0
  225. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ScratchSchemaLiquibaseTest.java +0 -0
  226. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ServiceBindHostTest.java +0 -0
  227. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ServiceIntegrationTest.java +0 -0
  228. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/ServiceTokenSchemaLiquibaseTest.java +0 -0
  229. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/SessionTokenHandlerTest.java +0 -0
  230. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/SoftDeleteTest.java +0 -0
  231. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomyCentroidHandlerTest.java +0 -0
  232. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomyCentroidRepositoryTest.java +0 -0
  233. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomyCentroidSchemaLiquibaseTest.java +0 -0
  234. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomyPersistHandlerTest.java +0 -0
  235. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomyRepositoryTest.java +0 -0
  236. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TaxonomySchemaLiquibaseTest.java +0 -0
  237. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TelemetryRepositoryTest.java +0 -0
  238. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TelemetrySchemaLiquibaseTest.java +0 -0
  239. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TenantPoolingIsolationTest.java +0 -0
  240. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TokenAdminHandlerTest.java +0 -0
  241. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/TokenBoundaryAdversarialTest.java +0 -0
  242. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/UpdatedAtTriggerTest.java +0 -0
  243. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/VectorHandlerEmbeddingModeTest.java +0 -0
  244. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/VectorHandlerTokenUsageTest.java +0 -0
  245. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/VectorHybridHttpTest.java +0 -0
  246. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/VectorIntegrationTest.java +0 -0
  247. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/CatalogTsOrNullTest.java +0 -0
  248. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/CollectionRegistryTest.java +0 -0
  249. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/DeadlockRetryTest.java +0 -0
  250. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/PoolerModeCheckTest.java +0 -0
  251. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/RawSqlGateTest.java +0 -0
  252. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/TenantScopeAdmissionTest.java +0 -0
  253. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/db/TenantScopeGucAllowlistTest.java +0 -0
  254. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/AspectHandlerEnqueueErrorTest.java +0 -0
  255. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/CatalogHandlerImportEmptyBodyTest.java +0 -0
  256. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/CatalogHandlerManifestFkTest.java +0 -0
  257. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/MigrationHandlerIngestCloudTest.java +0 -0
  258. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/TaxonomyHandlerAssignFkTest.java +0 -0
  259. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/http/VersionHandlerReleaseVersionTest.java +0 -0
  260. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/jooq/binding/VectorRoundTripTest.java +0 -0
  261. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/nativeimage/JooqRecordReflectionFeatureTest.java +0 -0
  262. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/resolver/ChromaSchemeHandlerTest.java +0 -0
  263. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/resolver/HttpsSchemeHandlerTest.java +0 -0
  264. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/resolver/UriSchemeResolverRegistryTest.java +0 -0
  265. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/Bge768EmbedderMathTest.java +0 -0
  266. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/EgressProxyTest.java +0 -0
  267. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/EmbedderRouterBge768Test.java +0 -0
  268. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/EmbedderRouterVoyageOnlyTest.java +0 -0
  269. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/PgVectorEmbedSkipIntegrationTest.java +0 -0
  270. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/PgVectorEmbedSkipTest.java +0 -0
  271. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/PgVectorRepositoryWherePredicateTest.java +0 -0
  272. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/java/dev/nexus/service/vectors/ReferenceOnlySqlShapeTest.java +0 -0
  273. {conexus-6.3.3 → conexus-6.3.4}/service/src/test/resources/bge768/parity_reference.json +0 -0
  274. {conexus-6.3.3 → conexus-6.3.4}/sn/README.md +0 -0
  275. {conexus-6.3.3 → conexus-6.3.4}/sn/hooks/scripts/routing/README.md +0 -0
  276. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/__init__.py +0 -0
  277. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/_git_hooks_meta.py +0 -0
  278. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/_locking.py +0 -0
  279. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/_mineru_pid.py +0 -0
  280. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/_session_end_launcher.py +0 -0
  281. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/aspect_extractor.py +0 -0
  282. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/aspect_promotion.py +0 -0
  283. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/aspect_readers.py +0 -0
  284. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/aspect_worker.py +0 -0
  285. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/bib_enricher.py +0 -0
  286. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/bib_enricher_openalex.py +0 -0
  287. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/bib_extractor.py +0 -0
  288. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/AGENTS.md +0 -0
  289. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/__init__.py +0 -0
  290. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/auto_linker.py +0 -0
  291. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog.py +0 -0
  292. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_backup.py +0 -0
  293. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_db.py +0 -0
  294. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_docs.py +0 -0
  295. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_git.py +0 -0
  296. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_links.py +0 -0
  297. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_owners.py +0 -0
  298. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_protocol.py +0 -0
  299. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_spans.py +0 -0
  300. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_sync.py +0 -0
  301. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/catalog_writes.py +0 -0
  302. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/collection_name.py +0 -0
  303. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/collections_owner_backfill.py +0 -0
  304. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/consolidation.py +0 -0
  305. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/dedupe.py +0 -0
  306. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/dt_link_generator.py +0 -0
  307. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/event_log.py +0 -0
  308. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/events.py +0 -0
  309. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/link_generator.py +0 -0
  310. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/manifest_backfill.py +0 -0
  311. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/orphan_backfill.py +0 -0
  312. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/projector.py +0 -0
  313. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/store_hook.py +0 -0
  314. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/synthesizer.py +0 -0
  315. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/tumbler.py +0 -0
  316. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/types.py +0 -0
  317. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/catalog/write_priority.py +0 -0
  318. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/checkpoint.py +0 -0
  319. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/chunk_batcher.py +0 -0
  320. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/chunk_identity.py +0 -0
  321. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/chunker.py +0 -0
  322. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/classifier.py +0 -0
  323. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/cli.py +0 -0
  324. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/code_indexer.py +0 -0
  325. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/collection_audit.py +0 -0
  326. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/collection_health.py +0 -0
  327. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/collection_rename.py +0 -0
  328. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/__init__.py +0 -0
  329. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/_helpers.py +0 -0
  330. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/_migration_prompt.py +0 -0
  331. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/_provision.py +0 -0
  332. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/aspects.py +0 -0
  333. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/__init__.py +0 -0
  334. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/backfill.py +0 -0
  335. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/backups.py +0 -0
  336. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/collections.py +0 -0
  337. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/doctor.py +0 -0
  338. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/integrity.py +0 -0
  339. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/links.py +0 -0
  340. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/migration.py +0 -0
  341. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/orphan_backfill.py +0 -0
  342. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/owners.py +0 -0
  343. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/catalog_cmds/report.py +0 -0
  344. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/collection.py +0 -0
  345. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/command_context.py +0 -0
  346. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/config_cmd.py +0 -0
  347. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/console.py +0 -0
  348. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/context_cmd.py +0 -0
  349. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/daemon.py +0 -0
  350. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/doc.py +0 -0
  351. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/doctor.py +0 -0
  352. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/dt.py +0 -0
  353. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/enrich.py +0 -0
  354. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/guided_upgrade_cmd.py +0 -0
  355. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/hook.py +0 -0
  356. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/hooks.py +0 -0
  357. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/index.py +0 -0
  358. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/init.py +0 -0
  359. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/memory.py +0 -0
  360. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/migrate_cmd.py +0 -0
  361. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/migration_cmd.py +0 -0
  362. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/mineru.py +0 -0
  363. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/plan.py +0 -0
  364. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/rdr.py +0 -0
  365. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/scratch.py +0 -0
  366. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/search_cmd.py +0 -0
  367. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/service_cmd.py +0 -0
  368. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/storage_cmd.py +0 -0
  369. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/store.py +0 -0
  370. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/t3.py +0 -0
  371. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/taxonomy_cmd.py +0 -0
  372. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/tenant_cmd.py +0 -0
  373. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/tier_status.py +0 -0
  374. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/uninstall.py +0 -0
  375. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/commands/upgrade.py +0 -0
  376. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/config.py +0 -0
  377. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/__init__.py +0 -0
  378. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/app.py +0 -0
  379. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/config.py +0 -0
  380. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/routes/__init__.py +0 -0
  381. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/routes/activity.py +0 -0
  382. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/routes/campaigns.py +0 -0
  383. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/routes/health.py +0 -0
  384. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/routes/partials.py +0 -0
  385. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/static/alpine.min.js +0 -0
  386. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/static/console.css +0 -0
  387. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/static/htmx.min.js +0 -0
  388. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/static/pico.min.css +0 -0
  389. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/activity/_detail.html +0 -0
  390. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/activity/_stream.html +0 -0
  391. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/activity/index.html +0 -0
  392. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/base.html +0 -0
  393. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/campaigns/detail.html +0 -0
  394. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/campaigns/index.html +0 -0
  395. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/health/_cards.html +0 -0
  396. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/templates/health/index.html +0 -0
  397. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/console/watchers.py +0 -0
  398. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/context.py +0 -0
  399. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/corpus.py +0 -0
  400. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/cross_encoder.py +0 -0
  401. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/AGENTS.md +0 -0
  402. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/T2_DAEMON_WIP.md +0 -0
  403. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/__init__.py +0 -0
  404. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/aspect_worker_daemon.py +0 -0
  405. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/binary_lifecycle.py +0 -0
  406. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/catalog_write_shim.py +0 -0
  407. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/discovery.py +0 -0
  408. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/installer.py +0 -0
  409. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/service_registry.py +0 -0
  410. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/spin_guard.py +0 -0
  411. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/storage_service_daemon.py +0 -0
  412. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/t1_lease.py +0 -0
  413. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/t2_client.py +0 -0
  414. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/t2_daemon.py +0 -0
  415. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/daemon/t3_daemon.py +0 -0
  416. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/AGENTS.md +0 -0
  417. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/__init__.py +0 -0
  418. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/chroma_quotas.py +0 -0
  419. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/collection_purge.py +0 -0
  420. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/embed_migrate.py +0 -0
  421. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/http_scratch_store.py +0 -0
  422. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/http_vector_client.py +0 -0
  423. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/local_ef.py +0 -0
  424. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/managed_endpoint.py +0 -0
  425. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/migrations.py +0 -0
  426. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/pg_bundle.py +0 -0
  427. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/pg_provision.py +0 -0
  428. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/service_bge_model.py +0 -0
  429. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/service_endpoint.py +0 -0
  430. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/storage_mode.py +0 -0
  431. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t1.py +0 -0
  432. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/__init__.py +0 -0
  433. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/_raw_handle_guard.py +0 -0
  434. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/_tuning.py +0 -0
  435. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/aspect_extraction_queue.py +0 -0
  436. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/aspects_etl.py +0 -0
  437. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/catalog.py +0 -0
  438. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/catalog_etl.py +0 -0
  439. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/catalog_taxonomy.py +0 -0
  440. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/chash_etl.py +0 -0
  441. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/chash_index.py +0 -0
  442. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/document_aspects.py +0 -0
  443. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/document_highlights.py +0 -0
  444. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/http_chash_index.py +0 -0
  445. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/memory_etl.py +0 -0
  446. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/memory_store.py +0 -0
  447. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/plan_etl.py +0 -0
  448. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/plan_library.py +0 -0
  449. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/taxonomy_compute.py +0 -0
  450. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/taxonomy_etl.py +0 -0
  451. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/telemetry.py +0 -0
  452. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t2/telemetry_etl.py +0 -0
  453. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t3.py +0 -0
  454. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/db/t3_reidentify.py +0 -0
  455. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/devonthink.py +0 -0
  456. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/__init__.py +0 -0
  457. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/_common.py +0 -0
  458. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/citations.py +0 -0
  459. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/ref_scanner.py +0 -0
  460. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/render.py +0 -0
  461. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/resolvers.py +0 -0
  462. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/resolvers_corpus.py +0 -0
  463. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc/tokens.py +0 -0
  464. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doc_indexer.py +0 -0
  465. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/doctor_search.py +0 -0
  466. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/dropped_writes.py +0 -0
  467. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/dt_writeback.py +0 -0
  468. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/errors.py +0 -0
  469. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/exporter.py +0 -0
  470. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/filters.py +0 -0
  471. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/formatters.py +0 -0
  472. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/frecency.py +0 -0
  473. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/glossary.py +0 -0
  474. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/health.py +0 -0
  475. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/hook_registry.py +0 -0
  476. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/hooks.py +0 -0
  477. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/index_context.py +0 -0
  478. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/indexer_utils.py +0 -0
  479. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/languages.py +0 -0
  480. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/logging_setup.py +0 -0
  481. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/AGENTS.md +0 -0
  482. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/__init__.py +0 -0
  483. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/_first_run.py +0 -0
  484. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/_t1_state.py +0 -0
  485. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/catalog.py +0 -0
  486. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/core.py +0 -0
  487. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/devonthink.py +0 -0
  488. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp/plan_cache_registry.py +0 -0
  489. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp_client/__init__.py +0 -0
  490. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp_client/core.py +0 -0
  491. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp_client/devonthink.py +0 -0
  492. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/mcp_server.py +0 -0
  493. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/md_chunker.py +0 -0
  494. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/merge_candidates.py +0 -0
  495. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/metadata_schema.py +0 -0
  496. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/__init__.py +0 -0
  497. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/banner.py +0 -0
  498. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/chroma_read.py +0 -0
  499. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/detection.py +0 -0
  500. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/driver.py +0 -0
  501. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/etl_registry.py +0 -0
  502. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/guided_upgrade.py +0 -0
  503. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/manifest_check.py +0 -0
  504. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/migration_report.py +0 -0
  505. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/orchestrator.py +0 -0
  506. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/pregate.py +0 -0
  507. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/quiesce.py +0 -0
  508. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/route_coverage.py +0 -0
  509. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/sequencer.py +0 -0
  510. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/state.py +0 -0
  511. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/validation.py +0 -0
  512. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/vector_etl.py +0 -0
  513. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/migration/verify_fill.py +0 -0
  514. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/name_canaries.py +0 -0
  515. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/operators/aspect_sql.py +0 -0
  516. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/operators/dispatch.py +0 -0
  517. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/pdeathsig.py +0 -0
  518. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/pdf_chunker.py +0 -0
  519. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/pdf_extractor.py +0 -0
  520. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/phase_review_sentinel.py +0 -0
  521. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/pipeline_buffer.py +0 -0
  522. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/pipeline_stages.py +0 -0
  523. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/__init__.py +0 -0
  524. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/bundle.py +0 -0
  525. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/loader.py +0 -0
  526. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/match.py +0 -0
  527. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/matcher.py +0 -0
  528. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/promote.py +0 -0
  529. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/purposes.py +0 -0
  530. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/repair.py +0 -0
  531. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/runner.py +0 -0
  532. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/schema.py +0 -0
  533. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/scope.py +0 -0
  534. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/seed_loader.py +0 -0
  535. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/plans/session_cache.py +0 -0
  536. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/prose_indexer.py +0 -0
  537. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/registry.py +0 -0
  538. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/repo_identity.py +0 -0
  539. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/repos.py +0 -0
  540. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/retry.py +0 -0
  541. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/ripgrep_cache.py +0 -0
  542. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/routing_stats.py +0 -0
  543. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/salience.py +0 -0
  544. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/scoring.py +0 -0
  545. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/search_clusterer.py +0 -0
  546. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/search_engine.py +0 -0
  547. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/session.py +0 -0
  548. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/stage_timers.py +0 -0
  549. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/storage_boundary_lint.py +0 -0
  550. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/taxonomy.py +0 -0
  551. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/taxonomy_backfill.py +0 -0
  552. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/ttl.py +0 -0
  553. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/types.py +0 -0
  554. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/util/__init__.py +0 -0
  555. {conexus-6.3.3 → conexus-6.3.4}/src/nexus/util/process_group.py +0 -0
  556. {conexus-6.3.3 → conexus-6.3.4}/tests/cc-validation/README.md +0 -0
  557. {conexus-6.3.3 → conexus-6.3.4}/tests/e2e/t2-migration-sqlite/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: conexus
3
- Version: 6.3.3
3
+ Version: 6.3.4
4
4
  Summary: Self-hosted semantic search and knowledge management for LLM-driven development
5
5
  Project-URL: Homepage, https://github.com/Hellblazer/nexus
6
6
  Project-URL: Repository, https://github.com/Hellblazer/nexus
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "conexus-mcpb"
3
- version = "6.3.3"
3
+ version = "6.3.4"
4
4
  description = "Conexus packaged as Claude Desktop .mcpb (Desktop Extension)"
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
@@ -10,7 +10,7 @@ dependencies = [
10
10
  # while collections are indexed at 768/1024-dim, so every T3 search hits a
11
11
  # dimension mismatch and returns zero results. The .mcpb cannot run the
12
12
  # interactive `nx init` embedder choice, so it must pin [local] explicitly.
13
- "conexus[local]>=6.3.3",
13
+ "conexus[local]>=6.3.4",
14
14
  ]
15
15
 
16
16
  [tool.uv]
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "conexus"
7
- version = "6.3.3"
7
+ version = "6.3.4"
8
8
  description = "Self-hosted semantic search and knowledge management for LLM-driven development"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.12,<3.14"
@@ -36,6 +36,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
36
36
  import org.jooq.Condition;
37
37
  import org.jooq.DSLContext;
38
38
  import org.jooq.Field;
39
+ import org.jooq.Query;
39
40
  import org.jooq.SelectField;
40
41
  import org.jooq.Table;
41
42
  import org.jooq.UpdateSetMoreStep;
@@ -669,6 +670,108 @@ public final class CatalogRepository {
669
670
 
670
671
  public int updateDocument(String tenant, String tumbler, Map<String, Object> fields) {
671
672
  if (fields.isEmpty()) return 0;
673
+ return tenantScope.withTenant(tenant, ctx -> {
674
+ Query query = buildUpdateDocumentQuery(ctx, tenant, tumbler, fields);
675
+ return query == null ? 0 : query.execute();
676
+ });
677
+ }
678
+
679
+ /**
680
+ * Batch-update mutable document fields for N documents in ONE round trip
681
+ * (nexus-xedhp, duoak.11 follow-up to the register_many fix above).
682
+ *
683
+ * <p>{@code writer.update()} per changed doc was the WAN-round-trip sink:
684
+ * a HEAD bump (any new git commit) flips every indexed doc's stored
685
+ * {@code head_hash} to "changed", forcing the indexer's catalog hook
686
+ * through one serial {@code POST /update} per file — 175.5s / 1718 files
687
+ * (~102ms/file) on this repo's own shakeout. Each entry in *updates*
688
+ * carries the same shape as {@link #updateDocument}'s {@code fields} map
689
+ * plus a {@code "tumbler"} key identifying the row.
690
+ *
691
+ * <p>Executed as ONE {@code ctx.batch(...)} — i.e. one JDBC
692
+ * {@code Statement.addBatch()}/{@code executeBatch()} round trip to
693
+ * Postgres, not N sequential {@code execute()} calls. This is standard
694
+ * JDBC batching, the same mechanism used for heterogeneous-shape batch
695
+ * writes throughout the JDBC ecosystem; jOOQ's {@code batch(Query...)}
696
+ * groups identical-SQL queries into one {@code PreparedStatement} batch
697
+ * and any remaining distinct-SQL queries into one {@code Statement}
698
+ * batch, flushing everything via a single {@code executeBatch()} — never
699
+ * a per-query round trip. (An attempt at a single hand-built
700
+ * multi-row {@code UPDATE ... FROM (VALUES ...)} statement was tried
701
+ * here first and reverted: jOOQ's typed {@code DSL.values(RowN...)} API
702
+ * requires uniform per-column types across all rows, which this
703
+ * whitelist's heterogeneous optional fields can't satisfy without
704
+ * fighting Postgres's NULL-parameter type-inference rules; the raw-SQL
705
+ * {@code DSL.table("(VALUES {0})", ...)} template compiles but its
706
+ * `.field(...)` accessors don't resolve column metadata at all — this
707
+ * specific failure (a {@code NullPointerException} on the returned
708
+ * field) was reproduced against the real Postgres testcontainer suite
709
+ * below. The tests below verify functional correctness, per-entry
710
+ * failure isolation, and idempotency — NOT round-trip count or
711
+ * statement count; the "one JDBC round trip" claim for {@code
712
+ * ctx.batch(...)} on heterogeneous SQL is drawn from jOOQ's documented
713
+ * {@code batch(Query...)} behavior, not independently measured here.)
714
+ *
715
+ * <p>Per-doc failure isolation mirrors {@code register_many}: a single
716
+ * malformed entry (missing tumbler, non-updatable column) is excluded
717
+ * from the batch and marked {@code -1} in the result rather than
718
+ * aborting the whole call — the caller's existing per-file try/except
719
+ * ghost-class-isolation contract depends on partial-batch survivability.
720
+ *
721
+ * @return per-index update counts aligned 1:1 with the input list:
722
+ * {@code 1} updated, {@code 0} not found/tombstoned/no-op,
723
+ * {@code -1} malformed entry (build-time rejection, never sent).
724
+ */
725
+ public List<Integer> updateDocumentsMany(String tenant, List<Map<String, Object>> updates) {
726
+ if (updates.isEmpty()) return List.of();
727
+ return tenantScope.withTenant(tenant, ctx -> {
728
+ Integer[] resultSlots = new Integer[updates.size()];
729
+ var queries = new ArrayList<Query>();
730
+ var queryIndexes = new ArrayList<Integer>(); // index into `updates` for each entry in `queries`
731
+
732
+ for (int i = 0; i < updates.size(); i++) {
733
+ var upd = updates.get(i);
734
+ Object tumblerObj = upd.get("tumbler");
735
+ if (!(tumblerObj instanceof String tumbler) || tumbler.isBlank()) {
736
+ resultSlots[i] = -1;
737
+ continue;
738
+ }
739
+ Map<String, Object> fields = new LinkedHashMap<>(upd);
740
+ fields.remove("tumbler");
741
+ Query query;
742
+ try {
743
+ query = buildUpdateDocumentQuery(ctx, tenant, tumbler, fields);
744
+ } catch (IllegalArgumentException e) {
745
+ resultSlots[i] = -1;
746
+ continue;
747
+ }
748
+ if (query == null) {
749
+ resultSlots[i] = 0;
750
+ continue;
751
+ }
752
+ queryIndexes.add(i);
753
+ queries.add(query);
754
+ }
755
+ if (!queries.isEmpty()) {
756
+ int[] batchResults = ctx.batch(queries).execute();
757
+ for (int q = 0; q < queryIndexes.size(); q++) {
758
+ resultSlots[queryIndexes.get(q)] = batchResults[q];
759
+ }
760
+ }
761
+ return java.util.Arrays.asList(resultSlots);
762
+ });
763
+ }
764
+
765
+ /**
766
+ * Shared SET-clause builder for {@link #updateDocument} and
767
+ * {@link #updateDocumentsMany} — same column whitelist, same
768
+ * {@code deleted_at}-strip, same {@code meta} jsonb-merge semantics.
769
+ * Returns {@code null} when *fields* yields no settable column (mirrors
770
+ * {@code updateDocument}'s 0-row short-circuit).
771
+ */
772
+ private Query buildUpdateDocumentQuery(
773
+ DSLContext ctx, String tenant, String tumbler, Map<String, Object> fields
774
+ ) {
672
775
  for (String key : fields.keySet()) {
673
776
  // deleted_at keeps its documented silent-strip contract (callers must use
674
777
  // trash/restore); every OTHER unknown key is a caller error — fail loud.
@@ -678,43 +781,40 @@ public final class CatalogRepository {
678
781
  + "' (allowed: " + UPDATABLE_DOC_COLUMNS + ")");
679
782
  }
680
783
  }
681
- return tenantScope.withTenant(tenant, ctx -> {
682
- var step = ctx.update(CATALOG_DOCUMENTS);
683
- UpdateSetMoreStep<?> more = null;
684
- for (var e : fields.entrySet()) {
685
- if (e.getValue() == null) continue;
686
- // Strip deleted_at — must not be settable via updateDocument
687
- if ("deleted_at".equals(e.getKey())) continue;
688
- // metadata is a jsonb column: callers pass it as an object (or JSON
689
- // string) under "meta"/"metadata". A bare set() of a Map fails with
690
- // "LinkedHashMap is not supported in dialect POSTGRES"; JSON-encode and
691
- // bind as jsonb, mirroring upsertDocument (RDR-168 nexus-njrcn.7).
692
- // nexus-ke45f: MERGE, not replace local Catalog.update() does
693
- // dict.update (add/overwrite keys, never remove), and every
694
- // writer.update(meta=...) caller (enrich write-back, catalog
695
- // hook, dt stamp, remediation) is written against that
696
- // contract; the bare SET silently dropped pre-existing keys
697
- // in service mode. jsonb_concat == the || operator.
698
- if ("meta".equals(e.getKey()) || "metadata".equals(e.getKey())) {
699
- Field<String> merged = DSL.function("jsonb_concat", String.class,
700
- DSL.coalesce(F_DOC_META, jsonbVal("{}")),
701
- jsonbVal(jsonOrNull(e.getValue())));
702
- more = (more == null)
703
- ? step.set(F_DOC_META, merged)
704
- : more.set(F_DOC_META, merged);
705
- continue;
706
- }
707
- @SuppressWarnings("unchecked")
708
- Field<Object> f = (Field<Object>) DSL.field(DSL.name("catalog_documents", e.getKey()));
709
- more = (more == null) ? step.set(f, e.getValue()) : more.set(f, e.getValue());
784
+ var step = ctx.update(CATALOG_DOCUMENTS);
785
+ UpdateSetMoreStep<?> more = null;
786
+ for (var e : fields.entrySet()) {
787
+ if (e.getValue() == null) continue;
788
+ // Strip deleted_at must not be settable via updateDocument
789
+ if ("deleted_at".equals(e.getKey())) continue;
790
+ // metadata is a jsonb column: callers pass it as an object (or JSON
791
+ // string) under "meta"/"metadata". A bare set() of a Map fails with
792
+ // "LinkedHashMap is not supported in dialect POSTGRES"; JSON-encode and
793
+ // bind as jsonb, mirroring upsertDocument (RDR-168 nexus-njrcn.7).
794
+ // nexus-ke45f: MERGE, not replace local Catalog.update() does
795
+ // dict.update (add/overwrite keys, never remove), and every
796
+ // writer.update(meta=...) caller (enrich write-back, catalog
797
+ // hook, dt stamp, remediation) is written against that
798
+ // contract; the bare SET silently dropped pre-existing keys
799
+ // in service mode. jsonb_concat == the || operator.
800
+ if ("meta".equals(e.getKey()) || "metadata".equals(e.getKey())) {
801
+ Field<String> merged = DSL.function("jsonb_concat", String.class,
802
+ DSL.coalesce(F_DOC_META, jsonbVal("{}")),
803
+ jsonbVal(jsonOrNull(e.getValue())));
804
+ more = (more == null)
805
+ ? step.set(F_DOC_META, merged)
806
+ : more.set(F_DOC_META, merged);
807
+ continue;
710
808
  }
711
- if (more == null) return 0;
712
- // AND deleted_at IS NULL: refuse to update tombstoned documents
713
- return more.where(CATALOG_DOCUMENTS.TENANT_ID.eq(tenant)
714
- .and(CATALOG_DOCUMENTS.TUMBLER.eq(tumbler))
715
- .and(CATALOG_DOCUMENTS.DELETED_AT.isNull()))
716
- .execute();
717
- });
809
+ @SuppressWarnings("unchecked")
810
+ Field<Object> f = (Field<Object>) DSL.field(DSL.name("catalog_documents", e.getKey()));
811
+ more = (more == null) ? step.set(f, e.getValue()) : more.set(f, e.getValue());
812
+ }
813
+ if (more == null) return null;
814
+ // AND deleted_at IS NULL: refuse to update tombstoned documents
815
+ return more.where(CATALOG_DOCUMENTS.TENANT_ID.eq(tenant)
816
+ .and(CATALOG_DOCUMENTS.TUMBLER.eq(tumbler))
817
+ .and(CATALOG_DOCUMENTS.DELETED_AT.isNull()));
718
818
  }
719
819
 
720
820
  /**
@@ -734,6 +834,38 @@ public final class CatalogRepository {
734
834
  );
735
835
  }
736
836
 
837
+ /**
838
+ * Batch-tombstone N documents in ONE round trip (nexus-xedhp follow-up:
839
+ * completes the update_many/register_many/delete_many batch trio).
840
+ *
841
+ * <p>Unlike {@link #updateDocumentsMany}, every row shares the identical
842
+ * {@code SET deleted_at = NOW()} — no per-row heterogeneous values, so a
843
+ * plain {@code WHERE tumbler = ANY(?)} multi-row match is both simplest
844
+ * and a genuine single SQL statement (no VALUES-table / batch-API
845
+ * ambiguity to navigate). {@code RETURNING tumbler} identifies exactly
846
+ * which of the input tumblers were actually tombstoned (already-deleted
847
+ * or non-existent tumblers are silently excluded, same as the single-doc
848
+ * {@link #deleteDocument}'s idempotent 0-return).
849
+ *
850
+ * @return the SET of tumblers that were tombstoned by this call (a
851
+ * subset of *tumblers*; order not significant — callers map
852
+ * membership, not position, unlike updateDocumentsMany's
853
+ * positional contract, since there's only one outcome shape
854
+ * here: deleted or not).
855
+ */
856
+ public Set<String> deleteDocumentsMany(String tenant, List<String> tumblers) {
857
+ if (tumblers.isEmpty()) return Set.of();
858
+ return tenantScope.withTenant(tenant, ctx ->
859
+ new java.util.HashSet<>(ctx.update(CATALOG_DOCUMENTS)
860
+ .set(CATALOG_DOCUMENTS.DELETED_AT, DSL.currentOffsetDateTime())
861
+ .where(CATALOG_DOCUMENTS.TUMBLER.in(tumblers)
862
+ .and(CATALOG_DOCUMENTS.TENANT_ID.eq(tenant))
863
+ .and(CATALOG_DOCUMENTS.DELETED_AT.isNull()))
864
+ .returning(CATALOG_DOCUMENTS.TUMBLER)
865
+ .fetch(CATALOG_DOCUMENTS.TUMBLER))
866
+ );
867
+ }
868
+
737
869
  /**
738
870
  * FTS search over title/author/corpus/file_path using OR'd tsquery.
739
871
  * Optionally filter by content_type. Returns up to limit results.
@@ -33,6 +33,8 @@ import java.util.*;
33
33
  * GET /v1/catalog/list list documents (paginated)
34
34
  * GET /v1/catalog/search FTS search
35
35
  * POST /v1/catalog/update update document fields
36
+ * POST /v1/catalog/update_many batch-update fields for N documents (nexus-xedhp)
37
+ * POST /v1/catalog/delete_many batch-tombstone N documents (nexus-xedhp)
36
38
  * DELETE /v1/catalog/delete delete document by tumbler
37
39
  * POST /v1/catalog/link upsert link
38
40
  * POST /v1/catalog/unlink delete link
@@ -118,7 +120,9 @@ public final class CatalogHandler implements HttpHandler {
118
120
  case "/list" -> handleList(exchange, tenant, method);
119
121
  case "/search" -> handleSearch(exchange, tenant, method);
120
122
  case "/update" -> handleUpdate(exchange, tenant, method);
123
+ case "/update_many" -> handleUpdateMany(exchange, tenant, method);
121
124
  case "/delete" -> handleDelete(exchange, tenant, method);
125
+ case "/delete_many" -> handleDeleteMany(exchange, tenant, method);
122
126
  case "/resolve" -> handleResolve(exchange, tenant, method);
123
127
  case "/stats" -> handleStats(exchange, tenant, method);
124
128
 
@@ -313,6 +317,83 @@ public final class CatalogHandler implements HttpHandler {
313
317
  HttpUtil.send(exchange, 200, "{\"updated\":" + updated + "}");
314
318
  }
315
319
 
320
+ /**
321
+ * POST /v1/catalog/update_many — batch-update N documents' mutable fields
322
+ * in ONE round trip (nexus-xedhp, duoak.11 follow-up).
323
+ *
324
+ * <p>Body: {"updates": [{"tumbler": "1.1.3", "head_hash": "...", ...}, ...]}
325
+ * Response: {"updated": [1, 1, 0, ...]} (per-entry update count, aligned
326
+ * 1:1 with the input — 0 means not found / tombstoned / no-op; a
327
+ * non-updatable-column entry is -1 (marked, not dropped) — the entry's
328
+ * OWN column-whitelist violation does NOT abort the rest of the batch,
329
+ * mirroring register_many's per-doc failure isolation. A malformed
330
+ * *shape* (non-list body, non-object element) is a client bug, not a
331
+ * per-doc data problem, and 400s rather than silently shrinking the
332
+ * response array — mirrors handleManifestWriteMany's review #2 fix.
333
+ *
334
+ * <p>Capped at {@value #MAX_BATCH_DOC_IDS} rows, same bind-limit rationale
335
+ * as register_many.
336
+ */
337
+ @SuppressWarnings("unchecked")
338
+ private void handleUpdateMany(HttpExchange exchange, String tenant, String method) throws IOException {
339
+ if (!"POST".equals(method)) { HttpUtil.send(exchange, 405, "{\"error\":\"method not allowed\"}"); return; }
340
+ Map<String, Object> body = readBody(exchange);
341
+ Object raw = body.get("updates");
342
+ if (!(raw instanceof List<?> l)) {
343
+ HttpUtil.send(exchange, 400, "{\"error\":\"'updates' must be a list\"}"); return;
344
+ }
345
+ if (l.stream().anyMatch(o -> !(o instanceof Map))) {
346
+ HttpUtil.send(exchange, 400, "{\"error\":\"every 'updates' element must be an object\"}"); return;
347
+ }
348
+ List<Map<String, Object>> updates = l.stream().map(o -> (Map<String, Object>) o).toList();
349
+ if (updates.size() > MAX_BATCH_DOC_IDS) {
350
+ HttpUtil.send(exchange, 400, "{\"error\":\"too many updates (max "
351
+ + MAX_BATCH_DOC_IDS + ")\"}"); return;
352
+ }
353
+ var counts = repo.updateDocumentsMany(tenant, updates);
354
+ HttpUtil.send(exchange, 200, MAPPER.writeValueAsString(Map.of("updated", counts)));
355
+ }
356
+
357
+ /**
358
+ * POST /v1/catalog/delete_many — batch-tombstone N documents in ONE
359
+ * round trip (nexus-xedhp: completes the update_many/register_many/
360
+ * delete_many batch trio).
361
+ *
362
+ * <p>Body: {"tumblers": ["1.1.3", "1.1.4", ...]}
363
+ * Response: {"deleted": ["1.1.3", ...]} (the subset of input tumblers
364
+ * that were actually tombstoned — already-deleted or non-existent
365
+ * tumblers are silently excluded, same idempotent semantics as the
366
+ * single-doc DELETE). NOT positionally aligned with the input (unlike
367
+ * update_many) — a duplicate or already-deleted tumbler collapses to
368
+ * one membership check; callers needing per-position outcomes should
369
+ * not assume this response mirrors input order/length.
370
+ *
371
+ * <p>A malformed *shape* (non-list body, non-string element) 400s
372
+ * rather than silently shrinking the input — mirrors
373
+ * handleManifestWriteMany's review #2 fix and handleUpdateMany above.
374
+ *
375
+ * <p>Capped at {@value #MAX_BATCH_DOC_IDS} rows, same bind-limit
376
+ * rationale as register_many / update_many.
377
+ */
378
+ private void handleDeleteMany(HttpExchange exchange, String tenant, String method) throws IOException {
379
+ if (!"POST".equals(method)) { HttpUtil.send(exchange, 405, "{\"error\":\"method not allowed\"}"); return; }
380
+ Map<String, Object> body = readBody(exchange);
381
+ Object raw = body.get("tumblers");
382
+ if (!(raw instanceof List<?> l)) {
383
+ HttpUtil.send(exchange, 400, "{\"error\":\"'tumblers' must be a list\"}"); return;
384
+ }
385
+ if (l.stream().anyMatch(o -> !(o instanceof String))) {
386
+ HttpUtil.send(exchange, 400, "{\"error\":\"every 'tumblers' element must be a string\"}"); return;
387
+ }
388
+ List<String> tumblers = l.stream().map(o -> (String) o).toList();
389
+ if (tumblers.size() > MAX_BATCH_DOC_IDS) {
390
+ HttpUtil.send(exchange, 400, "{\"error\":\"too many tumblers (max "
391
+ + MAX_BATCH_DOC_IDS + ")\"}"); return;
392
+ }
393
+ var deleted = repo.deleteDocumentsMany(tenant, tumblers);
394
+ HttpUtil.send(exchange, 200, MAPPER.writeValueAsString(Map.of("deleted", deleted)));
395
+ }
396
+
316
397
  /** DELETE /v1/catalog/delete?tumbler=X */
317
398
  private void handleDelete(HttpExchange exchange, String tenant, String method) throws IOException {
318
399
  if (!"DELETE".equals(method) && !"POST".equals(method)) {
@@ -370,6 +370,101 @@ class CatalogRepositoryTest {
370
370
  assertThat(repo.getDocument(TENANT_A, "2.9").get("title")).isEqualTo("Still Guarded");
371
371
  }
372
372
 
373
+ @Test @Order(135)
374
+ void document_updateDocumentsMany_batchesHeterogeneousUpdatesInOneRoundTrip() {
375
+ // nexus-xedhp: replaces N serial writer.update() calls with one
376
+ // updateDocumentsMany() batch — each entry may set DIFFERENT fields
377
+ // (mirrors the indexer catalog hook's real per-file payload shape:
378
+ // head_hash is repo-wide but physical_collection/meta/source_mtime
379
+ // vary per file).
380
+ repo.upsertDocument(TENANT_A, Map.of(
381
+ "tumbler", "2.20", "title", "Many A", "content_type", "code",
382
+ "corpus", "code", "physical_collection", "code__nexus__v1"));
383
+ repo.upsertDocument(TENANT_A, Map.of(
384
+ "tumbler", "2.21", "title", "Many B", "content_type", "docs",
385
+ "corpus", "docs", "physical_collection", "docs__nexus__v1",
386
+ "metadata", Map.of("content_hash", "keepme")));
387
+
388
+ List<Integer> results = repo.updateDocumentsMany(TENANT_A, List.of(
389
+ Map.of("tumbler", "2.20", "head_hash", "abc123", "source_mtime", 111.0),
390
+ Map.of("tumbler", "2.21", "head_hash", "abc123",
391
+ "meta", Map.of("bib_checked", true))
392
+ ));
393
+ assertThat(results).containsExactly(1, 1);
394
+
395
+ var doc20 = repo.getDocument(TENANT_A, "2.20");
396
+ assertThat(doc20.get("head_hash")).isEqualTo("abc123");
397
+
398
+ var doc21 = repo.getDocument(TENANT_A, "2.21");
399
+ assertThat(doc21.get("head_hash")).isEqualTo("abc123");
400
+ @SuppressWarnings("unchecked")
401
+ Map<String, Object> meta21 = (Map<String, Object>) doc21.get("metadata");
402
+ assertThat(meta21.get("content_hash")).as("meta merge semantics preserved in batch path").isEqualTo("keepme");
403
+ assertThat(meta21.get("bib_checked")).isEqualTo(true);
404
+ }
405
+
406
+ @Test @Order(136)
407
+ void document_updateDocumentsMany_isolatesPerEntryFailures() {
408
+ // A malformed entry (missing tumbler, non-updatable column) must not
409
+ // abort the rest of the batch — mirrors register_many's per-doc
410
+ // failure isolation, which the indexer's catalog hook depends on.
411
+ repo.upsertDocument(TENANT_A, Map.of(
412
+ "tumbler", "2.22", "title", "Survivor", "content_type", "code",
413
+ "corpus", "code"));
414
+
415
+ List<Integer> results = repo.updateDocumentsMany(TENANT_A, java.util.Arrays.asList(
416
+ Map.of("no_tumbler_key", "x"),
417
+ Map.of("tumbler", "2.22", "head_hash", "def456"),
418
+ Map.of("tumbler", "2.999-does-not-exist", "head_hash", "def456"),
419
+ Map.of("tumbler", "2.22", "no_such_column", "y")
420
+ ));
421
+ assertThat(results).containsExactly(-1, 1, 0, -1);
422
+
423
+ var doc = repo.getDocument(TENANT_A, "2.22");
424
+ assertThat(doc.get("head_hash")).isEqualTo("def456");
425
+ }
426
+
427
+ @Test @Order(137)
428
+ void document_updateDocumentsMany_emptyListReturnsEmpty() {
429
+ assertThat(repo.updateDocumentsMany(TENANT_A, List.of())).isEmpty();
430
+ }
431
+
432
+ @Test @Order(138)
433
+ void document_deleteDocumentsMany_tombstonesInOneRoundTrip() {
434
+ // nexus-xedhp: completes the update_many/register_many/delete_many
435
+ // batch trio — replaces N serial writer.delete_document() calls.
436
+ repo.upsertDocument(TENANT_A, Map.of(
437
+ "tumbler", "2.30", "title", "Del A", "content_type", "code", "corpus", "code"));
438
+ repo.upsertDocument(TENANT_A, Map.of(
439
+ "tumbler", "2.31", "title", "Del B", "content_type", "code", "corpus", "code"));
440
+ repo.upsertDocument(TENANT_A, Map.of(
441
+ "tumbler", "2.32", "title", "Survivor", "content_type", "code", "corpus", "code"));
442
+
443
+ Set<String> deleted = repo.deleteDocumentsMany(
444
+ TENANT_A, List.of("2.30", "2.31", "2.999-does-not-exist"));
445
+
446
+ assertThat(deleted).containsExactlyInAnyOrder("2.30", "2.31");
447
+ assertThat(repo.getDocument(TENANT_A, "2.30")).isNull();
448
+ assertThat(repo.getDocument(TENANT_A, "2.31")).isNull();
449
+ assertThat(repo.getDocument(TENANT_A, "2.32")).isNotNull();
450
+ }
451
+
452
+ @Test @Order(139)
453
+ void document_deleteDocumentsMany_idempotentOnAlreadyTombstoned() {
454
+ repo.upsertDocument(TENANT_A, Map.of(
455
+ "tumbler", "2.33", "title", "Once", "content_type", "code", "corpus", "code"));
456
+ repo.deleteDocument(TENANT_A, "2.33");
457
+
458
+ Set<String> deleted = repo.deleteDocumentsMany(TENANT_A, List.of("2.33"));
459
+
460
+ assertThat(deleted).as("already-tombstoned tumbler is not re-reported as deleted").isEmpty();
461
+ }
462
+
463
+ @Test @Order(140)
464
+ void document_deleteDocumentsMany_emptyListReturnsEmpty() {
465
+ assertThat(repo.deleteDocumentsMany(TENANT_A, List.of())).isEmpty();
466
+ }
467
+
373
468
  @Test @Order(14)
374
469
  void document_delete() {
375
470
  repo.upsertDocument(TENANT_A, Map.of(