← All releases EN  RU

Change control — Friday 28 August

v2.4.0

Nothing below is live yet. This is the release going out on Friday morning. It was drafted on Wednesday on purpose — every “before” on this page can only be measured while the live store is still serving it, and that disappears the moment the release goes out — and it was re-measured against the live store and the finished candidate on Friday morning, because the release grew by fifty-nine changes after that draft was written. Where a measurement could not be taken, the row says so in red rather than showing a number.

The one thing to take from this page, if you read nothing else. This release carries the whole of the work on what Google is allowed to read — and it switches none of it on. Four switches control it; none of the four is set on the live store, and merging on Friday does not set them. So on Saturday morning Google sees exactly what it sees today. Turning each one on is a separate, deliberate act that takes about a minute and can be undone in about a minute. The decision this page needs is which of them to turn on, and when — not whether the code is ready.

One hundred and eighty-eight changes since the 21 August release: one hundred and sixty-two on the store website, eighteen on search, eight on the order and payment services. Six hundred and fifty-two files differ between what the store runs today and what Friday would put there. Two pieces of work account for nearly all of them. The first is deciding, once and in one place, which part pages Google is invited to read, and then making every part of the site agree with that decision. The second arrived on Thursday: every page that exists on the old website now has a home on this one, which needed the parts diagrams to change address to make room. The rest are photographs moving onto our own address, and tidying up after the old database.

One correction to last week’s page before the numbers go any further. It reported sixty-two changes on the store website for 21 August. The correct figure is eighty-three. The count was taken with a tool that turned out to be reading only part of the history and gave a smaller answer without saying so; it has been checked a different way since. Nothing about what shipped on 21 August changed — only the count of it, and the same correction is why this week’s number is larger than last week’s would lead you to expect.

The unusual thing about this release is how little of it takes effect on Friday. The index work ships switched off. That is deliberate, it is reversible, and it is the subject of the first two sections. What does take effect is the second piece of work: new pages that did not exist here before, and two changes of address that carry every old address to the new one in a single hop.

What Friday actually changes on the live store — measured Wednesday, not a forecast

For Google: no change in what it is allowed to read, but two changes of address and ten new pages. Four settings control the index work — whether a page Google is not invited to read answers “not found”, whether the crawl instructions name parts one by one, whether diagram pages are offered, and the master indexing switch. Read off the live store's settings on Wednesday: none of the four exists there, and merging on Friday does not set them. The live store's own behaviour agrees — a part page Google is not invited to read still answers as a normal page today, and the crawl instructions still say nothing about parts. What does change for Google on Friday sits outside those switches, and it is the fourth section: part addresses become lower case, the parts diagrams move out of /equipment, both carrying the old address to the new one in a single hop, and ten pages that only existed on the old website appear on ours.

For a customer: four things, and one of them is a problem. Photographs move onto our own address, which nobody will notice and which is the point. The dealership pages from the old website — service, staff, hours, employment, the credit application — exist here for the first time. Checkout’s summary states a final amount instead of a subtotal followed by “plus shipping”, and names free shipping as free. And searching by an exact part number stops working on the test site — see the first item below. None of these four is behind a switch, so unlike the index work they take effect on Friday whether we want them to or not.

The old database is already gone, and that was not this release. It went out on Monday, Tuesday and Wednesday of this week, outside the train, and it has its own page as v2.3.1. What is left of it in this release is tidying: deleting code and comments that referred to it. None of that is visible from outside.

What the call has to decide — found Wednesday, ahead of the promote

Searching for an exact part number answers “Service Unavailable” on the test site, where the live store returns the part must settlea customer can see thisfront#3817, front#3818not on the plan

The change was a good one: type a part number into search and land on that part, instead of a results page holding a single card. On the test site it does not land on the part. It answers Service Unavailable — the page a customer sees when something is broken.

Before — the live store today/parts?q=CT-NHL-100016 answers 200 with the results grid, and the part is among the cards. q=CT-NHL-100038, q=100412: the same. A word search, q=bearing: the same.

After — the candidate today/parts?q=CT-NHL-100016 answers 503, with no results in the page. So do q=100016, q=CT-NHL-100038 and q=100412. q=bearing still answers 200, so this is not search being down — it is exactly the part-number searches, which are the ones customers actually use.

Re-measured Friday morningUnchanged on the finished candidate — the exact tree the promote carries, not an earlier one. All four part-number searches still answer 503; q=bearing still answers 200; the live store still answers 200 to all five. Thursday's search fix (front#3904) is a different path: it corrected pressing Enter in the search box at the top of the page, which now lands on the part instead of on an unrelated diagram. Opening the results address directly is still broken.

Why it happensThe site works out that one result matches exactly and tries to send the customer straight to that part's page. By the time it decides, it has already begun sending the results page, and a redirect that arrives too late turns into an error instead. The code's own comments describe this exact behaviour having been seen on the test site, so it is a known shape rather than a new mystery.

One thing could not be established, and it decides how serious this is. Every response on both sides came back marked as served from cache, and adding a unique parameter did not force a fresh one, so this cannot tell apart “the test site produces a 503 now” from “the test site produced one earlier and is still repeating it”. The first is a reason to hold the release; the second is a stale page. Someone has to force an uncached render before Friday and say which it is. No number has been invented to cover the gap.

What is not in doubtThere is no issue tracking this. front#3817 is closed as done on the strength of front#3818, which is the change measured above. Whatever the answer, that issue is closed against work whose result has not been confirmed on a real request.

Production todayThe candidate
production, search-exact-sku candidate, search-exact-sku
The same exact part-number search on both sides. Desktop, 1440 wide. The live store returns the part; the candidate returns a service error.
Production todayThe candidate
production, search-word candidate, search-word
The control: a word search, same moment, same widths. Both sides answer normally — so search itself is not down.
the command and its output on both sides
The four part numbers tried, and what each side answered.
Which of the four switches to turn on, and in what order — the code is ready and no switch is set must settleGoogle can see thisfront#3809, front#3833, front#3843, front#3854plan 01

The whole index programme is behind four settings, and turning them on is the release, not the merge. Each is one setting, applied without a rebuild, and each is undone the same way. They are listed here in the order they make sense, because two of them are meaningless without the first.

