Change control — Friday 14 August
v2.2.0This is live. It went to the store on Friday morning, so everything below is now in front of customers, including the lines that still read "on dev" — this page was written on Thursday and those labels describe where each change stood then. A second, smaller release followed the same morning to correct a catalogue link the first one had broken. Denis then walked the changed pages on the live store and found nothing wrong with them.
Fifty-three changes: twenty-eight on the store website, sixteen on the order and payment services, seven on search, and two on the catalogue data and internal reporting. Twenty of them are told below in full; the rest are tests and plumbing, told in one paragraph each.
Written Thursday against the copy that goes out Friday. Every measurement below was taken on Wednesday and Thursday, before the release, because after it the "before" is gone.
Going to the store on Friday
- Parts we only quote by phone stop showing a one-cent price.
- Browse-by-type links arrive with the page, so Google can follow them.
- The brand filter stops offering brands the page cannot account for.
- Construction tiles open the construction section directly, without a redirect.
- 358 pages we ask Google to ignore are no longer submitted to it.
- An empty brand diagram page offers categories to click instead of a dead grid.
- Shipping cost comes back straight away instead of a wait of up to half a minute.
- Servers that go bad step out and restart themselves instead of taking checkout while broken.
Already on the store since Wednesday
- A part shows in stock only when a depot actually has one on the shelf.
- Parts from other makers no longer borrow a New Holland price.
- The in-stock count beside search results matches the results you get.
Built, not usable yet
- Staff can build a cart for a customer and send a link they pay online. It needs a table Alex has to add before anyone can pay one.
Four things to know before reading the list
Four of the seven search changes are already on the store — the search service was moved to its current build on Wednesday 12 August, ahead of this release. They are listed here because they belong to this cycle's story. The three with an entry of their own below are marked "already live"; the fourth is a release check and sits under Internal. The same is true of the Kuhn catalogue change, which was applied straight to the live database.
The customer pay link is finished but not yet usable: it needs a table Alex has to add before any customer can pay a link. It ships complete, not live-ready.
Two store changes merged outside this slice and are not in it: one landed on 7 August after that release was cut, and one landed on 13 August. Neither is on the store.
One service change is not in this list and probably should ride this train: a fix merged on 13 August so that an order can only be read by the customer who placed it. That is a security matter and needs a decision on Friday. Separately, ten service changes from the previous cycle are still not on the store, and one of them — ordering with no card for customers who hold a Clinton charge account — is a real feature sitting outside production.
Checkout & paying — 2
Staff can build a cart for a customer and send a link they pay online Vova on dev feature front#3488 ps#572
What it is Someone in the building builds the cart for a customer, sets the shipping price, and gets a link to send. The customer opens the link, sees the parts and the total, and pays by card or a wallet like Apple Pay. It covers the three orders that fall out of the normal checkout into a phone call today: an address outside the US, a part that needs freight, and an order taken over the phone. The order then arrives the same way a website order does, and prices are checked again at the moment the customer clicks. The public checkout is untouched.
How we test it Sign in as staff, build a cart on the staff quotes page, send the link, pay it with a test card, then confirm the order appears with a number and the confirmation email arrives. That one real order placed end to end is what closes the work; 948 payment tests pass meanwhile, 36 of them new.
Evidence Asked straight at both payment services, so the store and its cache are out of the path entirely.
| What was asked | prod today | crop-dev.app |
|---|---|---|
| Pay a quote by its link | 404 — the address does not exist | Answers with a message of its own, "Quotes are not configured on this deployment" — the address exists and is reached |
| A neighbouring address this change does not add, as a control | 404 | 404 — so the answer above is specific to the new address, not a catch-all |
| Service health, as a control that both were up | 200 | 200 |
No picture, and it is not usable yet. Nothing answering, then an address that answers with a real message, is a genuine before and after, and the control rules out a catch-all. It stops there. Quotes are switched off on the test copy, so no link could be produced, no payment made and no order looked for; the staff form needs a staff sign-in we cannot drive, which is why there is nothing to photograph. A link cannot be paid at all until Alex adds the table that holds the quotes. There will be a picture and a real order here when it is switched on.
Roll back or fail forward Roll back — new pages only, nothing a shopper uses today depends on them, and no link has gone out from the store yet.
Shipping cost comes back straight away instead of making a shopper wait up to half a minute Vova on dev fix ps#585
What it is When a shopper asks what shipping costs, the answer is now sent the moment it is worked out. Before, we held the answer while also saving a copy of it, and on a server whose database connection had gone bad that save took twenty to thirty seconds, so the shopper waited that long for a number that had been ready in one second. That twenty-to-thirty-second reading is the one recorded on 11 August by the person who made the change, not ours, and it could not be reproduced today because it needs a server in that state. The copy is still saved, it just no longer keeps anyone waiting, and a failed save now raises an alarm instead of passing silently.
How we test it 235 delivery tests pass, and the two new ones fail on the old code for the right reason. With the database unreachable the quote still comes back at once.
Evidence A real shipping question — Clinton NY to Mountain View CA, one five-pound package — asked three times of each service.
| What was asked | prod today | crop-dev.app |
|---|---|---|
| A shipping quote, three runs each | Answered in 1.17s, 1.29s, 1.21s | Answered in 1.60s, 1.16s, 1.24s |
| What came back | Real rates, including in-store pickup and the $9 flat rate | The same |
| The twenty to thirty seconds this change is about | Could not be measured — that was one specific server on 11 August under live traffic | Not applicable |
There is no before and after here today, and the numbers above must not be read as one. The twenty-to-thirty-second figure came from one particular server whose database connection had died; that server fault is a separate piece of work and this change does not fix it. A healthy server already answers in about a second, which is what was measured on both sides. What this change does is stop the slow save from ever reaching the customer, and that only shows itself when the save hangs — a condition we cannot create on demand. Read prod's 1.2 seconds as "prod is healthy right now", not as the before.
Before Friday's promote, the alarm that watches for a failed save has to be switched on. If it is not, the very fault this change protects against becomes invisible instead of noisy.
Roll back or fail forward Roll back — one small change on one path, and the old behaviour was slow rather than wrong.
Search & the parts catalog — 6
A part now shows in stock only when a depot actually has one on the shelf Vova already live fix search#877
What it is John ruled on Monday that the only thing that says a part is in stock is a real count at a CNH depot. Until now a part could show as in stock and buyable because CNH listed it as something we could order, even with zero on the shelf at every depot, and 127,404 parts were in that state. Now the count decides. Only 1,052 parts actually lost an Add to Cart button, because the rest were quote-only pages that never had one. Of the 302,665 parts that stay in stock, 11,972 sit on Clinton's own shelf and ship same day, and 290,693 come from a CNH depot with handling time.
How we test it Open SBA185186320, John's own example. It reads out of stock and has no Add to Cart button; his screenshot shows all four depots at zero.
Evidence The part page and the backing record read on both sides on Wednesday.
| What was read | prod today | crop-dev.app |
|---|---|---|
| The part page for SBA185186320 | $3,296.83 each, "Out of Stock", button "Notify me when back" — no Add to Cart | Identical |
| What Google reads on that page | price 3296.83, out of stock | Identical |
| The record behind it | out of stock, nothing on Clinton's shelf | Identical |




