conexus 4.1.2__tar.gz → 4.2.2__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 (546) hide show
  1. {conexus-4.1.2 → conexus-4.2.2}/.claude-plugin/marketplace.json +2 -2
  2. {conexus-4.1.2 → conexus-4.2.2}/.github/workflows/ci.yml +1 -1
  3. {conexus-4.1.2 → conexus-4.2.2}/CHANGELOG.md +63 -0
  4. {conexus-4.1.2 → conexus-4.2.2}/CLAUDE.md +29 -5
  5. {conexus-4.1.2 → conexus-4.2.2}/PKG-INFO +4 -3
  6. {conexus-4.1.2 → conexus-4.2.2}/README.md +3 -2
  7. {conexus-4.1.2 → conexus-4.2.2}/docs/architecture.md +19 -8
  8. {conexus-4.1.2 → conexus-4.2.2}/docs/cli-reference.md +34 -1
  9. {conexus-4.1.2 → conexus-4.2.2}/docs/contributing.md +1 -0
  10. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/README.md +2 -0
  11. conexus-4.2.2/docs/rdr/rdr-075-cross-collection-topic-projection.md +315 -0
  12. conexus-4.2.2/docs/rdr/rdr-076-idempotent-upgrade-mechanism.md +365 -0
  13. {conexus-4.1.2 → conexus-4.2.2}/nx/.claude-plugin/plugin.json +1 -1
  14. {conexus-4.1.2 → conexus-4.2.2}/nx/CHANGELOG.md +20 -0
  15. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/rdr-close.md +15 -11
  16. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/hooks.json +5 -0
  17. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/rdr-close/SKILL.md +1 -1
  18. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/rdr-create/SKILL.md +1 -1
  19. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/rdr-gate/SKILL.md +6 -4
  20. {conexus-4.1.2 → conexus-4.2.2}/pyproject.toml +1 -1
  21. {conexus-4.1.2 → conexus-4.2.2}/sn/.claude-plugin/plugin.json +1 -1
  22. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/cli.py +2 -0
  23. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/code_indexer.py +8 -0
  24. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/doctor.py +93 -1
  25. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/index.py +61 -2
  26. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/taxonomy_cmd.py +244 -15
  27. conexus-4.2.2/src/nexus/commands/upgrade.py +159 -0
  28. conexus-4.2.2/src/nexus/db/migrations.py +572 -0
  29. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/db/t2/__init__.py +31 -7
  30. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/db/t2/catalog_taxonomy.py +528 -76
  31. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/db/t2/memory_store.py +8 -42
  32. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/db/t2/plan_library.py +8 -47
  33. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/doc_indexer.py +30 -0
  34. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/health.py +59 -0
  35. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/indexer.py +19 -15
  36. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/indexer_utils.py +64 -0
  37. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/mcp/catalog.py +2 -0
  38. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/mcp/core.py +2 -0
  39. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/mcp_infra.py +114 -1
  40. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/pipeline_stages.py +10 -0
  41. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/prose_indexer.py +8 -0
  42. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/registry.py +36 -0
  43. conexus-4.2.2/tests/test_indexer_utils_repo.py +168 -0
  44. conexus-4.2.2/tests/test_migrations.py +883 -0
  45. conexus-4.2.2/tests/test_phase5_integration.py +183 -0
  46. {conexus-4.1.2 → conexus-4.2.2}/tests/test_post_store_hook.py +33 -9
  47. conexus-4.2.2/tests/test_rdr_close_gate.py +448 -0
  48. {conexus-4.1.2 → conexus-4.2.2}/tests/test_taxonomy.py +466 -27
  49. conexus-4.2.2/tests/test_upgrade_cmd.py +185 -0
  50. conexus-4.2.2/tests/test_upgrade_e2e.py +274 -0
  51. {conexus-4.1.2 → conexus-4.2.2}/uv.lock +9 -1
  52. {conexus-4.1.2 → conexus-4.2.2}/.beads/.gitignore +0 -0
  53. {conexus-4.1.2 → conexus-4.2.2}/.beads/README.md +0 -0
  54. {conexus-4.1.2 → conexus-4.2.2}/.beads/config.yaml +0 -0
  55. {conexus-4.1.2 → conexus-4.2.2}/.beads/hooks/post-checkout +0 -0
  56. {conexus-4.1.2 → conexus-4.2.2}/.beads/hooks/post-merge +0 -0
  57. {conexus-4.1.2 → conexus-4.2.2}/.beads/hooks/pre-commit +0 -0
  58. {conexus-4.1.2 → conexus-4.2.2}/.beads/hooks/pre-push +0 -0
  59. {conexus-4.1.2 → conexus-4.2.2}/.beads/hooks/prepare-commit-msg +0 -0
  60. {conexus-4.1.2 → conexus-4.2.2}/.beads/interactions.jsonl +0 -0
  61. {conexus-4.1.2 → conexus-4.2.2}/.beads/issues.jsonl +0 -0
  62. {conexus-4.1.2 → conexus-4.2.2}/.beads/metadata.json +0 -0
  63. {conexus-4.1.2 → conexus-4.2.2}/.claude/skills/release.md +0 -0
  64. {conexus-4.1.2 → conexus-4.2.2}/.devcontainer/Dockerfile +0 -0
  65. {conexus-4.1.2 → conexus-4.2.2}/.devcontainer/devcontainer.json +0 -0
  66. {conexus-4.1.2 → conexus-4.2.2}/.dockerignore +0 -0
  67. {conexus-4.1.2 → conexus-4.2.2}/.env.example +0 -0
  68. {conexus-4.1.2 → conexus-4.2.2}/.gitattributes +0 -0
  69. {conexus-4.1.2 → conexus-4.2.2}/.github/workflows/release.yml +0 -0
  70. {conexus-4.1.2 → conexus-4.2.2}/.gitignore +0 -0
  71. {conexus-4.1.2 → conexus-4.2.2}/.markdownlint.json +0 -0
  72. {conexus-4.1.2 → conexus-4.2.2}/.plans/rdr-066-plan.md +0 -0
  73. {conexus-4.1.2 → conexus-4.2.2}/AGENTS.md +0 -0
  74. {conexus-4.1.2 → conexus-4.2.2}/Formula/nx.rb +0 -0
  75. {conexus-4.1.2 → conexus-4.2.2}/LICENSE +0 -0
  76. {conexus-4.1.2 → conexus-4.2.2}/docs/README.md +0 -0
  77. {conexus-4.1.2 → conexus-4.2.2}/docs/catalog.md +0 -0
  78. {conexus-4.1.2 → conexus-4.2.2}/docs/configuration.md +0 -0
  79. {conexus-4.1.2 → conexus-4.2.2}/docs/getting-started.md +0 -0
  80. {conexus-4.1.2 → conexus-4.2.2}/docs/historical.md +0 -0
  81. {conexus-4.1.2 → conexus-4.2.2}/docs/logging.md +0 -0
  82. {conexus-4.1.2 → conexus-4.2.2}/docs/mcp-servers.md +0 -0
  83. {conexus-4.1.2 → conexus-4.2.2}/docs/memory-and-tasks.md +0 -0
  84. {conexus-4.1.2 → conexus-4.2.2}/docs/postmortem/2026-03-23-pdf-index-collection-mismatch.md +0 -0
  85. {conexus-4.1.2 → conexus-4.2.2}/docs/postmortem/2026-03-24-pdf-index-fix-not-applied.md +0 -0
  86. {conexus-4.1.2 → conexus-4.2.2}/docs/querying-guide.md +0 -0
  87. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/001-rdr-process-validation.md +0 -0
  88. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/002-t2-status-synchronization.md +0 -0
  89. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/010-t1-http-server.md +0 -0
  90. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/011-pdf-ingest-test-coverage.md +0 -0
  91. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/012-pdfplumber-extraction-tier.md +0 -0
  92. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/014-knowledge-base-retrieval-quality.md +0 -0
  93. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/015-indexing-pipeline-rethink.md +0 -0
  94. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/016-ast-chunk-line-range-bug.md +0 -0
  95. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/017-indexing-progress-reporting.md +0 -0
  96. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/018-replace-serve-with-git-hooks.md +0 -0
  97. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/023-agent-tool-permissions-audit.md +0 -0
  98. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/024-rdr-process-guardrails.md +0 -0
  99. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/028-language-registry-unification.md +0 -0
  100. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/029-pipeline-versioning.md +0 -0
  101. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/048-streaming-pdf-pipeline.md +0 -0
  102. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/049-git-backed-catalog.md +0 -0
  103. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/050-catalog-query-integration.md +0 -0
  104. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/051-link-lifecycle.md +0 -0
  105. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/052-catalog-first-query-routing.md +0 -0
  106. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/053-xanadu-fidelity.md +0 -0
  107. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/058-pipeline-orchestration-plan-reuse.md +0 -0
  108. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/060-catalog-path-rationalization-link-usability.md +0 -0
  109. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/063-t2-domain-split.md +0 -0
  110. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/065-close-time-funnel-hardening.md +0 -0
  111. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/067-cross-project-rdr-audit-loop.md +0 -0
  112. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/post-mortem/cce-query-model-mismatch.md +0 -0
  113. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-001-rdr-process-validation.md +0 -0
  114. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-002-t2-status-synchronization.md +0 -0
  115. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-004-four-store-architecture.md +0 -0
  116. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-005-chromadb-cloud-quota-enforcement.md +0 -0
  117. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-006-chunk-size-configuration.md +0 -0
  118. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-007-claude-adoption-session-context-and-search-guidance.md +0 -0
  119. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-008-nx-workflow-integration.md +0 -0
  120. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-009-remove-agentic-and-answer-flags.md +0 -0
  121. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-010-t1-scratch-persistent-bounded-store.md +0 -0
  122. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-011-pdf-ingest-test-coverage.md +0 -0
  123. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-012-pdfplumber-extraction-tier.md +0 -0
  124. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-013-remove-nx-pm-layer.md +0 -0
  125. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-014-knowledge-base-retrieval-quality.md +0 -0
  126. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-015-indexing-pipeline-rethink.md +0 -0
  127. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-016-ast-chunk-line-range-bug.md +0 -0
  128. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-017-indexing-progress-reporting.md +0 -0
  129. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-018-replace-serve-with-git-hooks.md +0 -0
  130. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-019-chromadb-transient-retry.md +0 -0
  131. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-020-voyage-chromadb-read-timeout.md +0 -0
  132. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-021-docling-pdf-extraction.md +0 -0
  133. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-022-memory-delete-command.md +0 -0
  134. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-023-agent-tool-permissions-audit.md +0 -0
  135. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-024-rdr-process-guardrails.md +0 -0
  136. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-025-language-agnostic-agents.md +0 -0
  137. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-026-hybrid-search-fusion.md +0 -0
  138. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-027-search-results-ux.md +0 -0
  139. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-028-code-search-recall.md +0 -0
  140. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-029-pipeline-versioning.md +0 -0
  141. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-030-reliability-hardening.md +0 -0
  142. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-031-collection-portability.md +0 -0
  143. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-032-indexer-decomposition.md +0 -0
  144. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-033-pdf-agent-nx-index-alignment.md +0 -0
  145. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-034-mcp-server-agent-storage.md +0 -0
  146. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-035-plugin-agent-mcp-tool-access.md +0 -0
  147. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-036-post-accept-planning-workflow.md +0 -0
  148. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-037-t3-database-consolidation.md +0 -0
  149. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-038-local-t3-backend.md +0 -0
  150. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-039-claude-code-framework-alignment.md +0 -0
  151. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-040-cce-postmortem-gaps-mcp-enhancement.md +0 -0
  152. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-040-developer-agent-circuit-breaker.md +0 -0
  153. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-041-t1-scratch-inter-agent-context.md +0 -0
  154. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-042-agenticscholar-enhancements.md +0 -0
  155. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-043-plan-enricher-scope.md +0 -0
  156. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-044-math-aware-pdf-extraction.md +0 -0
  157. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-045-post-implementation-verification.md +0 -0
  158. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-046-mineru-server-backed-extraction.md +0 -0
  159. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-047-large-pdf-extraction-resilience.md +0 -0
  160. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-048-streaming-pdf-pipeline.md +0 -0
  161. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-049-consolidation-plan.md +0 -0
  162. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-049-git-backed-catalog.md +0 -0
  163. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-050-knowledge-graph-query-planning.md +0 -0
  164. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-051-link-lifecycle.md +0 -0
  165. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-052-catalog-first-query-routing.md +0 -0
  166. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-053-xanadu-fidelity.md +0 -0
  167. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-054-chunk-boundary-equation-splitting.md +0 -0
  168. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-055-section-type-metadata-quality-scoring.md +0 -0
  169. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-056-search-robustness-result-clustering.md +0 -0
  170. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-057-progressive-formalization-memory-tiers.md +0 -0
  171. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-058-pipeline-orchestration-plan-reuse.md +0 -0
  172. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-059-code-search-embedding-mismatch.md +0 -0
  173. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-060-catalog-path-rationalization-link-usability.md +0 -0
  174. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-061-literature-grounded-search-knowledge-enhancement.md +0 -0
  175. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-062-mcp-interface-tiering.md +0 -0
  176. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-063-t2-domain-split.md +0 -0
  177. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-064-nx-console-embedded-web-ui.md +0 -0
  178. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-065-close-time-funnel-hardening.md +0 -0
  179. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-066-composition-smoke-probe-at-coordinator-beads.md +0 -0
  180. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-067-cross-project-rdr-audit-loop.md +0 -0
  181. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-068-dimensional-contracts-at-enrichment.md +0 -0
  182. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-069-automatic-substantive-critic-at-close.md +0 -0
  183. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-070-incremental-taxonomy-clustered-search.md +0 -0
  184. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-071-query-sanitizer-permanence-mode.md +0 -0
  185. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-072-progressive-context-loading.md +0 -0
  186. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-073-temporal-entity-knowledge-graph.md +0 -0
  187. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr/rdr-074-permanence-mode.md +0 -0
  188. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr-nexus-integration.md +0 -0
  189. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr-overview.md +0 -0
  190. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr-templates.md +0 -0
  191. {conexus-4.1.2 → conexus-4.2.2}/docs/rdr-workflow.md +0 -0
  192. {conexus-4.1.2 → conexus-4.2.2}/docs/repo-indexing.md +0 -0
  193. {conexus-4.1.2 → conexus-4.2.2}/docs/storage-tiers.md +0 -0
  194. {conexus-4.1.2 → conexus-4.2.2}/docs/taxonomy.md +0 -0
  195. {conexus-4.1.2 → conexus-4.2.2}/docs/xanadu-in-nexus.md +0 -0
  196. {conexus-4.1.2 → conexus-4.2.2}/nx/.mcp.json +0 -0
  197. {conexus-4.1.2 → conexus-4.2.2}/nx/README.md +0 -0
  198. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/_shared/CONTEXT_PROTOCOL.md +0 -0
  199. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/_shared/ERROR_HANDLING.md +0 -0
  200. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/_shared/MAINTENANCE.md +0 -0
  201. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/_shared/README.md +0 -0
  202. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/_shared/RELAY_TEMPLATE.md +0 -0
  203. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/analytical-operator.md +0 -0
  204. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/architect-planner.md +0 -0
  205. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/code-review-expert.md +0 -0
  206. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/codebase-deep-analyzer.md +0 -0
  207. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/debugger.md +0 -0
  208. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/deep-analyst.md +0 -0
  209. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/deep-research-synthesizer.md +0 -0
  210. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/developer.md +0 -0
  211. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/knowledge-tidier.md +0 -0
  212. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/pdf-chromadb-processor.md +0 -0
  213. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/plan-auditor.md +0 -0
  214. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/plan-enricher.md +0 -0
  215. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/query-planner.md +0 -0
  216. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/strategic-planner.md +0 -0
  217. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/substantive-critic.md +0 -0
  218. {conexus-4.1.2 → conexus-4.2.2}/nx/agents/test-validator.md +0 -0
  219. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/analyze-code.md +0 -0
  220. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/architecture.md +0 -0
  221. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/create-plan.md +0 -0
  222. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/debug.md +0 -0
  223. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/deep-analysis.md +0 -0
  224. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/enrich-plan.md +0 -0
  225. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/implement.md +0 -0
  226. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/knowledge-tidy.md +0 -0
  227. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/nx-preflight.md +0 -0
  228. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/pdf-process.md +0 -0
  229. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/plan-audit.md +0 -0
  230. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/rdr-accept.md +0 -0
  231. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/rdr-audit.md +0 -0
  232. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/rdr-create.md +0 -0
  233. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/rdr-gate.md +0 -0
  234. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/rdr-list.md +0 -0
  235. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/rdr-research.md +0 -0
  236. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/rdr-show.md +0 -0
  237. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/research.md +0 -0
  238. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/review-code.md +0 -0
  239. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/substantive-critique.md +0 -0
  240. {conexus-4.1.2 → conexus-4.2.2}/nx/commands/test-validate.md +0 -0
  241. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/scripts/auto-approve-nx-mcp.sh +0 -0
  242. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/scripts/divergence-language-guard.sh +0 -0
  243. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/scripts/post_compact_hook.sh +0 -0
  244. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/scripts/pre_close_verification_hook.sh +0 -0
  245. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/scripts/rdr_hook.py +0 -0
  246. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/scripts/read_verification_config.py +0 -0
  247. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/scripts/session_start_hook.py +0 -0
  248. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/scripts/stop_failure_hook.py +0 -0
  249. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/scripts/stop_verification_hook.sh +0 -0
  250. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/scripts/subagent-start.sh +0 -0
  251. {conexus-4.1.2 → conexus-4.2.2}/nx/hooks/scripts/t2_prefix_scan.py +0 -0
  252. {conexus-4.1.2 → conexus-4.2.2}/nx/registry.yaml +0 -0
  253. {conexus-4.1.2 → conexus-4.2.2}/nx/resources/rdr/README-TEMPLATE.md +0 -0
  254. {conexus-4.1.2 → conexus-4.2.2}/nx/resources/rdr/TEMPLATE.md +0 -0
  255. {conexus-4.1.2 → conexus-4.2.2}/nx/resources/rdr/post-mortem/TEMPLATE.md +0 -0
  256. {conexus-4.1.2 → conexus-4.2.2}/nx/resources/rdr_process/INCIDENT-TEMPLATE.md +0 -0
  257. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/architecture/SKILL.md +0 -0
  258. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/brainstorming-gate/SKILL.md +0 -0
  259. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/catalog/SKILL.md +0 -0
  260. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/cli-controller/SKILL.md +0 -0
  261. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/code-review/SKILL.md +0 -0
  262. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/codebase-analysis/SKILL.md +0 -0
  263. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/composition-probe/SKILL.md +0 -0
  264. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/debugging/SKILL.md +0 -0
  265. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/deep-analysis/SKILL.md +0 -0
  266. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/development/SKILL.md +0 -0
  267. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/enrich-plan/SKILL.md +0 -0
  268. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/finishing-branch/SKILL.md +0 -0
  269. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/git-worktrees/SKILL.md +0 -0
  270. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/knowledge-tidying/SKILL.md +0 -0
  271. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/nexus/SKILL.md +0 -0
  272. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/nexus/reference.md +0 -0
  273. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/orchestration/SKILL.md +0 -0
  274. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/orchestration/reference.md +0 -0
  275. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/pdf-processing/SKILL.md +0 -0
  276. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/plan-validation/SKILL.md +0 -0
  277. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/query/SKILL.md +0 -0
  278. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/rdr-accept/SKILL.md +0 -0
  279. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/rdr-audit/SKILL.md +0 -0
  280. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/rdr-list/SKILL.md +0 -0
  281. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/rdr-research/SKILL.md +0 -0
  282. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/rdr-show/SKILL.md +0 -0
  283. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/receiving-review/SKILL.md +0 -0
  284. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/research-synthesis/SKILL.md +0 -0
  285. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/serena-code-nav/SKILL.md +0 -0
  286. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/strategic-planning/SKILL.md +0 -0
  287. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/substantive-critique/SKILL.md +0 -0
  288. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/test-validation/SKILL.md +0 -0
  289. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/using-nx-skills/SKILL.md +0 -0
  290. {conexus-4.1.2 → conexus-4.2.2}/nx/skills/writing-nx-skills/SKILL.md +0 -0
  291. {conexus-4.1.2 → conexus-4.2.2}/scripts/batch-label-taxonomy.py +0 -0
  292. {conexus-4.1.2 → conexus-4.2.2}/scripts/cron/README.md +0 -0
  293. {conexus-4.1.2 → conexus-4.2.2}/scripts/cron/rdr-audit.crontab +0 -0
  294. {conexus-4.1.2 → conexus-4.2.2}/scripts/cron-rdr-audit.sh +0 -0
  295. {conexus-4.1.2 → conexus-4.2.2}/scripts/launchd/README.md +0 -0
  296. {conexus-4.1.2 → conexus-4.2.2}/scripts/launchd/com.nexus.rdr-audit.PROJECT.plist +0 -0
  297. {conexus-4.1.2 → conexus-4.2.2}/scripts/reinstall-tool.sh +0 -0
  298. {conexus-4.1.2 → conexus-4.2.2}/scripts/smoke-test-taxonomy.py +0 -0
  299. {conexus-4.1.2 → conexus-4.2.2}/sn/.mcp.json +0 -0
  300. {conexus-4.1.2 → conexus-4.2.2}/sn/README.md +0 -0
  301. {conexus-4.1.2 → conexus-4.2.2}/sn/hooks/hooks.json +0 -0
  302. {conexus-4.1.2 → conexus-4.2.2}/sn/hooks/scripts/auto-approve-sn-mcp.sh +0 -0
  303. {conexus-4.1.2 → conexus-4.2.2}/sn/hooks/scripts/mcp-inject.sh +0 -0
  304. {conexus-4.1.2 → conexus-4.2.2}/sn/hooks/scripts/session-start.sh +0 -0
  305. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/__init__.py +0 -0
  306. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/bib_enricher.py +0 -0
  307. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/catalog/__init__.py +0 -0
  308. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/catalog/auto_linker.py +0 -0
  309. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/catalog/catalog.py +0 -0
  310. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/catalog/catalog_db.py +0 -0
  311. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/catalog/consolidation.py +0 -0
  312. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/catalog/link_generator.py +0 -0
  313. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/catalog/tumbler.py +0 -0
  314. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/checkpoint.py +0 -0
  315. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/chunker.py +0 -0
  316. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/classifier.py +0 -0
  317. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/__init__.py +0 -0
  318. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/_helpers.py +0 -0
  319. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/_provision.py +0 -0
  320. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/catalog.py +0 -0
  321. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/collection.py +0 -0
  322. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/config_cmd.py +0 -0
  323. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/console.py +0 -0
  324. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/context_cmd.py +0 -0
  325. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/enrich.py +0 -0
  326. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/hook.py +0 -0
  327. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/hooks.py +0 -0
  328. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/memory.py +0 -0
  329. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/mineru.py +0 -0
  330. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/scratch.py +0 -0
  331. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/search_cmd.py +0 -0
  332. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/commands/store.py +0 -0
  333. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/config.py +0 -0
  334. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/__init__.py +0 -0
  335. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/app.py +0 -0
  336. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/config.py +0 -0
  337. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/routes/__init__.py +0 -0
  338. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/routes/activity.py +0 -0
  339. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/routes/campaigns.py +0 -0
  340. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/routes/health.py +0 -0
  341. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/routes/partials.py +0 -0
  342. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/static/alpine.min.js +0 -0
  343. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/static/console.css +0 -0
  344. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/static/htmx.min.js +0 -0
  345. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/static/pico.min.css +0 -0
  346. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/templates/activity/_detail.html +0 -0
  347. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/templates/activity/_stream.html +0 -0
  348. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/templates/activity/index.html +0 -0
  349. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/templates/base.html +0 -0
  350. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/templates/campaigns/detail.html +0 -0
  351. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/templates/campaigns/index.html +0 -0
  352. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/templates/health/_cards.html +0 -0
  353. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/templates/health/index.html +0 -0
  354. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/console/watchers.py +0 -0
  355. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/context.py +0 -0
  356. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/corpus.py +0 -0
  357. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/db/__init__.py +0 -0
  358. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/db/chroma_quotas.py +0 -0
  359. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/db/local_ef.py +0 -0
  360. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/db/t1.py +0 -0
  361. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/db/t2/telemetry.py +0 -0
  362. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/db/t3.py +0 -0
  363. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/errors.py +0 -0
  364. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/exporter.py +0 -0
  365. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/filters.py +0 -0
  366. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/formatters.py +0 -0
  367. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/frecency.py +0 -0
  368. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/hooks.py +0 -0
  369. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/index_context.py +0 -0
  370. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/languages.py +0 -0
  371. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/logging_setup.py +0 -0
  372. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/mcp/__init__.py +0 -0
  373. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/mcp_server.py +0 -0
  374. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/md_chunker.py +0 -0
  375. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/pdf_chunker.py +0 -0
  376. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/pdf_extractor.py +0 -0
  377. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/pipeline_buffer.py +0 -0
  378. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/retry.py +0 -0
  379. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/ripgrep_cache.py +0 -0
  380. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/scoring.py +0 -0
  381. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/search_clusterer.py +0 -0
  382. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/search_engine.py +0 -0
  383. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/session.py +0 -0
  384. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/taxonomy.py +0 -0
  385. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/ttl.py +0 -0
  386. {conexus-4.1.2 → conexus-4.2.2}/src/nexus/types.py +0 -0
  387. {conexus-4.1.2 → conexus-4.2.2}/tests/__init__.py +0 -0
  388. {conexus-4.1.2 → conexus-4.2.2}/tests/__snapshots__/test_search_cmd.ambr +0 -0
  389. {conexus-4.1.2 → conexus-4.2.2}/tests/benchmarks/__init__.py +0 -0
  390. {conexus-4.1.2 → conexus-4.2.2}/tests/benchmarks/corpus.json +0 -0
  391. {conexus-4.1.2 → conexus-4.2.2}/tests/benchmarks/queries.json +0 -0
  392. {conexus-4.1.2 → conexus-4.2.2}/tests/benchmarks/test_retrieval_ndcg.py +0 -0
  393. {conexus-4.1.2 → conexus-4.2.2}/tests/conftest.py +0 -0
  394. {conexus-4.1.2 → conexus-4.2.2}/tests/e2e/auth-login.sh +0 -0
  395. {conexus-4.1.2 → conexus-4.2.2}/tests/e2e/lib.sh +0 -0
  396. {conexus-4.1.2 → conexus-4.2.2}/tests/e2e/run.sh +0 -0
  397. {conexus-4.1.2 → conexus-4.2.2}/tests/e2e/sandbox.sh +0 -0
  398. {conexus-4.1.2 → conexus-4.2.2}/tests/e2e/scenarios/00_debug_load.sh +0 -0
  399. {conexus-4.1.2 → conexus-4.2.2}/tests/e2e/scenarios/01_smoke.sh +0 -0
  400. {conexus-4.1.2 → conexus-4.2.2}/tests/e2e/scenarios/02_sequential_thinking.sh +0 -0
  401. {conexus-4.1.2 → conexus-4.2.2}/tests/e2e/scenarios/03_skills.sh +0 -0
  402. {conexus-4.1.2 → conexus-4.2.2}/tests/hooks/__init__.py +0 -0
  403. {conexus-4.1.2 → conexus-4.2.2}/tests/hooks/test_permission_request_hooks.py +0 -0
  404. {conexus-4.1.2 → conexus-4.2.2}/tests/hooks/test_post_compact_hook.py +0 -0
  405. {conexus-4.1.2 → conexus-4.2.2}/tests/hooks/test_pre_close_verification_hook.py +0 -0
  406. {conexus-4.1.2 → conexus-4.2.2}/tests/hooks/test_read_verification_config.py +0 -0
  407. {conexus-4.1.2 → conexus-4.2.2}/tests/hooks/test_stop_failure_hook.py +0 -0
  408. {conexus-4.1.2 → conexus-4.2.2}/tests/hooks/test_stop_verification_hook.py +0 -0
  409. {conexus-4.1.2 → conexus-4.2.2}/tests/hooks/test_verification_integration.py +0 -0
  410. {conexus-4.1.2 → conexus-4.2.2}/tests/test_activity_stream.py +0 -0
  411. {conexus-4.1.2 → conexus-4.2.2}/tests/test_ast_languages.py +0 -0
  412. {conexus-4.1.2 → conexus-4.2.2}/tests/test_auto_linker.py +0 -0
  413. {conexus-4.1.2 → conexus-4.2.2}/tests/test_backfill_hash.py +0 -0
  414. {conexus-4.1.2 → conexus-4.2.2}/tests/test_bib_enricher.py +0 -0
  415. {conexus-4.1.2 → conexus-4.2.2}/tests/test_campaigns_panel.py +0 -0
  416. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog.py +0 -0
  417. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_backfill.py +0 -0
  418. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_cli.py +0 -0
  419. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_consolidation.py +0 -0
  420. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_db.py +0 -0
  421. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_e2e.py +0 -0
  422. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_git.py +0 -0
  423. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_indexer_hook.py +0 -0
  424. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_jsonl.py +0 -0
  425. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_knowledge_hook.py +0 -0
  426. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_link_generation.py +0 -0
  427. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_links.py +0 -0
  428. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_mcp.py +0 -0
  429. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_path.py +0 -0
  430. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_pdf_hook.py +0 -0
  431. {conexus-4.1.2 → conexus-4.2.2}/tests/test_catalog_prefilter.py +0 -0
  432. {conexus-4.1.2 → conexus-4.2.2}/tests/test_checkpoint.py +0 -0
  433. {conexus-4.1.2 → conexus-4.2.2}/tests/test_chroma_quotas.py +0 -0
  434. {conexus-4.1.2 → conexus-4.2.2}/tests/test_chroma_retry.py +0 -0
  435. {conexus-4.1.2 → conexus-4.2.2}/tests/test_chunker.py +0 -0
  436. {conexus-4.1.2 → conexus-4.2.2}/tests/test_chunker_ast_languages.py +0 -0
  437. {conexus-4.1.2 → conexus-4.2.2}/tests/test_classifier.py +0 -0
  438. {conexus-4.1.2 → conexus-4.2.2}/tests/test_cli_registration.py +0 -0
  439. {conexus-4.1.2 → conexus-4.2.2}/tests/test_collection_cmd.py +0 -0
  440. {conexus-4.1.2 → conexus-4.2.2}/tests/test_config.py +0 -0
  441. {conexus-4.1.2 → conexus-4.2.2}/tests/test_config_cmd.py +0 -0
  442. {conexus-4.1.2 → conexus-4.2.2}/tests/test_console_app.py +0 -0
  443. {conexus-4.1.2 → conexus-4.2.2}/tests/test_console_deps.py +0 -0
  444. {conexus-4.1.2 → conexus-4.2.2}/tests/test_context.py +0 -0
  445. {conexus-4.1.2 → conexus-4.2.2}/tests/test_contradiction_flag.py +0 -0
  446. {conexus-4.1.2 → conexus-4.2.2}/tests/test_corpus.py +0 -0
  447. {conexus-4.1.2 → conexus-4.2.2}/tests/test_distance_thresholds.py +0 -0
  448. {conexus-4.1.2 → conexus-4.2.2}/tests/test_doc_indexer.py +0 -0
  449. {conexus-4.1.2 → conexus-4.2.2}/tests/test_doc_indexer_hash_sync.py +0 -0
  450. {conexus-4.1.2 → conexus-4.2.2}/tests/test_doc_indexer_pagination.py +0 -0
  451. {conexus-4.1.2 → conexus-4.2.2}/tests/test_doctor_cmd.py +0 -0
  452. {conexus-4.1.2 → conexus-4.2.2}/tests/test_doctor_integrity.py +0 -0
  453. {conexus-4.1.2 → conexus-4.2.2}/tests/test_e2e.py +0 -0
  454. {conexus-4.1.2 → conexus-4.2.2}/tests/test_enrich_command.py +0 -0
  455. {conexus-4.1.2 → conexus-4.2.2}/tests/test_exporter.py +0 -0
  456. {conexus-4.1.2 → conexus-4.2.2}/tests/test_formatters.py +0 -0
  457. {conexus-4.1.2 → conexus-4.2.2}/tests/test_frecency.py +0 -0
  458. {conexus-4.1.2 → conexus-4.2.2}/tests/test_git_hooks.py +0 -0
  459. {conexus-4.1.2 → conexus-4.2.2}/tests/test_health.py +0 -0
  460. {conexus-4.1.2 → conexus-4.2.2}/tests/test_health_panel.py +0 -0
  461. {conexus-4.1.2 → conexus-4.2.2}/tests/test_hooks.py +0 -0
  462. {conexus-4.1.2 → conexus-4.2.2}/tests/test_hybrid_boost.py +0 -0
  463. {conexus-4.1.2 → conexus-4.2.2}/tests/test_index_cmd.py +0 -0
  464. {conexus-4.1.2 → conexus-4.2.2}/tests/test_index_lock.py +0 -0
  465. {conexus-4.1.2 → conexus-4.2.2}/tests/test_index_pdf_batch.py +0 -0
  466. {conexus-4.1.2 → conexus-4.2.2}/tests/test_index_rdr_cmd.py +0 -0
  467. {conexus-4.1.2 → conexus-4.2.2}/tests/test_index_reminder.py +0 -0
  468. {conexus-4.1.2 → conexus-4.2.2}/tests/test_index_taxonomy.py +0 -0
  469. {conexus-4.1.2 → conexus-4.2.2}/tests/test_indexer.py +0 -0
  470. {conexus-4.1.2 → conexus-4.2.2}/tests/test_indexer_chunk_flow.py +0 -0
  471. {conexus-4.1.2 → conexus-4.2.2}/tests/test_indexer_e2e.py +0 -0
  472. {conexus-4.1.2 → conexus-4.2.2}/tests/test_indexer_modules.py +0 -0
  473. {conexus-4.1.2 → conexus-4.2.2}/tests/test_integration.py +0 -0
  474. {conexus-4.1.2 → conexus-4.2.2}/tests/test_jsonl.py +0 -0
  475. {conexus-4.1.2 → conexus-4.2.2}/tests/test_languages.py +0 -0
  476. {conexus-4.1.2 → conexus-4.2.2}/tests/test_link_generator.py +0 -0
  477. {conexus-4.1.2 → conexus-4.2.2}/tests/test_local_mode.py +0 -0
  478. {conexus-4.1.2 → conexus-4.2.2}/tests/test_logging_setup.py +0 -0
  479. {conexus-4.1.2 → conexus-4.2.2}/tests/test_mcp_concurrency.py +0 -0
  480. {conexus-4.1.2 → conexus-4.2.2}/tests/test_mcp_package.py +0 -0
  481. {conexus-4.1.2 → conexus-4.2.2}/tests/test_mcp_server.py +0 -0
  482. {conexus-4.1.2 → conexus-4.2.2}/tests/test_md_chunker.py +0 -0
  483. {conexus-4.1.2 → conexus-4.2.2}/tests/test_md_chunker_semantic_integrity.py +0 -0
  484. {conexus-4.1.2 → conexus-4.2.2}/tests/test_md_preservation.py +0 -0
  485. {conexus-4.1.2 → conexus-4.2.2}/tests/test_memory.py +0 -0
  486. {conexus-4.1.2 → conexus-4.2.2}/tests/test_memory_consolidation.py +0 -0
  487. {conexus-4.1.2 → conexus-4.2.2}/tests/test_mineru_cmd.py +0 -0
  488. {conexus-4.1.2 → conexus-4.2.2}/tests/test_mineru_extractor.py +0 -0
  489. {conexus-4.1.2 → conexus-4.2.2}/tests/test_minified_chunking.py +0 -0
  490. {conexus-4.1.2 → conexus-4.2.2}/tests/test_overfetch_pipeline.py +0 -0
  491. {conexus-4.1.2 → conexus-4.2.2}/tests/test_p0_regressions.py +0 -0
  492. {conexus-4.1.2 → conexus-4.2.2}/tests/test_pdf_chunker.py +0 -0
  493. {conexus-4.1.2 → conexus-4.2.2}/tests/test_pdf_chunker_integration.py +0 -0
  494. {conexus-4.1.2 → conexus-4.2.2}/tests/test_pdf_e2e.py +0 -0
  495. {conexus-4.1.2 → conexus-4.2.2}/tests/test_pdf_extractor.py +0 -0
  496. {conexus-4.1.2 → conexus-4.2.2}/tests/test_pdf_extractor_integration.py +0 -0
  497. {conexus-4.1.2 → conexus-4.2.2}/tests/test_pdf_extractor_normalization.py +0 -0
  498. {conexus-4.1.2 → conexus-4.2.2}/tests/test_pdf_extractor_server.py +0 -0
  499. {conexus-4.1.2 → conexus-4.2.2}/tests/test_pdf_subsystem.py +0 -0
  500. {conexus-4.1.2 → conexus-4.2.2}/tests/test_pipeline_buffer.py +0 -0
  501. {conexus-4.1.2 → conexus-4.2.2}/tests/test_pipeline_stages.py +0 -0
  502. {conexus-4.1.2 → conexus-4.2.2}/tests/test_pipeline_version.py +0 -0
  503. {conexus-4.1.2 → conexus-4.2.2}/tests/test_plan_library.py +0 -0
  504. {conexus-4.1.2 → conexus-4.2.2}/tests/test_plugin.py +0 -0
  505. {conexus-4.1.2 → conexus-4.2.2}/tests/test_plugin_install.py +0 -0
  506. {conexus-4.1.2 → conexus-4.2.2}/tests/test_plugin_structure.py +0 -0
  507. {conexus-4.1.2 → conexus-4.2.2}/tests/test_ppid_chain_hypothesis.py +0 -0
  508. {conexus-4.1.2 → conexus-4.2.2}/tests/test_provision.py +0 -0
  509. {conexus-4.1.2 → conexus-4.2.2}/tests/test_quality_score.py +0 -0
  510. {conexus-4.1.2 → conexus-4.2.2}/tests/test_query_sanitizer.py +0 -0
  511. {conexus-4.1.2 → conexus-4.2.2}/tests/test_rdr052_verification.py +0 -0
  512. {conexus-4.1.2 → conexus-4.2.2}/tests/test_rdr053_verification.py +0 -0
  513. {conexus-4.1.2 → conexus-4.2.2}/tests/test_rdr_audit_incident_template.py +0 -0
  514. {conexus-4.1.2 → conexus-4.2.2}/tests/test_rdr_audit_scheduling.py +0 -0
  515. {conexus-4.1.2 → conexus-4.2.2}/tests/test_rdr_audit_skill.py +0 -0
  516. {conexus-4.1.2 → conexus-4.2.2}/tests/test_registry.py +0 -0
  517. {conexus-4.1.2 → conexus-4.2.2}/tests/test_relevance_log.py +0 -0
  518. {conexus-4.1.2 → conexus-4.2.2}/tests/test_ripgrep_cache.py +0 -0
  519. {conexus-4.1.2 → conexus-4.2.2}/tests/test_schema.py +0 -0
  520. {conexus-4.1.2 → conexus-4.2.2}/tests/test_scoring.py +0 -0
  521. {conexus-4.1.2 → conexus-4.2.2}/tests/test_scratch.py +0 -0
  522. {conexus-4.1.2 → conexus-4.2.2}/tests/test_scratch_cmd.py +0 -0
  523. {conexus-4.1.2 → conexus-4.2.2}/tests/test_search_clusterer.py +0 -0
  524. {conexus-4.1.2 → conexus-4.2.2}/tests/test_search_clustering_integration.py +0 -0
  525. {conexus-4.1.2 → conexus-4.2.2}/tests/test_search_cmd.py +0 -0
  526. {conexus-4.1.2 → conexus-4.2.2}/tests/test_search_engine.py +0 -0
  527. {conexus-4.1.2 → conexus-4.2.2}/tests/test_session.py +0 -0
  528. {conexus-4.1.2 → conexus-4.2.2}/tests/test_session_propagation_hypotheses.py +0 -0
  529. {conexus-4.1.2 → conexus-4.2.2}/tests/test_silent_error_logging.py +0 -0
  530. {conexus-4.1.2 → conexus-4.2.2}/tests/test_sn_plugin.py +0 -0
  531. {conexus-4.1.2 → conexus-4.2.2}/tests/test_store_cmd.py +0 -0
  532. {conexus-4.1.2 → conexus-4.2.2}/tests/test_structlog_events.py +0 -0
  533. {conexus-4.1.2 → conexus-4.2.2}/tests/test_t1.py +0 -0
  534. {conexus-4.1.2 → conexus-4.2.2}/tests/test_t2.py +0 -0
  535. {conexus-4.1.2 → conexus-4.2.2}/tests/test_t2_concurrency.py +0 -0
  536. {conexus-4.1.2 → conexus-4.2.2}/tests/test_t2_prefix_scan.py +0 -0
  537. {conexus-4.1.2 → conexus-4.2.2}/tests/test_t3.py +0 -0
  538. {conexus-4.1.2 → conexus-4.2.2}/tests/test_t3_hnsw_ef.py +0 -0
  539. {conexus-4.1.2 → conexus-4.2.2}/tests/test_t3_quota_enforcement.py +0 -0
  540. {conexus-4.1.2 → conexus-4.2.2}/tests/test_table_extraction.py +0 -0
  541. {conexus-4.1.2 → conexus-4.2.2}/tests/test_taxonomy_e2e.py +0 -0
  542. {conexus-4.1.2 → conexus-4.2.2}/tests/test_ttl.py +0 -0
  543. {conexus-4.1.2 → conexus-4.2.2}/tests/test_tumbler.py +0 -0
  544. {conexus-4.1.2 → conexus-4.2.2}/tests/test_tuning_config.py +0 -0
  545. {conexus-4.1.2 → conexus-4.2.2}/tests/test_verify_multiprobe.py +0 -0
  546. {conexus-4.1.2 → conexus-4.2.2}/tests/test_voyage_retry.py +0 -0
