v0.17.0 — Rust & Go native parsers, Java full CST, Python full AST
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.
implmethods/assoc consts),use/moddep graph with module-path + same-workspaceCargo.tomlresolution, axum router provides (builder chains,.nest/.mergecross-file composition),reqwestliteral egress consumes. - Go — Full CST (native, tree-sitter-go 0.25): symbols,
go.mod-resolved dep graph with package-directory-wide edges, gin +net/httprouter provides (route groups, Go 1.22"METHOD /path"mux patterns),net/httpegress 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-fileextends-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,APIRouterprefix,include_routercomposition),requests/httpxegress consumes. Python-2-only syntax degrades to the lexical fallback.
Behavior changes to expect
- One-time full cache rebuild.
CACHE_SCHEMA_VERSIONv21 → 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 withpacksDir: 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), embeddedzzop://contract/*resources 7 → 9, and azzop-mcp contract [<name>]CLI on-ramp that prints any contract without an MCP client. Prebuiltzzop-mcpbinaries 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):validateRulePackOnlyadded (seven exported functions).
Internal
- Guard fleet 12 → 16 CI scripts, including a SIGPIPE seal after a real CI red:
printf big-blob | grep -qunderpipefailinverted 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).