Skip to content

v0.14.0 — deployment topology & field-driven precision

Choose a tag to compare

@github-actions github-actions released this 14 Jul 14:03

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:

"trees": [
  { "root": "../web-fe", "sourceId": "web" },
  { "root": "../api-be", "sourceId": "api",
    "mountedAt": "/api",                              // whole-tree gateway mount
    "mounts": [{ "dir": "apps/settle", "at": "/settle" }], // monorepo fragmentation
    "hosts": ["api.foo.com"] }                         // absolute-URL calls join this tree
]
  • mountedAt / mounts: prepend a gateway prefix to a tree's (or a
    sub-directory's) HTTP provide keys — longest matching dir wins per file,
    stacking on top of prefixes zzop extracts from code (e.g. Nest
    setGlobalPrefix). Applies to Mode A envelope trees too.
  • hosts: consumes like https://api.foo.com/users from another tree stop
    being external egress and join this tree's routes as /users. New
    conditional output field crossLayer.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-consume aggregates 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 produces path-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-adapter reproduces 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
    in raw) 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.