Identical. Both stores already show this part out of stock with no Add to Cart, which is the behaviour the change is about.
Zero difference on every surface, so nothing was measured. Both sides already read out of stock with no Add to Cart, which is the after. This change went to the store on Wednesday, ahead of this release, so the before it describes is not observable anywhere today. This particular part is also a poor witness: with the depot count at zero the old rule and the new rule agree, so even a live before-and-after window would show no difference on it. A part where the two disagree would be needed, and none is named.
Roll back or fail forward Fail forward — a rollback re-advertises stock we do not have, and this is John's own ruling.
The in-stock count beside search results now matches the results you actually get Vova already live fix search#881
What it is Two smaller places still answered the old question. The in-stock count in the filter list beside search results was built from a different source than the badge on the part itself: searching seal, it claimed 183 in stock while the page returned 18,231 results. It now counts the same way the badge does. The small in-stock tag in the type-ahead dropdown was removed rather than corrected, because the lookup behind that dropdown never receives the depot count and cannot answer honestly.
How we test it Search for seal. The in-stock number in the left filter list reads about eighteen thousand, the same size as the in-stock half of the results, instead of the 183 it used to claim.
Evidence The same search run on both stores and both search services on Wednesday.
| What was read | prod today | crop-dev.app |
|---|---|---|
| Searching seal: in-stock count in the filter list against the result total | 18,149 in stock, 11,934 out of stock, 31,947 results | Identical |
| Against the numbers recorded when the change was made (183 before, 18,163 after) | 18,149 — already the corrected shape, not 183 | 18,149 |
| The in-stock tag in the type-ahead dropdown | Already gone | Already gone |




Identical, because this one is already on the store. The in-stock number in the left filter list is the thing to look at.
No before-and-after window. The store already serves the corrected number, because this went out on Wednesday. The gap between 18,149 today and the 18,163 recorded when the work was done is two days of catalogue movement, not a difference between the two copies. One thing this change does not close, and does not claim to: the in-stock and out-of-stock counts add up to 30,083 against a total of 31,947, leaving 1,864 results in neither bucket. That gap is the same on both sides and is a separate question.
Roll back or fail forward Fail forward — a rollback restores counts wrong by 127,000 sitting next to the corrected badge.
Two leftover stock-like values removed from the data we hand out — nothing on screen changes Vova on dev fix search#883 search#887
What it is Alongside every part we handed out two extra values that no longer agreed with the page. The first was a ready-made instruction naming which button to show; it was built only from whether the part could be quoted, with no stock input at all, so it said Add to Cart on 835 parts that the very same answer badged out of stock. The second was a stock-like value copied straight from CNH's own list, which disagreed with the badge on 127,490 parts. Neither was being read by anything — checked across the store, the order services and the CNH service — because the store and the Google feed work the button out for themselves. Both are deleted rather than repaired.
This is invisible to a shopper and to Google, and that is the point: the badge, the price and the buy button are untouched. What it removes is two ways for a future page to pick up the wrong answer.
How we test it Open SBA185186320, 83924760 and SBA340293195 before and after. The stock line, the price and the button are identical on each; only the unused values are gone.
Evidence None beyond the counts above and the three parts named. There is no visible surface to photograph, which is itself the claim being made.
Roll back or fail forward Roll back — a deletion of three unused values in total, and putting them back is instant and harmless.
Parts we only quote by phone no longer show a one-cent price Vova on dev fix front#3528
What it is A New Holland part we price by request was showing one cent, and the same one-cent price was being sent to Google Shopping. Its neighbour with the same status but no price behaved correctly. Now the status itself blocks the sale, the placeholder price, the price Google reads on the page and the Google Shopping feed, so both parts read Contact for price. Denis found this one and wrote the failing test that came with the fix.
How we test it Open the New Holland part CT-NHL-06404120C: it must read Contact for price with no buy button, and its neighbour CT-AGC-000050147 must be unchanged.
Evidence Both parts read on both stores, with the cache bypassed, plus what Google is given on each page and the backing record.
| What was read | prod today | crop-dev.app |
|---|---|---|
| CT-NHL-06404120C, the buying area | "$0.01 / each · USD", "Out of Stock", button "Notify me when back" | "Contact for price", "Out of Stock", the note "This part isn't priced online yet — our parts desk will send you a quote", button "Ask for a price" |
| What Google is given on that page | An offer at 0.01 USD, out of stock | No offer given at all |
| The control, CT-AGC-000050147 — same status, no price | "Contact for price", "Ask for a price", no offer | Identical — unchanged, as intended |
| The record behind both, on each search service | quote-only, price 0.01, out of stock | The same — so the fix is on the store, not in the data |
| Full page height | Desktop 5,249px, phone 8,386px | Desktop 5,249px (no change), phone 8,469px (83px taller) |




The one-cent price and the offer Google could index are gone, with a same-status control that did not move — that pairing is what makes this evidence rather than an assertion. The 83 extra pixels on a phone are explained and need no further story: the parts-desk sentence and the wider Ask for a price button are taller than "$0.01" plus "Notify me when back". The desktop height is unchanged.
One half is unproven today. This part is out of stock on the store right now, so the store already shows "Notify me when back" rather than a working buy button. The claim that a buy button was removed does not reproduce on 13 August; what can be evidenced is the price and the offer Google reads.
Roll back or fail forward Fail forward — rolling back puts a one-cent price and a buy button back on parts we will not sell.
The brand filter on the parts page now offers the same brands on a desktop as on a phone Vova on dev fix front#3515
What it is On a desktop the Brand filter on the parts search page offered a longer list than the page itself could account for: fifteen brands to tick against nine the search actually reports. The desktop list now matches the search, and matches what a phone has always shown.
How we test it Open the parts page on a desktop and count the brands in the Brand filter, including the ones behind "Show more": fifteen before, nine after, and the nine are exactly the brands the search reports.
Evidence Both stores read with the cache bypassed, counting the tick-boxes and the "Show more" residue, then checking that total against the brand list the page itself carries.
| What was counted | prod today | crop-dev.app |
|---|---|---|
| Brands offered on the desktop parts page | 8 shown plus "Show more (7)" = 15 | 8 shown plus "Show more (1)" = 9 |
| The brand list the page itself carries, as a cross-check | 9 brands — does not reconcile with the 15 offered | The same 9 — reconciles exactly with the 9 offered |
| Which of Ferris, Ventrac, McHale and Marcrest are still offered | All four — two shown, two behind "Show more" | Ferris is gone; Ventrac, McHale and Marcrest are still offered |
| Full page height, desktop and phone | 4,731px and 9,457px | Identical on both — the phone filter lives in a drawer, so this is invisible there by design |




