can1357/oh-my-pi · warning · HTTPException

no retryable stored event for {repo_full}#{number}

Error message

no retryable stored event for {repo_full}#{number}

What it means

The retry endpoint accepted a valid, allowlisted issue ref but the database has no stored event to retry, returning HTTP 404 'no retryable stored event for owner/repo#N'. Retries work by re-processing the most recent stored webhook delivery for that issue (db.latest_event_for_issue); if the database has never recorded a delivery for it, there is nothing to replay.

Source

Thrown at python/robomp/src/server.py:652

            log.info("manual triage", extra={"delivery": delivery, "issue": f"{repo_full}#{number}"})
            return JSONResponse(
                {"delivery": delivery, "state": "queued", "mode": "triage"},
                status_code=202,
            )

        # mode == "retry"
        if isinstance(delivery_id, str) and delivery_id:
            target = delivery_id
        elif isinstance(issue_ref, str) and issue_ref:
            try:
                repo_full, number = parse_issue_ref(issue_ref)
            except InvalidIssueRef as exc:
                raise HTTPException(400, str(exc)) from exc
            if not cfg.allows(repo_full):
                raise HTTPException(403, f"{repo_full} not in ROBOMP_REPO_ALLOWLIST")
            row = db.latest_event_for_issue(make_issue_key(repo_full, number))
            if row is None:
                raise HTTPException(404, f"no retryable stored event for {repo_full}#{number}")
            target = row.delivery_id
        else:
            raise HTTPException(400, "retry requires 'delivery_id' or 'issue'")

        event = db.get_event(target)
        if event is None:
            raise HTTPException(404, f"unknown delivery {target}")
        if not db.requeue_event(target, from_states=INACTIVE_EVENT_STATES):
            raise HTTPException(409, f"delivery {target} is {event.state}; only inactive events can be retried")
        pool.wake()
        log.info("manual retry", extra={"delivery": target})
        return JSONResponse(
            {"delivery": target, "state": "queued", "mode": "retry"},
            status_code=202,
        )

    @app.post("/api/cancel")
    async def api_cancel(

View on GitHub (pinned to 9690622007)

Solutions

  1. Confirm the issue previously arrived via webhook (check server logs or the events listing) before retrying
  2. Use `delivery_id` from the original webhook instead of `issue` if you have it
  3. Trigger a fresh triage via the trigger endpoint instead of a retry, since no stored event exists
  4. Check database retention/cleanup settings if events are disappearing sooner than expected

Example fix

// before: retry by issue when nothing is stored
POST /retry { "issue": "acme/widgets#42" }
// after: replay the known delivery
POST /retry { "delivery_id": "uuid-from-webhook-header" }
Defensive patterns

Strategy: validation

Validate before calling

// Confirm a stored event exists for the issue before retrying by ref
const evt = await api.getLatestEventForIssue('acme/widgets#42');
if (!evt) {
  throw new Error('no stored delivery for this issue; use trigger (fresh triage) instead of retry');
}

Try / catch

try {
  await api.retry({ issue: issueRef });
} catch (err) {
  if (err.status === 404 && /no retryable stored event/.test(err.message)) {
    logger.warn('nothing to replay; falling back to fresh trigger', { issueRef });
    await api.trigger({ issue: issueRef });
  } else throw err;
}

Prevention

When it happens

Trigger: POSTing to the retry endpoint with `issue: 'owner/repo#N'` where `db.latest_event_for_issue(make_issue_key(repo_full, number))` returns None — no webhook delivery for that issue was ever persisted (or it was purged/rotated out of the store).

Common situations: Trying to retry an issue that was created manually and never arrived via webhook; the database was reset/migrated and old events are gone; event retention pruning removed the delivery; typo in the issue number pointing at an issue the bot never saw.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/1c5433a0ad619873. Report an issue: GitHub.