paperclipai/paperclip · error

status is required

Error message

status is required

What it means

Thrown by the llm-wiki plugin's `update-managed-routine-status` action (worker.ts:813) when `params.status` is absent or empty after `stringField` coercion. The action reads the status string, and only forwards it to `ctx.routines.managed.update` if it is truthy, so a missing/blank status is treated as a caller error rather than a silent no-op.

Source

Thrown at packages/plugins/plugin-llm-wiki/src/worker.ts:813

        routineOverridesFromParams(params),
      );
    });

    ctx.actions.register("reconcile-managed-routine", async (params) => {
      return ctx.routines.managed.reconcile(
        routineKeyField(params.routineKey),
        readCompanyIdFromParams(params),
        routineOverridesFromParams(params),
      );
    });

    ctx.actions.register("reconcile-managed-routines", async (params) => {
      return reconcileWikiRoutineResources(ctx, readCompanyIdFromParams(params));
    });

    ctx.actions.register("update-managed-routine-status", async (params) => {
      const status = stringField(params.status);
      if (!status) throw new Error("status is required");
      return ctx.routines.managed.update(routineKeyField(params.routineKey), readCompanyIdFromParams(params), {
        status,
      });
    });

    ctx.actions.register("run-managed-routine", async (params) => {
      return ctx.routines.managed.run(
        routineKeyField(params.routineKey),
        readCompanyIdFromParams(params),
        routineOverridesFromParams(params),
      );
    });

    ctx.data.register("pages", async (params) => {
      const companyId = readCompanyIdFromParams(params);
      return listPages(ctx, {
        companyId,
        wikiId: stringField(params.wikiId),

View on GitHub (pinned to 67001ec6eb)

Solutions

  1. Include a non-empty `status` string in the action params (e.g. `"active"`, `"paused"`) alongside `routineKey` and `companyId`.
  2. Verify the exact param key name is `status` and that it is a trimmed non-empty string before dispatching the action.
  3. If driving the action from a UI, disable the submit control until a status value is selected.

Example fix

// before
ctx.actions.run("update-managed-routine-status", { routineKey, companyId });
// after
ctx.actions.run("update-managed-routine-status", { routineKey, companyId, status: "active" });
Defensive patterns

Strategy: validation

Validate before calling

function buildRoutineStatusParams(input) {
  const status = typeof input.status === "string" ? input.status.trim() : "";
  if (!status) throw new TypeError("status is required (non-empty string)");
  return { routineKey: input.routineKey, companyId: input.companyId, status };
}
// run buildRoutineStatusParams(params) BEFORE ctx.actions.run(...)

Type guard

function isValidRoutineStatusParams(p): p is { routineKey: string; companyId: string; status: string } {
  return typeof p?.status === "string" && p.status.trim().length > 0
    && typeof p?.routineKey === "string" && p.routineKey.trim().length > 0
    && typeof p?.companyId === "string" && p.companyId.trim().length > 0;
}

Prevention

When it happens

Trigger: Calling the registered plugin action `update-managed-routine-status` without `status` in params, with `status: ""`, or with `status` set to a non-string value that `stringField` coerces to empty (e.g. null/number/object).

Common situations: An orchestrator or board UI issues a managed-routine status transition (e.g. pausing/resuming a wiki maintenance routine) and forgets the status field, or sends the wrong key name (e.g. `routineStatus` instead of `status`). Also occurs when a test fixture constructs the action params incompletely.

Related errors


AI-assisted analysis of paperclipai/paperclip@67001ec6eb (2026-08-12). Data as JSON: /api/errors/24600cc115f8a2ab. Report an issue: GitHub.