Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/compass-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ jobs:
sh -n scripts/package_release.sh
sh -n scripts/test_release_scripts.sh
bash -n scripts/qualify_code_graph_v1.sh
python scripts/check_universal_evidence_promotion.py
python -m unittest scripts.tests.test_universal_evidence_promotion
sh scripts/test_release_scripts.sh
bash -n completions/compass.bash
python -c "import ast,pathlib; ast.parse(pathlib.Path('scripts/measure_process.py').read_text())"
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/compass-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ jobs:
versions="$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[] | select(.name != "compass-tree-sitter-language-pack") | .version' | sort -u)"
test "$(printf '%s\n' "$versions" | wc -l | tr -d ' ')" = "1"
test "$GITHUB_REF_NAME" = "compass-v$versions"
- name: Validate universal evidence promotion decision
run: python3 scripts/check_universal_evidence_promotion.py

code-graph-qualification:
needs: metadata
Expand Down
25 changes: 16 additions & 9 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

## Unreleased

- Reset all 14 registered universal-evidence producer versions to v1 and keep
them `Qualified` under the refreshed release decision at
`tests/qualification/universal-evidence-promotion.json`. Cached evidence
from prior producer identities is regenerated, while unsupported dynamic or
compiler-only behavior remains unresolved.

## 0.3.23 - 2026-08-28

- Make bounded JSON and SQLite adjacency queries retain the same canonical
Expand All @@ -24,8 +30,8 @@
evidence publisher and replace the Rails source detector with the
evidence-backed `rails-ruby` universal pack. Reopened constants coalesce by
exact graph identity, instance/singleton method spaces stay distinct,
dynamic dispatch/load/eval forms fail closed, and Ruby remains explicitly
`Qualifying` pending the independent precision/recall audit.
dynamic dispatch/load/eval forms fail closed, and Ruby is `Qualified` for
the bounded capabilities covered by the release promotion decision.

- Preserve anonymous PHP functions and arrow functions as typed callable
`closure` nodes, and publish exact PHP trait composition as `mixes_in`
Expand Down Expand Up @@ -54,10 +60,11 @@
records, and amortize bounded snapshot garbage collection. Exact preflights
fall back to full publication whenever topology or secondary indexes change.

- Hard-cut Kotlin onto a version-1 qualifying universal pipeline with packages,
declarations, extension functions, annotations, generic/nullable types, and
named/default argument resolution; convert Spring Kotlin to the universal
framework pack and require exact compiler evidence for Java/Kotlin calls.
- Hard-cut Kotlin onto a version-1 `Qualified` universal pipeline with
packages, declarations, extension functions, annotations, generic/nullable
types, and named/default argument resolution; convert Spring Kotlin to the
universal framework pack and require exact compiler evidence for
Java/Kotlin calls.

- Allow `compass review` on `0.3.x` to rebuild comparable realizations from
any repository profile or preferred realization whose persisted user-option
Expand Down Expand Up @@ -135,9 +142,9 @@
`--model`, `COMPASS_BACKEND`, and `COMPASS_MODEL`, while keeping credentials
out of Compass configuration and artifacts.

- Move Swift, Dart, Scala, and Groovy/Gradle onto qualifying universal
evidence pipelines and complete their independent precision/recall and
fixture performance qualification providers.
- Promote Swift, Dart, Scala, and Groovy/Gradle version-1 evidence pipelines to
`Qualified` after their independent precision/recall and fixture-performance
qualification providers completed.

- Turn the VS Code codebase query view into a multi-command Ask, Explain, and
CompassQL workbench, add direct symbol-based caller/callee graphs, and keep
Expand Down
25 changes: 16 additions & 9 deletions COMPATIBILITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ registration calls do not publish `registers`: the current pack contract
would require the unrelated bean-container capability, so readers must not
infer those edges from missing output.

Python structural evidence now uses producer version 13. The evidence schema
Python structural evidence now uses producer version 1. The evidence schema
is unchanged, but previously empty universal callable/type fields can contain
source-proven parameter shapes, literal call types, `type_of`, `returns`, and
call-result bindings. Starred call arguments suppress exact arity; `Any`,
Expand Down Expand Up @@ -198,14 +198,21 @@ identity rules, not new wire fields. Generic metadata values are not copied
into graph labels; strict readers need no schema migration.

