v0.14.0 — deployment topology & field-driven precision
v0.14.0 — deployment topology & field-driven precision
zzop now lets you declare the one class of cross-repo join information that
lives in no repo's code: deployment topology. Plus field-driven precision
fixes that cut real-corpus noise, and the oazapfts recognizer moves out of
the engine into a reference adapter.
New: connection topology config (mountedAt / mounts / hosts)
Per-tree keys in zzop.config.jsonc declaring deployment facts:
mountedAt/mounts: prepend a gateway prefix to a tree's (or a
sub-directory's) HTTP provide keys — longest matchingdirwins per file,
stacking on top of prefixes zzop extracts from code (e.g. Nest
setGlobalPrefix). Applies to Mode A envelope trees too.hosts: consumes likehttps://api.foo.com/usersfrom another tree stop
being external egress and join this tree's routes as/users. New
conditional output fieldcrossLayer.hostRekeyCounts(omitted when no
hosts are declared) reports per-host effect.- Honesty built in: a mount or host with zero effect warns (stale config
self-discloses); path-shape errors fail config loading; values are literal
paths, not rewrite patterns.
Behavior changes to expect
unprovided-consumeaggregates partial-provider noise: in a tree that
provides only part of its own key space (e.g. a monorepo where one app's
routes are visible), unmatched consumes whose first path segment lies
outside the provided space now fold into ONE info finding (at 3+),
enumerating every key (data.callCount/data.routes). Consumes that
overlap the provided space keep today's individual findings (the typo
signal). Field result: 9 findings → 1 on a real monorepo.- Near-miss rules gate zero-information keys: a consume key whose
segments are all{}placeholders (e.g.`${base}/${x}`keying as
GET /{}) no longer producespath-near-miss/route-near-miss
suggestions — an all-slot key "resembles" every same-length route, so the
suggestion carried no information. Declared catch-all routes remain
legitimate suggestion targets. Field result: 4 duplicate suggestions → 0. - oazapfts recognition moved out of the engine (generated SDKs =
injection adapters): the native recognizer (fetchJson/fetchText/fetchBlob,
oazapfts.<helper>()method unwrap, trailing${QS...}drop) is removed;
examples/oazapfts-adapterreproduces it as a Mode B overlay adapter.
An oazapfts import with no visible consumes is now disclosed by
sdk-import-no-visible-consume("inject an adapter"). A trailing
${QS...}interpolation now keys as an ordinary{}placeholder. - PARSER_FINGERPRINT bump (
+oazapfts-removed-v1): first run after
upgrading re-extracts TypeScript files (cache recompute); cache schema
itself is unchanged (v20). - Re-keyed host consumes carry their join key (original spelling preserved
inraw) in the cross-layer buckets.
Docs
Public docs now lead with what zzop is: deterministic cross-repo contract
analysis you can gate CI on — same code in, same findings out. Rule packs
are documented as the supporting engine. Rule catalog rows updated for the
behavior changes above; AnalyzeRequest docs gained the topology fields.