1. A page Google is not invited to read answers “not found” Today a part page carrying nothing still loads as a real page and merely asks Google not to list it. Google reads such a page, decides it is thin, and holds that against the rest of the site. With the switch on, the same address answers not-found outright. Measured: a Ferris part answers 200 with a full page today and 404 on the test site, while a New Holland part that is invited answers 200 on both. So it is selective, which is the thing worth checking.

2. The crawl instructions name each invited partToday the instructions say nothing about parts at all: 13 lines, none about /parts/. With the switch on they hold 4,783 lines — a blanket “do not read parts”, then the 2,384 invited parts named one at a time, in both address forms. This is the one with real consequences if it is wrong, because it tells Google to stop reading everything not on the list.

3. Diagram pages, and what the sitemap offersToday the sitemap offers 2,415 addresses. With the switch on it offers 18,663. That is the number this week's plan quoted as 18,657 — the plan read it from the test site. The live store offers 2,415 today.

4. The master indexing switchNot set on the live store either. Nothing below it can be turned on before it is.

A decision, not a task, and it is John's: turning switch 2 on is the moment we tell Google to stop reading roughly ninety-nine per cent of the part pages it can currently see. That is the intended outcome and it is still the largest single instruction we have ever given it. It should not be turned on in the same hour as the release.

Kuhn part pages stay withheld from Google, and this release does not change that must settleGoogle can see thisfront#3666plan 01

The Kuhn brand page answers today and will answer on Saturday; what it says about itself does not change. Measured: /parts/brand/kuhn answers 200 on both sides and carries “do not list this page” on both. What does change on the test site is that it stops passing Google on to the individual Kuhn parts it lists.

The reason it is withheld is unchanged and is not a decision anybody has taken this week: the Kuhn data takes between twelve and sixty-nine seconds to answer, which slows Google's reading of the whole site. It is written up as front#3666 and it has no owner. This week's plan says the same thing in the same words. Naming an owner is a one-line decision and it has now been outstanding across two releases.

Production todayThe candidate
production, brand-kuhn candidate, brand-kuhn
Kuhn’s brand page on both sides. Deliberately identical: this release does not release Kuhn to Google.

What Google would read, once the switches are on — measured on the test site, where they are on

A part page nobody is invited to read: today a real page, on the test site a plain not-foundmeasuredGoogle can see thisfront#3809, front#3810, front#3827, front#3828plan 01

Before — production today/parts/CT-FER-1650347SM: 200, a 277,856-byte page, carrying noindex, follow and a canonical address pointing at itself, with the full product description Google reads for a real product. In other words: a page that says “do not list me” while looking exactly like a page worth listing.

After — the candidate todayThe same address: 404, 101,782 bytes, noindex, nofollow, no canonical address, and none of the product description. Not a page pretending to be missing — a page that is missing.

The control/parts/CT-NHL-100016 answers 200 with index, follow and its full product description on both sides. That is the row that proves the change is selective rather than blanket, and it is the one to check first if anything looks wrong after a switch is turned on.

Production todayThe candidate
production, pdp-held candidate, pdp-held
The same withheld part page on both sides. Desktop, 1440 wide.
Production todayThe candidate
production, pdp-held candidate, pdp-held
The same pair on a phone, 390 wide.
Production todayThe candidate
production, pdp-control candidate, pdp-control
The control: a part that stays open, at the same moment. Unchanged on both sides, which is what makes the pair above a decision and not an outage.
Staff can still open a withheld part, at an address Google is not sent tomeasuredfront#3834, front#3843, front#3854plan 01

If a part page answers not-found, the parts desk still needs to be able to look at it. That is what /lookup/ is: the same part, at an address that exists for people and not for Google.

Before — production today/lookup/CT-FER-1650347SM answers 404. The address does not exist.

After — the candidate todayThe same address answers 200 with the part on it, marked noindex, nofollow and carrying no product description for Google to read.

The part that took four attemptsGetting this right meant walking a narrow line: the twin has to be readable enough for Google to see the “do not list me” instruction, while nothing on the site links to it. Blocking it outright would have been worse than leaving it open — an address Google is forbidden to fetch is an address where it can never read the instruction not to list it. That mistake was made and undone inside this release, which is why several of the lines at the bottom of this page contradict each other in sequence.

Production todayThe candidate
production, lookup-twin candidate, lookup-twin
The staff address for the same withheld part. It does not exist on the live store at all, which is why the left-hand side is a not-found.
The crawl instructions, before and aftermeasuredGoogle can see thisfront#3806, front#3843, front#3860plan 01

Before — production today13 lines. One Allow: /, ten Disallow lines covering the admin, account, checkout and sign-in areas and the ?highlight= addresses, and one sitemap line. Nothing about parts.

After — the candidate today4,783 lines. The same ten Disallow lines, plus Disallow: /parts/, plus Allow: /parts/brand/ to keep the brand pages readable, plus 4,768 lines naming 2,384 parts one at a time — each in both the full form and the bare part-number form, because the equipment pages link to one and the search results link to the other.

The check that makes this safeThe 2,384 parts named in the crawl instructions are the same 2,384 in the sitemap. Those two lists agreeing is the whole safety property: a part offered to Google in one and forbidden in the other is a page it will fetch and fail on. A new automated check compares them on every change, and it is now part of the gate the release has to pass.

the command and its output on both sides
The crawl instruction file on both sides, in full. The cut is not in either — it ships switched off.
the command and its output on both sides
How many addresses each sitemap offers, on both sides.
A withheld part disappears from the product feed — the brand half of it onlymeasuredfront#3835plan 01

The feed we send to Google Shopping listed products whose page will answer not-found once the switch is on. A product in the feed that leads to a missing page is the shape that gets a feed suspended, so the feed now drops those rows.

The correction inside the releaseThe first version of this dropped rows from the whole feed rather than from the brand section. That was caught and corrected within the same release — both lines are at the bottom of this page, in order, rather than the second one silently replacing the first.

The feed is not being read by anybody today. Merchant Center has never been created, which is on this week's plan as a decision waiting on John, so this change protects something that is not yet switched on. Worth doing, worth knowing.

Photographs move onto our own address — the one thing that does change on Friday

One photograph, one address, whichever host originally named itmeasureda customer can see thisfront#3803, front#3804, front#3812, front#3814, front#3820, front#3831, front#3838plan 01

