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
- Enable the experiment in instance settings: set experimental.enableConferenceRoomChat = true (and run on local_trusted deployment mode, which the next guard requires).
- 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.
- 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
- Gate the UI surface on getExperimental().enableConferenceRoomChat so the call is never made while disabled.
- Remember the endpoint also requires deploymentMode === 'local_trusted'.
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
- Failed to parse JSON at ${filePath}: ${err instanceof Error
- Company ID is required. Pass --company-id, set PAPERCLIP_COM
- Company ID is required. Pass --company-id, set PAPERCLIP_COM
- Company ID is required. Pass --company-id, set PAPERCLIP_COM
- Embedded PostgreSQL support requires dependency `embedded-po
AI-assisted analysis of paperclipai/paperclip@67001ec6eb (2026-08-12).
Data as JSON: /api/errors/de95801c3ea341b1.
Report an issue: GitHub.