Agent-consumable scry. Every feature here exists so a machine, not a
person, can consume a scry verdict: an MCP server, a query surface, a
versioned feed schema, a capability manifest as data, and citable obligation
anchors. The one precision fix (br_if on a bare value) is here because it is
what LLVM emits for the loops agents actually ask about.
Added
scry-sai-mcp— an MCP server exposing scry to agents directly (FEAT-066).
Agents cannot runcargo; consuming scry meant shelling out or scraping a
5.7 MB JSON. Tools:analyze(module → summary + counts) andquery
(FEAT-067 filters). Structured results, never HTML. This is a NEW crate and
its first publish — v3.2.7's tree contained nocrates/scry-mcp.- Query filters over
AnalysisResult(FEAT-067). Ask instead of scrape:
"every site where kind=Top and op in (call_indirect, memory.grow)". The
bounded slice of the FEAT-056 queryable-CPG idea — filtering and projection
over the existing result, no new graph substrate. guidance.jsonas a versioned contract (FEAT-068). The v3.2.2 feed
shipped un-versioned; it now carries an explicitschemafield, per-class
counts, and the module hash binding the feed to one exact module.- A machine-readable capability manifest (FEAT-071). The dashboard stated
scry's scope in prose — what is mechanized vs γ-sweep-validated, and what
scry does NOT prove. An agent deciding whether to trust a verdict needs that
as data. Rendered from the same constants as the page, so the two cannot
drift. - Obligation anchors and the delta view (FEAT-072). Every obligation in the
rendered page carriesid="ob-<obligation_id>"and a copyable deep link, so
a verdict can be cited rather than described. - Self-adjudication harness (FEAT-073). scry adjudicates scry across N
consecutive commits of its own history, in observation mode. Purpose is
evidence, not gating — and it earned its keep immediately by finding the
identity churn recorded below.
Improved
- Guard refinement for
br_ifon a bare value (FEAT-070). Refinement
already handledlocal.get X; i32.const c; <cmp>; br_ifandi32.eqz, but
notlocal.tee $x; br_if— a branch on raw truthiness (implicit≠ 0),
which is what LLVM emits for count-to-zero loops and therefore common in real
bounds-check code.
What this release does NOT give you
Stated here rather than left to be discovered:
- Obligation identity is NOT yet stable across builds. FEAT-073's first run
measured 43–45% of function identities churning per build (#123):
func_identinherits Rust's17h<hex>symbol disambiguator, so an unrelated
edit destroys every obligation in the affected function. The anchors and the
feed schema ship; the guarantee behind them does not. FEAT-064 and REQ-020
moved to v3.4.0 for exactly this reason (#195) — cross-build citation is not
yet reliable, and a consumer should treat anobligation_idas stable
within a build only. - The MCP
verifytool is structurally absent. FEAT-065 adjudication was
refuted pre-ship with six wrong-verdict paths (#122); exposing it would ship a
verdict not worth acting on. Tracked as FEAT-094, gated on REQ-021.
Falsification
This release is wrong if any of the following holds:
- A module that analysed successfully under 3.2.7 now returns an error, or a
different verdict set, fromanalyze. - An
obligation_idcited from the dashboard does not resolve to the same site
when the same module is re-analysed by the same build. - The MCP server returns a summary whose counts disagree with the
AnalysisResultthe same build produces for the same module. guidance.jsonvalidates against its declaredschemaversion while
carrying a field that version does not define.
Limitation of (1), stated because it is the weakest of the four: the
before/after comparison is not corpus-wide. A consumer with a module set —
#126's reporter has offered theirs — would falsify it properly.