@vessel-dsp/compiler 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +118 -2
  2. package/dist/bake.d.ts +38 -0
  3. package/dist/bake.d.ts.map +1 -0
  4. package/dist/bake.js +101 -0
  5. package/dist/bake.js.map +1 -0
  6. package/dist/bbd-clock.d.ts +171 -0
  7. package/dist/bbd-clock.d.ts.map +1 -0
  8. package/dist/bbd-clock.js +1750 -0
  9. package/dist/bbd-clock.js.map +1 -0
  10. package/dist/block-row.d.ts +51 -0
  11. package/dist/block-row.d.ts.map +1 -0
  12. package/dist/block-row.js +17 -0
  13. package/dist/block-row.js.map +1 -0
  14. package/dist/bypass.d.ts +3 -0
  15. package/dist/bypass.d.ts.map +1 -0
  16. package/dist/bypass.js +228 -0
  17. package/dist/bypass.js.map +1 -0
  18. package/dist/compile.d.ts +24 -0
  19. package/dist/compile.d.ts.map +1 -0
  20. package/dist/compile.js +348 -0
  21. package/dist/compile.js.map +1 -0
  22. package/dist/converter-scale.d.ts +14 -0
  23. package/dist/converter-scale.d.ts.map +1 -0
  24. package/dist/converter-scale.js +133 -0
  25. package/dist/converter-scale.js.map +1 -0
  26. package/dist/couple.d.ts +28 -0
  27. package/dist/couple.d.ts.map +1 -0
  28. package/dist/couple.js +567 -0
  29. package/dist/couple.js.map +1 -0
  30. package/dist/dangling-active-terminal.d.ts +47 -0
  31. package/dist/dangling-active-terminal.d.ts.map +1 -0
  32. package/dist/dangling-active-terminal.js +542 -0
  33. package/dist/dangling-active-terminal.js.map +1 -0
  34. package/dist/declared-program.d.ts +23 -0
  35. package/dist/declared-program.d.ts.map +1 -0
  36. package/dist/declared-program.js +387 -0
  37. package/dist/declared-program.js.map +1 -0
  38. package/dist/denomination.d.ts +48 -0
  39. package/dist/denomination.d.ts.map +1 -0
  40. package/dist/denomination.js +27 -0
  41. package/dist/denomination.js.map +1 -0
  42. package/dist/device-laws.d.ts +237 -0
  43. package/dist/device-laws.d.ts.map +1 -0
  44. package/dist/device-laws.js +3513 -0
  45. package/dist/device-laws.js.map +1 -0
  46. package/dist/diagnostics.d.ts +13 -0
  47. package/dist/diagnostics.d.ts.map +1 -0
  48. package/dist/diagnostics.js +19 -0
  49. package/dist/diagnostics.js.map +1 -0
  50. package/dist/emit.d.ts +8 -0
  51. package/dist/emit.d.ts.map +1 -0
  52. package/dist/emit.js +43 -0
  53. package/dist/emit.js.map +1 -0
  54. package/dist/errors.d.ts +22 -0
  55. package/dist/errors.d.ts.map +1 -0
  56. package/dist/errors.js +39 -0
  57. package/dist/errors.js.map +1 -0
  58. package/dist/firmware-class.d.ts +69 -0
  59. package/dist/firmware-class.d.ts.map +1 -0
  60. package/dist/firmware-class.js +20 -0
  61. package/dist/firmware-class.js.map +1 -0
  62. package/dist/fixtures/circuits.d.ts +1742 -0
  63. package/dist/fixtures/circuits.d.ts.map +1 -0
  64. package/dist/fixtures/circuits.js +13896 -0
  65. package/dist/fixtures/circuits.js.map +1 -0
  66. package/dist/fixtures/expected.d.ts +261 -0
  67. package/dist/fixtures/expected.d.ts.map +1 -0
  68. package/dist/fixtures/expected.js +315 -0
  69. package/dist/fixtures/expected.js.map +1 -0
  70. package/dist/fixtures/index.d.ts +4 -0
  71. package/dist/fixtures/index.d.ts.map +1 -0
  72. package/dist/fixtures/index.js +8 -0
  73. package/dist/fixtures/index.js.map +1 -0
  74. package/dist/fixtures/registry.d.ts +52 -0
  75. package/dist/fixtures/registry.d.ts.map +1 -0
  76. package/dist/fixtures/registry.js +341 -0
  77. package/dist/fixtures/registry.js.map +1 -0
  78. package/dist/generic-tube-fit.d.ts +12 -0
  79. package/dist/generic-tube-fit.d.ts.map +1 -0
  80. package/dist/generic-tube-fit.js +45 -0
  81. package/dist/generic-tube-fit.js.map +1 -0
  82. package/dist/grounded-clock-supply.d.ts +13 -0
  83. package/dist/grounded-clock-supply.d.ts.map +1 -0
  84. package/dist/grounded-clock-supply.js +45 -0
  85. package/dist/grounded-clock-supply.js.map +1 -0
  86. package/dist/identify.d.ts +50 -0
  87. package/dist/identify.d.ts.map +1 -0
  88. package/dist/identify.js +319 -0
  89. package/dist/identify.js.map +1 -0
  90. package/dist/index.d.ts +10 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +19 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/inert-controls.d.ts +15 -0
  95. package/dist/inert-controls.d.ts.map +1 -0
  96. package/dist/inert-controls.js +266 -0
  97. package/dist/inert-controls.js.map +1 -0
  98. package/dist/latch-seed.d.ts +53 -0
  99. package/dist/latch-seed.d.ts.map +1 -0
  100. package/dist/latch-seed.js +257 -0
  101. package/dist/latch-seed.js.map +1 -0
  102. package/dist/link.d.ts +7 -0
  103. package/dist/link.d.ts.map +1 -0
  104. package/dist/link.js +270 -0
  105. package/dist/link.js.map +1 -0
  106. package/dist/lower.d.ts +79 -0
  107. package/dist/lower.d.ts.map +1 -0
  108. package/dist/lower.js +1855 -0
  109. package/dist/lower.js.map +1 -0
  110. package/dist/netlist.d.ts +79 -0
  111. package/dist/netlist.d.ts.map +1 -0
  112. package/dist/netlist.js +4746 -0
  113. package/dist/netlist.js.map +1 -0
  114. package/dist/non-executable-clock-drivers.d.ts +8 -0
  115. package/dist/non-executable-clock-drivers.d.ts.map +1 -0
  116. package/dist/non-executable-clock-drivers.js +33 -0
  117. package/dist/non-executable-clock-drivers.js.map +1 -0
  118. package/dist/open-category.d.ts +98 -0
  119. package/dist/open-category.d.ts.map +1 -0
  120. package/dist/open-category.js +111 -0
  121. package/dist/open-category.js.map +1 -0
  122. package/dist/over-driven-node.d.ts +33 -0
  123. package/dist/over-driven-node.d.ts.map +1 -0
  124. package/dist/over-driven-node.js +188 -0
  125. package/dist/over-driven-node.js.map +1 -0
  126. package/dist/part-catalog.d.ts +15 -0
  127. package/dist/part-catalog.d.ts.map +1 -0
  128. package/dist/part-catalog.js +6712 -0
  129. package/dist/part-catalog.js.map +1 -0
  130. package/dist/part-number.d.ts +32 -0
  131. package/dist/part-number.d.ts.map +1 -0
  132. package/dist/part-number.js +80 -0
  133. package/dist/part-number.js.map +1 -0
  134. package/dist/partition.d.ts +7 -0
  135. package/dist/partition.d.ts.map +1 -0
  136. package/dist/partition.js +242 -0
  137. package/dist/partition.js.map +1 -0
  138. package/dist/port-full-scale.d.ts +70 -0
  139. package/dist/port-full-scale.d.ts.map +1 -0
  140. package/dist/port-full-scale.js +235 -0
  141. package/dist/port-full-scale.js.map +1 -0
  142. package/dist/pot-orientation.d.ts +114 -0
  143. package/dist/pot-orientation.d.ts.map +1 -0
  144. package/dist/pot-orientation.js +551 -0
  145. package/dist/pot-orientation.js.map +1 -0
  146. package/dist/power-domain-control.d.ts +40 -0
  147. package/dist/power-domain-control.d.ts.map +1 -0
  148. package/dist/power-domain-control.js +142 -0
  149. package/dist/power-domain-control.js.map +1 -0
  150. package/dist/proxy-declaration.d.ts +121 -0
  151. package/dist/proxy-declaration.d.ts.map +1 -0
  152. package/dist/proxy-declaration.js +50 -0
  153. package/dist/proxy-declaration.js.map +1 -0
  154. package/dist/registry.d.ts +323 -0
  155. package/dist/registry.d.ts.map +1 -0
  156. package/dist/registry.js +192 -0
  157. package/dist/registry.js.map +1 -0
  158. package/dist/sparse-schedule.d.ts +65 -0
  159. package/dist/sparse-schedule.d.ts.map +1 -0
  160. package/dist/sparse-schedule.js +421 -0
  161. package/dist/sparse-schedule.js.map +1 -0
  162. package/dist/speaker-load.d.ts +38 -0
  163. package/dist/speaker-load.d.ts.map +1 -0
  164. package/dist/speaker-load.js +97 -0
  165. package/dist/speaker-load.js.map +1 -0
  166. package/dist/stage-coverage.d.ts +21 -0
  167. package/dist/stage-coverage.d.ts.map +1 -0
  168. package/dist/stage-coverage.js +124 -0
  169. package/dist/stage-coverage.js.map +1 -0
  170. package/dist/stamp-partition.d.ts +314 -0
  171. package/dist/stamp-partition.d.ts.map +1 -0
  172. package/dist/stamp-partition.js +472 -0
  173. package/dist/stamp-partition.js.map +1 -0
  174. package/dist/supply-reference.d.ts +19 -0
  175. package/dist/supply-reference.d.ts.map +1 -0
  176. package/dist/supply-reference.js +66 -0
  177. package/dist/supply-reference.js.map +1 -0
  178. package/dist/supply-short.d.ts +32 -0
  179. package/dist/supply-short.d.ts.map +1 -0
  180. package/dist/supply-short.js +118 -0
  181. package/dist/supply-short.js.map +1 -0
  182. package/dist/supply-stamps.d.ts +51 -0
  183. package/dist/supply-stamps.d.ts.map +1 -0
  184. package/dist/supply-stamps.js +363 -0
  185. package/dist/supply-stamps.js.map +1 -0
  186. package/dist/terminal-role.d.ts +109 -0
  187. package/dist/terminal-role.d.ts.map +1 -0
  188. package/dist/terminal-role.js +46 -0
  189. package/dist/terminal-role.js.map +1 -0
  190. package/dist/terminal-roles.d.ts +59 -0
  191. package/dist/terminal-roles.d.ts.map +1 -0
  192. package/dist/terminal-roles.js +92 -0
  193. package/dist/terminal-roles.js.map +1 -0
  194. package/dist/transformer.d.ts +181 -0
  195. package/dist/transformer.d.ts.map +1 -0
  196. package/dist/transformer.js +476 -0
  197. package/dist/transformer.js.map +1 -0
  198. package/dist/types.d.ts +3157 -0
  199. package/dist/types.d.ts.map +1 -0
  200. package/dist/types.js +11 -0
  201. package/dist/types.js.map +1 -0
  202. package/dist/unbounded-operating-point.d.ts +35 -0
  203. package/dist/unbounded-operating-point.d.ts.map +1 -0
  204. package/dist/unbounded-operating-point.js +181 -0
  205. package/dist/unbounded-operating-point.js.map +1 -0
  206. package/dist/unexecuted-region.d.ts +3 -0
  207. package/dist/unexecuted-region.d.ts.map +1 -0
  208. package/dist/unexecuted-region.js +122 -0
  209. package/dist/unexecuted-region.js.map +1 -0
  210. package/dist/unimplemented-control-role.d.ts +3 -0
  211. package/dist/unimplemented-control-role.d.ts.map +1 -0
  212. package/dist/unimplemented-control-role.js +61 -0
  213. package/dist/unimplemented-control-role.js.map +1 -0
  214. package/dist/unreachable-output.d.ts +3 -0
  215. package/dist/unreachable-output.d.ts.map +1 -0
  216. package/dist/unreachable-output.js +97 -0
  217. package/dist/unreachable-output.js.map +1 -0
  218. package/dist/unreadable-terminal-role.d.ts +67 -0
  219. package/dist/unreadable-terminal-role.d.ts.map +1 -0
  220. package/dist/unreadable-terminal-role.js +409 -0
  221. package/dist/unreadable-terminal-role.js.map +1 -0
  222. package/dist/unverified-pinout.d.ts +27 -0
  223. package/dist/unverified-pinout.d.ts.map +1 -0
  224. package/dist/unverified-pinout.js +121 -0
  225. package/dist/unverified-pinout.js.map +1 -0
  226. package/package.json +75 -5
