1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
[]
= "synth-cli"
= true
= true
= true
= true
= true
= true
= true
= true
= "CLI for Synth, the WebAssembly-to-ARM Cortex-M AOT compiler"
[[]]
= "synth"
= "src/main.rs"
# VCR-PERF-002 Phase 2 (#494): the fact-spec end-to-end gate needs the synth
# binary built WITH the ordeal-backed solver (feature `verify`), so it is a
# dedicated test target the fact-spec CI job runs via
# `cargo test -p synth-cli --features verify --test fact_spec_clamp_494`.
# Plain `cargo test --workspace` skips it (required-features unmet); the pass
# itself is unit-tested unconditionally in synth-verify.
[[]]
= "fact_spec_clamp_494"
= ["verify"]
# #494 phase 2b (divisor-nonzero): same contract — the guard-elision byte
# gates need the solver-carrying binary; the fact-spec CI job runs it via
# `cargo test -p synth-cli --features verify --test fact_spec_div_494`.
[[]]
= "fact_spec_div_494"
= ["verify"]
# #494 bounds-elision (#390 guard_bool): same contract — the memory
# bounds-guard byte gates need the solver-carrying binary; the fact-spec CI
# job runs it via
# `cargo test -p synth-cli --features verify --test fact_spec_bounds_494`.
[[]]
= "fact_spec_bounds_494"
= ["verify"]
# #935 non-vacuity gate: `synth verify` must report APPLIED-AND-DECLINED rules
# (with machine reasons + Rocq join keys), so a consumer can compute a coverage
# denominator. Needs the solver-carrying binary; the fact-spec CI job runs it
# via `cargo test -p synth-cli --features verify --test verify_report_935`.
[[]]
= "verify_report_935"
= ["verify"]
[]
= ["riscv"]
= ["synth-backend-awsm"]
= ["synth-backend-wasker"]
= ["synth-backend-riscv"]
= ["synth-verify"]
# #275 non-vacuity probe (NEVER default): builds an `EXPORTS_ONLY_275` env hatch
# that reverts compile_all_exports to the pre-#235 exports-only drop, so the
# reachable-callgraph EXECUTION differential can prove it catches the historical
# #275 drop (the RED direction). #1168: the hatch covers the .wast merge path
# too, so the wast_callgraph_closure_1168 differential can prove the
# generalized not-placed refusal stands when the closure is bypassed.
# Excluded from every release/default build — the release binary physically
# cannot carry a "regress to a fixed defect" switch.
= []
# Uncomment when loom crate is available:
# loom = ["dep:loom-opt"]
[]
# Path deps carry `version` so `cargo publish` rewrites them to the
# crates.io coordinate. Bumping the workspace version requires
# updating these in lockstep — see docs/release-process.md.
= { = "../synth-core", = "0.65.0" }
= { = "../synth-frontend", = "0.65.0" }
= { = "../synth-synthesis", = "0.65.0" }
= { = "../synth-backend", = "0.65.0" }
# AArch64 host-native backend (#538) — small pure-Rust crate, always on.
= { = "../synth-backend-aarch64", = "0.65.0" }
# Optional external backends
= { = "../synth-backend-awsm", = "0.65.0", = true }
= { = "../synth-backend-wasker", = "0.65.0", = true }
= { = "../synth-backend-riscv", = "0.65.0", = true }
# Optional translation validation — pure-Rust ordeal engine by default (#553),
# no C++ toolchain needed. For the Z3 differential oracle build with
# `--features verify,synth-verify/z3-solver` (+ SYNTH_SOLVER_DIFF=1 at runtime).
= { = "../synth-verify", = "0.65.0", = true, = ["arm"] }
# Optional PulseEngine WASM optimizer
# Uncomment when loom crate is available:
# loom-opt = { workspace = true, optional = true }
= true
= true
= true
= true
= true
= true
= true
= true
[]
= true
# VCR-DBG-001 Tier-1 (#394) — oracle E parses the INPUT wasm's `.debug_*` custom
# sections independently (mirroring the production reader) to derive, at runtime,
# the real source basenames its `.debug_line` rows reference — so the emitted
# file-table check is robust vs hardcoding. Test-only; matches synth-core's pin.
# Bazel globs src/ only, so no MODULE.bazel pin is needed for a dev-dependency.
= true
# VCR-ORACLE-001 (#242) — the frozen-codegen byte gate hashes each fixture's
# `.text` to lock it against accidental drift (e.g. a dependabot parser bump
# shifting lowering). Already in the lock tree; test-only ⇒ no production pull,
# no MODULE.bazel pin (Bazel globs src/ only).
= "0.11"
# VCR-DBG-001 step 4 (#394) — oracle B parses the EMITTED `.debug_line` back with
# gimli::read to prove the section is real debugger-readable DWARF (addresses in
# `.text` range, lines non-zero). Test-only; the production read+emit lives in
# synth-core. Matches synth-core's gimli pin.
= { = "0.34", = false, = ["read", "std"] }
# VCR-MEM-001 (#383) layer-2 substrate: scry's sound shadow-stack-depth analysis,
# verified in-tree against a real module. DEV-dependency only — the production
# binary does not pull scry until the gated consumption step (the .bss shrink /
# prologue elision) lands. Test-only ⇒ Bazel (which globs src/ only) never sees
# it, so no MODULE.bazel pin is needed yet. See scry#51.
# Tracks scry 2.x (SCPV v3): the major bump reshaped the provenance wire format,
# but synth's consumed surface (call_graph / function_summaries / stack_usage /
# reachable_from_exports / operand_stack) is unchanged and additive-only, so the
# bump is transparent here. See scry#63 / scry v2.0.0. Empirically re-verified
# against scry v2.3.0, v2.5.0 (2026-06-27), then v2.6.0 (2026-06-30, lockfile
# bumped) — scry_shadow_stack_budget stays GREEN, so the "transparent" claim is
# tested, not just asserted. v2.4.0 (FEAT-038) models memory.size/grow; v2.5.0
# (FEAT-039) makes reachable_from_exports sound in the open world (escaped
# funcref) — the superset synth's shadow-stack pruning relies on; pinned by
# scry_reachable_superset_is_open_world_sound_383_feat039. v2.6.0 adds the
# machine-readable `gaps` field (FEAT-040) + hardens the shadow-stack bound by the
# resolved call_indirect target set (FEAT-043); consumed surface unchanged
# (msgq_put Bytes(32) bound unchanged), now re-verified with a gap-observability
# assertion (value-domain gaps ⇒ the finite bound is sound).
= "3.0"