Swift, Dart, Scala, and Groovy/Gradle now publish through their version-1
universal evidence pipelines. The four pipelines are intentionally
`Qualifying`: they use one bounded, source-grounded publication route and may
change unresolved/ambiguous edges compared with older direct extraction. Normal
cache fingerprints invalidate affected files; users do not need to delete
artifacts manually. Equal names across Swift/native or JVM-family languages do
not by themselves create cross-language targets.

Python publishes through version-13 `compass.python` evidence and uses static,
universal evidence pipelines. The four pipelines are `Qualified` under the
checked-in universal-evidence promotion decision: they use one bounded,
source-grounded publication route and may change unresolved/ambiguous edges
compared with older direct extraction. Normal cache fingerprints invalidate
affected files; users do not need to delete artifacts manually. Equal names
across Swift/native or JVM-family languages do not by themselves create
cross-language targets.

The same decision records all 14 hard-cut universal pipelines as `Qualified`,
including C#, Go, Java, JavaScript, Kotlin, PHP, Python, Ruby, Rust, and
TypeScript. The status is scoped to each producer's advertised bounded
capabilities and evidence schema/version; changing either requires a fresh
promotion decision and cache regeneration.

Python publishes through version-1 `compass.python` evidence and uses static,
bounded `pyproject.toml` import-root evidence. The corresponding internal
project-evidence identity is `compass.framework-project-evidence/4`. A uniquely
proven `src/` or configured package layout may therefore change qualified names
Expand Down
20 changes: 13 additions & 7 deletions MIGRATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,16 @@ semantics.
The current release publishes Ruby through the version-1 universal evidence
pipeline (`compass.ruby`) and the evidence-backed `rails-ruby` framework pack.
Ruby graph output is therefore regenerated on the first build after upgrading;
do not reuse a Ruby cache produced by an older Compass publisher. Ruby is still
`Qualifying` rather than a complete-quality claim, so retain review of
ambiguous/dynamic Ruby relationships and do not treat unresolved dynamic
dispatch as a missing deterministic fact.
do not reuse a Ruby cache produced by an older Compass publisher. Ruby is
`Qualified` for the bounded producer capabilities recorded in the release
decision; retain review of ambiguous/dynamic Ruby relationships and do not
treat unresolved dynamic dispatch as a missing deterministic fact.

All 14 registered universal evidence pipelines are now marked `Qualified`.
The release decision at `tests/qualification/universal-evidence-promotion.json`
binds each producer ID, language, version, and dialect alias to that state.
Changing a producer version or advertised capability requires a new decision;
existing cached evidence is regenerated when its pipeline identity changes.

## Universal evidence schema reset

Expand All @@ -116,19 +122,19 @@ artifact editing is required.

## Python project identity and stubs

Python now publishes version-13 `compass.python` evidence. Static
Python now publishes version-1 `compass.python` evidence. Static
`pyproject.toml` import roots can remove repository-layout prefixes such as
`src.` from qualified names, and top-level Python graph IDs are derived from
the proven module identity instead of the checkout path. `.pyi` files now use
the Python pipeline: a matching `.py` file remains the declaration owner,
stub-only declarations carry `source_kind: "stub"`, and mismatches publish a
`python_stub_source_conflict` diagnostic without merging guessed facts.
Version 13 also fills existing universal parameter, call-shape, `type_of`,
The current producer also fills existing universal parameter, call-shape, `type_of`,
`returns`, and call-result fields for the bounded static subset. Dynamic,
starred, shadowed, `Any`, and conflicting-return cases remain unresolved.

Run a fresh or forced build after upgrading. Project evidence schema
`compass.framework-project-evidence/4` and Python producer version 13 invalidate
`compass.framework-project-evidence/4` and Python producer version 1 invalidate
the affected cache entries automatically. Published historical realizations
remain immutable; rebuild a historical revision explicitly if it must use the
new identities.
Expand Down
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,11 @@ test-release-scripts: ## Test packaging and download installer scripts
qualify-code-graph-v1: ## Run the complete Compass code graph v1 fixture release gate
./scripts/qualify_code_graph_v1.sh --fixtures-only