@@ -9,13 +9,13 @@
9
9
  "name": "nx",
10
10
  "source": "./nx",
11
11
  "description": "Self-hosted three-tier knowledge management with 16 specialized agents, analytical query pipelines, semantic search, and RDR decision tracking for Claude Code.",
12
- "version": "4.1.2"
12
+ "version": "4.2.2"
13
13
  },
14
14
  {
15
15
  "name": "sn",
16
16
  "source": "./sn",
17
17
  "description": "Injects Serena and Context7 MCP tool usage guidance into subagents via SubagentStart hook.",
18
- "version": "4.1.2"
18
+ "version": "4.2.2"
19
19
  }
20
20
  ]
21
21
  }
@@ -16,7 +16,7 @@ jobs:
16
16
  test:
17
17
  name: pytest (Python ${{ matrix.python-version }})
18
18
  runs-on: ubuntu-latest
19
- timeout-minutes: 10
19
+ timeout-minutes: 15
20
20
  strategy:
21
21
  fail-fast: false
22
22
  matrix:
@@ -6,6 +6,69 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [4.2.2] - 2026-04-14
10
+
11
+ (Note: v4.2.1 was tagged but never published due to a test failure. v4.2.2 supersedes it and includes all 4.2.1 changes plus the ChromaDB Cloud quota audit and observability improvements found during a live shakeout.)
12
+
13
+ ### Added
14
+
15
+ - **`nx doctor` PyPI version check**: `_check_cli_version` queries https://pypi.org/pypi/conexus/json (3-second timeout) and reports current vs latest. When behind, suggests `uv tool upgrade conexus`. Network failures are silent (offline-tolerant).
16
+ - **`nx upgrade --skip-t3` flag**: skip T3 upgrade steps (e.g., heavy cross-collection projection backfill) for fast T2-only migrations.
17
+ - **`backfill_projection` per-collection progress**: prints `[i/N] collection: chunks, matches, attempted (elapsed)` to stderr during the T3 backfill, plus a final summary with total time and actual rows stored. Previously the backfill was silent for many minutes on large repos.
18
+ - **`CatalogTaxonomy._paginated_get`** + **`_batched_upsert`** helpers: wrap ChromaDB calls with the 300-record per-call cap (`MAX_QUERY_RESULTS` / `MAX_RECORDS_PER_WRITE`).
19
+ - **CLAUDE.md "External Service Limits" section**: documents ChromaDB Cloud + Voyage AI quotas with a reference table. Mandatory consult before any new ChromaDB call.
20
+
21
+ ### Fixed
22
+
23
+ - **`project_against` paginated `coll.get()`**: `_PAGE = 2000` exceeded the ChromaDB Cloud Get quota of 300, causing `nx taxonomy project` to fail on real cloud collections. Now `_PAGE = 300` with paginated source-collection fetch via `_paginated_get`.
24
+ - **4 unbounded `coll.get()` calls** in `catalog_taxonomy.py` (`_discover_cross_links`, `project_against` centroid filter, `rebuild_taxonomy` rebuild + cleanup paths) wrapped in `_paginated_get` to avoid OOM and quota errors at scale.
25
+ - **3 `centroid_coll.upsert()` sites** wrapped in `_batched_upsert` (defensive against `MAX_RECORDS_PER_WRITE = 300`).
26
+ - **`rebuild_taxonomy` cleanup**: paginated GET + batched DELETE so collections with >300 centroids don't fail rebuild.
27
+ - **`nx taxonomy links` invisible cross-collection links**: command queried `compute_topic_links` (catalog-derived only) and ignored the `topic_links` table. Cross-collection projection links written by `_discover_cross_links` and `generate_cooccurrence_links` were invisible. Now displays all rows in `topic_links` with `[collection]` prefix on each topic. New `--refresh` flag re-runs catalog-derived computation explicitly.
28
+ - **`backfill_projection` misleading count**: reported "X assignments" using the per-call attempt count, but `INSERT OR IGNORE` deduplicates. Now reports "X stored (Y attempted)" using `COUNT(*) FROM topic_assignments WHERE assigned_by = 'projection'`.
29
+ - **Plugin/CLI version mismatch UX**: when the nx plugin is upgraded but the conexus CLI is not, the `nx upgrade --auto` SessionStart hook would print a cryptic Click error. Now prints a helpful message: `nx plugin requires conexus >= 4.2.0 — run: uv tool upgrade conexus`.
30
+
31
+ ## [4.2.0] - 2026-04-14
32
+
33
+ ### Added
34
+
35
+ - **Idempotent upgrade mechanism** (RDR-076): centralised T2 schema migration registry in `src/nexus/db/migrations.py` with version-gated `Migration(introduced, name, fn)` entries. `apply_pending(conn, current_version)` runs migrations between last-seen version (stored in `_nexus_version` table) and current CLI version. Each migration is idempotent via `PRAGMA table_info()` / `sqlite_master` guards.
36
+ - **`nx upgrade` CLI command** with `--dry-run`, `--force`, `--auto` flags for applying pending T2 migrations and T3 upgrade steps.
37
+ - **Auto-upgrade on SessionStart**: `nx upgrade --auto` runs as the first SessionStart hook — T2 migrations apply silently on every session start.
38
+ - **`T3UpgradeStep` typed interface** for ChromaDB operations (backfills, re-indexing) that require a `T3Database` client.
39
+ - **`nx doctor --check-schema`** validates T2 database schema and reports pending migrations.
40
+ - **MCP version compatibility check**: synchronous check in MCP `main()` that warns on major/minor version divergence between CLI and stored version.
41
+ - **Cross-collection topic projection** (RDR-075): `nx taxonomy project SOURCE` command computes cosine similarity between source chunk embeddings and target collection centroids via normalized matrix multiply. Flags: `--against TARGETS`, `--threshold N` (default 0.85), `--top-k N`, `--persist`, `--backfill`.
42
+ - **Automatic cross-collection projection** in `taxonomy_assign_hook`: every `store_put` now projects against foreign collection centroids in addition to same-collection assignment. New rows use `assigned_by='projection'`.
43
+ - **Cross-collection topic links**: `_discover_cross_links` (centroid-level similarity at discover time) and `generate_cooccurrence_links` (SQL self-join on shared doc co-assignments) populate the `topic_links` table with `link_types=["projection"]` or `["cooccurrence"]`.
44
+ - **`list_sibling_collections()`** in `registry.py` auto-detects related collections from the `{prefix}{name}-{hash8}` naming scheme. Used as the default `--against` target for `nx taxonomy project`.
45
+ - **T3 projection backfill**: `T3UpgradeStep("4.2.0", "Backfill cross-collection projection", ...)` runs via `nx upgrade` (not `--auto`) to populate cross-collection assignments and links for existing installs.
46
+ - **`cross_collection` parameter** on `assign_single` and `assign_batch` — when True, queries only foreign centroids (`$ne collection_name` filter) for cross-collection projection.
47
+ - **Incremental taxonomy assignment during indexing** (RDR-070): `taxonomy_assign_batch` wired into `code_indexer`, `prose_indexer`, `pipeline_stages` uploader, and `doc_indexer`. Chunks assigned to nearest topics immediately after upsert.
48
+ - **`indexer_utils`** gitignore/repo-root helpers: `find_repo_root()`, `should_ignore()`, `load_ignore_patterns()`, `is_gitignored()`. PDF batch mode now respects `.nexusignore`.
49
+
50
+ ### Fixed
51
+
52
+ - RDR close gate heading normalization: `_extract_section` now accepts both `## Problem` and `## Problem Statement` heading variants; gap regex broadened from `^#### Gap \d+:` to `^#{3,5} Gap \d+:` (accepts h3–h5).
53
+ - `doctor --check-schema` uses `PRAGMA busy_timeout=2000` to prevent `database is locked` during concurrent upgrades.
54
+ - `upsert_topic_links` no longer deletes all rows before inserting — preserves projection links from `_discover_cross_links`.
55
+ - `_parse_version` normalizes to 3-component tuples (`(3, 7)` → `(3, 7, 0)`) to avoid unexpected ordering.
56
+
57
+ ### Changed
58
+
59
+ - `assign_batch` batches all embeddings into a single ChromaDB query (was N individual queries).
60
+ - `project_against` paginates source collection fetch (2000-chunk pages) to prevent OOM on large collections.
61
+ - `generate_cooccurrence_links` uses a SQL self-join on `topic_assignments` instead of loading the full table into Python memory.
62
+ - Domain store `_migrate_*_if_needed()` methods now delegate to the centralised migration registry.
63
+
64
+ ### Docs
65
+
66
+ - Full `nx upgrade` section added to `docs/cli-reference.md`
67
+ - `nx taxonomy project` subcommand documented in `docs/cli-reference.md`
68
+ - Migration Registry section added to `docs/architecture.md` replacing old ad-hoc migration paragraph
69
+ - Source Layout in `CLAUDE.md` updated with `migrations.py`, `upgrade.py`, and updated descriptions
70
+ - Release checklist in `docs/contributing.md` now includes `migrations.py` verification
71
+
9
72
  ## [4.1.2] - 2026-04-13