Part photographs were being loaded from two different addresses depending on where they came from. One was ours; the other was a separate host. The same photograph could therefore have two addresses, be fetched twice, and be counted by Google as two pictures.

Before — production todayOn /parts/CT-NHL-100016: 112 photographs through our own resizing service, 14 from a second host, 2 from our own images folder, and 6 video thumbnails from YouTube.

After — the candidate todayThe same page: 112 through our own resizing service, none from the second host, 5 moved onto our own address, 2 from the images folder, 5 YouTube thumbnails. The second host is gone from the page.

Also in this groupThe site now sends one image format rather than offering two, which halves what has to be produced and stored for each photograph. Brand logos that had been overridden were still being served from the old address; they moved too. And the gallery's picture sizes are now declared up front, which stops the browser guessing.

This is the only group on this page with no switch in front of it, apart from the search problem above. It takes effect on Friday.

the command and its output on both sides
Which hosts a part page’s images are served from, counted on both sides.

New pages, and two changes of address — the part of this release that is not behind a switch, measured Friday morning

Twelve addresses that existed only on the old website now work on ours measureda customer and Google can see thisfront#3871, front#3872plan 03

The end state everyone is working towards is that crop.clintontractor.net replaces the old www site. Before that can happen, every page on the old site needs a home here, a decided redirect, or a decided drop. Andrew’s site-structure diagram is the list of what those pages are. This is the first block of it, and the only one that needed nothing from anyone outside the team.

Before — production todayService, the service department, booking a service, the credit application, value your trade, schedule a demo, employment, the email club, the showroom, hours and location, staff, testimonials: all twelve answer “not found” on our site and all twelve answer normally on the old one. Anyone following a link, a bookmark or a Google result to one of them landed on nothing.

After — the candidate todayTen of the twelve are real pages answering normally, and Google is invited to read them. The other two go in one hop to the page that already covers them: the service department to service, the showroom to the brands page. The site’s own map for Google grows from 31 addresses to 41 — the ten new pages are the whole of the difference.

Worth saying plainlyThese are our own words on our own pages, not a copy of the old site. Nothing about them depends on a switch, so they are live from Friday morning.

Machines and attachments for sale get their own pages — and Google is not shown them yet measureda customer can see thisfront#3871, front#3901plan 03

/equipment and /attachments now show the machines and attachments we have for sale, in the same layout as the parts catalogue: the same cards, the same filters, the same search. The listing data behind them is still the snapshot taken from the old site, not a live feed — which is exactly why they carry a “do not index” instruction and are not in the map given to Google.

Before — production today/attachments: not found. /equipment: the parts-diagram hub, a different thing entirely.

After — the candidate todayBoth answer normally and carry noindex. A customer who is sent the address sees the pages; Google is not invited to them until the data behind them is live rather than a snapshot.

What this needs from the callNothing on Friday. The decision to make later is when the listings come from the live source, and only then are they offered to Google.

Every parts-diagram address moves out of /equipment, in one hop measuredGoogle can see thisfront#3871, front#3900, front#3902plan 03

The showcase above needs the word equipment in the address, and the parts diagrams were occupying it. So the whole diagram tree — the hub, the model index and the model and assembly pages under them, about half a million addresses by the count in the move’s own plan — now lives under /parts-diagrams. Every old address reaches its new one in a single hop, keeping anything that followed the address.

Before — production today /equipment/new-holland-speedrower-130-windrower-tier-3-non-flex-can answers 200 and carries noindex, follow. The live map lists no model addresses at all — only the two index pages above them.

After — the candidate todayThe same address answers 308, one hop, to /parts-diagrams/model/ and the same name, query string intact. The two index pages move with it and keep their place in the map under the new name.

What Google actually sees changeThe addresses, and nothing else. The setting that keeps this tree out of Google is set on the live store today — which is why the live map holds no model addresses and every model page says “do not index”. Friday moves them; it does not open them. On the test site that setting is open, which is why the test map holds 16,250 diagram addresses and the live one holds none. That difference is the switch, not the release.

Part addresses are lower case from Friday measuredGoogle can see thisfront#3886, front#3894plan 01

A part page could be reached at two addresses that differed only in capitals, and the site treated the capitalised one as the real address. From Friday the lower-case form is the real one and the capitalised form goes to it in one hop.

Before — production today/parts/CT-NHL-100016: 200, and it names itself as the real address. /parts/ct-nhl-100016: one hop up to the capitals. The map given to Google holds 2,389 part addresses, 2,389 of them with capitals.

After — the candidate todayExactly the reverse, with the same 2,389 addresses and none of them carrying capitals. One hop, never two.

Why it matters and why it is safeTwo addresses for one page is the oldest way to split a page’s standing with Google between two entries. It is settled here in the only way that keeps every existing link working: the old form still resolves, in one hop, forever.

Three old redirects are removed, after sixteen months of nobody using them measuredfront#3873, front#3902plan 03

/catalog, /tires and /favorites redirected into the store. Google’s own record for our site shows no impressions and no clicks on any of them across its full sixteen-month window, against control addresses that returned hundreds in the same measurement. From Friday they answer “not found” instead.

If that turns out to be wrongRestoring one is a three-line change and a deploy. The measurement says nobody arrives that way; if the site’s own error record starts showing one of them after Friday, it comes back.

Catalogue and brand pages — small, and one of them is 27 days old

The brand Diagrams tab opens on every category, not only the firstmeasureda customer can see thisfront#3224, front#3225plan 03, 05

On a brand's page, the Diagrams tab worked when the first category was selected and did nothing on the others. It now opens on all of them.

Measured/parts/brand/new-holland/diagrams answers 200 on both sides. The page is 5.35 MB on the live store today and 4.17 MB on the candidate — 1.18 MB less to download for the same content.

Worth saying plainlyThis change waited 27 days as a draft. It is on this week's plan under “forgotten requests”, and it is the only item from that list that has actually moved. It is a small fix; the point is the 27 days, not the fix.

Production todayThe candidate
production, brand-diagrams candidate, brand-diagrams
The brand Diagrams tab on both sides. Both captures are cut off at the top of the page — the full page is 53,848 pixels tall on the candidate and the image format cannot hold it. The tab opening on every category is visible in the strip of category buttons; the length is not.
Search knows which brands are released to Google, and stops offering the ones that are notmeasuredsearch#933, search#934, search#938, search#942plan 01, 10

