On the publication effective 20 August 2026 OGRA replaced the price build-up for high-speed diesel and left petrol's alone. Every letter from D onward changed meaning overnight; a cost that had never been published in Pakistan appeared as a row of its own; and this archive's parser refused the day rather than publish what it would otherwise have read off it, which was a diesel pump price of five rupees a litre.
What follows is what changed, which published figures moved as a result, and which archived documents each claim can be checked against. Every figure is read from one of the archived OGRA documents, listed in the OGRA manifest, and every one of those documents has its SHA-256 digest recorded here, so any claim on this page can be verified against the bytes it came from. The last section records every other change OGRA has made to the shape of its publication since this archive began on 21 July 2026.
20 August 2026 — the diesel build-up was restructured
On the publication effective 20 August 2026, 00:00 hours, OGRA replaced the high-speed diesel price build-up. The petrol build-up in the same document was not changed at all.
The old diesel build-up had twenty rows, lettered A to T. The new one has twenty-three, lettered A to W. Every letter from D onward now names a different quantity than it named the day before: on 19 August, K was the customs duty and T was the pump price; on 20 August, K is the cost at Karachi port, M is the customs duty, and the pump price is W.
Three things changed in substance, and one in presentation.
- Diesel is no longer priced off a quotation for diesel. Row A was “Diesel Platts Arab Gulf Mean Average” — a seven-working-day rolling average of the Platts quotation for finished gas oil. It is now “Dubai Crude Oil Platts Arab Gulf Mean Average”, a rolling average of the quotation for Dubai crude.
- The refining margin is published. Because A is now crude, the cost of turning crude into diesel has to be added explicitly, and it is: row D, “HSD Crack”, described on the page as “Difference of international price of HSD and crude”. On 20 August it is 41.89 US dollars a barrel.
- Freight and insurance is its own row. Row B was “Premium including Freight”. It is now “Aramco Crude Oil Premium” — the premium alone, and negative on this day — with freight and insurance stated separately as row C.
- A subtotal was added. The old build-up went straight from the price before levies to the total. The new one states a price before sales tax (row U) in between.
The petrol build-up is untouched: still A to T, still priced off the Platts quotation for petrol (gasoline 92 RON), still with the premium and the freight bundled into one row. So from 20 August 2026 the two pages of a single OGRA publication are laid out differently from one another.
The two letter schemes, side by side
The left half is the diesel page of 19 August 2026; the right half is the diesel page of 20 August 2026. Values are as published.
| Old | Old label | 19 Aug | New | New label | 20 Aug |
|---|---|---|---|---|---|
| A | Diesel Platts Arab Gulf Mean Average (USD/bbl) | 152.80 | A | Dubai Crude Oil Platts Arab Gulf Mean Average (USD/bbl) | 89.46 |
| B | Premium including Freight (USD/bbl) | 5.10 | B | Aramco Crude Oil Premium (USD/bbl) | −1.00 |
| — | — | — | C | Freight and Insurance (USD/bbl) | 8.00 |
| — | — | — | D | HSD Crack (USD/bbl) | 41.89 |
| C | Cost & Freight = {A+B} (USD/bbl) | 157.90 | E | Cost & Freight = {A+B+C+D} (USD/bbl) | 138.35 |
| D | SBP Avg Exchange Rate (Rs/USD) | 277.80 | F | SBP Avg Exchange Rate (Rs/USD) | 277.79 |
| E | Conversion Factor (ltr/bbl) | 158.98 | G | Conversion Factor (ltr/bbl) | 158.98 |
| F | Cost & Freight in Pak Rs. = {C*D/E} | 275.91 | H | Cost & Freight in Pak Rs. = {E*F/G} | 241.73 |
| G | Incidentals | 0.20 | I | Incidentals | 0.20 |
| H | Ocean Loss/(Gain) | 0.39 | J | Ocean Loss/(Gain) | 0.00 |
| I | Diesel Cost at Karachi Port = {F+G+H} | 276.50 | K | Diesel Cost at Karachi Port = {H+I+J} | 241.93 |
| J | Exchange Rate Adjustment | 0.00 | L | Exchange Rate Adjustment | 0.00 |
| K | Customs Duty | 15.68 | M | Customs Duty | 15.68 |
| L | Ex-Refinery/Import Price = {I+J+K} | 291.96 | N | Ex-Refinery/Import Price = {K+L+M} | 257.61 |
| M | IFEM | 3.94 | O | IFEM | 3.94 |
| N | OMC’s Margin | 7.87 | P | OMC’s Margin | 7.87 |
| O | Dealer’s Margin | 8.64 | Q | Dealer’s Margin | 8.64 |
| P | Price before PL, CSL & ST = {L+M+N+O} | 312.41 | R | Price before PL, CSL & ST = {N+O+P+Q} | 278.06 |
| Q | Petroleum Levy (PL) | 78.28 | S | Petroleum Levy (PL) | 80.00 |
| R | Climate Support Levy (CSL) | 5.00 | T | Climate Support Levy (CSL) | 5.00 |
| — | — | — | U | Price before Sales Tax = [R+S+T] | 363.06 |
| S | Sales Tax (ST) | 0.00 | V | Sales Tax (ST) | 0.00 |
| T | Total Diesel Price (excl. Secondary Freight) = {P+Q+R+S} | 395.69 | W | Total Diesel Price (excl. Secondary Freight) = {U+V} | 363.06 |
All figures are rupees per litre except where a unit is given. Row U is written with square brackets, U=[R+S+T], where every other formula on the same page is written with braces. That is OGRA’s own inconsistency and not a transcription error; the same thing happened to row F in every issue from 21 July to 1 August 2026, and this archive’s parser has treated the two bracket styles as interchangeable since.
Which concept moved where
| Concept | Old letter | New letter |
|---|---|---|
| International quotation, per barrel | A (finished diesel) | A (Dubai crude) |
| Supplier premium | B (premium including freight) | B (Aramco crude premium) |
| Freight and insurance | inside B | C |
| Refining margin (crack spread) | inside A | D |
| Cost and freight, US dollars | C | E |
| Exchange rate | D | F |
| Conversion factor | E | G |
| Cost and freight, rupees per litre | F | H |
| Incidentals | G | I |
| Ocean loss or gain | H | J |
| Cost at Karachi port | I | K |
| Exchange rate adjustment | J | L |
| Customs duty | K | M |
| Ex-refinery / import price | L | N |
| IFEM | M | O |
| OMC margin | N | P |
| Dealer margin | O | Q |
| Price before levies | P | R |
| Petroleum Levy | Q | S |
| Climate Support Levy | R | T |
| Price before sales tax | not published | U |
| Sales tax | S | V |
| Total, excluding secondary freight | T | W |
Ten of the twenty-three rows are unchanged in substance and changed in letter. Two rows are genuinely new as published quantities — the freight and insurance, and the crack spread — and one, the price before sales tax, is a subtotal of rows that already existed.
What became newly visible: the crack spread
Under the old build-up, diesel was priced from a Platts quotation for finished diesel. The cost of refining crude into diesel was inside that quotation, so it appeared nowhere on the page and could not be separated from the cost of the crude itself. On the page as published, the refining margin did not exist.
Under the new build-up it is row D, a published figure. On 20 August 2026 it is 41.89 US dollars a barrel, which at the same page’s exchange rate of 277.79 and conversion factor of 158.98 is 73.20 rupees a litre, or 20.2 per cent of the pump price. That is the first day on which the refining margin in a Pakistani diesel litre can be read off a published document rather than inferred.
The consequence for this archive’s own presentation is that the crude oil line means something different on either side of the change, and the two are not comparable as a series:
| Diesel, per litre | 19 August 2026 | 20 August 2026 |
|---|---|---|
| Crude oil line | 267.00 (67.5%) — a quotation for finished diesel | 156.32 (43.1%) — a quotation for Dubai crude |
| Crude premium | — | −1.75 |
| Freight and insurance | — | 13.98 |
| Crack spread | not published | 73.20 (20.2%) |
| Premium including freight | 8.91 | — |
| Incidentals | 0.20 | 0.20 |
| Ocean loss or gain | 0.39 | 0.00 |
| Exchange rate adjustment | 0.00 | 0.00 |
| Customs duty | 15.68 | 15.68 |
| Domestic refinery blend | −0.22 | not published |
| Published rounding | — | −0.01 |
| IFEM | 3.94 | 3.94 |
| OMC margin | 7.87 | 7.87 |
| Dealer margin | 8.64 | 8.64 |
| Petroleum Levy | 78.28 | 80.00 |
| Climate Support Levy | 5.00 | 5.00 |
| Sales tax | 0.00 | 0.00 |
| Total | 395.69 | 363.06 |
Grouped into the four buckets this project draws:
| Bucket | Diesel, 19 August | Diesel, 20 August |
|---|---|---|
| Crude oil | 267.00 | 156.32 |
| Refining and freight | 9.28 | 85.61 |
| Distribution and dealers | 20.45 | 20.45 |
| Government levies | 98.96 | 100.68 |
The customs duty of 15.68 is inside the levies on both days. It used to be inside the refining bucket, on the argument that OGRA’s own table charges it before the ex-refinery price; that read the buckets as an index of OGRA’s layout, and they are not — they answer where the money goes, and a duty is a tax whichever row it is printed in. The change moves 15.68 between two buckets on every day in the record and moves no published figure at all.
Nothing about how a litre of diesel is made changed overnight. What changed is where the published document draws the line between the cost of the crude and the cost of turning it into diesel. The crude bucket falling by 110.68 and the refining bucket rising by 76.33 is a change of accounting, not of supply — and it is exactly the sort of thing a reader of a chart would misread as a market event if the change were not written down.
What disappeared: the domestic refinery blend table
Diesel pages from 12 to 19 August 2026 carried a small unlettered table below the main build-up, reconciling imported diesel against domestic refinery output. On 19 August it read:
| Row | 19 August 2026 |
|---|---|
| HSD (Ex-Refinery Price) | 291.79484 |
| HSD (Import Price) | 292.18210 |
| Weighted Average Price | 291.96 |
| Extra Margin | 0.16516 |
That table explained why the lettered chain reached 292.18 while the notified ex-refinery/import price was 291.96: the notified figure was the weighted average of imported and domestically refined product, and the 0.22 gap was the saving from the domestic share.
The 20 August diesel page carries no such table. This archive treats its absence as an absence rather than a fault, for the same reason it did before 12 August: no diesel page carried one until 12 August, and the table was optional from the day it first appeared — the 12 August issue published three of its four rows, omitting the extra margin. Where no blend table is published, the small residual between the lettered chain and the notified ex-refinery/import price is the accumulated rounding of OGRA’s own published figures. On 20 August that residual is one paisa, and this archive labels it published rounding rather than a refinery blend, because calling it a blend would be a confident statement about how diesel is priced that the document does not support.
The notified prices either side
Stated as published, without any claim about why they moved.
| Product | 19 August 2026 | 20 August 2026 | Change |
|---|---|---|---|
| Petrol | 334.54 | 337.51 | +2.97 |
| High-speed diesel | 395.69 | 363.06 | −32.63 |
Two published inputs to diesel also moved between the two documents: the Petroleum Levy from 78.28 to 80.00 rupees a litre, and the SBP average exchange rate from 277.80 to 277.79 rupees to the dollar. The customs duty, IFEM, OMC margin, dealer margin, Climate Support Levy and sales tax are identical on both days. This archive does not attribute the change in the pump price to the restructure, to the levy, or to anything else; it records that the build-up changed shape and the notified price changed on the same day.
One further wording change is worth recording because it concerns provenance rather than arithmetic. The old row B was explained on the page as “Freight and margin based on G-to-G agreement with Kuwait Petroleum Corporation”. The new row B is explained as “Aramco’s crude oil premium for Arab Extra Light for Asia notified on monthly basis”, and the new row C as “Federal Government approved Freight & Insurance cost for crude vessel imports from Gulf Region”.
How the change was caught
This archive noticed the restructure automatically, on the day it happened, without anybody reading the document first.
The 20 August publication was discovered and downloaded at 19:08 UTC on 19 August 2026 — a few minutes past midnight in Pakistan, which is when the price takes effect. The parser read the diesel page under the only build-up it knew, so it took the twenty rows A to T at face value and left the three rows after them unread; from D onward, every value it collected sat under a letter that no longer meant what the parser assumed. The arithmetic guards then failed, because a build-up read under the wrong scheme does not close. Two checks are fatal, and both fired:
- diesel: P is 7.87 but L + M + N + O is 277.23; difference 269.36
- diesel: T is 5.00 but P + Q + R + S is 374.57; difference 369.57
Three non-fatal checks recorded the same disagreement further up the chain: C against A + B was out by 80.46, F against C × D ÷ E by 275.37, and I against F + G + H by 678.30.
Because a fatal check fired, the day was marked unverified and withheld from the site rather than published. The misreading it would otherwise have published was a diesel pump price of 5.00 rupees a litre — the figure sitting in the row the old scheme called T, which the new scheme uses for the Climate Support Levy.
Three properties of the pipeline are what made this a caught error rather than a published one. Every letter A to T had to be present or the day stopped, so the parse could not silently drop the rows it did not understand. The two identities that carry the price to the pump had to close, so a build-up read out of order could not pass. And a day that fails a fatal check is written to disk in full, withheld from the site, and named in the published record as withheld with its reasons — so the failure was diagnosable from the record without going back to the source, and a reader of the site could tell a day nobody published from a day this project would not publish.
Petrol passed every check on the same document, which is itself evidence: the failure was specific to the page that changed.
How the parser now tells the two apart
The scheme a page uses is decided from what is printed on the page, never from its date. OGRA reissues documents, and a date cutoff would misread the reissue of an older publication on the day it appeared.
What identifies a page is the set of formulae OGRA prints beside the rows it computes. The old build-up prints six of them — C={A+B}, F={CD/E}, I={F+G+H}, L={I+J+K}, P={L+M+N+O} and T={P+Q+R+S}. The new one prints seven — E={A+B+C+D}, H={EF/G}, K={H+I+J}, N={K+L+M}, R={N+O+P+Q}, U=[R+S+T] and W={U+V}. A page is read under the one scheme whose whole set it carries. The sets describe arithmetic rather than wording, they are written by OGRA rather than inferred by this project, they cannot both be satisfied at once, and the bracket style is discarded before they are compared. A page carrying neither set is refused and the day is withheld, which is the correct outcome for a third restructure: it should stop the pipeline, not be read as the nearest thing this project already knows.
Each page of a document is identified separately, which is what allows petrol and diesel to be read under different schemes from the same file.
The archived documents
Both documents are served from this site and can be checked against these digests.
| Effective date | OGRA document | Archived at | SHA-256 |
|---|---|---|---|
| 19 August 2026 | 15402 | `data/source/ogra/2026-08-19.pdf` | b8cb6831bb8344a4be031e43315f57b682ffeb2a749fb18b0ce015567a8a673b |
| 20 August 2026 | 15453 | `data/source/ogra/2026-08-20.pdf` | 490b234769de58c2fdd2e9ec008d0fdedea1309e0dfa550050bacb1256d14b3b |
The 19 August document was downloaded at 13:52:33 UTC on 19 August 2026 from https://www.ogra.org.pk/download/15402?lang=en; the 20 August document at 19:08:06 UTC on 19 August 2026 from https://www.ogra.org.pk/download/15453?lang=en. OGRA rewrites its listing page each time it publishes, so a publication drops out of view within a few weeks; the document itself goes on being served under an id nothing links to. These archived copies are what keeps them findable, and fixed — see What OGRA serves, which maps OGRA’s whole document id space and corrects what this project used to say about it. The text extracted from both is kept verbatim as well, so the reader that produced the figures above is pinned against the exact bytes described here and cannot quietly drift from them.
What this changed in the published data
Day records and the history now name the scheme each product page was read under, beside the letters, because the letters mean nothing without it. Records written before 20 August 2026 name no scheme and are read as the old one, which is the only scheme that existed when they were written.
The itemisation gained three line keys, all on the new diesel build-up: crude_premium, freight_and_insurance and crack_spread. The old build-up’s premium_and_freight line is not reused for the new premium, because the new premium does not include the freight and saying it did would be wrong. A page in the new scheme therefore itemises to fifteen lines where a page in the old one itemises to thirteen. Both still sum exactly to the published pump price, and both still group into the same four buckets.
The flat export at data/daily.csv gained three columns for those keys, at the end, so the existing columns did not move. A product that does not publish a given line leaves its column empty rather than writing a zero: an empty cell means the document states no such figure, and a zero means it states one, as petrol’s sales tax does.
Earlier variations
These are changes in how the publications are written rather than in what they publish. They are recorded because each one broke, or would have broken, a parser that assumed the documents were uniform.
| From | Change |
|---|---|
| Before 21 July 2026 | There is no build-up. OGRA’s price publication family runs weekly back through the spring of 2026, but those documents are one-page price-change notices — the old price, the new price and the difference, for diesel and petrol — with nothing about what is inside either. Established by sweeping OGRA’s document id space and reading every member of the family; see What OGRA serves. |
| 21 July 2026 | The archive begins, and so does the build-up: this is the first document in the family that carries the lettered rows. Both products use the A-to-T build-up. OGRA serves this day’s document under two ids, 14557 and 14672, and the bytes are identical. |
| 21 July – 1 August 2026 | Row F’s formula is written in square brackets, F=[C*D/E], where the other five formulae on the same page use braces. From 4 August it is written in braces like the rest. A parser that blanked only braces read no F at all and treated ten of the first twenty publications as missing a mandatory row. |
| 12 August 2026 | The diesel page begins carrying the domestic refinery blend table. This first issue published three of its four rows, omitting the extra margin; every issue from 13 to 19 August carried all four. |
| 20 August 2026 | The diesel build-up is restructured, as above. The blend table is not carried. |
Throughout, the filenames OGRA serves these documents under have appeared in four different spellings, and one title carries a stray comma. Nothing in this project is keyed on a filename, a title or a row label for that reason.