@@ -0,0 +1,1742 @@
1
+ /**
2
+ * Derive one fixture from another, refusing a replacement that matched nothing.
3
+ *
4
+ * A bare `.replace` whose target has drifted returns the original string, so the
5
+ * derived fixture silently becomes a copy of its parent and its test passes while
6
+ * asserting nothing about the variation it was written for.
7
+ */
8
+ export declare const derive: (source: string, from: string, to: string) => string;
9
+ /**
10
+ * Two 10k resistors from input to ground, output at the midpoint. Forces nodes,
11
+ * device laws, a linear solve, and the end-to-end slice. Expected gain is exactly 0.5.
12
+ */
13
+ export declare const resistorDivider: string;
14
+ /**
15
+ * The same divider with one inline terminal node contradicting the declared ledger.
16
+ *
17
+ * `R1.b` is authored inline on node 9 while `nodes:` places it on node 2 with `R2.a` and
18
+ * the output jack. Stage 1 should follow the ledger and still warn that the document is
19
+ * inconsistent with itself.
20
+ */
21
+ export declare const ledgerOverridesInlineDivider: string;
22
+ /**
23
+ * A divider with a **0 ohm link** in series ahead of it: the schematic-capture convention for
24
+ * an ideal wire, drawn as a resistor because the board really does have a jumper there.
25
+ *
26
+ * The behaviour existed and was untested, which is the gap this closes. `device-laws.ts` stamps
27
+ * a declared zero as `SWITCH_ON_OHMS` -- the same electrically-indistinguishable-from-ideal
28
+ * short a closed switch gets -- because `1/0` is not a representable conductance. Untested
29
+ * behaviour is how the CD4047 pin binding silently regressed: a fact verified and never turned
30
+ * into an assertion.
31
+ *
32
+ * The assertion is behavioural rather than structural: the link is in series with the signal, so
33
+ * a divider with it must measure the same gain as `resistorDivider` without it. A link stamped
34
+ * as anything but a near-short would show up as a divider ratio, and one stamped as an open
35
+ * would take the gain to zero.
36
+ *
37
+ * `mxr-noise-gate-line-driver`'s `R_U1B_FB` is the corpus instance -- `Resistance: { raw: "0
38
+ * Ohm", value: 0, unit: "Ω" }`, and the only resistor of 3090 in the corpus declaring exactly
39
+ * zero.
40
+ */
41
+ export declare const zeroOhmLinkDivider: string;
42
+ /**
43
+ * A resistor that declares no resistance at all, and is not marked unpopulated.
44
+ *
45
+ * **The control that keeps the 0 ohm link honest.** A stated zero and an absent value look
46
+ * similar in a diff and mean opposite things: one is a jumper the board really has, the other is
47
+ * a value nobody recorded. Reading the second as the first would silently short a circuit --
48
+ * exactly the wrong-answer-that-still-renders this pipeline refuses.
49
+ *
50
+ * So this must refuse, and it must keep refusing. `mxr-carbon-copy`'s `R4` is the corpus
51
+ * instance: `SourceValue: visible-no-value-or-DNP`, `SourceConfidence: medium`,
52
+ * `SourceStatus: defer` -- the source itself declines to say. The refusal is the correct
53
+ * consumer behaviour there, not a gap.
54
+ */
55
+ export declare const resistorWithNoResistance: string;
56
+ /**
57
+ * A `DNP` position that *does* declare its value: R2 keeps its 10k and is marked unpopulated.
58
+ *
59
+ * The corroborated shape, and the counterpart to `notPopulatedResistor`'s load-bearing one. The
60
+ * document says "this is a 10k position, unfitted": the part still leaves the solve, but nothing
61
+ * is concealed by its leaving — a reader can see what would sit there and check it against a
62
+ * board. Distinguishing the two is the whole of `report-source-integrity`'s DNP handling, so both
63
+ * need a fixture or the distinction is asserted only in prose.
64
+ */
65
+ export declare const notPopulatedResistorWithValue: string;
66
+ /**
67
+ * A resistor declaring a **negative** resistance.
68
+ *
69
+ * The other side of the zero boundary, and the control that says where the line is: zero is a
70
+ * jumper the board really has, and below zero is not a resistor at all. `device-laws.ts` refuses
71
+ * it (`!(ohms > 0)` after the zero case is taken), and that refusal is the reason a declared zero
72
+ * can be admitted safely -- the pipeline is not simply accepting whatever number appears.
73
+ *
74
+ * No corpus packet declares one; all 3090 corpus resistors are positive or zero. That is why it
75
+ * is a fixture: a boundary defended only where the corpus happens to push is not defended.
76
+ */
77
+ export declare const resistorWithNegativeResistance: string;
78
+ /**
79
+ * The same value-less resistor, marked `DNP: 'true'`.
80
+ *
81
+ * An unpopulated position is an open circuit -- a stated fact about the board, not a missing
82
+ * value -- so this compiles with the component dropped, where the fixture above refuses. The
83
+ * pair is the whole point: the same absent value is a refusal or a legitimate open depending on
84
+ * one typed flag, and nothing else distinguishes them.
85
+ *
86
+ * `mxr-carbon-copy` carries four of these (`R45`, `R50`, `C32`, `C34`) and is the only corpus
87
+ * packet that does.
88
+ */
89
+ export declare const notPopulatedResistor: string;
90
+ /**
91
+ * A divider plus an `InterfaceOnly` open resistor that declares no resistance. Without the
92
+ * interface/source-only read this fixture refuses -- a resistor with no `Resistance` throws in
93
+ * the parameter stage. The flag is the source's way of saying "panel-LED shell, no driver
94
+ * specified, do not model it", and the correct answer is to drop it (with a warning), not to
95
+ * refuse the whole circuit over a value the source deliberately omits. `SourceOnly` is the
96
+ * twin: the negative control derives it by flipping the flag, and it must behave identically.
97
+ */
98
+ export declare const interfaceOnlyPlaceholder: string;
99
+ export declare const sourceOnlyPlaceholder: string;
100
+ /**
101
+ * 10k into 10n to ground, output across the capacitor. Forces state, the integration
102
+ * method, and a corner frequency that can be checked by hand.
103
+ */
104
+ export declare const rcLowPass: string;
105
+ /** A pot as a divider. Forces control binding, 0..1 positions, and emitted taper. */
106
+ export declare const potDivider: string;
107
+ /**
108
+ * `potDivider` plus the enclosures that are not controls: jacks and a status
109
+ * LED, each declared on the panel and bound to its component exactly the way
110
+ * `boss-od-1` declares `INPUT_JACK`, `OUTPUT_JACK` and `CHECK_LED`. The
111
+ * non-knob kinds must be dropped from `Program.controls` while the knob
112
+ * (`Level`) survives and all three devices stay in the netlist.
113
+ */
114
+ export declare const panelKnobAndHardwareControls: string;
115
+ /**
116
+ * A switch whose both terminals resolve to one node (`boss-od-1`'s
117
+ * `INPUT_BATTERY_CONTACT` shape) next to an ordinary unbound two-terminal
118
+ * switch on distinct nodes. The fixed contact manufactures no control; the
119
+ * real switch keeps its invented one (`switchInSignalPath` pins that second
120
+ * behaviour), so the negative control proves this gate can fail for the
121
+ * claimed reason.
122
+ */
123
+ export declare const fixedContactSwitchCircuit: string;
124
+ /**
125
+ * A **rheostat** wired so the two orientation rules disagree.
126
+ *
127
+ * `end1` sits on ground and the wiper shares node 2 with `end2`, so the live leg is
128
+ * `end1`-to-wiper. Quiet-distance sees the grounded end as the quiet one and swaps the ends,
129
+ * putting the live leg on `lower`; declaration order leaves it on `upper`. The two rules give
130
+ * different answers here, which is what makes this fixture worth having.
131
+ *
132
+ * The control declares a time-constant role, so `potTerminals` steps aside from quiet-distance:
133
+ * its premise -- a rising knob should be louder -- says nothing about a pot setting an RC, and
134
+ * on `boss-nf-1-noise-gate`'s `DECAY` it picked the side that ran the knob backwards.
135
+ */
136
+ export declare const rheostatWithTimeConstantRole: string;
137
+ /**
138
+ * The same shape and the same disagreement, with a level role instead. The exemption must NOT
139
+ * fire here: letting declaration order win for every rheostat was measured across the corpus and
140
+ * inverts four knobs that are right today, `boss-fa-1`'s `VOLUME` among them.
141
+ */
142
+ export declare const rheostatWithLevelRole: string;
143
+ /**
144
+ * The same pot with its wiper hanging off node 3, which nothing else touches, and its
145
+ * track carrying the signal from input to output instead.
146
+ *
147
+ * Electrically a fixed 10k in series: the two halves stay in series through a floating
148
+ * junction, so their sum is the whole track wherever the knob sits and the control
149
+ * cannot move a node voltage. It still compiles and still renders -- which is the
150
+ * defect, since `ibanez-ts808` shipped exactly this and rendered bit-identical output
151
+ * at `Drive=0.1` and `Drive=0.9`.
152
+ */
153
+ export declare const potWithFloatingWiper: string;
154
+ /** Anti-parallel diodes to ground after a series resistor. Forces Newton. */
155
+ export declare const diodeClipper: string;
156
+ /** Anti-parallel LEDs to ground after a series resistor. Moves clipping knee higher. */
157
+ export declare const ledClipper: string;
158
+ /**
159
+ * The clipper's upper diode carrying a catalogued zener part number and nothing else, so
160
+ * the diode law comes from the catalog's `zenerLaw` entry (1N4733A: 5.1 V knee, class
161
+ * forward defaults) rather than from the source.
162
+ */
163
+ export declare const zenerCatalogDiode: string;
164
+ /**
165
+ * The LED clipper's upper LED carrying a catalogued zener part number: the device the source
166
+ * declares as an LED must stay one under a catalog match, not come back a plain diode.
167
+ */
168
+ export declare const zenerLedKeepsLed: string;
169
+ /**
170
+ * The same zener part with the source's own forward parameters and knee typed, so every
171
+ * declared value must survive the catalog match and only absence is filled.
172
+ */
173
+ export declare const zenerDeclaredParameters: string;
174
+ /**
175
+ * Inverting amplifier: 10k in, 100k feedback, non-inverting leg at ground. Forces the
176
+ * auxiliary-constraint row, which is the same mechanism an ideal transformer needs.
177
+ * Gain is -R_f/R_in = -10 exactly, so the magnitude is a hand-checkable 10.
178
+ */
179
+ export declare const invertingAmplifier: string;
180
+ /**
181
+ * The same amplifier with the feedback **resistor replaced by a capacitor**: an integrator
182
+ * with no DC feedback path.
183
+ *
184
+ * Nothing pins the inverting node's operating point -- at DC the capacitor is an open
185
+ * circuit, so the output cannot influence its own input -- and any standing differential
186
+ * integrates. `ibanez-pql` ships this shape on its signal path and diverges to `8.55e+12 V`
187
+ * from a 9 V supply. Kept minimal deliberately: swapping one element is what separates a
188
+ * bounded stage from an unbounded one, and the fixture should show exactly that.
189
+ */
190
+ export declare const opampCapacitiveFeedbackOnly: string;
191
+ /**
192
+ * The same inverting amplifier with a 9 V supply present. Gain is still -10, but the
193
+ * output cannot leave the 0..9 V rails, so a hot input clips instead of producing
194
+ * a voltage the pedal could not make.
195
+ */
196
+ export declare const railedAmplifier: string;
197
+ /**
198
+ * An op-amp Schmitt-trigger astable: the railed amplifier with its non-inverting input moved onto
199
+ * a 10k/10k divider from its own output (positive feedback, hysteresis at half the swing) and its
200
+ * inverting input on a 100k / 100n timing network. It oscillates rail to rail.
201
+ *
202
+ * The case the op-amp step limiter's halving cap was not built for. At every edge the branch the
203
+ * Newton iterate starts on ceases to exist, the Jacobian points back at it, and the cap pins at its
204
+ * floor in a two-cycle; the runtime must reseed the comparator on its other rail rather than burn
205
+ * the iteration cap. Measured before the reseed: 11 of 9600 samples held at a 1024-iteration peak.
206
+ */
207
+ export declare const schmittTriggerAstable: string;
208
+ /**
209
+ * An op-amp powered from a rail of its own, spelled the way this corpus actually spells it.
210
+ *
211
+ * The circuit's supply set is +9 / -9, but this op-amp's `vPlus` sits on a separate +4 V node
212
+ * and its `vMinus` on ground, so the rails it should clip at are 4 and 0 -- neither of them a
213
+ * circuit extreme. While the rail lookup read only the exact spellings `vcc`/`vee`, this
214
+ * op-amp was given 9 and -9: a clipping ceiling more than twice its real one, on a part whose
215
+ * whole audible contribution in a drive pedal is where it clips.
216
+ *
217
+ * `boss-bd-2-blues-driver` is the corpus instance and it is not a corner case -- it declares
218
+ * three supply ports (9 V, 8 V, 4 V) and both its op-amps' `vPlus` is on the 8 V one, while
219
+ * the compiler handed them the 9 V inlet rail.
220
+ */
221
+ export declare const opampOnItsOwnRail: string;
222
+ /**
223
+ * The same op-amp with both supply pins on the one node.
224
+ *
225
+ * A degenerate pair -- `railHigh == railLow` -- which is not a narrow clipping window but a
226
+ * contradiction: the linear region has negative width and the output pins wherever the
227
+ * limiter lands. Reading a document's own supply pins can produce it, so `opampRails`
228
+ * requires an ordered pair and keeps the circuit set when it does not get one.
229
+ *
230
+ * Measured rather than hypothetical: `mxr-m117r-flanger`'s `U4` declares `pin8_vplus` and
231
+ * `pin4_vminus` and **both resolve to the same node** -- ground, carrying a declared +15 V,
232
+ * because that packet puts its `V15` rail component on the ground node. Eight op-amp stamps
233
+ * came out at `high = low = 15` before the invariant existed.
234
+ */
235
+ export declare const opampWithDegenerateRails: string;
236
+ /**
237
+ * An op-amp that names no inputs at all: `vPlus`, `vMinus`, `output`, in that order.
238
+ *
239
+ * The reason the supply vocabulary is split in two rather than being one list.
240
+ * `vplus`/`vminus` is how every corpus op-amp that declares supplies spells them -- but it is
241
+ * also the natural spelling for a bare differential pair, and `opampTerminals` falls back to
242
+ * declaration order when it cannot resolve a named input pair, so here those two terminals
243
+ * are wired as **the inputs**. Reading them as rails as well would clamp this op-amp to its
244
+ * own input voltages. The rails must come from the circuit set, +9 / -9.
245
+ *
246
+ * This is the invariant the guard protects -- a terminal cannot be both a signal input and a
247
+ * rail -- and it is a control no corpus census could have supplied, because the corpus
248
+ * happens to contain no such part. A vocabulary justified only by what the corpus does today
249
+ * is a vocabulary that breaks on the next document.
250
+ */
251
+ export declare const opampWithUnnamedInputs: string;
252
+ /**
253
+ * A divider whose lower leg can be shorted by a switch. Open, the output is the
254
+ * divider's half; closed, the lower leg is shorted and the output collapses. Forces
255
+ * topology that changes with a control, without a second netlist.
256
+ */
257
+ export declare const switchedDivider: string;
258
+ /**
259
+ * The same switch, but stating its contact state the way nine corpus switches do -- a
260
+ * `State` rather than a `Position` or a `Wipe`. Derived from `switchedDivider` by adding
261
+ * exactly one property, so a difference between the two can only be that property.
262
+ */
263
+ export declare const switchedDividerStatingClosed: string;
264
+ /** The amp corpus's spelling of the same fact: `SelectedState` rather than `State`. */
265
+ export declare const switchedDividerStatingSelectedState: string;
266
+ /**
267
+ * `SelectedState` carrying something that is not a contact state at all, which the corpus also
268
+ * does (`16 ohms`, `90w full-power silicon path`). It must be ignored rather than refused: unlike
269
+ * `State`, this field is not only about contacts.
270
+ */
271
+ export declare const switchedDividerStatingUnrelatedSelectedState: string;
272
+ /** A fuse, which conducts unless a source says it has blown. */
273
+ export declare const switchedDividerWithFuseRating: string;
274
+ /** The same again with a contact state no closed vocabulary contains. */
275
+ export declare const switchedDividerStatingUnknownContact: string;
276
+ /**
277
+ * The same unpositioned switch, wired the other way round: in series between the input
278
+ * port and the divider rather than shunting the midpoint to ground, so the only path
279
+ * from input to output runs through it. `switchedDivider`'s switch has a path around
280
+ * it; this one is the path. Both senses appear in the corpus under identical terminal
281
+ * naming, which is why the default cannot be a constant.
282
+ */
283
+ export declare const switchInSignalPath: string;
284
+ /**
285
+ * A JFET whose **drain sits below its source**, so `vds` is negative and only a symmetric channel
286
+ * conducts. The gate is at the input, the source is pulled up through 10k and the drain pulled
287
+ * down through 10k.
288
+ *
289
+ * A channel conducts both ways -- which is why a JFET works as an analogue switch -- and the
290
+ * runtime treated reverse as cutoff until 2026-08-12. With the old law the two resistors were
291
+ * independent and the operating point sat at 9 V and 0 V; symmetric, it solves to 7.42 V and
292
+ * 1.58 V, matching ngspice to 0.08%. `boss-hm-2` has three signal-path FETs spending most samples
293
+ * here.
294
+ */
295
+ export declare const jfetReverseBiased: string;
296
+ /**
297
+ * A JFET whose gate, source and drain each sit on their own 1M/1M divider off 9 V,
298
+ * so every terminal idles at 4.5 V and the channel (Vds = 0) carries nothing. The only
299
+ * current in the circuit is the gate's own: each junction draws
300
+ * `gateSaturationCurrent * softplus((0 - 0.5) / 0.06)` ~ 2.4 nA, and the two together
301
+ * sag the 0.5M-thevenin gate divider ~2.4 mV while lifting the source/drain dividers
302
+ * ~1.2 mV each. A voltmeter on the gate therefore reads the gate law directly.
303
+ *
304
+ * Unregistered, so this is the class default under test, not any part. The registered
305
+ * twin below (`jfetGateLoadedDivider2SK30A`) is the same copper with a part number,
306
+ * and the pair pins the per-part refinement: same dividers, no sag.
307
+ */
308
+ export declare const jfetGateLoadedDivider: string;
309
+ /**
310
+ * The same copper as `jfetGateLoadedDivider` with the 2SK30A part number, so the
311
+ * catalog's per-part gate data applies instead of the class default: the gate draws
312
+ * ~1e-18 A and every divider sits at its unloaded 4.5 V. The two fixtures render the
313
+ * same circuit with different gate laws, which is what makes their pair a regression
314
+ * test for the refinement rather than two readings of one law.
315
+ */
316
+ export declare const jfetGateLoadedDivider2SK30A: string;
317
+ /**
318
+ * A supply with a protection diode wired the wrong way round: anode on the 9 V rail, cathode on
319
+ * ground, so the whole supply forward biases it.
320
+ *
321
+ * `ibanez-ts808` and `ibanez-ts9` both ship this, each carrying **1.074 A** through it while
322
+ * rendering a plausible level, because the runtime clamps the junction voltage instead of
323
+ * diverging. Reversing the two terminal roles turns this fixture into the correct arrangement,
324
+ * which is what the paired test checks.
325
+ */
326
+ export declare const diodeShortingSupply: string;
327
+ /** The same supply with the protection diode the right way round: cathode to the rail. */
328
+ export declare const diodeProtectingSupply: string;
329
+ /**
330
+ * A 9.1 V zener shunt regulator feeding a light load, supply below breakdown.
331
+ * 9 V through 470 ohm into 10k//1M: the rail must sag to ~8.59 V. Below
332
+ * breakdown a zener passes leakage only, so any rail at or above the 9 V
333
+ * supply is a current the diode law invented, not the circuit.
334
+ */
335
+ export declare const zenerRegulatedRail: string;
336
+ /**
337
+ * `zenerRegulatedRail` fed from 12 V, so the zener conducts and regulates. About 5.3 mA
338
+ * reaches it, just past the 5 mA at which a declared breakdown voltage is read, so the rail
339
+ * must sit within a few millivolts of 9.1 V. This pins the knee, not only the leakage.
340
+ */
341
+ export declare const zenerRegulatingRail: string;
342
+ /**
343
+ * The 5F1's V1A triode stage, built to match `whole-amp-5f1` exactly so its operating point is
344
+ * a validated oracle rather than a snapshot: 68k grid stopper from the input, 1M grid leak,
345
+ * 1.5k cathode to ground, 100k plate load to a 250 V rail.
346
+ *
347
+ * That experiment solves `Vk 1.251`, `Vp 166.6`, `Ip 0.83 mA`, and those three are consistent
348
+ * by hand (`1.251/1500 = 0.834 mA`; `250 - 0.834e-3 * 100e3 = 166.6`), so the fixture is
349
+ * checkable without trusting the experiment's solver.
350
+ */
351
+ export declare const triodeGainStage: string;
352
+ /**
353
+ * Emitter follower on a 9 V rail: 10k/10k base bias, 4k7 emitter, signal coupled in
354
+ * through 1u. Forces Ebers-Moll, junction limiting, a DC operating point, and a
355
+ * voltage source. Voltage gain is Re/(Re + re) with re = Vt/Ie, so just under unity.
356
+ */
357
+ export declare const emitterFollower: string;
358
+ /**
359
+ * A standard NPN common-emitter amplifier stage with 4-resistor bias.
360
+ *
361
+ * 9 V rail, RB1=100k, RB2=22k base divider, RC=4.7k collector load, RE=1k emitter resistor,
362
+ * 10u input/output coupling caps into a 1M load.
363
+ *
364
+ * Expected small-signal AC gain is -(RC || RLOAD) / (RE + re) ~ -4.53 V/V.
365
+ */
366
+ export declare const commonEmitterAmplifier: string;
367
+ export declare const commonEmitterAmplifierHalvedRe: string;
368
+ /**
369
+ * A DC-driven transformer secondary carrying a declared-voltage port, for the milestone that a
370
+ * transformer winding may borrow generated status from another winding of the same transformer.
371
+ *
372
+ * `VBATT` (10 V, DC) drives the primary; the secondary is fixed by the ideal transformer's own
373
+ * constraint at exactly `10 / 2 = 5 V`, independent of `RLOAD`, which only sets the current. The
374
+ * declared `BPLUS_PORT` states `6 V` -- a plausible chart value, deliberately not the true `5 V`
375
+ * -- so a promoted ideal rail and the real transformer answer are distinguishable by more than
376
+ * rounding, the same shape `tubeDiodeIntoLoadWithDeclaredPort` uses for the rectifier case.
377
+ *
378
+ * DC rather than AC on purpose, matching `tubeDiodeIntoLoad`'s own reasoning: it isolates the
379
+ * transformer-coupling question from the AC source and its own RMS-to-peak conversion, so a
380
+ * failure here is the coupling rule and nothing else.
381
+ */
382
+ export declare const transformerSecondaryWithDeclaredPort: string;
383
+ /** Ideal 1:2 step-up into a 10k load. Forces the four-terminal constraint row. */
384
+ export declare const stepUpTransformer: string;
385
+ /** Ideal 2:1 step-down transformer: turns ratio 2.0, so gain is 0.5. */
386
+ export declare const stepDownTransformer: string;
387
+ /** JFET source follower on a 9 V rail, gate at 0 V through 1M, 2k2 source. */
388
+ export declare const jfetFollower: string;
389
+ /**
390
+ * MOSFET source follower. Enhancement mode is off at zero gate bias, so unlike the
391
+ * JFET the gate is biased from the rail by a divider rather than referenced to
392
+ * ground. The divider is 10k/10k rather than 1M/1M for a reason worth recording: an
393
+ * uncharged coupling capacitor starts as a near-short, so the gate is dragged to 0 V
394
+ * and charges with tau = C * (R1 || R2). At 1M that is 0.5 s, far longer than any
395
+ * test window. The JFET fixture escapes this only because its bias point is 0 V, so
396
+ * it needs no settling at all. Same law as the JFET, opposite threshold sign.
397
+ */
398
+ export declare const mosfetFollower: string;
399
+ /** 1 H into 10k to ground, output across the resistor: an RL low pass at R/(2*pi*L). */
400
+ export declare const rlLowPass: string;
401
+ /** An IC with no registry entry. Forces the unsupported outcome. */
402
+ export declare const unknownChip: string;
403
+ /**
404
+ * An 8-pin chip a registry supplies as **two** sections, the shape a dual op-amp takes.
405
+ *
406
+ * Bare `pin1`..`pin8` names on purpose: a section indexes terminals positionally, so this proves
407
+ * the expansion does not depend on role tokens -- which is the whole reason sections exist, since an
408
+ * 8-pin dual op-amp has two outputs and no role token can name either unambiguously.
409
+ */
410
+ export declare const dualSectionChip: string;
411
+ /** The same IC, with a part number a fixture registry can supply a macro model for. */
412
+ export declare const knownChip: string;
413
+ /**
414
+ * The same IC again, with a part number a registry supplies a *lumped law* for.
415
+ *
416
+ * Three documents, one device, three answers -- and the document is identical apart from
417
+ * the part number: unsupported with no model, a macro region with one, an ordinary
418
+ * two-terminal element with another. That is the injected registry doing its job:
419
+ * opacity is a property of what the registry knows, never of the device.
420
+ */
421
+ export declare const resistiveChip: string;
422
+ /**
423
+ * The pinout rung, positive control: an `ic` whose only identity is two terminal roles,
424
+ * both covered by the fixture registry's groups (`cp1`, `vgg`). No part id, no declared
425
+ * type -- so it reaches the pinout rung and must match exactly.
426
+ */
427
+ export declare const chipPinoutExact: string;
428
+ /**
429
+ * The pinout rung, negative control: the same two roles plus `reset`, which the
430
+ * registry's groups do not cover. Presence alone would satisfy both groups and stamp a
431
+ * macro identity; the exact test must refuse it instead, because a role no group
432
+ * accounts for is evidence this is not that part.
433
+ */
434
+ export declare const chipPinoutSuperset: string;
435
+ /**
436
+ * The divider again: different coordinates, different component order, different
437
+ * names. Must yield the same netlist up to node relabeling.
438
+ */
439
+ export declare const resistorDividerRedrawn: string;
440
+ /**
441
+ * Two clippers that share only ground, so partitioning yields two nonlinear regions.
442
+ *
443
+ * The second pair sits on nodes 7 and 8, reachable from neither port, which is what
444
+ * makes it a second *region* rather than more devices in the first one. Needed because a
445
+ * failure counted per block cannot be told from one counted per sample until a document
446
+ * has two blocks that can fail on the same sample.
447
+ */
448
+ export declare const twoDiodeClippers: string;
449
+ /**
450
+ * The redrawn divider with its non-ground nodes renumbered.
451
+ *
452
+ * `resistorDividerRedrawn` varies coordinates, order, names and value notation but keeps
453
+ * node 1 and node 2, so it cannot show whether a node id is a label or a meaning. Here
454
+ * the same circuit calls them 5 and 7. Ground stays 0 because ground is not a label the
455
+ * document is free to choose -- the ground symbol decides it.
456
+ */
457
+ export declare const resistorDividerRelabelled: string;
458
+ /** Malformed: not valid interchange YAML. */
459
+ export declare const malformed = "schema: circuit-interchange/v3\n : : :\n";
460
+ /** A resistor whose value cannot be parsed. Must refuse rather than default. */
461
+ export declare const unparseableValue: string;
462
+ /** The divider with every node id quoted. A node id is a token, not a number. */
463
+ export declare const quotedNodeDivider: string;
464
+ /**
465
+ * The divider with named node ids and a ground symbol.
466
+ *
467
+ * The ground token is called `n_delay_clock_bus` on purpose. Nothing in that name says
468
+ * ground; the only thing that does is the ground symbol sitting on it. A rule that
469
+ * matched node names for `gnd` would pass this fixture while being wrong, and a rule
470
+ * that reads the symbol passes it for the right reason.
471
+ */
472
+ export declare const namedNodeDivider: string;
473
+ /**
474
+ * A structured quantity whose value is stated in kilohms.
475
+ *
476
+ * Ten kilohms, not ten ohms. The format library reports `value` in whatever unit it
477
+ * read, so a stage that trusts `value` without reading `unit` turns every `10k` in the
478
+ * corpus into 10 -- a wrong answer that still renders.
479
+ */
480
+ export declare const kilohmStructuredValue: string;
481
+ /** A taper code this stage cannot read, resolved by the library in base units. */
482
+ export declare const taperCodeStructuredValue: string;
483
+ /** Unreadable notation *and* a non-base unit: no answer is better than a wrong one. */
484
+ export declare const unreadableNonBaseUnit: string;
485
+ /**
486
+ * The same inverting amplifier with its op-amp inputs declared in the other order.
487
+ *
488
+ * Electrically identical: `inverting` is still node 3 and `noninverting` still node 0.
489
+ * Only the order the document lists them in changes, and the corpus really does write
490
+ * it both ways. A stage reading position instead of role exchanges the two inputs
491
+ * here, which inverts the stage while still rendering plausible audio.
492
+ */
493
+ export declare const invertingAmplifierReordered: string;
494
+ /**
495
+ * A two-terminal rheostat: 100k track, control at mid travel, feeding ground through
496
+ * a 100k series resistor. A linear sweep at 0.5 is 50k, so the divider reads 100k over
497
+ * 150k = 2/3. Hand-computed before it was measured.
498
+ */
499
+ export declare const rheostatDivider: string;
500
+ /**
501
+ * Two rheostats that are the two gangs of one physical knob.
502
+ *
503
+ * The declared control's id is `SAG_CTL`, but each gang names it the way the packets
504
+ * do: one by the control's `audioBinding.controlName`, the other by `PhysicalControl`.
505
+ * Matching only the id leaves both unbound and each invents a control of its own, so
506
+ * one knob silently becomes two that each move half the circuit.
507
+ */
508
+ export declare const gangedRheostats: string;
509
+ /** The same rheostat with a residual minimum, so the bottom of the sweep is not zero. */
510
+ export declare const rheostatWithMinimum: string;
511
+ /**
512
+ * A three-terminal pot wired as a rheostat -- its wiper node **is** its `lug3` -- with both
513
+ * track ends cut off from every DC reference: the far end (node 4) reaches a second op-amp's
514
+ * `vplus` rail node in one hop, and the input-end (node 5) reaches the first op-amp's
515
+ * inverting input in three.
516
+ *
517
+ * This is the narrow path of the pot's orientation evidence. Before 2026-08-25 `vplus` and
518
+ * `vminus` were seeds for that evidence's distance map, so the rail-adjacent end read one hop
519
+ * from an "op-amp input" that was in fact a supply rail: the track oriented to the rail end
520
+ * and the control swept the stage's gain the wrong way, silent at full. Nothing else saw it --
521
+ * the pot still swept, the circuit still converged, and at half travel both orientations agree
522
+ * because a linear taper's midpoint is its own mirror. Only the off-centre values differ, and
523
+ * they are written down in `expected.ts` from the divider arithmetic, not captured from a run.
524
+ *
525
+ * The second op-amp is electrically dead on purpose: its non-inverting input is grounded and
526
+ * its inverting input hangs off a single 100k to ground, so the whole pocket settles at zero
527
+ * and no floating island in the fixture needs gmin to land somewhere.
528
+ */
529
+ export declare const quietSeedRheostat: string;
530
+ /**
531
+ * A strapped-wiper rheostat treble shunt with **declared rotation** -- the
532
+ * `fulltone-ocd-v1.4` `Tone` class: the 47 n series cap feeds the free end
533
+ * (node 6), the wiper is strapped to the grounded end (node 0), and the ends
534
+ * declare `ccw`/`cw` instead of the ambiguous `end`.
535
+ *
536
+ * Without the declaration the quiet-distance inference puts position 0 at the
537
+ * grounded strapped end, landing the live leg on `upper` (`share = 1 -
538
+ * fraction`) so the bleed resistance *falls* as the knob rises -- the knob runs
539
+ * backwards. The declaration must outrank it: `end2` is the `ccw` free end, the
540
+ * live leg runs wiper-to-free-end on `lower` (`share = fraction`), and bleed
541
+ * resistance grows with the control.
542
+ */
543
+ export declare const rheostatWithDeclaredRotation: string;
544
+ /**
545
+ * The feedback-gain rheostat with its wiper strapped to the `output` node and the
546
+ * free end (declared first) reaching the `inverting` input -- the `boss-os-2`
547
+ * `VR3b` case, where declaration order ran the knob backwards. See
548
+ * `feedbackGainRheostat` for the wiring.
549
+ */
550
+ export declare const feedbackGainRheostat: string;
551
+ /**
552
+ * The same stage with the wiper strapped to the inverting-side node (6) instead of
553
+ * the `output` node. The wiper-strapped end is then the one far from a declared
554
+ * output, so the feedback-output rule's guard must refuse and leave the pot in its
555
+ * declaration-order orientation -- a negative control for the flip above. See
556
+ * `feedbackGainRheostat` for the wiring.
557
+ */
558
+ export declare const feedbackGainRheostatWiperOnInverting: string;
559
+ /**
560
+ * The divider plus a resistor, an LED and a footswitch that declare no terminals.
561
+ *
562
+ * The corpus is full of these: panel hardware from a photo, bias markers from a build
563
+ * document. They are named and described exactly like circuit elements, so the only
564
+ * honest reason to ignore them is the empty terminal list. Adding them must change
565
+ * nothing at all.
566
+ */
567
+ export declare const dividerWithUnconnectedParts: string;
568
+ /**
569
+ * The same emitter follower with its transistor terminals in the corpus's usual order.
570
+ *
571
+ * `collector,base,emitter` is how **282 of the corpus's 490 transistors** are written,
572
+ * against 15 for `base,collector,emitter`. Electrically identical to the fixture above
573
+ * -- the base is still node 3 -- but a stage reading position exchanges base and
574
+ * collector, the transistor never turns on, and the pedal renders silence.
575
+ */
576
+ /**
577
+ * The same follower with the supply's two terminals declared the other way round.
578
+ *
579
+ * Electrically identical -- node 5 is still the 9 V rail and node 0 is still the return --
580
+ * but read by position the rail inverts to -9 V, and the packet still compiles `ok`. A
581
+ * supply was the last asymmetric device in the pipeline read by declaration order, and a
582
+ * rail's sign is not a subtle error: every bias point in the circuit hangs off it.
583
+ */
584
+ export declare const emitterFollowerSupplyReversed: string;
585
+ /**
586
+ * The follower's rail stated the way most corpus rails are: one node, against ground.
587
+ *
588
+ * No fixture had this shape, so reading a supply's polarity by role -- which needs two
589
+ * terminals -- refused **34 packets** and took the corpus from 52 compiled to 19, with
590
+ * the whole unit suite still green. The scoreboard caught it; no test could.
591
+ */
592
+ export declare const emitterFollowerRailToGround: string;
593
+ /**
594
+ * The same supply stated twice, the second time reversed.
595
+ *
596
+ * Two rows asserting opposite signs across one pair of nodes is a contradiction, not a
597
+ * duplicate -- and keying the dedup on `positive:negative` made the reversed twin look
598
+ * like a different supply, so both were stamped.
599
+ */
600
+ export declare const contradictorySupplyTwin: string;
601
+ export declare const emitterFollowerReordered: string;
602
+ /**
603
+ * The same follower with the BJT's own IS and BF typed, so the bjt law runs on declared
604
+ * values and `bjt-law-default-parameters` stays silent. IS/BF are the corpus spellings
605
+ * (`sola-sound-tone-bender-professional-mkii`, `electro-harmonix-lpb-1`); the values are
606
+ * the law's own defaults restated, so the program is unchanged and only the disclosure moves.
607
+ */
608
+ export declare const bjtTypedParameters: string;
609
+ /**
610
+ * The pot divider with the wiper declared last instead of in the middle.
611
+ *
612
+ * `anode,cathode,wiper` is 64 of the corpus's 331 three-terminal pots. Reading position
613
+ * 2 as the wiper makes the grounded end the wiper, which shorts both halves of the
614
+ * track to ground and cuts the output off from the input entirely.
615
+ */
616
+ export declare const potDividerWiperLast: string;
617
+ /**
618
+ * The divider with a third jack, and no jack declaring a role.
619
+ *
620
+ * `Circuit.Jack` is the corpus's untyped catch-all: it absorbs DC inlets, remote
621
+ * sockets and second outputs alongside the real pair. The roles here are only in the
622
+ * names, which no stage may read, so there is nothing to resolve a port from. The
623
+ * third jack is declared last on purpose -- a positional fallback would take it as the
624
+ * output, which is how a DC inlet came to be read as a pedal's output.
625
+ */
626
+ export declare const untypedJacks: string;
627
+ /**
628
+ * Jacks whose declared roles reach them only through the panel binding.
629
+ *
630
+ * Both jacks are typed `Circuit.Jack`, so the type name says nothing. The roles are
631
+ * declared against panel-facing ids (`INPUT_JACK`, `OUTPUT_JACK`) and the panel binds
632
+ * those to the components — which is how most of the corpus states it, and it is a
633
+ * chain no type-name table can substitute for.
634
+ *
635
+ * A third jack carries `role: direct-output` and is declared **first**, so anything
636
+ * choosing by position or by "the first jack that looks like an output" takes the dry
637
+ * send instead of the effect output.
638
+ */
639
+ export declare const jacksTypedOnlyByRole: string;
640
+ /**
641
+ * A single-pole, two-throw selector routing the input to one of two resistors.
642
+ *
643
+ * The throws are declared in the opposite order to the options — `throws` are
644
+ * `bright,dark` while `Options` is `Dark,Bright` — because three corpus selectors do
645
+ * exactly that, and taking the option's index would select the other throw. `Position`
646
+ * names the option rather than giving a number, which is how the corpus states it and
647
+ * why `Number(position)` silently becomes half travel.
648
+ */
649
+ export declare const selectorRouting: string;
650
+ /**
651
+ * The same selector with its common terminal declared **last**.
652
+ *
653
+ * `throw0,throw1,common` is a real corpus shape, and `marshall-blues-breaker` wires its
654
+ * input jack to exactly such a switch. Attaching throws to a preceding common builds a
655
+ * pole out of the first throw and drops the real common entirely — which left the input
656
+ * jack's node connected to nothing and the pedal silent, while every stage reported
657
+ * success.
658
+ */
659
+ export declare const selectorCommonLast: string;
660
+ /**
661
+ * Two jacks whose third terminals carry the **same role name** and opposite senses.
662
+ *
663
+ * `IN.switch` is where the battery's negative landed, so it has to make against the
664
+ * sleeve or the supply has no return and the whole circuit floats. `OUT.switch` carries
665
+ * signal, and making *it* against the sleeve shorts the output to ground.
666
+ *
667
+ * One name, two required answers, so no contact-name vocabulary can decide this. The
668
+ * fixture exists because a name table was tried and shorted 13 corpus jacks, five of
669
+ * them supply rails.
670
+ */
671
+ export declare const switchedJackContacts: string;
672
+ /**
673
+ * A power jack that strands the supply behind its switch contact.
674
+ *
675
+ * `BT1.positive` and `PWR.tip` are alone on node 5, and the circuit's rail is node 6 on
676
+ * the jack's contact. This is the battery-saving arrangement: the contact routes the
677
+ * battery to the pedal and inserting an adaptor breaks it. `boss-od-3` and `boss-mt-2`
678
+ * are exactly this shape.
679
+ *
680
+ * The element has to be tip-to-contact. Closing the contact to the *sleeve* instead is
681
+ * what a contact-name table does, and it shorts the 9 V rail to ground; leaving it open
682
+ * strands the supply and the whole pedal solves with every node at 0 V. So the assertion
683
+ * that matters is which terminal it makes against, not that a law exists.
684
+ */
685
+ export declare const powerJackStrandedSupply: string;
686
+ /**
687
+ * Wired jacks and a ground, and every other component declaring no terminals.
688
+ *
689
+ * `boss-ps-2` is exactly this: 223 real, electrically active parts that are correctly
690
+ * dropped for having no terminals, leaving nothing to solve. Every stage succeeds and
691
+ * the result is a program with no blocks, which can only ever render silence.
692
+ */
693
+ export declare const nothingToExecute: string;
694
+ /**
695
+ * The soft-clipping overdrive stage: anti-parallel diodes across an op-amp's feedback
696
+ * resistor, on rails. This is what a Tube Screamer, an OD-1 and a Blues Breaker all
697
+ * are, and the pipeline had no fixture for it.
698
+ *
699
+ * It is also the shape that exposes an undamped op-amp. A diode limits its own Newton
700
+ * step; an op-amp at a gain of 1e5 did not, so the two fought and the iterate cycled
701
+ * rail to rail forever. Every simpler op-amp fixture here converges with or without
702
+ * that damping, including one clipping hard against its rails -- only the two
703
+ * nonlinearities in one loop show it.
704
+ */
705
+ export declare const clippingOverdriveStage: string;
706
+ /**
707
+ * The hybrid the pipeline has never had a case for: analog, then a macro, then analog.
708
+ *
709
+ * An input shell feeds the delay memory's `in`; its `out` feeds an output shell; and a
710
+ * separate RC clock network sits on `cp1`, which is what sets a bucket brigade's delay
711
+ * time. So three analog regions each share exactly one node with the macro, and none
712
+ * shares a node with another — the macro is the only thing between input and output.
713
+ *
714
+ * Three things this is the first case for, all of them written and none exercised:
715
+ *
716
+ * - `partition.ts` computes `dependencies[macro] = analog regions sharing a node`, and
717
+ * every case so far has produced `[]`.
718
+ * - `MacroModel.portTerminals` is declared in the types and read nowhere.
719
+ * - `Block`'s macro variant has no `inputNode`/`outputNode`, so audio cannot pass
720
+ * through it. That is the defect this fixture exists to hold still: it compiles, the
721
+ * macro is placed correctly, and the output region receives nothing.
722
+ *
723
+ * When the operator format lands, the acceptance criterion inverts and this renders.
724
+ */
725
+ export declare const hybridDelayPedal: string;
726
+ /**
727
+ * `hybridDelayPedal` with a control-bearing trim pot added across the clock network's own
728
+ * nodes -- the `parameter` port's negative control. `region.controls` is no longer empty for
729
+ * the clock region, so `couple.ts`'s purity gate must refuse to classify the derivation as
730
+ * `parameter`, per the spec's safe default (missing or negative evidence -> never `parameter`).
731
+ * The macro still compiles and still passes audio; only `parameter` on its block should differ.
732
+ */
733
+ /**
734
+ * S1's delay-model controls: the same pedal with one thing changed each time.
735
+ *
736
+ * The BBD delay model is **capacity-based** -- the document's `DelayMs`, converted to samples at
737
+ * the host's rate, then scaled by the `parameter` port's voltage ratio. That decision is recorded
738
+ * in `thoughts/shared/plans/2026-08-25-v2-bbd-pipeline-readiness.md` §5, and these fixtures are
739
+ * what make it a behavioural fact rather than a note: each one moves exactly one input and the
740
+ * delay has to respond, or not, in the one way the model predicts.
741
+ *
742
+ * Every prediction below is hand-derived before measuring, not read off the output:
743
+ * 3 ms x 48 kHz = 144 samples; 6 ms = 288; a clock rail halved against an unchanged 9 V
744
+ * reference halves the scale to 72; and the resolver's stand-in is 50 ms = 2400.
745
+ */
746
+ export declare const hybridDelayPedalLongerDelay: string;
747
+ /**
748
+ * `hybridDelayPedal` with `R_OUT_LOAD` changed from 1meg to 10k.
749
+ *
750
+ * S2 negative control: the macro output has an internal 1k impedance and 10k series resistor.
751
+ * Dividing into a 10k load yields an output divider of 10k/(10k + 10k + 1k) = 10/21 (~0.4762),
752
+ * shifting total gain from ~0.4470 to ~0.2152, verifying that output loading is modeled.
753
+ */
754
+ export declare const hybridDelayPedalLoadedOutput: string;
755
+ /**
756
+ * The clock rail halved, 9 V to 4.5 V, against a `parameterReferenceVolts` still 9.
757
+ *
758
+ * This is the coupling the delay model *does* have, and naming it is the honest complement to
759
+ * the frequency-independence assertion: the `parameter` port reads the clock node's **voltage**
760
+ * and scales the capacity by `|volts| / referenceVolts`. Nothing reads a frequency anywhere.
761
+ * A real BBD's delay is `stages / (2 * f_clock)`, so this is a capacity model with a voltage
762
+ * trim, not a clock model -- which is exactly what §5 chose and what S6 revisits.
763
+ */
764
+ export declare const hybridDelayPedalHalfClockRail: string;
765
+ /**
766
+ * `DelayMs` removed while the `cp1` parameter terminal remains.
767
+ *
768
+ * The resolver substitutes a 50 ms stand-in rather than refusing, on the grounds that a part
769
+ * with a clock terminal has *somewhere* the delay could have come from. **This fixture exists to
770
+ * pin that number as a deliberate, visible choice rather than a silent one** -- it is the
771
+ * mechanism by which all four of the Deluxe Memory Man's MN3008 macros resolve to
772
+ * `delaySeconds: 0.05` while the document declares no delay at all, and it is BBD plan S1's
773
+ * open question: a stand-in the size of a real echo is indistinguishable from a modelled one.
774
+ */
775
+ export declare const hybridDelayPedalNoDeclaredDelay: string;
776
+ /**
777
+ * `DelayMs` removed *and* the `cp1` parameter terminal removed.
778
+ *
779
+ * With no declared delay and no clock terminal there is nothing left to derive a delay from, so
780
+ * the pipeline refuses by name. The pair with the fixture above is the whole point: the same
781
+ * missing property is a 50 ms stand-in or a refusal depending on one terminal, and a reader
782
+ * should be able to see which lever decides it.
783
+ */
784
+ export declare const hybridDelayPedalNoDelayNoClock: string;
785
+ /**
786
+ * A trim pot across the clock network's own nodes, so that region is no longer control-free.
787
+ *
788
+ * **"Movable" is about the purity gate, not about a derived clock.** This is the negative
789
+ * control for `couple.ts`'s parameter-port rule: with a control in the clock region the
790
+ * derivation may no longer be classified as `parameter`, and the port falls back to null while
791
+ * audio stays wired. It deliberately does *not* produce a `clockControl` -- its part is the
792
+ * synthetic `FIXTURE-DELAY-1`, with no clock driver to derive from, so its delay tap runs in
793
+ * `capacity` mode. Anyone scanning fixture names for clock coverage wants
794
+ * `bbdClockDerivedDelay` or `pt2399ClockDerivedDelay` instead.
795
+ */
796
+ export declare const hybridDelayPedalMovableClock: string;
797
+ /**
798
+ * `hybridDelayPedal` with a resistor joining the input shell's node (3, the macro's audio-in
799
+ * tap) directly to the output shell's node (2, downstream of the macro's audio-out write-back)
800
+ * -- the region SCHEDULE's coincident case. This merges what were two separate analog regions
801
+ * into one, so that ONE region is both the macro's driver and its downstream: an unbuffered
802
+ * dry-blend/regen network, exactly the topology all three real delay/BBD packets that clear
803
+ * device-law identification (`pt2399-delay`, `boss-ce-2`, `boss-ce-5`) actually wire.
804
+ *
805
+ * Refused by `link.ts`'s `topologicalOrder` from 2026-08-14's first landing of clause 3 through
806
+ * the same day's correction: a genuine 2-cycle (the region must run both before the macro, for
807
+ * audio-in, and after it, for the write-back) with both directions added unconditionally. Now
808
+ * resolved with a documented one-sample write-back lag in exactly this case -- see the
809
+ * "coincident case" comment in `couple.ts` for the mechanism -- so this fixture **compiles**,
810
+ * which is what changed; `hybridDelayPedalChainedMacroCycle` below is the fixture that still
811
+ * refuses.
812
+ */
813
+ export declare const hybridDelayPedalCyclicSchedule: string;
814
+ /**
815
+ * `hybridDelayPedal` with a SECOND macro, `U2`, chained the opposite way round: its audio-in
816
+ * sits on node 2 (U1's downstream region) and its audio-out sits on node 3 (U1's own driver
817
+ * region) -- a loop through two DISTINCT regions and two DISTINCT macros, not one macro whose
818
+ * own driver and downstream coincide. `couple.ts`'s coincident-case lag only applies when a
819
+ * single macro's driver and downstream are the SAME region (a direct check on that one macro's
820
+ * own edges); it does not and should not paper over a longer cycle chained through a second
821
+ * macro, so this must still refuse exactly as before -- the negative control the resolved
822
+ * `hybridDelayPedalCyclicSchedule` above can no longer serve now that it compiles.
823
+ */
824
+ export declare const hybridDelayPedalChainedMacroCycle: string;
825
+ export declare const potAntiLogarithmicTaper: string;
826
+ export declare const potReverseLinearTaper: string;
827
+ export declare const potLogarithmicTaper: string;
828
+ export declare const potLinearTaper: string;
829
+ /** A manufacturer's own curve. We do not know its shape, so it must not be guessed. */
830
+ export declare const potUnknownTaperCode: string;
831
+ /**
832
+ * The source recording that it does **not** state a taper, which is a complete statement rather
833
+ * than a marking this stage failed to read. 18 corpus declarations are this shape.
834
+ */
835
+ export declare const potSourceUnmarkedTaper: string;
836
+ /**
837
+ * A taper `@vessel-dsp/core`'s format carries and this runtime has no curve for. `TaperKind` has
838
+ * four laws; `PotentiometerTaper` has seven. Stating one of the other three is a real taper the
839
+ * render cannot produce, which is a different thing from an unreadable marking.
840
+ */
841
+ export declare const potSteppedTaper: string;
842
+ /** A pot wired as a two-terminal rheostat, which lowering cannot stamp. */
843
+ export declare const rheostatPot: string;
844
+ /**
845
+ * One control on two pots in different regions, which the partition invariant refuses.
846
+ * A dual-gang pot is the real circuit this shape comes from.
847
+ */
848
+ export declare const straddlingControl: string;
849
+ /**
850
+ * A mains inlet feeding a resistive divider, and the only fixture whose supply moves.
851
+ *
852
+ * Written in the shape the amp packets use: the voltage and the frequency are both structured
853
+ * `{raw, value, unit}` with prose in `raw`, so this exercises the reading a bare `"10"` would
854
+ * not. `hot`/`neutral` are the mains pair those packets declare.
855
+ *
856
+ * Hand-computable, and the numbers are chosen so the supply's own impedance is *visible* in the
857
+ * answer: `SUPPLY_SOURCE_OHMS` is 1, so the loop is `1 + 999 + 1000 = 2000` ohms and the
858
+ * midpoint sits at exactly half the EMF. A stamp that dropped `sourceOhms` would read
859
+ * `1000/1999` and be wrong in the fourth digit.
860
+ *
861
+ * The input jack is deliberately alone on node 1. This circuit has no signal path -- it is a
862
+ * supply -- and an input source stamped onto a divider node would force the voltage this
863
+ * fixture is measuring.
864
+ */
865
+ export declare const acMainsDivider: string;
866
+ /**
867
+ * The same document with **only the frequency removed**, which is the whole discriminator.
868
+ *
869
+ * The negative control for the AC source: one deleted property has to turn a sine into a
870
+ * battery, and nothing else about the document changes. A `derive` rather than a copy, so the
871
+ * two cannot drift apart silently.
872
+ */
873
+ export declare const dcMainsDivider: string;
874
+ /**
875
+ * A tube rectifier passing DC into a load, which makes its space-charge law hand-checkable.
876
+ *
877
+ * A 300 V rail through 100 ohms into the plate, cathode into 10k. At the solved point two
878
+ * independent equations must both hold — the load's `I = V(cathode)/10k` and the tube's
879
+ * `I = K * (V(plate) - V(cathode))^1.5` — so the fixed point of
880
+ * `I = K * (300 - 10101*I)^1.5` is the answer without trusting any solver: `I = 27.9 mA` at a
881
+ * `18.4 V` drop, leaving the cathode at `278.8 V`. (The 10101 is 10k of load plus 100 ohms of
882
+ * series resistance plus the rail's own 1 ohm.)
883
+ *
884
+ * DC rather than mains on purpose: it isolates the tube's law from the AC source and the
885
+ * reservoir, so a failure here is the law and nothing else.
886
+ */
887
+ export declare const tubeDiodeIntoLoad: string;
888
+ /**
889
+ * The same rectifier, with a declared-voltage port added on the cathode/load node.
890
+ *
891
+ * `BPLUS_PORT` states `280 V` on node 2 — a plausible nominal chart value, deliberately not the
892
+ * `278.8 V` the tube law and the 10k load actually solve to, so a promoted ideal source and a
893
+ * real rectifier answer are distinguishable by more than rounding. Before this milestone,
894
+ * `voltagePortRails` had no way to see that node 2 is already generated (a `tube-diode` did not
895
+ * count as DC-conducting), so it promoted this port to an ideal `280 V` rail, deleting
896
+ * `V1_RECT`/`RLOAD`/`RSERIES` from the answer entirely. The fix is exactly the claim under test:
897
+ * the solved cathode voltage must still be `278.8 V` from the tube law, not the declared `280 V`.
898
+ */
899
+ export declare const tubeDiodeIntoLoadWithDeclaredPort: string;
900
+ export declare const tubeDiodeReversed: string;
901
+ /**
902
+ * The five-terminal dual rectifier the amp corpus actually declares: `plate_a`, `plate_b`, one
903
+ * `cathode_filament`, and two heaters that carry no signal.
904
+ *
905
+ * Both plates are fed from the same 300 V rail through their own 150 ohms, which is a stand-in
906
+ * for the centre-tapped secondary the real supplies use — this fixture is about how one component
907
+ * becomes two elements, not about the winding. The heater nodes are wired to nothing else, which
908
+ * is exactly how they appear in the packets.
909
+ */
910
+ export declare const dualPlateTubeRectifier: string;
911
+ /**
912
+ * A working divider plus a pot in its **own galvanic island**, which the emitted program
913
+ * therefore does not execute.
914
+ *
915
+ * Every earlier way of being a dead knob is deliberately excluded: `VR9`'s wiper is loaded by
916
+ * `R91` so it is not floating, and every one of the island's nodes is shared, so no device is
917
+ * joined to nothing. The pot is real, grounded through `R92`, and its coefficients move with
918
+ * the knob -- and its region owns neither jack, so nothing it computes can reach the output
919
+ * and `link` leaves it out of the execution order.
920
+ *
921
+ * The island touches the signal path only at ground, which is what makes it a separate region:
922
+ * stage 4 groups by shared *non-ground* node. Its prose says the opposite, as every fixture's
923
+ * does -- `MASTER_VOLUME`, `role: output-level`, a description calling it the output control --
924
+ * so a stage reading names would report the most important knob on the pedal.
925
+ */
926
+ export declare const controlInUnexecutedRegion: string;
927
+ /**
928
+ * The negative control for the fixture above: the same island, returned to the **output node**
929
+ * instead of to ground.
930
+ *
931
+ * One node changes, and with it the island stops being an island -- it joins the signal path's
932
+ * region, gets scheduled, and the knob really does load the output. Nothing else differs, so a
933
+ * warning that fires on both is reporting the pot rather than the schedule.
934
+ */
935
+ export declare const controlInScheduledRegion: string;
936
+ /**
937
+ * The same mains inlet drawing amps instead of milliamps, for the supply-current telemetry.
938
+ *
939
+ * `3 ohms` and `1 ohm` in place of the divider's kilohms, so with the supply's own ohm the loop is
940
+ * `5 ohms`. The declared `10 V` is read as RMS by the `ac-source` law's convention and converted
941
+ * to `10 * sqrt(2)` V peak, so the peak current is exactly `10 * sqrt(2) / 5 = 2.8284... A` — a
942
+ * draw three orders of magnitude past anything a pedal makes, and one the **operating point
943
+ * cannot see at all**, because it evaluates an AC source at its `t = 0` zero.
944
+ */
945
+ export declare const acSupplyDrawingAmps: string;
946
+ /**
947
+ * A bridge rectifier as one component, which is what four of the amp corpus's and two of the
948
+ * pedal corpus's diode components are: `[ac_a, ac_b, positive, negative]`.
949
+ *
950
+ * Resistive load and **no reservoir**, deliberately: the rail then follows the rectified sine
951
+ * instantaneously, so every sample is hand-computable with no settling to wait for. At the sine's
952
+ * peak the loop is `20 V = rail + two junction drops`, and with the class-default silicon junction
953
+ * (`IS = 2.52e-9`, `N = 1.752`) carrying `rail/1k`, that fixed point is `18.57 V`:
954
+ * `2 * 1.752 * 0.025852 * ln(0.01857/2.52e-9) = 1.43 V` of drop.
955
+ *
956
+ * The **negative** peak is the point of the fixture. A bridge rectifies both halves, so the rail
957
+ * must read the same there; the single junction this used to lower to gives a rail of nothing at
958
+ * both peaks, with the two DC terminals touching nothing at all.
959
+ */
960
+ export declare const bridgeRectifier: string;
961
+ /**
962
+ * The same bridge with its four terminals named as a three-pin clamp package, which is a shape
963
+ * the role table deliberately does not cover.
964
+ *
965
+ * The refusal control. Before the multi-junction reading, a diode component naming no `anode`
966
+ * fell through to declaration order and lowered to a junction between its **first two**
967
+ * terminals, whatever they were — so this compiled, rendered, and modelled a device the source
968
+ * does not contain. `pin1_`/`pin2_`/`pin3_` are stripped by the role folding exactly as stage 1
969
+ * strips them (`^pin\d+`, which also eats the leading `5` in `pin2_5a_clamp`), so the tokens
970
+ * this refuses on are `groundclamp`, `aclamp` and `signal` — checked against
971
+ * `electro-harmonix-holy-grail`'s real `D1`, the shape this fixture is transcribed from.
972
+ */
973
+ export declare const clampPackageDiode: string;
974
+ /**
975
+ * A dual rectifier sharing one cathode, declared under `kind: diode` with tube electrode names —
976
+ * the shape eight of the amp corpus's rectifiers use (`plate_a`, `plate_b`, `cathode`, plus two
977
+ * heaters that carry no signal).
978
+ *
979
+ * The same winding as the bridge above, wired the way a shared-cathode pack is: `plate_a` driven,
980
+ * `plate_b` at ground, cathode into the load. So it rectifies **one** half — at the positive peak
981
+ * the loop is `20 V = rail + one junction drop`, giving `19.28 V`, and at the negative peak the
982
+ * rail is nothing. That is the pair of numbers that tells this topology from the bridge's, which
983
+ * reads the same at both peaks.
984
+ *
985
+ * Two junctions, and **both keep the silicon law the declared kind asks for**. The lowering fixes
986
+ * the wiring; it does not read a vacuum device out of a terminal name.
987
+ */
988
+ export declare const dualAnodeRectifier: string;
989
+ /**
990
+ * A transformer with one primary and one untapped secondary, specified by winding voltages
991
+ * rather than by a `Ratio` or an impedance pair -- the "2-winding case". `PrimaryVoltage` (not
992
+ * `Primary`) is the spelling declared here, and as of 2026-08-14 nothing reads it: a winding
993
+ * specified this way is driven at its own stated voltage and no primary is modelled. It is
994
+ * left in the fixture deliberately, as the check that it is now inert.
995
+ *
996
+ * `MAINS` carries the frequency the driven winding runs at. A transformer does not change
997
+ * frequency, so a document with no AC supply in it states none and refuses.
998
+ */
999
+ export declare const twoWindingVoltageDerivedTransformer: string;
1000
+ /**
1001
+ * A transformer with one primary and one **centre-tapped** secondary, specified by a single
1002
+ * per-half winding voltage and isolated from any other winding so the centre-tap arithmetic is
1003
+ * the only thing under test. `Primary` (not `PrimaryVoltage`) is the spelling declared here,
1004
+ * and like `twoWindingVoltageDerivedTransformer`'s it is now inert.
1005
+ */
1006
+ export declare const centerTappedVoltageDerivedTransformer: string;
1007
+ /**
1008
+ * A power transformer with three secondaries off one primary -- a centre-tapped HV winding
1009
+ * plus two untapped windings -- shaped exactly like `fender-5e3-deluxe-tweed`'s
1010
+ * `PT_5E3_POWER_TRANSFORMER` but with round numbers. Three windings at three different
1011
+ * voltages off one core is what no single `Ratio` can express, and what the driven-winding
1012
+ * lowering handles without needing a primary at all.
1013
+ */
1014
+ export declare const powerTransformerVoltageDerived: string;
1015
+ /**
1016
+ * A transformer whose typed winding voltages include one this stage does not recognise --
1017
+ * `ScreenSecondary`, typed exactly like the recognised ones but under a spelling nothing
1018
+ * reads -- alongside a `FilamentSecondary` that *is* recognised. The v2-transformer-ratio
1019
+ * milestone's refusal case: this must refuse by name rather than silently deriving a ratio
1020
+ * from the winding it does recognise and dropping the one it does not.
1021
+ */
1022
+ export declare const transformerUnlistedWindingSpelling: string;
1023
+ /**
1024
+ * A transformer with a **centre-tapped primary** (the ordinary push-pull output-transformer
1025
+ * shape) and one untapped secondary, its ratio typed as an impedance pair -- the
1026
+ * v2-transformer-primary-tap milestone's core case. `PrimaryImpedance`/`SecondaryImpedance` give
1027
+ * `declaredRatio = sqrt(4000/10) = 20`; the shared-primary reduction has no single reference
1028
+ * winding to pivot on (the primary itself is tapped), so it swaps to the untapped secondary and
1029
+ * halves+inverts the ratio to `2/20 = 0.1` per half.
1030
+ */
1031
+ export declare const tappedPrimaryOutputTransformer: string;
1032
+ /**
1033
+ * Same tapped primary as `tappedPrimaryOutputTransformer`, plus an alternate impedance tap
1034
+ * (`secondary_8`) that connects to nothing else in the document -- `vox-ac30-top-boost`'s exact
1035
+ * shape, "8 Ω alternate source-visible tap" beside its typed, wired 16 ohm one. The
1036
+ * v2-transformer-primary-tap milestone's dangling-tap case: this must compile with exactly the
1037
+ * same two stamps as `tappedPrimaryOutputTransformer`, silently dropping the extra terminal
1038
+ * rather than refusing or guessing a ratio for it.
1039
+ */
1040
+ export declare const danglingAlternateTapTransformer: string;
1041
+ /**
1042
+ * The negative control for `danglingAlternateTapTransformer`: the same alternate tap, but wired
1043
+ * to a load like any other winding would be. Connectivity now says it is *not* dangling, so this
1044
+ * must refuse by name rather than silently dropping a terminal that is actually in use.
1045
+ */
1046
+ export declare const connectedAlternateTapTransformer: string;
1047
+ /**
1048
+ * A tank-shaped shell whose part number is not a tank's, so it lowers as an ordinary transformer
1049
+ * -- `fender-super-reverb`'s `SRC_REVERB_TANK_4AB3C1B` terminals with `125A9A` on the label.
1050
+ *
1051
+ * Its coils declare `drive`/`pickup`, which is what a tank's coils are: neither transforms the
1052
+ * other's voltage. This is the fixture that proves `drive` is treated as the primary on the
1053
+ * ordinary-transformer path, so a mislabelled tank still lowers instead of refusing for want of a
1054
+ * winding called `primary`. `InputImpedance`/`OutputImpedance` remain property-side synonyms for
1055
+ * `PrimaryImpedance`/`SecondaryImpedance` (`parametersFor` in `netlist.ts`).
1056
+ */
1057
+ export declare const reverbTankInputOutputTransformer: string;
1058
+ /**
1059
+ * `tappedPrimaryOutputTransformer` plus a **third** impedance tap, `secondary_4`, dangling
1060
+ * (connected to nothing else) beside the wired reference winding -- the same shape
1061
+ * `danglingAlternateTapTransformer` tests for `secondary_8`. Must compile to the identical two
1062
+ * stamps as the base fixture -- no third stamp, no stamp touching node 5.
1063
+ */
1064
+ export declare const danglingSecondary4Transformer: string;
1065
+ /**
1066
+ * `connectedAlternateTapTransformer` (its `secondary_8` wired to a load) plus a **third** tap,
1067
+ * `secondary_4`, dangling.
1068
+ *
1069
+ * The refusal must fire exactly as it does with no `secondary_4` present -- not be masked,
1070
+ * changed, or made order-dependent by the extra tap. It used to prove that two alternate taps
1071
+ * held separate winding groups and so could not overwrite one another's node; they are one coil's
1072
+ * taps now, and the property that matters is that the connectivity test finds the loaded tap
1073
+ * regardless of how many others the coil declares.
1074
+ */
1075
+ export declare const distinctAlternateTapsTransformer: string;
1076
+ /**
1077
+ * A tapped primary with no other complete, untapped winding to pivot the shared-primary
1078
+ * reduction on -- only a shield beside it, which declares `role: shield` and belongs to no coil.
1079
+ * The v2-transformer-primary-tap milestone's "no reference available" refusal case.
1080
+ *
1081
+ * States its ratio as a typed `TurnsRatio` rather than as an impedance pair, because a rating
1082
+ * belongs to a coil and the secondary it would rate is exactly what this document does not
1083
+ * declare. That is also what keeps the fixture reaching the refusal it is here for: a document
1084
+ * stating no ratio at all refuses earlier, in `requireWindingSpecification`.
1085
+ */
1086
+ export declare const tappedPrimaryNoReferenceTransformer: string;
1087
+ /**
1088
+ * A divider whose midpoint (the output) is formed by a T-junction in the middle of a
1089
+ * diagonal wire. `wireAxisAligned` is the same circuit with that wire redrawn horizontal,
1090
+ * so the two must yield the same netlist up to node relabeling.
1091
+ *
1092
+ * The midpoint terminals sit on the segment, not at an endpoint, so they are visible only
1093
+ * through the point-on-segment test. Before diagonal segments were recognised that test
1094
+ * returned false for them, the midpoint was dropped as unconnected, and this document
1095
+ * refused where its horizontal sibling compiled.
1096
+ */
1097
+ export declare const wireDiagonal: string;
1098
+ /**
1099
+ * `wireDiagonal` redrawn with the midpoint wire horizontal. The midpoint terminals still
1100
+ * sit in the middle of the segment; only the segment's angle changes. The two must resolve
1101
+ * to the same netlist up to node relabeling, which is the invariant the angle must not
1102
+ * break.
1103
+ */
1104
+ export declare const wireAxisAligned: string;
1105
+ /**
1106
+ * NE570 compandor terminal-mapping contract.
1107
+ *
1108
+ * Sixteen bare-pin terminals in strict sequential `pin1`..`pin16` order, each on a
1109
+ * distinct node (10–25). The part catalog binds section A to [rectIn=pin2,
1110
+ * rectCap=pin1, cellIn=pin5/INV_IN, output=pin7] and section B to the channel-2
1111
+ * pins. This fixture asserts that binding is stable: a catalogue edit that
1112
+ * re-points any of the four section terminals fails here rather than surfacing
1113
+ * as a silent audio defect months later.
1114
+ */
1115
+ export declare const ne570TerminalMap: string;
1116
+ /**
1117
+ * The datasheet's own expander, wired exactly as onsemi NE570/D Rev. 4 Figure 6 draws
1118
+ * it, and the reason this fixture exists rather than a bare transconductance probe: the
1119
+ * datasheet states a closed form for this circuit's gain, so the reference is external
1120
+ * to our code rather than a number read off our own output.
1121
+ *
1122
+ * GAIN = 2 * R3 * VIN(avg) / (R1 * R2 * IB)
1123
+ *
1124
+ * The input drives the rectifier (pin 2) and the gain cell (pin 3) through separate
1125
+ * coupling caps; pin 6 is tied to pin 7, which is what makes the internal 20k R3 the
1126
+ * op-amp's feedback resistor. Both couplings are 1 uF into 10k/20k, corners at 16 Hz and
1127
+ * 8 Hz, so at the 1 kHz test tone they pass unity and the gain is the chip's alone.
1128
+ *
1129
+ * Two independent numbers fall out of this one circuit, which is what makes it a
1130
+ * settlement rather than a smoke test: the AC gain above, and a quiescent output of
1131
+ * `(1 + R3/R4) * VREF` = 3.0 V that the datasheet also states outright. The DC figure
1132
+ * pins down the topology -- it only comes out at 3.0 V with R4 returned to ground -- and
1133
+ * the AC figure pins down the gain cell's scaling. See `ne570ExpanderGainAt`.
1134
+ *
1135
+ * CRECT is 2.2 uF as in the datasheet's own test circuit (Figure 3), giving the detector
1136
+ * `tau = R5 * CRECT` = 22 ms. That is a real external component, not a constant: the
1137
+ * negative control halves it and expects the attack to track.
1138
+ */
1139
+ export declare const ne570Expander: string;
1140
+ /**
1141
+ * The datasheet's compressor: onsemi NE570/D Rev. 4's own sentence, "a compressor is essentially
1142
+ * an expander placed in the feedback loop of the op amp", applied to `ne570Expander` and nothing
1143
+ * else. It is four derivations off that fixture, so the two provably differ only in the wiring
1144
+ * under test, and the same gain cell, the same internal resistors and the same reference serve
1145
+ * both.
1146
+ *
1147
+ * The three moves, and each is that sentence read literally:
1148
+ *
1149
+ * - the rectifier (pin 2) and the gain cell (pin 3) are driven from the **output** rather than
1150
+ * from the input, which is what "in the feedback loop" means for this chip;
1151
+ * - the signal enters at the **R3 pin** (pin 6), which the expander had tied to pin 7, and
1152
+ * reaches the summing node through the internal 20k;
1153
+ * - an external leg closes the op amp's DC loop, per `ne570CompressorInput` above.
1154
+ *
1155
+ * `mxr-carbon-copy`'s own traced schematic is an independent instance of the same topology --
1156
+ * R31 into pin 6, C24 from pin 7 back to pins 2 and 3, R34+R33 from pin 5 to pin 7 -- which is
1157
+ * why this is a reading of the datasheet rather than an invention: two sources drawn by
1158
+ * different people agree on it.
1159
+ *
1160
+ * **What this fixture is for.** The expander pins the gain cell's *magnitude* against a stated
1161
+ * closed form, and pins nothing about its *direction*: the cell carries no current at DC, so the
1162
+ * stated 3.0 V quiescent cannot see the sign, and the gain formula is a magnitude. Direction only
1163
+ * becomes observable when the cell sits inside the loop, because then it either adds to the
1164
+ * feedback conductance or subtracts from it. So this is the two-sided control the compandor
1165
+ * rebuild never had:
1166
+ *
1167
+ * - a compressor's gain must **fall** as its input level rises, and stay bounded;
1168
+ * - `ne570Expander`'s gain must still **rise**, which is what stops a sign flip being a free fix.
1169
+ */
1170
+ export declare const ne570Compressor: string;
1171
+ /**
1172
+ * The same expander with a tenth of the averaging capacitance.
1173
+ *
1174
+ * The negative control that proves CRECT is load-bearing. Before this rewrite the
1175
+ * detector integrated a private state variable against a hard-coded 50 ms and never read
1176
+ * the CRECT node at all, so this fixture and its parent rendered identically -- the
1177
+ * external component the chip devotes a pin to did nothing. `tau = R5 * CRECT` drops from
1178
+ * 22 ms to 2.2 ms here, which must show up as a faster attack.
1179
+ */
1180
+ export declare const ne570ExpanderFastDetector: string;
1181
+ /**
1182
+ * CD4047 bare-pin position-resolution contract.
1183
+ *
1184
+ * Fourteen terminals: `pin1`..`pin13` are bare (no role suffix) and `pin14_vdd`
1185
+ * carries the only role token. The part catalog's pinout is `[null × 13, "vdd"]`,
1186
+ * so position 13 must fold to `vdd` and the remaining thirteen positions accept
1187
+ * any (null) token. This fixture asserts that a bare-pin CD4047 still compiles
1188
+ * and that the clock-driver section resolves its five terminals by position:
1189
+ * cp1=pin10(9), cp2=pin11(10), vgg=pin13(12), vdd=pin14(13), ox1=pin3(2).
1190
+ */
1191
+ export declare const cd4047BarePinMap: string;
1192
+ /**
1193
+ * A spring reverb tank alone: input jack straight into the drive coil, pickup into the output
1194
+ * jack across a load.
1195
+ *
1196
+ * Deliberately nothing else. A tank inside a real amp is buried behind a driver stage, a
1197
+ * recovery stage and a mix control, so a level measured there cannot say whether the *tank*
1198
+ * reverberates. Here the only thing between the jacks is the tank.
1199
+ *
1200
+ * `PartNumber` is the whole of the classification evidence: the shell declares itself a
1201
+ * `Circuit.Transformer`, exactly as the corpus packets do, and only the exact part id
1202
+ * distinguishes a tank from the output transformer sitting next to it.
1203
+ */
1204
+ export declare const springReverbTank: string;
1205
+ /**
1206
+ * A variable attenuator using an optocoupler / Vactrol (VTL5C1).
1207
+ *
1208
+ * Series resistor R1=10k, shunt element is the LDR of the optocoupler to ground.
1209
+ * VLED drives the LED anode with respect to ground.
1210
+ *
1211
+ * - When VLED = 0 V (dark): LDR resistance is ~10 MΩ (ldrMaxOhms), so attenuation is 10M / (10k + 10M) ~ 0.999 V/V.
1212
+ * - When VLED = 2 V (illuminated): LED conducts forward current, LDR drops to ~100 Ω (ldrMinOhms), attenuation is 100 / (10k + 100) ~ 0.0099 V/V (-40 dB).
1213
+ * - When VLED = 0.5 V (sub-threshold): LED remains non-conducting, LDR remains dark at ~10 MΩ.
1214
+ */
1215
+ export declare const optocouplerAttenuator: string;
1216
+ export declare const optocouplerAttenuatorIlluminated: string;
1217
+ export declare const optocouplerAttenuatorSubThreshold: string;
1218
+ /**
1219
+ * The LED biased into the middle of the LDR's range, at 1.14 V.
1220
+ *
1221
+ * **The control the two extremes cannot supply.** Dark and illuminated both agree with a model
1222
+ * that is a two-state switch, and the sub-threshold fixture agrees with one whose LED does
1223
+ * nothing at all -- all three read as one of the two endpoints. Only a bias that lands *between*
1224
+ * them shows the LDR curve is continuous and actually traversed.
1225
+ *
1226
+ * Measured sweep across the knee, 0.1 V drive at 1 kHz: 1.00 V -> 0.9984, 1.05 -> 0.9964,
1227
+ * 1.10 -> 0.9722, 1.12 -> 0.8865, **1.14 -> 0.4936**, 1.16 -> 0.0621, 1.18 -> 0.0112,
1228
+ * 1.20 -> 0.0099 (floored). The assertion deliberately checks the *property* -- strictly between
1229
+ * the endpoints -- rather than pinning 0.4936, because this is the steepest point on a steep
1230
+ * curve and a brittle number here would fail for changes that are not defects.
1231
+ *
1232
+ * **A fidelity note the endpoints hide.** That whole traversal happens in an 80 mV window
1233
+ * (1.10 V to 1.18 V). A real Vactrol's LDR responds gradually over *decades* of LED current --
1234
+ * the slow, smooth knee is the part's musical character, and what an optocoupler tremolo or
1235
+ * compressor is chosen for. So "the optocoupler operator is settled" means its endpoints and its
1236
+ * continuity are pinned, **not** that the Vactrol's response shape is modelled; that lives in
1237
+ * `ledTransconductance` and the LDR exponent's scaling and is not settled by these fixtures.
1238
+ */
1239
+ export declare const optocouplerAttenuatorPartial: string;
1240
+ export declare const mn3007RoleMap: string;
1241
+ /**
1242
+ * MN3007 bare-pin position-resolution contract.
1243
+ *
1244
+ * Eight terminals named `pin1`..`pin8` with NO role suffixes.
1245
+ * Asserts that bare-pin DIP-8 positions resolve identically to the role-mapped
1246
+ * IC: clk1=pin2(node 11), clk2=pin6(node 15), in=pin3(node 12),
1247
+ * out1=pin7(node 16), out2=pin8(node 17).
1248
+ */
1249
+ export declare const mn3007BarePinMap: string;
1250
+ /**
1251
+ * MN3207 role-based terminal-resolution contract.
1252
+ */
1253
+ export declare const mn3207RoleMap: string;
1254
+ /**
1255
+ * MN3207 bare-pin position-resolution contract.
1256
+ *
1257
+ * Physical 8-pin DIP pinout per Panasonic datasheet and Boss VB-2 IC2:
1258
+ * Pin 1 (VGG) = node 13
1259
+ * Pin 2 (CP1) = node 11
1260
+ * Pin 3 (CP2) = node 15
1261
+ * Pin 4 (GND) = node 0
1262
+ * Pin 5 (OUT1) = node 16
1263
+ * Pin 6 (OUT2) = node 17
1264
+ * Pin 7 (VDD) = node 14
1265
+ * Pin 8 (IN) = node 12
1266
+ */
1267
+ export declare const mn3207BarePinMap: string;
1268
+ /**
1269
+ * Four bucket-brigade delay lines chained in series (S4).
1270
+ *
1271
+ * Models a multi-BBD cascade such as the SAD1024A 4-stage delay in the EH-7550 Deluxe Memory Man.
1272
+ * Each BBD declares DelayMs: 3 (144 samples at 48 kHz).
1273
+ * Total cascade delay across 4 stages = 4 * 3 ms = 12 ms (576 samples at 48 kHz).
1274
+ */
1275
+ export declare const hybridCascade4DelayPedal: string;
1276
+ /**
1277
+ * 4-BBD cascade with heterogeneous delays: U1=3ms, U2=6ms, U3=3ms, U4=3ms.
1278
+ * Total cascade delay = 3 + 6 + 3 + 3 = 15 ms (720 samples at 48 kHz).
1279
+ */
1280
+ export declare const hybridCascade4DelayPedalUnequalDelays: string;
1281
+ /**
1282
+ * 3-BBD cascade: 3 stages of 3 ms each.
1283
+ * Total cascade delay = 3 * 3 ms = 9 ms (432 samples at 48 kHz).
1284
+ */
1285
+ export declare const hybridCascade3DelayPedal: string;
1286
+ /**
1287
+ * `hybridDelayPedal` with a schematic feedback resistor `R_FB` (10k) from BBD output (node 4)
1288
+ * back to BBD input (node 3) (S5).
1289
+ *
1290
+ * An impulse at t=0 produces repeating, geometrically decaying echoes spaced at 3 ms
1291
+ * (144 samples at 48 kHz): t = 144, 288, 432, 576, ...
1292
+ */
1293
+ export declare const hybridFeedbackDelayPedal: string;
1294
+ /**
1295
+ * `hybridFeedbackDelayPedal` with higher feedback resistance (30k) -> lower loop gain (S5).
1296
+ * Echoes decay faster than the 10k baseline.
1297
+ */
1298
+ export declare const hybridFeedbackDelayPedalLowFeedback: string;
1299
+ /**
1300
+ * `hybridFeedbackDelayPedal` with lower feedback resistance (4.7k) -> higher loop gain (S5).
1301
+ * Echoes decay slower than the 10k baseline.
1302
+ */
1303
+ export declare const hybridFeedbackDelayPedalHighFeedback: string;
1304
+ /**
1305
+ * Active feedback delay fixture with op-amp gain in the feedback loop making loop gain > 1 (S5).
1306
+ * Demonstrates sustained/diverging echoes when loop gain exceeds unity.
1307
+ */
1308
+ export declare const hybridFeedbackDelayPedalUnstableLoop: string;
1309
+ /**
1310
+ * A tapped secondary loaded at **both** taps, with nothing in it ngspice cannot express.
1311
+ *
1312
+ * `orange-rockerverb`'s output transformer is the corpus shape -- a 16 Ω jack and an 8 Ω jack each
1313
+ * with its own feedback resistor -- and that packet cannot be graded against ngspice, because a
1314
+ * spring reverb tank is a DSP operator with no circuit-level deck (5 of the 24 corpus amps are
1315
+ * excluded for the same reason). This is the claim on its own: two loaded taps are two coupled
1316
+ * windings, each at the turns ratio its own rating gives.
1317
+ *
1318
+ * Checked once against ngspice through the parity report's `--source=` mode: `agrees`,
1319
+ * corr 1.0000, gain 1.000, with that report's `--self-check` confirming a corrupted deck
1320
+ * disagrees and its 2% gain gate refuses a 3% level error. Both decks there are emitted from the
1321
+ * program, so that bounds the *solve*, not the stamps -- which is what the ratio assertions below
1322
+ * are for.
1323
+ */
1324
+ export declare const twoLiveSecondaryTaps: string;
1325
+ /**
1326
+ * A speaker jack one impedance-selector hop from the output transformer, which is where a real
1327
+ * amp puts it.
1328
+ *
1329
+ * `orange-gro100` is the corpus case and was the only one in 142 documents: `J_SPEAKER` on node 79
1330
+ * with `S_SPEAKER_IMPEDANCE` joining it to the winding's 76/77/78 taps. `resolvePorts`'s "after
1331
+ * the transformer" test required the jack to be *on* a winding node, so it missed, and the output
1332
+ * port fell through to a jack whose own `SourceBoundaryRole` reads "tone-stack output-amp handoff
1333
+ * label". The amp rendered its tone stack -- 3 V of preamp node in place of 35 V of speaker swing,
1334
+ * with no transformer bounding it, so the file clipped 10,991 samples of 96,000.
1335
+ */
1336
+ export declare const speakerBehindSelector: string;
1337
+ /**
1338
+ * A three-terminal 5 V regulator whose pins are named `pin1`/`pin2`/`pin3` and whose *roles* say
1339
+ * which is the output and which the reference — the shape `moogerfooger-mf-102`'s `U13` has.
1340
+ *
1341
+ * The registry's 78Lxx entry lists `pin2` among its ground aliases and `pin3` among its output
1342
+ * aliases, so a reader that goes by the names puts the reference on the rail here. This fixture
1343
+ * declares the opposite, which is the only evidence that settles it.
1344
+ */
1345
+ export declare const declaredRegulator: string;
1346
+ /** The same regulator with its electrode roles removed, so only the entry's pin naming is left. */
1347
+ export declare const undeclaredRegulator: string;
1348
+ /**
1349
+ * `invertingAmplifier` with the op-amp **packaged as an eight-pin chip**, expanded by
1350
+ * `sectionsRegistry`.
1351
+ *
1352
+ * Deliberately the same circuit, so the only variable is how the op-amp arrives. A discrete
1353
+ * `kind: opamp` states its own three terminals by role; this one states eight numbered pins and
1354
+ * a part number, and the registry says which three of them are the section and in what order.
1355
+ * That is the path most of the corpus's registry-expanded devices take, and nothing graded it
1356
+ * against a second solver before: if this row disagrees while `inverting-amplifier` agrees, the
1357
+ * defect is in expansion rather than in the op-amp law.
1358
+ *
1359
+ * Pins 4-8 are in no section and connect to nothing, which is the ordinary shape of a real
1360
+ * package -- supply pins and a second half nobody used. They must contribute nothing.
1361
+ */
1362
+ export declare const packagedOpamp: string;
1363
+ /**
1364
+ * An OTA on an eight-pin chip, driving a load resistor.
1365
+ *
1366
+ * `ota` is five corpus packets and had no fixture at all, because every real OTA arrives inside
1367
+ * an `ic` and an `ic` was refused whole. Output current is `gm` times the input difference, so
1368
+ * the stage's gain is `gm * Rload` -- 1 mS into 10k, a gain of ten -- which is a number the deck
1369
+ * and the program must both produce from the same declaration rather than a shape either could
1370
+ * fake.
1371
+ *
1372
+ * Three mapped pins and no fourth means no amplifier-bias terminal, which is the linear OTA.
1373
+ */
1374
+ export declare const packagedOta: string;
1375
+ /**
1376
+ * The four-terminal nonlinear OTA on an eight-pin chip.
1377
+ *
1378
+ * `ota` is five corpus packets -- the phaser and chorus OTAs -- and had no fixture, because
1379
+ * every real one arrives inside an `ic`. The linear `packagedOta` reaches `vccs`, which is
1380
+ * a different stamp: a fourth mapped terminal is an amplifier-bias pin, and its presence is what
1381
+ * selects the compressive `2 * Iabc * tanh(vDiff / 2Vt)` law over the linear fallback.
1382
+ *
1383
+ * The input is divided down to about 20 mV before the OTA sees it, on purpose. The parity
1384
+ * harness drives every fixture at 0.1 V, and `tanh(0.1 / 2Vt)` is 0.96 -- pinned against the
1385
+ * compression knee, where the row would grade almost nothing but the saturation limit. At 20 mV
1386
+ * the stage runs about 5% compressed: nonlinear enough that a linear model fails the row, gentle
1387
+ * enough that the verdict is about the law rather than about clipping.
1388
+ *
1389
+ * `RBIAS` from the 9 V rail sets `Iabc` near 0.47 mA. That number is the output's scale, so a
1390
+ * bias pin mapped to the wrong node changes the gain instead of changing nothing.
1391
+ */
1392
+ export declare const packagedNonlinearOta: string;
1393
+ /**
1394
+ * A CMOS transmission gate whose own signal drives its control pin.
1395
+ *
1396
+ * `analog-switch` is two corpus packets and had no fixture. The law is a smooth sigmoid on the
1397
+ * control voltage, not a hard throw, so it has a curve worth grading -- but only if the control
1398
+ * actually moves. Tying the gate to a DC bias would leave the conductance constant and reduce
1399
+ * the row to a resistor divider that happens to be computed through an exponential.
1400
+ *
1401
+ * So the gate is driven by the signal it passes, with the threshold at 0 V. The conductance then
1402
+ * swings across the sigmoid every cycle -- about 1/171 ohm at the positive peak against 1/465 at
1403
+ * the negative one -- and the stage distorts asymmetrically. That asymmetry is the law; a linear
1404
+ * on-resistance would not produce it.
1405
+ */
1406
+ export declare const packagedAnalogSwitch: string;
1407
+ /**
1408
+ * An open-collector comparator with a pull-up.
1409
+ *
1410
+ * `comparator` is one corpus packet. The law is `gOn / (1 + exp(k * vDiff)) + gOff` between the
1411
+ * output and `vee`, so the output is pulled down or left to float up through `RPULLUP`. Three
1412
+ * mapped terminals leaves `vee` at ground.
1413
+ *
1414
+ * At sensitivity 50 and this harness's 0.1 V drive the output traverses roughly 0.09 V to 5.4 V
1415
+ * as a smooth curve rather than a switching edge -- deliberate, because an edge's *timing* is
1416
+ * resolved differently by a fixed-step runtime and an adaptive-step ngspice, and a row that
1417
+ * disagreed about that would be reporting the integrator rather than the comparator.
1418
+ */
1419
+ export declare const packagedComparator: string;
1420
+ /**
1421
+ * An optocoupler as a modulated optical attenuator, which is what the corpus uses them for.
1422
+ *
1423
+ * `optocoupler` is four corpus packets -- the Fender tremolos -- and it is a **stamp in the
1424
+ * matrix**, not a lifted macro, which is the whole reason it can be referenced against ngspice
1425
+ * where a BBD cannot. The LDR shunts the signal to ground and its resistance falls exponentially
1426
+ * with LED current, so the LED is driven from the signal as well as from a bias, and the shunt
1427
+ * therefore moves with the signal: the row grades the coupling *curve* rather than one point on
1428
+ * it, which is what gives the harmonic check something to measure.
1429
+ *
1430
+ * **`RLED` is 2k7 because of a measurement, and the first value was wrong twice over.** At 8k2
1431
+ * the bias node sat near 0.98 V, which cleared the LED knee only while that knee was at the
1432
+ * uncorrected 1.036 V; once the emitter was corrected to the cited `LED-RED` entry the LDR
1433
+ * pinned fully dark and the row silently stopped grading any curve at all -- `agrees` at
1434
+ * correlation 1.0000 with h2 and h3 at 1e-9. Re-biasing to 2k7 puts the reference's distortion
1435
+ * at 0.86%, well clear of the shape check's floor, and its `h3Delta` at 0.0001. Values that put
1436
+ * the distortion just above the floor instead (8k2/2k2 reads 0.18%) measure mostly their own
1437
+ * noise and report deltas up to 0.05.
1438
+ *
1439
+ * **What this row cannot grade**, and it is worth knowing before reading a green verdict: the
1440
+ * LED's own law is three constants hardcoded in the stamp -- a 50 mV ideality, `Is = 1e-12`, and
1441
+ * a coupling `alpha` of 1000 -- which the source has no way to state, so the deck can only
1442
+ * restate them. What the row does grade independently is the pin mapping, the LDR span, and the
1443
+ * shape of the exponential coupling.
1444
+ */
1445
+ export declare const packagedOptocoupler: string;
1446
+ /**
1447
+ * A VTL5C2 optocoupler, resolved through `pedalPartCatalog` (not the mock `sectionsRegistry`
1448
+ * every other resident in this file uses) so this pins the actual production catalog entry, not a
1449
+ * fixture-only copy of it.
1450
+ *
1451
+ * **What it is for.** `runoffgroove-tremulus-lune`'s VTL5C2 sat in the generic optocoupler bucket
1452
+ * (`ldrMinOhms=100, ldrMaxOhms=10_000_000`, the module-wide `exp(-1000*amps)` coupling) until
1453
+ * 2026-09-15: that law put a genuinely-lit LED (0.567 mA, confirmed against an independent ngspice
1454
+ * diode solve) 56.7% of the way to its dark ceiling, because the generic bucket's bounds are
1455
+ * placeholders and VTL5C2's own datasheet -- cited in the packet's own
1456
+ * `SelectedLaneLedCurrentToResistanceLaw` property (R@1mA=5.5k, R@10mA=800, R@40mA=200,
1457
+ * dark>=1M) -- was never fit to a law at all. `part-catalog.ts`'s dedicated VTL5C2 entry carries
1458
+ * that fit now (`ldrPowerLawCoefficientOhms`/`ldrPowerLawExponent`); this fixture is what keeps it
1459
+ * pinned, since nothing else in this suite exercises it.
1460
+ *
1461
+ * **Bias.** `R_LED` (7k2 from the 9 V rail) puts the LED within a few percent of the datasheet's
1462
+ * 1 mA anchor -- close enough that a regression in the fit or an accidental fallback to the generic
1463
+ * exponential moves the verdict, not so exact that the fixture is fragile to the diode law's own
1464
+ * rounding. `RLOAD` (10k from output to ground) turns the LDR into a divider so its resistance is
1465
+ * what decides the gain, rather than leaving `ldrA`/`ldrB` floating in series with nothing to load
1466
+ * against.
1467
+ *
1468
+ * **What this proves and what it cannot** -- same limit `emitOptocoupler`'s own comment states for
1469
+ * every optocoupler resident: the from-source deck's LDR side is a `B`-source that *restates* the
1470
+ * runtime's own formula (now the power law, when the device carries one) rather than deriving it
1471
+ * independently, so ngspice cannot catch an error shared between the restatement and the runtime.
1472
+ * What it grades independently is the pin mapping, the part-specific `ldrMinOhms`/`ldrMaxOhms`
1473
+ * clamp, and -- because `source-to-spice.ts` reads the law fields off the same compiled program,
1474
+ * not off a second constant -- that the compiled program actually carries the VTL5C2-specific
1475
+ * fields rather than silently falling back to the generic law for this part.
1476
+ */
1477
+ export declare const packagedOptocouplerVtl5c2: string;
1478
+ /**
1479
+ * A Belton BTDR-2H reverb brick in the smallest analog shell that can carry it.
1480
+ *
1481
+ * **Why this fixture exists.** `digital-reverb-module` was the one device law in the corpus with
1482
+ * no behavioural gate anywhere: no parity fixture -- correctly, since it is an `ic` macro the
1483
+ * runtime executes as DSP and ngspice has no circuit to compare -- and no test either. Worse, the
1484
+ * runtime's own `reverbCombGain` comment claimed "`belton-brick-reverb`'s measured T60 is checked
1485
+ * against the datasheet's 2.5 s", and nothing checked it. One packet in the corpus reaches this
1486
+ * law, so a change to the macro scheduler, the tap, or the output source could quietly silence
1487
+ * every reverb in the product and no gate here would have said a word.
1488
+ *
1489
+ * **The shell is deliberately trivial**, because the brick is what is under test. Input divides
1490
+ * 2:1 into the module's `pin3_input` through `10k`/`10k` (its datasheet Z_in is 10k, so this is
1491
+ * the impedance the part expects); `pin6_output_1` drives a `10k` load through the registry's
1492
+ * stated 220R output impedance; `pin5_output_2` is terminated so the second output is not a
1493
+ * dangling active terminal. The `5 V` rail is the module's own supply. No op-amps, because an
1494
+ * op-amp's own operating point would be a second thing to explain when a level moves.
1495
+ *
1496
+ * Node 1 is the input and node 2 the output, which is what the shared `jacks` helper already
1497
+ * declares -- so the module's output pin *is* the output port and nothing sits between them but
1498
+ * the load.
1499
+ */
1500
+ export declare const beltonBrickReverb: string;
1501
+ /**
1502
+ * A CD4013 dual D flip-flop wired as a clock divider, lifted out of `pipeline.test.ts`.
1503
+ *
1504
+ * **Why it moved.** This was the only fixture in the repository reaching a device law that no
1505
+ * exported fixture reached: `logic-divider`. It lived as an inline template literal inside its
1506
+ * own test, and `report:fixture-parity --corpus` -- which indexes `circuits.ts` and nothing else
1507
+ * -- therefore reported "no fixture compiles to it under any known registry" about a law with a
1508
+ * working test. Seventeen fixtures were written inline that way; measured, this was the one whose
1509
+ * absence from here made a coverage report state a falsehood, which is why it is the one that
1510
+ * moved rather than all of them.
1511
+ *
1512
+ * The document is unchanged: its test still compiles it under `pedalPartCatalog` and asserts the
1513
+ * same things, and this file is now the complete set of laws the fixtures can reach.
1514
+ */
1515
+ export declare const cd4013LogicDivider = "schema: circuit-interchange/v3\ndeviceInterface:\n controls:\n - id: INPUT_JACK\n label: \"Input Jack\"\n kind: jack\n role: \"input\"\n - id: OUTPUT_JACK\n label: \"Output Jack\"\n kind: jack\n role: \"output\"\ncomponents:\n - id: INPUT_JACK\n kind: jack\n name: \"INPUT_JACK\"\n sourceTypeName: \"Circuit.Jack\"\n origin:\n x: -480\n y: 0\n rotation: 0\n flipped: false\n terminals:\n - name: tip\n node: 1\n position:\n x: 0\n y: 0\n - name: sleeve\n node: 0\n position:\n x: 0\n y: 0\n - id: OUTPUT_JACK\n kind: jack\n name: \"OUTPUT_JACK\"\n sourceTypeName: \"Circuit.Jack\"\n origin:\n x: 480\n y: 0\n rotation: 0\n flipped: false\n terminals:\n - name: tip\n node: 2\n position:\n x: 0\n y: 0\n - name: sleeve\n node: 0\n position:\n x: 0\n y: 0\n - id: FLIP_FLOP\n kind: ic\n name: \"FLIP_FLOP\"\n sourceTypeName: \"Circuit.IC\"\n origin:\n x: 0\n y: 0\n rotation: 0\n flipped: false\n properties:\n PartNumber: \"CD4013\"\n terminals:\n - name: 1q\n node: 2\n position:\n x: 0\n y: 0\n - name: 1q_bar\n node: 0\n position:\n x: 0\n y: 0\n - name: 1clock\n node: 1\n position:\n x: 0\n y: 0\n - name: 1reset\n node: 0\n position:\n x: 0\n y: 0\n - name: 1data\n node: 0\n position:\n x: 0\n y: 0\n - name: 1set\n node: 0\n position:\n x: 0\n y: 0\n - name: gnd\n node: 0\n position:\n x: 0\n y: 0\n - name: 2set\n node: 0\n position:\n x: 0\n y: 0\n - name: 2reset\n node: 0\n position:\n x: 0\n y: 0\n - name: 2data\n node: 0\n position:\n x: 0\n y: 0\n - name: 2clock\n node: 0\n position:\n x: 0\n y: 0\n - name: 2q_bar\n node: 0\n position:\n x: 0\n y: 0\n - name: 2q\n node: 0\n position:\n x: 0\n y: 0\n - name: vDD\n node: 0\n position:\n x: 0\n y: 0\n";
1516
+ /**
1517
+ * An MN3101 BBD clock generator with its oscillator pin biased, and the first fixture in this
1518
+ * repository to reach the `clock-driver` law at all.
1519
+ *
1520
+ * **Why it did not exist.** `report:fixture-parity --scoreboard` reads one row per corpus device
1521
+ * law and says what pins it. On 2026-09-07 exactly one law read `UNGATED: no fixture at all`:
1522
+ * `clock-driver`, needed by 7 corpus packets. Every mention of it in the test tree was about its
1523
+ * *absence* -- `non-executable-clock-driver`, `no-clock-driver`, and one adversarial-prose test
1524
+ * that requires a divider to render identically despite naming a clock driver in its text. The
1525
+ * law owns three stamped outputs and a sampled oscillator and nothing rendered it.
1526
+ *
1527
+ * **The wiring is the stamp's convention, not a real pedal's, and that is a finding rather than a
1528
+ * shortcut.** `part-catalog.ts` states the polarity plainly: the MN3101 runs on a single negative
1529
+ * supply, so a +9 V pedal ties the part's GND pin to +9 V and its VDD pin to circuit ground. The
1530
+ * runtime stamp instead treats `vdd` as the high rail and skips the coupling entirely when that
1531
+ * node *is* ground, so a correctly-wired pedal renders CP1, CP2 and VGG all pinned at zero -- and
1532
+ * two corpus packets, `boss-ch-1` and `boss-dm-3`, resolve `vdd` to node 0 and do exactly that.
1533
+ * See `docs/troubleshootings/a-correctly-wired-bbd-clock-driver-outputs-nothing.md`.
1534
+ *
1535
+ * This fixture therefore wires VDD to the +9 V rail, which is what the stamp as written needs in
1536
+ * order to oscillate. It pins the law's designed behaviour so the polarity can be corrected
1537
+ * against something; pinning first is the whole argument for the scoreboard that found it.
1538
+ *
1539
+ * OX1 sits on a `6k5`/`2k5` divider off 9 V, which is 2.5000 V exactly and therefore `fScale`
1540
+ * of 1, so the rendered rate is the declared `defaultFrequency` with nothing to subtract.
1541
+ */
1542
+ export declare const mn3101ClockDriver: string;
1543
+ /**
1544
+ * The same clock driver with one divider leg changed, and nothing else.
1545
+ *
1546
+ * `4k`/`5k` off 9 V is 5.0000 V exactly, so `fScale` is 2 and the rendered rate must be twice the
1547
+ * declared frequency. Without a second bias the OX1 coupling is unpinned: at 2.5 V the scale
1548
+ * factor is 1, so a runtime that ignored the oscillator pin and hardcoded `fScale = 1` would
1549
+ * satisfy every assertion the fixture above can make. The BBD's delay time is derived from this
1550
+ * rate, so "the clock is a constant" and "the clock follows its control pin" are exactly the two
1551
+ * possibilities that need separating.
1552
+ */
1553
+ export declare const mn3101ClockDriverFastOscillator: string;
1554
+ /**
1555
+ * **Synthetic dry wire -- positive control for `detectDryWire` (report-input-dependence.ts:1002).**
1556
+ *
1557
+ * The corpus lost its dry-wire packet on 2026-09-15 when tremulus-lune was cured by the
1558
+ * optocoupler LDR fix, so *every* dry-wire row in the report now asserts `false` and the
1559
+ * detector can never prove it FIRES. This synthetic restores the positive control in the
1560
+ * compiler-lane fixtures: one bypass-switch position carries the input near-unity (inside the
1561
+ * detector's 2 % passthrough bar) and the other position is dead (below the detector's
1562
+ * -60 dBFS floor, full scale * 1e-3). A prose reader is told it is a working spring-reverb
1563
+ * tank; the *structure* is what the detector must flag, never the prose.
1564
+ *
1565
+ * **The first build of this fixture was wrong and never fired -- worth recording why, since the
1566
+ * mistake is the instructive part.** `SW1` bridged input to *ground*, not to the output probe, so
1567
+ * bypassing it collapsed the whole source to ~0 V instead of passing it through, and a fixed
1568
+ * R1/R2 divider sat in the signal path in *both* switch positions, so neither position was ever
1569
+ * unity: measured `-20.8 dB` (bypass) and `0.09x` (tank), never near-unity and dead. A divider is
1570
+ * not a wire. The fix moves the switch itself onto the input/output path (`a: node 1`,
1571
+ * `b: node 2`) so closing it *is* the wire, and removes the always-present divider from the live
1572
+ * path entirely.
1573
+ *
1574
+ * `detectDryWire`'s own `measure()` drives through `ReferenceRuntime.prepare(SAMPLE_RATE)` with
1575
+ * no `inputSourceOhms` option, so the input source is ideal (0 ohm) here -- **not** the ~10 kOhm
1576
+ * guitar-ish default `render:v2`'s CLI applies to its own stimulus. That matters for R2 below: an
1577
+ * ideal source means R2 barely attenuates the closed-switch reading (it only divides against the
1578
+ * switch's own ~0.01 ohm on-resistance), so a small, unremarkable termination value is safe to
1579
+ * leave in the live path on both sides of the switch.
1580
+ *
1581
+ * - **`SW1`**: `a` on the input node, `b` on the output-probe node. Bypassed (on-resistance) is a
1582
+ * near-direct wire; tank (off-resistance, ~1e9 ohm) is effectively open.
1583
+ * - **`R2`**: output probe node to ground, 1 kOhm. Always present. With an ideal source this costs
1584
+ * the bypassed reading nothing (1 kOhm >> the switch's ~0.01 ohm on-resistance), and in the tank
1585
+ * position it is the dominant path to ground against the switch's ~1e9 ohm off-resistance, which
1586
+ * is what pins the dead reading far below the floor rather than leaving the output node to a bare
1587
+ * gmin (1e12 ohm) shunt -- gmin alone against a 1e9 ohm off-switch would leak ~99.9 % of the input
1588
+ * through, not read dead at all.
1589
+ * - **`R1`**: input node to output-probe node, in parallel with the switch, always present at a
1590
+ * deliberately huge value (100 Mohm) so it changes neither reading by more than a part in 1e5 --
1591
+ * present only so the mutation control below has one property to change.
1592
+ */
1593
+ export declare const syntheticDryWire: string;
1594
+ /**
1595
+ * **Mutation control for the synthetic dry wire.**
1596
+ *
1597
+ * The same fixture with the dead arm made alive: R1's 100 Mohm leakage bridge (negligible in
1598
+ * both switch positions) is replaced by a 1 kOhm live arm, so it now competes evenly with R2
1599
+ * even when SW1 is open -- both switch positions read roughly half the input, neither dead nor
1600
+ * near-unity. `detectDryWire` must NOT fire here -- if it fired, it would be firing because a
1601
+ * bypass switch exists, not because a wire is dry. This is the negative control that proves the
1602
+ * positive control fires for the right reason.
1603
+ *
1604
+ * `derive()`, not a bare `.replace()`: the first build of this control used `.replace()` against
1605
+ * a `"1M"` target the base fixture had already stopped declaring, so the replacement silently
1606
+ * matched nothing and the control was comparing the base fixture against an unmodified copy of
1607
+ * itself the entire time. `derive()` throws instead of returning a silent no-op.
1608
+ */
1609
+ export declare const syntheticDryWireMutation: string;
1610
+ /**
1611
+ * An `stages`-section RC low-pass ladder: series 10k from each node to the next, 10n shunt to
1612
+ * ground at every interior node, input on node 1, output on node 2.
1613
+ *
1614
+ * **It exists to be BIG, which no other fixture here is.** A block only takes the runtime's
1615
+ * static sparse schedule when the predicted saving clears `SCHEDULE_MINIMUM_SAVING`, and that
1616
+ * saving grows roughly as `n^2/24`, so every hand-written fixture in this file -- two to seven
1617
+ * unknowns -- solves densely and cannot exercise the schedule at all. Ten sections is the first
1618
+ * size that clears the floor with room to spare.
1619
+ *
1620
+ * **And it is an RC ladder specifically**, because the schedule's hardest case is the
1621
+ * difference between a DC pass and a transient one: a capacitor contributes `2C/dt` to the
1622
+ * matrix while audio is running and contributes *nothing at all* during an operating-point
1623
+ * solve. A ladder whose every shunt element is a capacitor is therefore a structurally
1624
+ * different matrix in the two passes, which is exactly the condition that sent six corpus
1625
+ * packets permanently onto the dense path in 2026-09-18's audit.
1626
+ *
1627
+ * Linear, so its own audio is uninteresting: one solve per sample, a first-order roll-off per
1628
+ * section. Nothing here asserts what it sounds like.
1629
+ */
1630
+ export declare const rcLadder: (stages: number) => string;
1631
+ /**
1632
+ * Two JFETs differing only in parameter-key spelling. The corpus spells the SPICE
1633
+ * threshold and transconductance `Vt0`/`Beta` (mxr-phase-90, boss-ph-1r,
1634
+ * mxr-noise-gate-line-driver, jhs-morning-glory); nothing in the corpus uses the
1635
+ * all-caps `VTO`/`BETA`. Both spellings must land on thresholdVolts and
1636
+ * transconductance — the all-caps forms were the only ones read, so the corpus
1637
+ * values silently fell back to the law defaults (-2 V, 1 mS).
1638
+ */
1639
+ export declare const jfetSpiceCasedParameters: string;
1640
+ /** DPDT: pole A lifts the input jack off the core, pole B lifts the output jack; the throws meet on a wire. */
1641
+ export declare const trueBypassDpdt: string;
1642
+ /** SPDT on the output only; the input jack stays tied to the core and keeps loading it in bypass. */
1643
+ export declare const hardwireSpdt: string;
1644
+ /**
1645
+ * Always-on emitter-follower buffer, then the DPDT. No latch, no JFET, one BJT: nothing
1646
+ * electronic, yet the bypass wire carries the buffer's output, so the bypass is buffered.
1647
+ * Before 2026-09-22 this derived as `hardwire` and the chain played it as a wire.
1648
+ */
1649
+ export declare const bufferedMechanicalDpdt: string;
1650
+ /**
1651
+ * Boss-style electronic switching: a cross-coupled BJT bistable toggled by a momentary contact
1652
+ * through a capacitor, its collectors biasing two JFET audio gates. Meets the four structural
1653
+ * requirements `findBistableLatches` states, so this is derived `buffered` by the latch.
1654
+ */
1655
+ export declare const flipFlopBypassLatched: string;
1656
+ /**
1657
+ * The same JFET gates driven by two BJTs that are **not** cross-coupled (an inverter chain), so
1658
+ * the latch detector finds nothing and the `buffered` verdict rests on the JFET-plus-BJTs
1659
+ * heuristic alone. Pinned so that replacing the heuristic shows up as this fixture moving.
1660
+ */
1661
+ export declare const flipFlopBypassJfetGates: string;
1662
+ /** The declared switch only grounds a status-indicator node; the audio path never sees it. */
1663
+ export declare const bypassSwitchIndicatorOnly: string;
1664
+ /**
1665
+ * A cathode-biased pentode gain stage on the generic law: 68k grid stopper, 1M leak, 470 R
1666
+ * cathode, 2.2k plate load and the screen at the 250 V rail through 1k (which drops nothing,
1667
+ * because the generic law draws no screen current). Operating point in `expected.ts`.
1668
+ */
1669
+ export declare const pentodeGainStage: string;
1670
+ /** Series 10k into a 1 H shunt: the RL high-pass twin of `rlLowPass`, same corner. */
1671
+ export declare const rlHighPass: string;
1672
+ /**
1673
+ * A three-way rotary: the common on the input, each throw a series resistor into a 1k load, so
1674
+ * every position has a distinct hand-computed gain (`selectorThreeWayGains`). Throw terminals
1675
+ * are named after the options, in option order, so name and order agree.
1676
+ */
1677
+ export declare const selectorThreeWay: string;
1678
+ /**
1679
+ * An RC core with a chip the registry does not know, declared as a class the compiler opens
1680
+ * without a model (`Circuit.DigitalSignalProcessor`): the pedal still compiles, the chip is
1681
+ * dropped with `ic-not-executed`, and the analog path around it plays. One pin on the audio
1682
+ * node, one on ground, one on a node nothing else touches.
1683
+ */
1684
+ export declare const openIcOnDeclaredClass: string;
1685
+ /**
1686
+ * The same unknown chip declared as a plain class the compiler does **not** open: the refusal
1687
+ * this pipeline gives an unidentified IC by default, so the fixture above is a deliberate
1688
+ * exception and not a hole.
1689
+ */
1690
+ export declare const unknownIcRefused: string;
1691
+ export declare const bbdClockDerivedDelay: string;
1692
+ /**
1693
+ * The same clock, steered by an LFO: `delay-tap-fractional` in `modulation` mode, which
1694
+ * `mxr-micro-flanger`, `boss-ce-5` and `boss-ce-2` ship and no fixture reached.
1695
+ *
1696
+ * A steered clock cannot state its length as one number, so `deriveBbdDelayFromNetlist` refuses
1697
+ * to pretend and the delay falls back to the declared `DelayMs` -- which is why this variant
1698
+ * carries one and the static fixture above does not. What the modulation resolution wants is
1699
+ * strict: exactly one active device steering the timing network, read at its **control**
1700
+ * terminal, because the timing node itself carries the ~40 kHz oscillator waveform and sampling
1701
+ * that would alias garbage into the delay length. Here that is `Q_LFO`'s base.
1702
+ */
1703
+ export declare const bbdClockModulatedDelay: string;
1704
+ /**
1705
+ * A PT2399 delay whose time is read off its VCO network: `delay-tap` (integer, not fractional)
1706
+ * in `clock` mode, which `pt2399-delay` and `ibanez-dl5` ship.
1707
+ *
1708
+ * Added alongside the bucket-brigade clock fixture because this is a **different derivation
1709
+ * function** -- `derivePt2399DelayFromNetlist`, which traces a series resistor chain from pin 6
1710
+ * to ground and reads the delay off the datasheet's VCO curve -- and nothing exercised it from
1711
+ * source. The two clock routes share a mode name and no code.
1712
+ */
1713
+ export declare const pt2399ClockDerivedDelay: string;
1714
+ /**
1715
+ * Linear-control VCA transfer cell (M5207L01 law contract).
1716
+ *
1717
+ * Synthetic stand-in for the TR-2 VCA stage: input jack 1 through Rin 10k
1718
+ * into the VCA input (node 3, referenced to COM), VCA output (node 4)
1719
+ * into Ro 22k to ground, control pin driven by a DC source at
1720
+ * `comVolts + controlVolts` (so Vc = controlVolts against COM). The M5207L01
1721
+ * entry models the input as inputSiemens 0.01 to COM and the gain as
1722
+ * max(0, Vc / 1 V) / 2, so with an ideal input source the hand-computed
1723
+ * voltage gain is (100 / 10100) * 0.01 * 22000 * Vc / 2 = 1.08910891 * Vc.
1724
+ * Renders of this fixture are the law's transfer proof: full, half, COM
1725
+ * offset (control referenced to a nonzero COM, the TR-2 case), and floored
1726
+ * mute. The nonzero-COM case is load-bearing: every earlier test ties COM
1727
+ * to ground, but TR-2's COM is 4.5 V and Vc = Vcontrol - Vcom is what the
1728
+ * whole tremolo depends on.
1729
+ */
1730
+ export declare const linearVcaCell: (controlVolts: number, comVolts?: number) => string;
1731
+ /**
1732
+ * Bypass-engagement contract: the switchedDivider graph (a shunt switch the signal routes
1733
+ * around, so the connectivity default is open/0) steered by control SW1, with audio.bypass
1734
+ * declaring the engaged position. The three renders differ only in the declared position
1735
+ * and, for the third, a firmware latch toggled by SW1 (which makes the control momentary).
1736
+ * See the "bypass switch default follows its declared engaged position" tests: maintained + 1
1737
+ * defaults to 1, declared 0 keeps the connectivity 0, and the latch-toggled + 1 keeps 0 with
1738
+ * a bypass-engaged-disagrees warning instead of resting "held pressed". `unresolvedPosition`
1739
+ * states a Position its Options cannot place on a throw, which reads as half travel.
1740
+ */
1741
+ export declare const bypassEngagedFixture: (engaged: 0 | 1, latchToggle?: boolean, unresolvedPosition?: boolean) => string;
1742
+ //# sourceMappingURL=circuits.d.ts.map