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

  1. Resend the exact same sessionStartedAt value that was used when the session was first opened
  2. Generate a fresh claimNonce (new session) instead of changing the timestamp of an existing one
  3. 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.