Next Actions
What to do next, and why. The record of what has already been tried and what it found is in Findings and Decisions Log, whose numbered items are cited from here and from the rest of the documentation.
Nothing in this project has demonstrated earthquake prediction. Every entry below is either a measurement to make or a constraint that stops one from being made.
Options that could improve the odds
Candidates ordered by expected effect on the blocking constraint below rather than by effort. Tier A buys evidence without waiting for calendar time; tier B makes a signal findable if one exists; tier C makes any eventual result believable. Tier C changes no score. It changes whether a score can be reported as a finding, and on this record that has already proved worth more than the rest: C2 retired three numbers this project had written up as results.
Done: A1, A2 (2026-08-27), A5 (2026-08-27, route closed), C2 (2026-09-04). Blocked: B3, by the same dead host as A5. Open and untried: A3, A4, B1, B2, B4, C1, C3, C4, C5.
A. Buy evidence without waiting
A1 and A2 are done. Together they multiplied era_3 held-out label
transitions by about ten with no additional calendar time, through target
design and catalog threshold alone. Measured on the same day, on the same
anchors:
| Design | Held-out transitions, era_3 |
Two-class cells |
|---|---|---|
7-day / M≥2.5, the design used until 2026-08-27 |
4 | 4 of 19 |
1-day / M≥1.5, A1+A2, in use now |
41 | 13 of 19 |
That changes what a run could demonstrate; it demonstrates nothing itself.
Run on the new design with five seeds, italy_multimodal has a 95% confidence
interval of 0.4772 to 0.5376 — chance is inside it
(log item 112).
An earlier draft of this section called the 0.502434 single-seed score "the
first 0.5 that carries weight". That was overstated and C2 disproved it.
The weight came from the transition count; the point estimate itself had an
unmeasured spread of 0.066, and 0.502434 was simply one draw near the
middle of it.
A1. Point the model path at the target design already measured as better.
Done 2026-08-27, and it found a defect on the way
(log item 110). The h1m20 table the recommendation rested
on had been built without join-vlf-image-features, so it was missing all 16
vlf_image_* columns and every VLF ablation in item 104 had been scored on file
bookkeeping rather than spectrogram content
(Target Design, MISTAKES.md). Rebuilt through the join.
scripts/build-common-transformer-fixture.sh now takes ITALY_LABELED, so
which target design a run trains on is one environment variable rather than an
edit.
A2. Establish the real magnitude of completeness. Done 2026-08-27, and the
premise was wrong in our favour. M≥2.0 was the connector default, not a
catalog floor: the INGV FDSN service serves down to M0.0, and measured
maximum-curvature completeness for Italy is Mc = 1.1 with a b-value of
0.787 over 17,196 events in 360 days. M≥1.5 sits safely above Mc and
multiplies event supply by 2.64
(Target Design for the working request shape and the
frequency-magnitude table). Caveat, unchanged and now load-bearing: Mc = 1.1
is a whole-Italy aggregate, per-cell completeness is worse in some of the 19
cells, and a threshold near Mc writes network geometry into the target.
M≥1.5 is chosen for margin.
A3. Replace the binary label with a count or rate target. Under a count target every anchor carries information even when a binary label would not flip, so the transition count stops being the sample size. Score by Poisson deviance against the same circular-shift null. Caveat: the base-rate problem returns in a new costume as "predict the per-cell mean", so it needs its own stratified control before any number is read.
A4. Score as a point process rather than as a window classifier. Model a conditional intensity over time and space and evaluate by held-out log-likelihood over events. The unit of evidence becomes the event — 13 in the week held out in log item 109 — instead of the label transition. This is the standard formulation in operational seismology and it is the cleanest exit from the transition-count trap. Caveat: the largest change on this list; new evaluation code, new null, and the fixed-cell contract retires with it.
A5. Archival backfill. Attempted 2026-08-27; the VLF route is closed
(log item 111). abelian.org no longer resolves —
SERVFAIL with no NS records from a public resolver, against NOERROR for
vlf.it — so both the retrieve.php archive and the vlf15 raw stream are
gone with the domain. www.vlf.it, which is where the live captures actually
come from, serves current images only and has directory listing disabled. The
astronomy half needed no work at all: gfz_kp_ap.csv already holds 276,576 rows
back to 1932 and f107_daily.csv 23,883 rows back to 2004, so the
"archival access unconfirmed" note this item was based on was stale. Astronomy
alone cannot extend the record, since every anchor needs a VLF capture.
The only remaining route to historical VLF is the operator — see the email
below, which this now shares a purpose with.
B. Make a signal findable if there is one
B1. Regress out the known drivers and model the residual. VLF amplitude is
dominated by diurnal, seasonal, solar (F10.7) and geomagnetic (Kp, Dst)
terms. Fit those first, model what is left. This also dissolves the date-proxy
problem: astronomy stops being a classifier input, where five channels correlate
above 0.6 with anchor index, and becomes a nuisance regressor, where that
correlation is exactly what you want it to have
(Astronomy Alignment).
B2. Compute the observables the literature actually claims, not a generic anomaly score. The published candidates are terminator-time shift — the timing of the sunrise and sunset minima on a named transmitter-to-receiver path — nighttime amplitude fluctuation, and trend residual. All three are path-specific. The current pipeline scores whole-frame anomaly, which is not the same quantity. Caveat: requires identifying which spectrogram column belongs to which transmitter.
B3. Move from rendered JPGs to raw samples. Blocked as of 2026-08-27 — the
vlf15 Ogg stream was hosted on abelian.org, which no longer exists
(log item 111). The reasoning still holds: palette-quantized
pixels are the reason the record is split into eras at all, and raw samples
would stop that mechanism for everything captured after. There is simply no
endpoint to get them from. Reopening this needs the operator, or new hardware
(B4).
B4. Add a second receiver. One station cannot separate a local RFI change from an ionospheric one, and it has no spatial resolution at all — the fixed-cell target asks a single-point sensor to say where. Two separated receivers permit common-mode rejection. Caveat: outside this repository, and dependent on another operator or on new hardware.
C. Make an eventual result believable
C1. Add ETAS as the baseline. There is no ETAS or Omori model anywhere in
the repository. The controls in use are historical rate and climatology; the
field-standard bar is aftershock clustering. The transfer trial already loses to
a historical-rate control (0.671167 against 0.69222), so ETAS is a harder
bar — but it is the bar a result would have to clear to mean anything. The
stronger variant: make the ETAS residual the target, so trivially
predictable clustering is removed and VLF is asked only about what ETAS cannot
do.
C2. Report seed ensembles with an interval. Done 2026-09-04, and it
retired three earlier numbers. run-cross-region-generative-smoke.sh now
takes SEEDS and defaults to five; the evaluator already looped over --seed,
so this cost nothing but run time. Five seeds on identical data spread
0.475160 to 0.541439 — mean 0.507415, 95% CI 0.4772 to 0.5376,
which contains chance. The single-seed values reported in items 107, 109 and 110
(0.513960, 0.500000, 0.502434) all sit between the 40th and 60th
percentile of that spread (log item 112). A single-seed
transformer score on this data is not a result, and two of the three had been
written up as though it were.
C3. Shrink the model that makes the claim. At tens of transitions a transformer cannot be justified on evidence. A logistic model or gradient-boosted trees over a handful of B1 and B2 features would score no worse and would fail interpretably. Keep the transformer for representation learning; put a small model on the head of anything reported.
C4. Pretrain on the unlabeled stream with a forecasting objective. Labels are the scarce resource; VLF frames are not. Next-interval spectrum prediction, or contrastive matching across time, uses the entire record regardless of event supply. Caveat: representation quality cannot be checked without labels, so this improves the odds without producing a result.
C5. Pre-register before the transitions accrue. There will be one first look at a low-hundreds transition count, and every design, threshold and ablation choice made after seeing it spends the claim. Write the design, metric, null and decision rule down now, and record how many variants have already been tried.
The blocking constraint
Held-out label variation, not features, model capacity, or CPU time.
The fixed-cell target uses 30-minute anchors against a multi-day horizon, so consecutive target windows for one cell overlap by more than 99% and the rows inside a cell are near-copies. The honest sample size is the number of times a cell's label changes between consecutive anchors, and every report now prints that count before any score (log item 103, Target Design).
Current counts, held out:
Measured 2026-09-04, era_3, by ./scripts/count-label-transitions.sh:
| Partition | Transitions | Two-class cells |
|---|---|---|
1-day / M≥1.5 (current design) |
41 | 13 of 19 |
7-day / M≥2.5 (design used until 2026-08-27) |
4 | 4 of 19 |
era_0 (2026-06-28 to 2026-07-06) |
1 | 1 of 19 |
At 41 a swing of ten points is still noise, and the two capture eras cannot be
pooled because a 17.9 dB receiver-level step separates them
(log item 96, Cumiana Colour-Scale Change).
No modality can be tested until this number reaches the low hundreds inside a
single era.
This is no longer purely a matter of calendar time. Until 2026-08-27 that
claim was made against a design carrying 2 held-out transitions in era_3;
changing the horizon and the magnitude threshold moved it to 31 in an afternoon
(log item 110). Waiting is still the largest remaining lever,
but options A3, A4 and A5 above have not been tried and each one addresses this
constraint directly.
How much calendar time. The 2026-08-27 projection has now been checked
against eight days of outturn and it holds: it predicted 1.09 held-out
transitions per day and the record delivered 1.25, taking era_3 from 31 to
41. Extrapolating from 41 at the observed rate:
| Held-out transitions | Reached around | If the old 7-day / M≥2.5 design had been kept |
|---|---|---|
| 100 | 2026-10-21 | 2026-12-14 |
| 200 | 2027-01-14 | 2027-05-04 |
This assumes era_3 stays unbroken. A collector outage or a third palette
variant starts a new era and resets the count.
This assumes era_3 stays unbroken. A collector outage or a third palette
variant starts a new era and resets the count, which is why the palette check
below is run after every refresh rather than occasionally.
Now
- Keep collecting.
elfquake-prospective.timerevery 30 minutes for VLF and INGV,elfquake-space-weather.timerdaily for the geomagnetic and solar archives,elfquake-japan-vlf.timerfor the research-only Japan track. This is the only action that moves the blocking constraint. - Write to the Cumiana operator. This is now the highest-value single
action available and it carries three questions, not one. (a) Did receiver
gain change between 2026-07-06 and 2026-07-11? Images alone cannot separate a
front-end gain reduction from a quieter ionosphere
(log item 105(c)). (b) Does any archive of past
spectrograms exist?
abelian.orgis gone andvlf.itserves current images only, so this is the only remaining route to historical VLF and therefore to A5. (c) Are raw samples available in any form? Thevlf15stream died withabelian.org, and raw samples are what B3 needs to end the capture-era problem (log item 111). - Re-run
./scripts/diagnose-vlf-palette-shift.shafter each capture refresh. A third palette variant would split the record again. - Re-run the fixed-cell evaluation through the
elfquake-fixed-cell-evaluationskill when one era reaches held-out transitions in the low hundreds — and not before. The skill pins the as-of and catalog-end stamps so a run is reproducible.
After each data refresh
Run these, and read the caveat attached to each.
| Command | Caveat |
|---|---|
./scripts/run-real-transfer-trial.sh |
Seismic-history baseline; VLF and astronomy enter as missing masks. Currently 0.671167 against a 0.69222 historical-rate control — below its own control. |
./scripts/evaluate-italy-spatial-baseline.sh |
Set STRATIFY_FIELD=target_cell_id. Pools both capture eras, so its VLF features are not on one scale; cite the per-era numbers instead. |
ERA_START=2026-07-28T08:51:25Z ./scripts/count-label-transitions.sh <labeled.csv> |
The count that must precede any score. refresh-prospective-labels.sh now prints it for both designs at the end of every refresh. |
./scripts/report-italy-data-coverage.sh |
Warns if the anomaly scores predate the catalog. |
./scripts/run-transfer-experiments.sh |
Compares historical rate, real-only init, synthetic transfer, and rolling-origin folds. |
A script that reads a derived model artifact now checks its age against the event catalog first (Input Freshness). A score that reproduces to six decimal places across a refresh is a staleness signal, not a stability result.
refresh-prospective-labels.sh now also builds both spatial labeled tables.
Until 2026-09-04 it built neither, so the table every fixed-cell evaluation
reads was 13 days stale while a guard watched it — a guard on a file nothing
writes only reports the decay it cannot prevent
(log item 113).
Also run systemctl list-units --all | grep elfquake. On 2026-08-27 two of
the three timer-driven collectors were sitting in failed state and neither had
surfaced anywhere — not in the docs, not in the freshness guard, not in any
evaluation. The guard compares derived artifacts against the event catalog; it
cannot see a collector that stopped, because the file it would check is the one
that stopped being written (log item 111).
Rules for reading any result
- Print the transition count before the score. A balanced accuracy without
it is not interpretable.
./scripts/count-label-transitions.shprints it, and the refresh runs it automatically. - Never quote a single-seed transformer score. Five seeds on identical data
spread
0.475160to0.541439. Three numbers written up as results in this log —0.513960,0.500000,0.502434— were draws from that one spread (log item 112). RunSEEDS, report the mean and interval. - Name the climatology pool alongside the distance. The same coordinate
result scored
57.8%against a target-matchedM≥1.5pool and73.7%against the deeperM≥2.0history. The pool is part of the number. - Use the circular-shift null, not a timestamp shuffle. The shuffle carries up to a hundred times the evidence of the run it is meant to control and is not a null (Within-Cell Null Control).
- Check the coordinate control. Removing the two cell-coordinate columns has
so far collapsed the fixed-cell model to exactly
0.5, which means the score was per-cell base rate. - Check astronomy channels for date proxying. Five of them correlate above
0.6with the anchor index over the current record, so under a time-based split they approximate an indicator for which side of the split a row is on (Astronomy Alignment). - Do not pool capture eras for anything derived from Cumiana pixel colour.
- Time-based validation only. Training data must precede validation data.
Held open, no action available
- Per-cell rate residual and single-regional-target designs. Two candidate replacements for the fixed-cell contract. Both need enough label variation to tell them apart, so neither can be tested yet (log item 103).
- Japan cross-region training. 9 VLF-observed windows against 124 missing. Interface checks pass; there is nothing to train on. Research-use-only terms apply to all ISEE data.
- Synthetic precursor search. Delayed-failure damage, two-stage maturation, per-receiver readouts, and a bounded stress reservoir have each failed their causal confirmation gates. Do not tune scalar parameters further without a stronger mechanism (log items 55-62).
Where things are written up
| Concern | Document |
|---|---|
| The numbered record | Findings and Decisions Log |
| Target contract and evidence counting | Target Design |
| The matched null control | Within-Cell Null Control |
| Capture-era split and the dB step | Cumiana Colour-Scale Change, Capture-Era Shift |
| Astronomy channels and alignment | Astronomy Alignment |
| Stale-input defects and the guard | Input Freshness |
| Mistakes and their prevention | MISTAKES.md |