10
73
 
11
74
  ### Fixed
@@ -105,12 +105,13 @@ src/nexus/ # Core package
105
105
  config_cmd.py # nx config
106
106
  hooks.py # nx hooks (user-facing hook management)
107
107
  hook.py # nx hook (hidden; git hook stanza management)
108
- doctor.py # nx doctor
108
+ doctor.py # nx doctor (includes --check-schema for T2 validation, RDR-076)
109
+ upgrade.py # nx upgrade (--dry-run, --force, --auto; T2 migrations + T3 upgrade steps, RDR-076)
109
110
  enrich.py # nx enrich
110
111
  catalog.py # nx catalog
111
112
  mineru.py # nx mineru
112
113
  console.py # nx console (embedded web UI server)
113
- taxonomy_cmd.py # nx taxonomy (topic browsing and discovery)
114
+ taxonomy_cmd.py # nx taxonomy (topic browsing, discovery, cross-collection projection via project subcommand)
114
115
  _helpers.py # Shared CLI helpers (default_db_path)
115
116
  _provision.py # ChromaDB Cloud provisioning helpers
116
117
  catalog/ # Xanadu-inspired document catalog (JSONL truth + SQLite cache)
@@ -126,6 +127,7 @@ src/nexus/ # Core package
126
127
  watchers.py # File/event watchers for live UI updates