Two claims made for this change do not survive measurement, and are not made here. The work was described as removing four brands that always returned nothing. Only one of the four, Ferris, is actually gone; Ventrac, McHale and Marcrest are all still in the filter, each with thousands of parts behind them. And we could not measure what ticking a brand returns at all: the tick-box is not part of the web address, so it cannot be asked for from outside. The address that looks like it should stand in for a tick does not agree with the page's own numbers, so we are not quoting it. What is measured, and reconciles, is the list going from fifteen to nine.
Roll back or fail forward Roll back — one screen area, no data change; the longer list comes back.
The search panel's opening animation is decided by one rule now, instead of two that raced Vova on dev fix front#3521
What it is Two opening animations were being applied to the header search panel at once, and which one you saw came down to the order the styling happened to compile in. Today it looked right by luck. Only one is applied now, so it cannot change on us the next time something unrelated is rebuilt. Nothing looks different on screen.
How we test it Open the header search on a desktop and watch the panel appear: the same motion as today, with only one animation on the panel.
Evidence None was taken, and none would show anything — the whole claim is that the panel looks and moves exactly as it does now. What changes is that it will keep doing so.
Roll back or fail forward Roll back — a styling change on one panel.
Brand pages — 2
Parts from other makers no longer borrow a New Holland price when the part numbers happen to match Vova already live fix search#869
What it is A part number can belong to more than one maker. When a Kuhn or Ferris part happened to share its number with a New Holland part, our catalogue quietly copied the New Holland price and shelf count onto it. That is now stopped: a part shows its own maker's price, or none at all. On the live catalogue that removed a borrowed price from 5,927 parts and a borrowed shelf count from 37,077, and left every New Holland part exactly as it was.
How we test it Open the part page for 504189487 (Ford). No price is shown and it reads out of stock. New Holland part 47927519 still shows $91.36.
Evidence The part page read on both stores, and — because the backing record is the truth here — the record itself read from both search services.
| What was read | prod today | crop-dev.app |
|---|---|---|
| The buying area for 504189487 | $34,103.40 each, "Out of Stock", "This part was superseded", button "Contact our parts desk" | Identical, character for character |
| The record behind it | price 34,103.40, out of stock, nothing on Clinton's shelf | Identical |
| Where it is | Already carrying this change | Merged on 8 August; the search service has rebuilt as recently as 13 August |




Identical, because this one is already on the store. The pair is here to show the price and the stock line as they now read.
No before-and-after window exists for this one, on either surface. The two sides answer identically, which means the store is already serving the corrected behaviour and the before is gone. That fits how this change works: it corrects how the catalogue database joins two tables, and both services read the same database, so applying it moved both at once. We could not confirm exactly when the store's search was last rebuilt — the tool that reports it timed out twice — so this rests on the two services answering identically, which is the stronger evidence anyway. The price shown above is not itself proof either way; there is no pre-fix reading to compare it against.
Roll back or fail forward Fail forward — a rollback puts other makers' parts back on New Holland prices, and it is already live and quiet.
A brand diagram page that came up empty now offers categories to click instead of a dead grid Denis on dev fix front#3533
What it is The diagram tab opens the largest equipment type by itself. When that type came back with no models, as New Holland Construction does, the shopper got the full page frame with every count reading zero, an empty grid, no message and nowhere to go. It now falls back to the category picker with real counts, so there is always something to click. A shopper who asked for that type by address still gets its honest empty answer.
How we test it Open the New Holland Construction diagrams page while its model list comes back empty: it must show clickable categories with counts, not an empty grid reading zero.
Evidence Both stores read with the cache bypassed, comparing the visible text, the category tiles and the counts beside them.
| What was read | prod today | crop-dev.app |
|---|---|---|
| The page answered | Yes, in 3.50s | Yes, in 6.46s |
| Visible text once the scripts are stripped out | 10,624 characters | 10,624 characters — identical |
| Clickable category tiles | 13 | 13 — the same set |
| Counts beside the tiles | 112, 23, 38, 74, 70, 61 and so on | Identical |
| The toolbar count | "Showing all 404 models" | "Showing all 404 models" — not the empty state this change is about |




Identical, down to the pixel. The empty state this change fixes is not happening on either store today, so what the pair shows is that the working state is untouched.
This one could not be measured, and the honest result is no difference at all. The broken state this change fixes is not happening today: the model list comes back with 404 models on both sides, so the store is already showing clickable categories with counts. That is a could-not-measure, not a proof of no change — the broken path was never entered on either side, so nothing about the fix was tested and nothing about it was disproven.
Roll back or fail forward Roll back — one screen area; the dead empty grid returns.
Equipment pages — 1
Construction tiles open the construction section directly instead of bouncing through a redirect Vova on dev fix front#3516
What it is Two tiles on the equipment page, Skid Steers and Construction Equipment, pointed at an agriculture address that immediately redirected to the construction section. They now link straight there. The same redirecting link also sat in the browse block on the parts page, where Google was following it on every crawl; it is gone. The construction section is still reachable from the brand links beside it.
How we test it On the parts page count the agriculture browse tiles: eleven, with no construction tile. On the equipment page the two construction tiles open the construction section with no redirect.
Evidence Both pages read on both stores with the cache bypassed, counting the distinct agriculture browse links.
| What was counted | prod today | crop-dev.app |
|---|---|---|
| Agriculture browse links on the parts page | 12 | 11 |
| Is the construction one among them | Yes | No — gone |
| The eleven that survive | balers, commercial mowers, forage, harvesters, hay tools, loaders, mowers, planting, sprayers, tillage, tractors — plus construction | The same eleven, without construction |
| The equipment page answered, as a control | Yes, 186,358 bytes | Yes, 182,890 bytes |
| Where the construction links on the equipment page point | Two: the construction section, and one routed through the agriculture address | One: the construction section. The agriculture-routed one is gone |




