mne-source — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited mne-source (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Source (inverse) modeling of neurophysiology data via the MNE MCP server. This skill is skeptical by design: the inverse problem is ill-posed — many source configurations explain the same sensor data — so every estimate depends on choices (head model, covariance, regularization, method) that all run without any error and silently shape "where" the activity is. The single biggest trap is a quantitative source claim resting on a template head with no individual MRI — so the discipline is to grill the model before computing and critique the localization before believing.
Companion skills:mne-mcp-guardfor technical execution safety;mne-methodology-criticfor Phase 3. Loaded objects persist in one MNE session. Source tools need the `[full]` extra (nibabelfor the forward model,pyvistafor rendering).
Do not build a forward model or apply an inverse until these are answered. If the user can't answer one, propose a sensible default and explicitly flag the open risk — never silently choose.
The question that decides validity
template head. That makes any source estimate exploratory / qualitative: it cannot support a quantitative anatomical claim ("the generator is in left BA44"). Quantitative localization needs an individual MRI + BEM + co-registration. (This is the single most common fatal overreach here.)
Geometry & co-registration
montage on a template)? Nominal positions add localization error on top of the template-head error.
uncertainty) and is more easily overinterpreted than MEG.
Noise covariance (drives the whitening — get it wrong and the map is wrong)
it stably (rank!)? Was the data rank-reduced by average reference / interpolation / ICA — and does the covariance reflect that rank?
Inverse method & regularization
mixed-norm (sparse)? Each carries a different bias — and ⚠️ MNE/dSPM have a depth bias (superficial sources favored); sLORETA/eLORETA reduce location bias; beamformers assume uncorrelated sources.
unjustified value is a hidden free parameter.
The spatial claim & inference
Template-head EEG cannot license gyral-level claims.
dependent → no single-vertex/single-time claim without correction. Plan cluster-based permutation in source space, not per-vertex thresholding.
mne_check_status (confirm the [full] extra: nibabel, pyvista);review the evoked/epochs you will invert (mne_plot_evoked / mne_describe) — a clean, baselined evoked with a sensible reference and montage is the prerequisite for a meaningful inverse.
# epochs already in the session; baseline = up to t=0
noise_cov = mne.compute_covariance(epochs, tmax=0.0, method="auto", rank="info")(Structured form: mne_compute_noise_cov(name="epochs", tmax=0.0, cov_name="noise_cov"). rank="info" respects rank loss from average reference / interpolation / ICA.)
# template-head EEG forward for the object's montage (fsaverage BEM)
# -> estimates are EXPLORATORY; no individual MRI / co-registration(Structured form: mne_make_forward(name="evoked", fwd_name="fwd") — fetches fsaverage on first use.)
inv = mne.minimum_norm.make_inverse_operator(evoked.info, fwd, noise_cov)
stc = mne.minimum_norm.apply_inverse(evoked, inv, lambda2=1.0/3.0**2, method="dSPM")(Structured form: mne_apply_inverse(evoked_name="evoked", fwd_name="fwd", cov_name="noise_cov", method="dSPM", snr=3.0, stc_name="stc"). Try sLORETA/eLORETA to check depth-bias sensitivity.)
mne_run_code when appropriate: from mne.beamformer import make_lcmv, apply_lcmv
data_cov = mne.compute_covariance(epochs, tmin=0.0, tmax=0.3) # active window
filters = make_lcmv(evoked.info, fwd, data_cov, reg=0.05, noise_cov=noise_cov)
stc_lcmv = apply_lcmv(evoked, filters) # uncorrelated-source assumption(DICS: make_dics on a CSD from csd_morlet. Sparse: mne.inverse_sparse.mixed_norm.)
template-head caveat: mne_plot_source_estimate(stc_name="stc", hemi="both", time=None) — read the PNG, then archive the equivalent code + figures (the mne-analyst archiving convention).
Best-practice reminders: baseline-correct and choose the reference before inverting; estimate covariance with the correct rank; always state the template-head / exploratory caveat; compare methods (dSPM vs sLORETA) rather than trusting one map.
Hand the model + result (head model, co-registration, covariance source, method, λ²/SNR, the spatial claim) to `mne-methodology-critic` (invoke the skill, or dispatch it as a subagent with references/methodology-checklist.md). For source work it will specifically check:
co-registration** is exploratory — WARN, or FAIL if stated quantitatively (gyral/Brodmann claim);
neighbours are dependent → cluster-based permutation in source space, not per-vertex;
Report its BLOCK / REVISE / PASS verdict to the user and act on it before stating where the activity is.
See references/source-methods.md for deeper recipes (covariance & rank, BEM/template vs individual MRI, MNE/dSPM/sLORETA/eLORETA depth bias, LCMV/DICS, mixed-norm, and source-space inference choices).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.