127
128
  routes/ # FastAPI routers (activity, campaigns, health, partials)
128
129
  db/ # Storage tier implementations
130
+ migrations.py # Centralised T2 migration registry: Migration dataclass, apply_pending(), T3UpgradeStep, version tracking (RDR-076)
129
131
  t1.py # T1 ChromaDB client (ephemeral or HTTP)
130
132
  t2/ # T2 SQLite package: MemoryStore, PlanLibrary, CatalogTaxonomy, Telemetry domain stores + T2Database facade
131
133
  t3.py # T3 ChromaDB client (persistent local or cloud)
@@ -138,7 +140,7 @@ src/nexus/ # Core package
138
140
  code_indexer.py # Code file indexing: AST chunking, context extraction, Voyage AI embedding (extracted from indexer.py, RDR-032)
139
141
  prose_indexer.py # Prose file indexing: semantic markdown chunking, CCE embedding (extracted from indexer.py, RDR-032)
140
142
  index_context.py # IndexContext dataclass: shared indexing parameters replacing 12-parameter signatures
141
- indexer_utils.py # Shared indexing utilities: staleness checks, context-prefix building
143
+ indexer_utils.py # Shared indexing utilities: staleness checks, context-prefix building, gitignore/repo-root helpers
142
144
  classifier.py # File classification: CODE / PROSE / PDF / SKIP
