Module 20Neill's Vibe · Tier 1 · Ship-First-App Scars~7 min

The cron that ran once a day

You asked for every 5 minutes. The platform quietly decided once a day. No error. No log. Nothing told you.

01 · the scene

I set it to every 5 minutes. It ran once.

The scheduled job was configured for every 5 minutes. The deploy was clean and green. But the work it was supposed to do kept being hours stale — like the job barely ran at all.

my-day — Vercel Hobby cron — May 27
# what the config said:
schedule: "*/5 * * * *" (every 5 minutes)
# what actually happened:
runs observed: 1 / day (no error, no warning, no log line)
Neill51% · the terrain

"I configured it to run every five minutes and it just… didn't. There was no error to chase. Nothing was 'broken.' How do you debug a thing that fails by quietly doing less than you asked?"

Claude49% · the execution

"The free tier silently caps cron frequency to once a day and never tells you. Your config was honored 'as far as the plan allows.' I should have checked the tier's actual limits before we built timing assumptions on top of it."

02 · the why

A free tier honors your intent — until the fine print overrides it.

Platforms optimize their free tiers for cost and a smooth signup, not for your visibility. So your config can be silently downgraded: a 5-minute cron quietly becomes daily, a function gets a shorter timeout, a feature is capped. The platform isn't lying — it's enforcing limits you agreed to without an error message. The danger is that your code's assumptions (it runs every 5 min) and the platform's reality (it runs daily) drift apart with nothing flagging the gap.

▽

Silent downgrade

config != reality

Your setting is accepted, then quietly clamped to the tier's limit. No error fires.

◔

No observability

free = cheap, not visible

Free tiers spend their budget on UX, not on telling you what they throttled.

↻

Verify the cadence

watch real runs

Don't trust the schedule field. Log each run's timestamp and confirm the gap matches.

The model: it's an all-you-can-eat coupon with an asterisk — "once per day." You can ask for a plate every five minutes; the kitchen just won't bring it. Either confirm what the plan actually delivers, or move the timing to a scheduler you control (an external cron, an always-on machine) where "every 5 minutes" means every 5 minutes.

03 · predict it

Set to every 5 min, runs once a day, no error. Why?

The cron config clearly says every 5 minutes. The deploy is green. It runs roughly once a day and nothing logs a problem. What's going on?

Not it. The syntax is valid and nothing is crashing — there's simply no error to find. Think about what the plan is allowed to do versus what you asked for.
Exactly. The free tier clamps the schedule to once a day and never says so. "Accepted" is not "honored." Verify the real run cadence (log each run), or move the timing to an external scheduler you control. A silent downgrade is a failure with no error attached.
04 · the walkthrough

How to catch a downgrade that won't announce itself.

read the tier limits
step 1Before building on a free tier, read exactly what it caps — cron frequency, timeouts, concurrency.
log every run's timestamp
step 2Have the job record when it actually ran. The gaps between rows tell you the real cadence.
assert the gap
step 3If consecutive runs are ~24h apart when you asked for 5 min, the plan downgraded you.
external scheduler
step 4For real timing guarantees, drive the job from a scheduler you own, not the free tier's cron.
05 · prove it · gate

Teach it back to unlock the payoff.

Same rule as always: answer it right, or the module isn't done.

Your free-tier scheduled job is configured for every 5 minutes but is hours stale, with no error anywhere. What's the right move?
// one correct answer unlocks Module 20
Not the load-bearing reason. There's no crash to log — the job runs fine, just rarely. Think about the gap between what you configured and what the plan actually permits.
That's it. A free tier can clamp your schedule silently. Measure the real cadence instead of trusting the config field, and when the plan limits you, own the scheduling yourself. A failure with no error is still a failure. Module unlocked. ↓
the durable idea

"Accepted" is not "honored." A free tier can quietly do less than you configured, with no error. Verify what actually happened — don't trust what you set.

06 · factory payoff
⊘ locked — pass the teach-back to claim this piece of the factory

The heartbeat that catches a silent downgrade.

A real heartbeat.js your scheduled job calls on every run — it records the timestamp and screams (a clear log line) when the gap since the last run is far larger than the cadence you configured. Plus a pre-launch checklist of the free-tier limits that bite ship-first apps.

✓ Module 20 complete