The two pages look the same, and that is the point: what changed is where a tile points, not what it shows. The pair is here as proof that nothing else moved.
Twelve to eleven with construction the one removed matches what was intended, and it cross-checks against a completely separate count taken for the browse-block change further down this page, on the same two documents.
The open half of this is now closed. Reading the equipment page in a browser on both stores, the store carries two construction links — the construction section, and one routed through the agriculture address — while the test copy carries only the first. On its own a single link's difference on a page that has a week of other changes behind it would be weak; it is the agreement with the independent count that makes it evidence.
Roll back or fail forward Roll back — link targets only; the redirect the site already serves stays as a safety net.
What Google reads — 2
Three hundred and fifty-eight pages we tell Google not to index are no longer submitted to it Vova on dev fix front#3520
What it is Part pages for Ferris, Kuhn, McHale and Marcrest are deliberately held back from Google while their data matures, and each page says so itself. They were still listed in the address lists we submit to Google, from two separate files, which is exactly the contradiction Search Console reports as a submitted page marked not-to-be-indexed. Both files now leave them out. Nothing changes for a shopper.
How we test it Count held-back brand pages in the parts address list and the image address list: 358 before, none after. Then watch the submitted-but-not-indexed count in Search Console fall.
Evidence Both address lists read on both stores, counting entries per page rather than raw text matches.
| What was counted | prod today | crop-dev.app |
|---|---|---|
| Entries in the parts address list | 2,727 | Could not be measured — the file is not served at all |
| Of those, held-back brand pages | 358 — Ferris 123, Kuhn 163, McHale 41, Marcrest 31 | Could not be measured |
| The same pages in the image address list | The same 358, with the same split — the same pages submitted a second time | Could not be measured |
| Why the test copy is dark | Open to Google, with an address list | Closed to Google entirely by design, so the whole address-list surface is switched off |
The before is exact and checks out against itself: 123 plus 163 plus 41 plus 31 is 358, and the identical 358 appears in both files, which is precisely the "from two places" this change is about.
The after cannot be observed anywhere before Friday. The test copy serves no address lists at all, because it is deliberately closed to Google. That is a missing file, not a count of zero, and it must not be reported as zero. The only place this change can be confirmed is the store itself, after the promote.
Roll back or fail forward Roll back — a filter on two files, no data change.
Browse-by-Type links arrive with the page now, instead of a grey band that only fills in later Vova on dev fix front#3542
What it is The browse-by-type block on the parts and brand pages arrived after the page did. With scripts off you saw eighteen grey placeholder tiles that never filled, and on the parts page nothing at all. That block is the path Google follows to every brand-and-type page, so none of those links were in the first delivery. They are in the page itself now: eleven labelled links with model counts, no placeholders, and one fewer deferred section on each page.
How we test it Fetch the brand page as a crawler and count browse links in the first delivery: 0 before, 11 after, with no grey placeholders. Load it with scripts off and the tiles are real links.
Evidence Each page was split at the point where the first delivery ends and the later-filled part begins, and the links counted on each side of that line.
| What was counted | prod today | crop-dev.app |
|---|---|---|
| Parts page — browse links in the first delivery, against links filled in later | 0 in the first delivery, 12 filled in later | 11 in the first delivery, 0 filled in later |
| Brand page — the same split | 0 in the first delivery, 11 filled in later | 11 in the first delivery, 0 filled in later |
| Places on the page that wait for later content, as an independent cross-check | Parts page 7, brand page 5 | Parts page 6, brand page 4 — exactly one fewer on each, the browse block |
| Total browse links anywhere in the page, so only the delivery moved | Parts page 12, brand page 11 | Parts page 11 — the one construction link removed above — brand page 11 |