143
145
  chunker.py # Tree-sitter AST chunking (31 languages)
144
146
  languages.py # LANGUAGE_REGISTRY: unified extension→language map (single source of truth)
@@ -160,7 +162,7 @@ src/nexus/ # Core package
160
162
  ripgrep_cache.py # ripgrep integration for hybrid search
161
163
  session.py # Session lifecycle (T1 server start/connect)
162
164
  config.py # Config hierarchy + .nexus.yml
163
- registry.py # Collection → database routing
165
+ registry.py # Collection → database routing + list_sibling_collections() for cross-collection scoping (RDR-075)
164
166
  corpus.py # Corpus naming utilities
165
167
  formatters.py # Result display formatting
166
168
  types.py # Shared type definitions
@@ -171,12 +173,34 @@ src/nexus/ # Core package
171
173
  logging_setup.py # Structured logging configuration (cli/console/mcp/hook modes, rotating file handler)
172
174
  taxonomy.py # Deprecation shim — imports forwarded to db.t2.catalog_taxonomy (RDR-070)
173
175
  mcp_server.py # Backward-compat shim — re-exports all MCP tools from nexus.mcp package
174
- mcp_infra.py # MCP server infrastructure: singletons, caching, test injection, taxonomy_assign_hook (post-store topic assignment)
176
+ mcp_infra.py # MCP server infrastructure: singletons, caching, test injection, taxonomy_assign_hook (post-store topic assignment + cross-collection projection), check_version_compatibility (RDR-076)
175
177
  nx/ # Claude Code plugin (skills, agents, hooks, slash commands)