Until now the decision about which brands Google may read lived only in the storefront, and search did not know about it — so search results, the popular-parts lists and the diagram part lists could all offer a part the storefront was withholding. Search now reads the same decision from the same place, and the two agree.

This is the second half of a two-part change, and the halves ship by different routes: the storefront on Friday morning, search by a separate swap. If only one half goes out, the two disagree again — which is exactly the state this change exists to end. Both halves have to go out together, and search goes first.

Tidying after the old database — nothing visible from outside

The code that talked to the old database is deleted, along with the comments that described itmeasuredps#702, ps#704, ps#707, ps#709, front#3844, front#3857, front#3858, search#940plan 06

The old database was switched off on Wednesday morning (v2.3.1). What this release does is remove what was left pointing at it: the driver itself, 31 test settings that no longer set anything, the nightly backup job aimed at a cluster that no longer exists, and a scattering of comments that still described the old arrangement to whoever reads the code next. Nothing here is visible from outside the code.

Why it is on this page at allA comment describing a system that no longer exists is how the next person makes a wrong decision confidently. That is not a hypothetical this week — the plan for switching the old database off was itself checked against a description that had gone stale, and that is the near-miss on the v2.3.1 page.

the command and its output on both sides
The payment service’s own health answer, before and after. The old database’s entry is gone from the right-hand side.
the command and its output on both sides
Equipment fitment counted in both databases before the switch-over: the same number, 147,323, from each.
A page that failed is no longer kept and re-served by the cachepart-measuredfront#3830plan 12

When a catalogue page cannot be built because something upstream is refusing, the site now answers with an honest “try again” that is explicitly marked as not to be stored, rather than a page that looks fine and is empty. An empty page that looks fine is the worst of the three outcomes, because Google keeps it.

Measured only in part. The marking is confirmed present on the candidate: the failing responses carry no-store on both the browser and the network cache. What could not be confirmed is that it works — the responses came back marked as served from cache anyway. That is the same unresolved observation as the search item at the top of this page, and settling one will probably settle both.

Production todayThe candidate
production, listing-degraded candidate, listing-degraded
A catalogue page asked for a page number beyond what it can build, on both sides.
A departed colleague's name removed from thirteen places across four repositoriesmeasuredfront × 9, search#941, ps#696, ps#708not on the plan

Ownership lines, test names, code comments and a real work email address used as test data, all still naming someone who left on 20 August. Removed and, where the line stated an owner, replaced with the honest answer — which in two cases is that the lane has no owner.

Worth keepingThis did not come out of the leaving process; it came out of reading the code for something else. The accounts were closed in good order. Thirteen references outlived them, and two of those were the only record of who owned a piece of work.

Against this week’s plan — the twelve items, and what the week actually answered

The week of 24–28 August was planned as twelve items in four lanes. This is each one against what shipped, and every change higher up the page is marked with the item it answers. Two of the twelve moved a long way, four moved a little, and six did not move at all — and of the six, five are waiting on an answer from a person rather than on work. That is the honest shape of the week, and it is worth reading the right-hand column first.

Plan itemWhat the week answeredWhat it did not
Vova — my queue
01 — SEO
Vova + Andrew
Nearly all of it. Deciding once which part pages Google is invited to read, and then making the part pages, the browse grid, the brand pages, the crawl instructions, the sitemaps, the product feed and the saved-parts list all agree with that one decision. Photographs moved onto our own address at the same time.
With one caveat that governs the whole item: it ships switched off. Friday puts the machinery in place and changes nothing Google sees until a switch is turned on afterwards.
The 359 parts across four brands still wait on your answer — that is the cheapest move on the page and it has not moved in a fortnight. Forty-nine links from the product page still lead into a closed zone. The shop. address is still undecided, and the roughly 245 sites pointing at it are still pointing at nothing. Kuhn still answers slowly and still has no owner. The AI descriptions are Alex’s and have not started.
02 — Tests
Vova
The parked tests are cleared: of the thirty-two, twenty-seven were fixed, rewritten or deleted, and the five still parked each carry a written reason. Three of those five are parked because they have found a real fault in the product and are being left red on purpose rather than quietly adjusted to pass. The check that part addresses stay stable now blocks a bad change instead of merely reporting one. Several tests that had been passing without testing anything were given teeth, and the place-order path and the two ownership gates are now covered end to end. The three structural items are untouched: the customer-journey checks are still not required before a change lands, a red check on the live branch can still be walked past, and nothing has checked payment overnight since 13 August. These are the three that would make a green result mean something, and none of them is work — each is a setting.
03 — Moving the site structure onto crop
Vova
The largest single piece of work in this release, and it landed on Thursday. Twelve addresses that existed only on the old website now work here, ten of them as pages of their own. The parts diagrams moved out of /equipment so that machines could have that word, and the machines-and-attachments showcase now lives there. The Diagrams tab also opens on every category of a brand page rather than some. All of it is in the fourth section of this page. The page families that need Andrew: the parts landings and his diagram branch. His structure diagram arrived on 21 August and has not been discussed since, and the showcase still runs on a snapshot of the old site rather than on a live feed — which is why Google is not shown it yet.
Vova and John together
04 — The Iron Connect / DIS API
Vova + John
Nothing. Everything. This item did not move at all this week and nothing in this release touches it.
05 — Forgotten requests
Vova + John
The oldest one shipped: the Diagrams tab, asked for twenty-seven days before it was built. The rest of the list is still open and still unsorted.
Vova and Alex together
06 — Switch off Mongo
Vova + Alex
Done, and done in production, not on a test copy. Equipment fitment moved across on 24 August, orders and the catalogue on 25 August, payment on 26 August, and the old database was deleted the same day. The eight changes in this release are what is left afterwards: deleting the driver, the backup job pointed at a cluster that no longer exists, and the settings and documents that still described it. Nothing. This is the one item on the plan that closed.
07 — John’s two mockups
Vova + Alex
Both are written down on the ideas page with what is already standing behind them and what each would need. Nothing was built. Both. The hybrid architecture drawing also carries one line that is a decision rather than a drawing, and it is recorded there as an open question rather than agreed.
08 — Infrastructure onto the OptiPlex
Vova + Alex
The nightly mobile test was moved off the window in which the office machine exports data, which it had been losing to every night. The cost page you asked for, and the drawing of how it is now against how it should be.
Alex’s lane
10 — Alex’s lane
Alex
Four of the fourteen search changes in this release are his lane’s: search now says whether a brand is released to Google, can return only the rows that are, and no longer corrupts a shared connection when a query hits its size cap. The full nightly supplier sweep also went in. Airflow and two of his open items have not started.
Where the next move is not ours
09 — AGCO first extract
probably not this week
Nothing, which is what the plan predicted for it.
11 — My Garage
John
The test that was blocking it was repaired, so the work itself is no longer blocked from our side. The customer-account hooks it needs are still open.
12 — Andrew’s lane
Andrew
The site’s framework moved off a preview build onto the released version, with the not-found caching cost of doing so recorded rather than discovered later. Andrew’s answers on the page families, which item 03 also waits on.
Not on the plan, but a real part of the week
The offboarding tail
no lane
A colleague left on 20 August and the accounts were closed in good order. Thirteen references to them survived in four repositories — ownership lines, test names, code comments and a real work email address used as sample data. All thirteen are removed in this release. Two of those thirteen were the only written record of who owned a piece of work. Both are now recorded honestly as having no owner, which is true and is not a solution.

