Four things from a full sweep of 61 audits: 51 jobs clumped at 4 a.m., a lock that expired in 55 seconds, and a price-filling idea I decided not to add

日本語版

Development log of the Toreca Dash app / September 2026

My app Toreca Dash has 61 audits that find anomalies. In the early hours of 8 September 2026 I ran them all and checked every item that was not 0 against real data, one by one.

This article is four stories from that work. Three are things I fixed; one is a story where I measured, and deliberately did not add it.

Numbers come from my work log of the evening of 7 to the morning of 8 September 2026.

1. 51 once-a-day jobs were clumped at 4 and 5 a.m.

At 04:53 the measurements were:

The cause was clumping in time. Counting once-a-day jobs: 27 at 4 o’clock and 24 at 5; at 1 o’clock and from 10 to 21, 0.

The fix was not to edit times one by one, which would not apply to jobs added later. I fixed the mechanism that spreads start times. The spread was a flat 270 seconds; for jobs with an interval of 6 hours or more it now spreads up to 1,800 seconds (30 minutes). 27 jobs over 30 minutes is about one per 67 seconds, so 3 to 5 run at once.

I kept it to 30 minutes so it does not spill into the next hour’s slot and break time-based order like “check at 2, fill at 3”.

2. A patrol meant to be “every minute” took 181 to 480 seconds per run

The Rakuten Ichiba patrol was meant to run every minute. Measured, one run took 181 to 480 seconds. The harm was threefold:

The effective interval was 3.5 to 6 minutes. And after a timeout it restarts from the same first genre every time, so later genres never get a turn.

I switched it to the five-genres-at-a-time rotation proven on Rakuten Books.

BeforeAfter
One run181–480 s50–83 s
Timeouts4 per 2 hours0
Interval per genre3.5–6 min3 min

I found one more thing. The lock that means “if the previous run is still going, do not start” (preventing double runs) expired after only 55 seconds. For jobs with a 480-second limit and 181–480 s real runs, a run that slipped past the runner’s skip (a manual run, a catch-up right after restart) could run twice at once, doubling Rakuten API use and hitting first-come monitoring. I set both to 480,000 ms. A lock’s expiry should be at least the job’s timeout.

3. Stop counting anomalies you cannot fix

If you keep counting things that cannot be fixed, real anomalies get buried. I revisited three.

But “0 items” has two meanings: (a) no product matches (normal), (b) the page layout changed and nothing can be read (broken). If you cannot tell them apart, real breakage is buried (the previous day’s Pokémon Center was exactly this). So I now put the number scanned into the completion message.

4. A case I measured and deliberately did not add

397 products had unknown official prices, which stops first-come notifications. The filling job had, measured, zero results.

Official price unset: 397
Has a price at a regular store: 51
Two or more stores agree: 0

The “two or more stores agree” condition had effectively never been satisfied. Accepting one store would fill 51. All were kinds with no catalogue price (imported Magic cards and so on).

I still did not add it. Regular stores discount. If I record a discounted price as the official price, the price check’s ceiling (official price × 1.08 plus margin) becomes lower than the real price and legitimate listings are removed as resale. At 10% off, the real price is 1.11× and exceeds the ceiling. And over-deletion draws no complaints, so I would not notice.

I wrote down what to do first if I add it:

  1. Compare the 51 prices by eye with official sites and the manufacturer’s suggested price (confirm whether they are discounted; do not guess a factor).
  2. Mark single-store-based prices and add margin to the ceiling only for that mark.
  3. After adding, count hidden articles before and after.

What I learned

Clumping is invisible until counted. Record the decision not to add, too.

This is the English version of the original Japanese article.

More in English