176
178
  tests/ # pytest suite (unit + integration + e2e/)
177
179
  docs/ # Documentation (architecture.md is the module map)
178
180
  ```
179
181
 
182
+ ## External Service Limits — CHECK BEFORE EVERY CALL
183
+
184
+ **ALWAYS** consult `src/nexus/db/chroma_quotas.py` (the `QUOTAS` dataclass and `QuotaValidator`) before writing any ChromaDB call. Violating these at runtime produces `ChromaError: Quota exceeded` — costly to debug, embarrassing in release.
185
+
186
+ **ChromaDB Cloud free-tier caps** (single source of truth: `chroma_quotas.py`):
187
+
188
+ | Operation | Limit | Notes |
189
+ |-----------|-------|-------|
190
+ | `coll.get(limit=N)` | N ≤ 300 | Same cap as queries. `_PAGE = 300` max for pagination |
191
+ | `coll.query(n_results=N)` | N ≤ 300 | `MAX_QUERY_RESULTS` |
192
+ | `coll.upsert/add(ids=[...])` | ≤ 300 records | `MAX_RECORDS_PER_WRITE` |
193
+ | Concurrent reads per coll | ≤ 10 | `MAX_CONCURRENT_READS` |
194
+ | Concurrent writes per coll | ≤ 10 | `MAX_CONCURRENT_WRITES` |
195
+ | Document size | ≤ 16384 bytes | `MAX_DOCUMENT_BYTES` (use `SAFE_CHUNK_BYTES = 12288`) |
196
+ | Query string | ≤ 256 chars | `MAX_QUERY_STRING_CHARS` |
197
+ | `where` predicates | ≤ 8 top-level | `MAX_WHERE_PREDICATES` |
198
+ | Embedding dims | ≤ 4096 | `MAX_EMBEDDING_DIMENSIONS` |
199
+
200
+ **Voyage AI**: `voyage-3` / `voyage-code-3` / `voyage-context-3` = 1024 dims, 32k tokens/request. Batch requests up to 128 inputs. Use `nexus.retry._voyage_with_retry` for transient failure handling.
201
+
202
+ **Rule of thumb**: paginating through a large ChromaDB collection requires `limit ≤ 300` per call. When fetching N documents, use `offset += 300` in a loop. `MAX_RECORDS_PER_WRITE = 300` means upsert batches must also be capped.
203
+
180
204
  ## Development Conventions
181
205
 
182
206
  - **Python 3.12+**: use `match/case`, `tomllib`, `typing.Protocol`, walrus operator freely
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: conexus
3
- Version: 4.1.2
3
+ Version: 4.2.2
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
@@ -183,10 +183,11 @@ The `nx` command provides direct access to all storage tiers, indexing, and sear
183
183
  | `nx scratch` | Inter-agent session context (in-memory, no API keys) |
184
184
  | `nx collection` | Inspect and manage cloud collections |
185
185
  | `nx config` | Credentials and settings |
186
- | `nx doctor` | Health check verifies dependencies, credentials, connectivity |
186
+ | `nx upgrade` | Run pending database migrations and T3 upgrade steps |
187
+ | `nx doctor` | Health check — verifies dependencies, credentials, connectivity, schema |
187
188
  | `nx hooks` | Install git hooks for automatic re-indexing on commit |
188
189
  | `nx catalog` | Document registry — search, link, audit the catalog metadata layer |
189
- | `nx taxonomy` | Topic taxonomy — review, rename, merge, and split auto-discovered topic clusters |
190
+ | `nx taxonomy` | Topic taxonomy — discover, project across collections, review, merge, split |
190
191
  | `nx context` | Project context cache — topic map for agent cold-start acceleration |
191
192
  | `nx mineru` | MinerU server lifecycle (start/stop/status) for PDF extraction |
192
193
 
@@ -135,10 +135,11 @@ The `nx` command provides direct access to all storage tiers, indexing, and sear
135
135
  | `nx scratch` | Inter-agent session context (in-memory, no API keys) |
136
136
  | `nx collection` | Inspect and manage cloud collections |
137
137
  | `nx config` | Credentials and settings |
138
- | `nx doctor` | Health check verifies dependencies, credentials, connectivity |
138
+ | `nx upgrade` | Run pending database migrations and T3 upgrade steps |
139
+ | `nx doctor` | Health check — verifies dependencies, credentials, connectivity, schema |
139
140
  | `nx hooks` | Install git hooks for automatic re-indexing on commit |
140
141
  | `nx catalog` | Document registry — search, link, audit the catalog metadata layer |
141
- | `nx taxonomy` | Topic taxonomy — review, rename, merge, and split auto-discovered topic clusters |
142
+ | `nx taxonomy` | Topic taxonomy — discover, project across collections, review, merge, split |
142
143
  | `nx context` | Project context cache — topic map for agent cold-start acceleration |
143
144
  | `nx mineru` | MinerU server lifecycle (start/stop/status) for PDF extraction |
144
145
 
@@ -242,14 +242,25 @@ Phase 2 consequences:
242
242
  own `threading.Lock` plus the SQLite file-level write lock -- callers
243
243
  never see `OperationalError: database is locked`.
244
244
 
245
- **Migrations**: Each store owns its schema-migration guards and runs
246
- them the first time it opens a given database path. The guards are
247
- per-domain, so concurrent `T2Database` constructors on the same path
248
- can each reach their own `_init_schema` without coordinating through a
249
- single global migration lock. (`T2Database.__init__` itself constructs
250
- the four stores sequentially in dependency order -- the per-domain
251
- guard matters for multi-process / multi-constructor races, not for the
252
- sequential initialization inside a single `T2Database`.)
245
+ **Migration Registry** (RDR-076): All T2 schema migrations are centralised in
246
+ `src/nexus/db/migrations.py`. The `MIGRATIONS` list contains version-tagged
247
+ `Migration(introduced, name, fn)` entries. `apply_pending(conn, current_version)`
248
+ runs migrations between the last-seen version (stored in `_nexus_version` table)
249
+ and the current CLI version. Each migration function is idempotent via
250
+ `PRAGMA table_info()` or `sqlite_master` guards.
251
+
252
+ `T2Database.__init__()` opens a transient connection, calls `apply_pending()`,
253
+ closes it, then constructs the four domain stores. The `_upgrade_done` set
254
+ (guarded by `_upgrade_lock`) provides a process-level fast path — subsequent
255
+ constructions skip all DB access. Domain stores retain their own
256
+ `_migrated_paths` guards for standalone construction outside `T2Database`.
257
+
258
+ **T3 Upgrade Steps**: `T3UpgradeStep(introduced, name, fn)` entries in the
259
+ `T3_UPGRADES` list handle ChromaDB operations (backfills, re-indexing) that
260
+ require a `T3Database` client. These run via `nx upgrade` (not `--auto` mode).
261
+
262
+ **Auto-upgrade**: `nx upgrade --auto` runs as the first SessionStart hook,
263
+ applying T2 migrations silently. T3 steps are skipped in auto mode.
253
264
 
254
265
  **In-memory SQLite**: Tests that want an ephemeral database should use
255
266
  a temp file path, not `":memory:"` -- `:memory:` databases are
@@ -325,6 +325,9 @@ nx taxonomy merge "source" "target" # merge topics
325
325
  nx taxonomy split "label" --k 3 # split into sub-topics
326
326
  nx taxonomy links # show inter-topic relationships
327
327
  nx taxonomy rebuild -c docs__nexus # full rebuild
328
+ nx taxonomy project code__nexus # project against sibling collections
329
+ nx taxonomy project code__nexus --against knowledge__art # explicit targets
330
+ nx taxonomy project --backfill --persist # project all collections
328
331
  ```
