The SMK plugin system provides a clean extension point for adding forensic analysis modules without modifying the core pipeline. Plugins are auto-discovered fromDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/deskiziarecords/QUIMERIA-HYPERION/llms.txt
Use this file to discover all available pages before exploring further.
PLUGIN_REGISTRY on server start, run on every bar after the core step() completes, and append their results to the sensors[] array in the step result dict. The frontend’s six forensic sensor bars consume these rows directly over the WebSocket.
The SMKPlugin base class
All plugins must subclassSMKPlugin, which is defined in backend/plugins/__init__.py. The base class handles warmup tracking, enabled/disabled state, and the bar counter. Subclasses implement one method: update().
The
update() method is wrapped by on_bar() in the base class, which enforces warmup counting and calls update() only after requires_warmup bars have been seen. If your plugin is not firing on early bars, this is expected behavior.Plugin contract rules
- Return only plain Python types:
int,float,bool,str,list,dict. Never returnnp.float32,np.int64, or any numpy array — these will break WebSocket JSON serialization. - Always include
score(orscore_norm) andactivein the return dict. Theto_sensor_rows()method inPluginManagerreads these keys to build frontend sensor rows. - The
smkargument gives read-only access to the full step result. Use it to readsmk['veto'],smk['fusion'], or any layer output.
PLUGIN_REGISTRY
The registry inbackend/plugin_manager.py is the single source of truth for which plugins load. Each entry is a (module_path, class_name) tuple:
PluginManager will import the module and instantiate the class on next server start.
Auto-discovery on server start
PluginManager.load_all() iterates over PLUGIN_REGISTRY and calls importlib.import_module() for each entry. Failed imports are caught, logged to _errors, and skipped — the server never crashes if a plugin’s optional dependencies are missing.
get_plugin_manager() is called from smk_pipeline.py:
How plugins integrate with step()
After the core pipeline finishes all Ring 0 checks, the plugin layer runs insidestep():
mgr.run() calls each enabled plugin’s on_bar() method and collects results into a dict keyed by plugin.name. mgr.to_sensor_rows() converts those results into the standard sensor row format and appends them after the 19 built-in SMK sensor rows:
Built-in plugins
Six forensic plugins ship with QUIMERIA-HYPERION, all auto-discovered viaPLUGIN_REGISTRY:
| Sensor ID | Plugin name | Layer | Detection capability |
|---|---|---|---|
| p01 | MarketRhythm | L3-ext | Spectrogram tempo analysis, λ₃ harmonic harmony scoring, Shazam-style audio fingerprinting of OHLC rhythm |
| p02 | MarketHeuristic | L3-ext | Stop-hunt wick detection, volume spike scoring, entropy-based threat score (AV-style heuristic) |
| p03 | MarketVision | L2-ext | SIFT keypoint extraction, ORB descriptor matching, Smith-Waterman sequence homology on price structure |
| p04 | MarketSeismology | L3-ext | P-wave / S-wave / Surface wave classification on OHLC velocity and acceleration profiles |
| p05 | FileCarvingEngine | L2-ext | Support/resistance level clustering (DBSCAN), accumulation zone identification |
| p06 | SignatureScanEngine | L2-ext | Entropy regime classification, 14-pattern signature database matching |
Adding a new plugin
Restart the server
The plugin is loaded on startup by Confirm it loaded by checking the startup logs for
PluginManager.load_all(). After restarting:[PLUGIN] Loaded: L4-ext MyPlugin or by querying GET /api/plugins.