# MAP — ModuLisp repo inventory ``` modulisp/ ├── meson.build # project root: useq_utils → useq_devtools → useq_signal_engine static libs ├── library.properties # Arduino library manifest (ModuLisp 0.1.0, includes=src/signal_engine/signal_engine.h) ├── src/ │ ├── pch.h # precompiled header (std includes) │ ├── modulisp/ │ │ └── lisp/symbol_intern.h # header-only symbol interning table │ ├── signal_engine/ # 12 .cpp + 13 .h + symbols.def │ │ ├── token.{h,cpp} # tokenizer │ │ ├── cell_store.{h,cpp} # S-expression cell arena │ │ ├── node_pool.{h,cpp} # fixed-pool DAG node storage + traversal │ │ ├── graph_builder.{h,cpp} # cell graph → node DAG compiler │ │ │ # (resolve_hardware_input consults ext_registry first) │ │ ├── compiler_pipeline.{h,cpp} # source → tokens → cells → DAG orchestration │ │ ├── cold_eval.{h,cpp} + eval_ops.h # constant folding / cold evaluation │ │ │ # (top-level sink forms + cold commands dispatch here) │ │ ├── executor.{h,cpp} # tick-time DAG executor │ │ │ # (+ publish_sink_values post-tick publication) │ │ ├── ext_registry.{h,cpp} # generic named external-input/sink/command registries │ │ │ # (firmware profile seam; no nn/* or midi/* builtins) │ │ ├── state_registry.{h,cpp} # defstate slots, live-edit slots │ │ ├── synth_registry.{h,cpp} # synth graph snapshot registry │ │ ├── synth_graph.{h,cpp} # serialisable synth artefact graph │ │ ├── diagnostics.{h,cpp} # health/persistent-output diagnostics │ │ ├── signal_engine.h # umbrella header │ │ ├── types.h, build_profile.h # shared types, build tuning knobs │ │ └── symbols.def # builtin symbol catalogue (X-macro list) │ ├── utils/ # string.{h,cpp}, common.{h,cpp}, itoa.{h,cpp}, log.{h,cpp}, │ │ # json_builder.h, json_cursor.h, dtostrf.h, serial_message.h, │ │ # time.h, compiler_config.h │ ├── devtools/ # devtools.{h,cpp} — USEQ_DEVTOOLS-gated telemetry │ └── ports/ # IStorage.h, II2CTransport.h, mocks/{MockStorage.h,MockI2CBus.h} └── test/ ├── meson.build # 18 Catch2 executables, fresh file ├── catch.hpp # vendored Catch2 v2 (from src-useq/test/catch.hpp) └── signal_engine/ # 18 test .cpp (host-only subset; exclusions in README.md) ``` External-register seam (NISPS-USEQ spec §3, generic mechanism only): `ext_registry.{h,cpp}` holds firmware-profile registrations for named external inputs, external sinks, and cold commands. `graph_builder` resolves registered input names before the builtin board inputs; `cold_eval` binds registered sinks with ordinary top-level assignment (channels publish as pool output slots ≥ SINK_SLOT_BASE, so per-sink LKG rides the existing GraphMutationTransaction machinery) and dispatches registered commands to the installed handler after the submission's earlier forms compiled. `executor::publish_sink_values` writes `SignalEngine::sink_values` / `sink_dirty` per tick for the firmware to poll. Build artifacts: `build/` (meson/ninja). 3 libs + 18 test executables.