← All releases EN  RU

Change control — Friday 11 September

v2.6.0

Download all changes (CSV)

What the call has to decide — one item, not a technical one
A search setting has now ridden two releases unset not blockingnobody can see this

The search service was given its own restricted database account so that a fault in one part of it cannot reach the rest. The account name and password were never put on the live service, so it quietly falls back to the shared account and writes a warning when it starts.

The decisionNothing stops Friday. But the protection it was written for does not exist until the setting is added, and this is the second release it has ridden along unset, so it is worth a minute rather than a third week.

The part page on a phone — sixteen changes, customer, measurable
The main photograph is a quarter of its former weight front#4471front#4497

The largest thing a phone downloads on a part page is the photograph at the top. It now arrives in a modern format at 18 to 22 kilobytes where it used to be 69 to 79, and every card photograph asks for the size it is actually painted at instead of a full-width one.

Before and afterMeasured on both the test stand and the live store.

The sign-in module is not loaded for a visitor who is not signed in front#4450front#4433

Sign-in used to be part of every page whether or not anyone was signed in. It is now fetched only when a session exists, which takes it out of the first paint for every anonymous visitor — which is to say, for Google and for most customers arriving from a search result.

Interaction-only weight leaves the first screen front#4417front#4474front#4413front#4436front#4431

Pieces that only matter after somebody taps something no longer load before the page is painted: a font used nowhere above the fold, images that are not the main one asking for high priority, a browse rail sized to its real box, and a live setting read that now gives up after 300 milliseconds rather than holding the page.

A phone stops downloading the desktop store front#4398front#4384front#4388

The cart rail and the big search box are desktop furniture, and a phone was downloading both and then hiding them. They no longer go to a phone at all. The part page starts with 16 pieces of code instead of 21, unused styling is gone, and the diagram page carries less.

WhyEverything a phone downloads before it can paint is time the customer spends looking at nothing.

Tracking and error reporting wait until the visitor does something front#4396

Error reporting and the analytics tag used to load with the page and compete with it. They now wait until the visitor first touches the page, and session recording is switched off entirely.

EffectNothing is lost: an error still reports, an order still counts. They just stop taking the first second.

The brand cover photo and the catalogue probe stop costing what they did front#4405front#4382

The photograph across the top of a brand page was downloaded at full width on a phone and is now asked for at the phone size. And a check the store ran on every visit, to confirm a part address is the right one, is skipped for a human arriving on an address we already know is correct.

Brands open and close by themselves — customer and Google
A brand opens to Google as its own parts qualify front#4416search#1119

Until now a brand was opened to Google by hand. It now opens when its parts pass the quality check on their own, and every listing row and part page carries that verdict with it, so the store and Google are told the same thing at the same moment.

A brand with nothing to sell disappears instead of sitting there greyed out front#4403

A brand we carry but have no indexable parts for used to appear in the brand strip, disabled and unclickable. It is now simply not shown, and comes back on its own when its parts qualify.

Availability is read live — customer
Whether a part can be bought is read from the database, not from a nightly copy front#4389

The part page asked a snapshot that was rebuilt overnight. It now asks search directly, in one batched call, at the moment the page is built. A part that changed this morning says so this morning.

Catalogue and accessibility corrections — customer
Every add-to-cart control says what it is to a screen reader front#4469

The visible words on a button and the words a screen reader announces were allowed to differ. They now match on every add-to-cart control and every card. This is the kind of item that is invisible until somebody using assistive technology cannot buy from us.

A browse address that rendered a blank page now redirects front#4386

One shape of catalogue address rendered an empty page instead of sending the visitor to the page that exists.

The new part addresses, built and on in the candidate — twenty-one changes, on in the candidate

Every part page will move from its present address to one that names the brand, and every collection page — brand, category, equipment type — becomes an address of its own. All of it is built and tested against the test site. The plan was for it to ride along inert and turn on on 25 September, together with the collection pages Alex has data for, as a release with its own page. On this morning's candidate it is on, and what to do about that is the first item at the top of this page.

Why it ships now instead of waitingBecause an address move has to be one atomic switch, not a trickle. Everything lands first and quiet; the switch is a single decision on a single day, with old addresses answering a permanent redirect from that moment.

A part page now lives at its brand and its number front#4440front#4449front#4453front#4466

Today a part page answers at an address ending in a dealer code, for example /parts/100016-nhl. It now answers at /parts/new-holland/100016 — the brand a customer recognises, then the number printed on the part. Nothing internal is in the address any more.

WhyThe address is the first thing Google reads and the thing a customer pastes into an email. A code nobody outside the dealership recognises earns nothing and explains nothing.

Before — live storeAfter — candidate
The new part address on the live store: not found The same address on the candidate: the part page
The same address, /parts/new-holland/100016, on both sides. Today it is a not-found page; on the candidate it is the part.
Every part has one spelling of its own name, and only one migrations#78search#1128search#1133front#4499front#4508

The address needs a written form of the part number that is safe in a link: lower case, no slashes or spaces. We keep a register of those spellings so a part cannot end up with two addresses, and a part missing from the register still resolves because the spelling is worked out on the spot.

Two brands had been spelling their own name one way on the diagram pages and another on the part pages. That is one brand to us and two brands to Google, and it is now one spelling everywhere.

Why it mattersTwo addresses showing the same part is the definition of duplicate content, which is what the site was penalised for.