Everything in this release — 188 changes, each with a one-line summary written onto the change itself

The store website162 changes 79 a customer or Google can notice
ChangeWhat it isWhat movedBuilt by
front#3871Going back to a search you had already run left the equipment search box empty while the page still showed the results.search box follows an external query changeVova
front#3871The equipment showcase now shows which filters are narrowing the list, and drops a category level nobody used.active-filter readout added, leaf category removedVova
front#3943Three automated checks recognised a diagram page by a fragment of its address, and broke when the diagrams moved.selectors match by test id, not by URL fragmentVova
front#3944A cart test failed on a phone-sized screen because it waited for a count that renders off-screen.toBeAttached instead of toBeVisibleVova
front#3940A filtered listing for a held brand kept its 'do not index' instruction only when the brand was spelled one exact way.brand value normalised before the robots decisionVova
front#3946Choosing a held part from the search dropdown sent the customer to an address that answers not-found.one resolver for every suggestion rowVova
front#3932A note in the code still said the equipment pages were unreachable, after they had moved and become reachable.comment correctedVova
front#3939The payment smoke test bought a part the index gate now hides, so it failed on the test site rather than on a real fault.buyable SKU resolved at run timeVova
front#3920Sign-in carried the page you came from inside its own address, and that value could be pointed at an outside site.return path off the URL; only same-site paths acceptedVova
front#3930A shared-cart link with a malformed code is now rejected before it reaches the cache, and the staff email no longer contradicts its own subject line.token shape checked outside the cached pathVova
front#3937Checkout said 'Total $975.94 + shipping' and quoted a delivery charge that no longer exists; it now states the final amount, with tax as a footnote.order total is final, shipping reads Free, approved lane titlesVova
front#3947The release's own index check judged a result by which event started it rather than by what it measured.gate scoped by measured surfaceVova
front#3913The main shop button on nine of the ten carried brand pages led to an empty list: Landoll showed nothing where its own catalogue holds 4,767 parts.brand CTA points at /parts/brand/<slug>Vova
front#3871Typing in the equipment showcase now filters the list on the page as you type.client-side filter over the loaded rowsVova
front#3938The same index check ran against a surface that cannot answer it, and reddened work that was fine.gate runs only where the switches existVova
front#3871The equipment page said the same sentence twice, once in the heading and once in the toolbar.duplicate subline removedVova
front#3871A single machine's page now reads like a part page rather than like a different site.unit page adopts the PDP heroVova
front#3871The equipment list now uses the same cards, filters and density controls as the parts catalogue.showcase listing adopts the /parts design languageVova
front#3184Overnight delivery was offered on the basis of a back-order flag rather than on whether the depot actually holds the part.cnh-overnight decided by depot availabilityVova
front#3871The phone menu still linked to the old website.legacy www link removedVova
front#3871The new dealership pages are linked from the footer, so they can be found without knowing the address.dealership column added to the footerVova
front#3871The equipment showcase is written in customer language, with our own calls to action above the fold.customer-voice copy, CTAs above the foldVova
front#3871The attachments page offered filters describing whole machines rather than attachments./attachments filter rail describes the attachment sliceVova
front#3918The new pages carried a breadcrumb trail in the markup that a reader could not see; both now agree.one trail feeds the visible nav and the markupVova
front#3916The All-parts dialog over a diagram linked held parts to addresses the index gate answers not-found on.held rows render as plain text in all three tablesVova
front#3904Typing a part number and pressing Enter opened a diagram of an unrelated machine instead of that part.submit routes by the row that answers the queryVova
front#3902The check that old assembly addresses still redirect now runs on every change, not only in the deep run.assemblies 308 cases run on every PRVova
front#3900A test still asserted the diagram hub was permanently gone, after it came back.410 assertion replaced by the live shapeVova
front#3902An old assembly address reached its new home in two hops; now it takes one.legacy assemblies tail redirects in one hopVova
front#3900The moved diagram code stays inside the same code-quality gates it had before the move.moved tree kept under the fallow and comment gatesVova
front#3872The eleven new pages repeated the same closing block and the same list markup; both are now written once.call-us close and ItemList schema folded into helpersVova
front#3900The lowercase-address checks follow the diagrams to their new home.lowercase assertions carried onto the moved treeVova
front#3902One place now holds the address map for the move: redirects, cache tiers, navigation and the sitemap.redirect map, CDN tiers, nav and sitemap moved togetherVova
front#3872Eleven dealership pages that exist on the old website and answered not-found on ours now exist: service, credit application, employment, staff, testimonials, hours and location among them.11 static dealer routes addedVova
front#3901Machines and attachments for sale now have their own pages, at the address the site structure calls for./equipment, /equipment/{id} and /attachments serve the showcaseVova
front#3900Every parts-diagram address moves out of /equipment and into /parts-diagrams, one hop, so the equipment name is free for machines.model tree moved to /parts-diagrams/model, query preservedVova
front#3906The image service would follow a redirect to an address it had never been allowed to fetch.optimizer maximumRedirects set to 0Vova
front#3909A duplicate copy of the photo-address rules is deleted, so the two copies cannot drift apart.one bucket map, one loader; 51 lines removedVova
front#3894Part addresses are lower case everywhere now, and the capitalised form reaches them in exactly one hop.every /parts/ URL served lowercase, uppercase 308s onceVova
front#3908A sign-in field left timers running after it disappeared, which reddened whichever unrelated test run was unlucky.0 timers pending after unmountVova
front#3905Test covering that a held row in a parts list is not turned into a link.three cases pin the index-held branchVova
front#3895A notification could still appear in dark colours after the store was pinned to light.toaster follows the forced themeVova
front#3891Which photo folders are pre-sized is declared in the code now, instead of in a hosting setting the repository cannot read.coverage read from BAKED_WIDTHS, env override retiredVova
front#3889The sign-in pages were blocked from being read, which also blocked the 'do not index' instruction written on them./sign-in and /sign-up unblocked, canonical addedVova
front#3883With no setting present, the pre-sized photo folders defaulted to none; they now default to all three that are baked.empty env resolves to every baked prefixVova
front#3873Two old redirects that Google has not followed once in sixteen months are removed./catalog and /tires alias rules deletedVova
front#3881A photo address carrying a query could be mistaken for a vector drawing and skip the optimiser.vector test reads the path, not the raw stringVova
front#3880Brand logos shipped at full size: 963 KB of one brand page's 1.35 MB of images. They go through the optimiser now.raster brand marks lose the unoptimized flagVova
front#3879Two workflow notes stated a rule that is not true, and believing it removes the only way to run those checks by hand.headers corrected, each citing its measurementVova
front#3877Production's branch required no checks at all while the test branch required five; a weekly report now watches that asymmetry.weekly guard reads main's rulesetVova
front#3875A control inside the account area switched the whole store to dark for that customer, on every later visit.light theme forced, stored dark clearedVova
front#3865The Brands menu in the header showed names where the logos belong.brand marks restored in the header and hub stripVova
front#3868The photo optimiser fetched originals back through our own protected edge instead of the media address.optimizer source is the absolute media originVova
front#3867The brand Diagrams tab opened on a chooser instead of on the grid of all categories.bare tab renders the all-categories gridVova
front#3863The toolbar change from the day before had no tests; twelve assertions now hold it in place.12 assertions, dependency check at zero violationsVova
front#3862The brand diagram page showed the same row of category buttons twice, one under the other.duplicate Categories chip strip removed; one strip renders where two didVova
front#3685A checkout test that fills an address twice ran out of time on a busy build machine and reddened unrelated work.own timeout budget for the double-fill case; no product code touchedVova
front#3854Brand pages were being judged against a rule written for part pages, so the check flagged pages that were correct.anchor check matches by path prefix, not by one literal addressVova
front#3854The check that guards this whole release now reads redirects out of the page body, so it can no longer be fooled by one.audit gate asserts the robots anchor and follows body-level redirectsVova
front#3860The crawl instruction file names some pages exactly and some by prefix; the checker treated an exact name as a prefix and passed pages it should have failed.$-anchored Allow lines now read as exact pathsVova
front#3854Google could still reach a held part page by one hop from a page it is invited to read; that hop is closed, so the 'do not index' instruction can finally be obeyed.last discovery hop to /lookup removedVova
front#3858Comments in the code still described the old database as the live source after it was switched off.comments corrected; no behaviour changeVova
front#3225The Diagrams tab on a brand page only appeared for some categories; it now appears for all of them.brand Diagrams tab opens on every categoryVova
front#3857A cache module still carried a departed colleague's name and a comment block that had drifted from the code.name removed; comment block brought back under the ratchetVova
front#3843Per-part crawl permissions were written loosely enough to also permit addresses underneath them.per-SKU Allow lines anchored with $Vova
front#3854Several places on the site linked to held part pages without checking whether they were held; they now check.verdict-blind link surfaces stop advertising held PDPsVova
front#3854Every link to a part page is now built by one piece of code, so the held/not-held decision cannot be forgotten in one corner of the site.all /parts/ hrefs routed through a single emitterVova
front (direct)A test fixture used a real work email address as sample data.neutral address substitutedVova
front (direct)A hook test used a real colleague's name as a sample co-author.neutral fixture substitutedVova
front (direct)Documentation aside naming a departed teammate, and repeating what the paragraph above already said.aside removedVova
front (direct)Documentation described a feature by who built it rather than what it does.described by role insteadVova
front (direct)A test's own name contained a departed teammate's name.test renamedVova
front (direct)A setup note told a specific departed person to provision a key.note addressed to the action, not a personVova
front#3857Brand code still carried the old database's collection names and field maps, which now point at nothing.dead collection names and field maps deletedVova
front (direct)An ownership line named someone who had left.owner line correctedVova
front#3854Whether a part page is offered to Google was decided in several places that could disagree; it is now decided once, with two named policies.one index verdict, two named policiesVova
front#3852A breadcrumb check failed the /lookup pages for not carrying data those pages deliberately omit.audit learns the nav-without-schema shapeVova
front#3851A check that part addresses stay stable was running where it could not stop a bad change; it now blocks.slug stability promoted into the blocking laneVova
front#3843Structured product data was being sent from both the public part page and its held twin; only the public one should carry it.structured data emitted on /parts, never on /lookupVova
front (direct)An ownership record for catalogue baselines named a departed colleague.recorded as vacantVova
front#3843The held twin of a part page still sent Google product data, which invites indexing of a page we asked it not to index.gated /lookup render emits no structured dataVova
front#3844Comments claimed equipment browsing read the old database.comments correctedVova
front#3843A customer's saved-parts row linked to the held twin of a part in a way a crawler could follow.fav row renders the twin crawler-invisibleVova
front#3843The held part pages were both blocked from being read and told not to be indexed, which cancel each other out; the block is lifted so the instruction can be read.links removed, Disallow restored, held brands nofollowVova
front#3835A filter meant to drop one brand's rows from the Google product feed dropped the whole feed.filter drops the brand half onlyVova
front#3833The release's own guard did not catch a readable page linking to a blocked address; now it does.audit flags crawlable page linking a blocked URLVova
front#3840A filtered listing for a held brand said one thing while the brand's own page said another.?manufacturer= listing agrees with its brand hubVova
front#3835The Google product feed still advertised parts whose pages now answer not-found.feed drops rows whose PDP the gate 404sVova
front#3839Blocking a page from being read also blocks the 'do not index' instruction on it from being read./lookup/ unblocked so its noindex is legibleVova
front#3838Gallery images can now declare their real sizes, because every image finally has them./gallery baked widths declaredAlex
front (direct)A part-page test raced a lazily loaded panel.test waits the import outVova
front#3837One route to a brand's parts list forgot to record that a part was held.brand BOM route stamps indexHeld tooVova
front#3834Test covering that a held related part links to its twin rather than to a dead address.new test caseVova
front#3834Related-part cards on a part page linked held parts to addresses that now answer not-found.related cards link the /lookup twinVova
front#3833A harness that checks the whole index decision end to end, so this release can be verified rather than argued about.index-gate validation harness addedVova
front#3833That harness now runs inside both automatic site checks.harness wired into both SEO gatesVova
front#3834A held row in the catalogue linked nowhere at all.held row links its /lookup pageVova
front#3831The same photograph could be published under two different addresses depending on which system named it.one photo, one image URLVova
front#3830A page that failed to build was being stored and re-served by the cache.degraded responses marked no-storeVova
front#3828A part page could still answer normally while carrying a 'do not index' instruction, which is the exact ambiguity this release removes.200-with-noindex is now impossibleVova
front#3818Searching an exact part number landed on a grid holding one card instead of on the part.exact SKU search lands on the partVova
front#3824A test waited for a diagram page's images before checking the address.wait decoupled from imagesVova
front#3822A test treated an out-of-stock part as a missing page.OOS part asserted as a rendered PDPVova
front#3820The site generated every photograph in two formats and served one.AVIF kept, WebP droppedVova
front#3810The core change: a part page Google is not invited to read now answers not-found, and held rows are cut from the browse grid.noindex equals 404, behind a switch that is offVova
front#3814The image loader was wired conditionally, so some pages bypassed it.loader wired unconditionallyVova
front#3812The image optimiser still fetched originals from an outside address.optimiser source moved on-originVova
front#3807The proposed crawl cut would have severed the brand listing pages along with the part pages.brand listing subtree kept crawlableVova
front#3806The cut would also have severed every equipment link, which uses the bare part-number form.bare-PN form allowed tooVova
front#3804Brand marks that had been overridden by hand were still served from an outside address.overridden marks on our own hostVova
front#3801Storefront images served without optimisation still pointed at an outside address.unoptimized images on our own hostVova
front#3797Brand logos were served from an outside address.brand logo marks on our own hostVova
front#3799The remaining image surfaces still pointed at an outside address.every remaining surface on our own hostVova
front#3802A crawl check was pointed at part pages that are deliberately held, so it measured the wrong thing.crawler pointed at index-eligible PDPsVova
front#3795A test run with no search address configured started the app anyway and failed later, confusingly.fails before the webServer startsVova
front#3796Product data sent to Google named a photograph at one address while the page named it at another.JSON-LD image matches og:imageVova
front#3793First version of the held-page decision: answer not-found rather than answering normally with a 'do not index' tag.404 instead of 200 noindexVova
front#3791Every image address on the site now runs through our own domain rather than an outside one.all image URLs published via /img/*Vova
front#3789A nightly mobile test ran during the window the office machine exports data, and lost to it every night.moved off the export windowVova
front#3654Moved the site's framework off a preview build onto the released one, and recorded the not-found caching behaviour that costs us.next 16.3.0-preview.10 -> 16.3.1Vova
front#3786A checklist for a flip that already happened, and a runbook whose own numbers disagreed with each other.checklist retired, numbers reconciledVova
front#3779Animation library update.framer-motion 13.1.1Vova
front#3778Six development-tool updates, none of which touch the site itself.six dev-tooling majorsVova
front#3783The runbook did not mention the switch that controls the crawl cut, so anyone following it would have missed it.runbook documents the switchVova
front#3776The brand Diagrams tab downloaded 1.5MB more than it needed, and nothing was stopping it growing.1.5MB removed, budget addedVova
front#3770A test signed in as one role and overwrote the session of another.role session loaded, not overwrittenVova
front#3780Parallel test jobs shared one mock delivery port, so they answered each other's requests.own port per job, probe checks identityVova
front#3781The crawl instruction file can now name only the part pages Google is invited to read — behind a switch that is off.robots.txt cut, default-off flagVova
front#3773Recorded that a page answering normally while carrying 'do not index' was the design, before this release changed it.documentationVova
front#3771Product feed descriptions shouted the part type instead of naming what the part fits.descriptions name the fitmentVova
front#3772The brand Diagram view had no heading naming it.h1 addedVova
front#3757A page that failed to build looked like a normal page to our own checks.error-boundary marker detected as soft-503Vova
front#3764Thirty-two parked tests, each either fixed, rewritten or deleted with the reason recorded.deep-lane quarantine cleared, 32 specsVova
front#3765A checkout test pressed Pay before the page was ready.waits for React firstVova
front#3763A listing that briefly failed rendered the generic error screen rather than an honest try-again.503 body instead of the boundaryVova
front (direct)Recorded that account-level free shipping cannot express our heavy-item carve-out.documentationVova
front#3744A brand-catalogue part number that does not exist answered normally instead of not-found.404 instead of soft-200Vova
front (direct)Thirty-four hand-written colours reconnected to the design token they were copied from.34 hardcoded colours tokenisedVova
front (direct)A test helper was exported although nothing outside its file called it.export removedVova
front (direct)Brand marks were shifting the layout because their box was reserved from the wrong ratio.ratio matched to the reserved boxVova
front (direct)A settings check failed on a setting whose value is itself structured data.JSON-valued env vars acceptedVova
front (direct)Parked-test notes that the fixes in the same branch had made untrue.notes refreshedVova
front (direct)A search-suggestion test raced its own typing delay.cache held cold insteadVova
front (direct)A size budget was being measured against a development build, which is always larger.refuses to weigh a dev documentVova
front (direct)Brand marks on part pages were judged by the image rather than by the space reserved for it.judged by the reserved boxVova
front (direct)Two test files were erroring or skipping rather than testing anything.specs made to runVova
front (direct)Part-page and listing tests still pointed at the old page structure.re-anchored on the v2 rewriteVova
front (direct)Catalogue filter tests pointed at controls the site does not render.pointed at real controlsVova
front (direct)Suggestion tests picked rows by position, which moved.selected by group; sentinel derived liveVova
front (direct)Buy-path tests clicked before the page was interactive.clicks after hydrationVova
front#3734The search address defaulted to the port the site itself runs on, so it called itself.no self-referential defaultVova
front (direct)Recorded a full browser test-run baseline so failures can be triaged against something.baseline recordedVova
front (direct)Three comment blocks brought under the duplication ratchet.3 comment blocksVova
front (direct)Coverage baseline refreshed.ratchet baselineVova
front (direct)Assertions that could not fail were rewritten to be able to.no-op assertions given teethVova
front (direct)Pinned the two gates that keep an internal endpoint and a debug view out of production hands.revalidate bearer + debug-config gates pinnedVova
front (direct)The place-order path is now covered end to end.new end-to-end coverageVova
front (direct)Pinned the checks that stop one customer reading another's quote or order.quote and order ownership gates pinnedVova
front#3740Addresses containing dot segments could slip past the proxy's routing prefix. This one is already live — it went to production on 21 August and has been brought back here.dot segments rejected; already in productionVova
front#3512Two test cases reported success while quietly finding nothing.cases report what they foundVova
front#3735When a part page's title was too long, it dropped either the brand or the manufacturer's part number; it now keeps both.title keeps brand and OEM part numberAlex
front#3738The Google product feed advertised availability states Google rejects.disapproved states removedVova
Search18 changes 11 a customer or Google can notice
ChangeWhat it isWhat movedBuilt by
search#952The brand parts listing ignored the instruction to show only the rows Google is invited to read.indexableOnly honoured on the brand listingVova
search#949Search could hand back the address of an attachment, which the storefront has no page for.ATTACHMENT slugs dropped from search and variantsVova
search#946The same wrong address could come out of the assembly lanes.ATTACHMENT slugs dropped from the assembly lanesVova
search#944The federated-brand lane ignored the same show-only-indexable instruction.indexableOnly applied on the federated-brand laneVova
search#942The browse-grid cut was applied across all vendors on a row instead of only the row's own.cut scoped to the row's own vendorsVova
search#941An ownership line named a colleague who had left.owner line correctedVova
search#940The health response still declared fields for two systems it no longer talks to.elasticsearch and mongodb fields removedVova
search#933Popular parts and diagram parts lists did not carry whether a part is offered to Google, so the store could not tell.registry verdict attached to both lanesVova
search#933Search results themselves did not carry that verdict either.registry verdict attached to resultsVova
search#938Whether a brand is released to Google was read from a stale copy; it now reads the record that decides it.read from indexing_blocksVova
search#938The brand summary now states whether a brand is released to Google, so the store stops guessing./api/brands/summary carries the flagVova
search#937A query stopped at its size cap was cancelled mid-flight, which corrupted the shared connection and affected the next customer's search.capped queries no longer cancelledVova
search#934Search can now return only the rows that are offered to Google, which is what the browse grid needs.indexableOnly=true addedVova
search#931A part page asked for its fitment summary one part at a time; it is now supplied with the part.fitment summary projected onto PartVova
search (direct)Four guards in a deploy check were written so they could not fail.guards made real if/elseVova
search#884A finding about duplicate results was blocking deploys while still under discussion.moved out of the hard gateVova
search (direct)Brand-merge test fixtures were copied from a June response and had drifted from reality.fixtures derived from the responseVova
search (direct)A test suite was passing without exercising anything.one-part-one-card guardedVova
The order and payment services8 changes 1 a customer or Google can notice
ChangeWhat it isWhat movedBuilt by
ps#709Documentation still named the old database as the live boundary for orders.documentation correctedVova
ps#708An ownership line named a colleague who had left.owner line correctedVova
ps#707A nightly backup job still targeted the cluster that has been deleted.backup path deletedVova
ps#705The repository guide named the wrong backup secret, which would have inverted the order of a deletion.secret name correctedVova
ps#704Thirty-one test settings stubbed a database connection that no longer exists.31 env stubs droppedVova
ps#703Two deploy descriptions still claimed a database binding neither service has.headers correctedVova
ps#702The old database's driver and everything that existed only to serve it, deleted from the payment service.driver and dependents deletedVova
ps#700Unbound the payment service from the old database, which turning the flags off had not done. This one is already live — it went to production on 26 August and this is the same change arriving by the normal route.prod and dev unbound; already in productionVova

