Home Blog

2026-10-04 · Africa Flying

We withdrew an accuracy number because we could not reproduce it

Sentinel-2 true-colour view of land north of Nairobi on 12 August 2026: a mix of housing, rectangular farm plots in green and brown, and a cluster of large white and blue warehouse roofs.
Farm plots and settlement north of Nairobi, Sentinel-2, 12 August 2026. This is the kind of ground an NDVI model would be asked about.Credit: Contains modified Copernicus Sentinel-2 data 2026, processed by ESA; served by Element84 Earth Search on AWS Open Data. Licence: Copernicus Sentinel data, free, full and open access (EU Regulation 1159/2013); attribution required

The ground in the picture is the kind of land a crop-health model has to say something about: farm plots, housing and roads side by side, seen by the Sentinel-2 satellite north of Nairobi. The model we are building tries to forecast a vegetation index, called NDVI, which is a measure of how green and healthy plants look from space.

In August we told people the model had a very low error. On 27 September we withdrew that statement. We could not reproduce the number, and when we read the code that produced it we found four faults. It built its training windows across different towns, so the model sometimes saw one place followed by another as if they were a single story. It filled missing rainfall and soil moisture with zeros and treated them as real. It adjusted its scaling using all the data before holding any back for testing. And it split the data by row order rather than by place or by time. Any one of these can flatter a result. Together they made the August figure meaningless, and the honest thing was to say so.

The rework fixed the cause rather than the symptom. Features are now built in one place, per location. Rainfall comes from real CHIRPS records and is used only when at least 80 percent of it is present. Soil moisture and land temperature are left out, with the reason recorded, because we do not yet ingest a real source for them. (The corridor weather table does use NASA POWER data, but the neural pipeline does not read it today.) Training now splits by place or time, fits its scaling on the training rows only, reports its error next to a naive baseline, and writes a versioned file with its settings. The inference server refuses weights that arrive without valid settings.

The result is uncomfortable but correct. The model file that was on the machine from 24 September covered only 31 towns with a handful of rows each, and under the new rules it produces zero training windows. So today no model is trained on honest data, the server reports itself as degraded, and nothing is served as a forecast. We would rather show you that status than a number we cannot defend. (Update, 19 October 2026: on 16 October a research prototype was trained on an offline extract under these rules. It is an offline test and is not deployed.) The status page shows it, and the satellites page lists the real data sources the work depends on.

This is a software and simulation result. Africa Flying is in a pre-operations phase, and no forecast here is used for any real-world operation.

Read next

The detail chart

For the curious: where the rework's new code went. It is secondary to the story above.

Horizontal bar chart of the largest additions by file in the neural rework: dataset.py 335 lines, its tests 179, train.py 178, train_v2.py 153, inference_server.py 145, artifact tests 144, artifacts.py 132 and the end-to-end training test 91.
Neural rework 27 Sep: largest additions by fileCredit: Africa Flying. Licence: Project content, draft; the numbers are the project's own records

Sources and credits

Written for the Africa Flying blog, September 2026 issue. Pre-operations R&D: nothing described here is a flight operation.