koala73/worldmonitor · error · ConvexError
activation session nonce cannot change its start order
Error message
activation session nonce cannot change its start order
What it means
ConvexError guard enforcing that a resuming Pro activation session cannot change its sessionStartedAt while keeping the same claim nonce. The nonce pins the session's start ordering; a retry that mutates the start timestamp for an already-recorded nonce is inconsistent (possible replay/tamper) and is rejected.
Source
Thrown at convex/payments/billing.ts:879
: {}),
// Day-0 has no confirm handshake, so presentation is recorded here —
// before the interstitial renders — to keep a subscriber who closes
// the tab immediately inside the cohort instead of invisible.
presentedAt: now,
outcomeTrackingVersion: PRO_ACTIVATION_OUTCOME_TRACKING_VERSION,
});
return { status: "opened" as const };
}
if (existing.exitedAt !== undefined) {
return { status: "already_recorded" as const };
}
if (existing.claimNonce === args.claimNonce) {
if (
existing.sessionStartedAt !== undefined &&
args.sessionStartedAt !== undefined &&
existing.sessionStartedAt !== args.sessionStartedAt
) {
throw new ConvexError(
"activation session nonce cannot change its start order",
);
}
// Mixed-deploy compatibility: attach the explicit order to an unfinished
// row opened by this same session before the field was deployed.
if (
existing.sessionStartedAt === undefined &&
args.sessionStartedAt !== undefined
) {
await ctx.db.patch(existing._id, {
sessionStartedAt: args.sessionStartedAt,
});
}
return { status: "opened" as const };
}
if (existing.claimNonce !== args.claimNonce) {
// A cached client without sessionStartedAt can replay its own nonce (the
// branch above) but cannot establish that a different session is newer,View on GitHub (pinned to 9361220cc0)
Solutions
- Resend the exact same sessionStartedAt value that was used when the session was first opened
- Generate a fresh claimNonce (new session) instead of changing the timestamp of an existing one
- Fix client state persistence so session parameters survive reloads unchanged
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at convex/payments/billing.ts:863 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of koala73/worldmonitor@9361220cc0 (2026-08-21).
Data as JSON: /api/errors/b3837ef655055e66.
Report an issue: GitHub.