Skip to content

v0.17.0 — Rust & Go native parsers, Java full CST, Python full AST

Choose a tag to compare

@github-actions github-actions released this 16 Jul 21:24

Three new full-precision native parsers in one release: Rust and Go join as new languages, Java is promoted from lexical to full CST, and Python's full-AST tier (ruff-based) ships. The MCP host grows to 5 tools / 9 embedded contract resources, and the engine now tells you exactly what it could not parse — and how to close the gap with a minimal adapter.

New languages / tiers

The canonical per-language table is docs/ARCHITECTURE.md → Language support.

  • Rust — Full AST (native, syn 2): symbols (incl. impl methods/assoc consts), use/mod dep graph with module-path + same-workspace Cargo.toml resolution, axum router provides (builder chains, .nest/.merge cross-file composition), reqwest literal egress consumes.
  • Go — Full CST (native, tree-sitter-go 0.25): symbols, go.mod-resolved dep graph with package-directory-wide edges, gin + net/http router provides (route groups, Go 1.22 "METHOD /path" mux patterns), net/http egress consumes (incl. fmt.Sprintf-reassembled paths). An ERROR CST region is never guessed past.
  • Java — lexical → Full CST (native, tree-sitter-java 0.23.5, Java 21 grammar): nested-type symbols with body spans, plain/glob/static import resolution via an in-tree (package, type) index, Spring MVC provides with cross-file extends-chain + constant-prefix resolution. Real-corpus delta: dep-graph edges 0 → 342 on the Spring RealWorld backend.
  • Python — Full AST (native, ruff parser crates — no Python runtime needed): def/class/method symbols with __all__-aware exports, relative-import dep graph, FastAPI provides (decorators, APIRouter prefix, include_router composition), requests/httpx egress consumes. Python-2-only syntax degrades to the lexical fallback.

Behavior changes to expect

  • One-time full cache rebuild. CACHE_SCHEMA_VERSION v21 → v25 (shared projected types grew for the new parsers) — the first run after upgrading re-analyzes everything once. Parser fingerprints also bumped: TypeScript gains +express-middleware-v1; the python3/rust/go/java21 fingerprints are new.
  • Envelope trees now load the bundled DSL packs by default (previously zero packs unless configured). The reply discloses packsLoaded; opt out with packsDir: null. All 112 bundled rules are line/method-scan, so structural findings are unchanged — envelope trees may simply gain text-level findings they were silently missing.
  • Un-parsed files are disclosed, not silent: per-extension "no native parser" diagnostics (58 known non-source extensions exempt), overlay source-mismatch / synthetic-entry / zero-fact census, and coverage-gap warnings that chain into building a minimal partial Mode-B adapter envelope — a tens-of-lines script (a 91-line Java example ships in examples/).

New surface

  • MCP host (zzop-mcp): tools 3 → 5 (analyze_repo, cross_repo, check_endpoint, validate_envelope, validate_rule_pack), embedded zzop://contract/* resources 7 → 9, and a zzop-mcp contract [<name>] CLI on-ramp that prints any contract without an MCP client. Prebuilt zzop-mcp binaries for 5 platforms are attached to this release (first release shipping them).
  • CLI: zzop endpoint <method> <path> — is this endpoint linked/provided/consumed? 8 explicit verdicts; honors --config, --json. zzop pack validate <file> — lint a DSL rule pack's structure before loading it.
  • SDK (@zzop/native): validateRulePackOnly added (seven exported functions).

Internal

  • Guard fleet 12 → 16 CI scripts, including a SIGPIPE seal after a real CI red: printf big-blob | grep -q under pipefail inverted a genuine match once the input passed the pipe buffer — all sites converted to herestrings, and the pattern is now machine-banned.
  • 300-line ratchet baseline burned down to 0 grandfathered files.
  • Release gated by the 3-lens audit (policy values / message honesty / boundary pins) + live-corpus smoke: Angular × Spring cross-layer edges hold at 19, zero tripwire false-fires, 3280 workspace tests green.

No breaking API changes. analyze/analyzeTrees request/response shapes are unchanged; new output is additive (warnings, packsLoaded, new endpoints/tools).