329
332
 
330
333
  | Subcommand | Description |
@@ -341,6 +344,7 @@ nx taxonomy rebuild -c docs__nexus # full rebuild
341
344
  | `split LABEL --k N` | Split into N sub-topics via KMeans. `-c NAME` scopes label lookup |
342
345
  | `links` | Inter-topic link counts from catalog graph. `-c NAME` filters by collection |
343
346
  | `rebuild` | Full re-cluster (alias for `discover --force`). `-c NAME` required |
347
+ | `project SOURCE` | Cross-collection projection: match chunks against other collections' centroids. `--against TARGETS` for explicit targets (default: sibling collections). `--threshold N` (default 0.85). `--persist` to write assignments. `--backfill` to project all collections against each other |
344
348
 
345
349
  **Configuration** (in `.nexus.yml`):
346
350
 
@@ -350,7 +354,7 @@ taxonomy:
350
354
  local_exclude_collections: [] # default: ["code__*"] — MiniLM clusters poorly on code
351
355
  ```
352
356
 
353
- **Upgrade path**: Run `nx taxonomy discover --all` once after upgrading to populate topics for existing collections.
357
+ **Upgrade path**: Run `nx upgrade` after upgrading to apply pending migrations and T3 upgrade steps (including cross-collection projection backfill). Run `nx taxonomy discover --all` to populate topics for new collections.
354
358
 
355
359
  ---
356
360
 
@@ -621,6 +625,35 @@ nx doctor --fix-paths --dry-run # Preview migration without applying
621
625
 
622
626
  The `--fix` flag retroactively applies HNSW `search_ef` tuning to all existing local-mode collections. New collections get this automatically. In cloud mode (SPANN), prints a skip message — SPANN defaults are adequate.
623
627
 
628
+ ```
629
+ nx doctor --check-schema # Validate T2 database schema and report pending migrations
630
+ ```
631
+
632
+ ---
633
+
634
+ ## nx upgrade
635
+
636
+ Run pending database migrations and T3 upgrade steps.
637
+
638
+ ```
639
+ nx upgrade # Apply all pending T2 + T3 migrations
640
+ nx upgrade --dry-run # List pending migrations without executing
641
+ nx upgrade --force # Reset version gate and re-run all migrations
642
+ nx upgrade --auto # Quiet mode for hook invocation (T2 only, exit 0 always)
643
+ ```
644
+
645
+ | Flag | Description |
646
+ |------|-------------|
647
+ | `--dry-run` | List pending migrations without executing (creates base tables if absent) |
648
+ | `--force` | Reset version gate to 0.0.0 and re-run all migrations. Per-migration idempotency guards still apply |
649
+ | `--auto` | Quiet mode for SessionStart hook. T2 migrations only (T3 skipped — may exceed hook timeout). Exit 0 always |
650
+
651
+ **How it works**: The CLI version (`importlib.metadata.version("conexus")`) is compared against the last-seen version stored in T2 (`_nexus_version` table). Migrations tagged with versions between last-seen and current are executed. Each migration is idempotent via `PRAGMA table_info()` / `sqlite_master` guards.
652
+
653
+ **Auto-upgrade**: `nx upgrade --auto` runs as the first SessionStart hook in the Claude Code plugin. T2 migrations apply silently on every session start. T3 upgrade steps (e.g., cross-collection projection backfill) run only via explicit `nx upgrade`.
654
+
655
+ **Adding new migrations**: Append a `Migration("x.y.z", "description", fn)` entry to the `MIGRATIONS` list in `src/nexus/db/migrations.py`. For T3 operations, use `T3UpgradeStep`.
656
+
624
657
  ---
625
658
 
626
659
  ## nx console
@@ -254,6 +254,7 @@ Every step below is **required**. Missing any one of them has caused problems in
254
254
  | `docs/configuration.md` | new config keys or tuning parameters |
255
255
  | `docs/storage-tiers.md` | new storage capabilities |
256
256
  | `README.md` | high-level feature descriptions |
257
+ | `src/nexus/db/migrations.py` | verify `PRE_REGISTRY_VERSION` matches previous release; new T2 migrations in `MIGRATIONS` list; new T3 steps in `T3_UPGRADES` |
257
258
 
258
259
  ### Pre-push release checklist
259
260
 
@@ -96,6 +96,8 @@ An RDR (Research-Design-Review) is a short document that records a technical dec
96
96
  | [RDR-072](rdr-072-progressive-context-loading.md) | Progressive Context Loading | Feature | Closed | 2026-04-13 |
97
97
  | [RDR-073](rdr-073-temporal-entity-knowledge-graph.md) | Temporal Entity Knowledge Graph | Feature | Deferred | 2026-04-13 |
98
98
  | [RDR-074](rdr-074-permanence-mode.md) | Permanence Mode | Feature | Deferred | 2026-04-13 |
99
+ | [RDR-075](rdr-075-cross-collection-topic-projection.md) | Cross-Collection Topic Projection | Feature | Closed (implemented) | 2026-04-13 |
100
+ | [RDR-076](rdr-076-idempotent-upgrade-mechanism.md) | Idempotent Upgrade Mechanism | Architecture | Closed (implemented) | 2026-04-13 |
99
101
 
100
102
  ---
101
103