NousResearch/hermes-agent · error

Preview mode — launching is disabled.

Error message

Preview mode — launching is disabled.

What it means

Raised by the schedule parser in cron/jobs.py when a schedule string starts with something that looks like an ISO timestamp (e.g. begins with a digit and contains 'T'/'-') but datetime.fromisoformat() rejects it. It is a ValueError wrapping the underlying parse failure, thrown before any job is created. The full schedule-format dispatch continues to duration/interval/cron parsing afterwards, so this error alone does not abandon the parse.

Source

Thrown at apps/bootstrap-installer/src/store.ts:351

  // there's no welcome click. Reset + jump straight to progress, then let the
  // Rust side stream the synthetic update manifest.
  $bootstrap.set(INITIAL)
  $route.set('progress')
  await invoke('start_update')
}

export async function cancelInstall(): Promise<void> {
  if (fakeMode()) {
    fakeCancelled = true

    return
  }

  await invoke('cancel_bootstrap')
}

export async function launchHermesDesktop(): Promise<void> {
  if (fakeMode()) {throw new Error('Preview mode — launching is disabled.')}
  const installRoot = $bootstrap.get().installRoot

  if (!installRoot) {throw new Error('no install root')}
  await invoke('launch_hermes_desktop', { installRoot })
}

export async function openLogDir(): Promise<void> {
  if (fakeMode()) {return}
  await invoke('open_log_dir')
}

// ---------------------------------------------------------------------------
// Dev-only isolated preview ("fake boot")
//
// Synthesises the manifest + stage/log events Rust normally streams, so the
// whole reskin can be reviewed in a plain browser (`npm run dev`):
//   ?fake=install   welcome → [ INSTALL ] → success
//   ?fake=update    auto-runs the granular update flow

View on GitHub (pinned to c896c09c42)

Solutions

  1. Correct the timestamp to a valid ISO 8601 local form such as '2026-02-03T14:00:00'.
  2. If you wanted a relative one-shot, use a duration like '30m', '2h', '1d' instead.
  3. Read the wrapped {e} message — it names the exact reason fromisoformat rejected the value.
  4. Validate candidate timestamps with datetime.fromisoformat() before submitting if generating schedules programmatically.

Example fix

# before
create_job(prompt="report", schedule="2026-02-30T14:00")

# after
create_job(prompt="report", schedule="2026-03-02T14:00")
Defensive patterns

Strategy: validation

Validate before calling

from datetime import datetime

def valid_timestamp(s: str) -> bool:
    try:
        datetime.fromisoformat(s)
        return True
    except ValueError:
        return False

# before create_job(..., schedule="2026-02-30T14:00")
assert valid_timestamp("2026-02-30T14:00") is False

Try / catch

from cron.jobs import create_job
try:
    job = create_job(prompt=p, schedule="2026-02-30T14:00")
except ValueError as e:
    if "Invalid timestamp" in str(e):
        # surface to user / re-ask model for a corrected ISO string
        raise

Prevention

When it happens

Trigger: Calling create_job/update_job (or the cronjob tool / `hermes cron add`) with a schedule like '2026-13-45T99:00' (invalid month/hour), '2026-02-30T14:00' (nonexistent day), or a malformed timestamp with stray characters that still routes into the timestamp branch of the parser.

Common situations: Typos in one-shot timestamps, copy-pasting timestamps with a trailing 'Z' variant the parser's branch does not accept, or a model/agent composing the schedule string dynamically and getting the date arithmetic wrong (e.g. month 13).

Related errors


AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14). Data as JSON: /api/errors/bb268f170f506b2a. Report an issue: GitHub.