Skip to content

#178 is the last of the 0.73.0 → 0.77.0 train: it bumps backwards now, and its probe kill switch does not exist #183

Description

@harper-joseph

The 0.73.0 → 0.77.0 train shipped. This issue now tracks the two items that outlived it, and records what the train actually did — because what shipped differs from the plan in one way that matters for the next bump.

What shipped (merged; deploy is a separate, still-pending human action — kohls-pr#116)

landed as
plugin #165 conditional sitemap fetching merged
plugin #177 new-target fast path merged
plugin #181 raw-document cache merged
plugin #182 explain cadence merged
kohls #108 sitemap anchor → 03:00 ET merged via kohls #114
kohls #111 PDP departureAction, dry-run merged via kohls #114
kohls #113 raw cache on catalog merged via kohls #114

The reserved versions collapsed. Only prerender-v0.77.0 was tagged — 0.73.0, 0.74.0, 0.75.0 and 0.76.0 exist as commits on main but never as releases, so the four PRs reached kohls in one tarball. main has since moved to 0.79.0 (0.78.0 raw-cache TTL, 0.79.0 readiness contracts).

Still open

1. #178 now bumps backwards

It sets packages/plugin to 0.75.0 against a main at 0.79.0, so merging it as-is is a downgrade of the kind that hit #59. It needs renumbering to the next free version — check gh release list at the time, don't reuse the number below.

2. #178's probe kill switch does not exist

It removes if (stats.aborted) triggers.stop() and states "Only disabling the probe clears it", but resetTriggerQueue's only caller is resetChangeProbeState, marked "Tests only", and syncProbeTimers never touches the queue. So with the probe disabled the queue keeps hard-expiring pages and filing renders for up to maxPending / ratePerSecond~4h37m at the new defaults. Verified in the diff. This is the blocker; the renumber is bookkeeping.

3. #178 also ships inert on kohls

A live override row holds changeProbe.maxTriggersPerSweep = 90000, and the override layer wins over both file and default. Merging changes nothing until that row is deleted — and deleting it later moves behaviour 90,000 → unlimited with no deploy and no PR. Its description needs an explicit deploy-then-delete step.

4. kohls #112 — the 81% figure is still unsourced

The threshold change rests on "a real mass reprice measures 81%", which came from the note on the live override row, not a measurement. Project notes from the same week record a promo-night reprice as 7.8–18.9% of products. If that is right, 0.4 sits above the event it is meant to catch and never fires. I could not settle it from the cluster: /prerender_admin/analytics ignores end, and a distant start hits the scanCap override, so historical per-pass probe data is not reachable. Needs whoever wrote the 81%. #112 stays draft until then.

The override-row dance, which is where an incident would come from

Still live, still order-dependent:

Read the live set before assuming anything: GET /prerender_admin/config. The repo does not describe the running system.

What to watch once the train is deployed (merged to kohls-pr main 2026-09-19; NOT yet deployed — the cluster runs a pre-0.73.0 plugin; see kohls-pr#116 for the rollout)

from metric expectation
#165 prerender_ops sitemap_not_modified non-zero, or the feature is doing nothing
#177 sitemap_created_soon bounded by maxPerRun; watch the 15-min render burst
#113 raw_cache by outcome read the refusals; has-cookie climbing is the one worth an alert
#113 route_serve /catalog/ miss rate the number this exists to move (74–90% before)
#111 sitemap_departure_would_render / _reattached read together, see below

Neither sitemap_not_modified nor sitemap_created_soon has a console surface — raw prerender_ops queries for now.

Before flipping sitemap.departure.dryRun: false

Rollback

  • Plugin: revert the component to the previous tarball. A rename leaves the old component loaded, and harper restart does not load staged components — use docker restart.
  • render.raw: enabled: false. Stored rows expire on their own (@table(expiration:)), nothing to clean up.
  • departureAction: sitemap.departure.enabled: false is the incident switch; it stops the behaviour without editing the route list.
  • A canary bulk invalidation: delete the Invalidation row.

Conflict traps, kept for the next train

Both were hit during the trial merge and both fail far from the conflict:

🤖 Generated with Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions