paperclipai/paperclip · error
Paperclip ingestion fan-out exceeds the hard cap of
Error message
Paperclip ingestion fan-out exceeds the hard cap of ${MAX_PAPERCLIP_DISTILLATION_FAN_OUT} enabled profiles. What it means
Error "Paperclip ingestion fan-out exceeds the hard cap of ${MAX_PAPERCLIP_DISTILLATION_FAN_OUT} enabled profiles." thrown in paperclipai/paperclip.
Solutions
- Disable or consolidate ingestion profiles so enabled profiles per fan-out stay below the cap.
When it happens
Trigger: Thrown at packages/plugins/plugin-llm-wiki/src/wiki/core.ts:2483 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@5716fe907e (2026-08-18).
Data as JSON: /api/errors/5abb9c2a5b14daea.
Report an issue: GitHub.
Appendix: source
Thrown at packages/plugins/plugin-llm-wiki/src/wiki/core.ts:2481
if (project.managedByPlugin?.pluginKey === PLUGIN_ID) return false;
if (project.managedByPlugin?.resourceKey === WIKI_PROJECT_KEY) return false;
return true;
}
function projectActivityTimestamp(project: Project): string {
return isoString(project.updatedAt) ?? new Date().toISOString();
}
export async function enableActiveProjectDistillation(ctx: PluginContext, input: {
companyId: string;
wikiId?: string | null;
spaceSlug?: string | null;
limit?: number | null;
}): Promise<EnableActiveProjectDistillationResult> {
const wikiId = normalizeWikiId(input.wikiId);
const space = await requirePaperclipIngestionPolicy(ctx, { companyId: input.companyId, wikiId, spaceSlug: input.spaceSlug }, "candidate_search", { requireEnabledProfile: true });
if (typeof input.limit === "number" && Number.isFinite(input.limit) && Math.floor(input.limit) > MAX_PAPERCLIP_DISTILLATION_FAN_OUT) {
throw new Error(`Paperclip ingestion fan-out exceeds the hard cap of ${MAX_PAPERCLIP_DISTILLATION_FAN_OUT} enabled profiles.`);
}
const limit = normalizeLimit(input.limit ?? 3, 3, 25);
const projects = await ctx.projects.list({ companyId: input.companyId, limit: 200 });
const activeProjects = projects
.filter(isActiveDistillationProject)
.sort((a, b) => projectActivityTimestamp(b).localeCompare(projectActivityTimestamp(a)))
.slice(0, limit);
const selectedProjects: EnableActiveProjectDistillationResult["selectedProjects"] = [];
for (const project of activeProjects) {
const observedAt = projectActivityTimestamp(project);
const cursorId = await upsertPaperclipDistillationCursor(ctx, {
companyId: input.companyId,
wikiId,
spaceId: space.id,
projectId: project.id,
rootIssueId: null,
observedAt,View on GitHub (pinned to 5716fe907e)