paperclipai/paperclip · warning

FEATURE_DISABLED

FEATURE_DISABLED

Error message

Conference Room Chat is not enabled

What it means

Returned as HTTP 403 (code FEATURE_DISABLED) by POST /api/board/chat/stream when instanceSettings.getExperimental().enableConferenceRoomChat is not exactly true. The endpoint is intentionally inert (not just UI-hidden) while the experimental flag is off, because the relay spawns the operator's local claude CLI headless, which is unsafe to expose unless the feature is explicitly enabled.

Source

Thrown at server/src/routes/board-chat.ts:105

    } catch {
      return (
        "You are a board-level assistant helping a human manage their AI-agent " +
        "company through Paperclip. Help them create companies, hire agents, " +
        "approve tasks, and monitor their organization. Be conversational, " +
        "strategic, and concise."
      );
    }
  }

  router.post("/board/chat/stream", async (req, res) => {
    // Conference Room Chat is an experimental surface (PAP-136/PAP-137): the
    // API is gated alongside the UI so the endpoint is inert while the flag
    // is off, not just hidden.
    const experimental = await instanceSettingsService(db).getExperimental();
    if (experimental.enableConferenceRoomChat !== true) {
      res.status(403).json({
        error: "Conference Room Chat is not enabled",
        code: "FEATURE_DISABLED",
      });
      return;
    }

    // The relay spawns the operator's local `claude` CLI with permissions
    // skipped (it must run headless), so it is only safe where the requester
    // IS the machine operator: local_trusted is loopback-only single-operator
    // by construction (see server/src/index.ts boot guards). Refuse everywhere
    // else rather than lending the server's shell to remote users.
    if (opts.deploymentMode !== "local_trusted") {
      res.status(403).json({
        error: "Board chat is only available on local single-operator instances",
        code: "DEPLOYMENT_MODE_UNSUPPORTED",
      });
      return;
    }

    const { companyId, message, taskId } = req.body as {

View on GitHub (pinned to 67001ec6eb)

Solutions

  1. Enable the experiment in instance settings: set experimental.enableConferenceRoomChat = true (and run on local_trusted deployment mode, which the next guard requires).
  2. If you did not intend to use board chat, stop calling /api/board/chat/stream; the UI should hide the surface when the flag is off.
  3. Confirm the instance-settings write took effect by re-reading getExperimental() before retrying.

Example fix

// before
// experimental.enableConferenceRoomChat is unset

// after
await instanceSettingsService(db).update({
  experimental: { enableConferenceRoomChat: true },
});
Defensive patterns

Strategy: validation

Validate before calling

async function boardChatEnabled(db: DB): Promise<boolean> {
  const exp = await instanceSettingsService(db).getExperimental();
  return exp.enableConferenceRoomChat === true;
}
// UI: hide the surface and do not POST /api/board/chat/stream unless this returns true.

Type guard

function isBoardChatEnabled(
  exp: { enableConferenceRoomChat?: unknown },
): exp is { enableConferenceRoomChat: true } {
  return exp.enableConferenceRoomChat === true;
}

Try / catch

try {
  await fetch('/api/board/chat/stream', { ... });
} catch (err) {
  // Note: this returns 403, not a throw; handle in response parsing:
  if (res.status === 403 && body.code === 'FEATURE_DISABLED') {
    showFlagDisabledNotice();
    return;
  }
}

Prevention

When it happens

Trigger: Calling /api/board/chat/stream on an instance where the enableConferenceRoomChat experimental setting is unset/false; common right after install, in CI, or before an operator has opted into the experiment.

Common situations: New deployment that has not enabled Conference Room Chat; UI calling the endpoint before the operator toggled the flag; a non-local_trusted deployment where the operator forgot the flag is also gated by deployment mode (the next guard returns DEPLOYMENT_MODE_UNSUPPORTED).

Related errors


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