.PHONY: qualify-universal-evidence
qualify-universal-evidence: ## Verify the universal-evidence promotion decision
python3 scripts/check_universal_evidence_promotion.py

# ── Lint & Format ──────────────────────────────────────────────────

.PHONY: fmt
Expand Down
10 changes: 5 additions & 5 deletions advisor-plans/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ independent Ripper oracle and qualification-only producer, adds conservative
Ruby project/resolution semantics, converts Rails to a universal framework
pack, performs one atomic hard cut, and then measures optimization and complete
quality gates. The pinned three-corpus audit now passes (89,981 accepted
relationships, 100% observed precision, 98.5567% recall); Ruby remains
`Qualifying` until a separate promotion decision.
relationships, 100% observed precision, 98.5567% recall); the checked-in
universal-evidence release decision promotes Ruby version 1 to `Qualified`.

Plan 020 is the Swift, Dart, Scala, and Groovy universal-evidence program. It
was planned at Compass commit `88abe4c0` on 2026-08-21. All four languages are
Expand All @@ -54,9 +54,9 @@ can proceed independently after the shared baseline; Groovy reuses Scala's
exact-language JVM boundary.
The production hard cut, deterministic fixture baselines, pinned manifests,
parser-backed source-oracle providers, audit builder, mixed fixture gate, and
three-corpus quality audits are implemented. The plan is `DONE`; all four
registry entries intentionally remain version-1 `Qualifying` until a separate
promotion decision. The mounted qualification target records the pinned
three-corpus quality audits are implemented. The plan is `DONE`; the
universal-evidence release decision promotes all four registry entries as
version-1 `Qualified`. The mounted qualification target records the pinned
SwiftSyntax, Dart Analyzer, scala.meta, and Groovy CompilationUnit toolchains
and the immutable audit results.

Expand Down
43 changes: 22 additions & 21 deletions crates/compass-languages/src/evidence_pipeline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ use crate::LanguageCapability;
pub enum UniversalEvidenceQualification {
/// The shared evidence route is production-active while its audit runs.
Qualifying,
/// The shared evidence route passed the complete audit gates.
/// The release decision accepted the complete gates for the producer's
/// advertised, bounded capability surface.
Qualified,
}

Expand Down Expand Up @@ -385,7 +386,7 @@ const DART_EVIDENCE_PIPELINE: UniversalEvidencePipeline = UniversalEvidencePipel
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: DART_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
};

const GROOVY_EVIDENCE_PIPELINE: UniversalEvidencePipeline = UniversalEvidencePipeline {
Expand All @@ -396,7 +397,7 @@ const GROOVY_EVIDENCE_PIPELINE: UniversalEvidencePipeline = UniversalEvidencePip
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: GROOVY_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
};

const SCALA_EVIDENCE_PIPELINE: UniversalEvidencePipeline = UniversalEvidencePipeline {
Expand All @@ -407,7 +408,7 @@ const SCALA_EVIDENCE_PIPELINE: UniversalEvidencePipeline = UniversalEvidencePipe
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: SCALA_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
};

const SWIFT_EVIDENCE_PIPELINE: UniversalEvidencePipeline = UniversalEvidencePipeline {
Expand All @@ -418,7 +419,7 @@ const SWIFT_EVIDENCE_PIPELINE: UniversalEvidencePipeline = UniversalEvidencePipe
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: SWIFT_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
};

pub(crate) const RUBY_EVIDENCE_PIPELINE: UniversalEvidencePipeline = UniversalEvidencePipeline {
Expand All @@ -429,7 +430,7 @@ pub(crate) const RUBY_EVIDENCE_PIPELINE: UniversalEvidencePipeline = UniversalEv
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: RUBY_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
};