What is live now, and what Friday would replace it with — the exact thing to go back to

The left of each pair was read off the running systems on Wednesday 26 August and is unchanged since. The right is what the promote would put there; the storefront value is Friday morning’s final cut, not Wednesday’s — the train was re-cut to carry everything that landed after the draft. Going back means going back to the left. Unlike last week, this table is complete: nothing in it says “not read”.

Storefront137e97ed2 → 13760cd0dRead off the live address rather than off the newest build, which are not always the same thing: the deployment currently answering crop.clintontractor.net was built from 137e97ed2 on the live branch. Vercel keeps the previous build, so going back is one button.
Searchcrop-search:678b7af2 → crop-search:2394e78bSearch is promoted by swapping the image rather than by merging, and both sides now live under the same registry path — the renamed-path trap that made last week’s rollback address unusual does not apply here. Serving from search-api-00042-fim, all traffic, nothing pinned.
Search rollback namesearch-api-00042-fimThe revision to send traffic back to. It is routable by name until it is deleted, so the safe rollback does not touch images at all.
Servicesd9915efe → b6482b8bOrder and payment services. Note that the left-hand side already moved twice this week outside the release train, on 25 and 26 August, for the database switch-off — both are recorded on the 26 August page. What Friday carries is the tidying up afterwards.
Services, as actually runningcatalog-service-recycle-20260826-090026
payment-service-recycle-20260826-090026
Both services are running revisions created by the nightly restart at 09:00, not by a deploy. That restart is what holds a known memory problem in check while its cause is still open. Each is pinned to an exact image rather than to a moving label, which is what makes them safe to go back to.
DatabaseunchangedNo migration in this week’s storefront or search work, and none runs with the release. The database work this week was the switch-off, which already happened and is on its own page.
The four switchesnot set → not setThe row that matters most for what Friday changes. None of the four settings that control the index work exists on the live store today, and the promote does not create them. Going back does not require touching them either.