DEV Community

Francis Oyakhire
Francis Oyakhire

Posted on • Originally published at asotele.apexgridapps.com

“What does it mean to me?” — and eight days of finding out what we had wrong

An advisor asked me one question that changed how we write.

" What does it mean to me?"

Chinedu Nwafor was reading one of our Asotele briefings. The figures were correct. Every one was sourced and dated. And still, that question stood there, unanswered — because a number tells you what happened, not what to do about it.

We had been reporting, not communicating. Precision without meaning is just decorated data.

So we rebuilt the "What it means" section of every brief around his question. Not " inflation printed 15.9%", but what that does to a contract, a margin, a decision. The test we now apply to a line is whether a reader could act on it — accuracy is the floor, not the product.

One good question was worth more than a month of our own review. It also set the tone for the eight days since, which were mostly spent finding out what we had been getting wrong.

Four things we were publishing incorrectly

The policy rate. For an extended period the briefings carried the wrong Monetary Policy Rate — and not one wrong value but an unstable one. Across the affected period the notes showed 22.0%, 20.0%, 27.5% and 26.5% in different places. The correct rate is 26.50% , set at the 304th MPC meeting in February and held since.

The cause: the rate was being read automatically from general news coverage, which refers to current, historical and expected rates in the same article, and the extraction could not tell them apart. We replaced that route with a maintained record of numbered policy decisions, and corrected 82 briefings covering 27 April to 21 July — including the twenty that already showed the right figure, because correcting only the ones that differed would leave a record a reader cannot trust as a whole.

A satellite product that was not real. We build a night-lights economic momentum series from NASA VIIRS tiles. Work on a gas-flare mask surfaced something worse than flares: the most recent month's tiles were corrupt, and the readable local copy was byte-identical to the previous month — the same data, relabelled. The momentum product was reporting a month that did not exist. It is withdrawn pending a clean re-fetch. Licence labels being silently destroyed. Every passage in our corpus carries a canonical licence label; only sixteen are permitted. We found 208 passages carrying none. The root cause was worse than the symptom: four ingest scripts declared the correct licence as a constant and never wrote it onto the chunk. Because one of them replaces passages in place rather than appending, it did not merely add unlabelled material — it stripped the label off 503 passages that already had one.

We fixed the scripts, backfilled, and then did the structural work: a write guard that validates every passage at the moment of persistence and refuses the write if any lack a permitted licence, leaving the previous corpus intact. It now covers 42 writers , including the streaming ones that rewrite the whole corpus line by line. The corpus stands at 1,178,899 passages, zero unlabelled, zero outside the whitelist.

Data written to a database nobody reads. Our collection machine kept its own copy of the records. A weekly regulatory feed had been writing newly licensed lenders into that copy — not the live one. The loss was four records when we found it, and growing every week, and invisible to every health check because the job succeeded every time. Collection may now run anywhere; writing to the records happens only on the machine that owns them.

None of these were caught by a monitor. Three were caught by doing unrelated work nearby, and one by an advisor.

What advisors caught

Oluwaseun Adeosun's review turned up a genuine bug in our parallel-market FX handling, which led to a venue depth-and-coherence gate on the index and two estimator fixes — including one worth naming, because it is the kind of error that looks fine forever: the RiskMetrics decay factor of 0.94 is a daily convention, and we were applying it to three-hourly observations. That gives a volatility memory roughly eight times too short. It now derives from the observed gap between captures, so it self-corrects if the cadence changes.

A separate advisor flag led to an inflation correction earlier in the period.

This is the argument for an advisory committee stated more plainly than we could state it ourselves: four of the defects above were ours to find and we found them late; two came from outside and came faster.

What shipped

Alongside the corrections:

- Nigeria 's only published freight rate card. Every commercial courier gates its pricing — GIG returns 401 on all price endpoints, others answer "talk to sales", and no regulator publishes a tariff for private carriers. NIPOST, as a statutory body, publishes its full schedule. We ingested all of it: 18,787 rows , centred on a 37×37 city-to-city cargo matrix. Lagos–Ibadan ₦1,400; Lagos–Maiduguri ₦11,550. An eightfold spread across one country, and a structural constraint on where a business can profitably serve. - Road freight risk , from FRSC data via the Bureau of Statistics — 21,092 rows to Q1 2026. Commercial vehicles are 72% of vehicles involved in crashes; trucks, tankers and trailers alone are about a quarter, a share stable across six quarters. - Postal services by state , 2019–2025 — one of very few state-level formalisation proxies Nigeria publishes. - Non-oil export parity , translating world commodity prices into naira proceeds per tonne at both official and street rates, so an exporter can see how much of their price is the crop and how much is the exchange rate. - Agricultural conditions , reworked into a reasoned read rather than a readout: import-substitution gaps, rainfall anomalies, and a weather-outlier synthesis. - A live courier price series , sampled daily. The NIPOST tariff is an administered price — it steps when NIPOST revises it and otherwise never moves, which makes it a benchmark and not a signal. It cannot tell you whether diesel is feeding through to freight, or whether a corridor is disrupted. That needs a price that moves.

The wall behind the question

Chinedu's question stayed with me for a reason beyond the rewrite: communication has a barrier harder than clarity, which is language itself.

Nigeria's economic information is published almost entirely in English. Much of the population most affected by it does not transact in English. For them, " what does it mean to me?" cannot be answered at all — not because the data is wrong, but because it never arrives in a language they use.

So we are building Asotele to answer economic questions in Hausa, Yorùbá, Igbo and Nigerian Pidgin. Four sentiment classifiers are trained and shipped. And we have hit the wall every honest translation effort hits: the grammar is easy, the terminology is not.

One model rendered " inflation" in Yorùbá as " rubbish."

A mistake we shipped ourselves

It would be comfortable to leave it there. The more useful story is our own.

An early version of our terminology pipeline accepted candidate translations automatically when they were well attested in real Nigerian-language text. If speakers use a phrase often, the reasoning went, it is probably right.

It accepted _onye na-azụ_ — literally " person who buys" — as the Igbo for borrower.

It is a real phrase, and well attested, and wrong in the way that matters most: a reader would understand every word and take away the opposite meaning. Seven terms had been accepted that way. We reverted all seven, and changed the rule. Attestation may now only reject a proposed term; it can never approve one. Approval requires a speaker. There is no configuration in which the machine has the final say on a word.

That is why this needs people rather than more computing. It is not a scale problem.

An open invitation

If you are a linguist — or simply someone who loves a Nigerian language and believes economic knowledge should reach people in their own tongue — we would like your help.

- One term at a time. A batch is twenty, a few minutes. Answers save as you go. - Skip anything you are unsure of. We would far rather have a gap than a confident guess. Skipping is a button, not a failure. - Nothing publishes until two speakers agree. Nothing rests on one person's judgement, including yours. - Public credit if you want it , and none if you would rather not be named.

We are not asking for bulk translation or for unpaid annotation at volume. If a batch ever feels like data entry rather than judgement, we have designed it wrongly and want to be told.

There is a 99-second walkthrough — sign-in to sign-out — on the language review page, along with the application.

One more thing, since this is a progress log

We applied to the LINGUA Africa open call in June to fund exactly this: professional linguistic review, finance-domain fine-tuning, and Igbo and Pidgin content. We were not selected.

It was the largest single item on our funding list, so it is worth saying plainly rather than leaving a page quietly describing funded work that is no longer funded. What changes is that the terminology review now runs on volunteers rather than paid reviewers — slower, and in one respect better, because the terms that come out of it are ours to publish rather than licensed from anyone.

Language is power. It should reach everyone.

---

Asotele is built by Apex Grid Technologies, a Nigerian registered company.

Top comments (0)