compass-kb-validation 2.6.0__tar.gz → 2.7.0__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 (115) hide show
  1. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/PKG-INFO +9 -3
  2. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/README.md +8 -2
  3. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/compass_kb_validation.egg-info/PKG-INFO +9 -3
  4. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/compass_kb_validation.egg-info/SOURCES.txt +3 -0
  5. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/discover_and_validate.py +12 -8
  6. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/__init__.py +1 -1
  7. compass_kb_validation-2.7.0/ingestion_validation/citation.py +696 -0
  8. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/cli.py +137 -27
  9. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/config/__init__.py +71 -14
  10. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/grounding.py +129 -27
  11. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/live_dashboard.py +1 -1
  12. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/mcp_server.py +2 -0
  13. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/notifications.py +3 -1
  14. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/profiler.py +7 -3
  15. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/providers/vectorstore.py +4 -0
  16. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/remediation.py +11 -6
  17. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/report/__init__.py +11 -2
  18. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/report/analysis.py +19 -7
  19. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/validators/api_upload.py +1 -1
  20. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/validators/base_sparql.py +14 -4
  21. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/validators/redis_chunks.py +6 -1
  22. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/validators/registry.py +1 -1
  23. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/validators/retrieval_quality.py +21 -7
  24. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/validators/s3_storage.py +11 -1
  25. compass_kb_validation-2.7.0/tests/test_citation.py +406 -0
  26. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_grounding.py +15 -0
  27. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_neptune_bugfixes2.py +13 -1
  28. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_profiler.py +2 -2
  29. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_reporting.py +26 -2
  30. compass_kb_validation-2.7.0/tests/test_review_hardening.py +113 -0
  31. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/LICENSE +0 -0
  32. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/compass_kb_validation.egg-info/dependency_links.txt +0 -0
  33. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/compass_kb_validation.egg-info/entry_points.txt +0 -0
  34. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/compass_kb_validation.egg-info/requires.txt +0 -0
  35. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/compass_kb_validation.egg-info/top_level.txt +0 -0
  36. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/__main__.py +0 -0
  37. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/ask.py +0 -0
  38. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/baseline.py +0 -0
  39. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/chunk_coherence.py +0 -0
  40. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/config_lint.py +0 -0
  41. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/content_inspect.py +0 -0
  42. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/corpus.py +0 -0
  43. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/corpus_health.py +0 -0
  44. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/diagnostics.py +0 -0
  45. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/embedding_drift.py +0 -0
  46. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/eval_interop.py +0 -0
  47. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/init_wizard.py +0 -0
  48. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/models/__init__.py +0 -0
  49. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/pipeline/__init__.py +0 -0
  50. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/provenance.py +0 -0
  51. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/providers/__init__.py +0 -0
  52. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/providers/embedding.py +0 -0
  53. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/providers/graph.py +0 -0
  54. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/providers/source.py +0 -0
  55. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/providers/storage.py +0 -0
  56. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/report/_report_css.py +0 -0
  57. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/report/_report_js.py +0 -0
  58. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/report/export.py +0 -0
  59. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/report/shell.py +0 -0
  60. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/retrieval_analysis.py +0 -0
  61. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/trend_tracker.py +0 -0
  62. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/utils/__init__.py +0 -0
  63. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/validators/__init__.py +0 -0
  64. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/validators/base.py +0 -0
  65. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/validators/cross_stage.py +0 -0
  66. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/validators/graphdb_metadata.py +0 -0
  67. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/ingestion_validation/validators/neptune_metadata.py +0 -0
  68. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/profile_kb.py +0 -0
  69. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/pyproject.toml +0 -0
  70. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/run_validation.py +0 -0
  71. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/setup.cfg +0 -0
  72. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_alt_adapters.py +0 -0
  73. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_analysis_report.py +0 -0
  74. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_api_upload.py +0 -0
  75. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_ask.py +0 -0
  76. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_baseline.py +0 -0
  77. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_benchmark.py +0 -0
  78. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_check_catalog.py +0 -0
  79. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_cli.py +0 -0
  80. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_config.py +0 -0
  81. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_config_lint.py +0 -0
  82. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_content_inspect.py +0 -0
  83. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_corpus.py +0 -0
  84. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_corpus_health.py +0 -0
  85. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_coverage.py +0 -0
  86. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_cross_stage.py +0 -0
  87. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_diagnostics.py +0 -0
  88. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_discover_cli.py +0 -0
  89. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_discovery_parallel.py +0 -0
  90. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_embedding_drift.py +0 -0
  91. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_eval_interop.py +0 -0
  92. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_gate.py +0 -0
  93. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_graph_transport.py +0 -0
  94. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_graph_validators.py +0 -0
  95. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_init_wizard.py +0 -0
  96. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_manifest.py +0 -0
  97. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_mcp.py +0 -0
  98. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_migration.py +0 -0
  99. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_models.py +0 -0
  100. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_neptune_bugfixes.py +0 -0
  101. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_notifications.py +0 -0
  102. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_pipeline.py +0 -0
  103. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_providers.py +0 -0
  104. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_redis_chunks.py +0 -0
  105. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_registry.py +0 -0
  106. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_remediation.py +0 -0
  107. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_retrieval_assertions.py +0 -0
  108. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_retrieval_quality.py +0 -0
  109. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_run_cli.py +0 -0
  110. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_sources.py +0 -0
  111. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_storage_validator.py +0 -0
  112. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_trends.py +0 -0
  113. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_universal_concerns.py +0 -0
  114. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_utils.py +0 -0
  115. {compass_kb_validation-2.6.0 → compass_kb_validation-2.7.0}/tests/test_vectorstore_filters.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: compass-kb-validation