const UNIVERSAL_EVIDENCE_PIPELINES: &[UniversalEvidencePipeline] = &[
Expand All @@ -441,39 +442,39 @@ const UNIVERSAL_EVIDENCE_PIPELINES: &[UniversalEvidencePipeline] = &[
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: CSHARP_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
},
DART_EVIDENCE_PIPELINE,
UniversalEvidencePipeline {
producer: UniversalEvidenceProducer {
id: "compass.go",
language: "go",
version: 3,
version: 1,
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: GO_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
},
GROOVY_EVIDENCE_PIPELINE,
UniversalEvidencePipeline {
producer: UniversalEvidenceProducer {
id: "compass.java",
language: "java",
version: 3,
version: 1,
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: JAVA_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
},
UniversalEvidencePipeline {
producer: UniversalEvidenceProducer {
id: "compass.javascript",
language: "javascript",
version: 5,
version: 1,
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: JAVASCRIPT_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
},
UniversalEvidencePipeline {
producer: UniversalEvidenceProducer {
Expand All @@ -483,7 +484,7 @@ const UNIVERSAL_EVIDENCE_PIPELINES: &[UniversalEvidencePipeline] = &[
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: KOTLIN_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
},
UniversalEvidencePipeline {
producer: UniversalEvidenceProducer {
Expand All @@ -493,39 +494,39 @@ const UNIVERSAL_EVIDENCE_PIPELINES: &[UniversalEvidencePipeline] = &[
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: PHP_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
},
UniversalEvidencePipeline {
producer: UniversalEvidenceProducer {
id: "compass.python",
language: "python",
version: 13,
version: 1,
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: PYTHON_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
},
RUBY_EVIDENCE_PIPELINE,
UniversalEvidencePipeline {
producer: UniversalEvidenceProducer {
id: "compass.rust",
language: "rust",
version: 15,
version: 1,
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: RUST_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
},
SCALA_EVIDENCE_PIPELINE,
SWIFT_EVIDENCE_PIPELINE,
UniversalEvidencePipeline {
producer: UniversalEvidenceProducer {
id: "compass.typescript",
language: "typescript",
version: 5,
version: 1,
evidence_schema: crate::UNIVERSAL_EVIDENCE_SCHEMA,
capabilities: TYPESCRIPT_CAPABILITIES,
},
qualification: UniversalEvidenceQualification::Qualifying,
qualification: UniversalEvidenceQualification::Qualified,
},
];
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public partial class UsersController : ControllerBase, IWorker
assert_eq!(evidence.pipeline.version, 1);
assert_eq!(
evidence.pipeline.qualification,
UniversalEvidenceQualification::Qualifying
UniversalEvidenceQualification::Qualified
);
for capability in [
LanguageCapability::Namespaces,
Expand Down Expand Up @@ -218,11 +218,11 @@ fn csharp_evidence_identity_is_independent_of_checkout_root() -> Result<(), Box<
}

#[test]
fn csharp_pipeline_is_registered_as_qualifying() -> Result<(), Box<dyn Error>> {
fn csharp_pipeline_is_registered_as_qualified() -> Result<(), Box<dyn Error>> {
let pipeline = UniversalEvidenceRegistry::pipeline("csharp").ok_or("missing C# pipeline")?;
assert_eq!(
pipeline.qualification,
UniversalEvidenceQualification::Qualifying
UniversalEvidenceQualification::Qualified
);
Ok(())
}
4 changes: 2 additions & 2 deletions crates/compass-languages/tests/java_universal_conformance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,10 @@ enum Status {

let evidence = extraction.graph.semantic_evidence.expect("Java evidence");
validate_evidence(&evidence, EvidenceLimits::default()).expect("valid Java evidence");
assert_eq!(evidence.pipeline.version, 3);
assert_eq!(evidence.pipeline.version, 1);
assert_eq!(
evidence.pipeline.qualification,
UniversalEvidenceQualification::Qualifying
UniversalEvidenceQualification::Qualified
);
assert!(
evidence
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ fn kotlin_emits_modern_universal_evidence_with_exact_anchors()
assert_eq!(evidence.pipeline.version, 1);
assert_eq!(
evidence.pipeline.qualification,
UniversalEvidenceQualification::Qualifying
UniversalEvidenceQualification::Qualified
);
for (kind, qualified) in [
("annotation_type", "demo.api.Audit"),
Expand Down
Loading
Loading