# ENSOFORECAST historical model maps: review edition 0.3.2

**Methods and data descriptor.** Status: public research edition 0.3.2, published 25 October 2026 by Christopher Geneth Kurg. Originally prepared 22 October 2026. Not deposited, no DOI, not reviewed by the archive's creators or by peers.

## Summary

ENSOFORECAST holds monthly tropical-Pacific sea-surface temperature (SST) anomaly forecasts made at Lamont-Doherty Earth Observatory (LDEO) with the Zebiak–Cane coupled model, at nominal leads of 3, 6, 9 and 12 months, for two product sets labelled LDEO1 and LDEO2, plus an observed-anomaly file. The archive was served by the Columbia IRI Data Library. In October 2026, during the library's wind-down, Aaron Kaplan (IRI) transferred the full directory to Vultax. This edition documents the nine catalogued core files, checks every time axis and missing-value mask, decodes 18 illustrative slices (two target months; observations and all 16 model/lead combinations) and records what is known about when the fields were made. No source value has been changed; the original binaries are preserved privately.

## Source objects and credit

| Object | Role | Credit |
|---|---|---|
| Zebiak–Cane coupled model | Produced the forecasts | Stephen E. Zebiak and Mark A. Cane, *Monthly Weather Review* 115 (1987) 2262–2278, doi:10.1175/1520-0493(1987)115<2262:AMENO>2.0.CO;2 |
| LDEO1 and LDEO2 products | Forecast fields | Lamont-Doherty Earth Observatory climate group. The 1996–1997 bulletins use "LDEO2" for the improved initialization of Chen et al. (1995), *Science* 269:1699–1702; that the archive's LDEO2 files are that system is not established (evidence ledger E4) |
| ENSOFORECAST catalog entry and hosting | Custody and documentation | Columbia IRI Data Library ([catalog description](https://github.com/iridl/dlentries/blob/master/descriptions/ensoforecasts.html); [entries](https://github.com/iridl/dlentries/tree/master/entries/ENSOFORECAST)) |
| Transfer `ENSOFORECAST.tgz` | Source of every value | Assembled and sent by Aaron Kaplan (IRI), 21 October 2026. MD5 `1e8b1b29f8e77697fbdbc90d3ca168ac` (matches sender); SHA-256 `ee0e93452bafaa08e64ade880c5b548d389d0653099be6e8b19de79e112037c7`. 49 regular files. |
| This edition | Decoding, checks, documentation, explorer | Vultax Research. Not to be confused with the creators above. |

Do not attribute model authorship, affiliation or endorsement to anyone by name matching. In particular, an "A. Kaplan" who co-authored ENSO predictability papers with Cane (for example Chen et al., 2004) is not evidence about Aaron Kaplan's role here, which is the transfer.

## The nine documented core files

`data/ossta.cdf` (observations, 338 months) and `data/fc03mon.cdf`, `fc06mon.cdf`, `fc09mon.cdf`, `fc12mon.cdf` (LDEO1) and `fc2_03mon.cdf`, `fc2_06mon.cdf`, `fc2_09mon.cdf`, `fc2_12mon.cdf` (LDEO2). Byte sizes, SHA-256 and target ranges are in `data/core-file-manifest.json`. All are classic netCDF with a 42 × 30 grid (4° longitude from 124°E to 288°E, 2° latitude from 29°S to 29°N, cell centres), variable `ssta`, missing value `-999`, and a time axis `T` in Ingrid "monthtime" (months since January 1960; half-integer values).

The other 40 files in the transfer are not identified, not described here and not shared. Their presence in the directory does not establish their source, meaning or terms.

## Methods

1. **Reading.** The transfer is read in place with Python's `tarfile`; members are addressed by exact name and never extracted to disk. A minimal classic-netCDF reader (`netcdf_core.py`) parses headers and coordinates. No source program is executed.
2. **Time.** Each `T` value *v* maps to month index `round(v − 0.5)` after January 1960. Labels are target (verification) months, as the catalog states. The validator checks every axis is monthly, contiguous and duplicate-free.
3. **Masks.** Values equal to `-999` or non-finite become `null`. Valid cells are recomputed for every month of every file. There is exactly one mask: the same 1,077 cells are valid in every month of all nine files (ledger E11; the indices' SHA-256 is in `data/coverage.json`, and the source validator checks every month against it).
4. **Coverage.** All nine files share 316 target months (1972-01 to 1998-04). Each model/lead file overlaps the observations for 316–338 months (`data/coverage.json`).
5. **Displayed slices.** For targets 1982-12 and 1997-12, the observed field and all 16 model/lead fields are decoded and rounded to three decimals for display (`data/enso-example-maps.json`). The validator compares every displayed value with the source floats at that rounding.
6. **Equatorial profile.** Mean of the 1°S and 1°N rows where both are valid. Not an official Niño index.
7. **Evidence classes.** Observation; Retrospective (1982 model fields, inferred from the model chronology); Issue time unverified (1997 model fields). See `data/evidence-ledger.json` for each claim, its status, its source and what it does not show.

## What the fields are, and when they were made

- The catalog says each field lag-averages forecasts from six consecutive monthly initial conditions and is then corrected by singular value decomposition (ledger E2).
- LDEO's own 1996–1997 bulletin articles count a nominal lead from the latest of the six starts (E3). Under that convention a December 1997 field at 12 months blends starts from July to December 1996. The archive does not state its convention.
- In December 1997 the authors called the improved initialization "LDEO2", issued since the latter half of 1995 (E4). The archive does not say its LDEO2 files are that system. Even if they are, a first public issue date does not show when experimental fields were first generated, so no field is classed as retrospective on that basis; the bulletin dates define context phases only (`EVALUATION-PROTOCOL.md`), and the exact first issue month is not documented.
- Cane and Lee (2013, p. 72) date the first real predictions to early 1986, so fields for target months up to 1985-12, including the 1982 fields, are retrospective (E5). The inference is by target month: a field started in late 1985 for a 1986 target could have been a real forecast, so fields for targets from 1986 onward are issue time unverified.
- In September 1997 the authors reported that both versions were starting from eastern-Pacific anomalies well below those observed and had handled the 1997 event less well than earlier ones (E6). That is consistent with the weak 1997 warming in the archive but does not show the archived fields are the issued ones (E7, unverified).
- Unknown: the anomaly reference period (E8), the observation product and its vintage (E9), the SVD training period, and whether fields were written as issued or regenerated later.

## Technical validation actually performed

Run on 22 October 2026 with `python3 validate.py --source-tgz …/ENSOFORECAST.tgz`. Result `PASS`, `ALL_NINE_CORE_FILES_FULL_TIME_AND_MASK_CHECKS_COMMON_MASK_IN_EVERY_MONTH_AND_18_SLICES_MATCH`. The checks:

- transfer SHA-256 and all nine core-file hashes;
- every time coordinate re-mapped to its target month; axes contiguous; grids identical;
- valid-cell counts for every month of every file; the single common 1,077-cell mask in every month of every file; common masks for every forecast/observation pair; the 316-month intersection;
- all 18 displayed slices equal the source floats at three-decimal rounding;
- slice identities, grid sizes, missing counts, evidence classes, absence of issue timestamps;
- edition labels consistent; no DOI or deposit claimed; anomaly reference period still `UNKNOWN`;
- evidence-ledger statuses limited to the declared vocabulary, the archive meaning of LDEO2 still `UNVERIFIED`, and the 1997 issue-time claim still `UNVERIFIED`;
- public data files name no transfer member outside the nine core files;
- checksum manifest complete and matching; the built page embeds exactly these slices and receipts.

These are integrity and coverage checks. They do not evaluate forecast skill or establish issue times.

## Usage notes

- Units: SST anomaly in °C relative to an undocumented reference period. Compare fields within the archive; re-centre before comparing with external products, and say so.
- Compare products only on matched months and masks. Unequal coverage is not a model difference.
- Leads are nominal; the fields are six-start composites. Do not compute issue dates by subtraction.
- Fields are continuous anomalies, not event probabilities.
- Preserve the raw `T` values in any conversion. Do not label converted files CF-compliant without validating them; IRI notes that its "360" calendar and "months since" units are not CF-permitted.

## What has not been done

- Any skill evaluation. A prespecified protocol is in `EVALUATION-PROTOCOL.md`.
- Comparison of archived fields with the contemporaneous bulletin figures (ledger E7, proposed test).
- Identification of the 40 additional files.
- Review by the archive's creators or by peers; a repository deposit; a DOI; a licence statement agreed with IRI.

## Code

`build.py`, `validate.py`, `netcdf_core.py`, `tools/refresh_checksums.py`, `tools/make_card.py`, `exercise/read_the_fields.py`. Python 3 standard library only.

## Versioning and corrections

See `CHANGELOG.md`, `data/corrections.json` and `CORRECTIONS.md`. A published edition is never overwritten.