3
- Version: 2.6.0
3
+ Version: 2.7.0
4
4
  Summary: Knowledge-base readiness validation for RAG & AI agents — config-driven, deterministic pipeline integrity checks.
5
5
  Author: COMPASS
6
6
  License: MIT
@@ -229,8 +229,14 @@ compass ask --project my-kb --batch questions.jsonl --format eval --output eval_
229
229
  compass quality --project my-kb
230
230
  compass freshness --project my-kb --stale-after 30
231
231
 
232
- # Adjudicate an eval's grounding finding against the KB: did the bot's counts match reality?
233
- # Deterministic - attributes a failure to a layer (retrieval vs the model), never scores answer quality.
232
+ # Validate an EXTERNAL eval's output against the KB COMPASS already has access to. Not an eval,
233
+ # not a tracer: the eval (an LLM judge, or the bot's captured trace) claims "grounded",
234
+ # "cited MIS p.1", "28%" - COMPASS deterministically checks those claims against ground truth
235
+ # in the KB and attributes any failure to a layer (retrieval vs the model), never scoring answer
236
+ # quality. Verifies each CITED claim at its cited location: a fabricated number, a wrong page, a
237
+ # fact present in the KB but not retrieved, or a source not in the KB. Uses the eval's retrieved
238
+ # chunks when present (Level 1) and the live KB (Level 2); the answer text + a reachable KB alone
239
+ # still catches fabricated figures and phantom citations.
234
240
  compass grounding-audit --project my-kb --eval-result case.json --fail-on-fabrication
235
241
  ```
236
242
 
@@ -162,8 +162,14 @@ compass ask --project my-kb --batch questions.jsonl --format eval --output eval_
162
162
  compass quality --project my-kb
163
163
  compass freshness --project my-kb --stale-after 30
164
164
 
165
- # Adjudicate an eval's grounding finding against the KB: did the bot's counts match reality?
166
- # Deterministic - attributes a failure to a layer (retrieval vs the model), never scores answer quality.
165
+ # Validate an EXTERNAL eval's output against the KB COMPASS already has access to. Not an eval,
166
+ # not a tracer: the eval (an LLM judge, or the bot's captured trace) claims "grounded",
167
+ # "cited MIS p.1", "28%" - COMPASS deterministically checks those claims against ground truth
168
+ # in the KB and attributes any failure to a layer (retrieval vs the model), never scoring answer
169
+ # quality. Verifies each CITED claim at its cited location: a fabricated number, a wrong page, a
170
+ # fact present in the KB but not retrieved, or a source not in the KB. Uses the eval's retrieved
171
+ # chunks when present (Level 1) and the live KB (Level 2); the answer text + a reachable KB alone
172
+ # still catches fabricated figures and phantom citations.
167
173
  compass grounding-audit --project my-kb --eval-result case.json --fail-on-fabrication
168
174
  ```
169
175
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: compass-kb-validation
3
- Version: 2.6.0
3
+ Version: 2.7.0
4
4
  Summary: Knowledge-base readiness validation for RAG & AI agents — config-driven, deterministic pipeline integrity checks.
5
5
  Author: COMPASS
6
6
  License: MIT
@@ -229,8 +229,14 @@ compass ask --project my-kb --batch questions.jsonl --format eval --output eval_
229
229
  compass quality --project my-kb
230
230
  compass freshness --project my-kb --stale-after 30
231
231
 
