# Circuit simulation record

Updated 18 October 2026. This is an independent educational circuit study. No hardware
was powered or measured. Results do not establish product performance, bench
acceptance limits, fault isolation or safety.

The local player uses **9 DC operating points, 9 AC sweeps and 81 nonlinear
transient runs** calculated with the official ngspice 45.2 source distribution
(the executable prints `ngspice-45`). The browser selects saved cases and
animates their results. It does not run a SPICE engine in JavaScript, and does
not interpolate or invent additional circuit configurations.

The connection authority is the pinned
[MostlyBuilds KiCad reconstruction](https://github.com/MostlyBuilds/microphone-activator),
commit `a41f27b773d3bbb2653ae5907460e5cf38217a87`.
`scripts/build_circuit_manifest.py` compiles every component, nominal passive
value, numbered terminal, source pad position and net into
`web/assets/circuit-manifest.json`. The solver compiler in
`scripts/circuit_reference.py` uses this manifest for passive values and all
four JFET section connections. The explicit SOIC terminal functions follow the
linked manufacturer pin map. Source net 1 is SPICE ground; source net 0 means
unconnected, including the four substrate pads, and never becomes ground.
The source selected grade remains C, despite the PCB's stale B labels.
Tolerance, component ratings and purchasing SKU remain null where the source
does not supply them. Mesh identities select visual parts; geometry overlap
never creates an electrical connection.

The device parameters come from [Linear Systems' LSK389 product page](https://www.linearsystems.com/jfet-amplifiers-duals/lsk389-series),
the linked [Rev 2 model dated 18 May 2026](https://www.linearsystems.com/_files/ugd/4be30b_3b75f40e1a364550ac5a47dd56b4eff6.pdf),
and the [LSK389 datasheet](https://www.linearsystems.com/_files/ugd/7e8069_c90834b817214602abcbf263293295f2.pdf).
The model is adapted to ngspice's level-1 NJFET implementation. VTO, BETA,
LAMBDA, RD, RS and depletion-capacitance values retain the vendor values.
**ISR, NR, ALPHA and VK are omitted** because ngspice level 1 does not implement
them. The simulation does not model breakdown, gate recombination, noise,
temperature changes, device mismatch or component tolerances. See the
[ngspice manual, JFETs and analyses](https://ngspice.sourceforge.io/docs/ngspice-manual.pdf).

The external receiving interface is an assumed test fixture:

- Supply selections: 0, 24 and 48 V, each with matched 6.81 kΩ feeds.
- Differential load: 1.5, 3 or 10 kΩ, AC coupled through two ideal 47 µF
  capacitors, with 1 GΩ DC reference paths. The coupling capacitors are outside
  the booster and are not additions to its source BOM.
- Balanced microphone source: two 75 Ω legs, 150 Ω differential. This is a
  resistive source model; it does not model the SM7B capsule or transformer.
- Tone: 100 Hz, 1 kHz or 10 kHz. Open-circuit differential source peak: 0.5 mV,
  5 mV or 200 mV. The loaded PCB input is measured separately.
- Temperature: 27 °C. Identical device sections and ideal nominal passives.

Each transient first computes the DC operating point, then integrates six
cycles, retaining the full native 0–6-cycle record. The displayed excerpt stays
at exactly cycles 3–6; it does not move to the first available sample. The
integration maximum step is 1/192 cycle. Every displayed time is bracketed by
native solver samples, and resampling rejects a missing bracket or an
interpolation factor outside [0,1]. The viewer receives 513 uniformly resampled
points per trace. The time cursor
starts at the beginning of this retained periodic excerpt, not power-on.
The display uses separate input/output voltage scales and a common time axis.
DC output voltage is shown separately from differential output audio.

The cursor reads signed differential input and output at a common elapsed
time, using linear interpolation between these saved samples. Comparisons
retain the actual four-cycle durations: a 100 Hz excerpt lasts 40 ms, a
1 kHz excerpt 4 ms, and a 10 kHz excerpt 0.4 ms. A cursor can reach the full
longer excerpt. A shorter trace reports Outside trace after its endpoint;
the display does not repeat, stretch or extrapolate it. DC component probes
remain operating-point readings, separate from this transient instrument.

The waveform CSV keeps each displayed case's 513 saved display samples with elapsed
time relative to its retained excerpt, rather than regridding a comparison.
Those display samples are interpolated from the denser native solver record;
they are not the engine's integration timestamps.
Its six channels match the saved trace order: differential PCB input,
differential output, hot and cold output-leg voltages including DC, and Q2A
and Q2B drain currents. Headers include units. Engine, source revision,
device-model SHA-256, temperature and selected settings accompany each row,
along with an explicit calculated-study / hardware-unmeasured label. This
export is separate from the blank physical measurement log and adds no
new simulation or bench evidence.

The gain meter is the ratio of fitted output/input fundamentals for the
selected transient. H2–H5 is the RMS sum of harmonics 2–5 relative to the
fundamental, derived from the resampled periodic waveform; it is not THD+N,
an unbounded-bandwidth distortion measurement, or a physical analyzer result.
The AC chart uses a separate 20 Hz–100 kHz sweep, linearized at the DC point.

At 48 V, 3 kΩ and 1 kHz with a 5 mV source, the model calculates about 23.5 dB
fundamental gain, 70.8 mV output peak, 6.00 mA total phantom draw, and 27.57 V
DC on each output leg. These are reproducible results of these assumptions,
not measurements or promises for a DIY assembly or a production CL-1.

`evidence/simulation-checks.json` records all completed runs and a worst-case
DC supply/return KCL residual below 0.5 nA. The original decks, numeric output
and logs are retained under `evidence/simulation-runs/`. The runtime dataset is
`web/assets/simulation/runs.json`. Device model text is SHA-256 recorded there.
The 18 October regeneration saved all native transient Q2A/Q2B current vectors
explicitly. Earlier exports repeated a final-state scalar for those two
channels; the corrected current traces vary with the solved signal. Full
native records are kept and checked against every displayed sample. Native
deck, operating-point, AC and transient files have recorded SHA-256 identities.

The pre-correction scripts, player data and 90 native run records were preserved
in `evidence/updates-2026-10-18/simulation/before-resampling-fix.tar.gz`, with
per-file and archive hashes alongside it. The independent verifier now checks
the 81 transient cases against 95,975 native time records, rejects extrapolation, checks
time-varying current vectors and inspects all 90 native logs. The nominal
48 V / 3 kohm / 1 kHz / 5 mV case was also rerun at half the maximum integration
step: fitted gain changed by 1.35e-8 relative, and the largest displayed output
sample changed by 5.06 microvolts, 0.00714% of output peak. This is one nominal
numerical-stability check, not a full stability or hardware validation matrix.

## Bounded R1 assembly and repair cases

`web/assets/simulation/assembly-cases.json` contains 16 native-calculated
electrical states for the first assembly exercise. The fixed fixture is
48 V, 3 kohm differential receiving load, 150 ohm differential source,
1 kHz, 5 mV open-circuit source peak and 27 C. Other components remain
preassembled. Each R1 lead can be connected or open, R1 can be 39 or a deliberately
wrong 390 ohm value, and a bridge can be absent or present. All combinations
are calculated individually. The source terminals are R1.1 on net 10 and R1.2
on GND, and a bridge is an explicit 0.1 ohm path between those nets. Each open
lead is split from its PCB pad with a stated 1 Tohm leakage path to avoid an
entirely floating solver island.

Each case stores a canonical state signature, full hashed deck, convergence
status, DC node/current records, 1 kHz AC result and six 513-sample transient
channels with the same strict native time brackets. Repair selects the same
complete electrical signature as the intact reference. An unsupported state
has no calculated result. The solver has no knowledge of cursor gestures,
flux chemistry, solder appearance or temperature: these select a disclosed
joint abstraction, rather than predicting metallurgy. The recorded
`assemblyReturnPathOhm` describes the explicit R1/bridge branch only; it is
not a simulated DMM reading across the complete circuit.

The nominal case agrees with the original reference to 7.92e-9 relative in
fitted gain and 0.00222% in output peak. Opening either R1 joint removes active
gain; the 390 ohm substitution changes gain from 23.454 to 18.326 dB and total
phantom draw from 6.000 to 1.224 mA. The bridge changes gain to 16.683 dB and
draw to 9.630 mA. These are results of the bounded model, not physical fault
signatures or safe acceptance limits. The independent fault verifier checks all
16 netlists, KCL, JFET equations, native logs and 18,896 native time records.

Electron and conventional-current overlays follow 11 connected copper/pad/pour
routes, with 7 explicitly illustrative paths across devices. The ground-pour
route is a possible path through connected copper, not a finite-element
current-density solution. Device interiors are dashed teaching paths; the die
has not been reconstructed. Electron motion reverses the conventional current
direction. Its speed, spacing and size are enlarged and time-scaled, and do not
represent microscopic trajectories, carrier count or signal propagation speed.
The distinction between drift and signal propagation follows the discussion in
[OpenStax University Physics, conduction in metals](https://openstax.org/books/university-physics-volume-2/pages/9-2-model-of-conduction-in-metals).
AC mode oscillates local gate markers with opposite phase. It does not send a
particle from a microphone gate through the reverse-biased gate junction to the output.

Rebuild with an installed ngspice 45.2 executable:

```sh
python3 scripts/extract_kicad.py
python3 scripts/build_flow_layout.py
python3 scripts/build_circuit_manifest.py
python3 scripts/build_simulations.py --ngspice /path/to/ngspice
python3 scripts/build_assembly_cases.py --ngspice /path/to/ngspice
python3 scripts/verify_circuit_manifest.py
python3 scripts/verify_simulations.py
python3 scripts/verify_assembly_cases.py
python3 scripts/verify_simulation_stability.py --ngspice /path/to/ngspice
node scripts/verify_waveform_cursor.mjs
node scripts/verify_bench_study.mjs
```

For this run, the official 45.2 source tarball was compiled in a temporary
directory. The retained native executable was reused for the 18 October
regeneration. Its version output is `ngspice-45`; the source archive's top-level
directory and NEWS identify release 45.2, while configure also retains 45.
Source-archive and executable hashes plus exact version output are preserved
in `evidence/updates-2026-10-18/simulation/engine-provenance.json`. No global
package was installed. Xcode 27.1's C++ compiler required
`-Wno-invalid-specialization` for ngspice's bundled cppduals header. This does
not change the JFET equations. The runtime player needs only the saved data,
local JavaScript and WebGL for its optional 3D model.
