different-ai/openwork · error · Error
Failed to create desktop policy (${response.status}).
Error message
Failed to create desktop policy (${response.status}). What it means
Thrown by createDesktopPolicy when POST /v1/desktop-policies returns non-OK. Status 402 is special-cased into the DESKTOP_POLICY_ENTERPRISE_PLAN_ERROR (enterprise plan required); otherwise getRequestError throws the server message or this fallback. It means the server rejected creating the desktop policy.
Source
Thrown at ee/apps/den-web/app/(den)/dashboard/_components/desktop-policy-data.tsx:201
}
}
useEffect(() => {
void reloadPolicies();
}, [orgId]);
return { definitions, desktopPolicies, busy, error, reloadPolicies };
}
export async function createDesktopPolicy(input: DesktopPolicyPayload) {
const { response, payload } = await requestJson("/v1/desktop-policies", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify(input),
}, 12000);
if (!response.ok) {
if (response.status === 402) throw new Error(DESKTOP_POLICY_ENTERPRISE_PLAN_ERROR);
throw getRequestError(payload, response, `Failed to create desktop policy (${response.status}).`);
}
}
export async function updateDesktopPolicy(policyId: string, input: DesktopPolicyPayload) {
const { response, payload } = await requestJson(`/v1/desktop-policies/${encodeURIComponent(policyId)}`, {
method: "PATCH",
headers: { "content-type": "application/json" },
body: JSON.stringify(input),
}, 12000);
if (!response.ok) {
if (response.status === 402) throw new Error(DESKTOP_POLICY_ENTERPRISE_PLAN_ERROR);
throw getRequestError(payload, response, `Failed to update desktop policy (${response.status}).`);
}
}
export async function deleteDesktopPolicy(policyId: string) {
const { response, payload } = await requestJson(`/v1/desktop-policies/${encodeURIComponent(policyId)}`, {
method: "DELETE",View on GitHub (pinned to 2b7df46e8a)
Solutions
- Upgrade the org to an enterprise plan if the error is the 402 enterprise-plan message.
- Validate the DesktopPolicyPayload shape client-side before POSTing to pass server validation.
- Re-authenticate if the error indicates an expired/reauth-needed session.
- Retry as a user with policy-management permissions.
- For 5xx, check Den server logs.
Example fix
// before
if (response.status === 402) throw new Error(DESKTOP_POLICY_ENTERPRISE_PLAN_ERROR);
throw getRequestError(payload, response, `Failed to create desktop policy (${response.status}).`);
// after
if (response.status === 402) throw new Error(DESKTOP_POLICY_ENTERPRISE_PLAN_ERROR);
if (response.status === 400) throw new Error(getErrorMessage(payload, "Invalid policy settings - check the form values."));
throw getRequestError(payload, response, `Failed to create desktop policy (${response.status}).`); Defensive patterns
Strategy: try-catch
Validate before calling
function policyPayloadOk(p: DesktopPolicyPayload): boolean {
return typeof p.name === "string" && p.name.trim().length > 0; // + rule schema checks
}
if (!policyPayloadOk(input)) throw new Error("Invalid policy payload"); Type guard
function isEnterprisePlanError(e: unknown): boolean { return e instanceof Error && e.message === DESKTOP_POLICY_ENTERPRISE_PLAN_ERROR; } Try / catch
try {
await createDesktopPolicy(input);
} catch (error) {
if (isEnterprisePlanError(error)) { showUpgradePrompt(); return; }
if (isReauthRequiredError(error)) { promptReauth(); return; }
showToast(error.message);
} Prevention
- Gate the policies UI behind enterprise-plan detection (GET org/plan) to avoid 402
- Validate the policy form against the server schema before submit
- Refresh the policy list before creating to detect permission/state issues
- Handle ensureAdminExceptionPolicy failures separately from user-initiated saves
When it happens
Trigger: POST /v1/desktop-policies fails: org not on an enterprise plan (402), validation failure in the policy payload (400/422), insufficient permissions (401/403), or server error (5xx). 12s timeout.
Common situations: Free/standard org attempting policy management (402); policy JSON with invalid rules failing server validation; admin session expired; also hit indirectly by ensureAdminExceptionPolicy auto-creating the admin exception policy.
Understand the failure class
Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.
Related errors
- Failed to update desktop policy (${response.status}).
- Failed to delete desktop policy (${response.status}).
- Failed to load dashboard access (${response.status}).
- Failed to verify skill plugin (${membershipResult.response.s
- Failed to fetch latest-mac.yml (${response.status} ${respons
AI-assisted analysis of different-ai/openwork@2b7df46e8a (2026-09-01).
Data as JSON: /api/errors/72459ff130c89034.
Report an issue: GitHub.