232
- # Adjudicate an eval's grounding finding against the KB: did the bot's counts match reality?
233
- # Deterministic - attributes a failure to a layer (retrieval vs the model), never scores answer quality.
232
+ # Validate an EXTERNAL eval's output against the KB COMPASS already has access to. Not an eval,
233
+ # not a tracer: the eval (an LLM judge, or the bot's captured trace) claims "grounded",
234
+ # "cited MIS p.1", "28%" - COMPASS deterministically checks those claims against ground truth
235
+ # in the KB and attributes any failure to a layer (retrieval vs the model), never scoring answer
236
+ # quality. Verifies each CITED claim at its cited location: a fabricated number, a wrong page, a
237
+ # fact present in the KB but not retrieved, or a source not in the KB. Uses the eval's retrieved
238
+ # chunks when present (Level 1) and the live KB (Level 2); the answer text + a reachable KB alone
239
+ # still catches fabricated figures and phantom citations.
234
240
  compass grounding-audit --project my-kb --eval-result case.json --fail-on-fabrication
235
241
  ```
236
242
 
@@ -15,6 +15,7 @@ ingestion_validation/__main__.py
15
15
  ingestion_validation/ask.py
16
16
  ingestion_validation/baseline.py
17
17
  ingestion_validation/chunk_coherence.py
18
+ ingestion_validation/citation.py
18
19
  ingestion_validation/cli.py
19
20
  ingestion_validation/config_lint.py
20
21
  ingestion_validation/content_inspect.py
@@ -67,6 +68,7 @@ tests/test_ask.py
67
68
  tests/test_baseline.py
68
69
  tests/test_benchmark.py
69
70
  tests/test_check_catalog.py
71
+ tests/test_citation.py
70
72
  tests/test_cli.py
71
73
  tests/test_config.py
72
74
  tests/test_config_lint.py
@@ -101,6 +103,7 @@ tests/test_remediation.py
101
103
  tests/test_reporting.py
102
104
  tests/test_retrieval_assertions.py
103
105
  tests/test_retrieval_quality.py
106
+ tests/test_review_hardening.py
104
107
  tests/test_run_cli.py
105
108
  tests/test_sources.py
106
109
  tests/test_storage_validator.py
@@ -138,14 +138,14 @@ def _resolve_skip_steps(settings, *, include_graphdb: bool, include_retrieval: b
138
138
  (BUG-22). ``--keep s3_storage`` overrides the auto-skip.
139
139
  """
140
140
  skip = ["API Upload"]
141
- # Graph validation runs by default when a graph block is actually configured (a
142
- # sparql_query or an endpoint) - a configured neptune:/graphdb: block should not be
143
- # silently ignored just because --include-graphdb was not passed. Opt out with
144
- # --skip neptune_metadata (or graphdb_metadata). --include-graphdb still forces it on.
141
+ # Graph validation runs by default when THIS PROJECT declares a per-document graph
142
+ # query (sparql_query) - the signal that graph validation is actually intended. It must
143
+ # NOT key off `neptune.endpoint`, which resolves from a shared NEPTUNE_ENDPOINT env var:
144
+ # doing so turned graph on for every project whenever that env var was set, so a project
145
+ # with no graph block inherited another project's Neptune and failed all 19 graph checks
146
+ # (regression). Opt out with --skip neptune_metadata; --include-graphdb still forces on.
145
147
  nep, gdb = settings.neptune, settings.graphdb
146
- graph_configured = bool(
147
- getattr(nep, "sparql_query", "") or getattr(nep, "endpoint", "")
148
- or getattr(gdb, "sparql_query", "") or getattr(gdb, "base_url", ""))
148
+ graph_configured = bool(getattr(nep, "sparql_query", "") or getattr(gdb, "sparql_query", ""))
149
149
  if not (include_graphdb or graph_configured):
150
150
  skip += ["GraphDB Metadata", "Neptune Metadata"]
151
151
  if not include_retrieval:
@@ -479,7 +479,11 @@ def main(argv=None) -> int:
479
479
  print(f" Run ID: {run_id}")
480
480
  print("=" * 60)
481
481
 
482
- documents = discover_documents(settings, folder_filter=args.folder, limit=args.limit)
482
+ try:
483
+ documents = discover_documents(settings, folder_filter=args.folder, limit=args.limit)
484
+ except Exception as exc: # noqa: BLE001 - an unreachable/misconfigured source must not traceback
485
+ print(f"\n Could not discover documents (is the storage/index reachable and configured?): {exc}")
486
+ return EXIT_CONFIG
483
487
  print(f"\n Found {len(documents)} document(s)\n")
484
488
  # Corpus-level minimum-document gate (s3.min_documents). A no-arg --limit run that
485
489
  # finds fewer than expected is a real problem worth failing on.
@@ -5,4 +5,4 @@ end-to-end: API upload -> object storage -> knowledge graph -> vector store ->
5
5
  retrieval quality, plus cross-store consistency.
6
6
  """
7
7
 
8
- __version__ = "2.6.0"
8
+ __version__ = "2.7.0"