The brand page, the second surface this change touches. Once loading has finished the two look the same; what moved is that the browse links now arrive with the page instead of being filled in afterwards.
This is the cleanest measurement of the set and it agrees with itself three ways: the links move from the later half to the first delivery, the number of places waiting for later content drops by exactly one on each page, and the total link count is preserved apart from the one link deliberately removed. It is worth saying why the obvious check is a trap — searching the whole page finds the links on the store too; they are simply in the half that arrives afterwards.
What this does not prove. We measured what the two stores send, not what a browser with scripts switched off actually draws, so the eighteen grey placeholders going to none is unverified here. The pair of pictures above is identical, which is expected and is not a null result: they were taken with scripts on, and once the scripts have run the block occupies the same space either way. The change is in what arrives first, which a picture cannot show.
Roll back or fail forward Roll back — one page area, and note it puts the type lookup on the critical path if search hangs.
Staying up — 6
Pages inside a customer's account can be prepared in advance again, so they open without a wait Vova on dev fix front#3522
What it is One setting on the account area hit a known fault in the site framework: it switched off preparing pages in advance for everything under Account. Links to order history, addresses and the rest each waited on a fresh request instead. The setting is removed. The signed-in measurement of how much quicker it feels is still owed, so we are describing the mechanism, not a number.
How we test it Signed in, click through Account, Orders and Addresses with the network panel open: the next page should already be requested before the click lands.
Evidence What could be checked from outside is the safety half — that a signed-out visitor is still turned away before anything renders.
| What was asked | prod today | crop-dev.app |
|---|---|---|
| The account page, signed out | 307 → sign-in, a 15-byte reply, nothing renders first | 307 → sign-in, identical |
| The same page asked for the way a prepared-in-advance link asks for it | 307 → sign-in, with the same caching instruction | Byte-for-byte the same reply |
This confirms the property that actually matters for safety: removing the setting did not open the account area to anonymous visitors, and the guard still fires before the page is built, on both sides.
It proves nothing about the benefit. Preparing pages in advance inside the account is a signed-in behaviour that happens in the browser. From outside, with no sign-in, both copies look the same and there is no observable before and after.
Roll back or fail forward Roll back — one line; the account area stops preparing pages in advance again.
A first-time shopper with nothing saved no longer records a cart failure that never happened Vova on dev fix front#3517
What it is When someone signed in who had never saved a cart, the cart service answered that there is no cart, and the site treated that as the service being down. Nothing broke for the shopper, but every one of those first visits was recorded as a live error, which buries the real ones. It is now read as what it is, an empty cart.
How we test it Sign in with an account that has never saved a cart and load any page: the cart is empty and no cart-service error is recorded.
Evidence None was taken. This needs a signed-in account that has never saved a cart, which is a state we can create but not observe from outside, and the thing being removed is an entry in our own error log rather than anything on screen. A shopper sees the same empty cart before and after.
Roll back or fail forward Roll back — one small change to how one answer is read.
Building the address lists we send Google stops overloading our own search service Vova on dev fix front#3519
What it is When we build the address lists we submit to Google, we ask our own search service for the parts in batches. We were asking for ten at once against a service that accepts two, so four to eight of every ten were turned away and retried, roughly four hundred a day. It now asks for two at a time. The lists themselves come out identical.
How we test it Build one address list and count the rejections on the search service in that window: zero, rather than four to eight per ten batches.
Evidence None was taken on the test copy, for the same reason as the change above it: the test copy is closed to Google and serves no address lists at all, so there is nothing there to build. The before is the rejection count on the live search service; the after can only be counted after Friday's promote. What a shopper or Google sees does not change either way — the lists come out the same, and their fail-safe is untouched.
Roll back or fail forward Roll back — one number; the daily self-inflicted rejections return.
A server that has gone bad now steps out of service and restarts itself, instead of slowing everyone for hours Denis on dev fix ps#587 ps#590 ps#591 ps#592 ps#593
What it is On a good day a shopper sees nothing here. One shipping-quote server had lost its database connection and stayed in service for thirteen and a half hours, slowing quotes for everyone who reached it. Nothing caught it, because the short health answer it gave always said fine no matter what. Five changes give the same treatment to five servers, and the differences between them are deliberate.
The shipping-quote server now says it is unwell when its database is unreachable and restarts itself after about two minutes of that. The payment server, which sits on the same checkout path, stops receiving traffic after about thirty seconds and restarts after about three minutes — deliberately slower, because a payment can be in flight and a restart would drop it. The parts catalogue server and the accounts server get the same, and the build now refuses to ship any server that is missing its checks or has one set up wrongly, with three servers deliberately left out and the reason for each written into the check rather than left implied. The image server used to answer ready no matter what; it now genuinely reaches the image store before answering, within a three-second cap. The catalogue-book servers had the opposite problem — they took themselves out of service entirely whenever the image store hiccuped, even though everything they serve from the database was fine; storage moved to a separate deeper check, and that deeper check is also what a new version now has to pass before it takes traffic, replacing a release gate that checked nothing at all.
How we test it Describing each live server shows the restart check on it. Shipping quotes: 221 tests pass, with the same two pre-existing network failures as before. Payment: 861 pass, 6 fail — the same six local-environment failures as before. The build guard reports five servers required and twelve checks verified, and removing one server's checks makes it fail by name. Images: 13 tests pass against 8 before, and the new ones fail on the old code with exactly the wrong answer it used to give. Catalogue books: with storage down the ordinary check stays green and the deeper one goes red, pinned by tests.
Evidence
| What was asked | prod today | crop-dev.app |
|---|---|---|
| Shipping-quote server, "are you ready" | Always answered yes | Matches the full health answer, and says no when the database is unreachable |
| Image server, "are you ready" | Always answered yes, with a fixed reply that checked nothing | Reports the storage check, and says no when the store cannot be reached |
| Catalogue-book servers, with storage down | The ordinary check said no, taking every one of them out of service | The ordinary check says yes and the deeper one says no |
The store has no health checks at all today, on any server. That is the before, and it is the reason this group exists. The check that stops traffic reaching a bad server has been proven on one test-copy server only — the image one. Everything above lands on the store for the first time on Friday.
Roll back or fail forward Roll back — settings plus a few health answers and a build check; every server runs exactly the same without them, which is precisely the state we are leaving.
Servers stopped running out of memory and being killed; the accounts one died five times in two weeks Vova on dev fix ps#597
What it is Four servers were slowly eating memory until the platform killed them, and the accounts server was killed five times in fourteen days, most recently on 11 August. The cause was a connection setting that threw away every idle database connection each minute and immediately rebuilt it, roughly forty-seven thousand rebuilds a day against a handful of real requests. Putting that setting back to the maker's own default cuts the growth by roughly forty to seventy per cent. It is not the whole story: the rest is a known bug in the runtime we use, fixed in a version we have not moved to yet, so restarting a server stays the fallback while it is needed far less often.
How we test it Two live servers run side by side on the same size, booted sixteen minutes apart: the new setting climbed 1.91 points an hour, the old one 4.69. A build check fails if the old setting comes back anywhere.
Evidence The side-by-side above is the measurement, and it was taken on live servers rather than on the change itself. It is honest about its own limit: it halves a climb rather than ending it, and the cure is a runtime version we have not yet moved to.
Roll back or fail forward Roll back — a connection setting returned to its maker's default; one value either way, no queries and no pages change.
Nearly 49,000 Kuhn parts that no supplier can sell are marked as such, so the nightly check skips them Alex already applied data hub#396
What it is The Kuhn dealer portal has never answered for 48,709 of the Kuhn parts in our catalogue, and it is not a gap we can close: only 96 of them appear in the dealer stock file and none carry replacement numbers. They are now marked as parts we cannot sell, so the nightly stock check stops re-asking about them, which had been costing 25,000 calls a night. Shoppers see no change yet. Whether these should also drop off the catalogue pages is still an open question.
How we test it Counted directly on the live database: 54,959 of 236,680 Kuhn parts marked, matching the saved list of 48,709 newly added.
Evidence The count above was read from the live database, which is also where this change was applied — it did not travel through a release, so there is nothing for Friday to promote. It is listed here because it belongs to this week's work and because it changes what the nightly check does.
Roll back or fail forward Roll back — the 48,709 part numbers were saved to a list, so reversing it is exact.
Internal — 28 changes nobody outside the team can see
Tests, build plumbing and dependency updates. Nothing below changes anything on a page. They are grouped by what they were for, rather than listed one by one, and every one of them appears with its own before and after in the table further down.
Tests that can now sign in Until this week the automated checks could only see the site the way a signed-out visitor does, so everything behind the account wall went untested. They now sign in as a customer or as a staff member first, and a run that signs in as nobody fails instead of reporting green. A second check proves that a photo uploaded through the admin tool actually reaches the page it was applied from — New Holland is pinned as broken there on purpose, so the day it starts working we hear about it. front#3317 front#3325
Tests that had quietly stopped meaning anything Ten page-structure checks had been waiting for markup the site stopped producing months ago, so all ten reported skipped and proved nothing; they now run and pass on every brand page. The check that stops a customer paying yesterday's price was skipping at exactly the moment a real fault would show — with the price tolerance loosened on purpose it now goes red, as it should. The ten most out-of-date unit tests were read against the code they actually cover: five of them would have kept passing if the behaviour they describe had been quietly undone, and those five now fail if it is. Nothing was deleted. And a daily comparison that had been red since last week's release is honest again: it was failing over two production fixes already in place under different names, so it was guarding nothing. front#3481 front#3518 front#3502 front#3486
Tests failing on the clock rather than on a fault Under load a different set of tests failed on every run, always by running out of time rather than by finding anything wrong, which teaches everyone to ignore a red result. A hidden one-second-and-a-half limit had been hand-set in twenty-three separate places; three runs on one day failed at 1520, 1520 and 1535 milliseconds. It is now one setting of five seconds, and the shard that had been failing passes 2,425 tests. The overall limit was raised the same way, and two runs in a row now pass 2,434 tests with no time-outs at all. front#3467 front#3527
The nightly check that really pays with a test card This one had failed twenty-eight nights running, so the money path was going unchecked every night. The first repair made it pick the card option before waiting for the card fields, which Stripe no longer shows straight away. The real cure came a few days later: the control it had been clicking has no size on screen, so the click reached nothing; it is now driven directly. The run passes for the first time in twenty-nine attempts, placing a real order and getting an order number back in forty seconds. Note that this check reads the production copy of the site, so it does nothing until Friday's release lands. front#3482 front#3531
The overnight test runs The deep browser run gave one verdict over 51 checks and had been red on all 28 nights it ever ran, so nobody read it. It is now split: eighteen proven checks that must stay green and can raise an alarm, and thirty-two parked openly, each with a stated reason and a named owner. Thirteen checks written for a phone screen had never once been run — one of them named a file that does not exist — and the first real run reports 37 passed, 9 failed and 3 skipped, with the nine written down. Nine of these overnight runs also moved onto our own machines, which takes about 118 of the 187 metered minutes we were spending in a week, against an account limit that blocks every project at once when it is reached. Nobody waiting for a review is affected. front#3504 front#3507 front#3525
A design tool nobody had used in weeks Every change that touched a screen queued a job that did its work in 13 seconds and then burned a 20-minute time-out and reported cancelled. The tool, its 40 examples and that job are all removed; the three checks that actually guard the site still report under the same names. front#3500
Keeping the ingredients current The site framework moves to the current build, which closes six security advisories and four in the image library, and deletes a waiver we had been carrying. Nothing renders differently. Separately, the security check on our own build passes again: it had been failing on two advisories in a small library, blocking every build, and both are now recorded as unreachable — every call in our code passes a fixed size — with the exact condition written down for deleting that record. front#3344 front#3491
The plumbing behind the health checks Six changes, one story, and not a flattering one. The release for the catalogue-book server kept failing because the build machines' cloud tool did not understand the new health setting. We asked for a newer version of that tool, which turned out not to exist. We dropped the setting to unblock a server that had been stuck on an old version for days. We ran one deliberate test release to find out what the build machines actually run, because no log had ever printed it and every claim about it, mine included, was guesswork. It printed 568, below the 573 the traffic check needs, and the tool now updates itself past its own catalogue's ceiling. A test-side server was also found with no restart check at all while the guard reported all clear, because it only looked at the live side; the guard now fails when a live setting has no test-side twin. ps#598 ps#599 ps#604 ps#605 ps#606 ps#601
Release checks on the search service One of them had written the fault down as a rule: it asserted that a part CNH lists as available to order can never read out of stock, which is exactly the thing being corrected this week, so it had to be straightened out before the stock fix could go out. It now confirms only what it promises, and the full run is 202 pass, 0 fail. The Kuhn and Ferris catalogue checks existed but nothing ever ran them at release time, and two of their expectations no longer matched the live site; they now run on every release and print a warning, and the pass banner can no longer claim green when they went red. search#878 search#870
Groundwork that is not switched on yet Vendor part photos: Ferris uploads were writing a brand code the database does not carry, and a refused write came back as a blank error. Both are corrected, and it stays inert until the database permission lands. The catalogue books were copied from the old database into the new one — 1,997 books and 99,722 pages, safe to re-run, with 105 skipped and counted rather than dropped — and nothing reads them from there yet, so shoppers see the same pages as before. And the new customer pay link broke a page-structure check on every review opened after it, because a one-time link has no sample address to test; it is excluded for the reason already written beside it, with a guard against the exclusion being quietly dropped. ps#579 ps#581 front#3539
A new internal report The CNH parts demand workbench used to be a file someone had to open by hand, outside the reporting dashboard. It is now a National Demand report under Parts in the internal dashboard: 45,916 rows, searchable, with part numbers linking to the store. This one lives in the internal reporting dashboard rather than in the store, so Friday's release does not touch it. bi#197
Everything in this release — 53 changes, each with its own before and after
The store website 28 changes 8 a customer or Google can notice
| Change | What it is | Before | After | Built by |
|---|---|---|---|---|
| front#3488 | Staff can build a cart for a customer and send a link; the customer clicks and pays. | no way to produce a payable link; the order taken this way on 7 August was built by hand in the payment dashboard and never reached our system | one form produces the link and the pay page; on dev the address answers but quotes are switched off there, so paying one end to end is not yet proven | Vova |
| front#3528 | Parts we only quote by phone no longer show a one-cent price with a working buy button. | a quote-by-request part showed a $0.01 price, and that one-cent price sat in the page's own product data for Google to read | the same part shows Contact for price and puts out no product data at all; a control part in the same status beside it did not move | Vova |
| front#3542 | Browse-by-Type links arrive with the page, instead of a grey band that only fills in later. | first delivery of the brand page carried 0 of 11 browse links and 18 grey placeholders; the parts page carried 0 of 12 and nothing to see | both pages deliver 11 real, labelled links with their model counts and no placeholders, and each carries one fewer deferred section | Vova |
| front#3520 | 358 pages we tell Google not to index are no longer submitted to it. | address lists carried 358 held-back part pages (123 Ferris, 163 Kuhn, 41 McHale, 31 Marcrest), and the image list repeated the same ones | both files leave them out, so the two finally agree; the test copy publishes no address lists at all, so this one can only be confirmed after Friday | Vova |
| front#3515 | The brand filter on the parts page stops offering brands the page cannot account for. | the desktop parts page offered 15 brands to tick against the 9 the page itself reports | desktop offers the same 9 the page reports; of the 15, only Ferris actually disappears from the list | Vova |
| front#3516 | Construction tiles open the construction section directly instead of bouncing through a redirect. | the parts page linked construction through an agriculture address that redirected on every click | that link is gone, the agriculture browse list drops from twelve tiles to eleven, and the equipment page no longer carries the agriculture-routed construction link | Vova |
| front#3533 | A brand diagram page that came up empty now offers categories to click instead of a dead grid. | the brand diagram page could render a complete page with every count at zero, no cards, no message and no way forward | the same state shows the category picker with its own categories and counts; that empty state is not occurring on either store today, so it was not exercised | Denis |
| front#3522 | Pages inside a customer's account can be prepared in advance again, so they open without a wait. | no page under Account could be prepared in advance; every click there waited on a fresh request | a signed-out visitor is still sent to sign-in before anything renders, identically on both stores; the speed-up itself needs a signed-in session and was not measured | Vova |
| front#3517 | A first-time shopper with nothing saved no longer records a cart failure that never happened. | a signed-in shopper with no saved cart made the site record a cart-service failure on first page load | the same answer is read as an empty cart: no error and no log entry, and the shopper sees the same empty cart as before | Vova |
| front#3519 | Building the address lists we send Google stops overloading our own search service. | list building fired ten requests at once at a service that accepts two, causing about four hundred self-inflicted rejections a day | at most two requests are in flight at a time; list contents and their fail-safe are unchanged | Vova |
| front#3521 | The search panel's opening animation is decided by one rule now, instead of two that raced. | the header search panel carried two competing opening animations, and the winner was decided by styling order rather than intent | exactly one animation is applied, the intended one; the panel looks and moves the same as it does today | Vova |
| front#3317 | Automated checks can now sign in as a customer or staff member, so the account area is finally tested. | automated checks could only see the site as a signed-out visitor; everything behind the account wall went untested | the checks sign in first, and a run that signs in as nobody now fails instead of reporting green | Denis |
| front#3325 | A check now proves a photo uploaded for a brand page actually shows up on that page. | nothing proved that a photo applied through the admin tool ever reached the page it was applied from | a check fetches that exact page and confirms the photo is served; New Holland is pinned as broken so the day it works, we hear about it | Denis |
| front#3344 | The site framework moves to the current build, closing six security advisories and four image-library ones. | the site ran on a framework snapshot from late June; six advisories fixed since then were still open, and an image-library waiver stood | framework and image library are current, the waiver is deleted, and nothing renders differently | Vova |
| front#3491 | The security check on our own build passes again, on two advisories our code cannot reach. | the security check failed on two advisories in a small library, and that failure blocked every build | both are recorded as unreachable — every call in our tree passes a fixed size — with the exact condition for deleting the record | Vova |
| front#3500 | A design-tool setup nobody had used in weeks is gone, and with it a job that hung for twenty minutes. | every screen-touching change queued a job that did its work in 13 seconds then burned a 20-minute timeout and reported cancelled | the tool, its 40 examples and that job are removed; the three checks that guard the site still report under the same names | Denis |
| front#3467 | Slow test machines no longer fail tests that work, so a red result means something is broken. | under load a different set of tests failed on every run, always by running out of time rather than by finding a fault | the time limit is set once and generously; two runs in a row pass 2434 tests with no time-outs at all | Denis |
| front#3527 | A hidden one-second limit set in twenty-three places is now one setting, ending a class of false failures. | twenty-three places each hand-set a wait of a second and a half; three runs that day failed at 1520, 1520 and 1535 milliseconds | one setting of five seconds replaces all twenty-three, and the shard that had been failing passes 2425 tests | Vova |
| front#3481 | Ten checks that had quietly skipped for months now actually run on every brand page. | ten page-structure checks waited for markup the site stopped rendering, so all ten reported skipped and proved nothing | the same ten run and pass everywhere: twenty passed, none skipped | Denis |
| front#3502 | The ten most out-of-date tests were read against the code they cover; five now catch a real revert. | all ten passed, and five would have kept passing if the behaviour they describe had been quietly undone | those five now fail if the behaviour is undone; the other five were checked and recorded as still correct — nothing was deleted | Denis |
| front#3518 | The check that stops a customer paying yesterday's price now fails instead of skipping. | the stale-price check skipped exactly when a real fault would show, so a loosened price tolerance would have merged green | every outcome after its own health probe is now an assertion; with the tolerance loosened on purpose, the check goes red | Vova |
| front#3482 | First repair to the nightly check that really pays with a test card, red for seven nights running. | the nightly card-payment check had failed seven nights in a row, waiting for card fields Stripe no longer shows straight away | the check picks the card option first; the real cure arrived a few days later in the follow-up | Denis |
| front#3531 | The nightly check that really pays with a test card is green for the first time in 29 runs. | none of the last 28 runs passed; each timed out after clicking a control that has no size on screen, so the click reached nothing | the control is driven directly rather than clicked, and the run passes with a real order and an order number in 40 seconds | Denis |
| front#3486 | A daily check that had been red since last week's release is honest again. | a daily comparison stayed red over two production fixes that were already in place under different commits, so it guarded nothing | both are recorded with the command anyone can run to confirm them; the check still fails on anything genuinely missing | Denis |
| front#3504 | The nightly browser run splits into eighteen checks that must stay green and thirty-two openly parked. | one verdict over 51 checks, red on all 28 nights it had ever run, so nobody read it any more | eighteen proven checks block and can raise an alarm; the other thirty-two run without blocking, each with a stated reason and an owner | Denis |
| front#3507 | The phone-sized browser checks ran for the first time, and found nine things worth looking at. | thirteen checks written for a phone screen had never once been run, and one of them named a file that does not exist | a nightly run on a phone screen reports 37 passed, 9 failed and 3 skipped, and the nine failures are written down | Denis |
| front#3525 | Nine overnight test runs moved onto our own machines, cutting about two thirds of the metered minutes. | 187 metered minutes in a week, around 800 a month, against an account cap that blocks every project at once when it is reached | nine overnight runs use our own machines instead, about 118 of those 187 minutes, with no effect on anyone waiting for a review | Vova |
| front#3539 | A page-structure check broken by the new pay link is repaired in the same pass that broke it. | the new customer pay link made a page-structure check fail on every review opened after it, since a one-time link has no sample address to test | the pay link is excluded for the reason already written beside the review page, and the exclusion carries its own guard against being dropped | Vova |
The order and payment services 16 changes 2 a customer can notice
| Change | What it is | Before | After | Built by |
|---|---|---|---|---|
| ps#572 | Staff can build a cart for a customer and send a link they pay online, instead of taking it by phone. | no way to send a customer a payable link; the hand-made one on 7 August took $80.85 (the change's own record) and left no order in the system | the address exists and answers on dev, where quotes are not switched on yet; on the store that address does not exist at all | Vova |
| ps#585 | Shipping cost comes back straight away instead of making a shopper wait up to half a minute. | on a server with a dead database connection a shipping quote took 20-31 seconds on 11 August (the change's own figure, not reproducible today); the answer was ready in one | the quote returns as soon as it is worked out; the copy is saved afterwards and a failed save raises an alarm | Vova |
| ps#587 | A shipping-quote server that has gone bad now restarts itself instead of slowing checkout for hours. | the delivery server had no health checks, and its short health answer always said fine, so a server stuck for 13.5 hours stayed in service | it says it is unwell when its database is unreachable, and restarts itself after about two minutes of that | Denis |
| ps#590 | The payment server steps out and restarts when it goes bad, rather than taking checkout while broken. | the payment server had no health checks; one that lost its database kept taking checkout traffic until a person noticed | it stops taking traffic after about thirty seconds of failure and restarts after about three, with both settings pinned by tests | Denis |
| ps#591 | Two more servers restart themselves when they go bad, and the build refuses to ship one without the check. | the parts catalog and accounts servers had no health checks, and nothing in the build noticed a missing one | both carry them, and the build fails if any server's check is missing or badly formed | Denis |
| ps#592 | The image server can now say it is unwell; before it always answered fine, even when it was not. | the image server's readiness answer was a fixed yes that checked nothing, so any check pointed at it was decoration | it reaches the image store before answering and reports the failure by name when it cannot | Denis |
| ps#593 | The catalog-book servers no longer take themselves offline over a storage hiccup they can serve around. | a storage hiccup took every catalog-book server out of service, and the release gate checked an answer that meant nothing | storage moved to a separate deeper check; the servers keep serving the database, and the release gate now uses the deeper one | Denis |
| ps#597 | Servers stopped running out of memory and being killed; the accounts one died five times in two weeks. | four servers grew in memory until killed; accounts died five times in fourteen days, and idle connections were rebuilt about 47,000 times a day | idle connections are kept rather than rebuilt each minute; growth measured 1.91 points an hour against 4.69 on the old setting | Vova |
| ps#579 | Groundwork for vendor part photos; nothing a shopper sees changes yet. | Ferris photo uploads used a brand code the database does not carry, and a refused write came back as a blank server error | the correct brand code is written, the old one still accepted, and a refused write is reported — still inert until the database permission lands | Vova |
| ps#581 | Catalog books were copied into the new database; shoppers see the same pages as before. | the new database held zero catalog books and zero catalog pages, so nothing could be read from it | 1,997 books and 99,722 pages copied across, safe to re-run, with 105 skipped and counted rather than dropped | Vova |
| ps#598 | Release plumbing for the health checks; nothing a shopper sees. | the catalog-book release failed to ship because the build machine's cloud tool did not understand the new health setting | the build asked for a newer tool version, which turned out not to exist, so this was replaced two steps later | Vova |
| ps#599 | A stuck release was unblocked so the catalog-book server could move forward again. | the catalog-book server sat on an older version for days because its release kept failing on a setting the build tool could not read | the unusable setting was dropped, the release completed, and the server moved to the current version | Vova |
| ps#601 | A test-side server was missing its restart check, and the build guard could not see the gap. | one test-side delivery server had no restart check, and the guard only looked at the live side, so it reported all clear | the test side carries the same check, and the guard now fails when a live setting has no test-side twin | Vova |
| ps#604 | One deliberate test release to find out what the build machines actually run. | nobody knew which version of the cloud tool the build machines run; every claim about it was read off a document | one deliberate test release on a test-side image server, which failed and produced the error we needed | Vova |
| ps#605 | The build now prints the tool version it runs, which no log had ever shown. | the build tool's version appeared in no log at all, so every statement about it, mine included, was guesswork | the build prints the version before releasing: 568, below the 573 the traffic check needs | Vova |
| ps#606 | The traffic check works: the test-side image server now steps out of rotation when it cannot serve. | the build tool was capped at 568 by its own catalogue, so the check that stops traffic to a bad server could not be set | the tool updates itself past that cap; the test-side image server now carries that check, confirmed on the live description | Vova |
The search service 7 changes 3 a customer or Google can notice
Four of these seven — the first four rows — are already on the store, moved there on Wednesday 12 August ahead of this release. The remaining three go out on Friday.
| Change | What it is | Before | After | Built by |
|---|---|---|---|---|
| search#877 | A part shows in stock only when a depot actually has one on the shelf. | 127,404 parts read as buyable because CNH listed them as available to order, while every CNH depot held zero | stock comes only from the depot count; 1,052 parts lost their Add to Cart button and 302,665 stay in stock | Vova |
| search#881 | The in-stock count beside search results matches the results you actually get. | searching seal said 183 parts in stock in the filter list, while the results page returned 18,231 | the same search reads 18,149 in stock of 31,947 results on both stores today; the in-stock tag in the type-ahead dropdown is gone | Vova |
| search#869 | Parts from other makers no longer borrow a New Holland price when the part numbers happen to match. | 5,927 non-CNH parts showed a New Holland price they did not own, and 37,077 showed a New Holland shelf count | those parts show their own price or none at all, and a part with no price reads out of stock; CNH parts are unchanged | Vova |
| search#878 | A release check that had locked in the old stock rule was corrected so the fix could go out. | a release check asserted that a part CNH lists as available to order could never read out of stock — the fault written down as a rule | the check confirms only what its filter promises; the full release check run is 202 pass, 0 fail | Vova |
| search#883 | Removed a leftover instruction that told anything reading it to show Add to Cart on out-of-stock parts. | the data we sent carried a ready-made Add to Cart instruction built with no stock input at all — wrong on 835 out-of-stock parts | those two values are gone from every answer; the site works the button out from stock and price itself, so nothing on screen changed | Vova |
| search#887 | Removed a second stock-like value we were handing out that disagreed with the badge on the page. | the data we sent carried a second stock-like value from CNH; on 127,490 parts it contradicted the out-of-stock badge on the page | that value is gone from every answer; the badge, the price and the buy button are unchanged, since nothing was reading it | Vova |
| search#870 | The Kuhn and Ferris catalogue checks now run on every release and warn us before anything reaches the site. | the brand catalogue checks existed but nothing ran them at release time, and two of their expectations no longer matched the live site | they run on every release and print a warning; the pass banner can no longer claim green when those checks went red | Vova |
Catalogue data and internal reporting 2 changes neither goes out on Friday
| Change | What it is | Before | After | Built by |
|---|---|---|---|---|
| hub#396 | Nearly 49,000 Kuhn parts that no supplier can sell are marked as such, so the nightly check skips them. | 48,709 Kuhn parts sat in the catalogue that the Kuhn dealer portal has never answered for, and the nightly check re-asked about them | they are marked as parts we cannot sell and the nightly check skips them; 54,959 of 236,680 Kuhn parts now carry that mark | Alex |
| bi#197 | A new National Demand report for CNH parts is available inside the internal dashboard. | the CNH parts demand workbench existed only as a file someone had to open by hand, outside the reporting dashboard | it is a National Demand CNH report under Parts in the internal dashboard: 45,916 rows, searchable, part numbers linking to the store | Alex |
What v2.2.0 is — the exact thing to go back to
These four rows are what is live right now, read off the running systems on Thursday 13 August. They are the things to go back to if Friday goes wrong. All four are to be re-read after Friday's promote and this table replaced with what actually went out — nothing here is the new release's identity yet.
| Storefront | 703a02de | Unchanged since the 7 August release. Vercel keeps the previous build, so going back is one button. |
|---|---|---|
| Search | search-api-00016-qsc | Changed since the last release page: Vova moved the search service to its current build on Wednesday 12 August, which is why four of the seven search changes below are already on the store. This is the one to go back to only for the three that have not gone out yet. |
| Services | 58a42db9 / 1e0c2cf9 | The payment service and everything else, both from the 7 August release. None of the sixteen service changes in this release has gone out. Note that the store has no health checks on any server today — that is what Friday changes. |
| Database | 20260805213545 | The last migration recorded on the previous release page. Unlike the three rows above, this one was not re-read from the live database — it is Alex's lane and the record is his. The Kuhn change described above was applied directly to the live database and does not appear as a migration. |