Brand, category and equipment type each become a page instead of a filter front#4454front#4500front#4506search#1126migrations#79migrations#82

Until now “New Holland bearings” existed only as boxes ticked on the catalogue grid, at an address Google is told to ignore. It is now a page of its own at /parts/new-holland-bearings, with its own heading, breadcrumbs, description and Google markup, and chips that take a filter off rather than resetting the page.

WhyThese are the pages a customer actually searches for. A filter cannot rank; a page can.

Before — live storeAfter — candidate
The brand address on the live store: not found The same address on the candidate: the New Holland brand page
/parts/new-holland. A brand had no page of its own; now it has one, with the other brands along the top.
Before — live storeAfter — candidate
The brand and category address on the live store: not found The same address on the candidate: New Holland Bearings, 23,428 parts
/parts/new-holland-bearings. A brand crossed with a category was a pair of ticked boxes; now it is a page with its own heading, breadcrumbs and 23,428 parts.
Every old link keeps working, with one redirect and no chain front#4452front#4488

Every part link that exists today — in Google, in old emails, on other sites — answers with a single permanent redirect to the new address. The old brand address families are retired in the same move, and everything that pointed at them now points at the new pages.

Why one and not twoEach extra hop loses a little of the value the old link carried, and a chain of them is how a site quietly loses its ranking during a move.

What Google may index, and what it may not front#4448front#4494front#4457front#4463front#4455

One list now decides which address options (page number, search text, sort order) Google is allowed to treat as a page, and the robots file follows that same list. Page two of a listing stays open to Google and stops claiming to be page one. Diagram pages stay for customers but are marked not for indexing, because they show the same parts as the part pages.

An overloaded page now answers honestly instead of returning a broken page that Google records as broken.

Google is handed the new addresses, not the old ones front#4458

The sitemap and the Google product feed both carry the new addresses, and the product feed takes each item's category from the page it belongs to instead of guessing.

The checks read the address format instead of a copy of it front#4443front#4441front#4460front#4461front#4462front#4464

Our automatic checks used to hold their own written copy of what an address looks like. When the address moved, the copy did not, and the checks passed while the store served something else. They now read the format from the same place the store does, so a change to the address fails loudly.

Housekeeping — the machines, the data and the checks; nothing a customer can see
The code checks stopped competing with the live store front#4446front#4445front#4444

Our automatic checks were putting several times the normal load on the live database while they ran. The suites are now capped and spread across both machines, and the real fix — a copy of the database on our own machine, so the checks never touch the live one — is being built now.

AlsoA full check on a change now takes 15.7 minutes instead of 24.5.

The order and payment services ps#790ps#792ps#793ps#794

Four changes, none customer-facing: the development payment service now talks to development delivery and development search instead of reaching across, and the rest is the recipe for running these services on our own machine.

Our own deployment machine, so a test build no longer needs an outside service ps#792ps#794search#1131search#1132search#1134

The OptiPlex in the office now builds and runs the store and the four order services by itself, on its own database, and picks up each new version without anyone asking it to. That is the half of the hosting service we were renting that we now do ourselves for development work.

A test order cannot reach the dealer system from there — that connection is deliberately a stand-in.

Still openThe code half. Your own table says to keep the code on GitHub; the machine can host it too. One answer needed: our own copy as the main home for the code, or only a mirror.

Every database on that machine is copied to Google's cloud each night

A dead box is no longer a lost box. This was the condition for putting real work on it at all.

A second machine joined the code checks, and they stopped competing with the live store front#4444front#4445front#4446front#4496

The checks used to run on one machine in the office, which is also production infrastructure, and they put several times the normal load on the live database while customers were on the site. The Mac Studio now takes work from the same queue, both machines answer whichever job is free, and a small canary proves the second machine really picks work up rather than being assumed to.

ResultA full check on one change takes 15.7 minutes instead of 24.5, and the real fix — a copy of the database on our own machine so the checks never touch the live one — is being built now.

More of the code checks, and what they cost front#4387front#4480front#4493search#1130migrations#80front#4476

A canary job so the machine watchdog is not blind on a quiet day. The build stopped carrying a cache nothing downstream reads. The speed measurement runs desktop and phone side by side instead of one after the other. The search check now warms the five request shapes it asserts. The database release restores its copy before switching branches, so a tagged release can carry the schema file.

One correction worth namingA check used to assert that a broken brand page stays broken. It now fails on it.

Catalogue data and the vendor signal migrations#73migrations#83migrations#84migrations#66search#1115

Alex's side of the release. A combined rebuild of the vendor grouping, the registry codes and the ranking used to order search results. A vendor whose feed is failing is now told apart from a vendor who never had a feed, which are two different problems that read the same before. The shelf-quantity bar now matches the nightly sweep that has to satisfy it. Database accounts are created by a file in the repository rather than by hand.

AlsoThree tempting relaxations of part-number validity were priced out and rejected in writing, so nobody re-opens them from memory.

Build and settings cleanup front#4394front#4400front#4442

The store can now build as a self-contained image for our own machine, and that mode is opt-in after the first attempt broke every hosted build. The last settings pointing at the retired search host are gone.

If it goes wrong — the way back, decided before we go

Search: the version running today is pinned by name and holds all traffic; putting it back is re-pointing traffic at it, and it takes about a minute.

The store website: the previous production release is one click away in the hosting dashboard.

The order and payment services: the images running today are unchanged by this release except for the four items above.