{"record":{"id":"85670e630bd352d2","repo":"coleam00/Archon","slug":"provider-entry-id-cannot-advertise-sessionfor","errorCode":null,"errorMessage":"Provider '${entry.id}' cannot advertise sessionFork without sessionResume","messagePattern":"Provider '(.+?)' cannot advertise sessionFork without sessionResume","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/providers/src/registry.ts","lineNumber":40,"sourceCode":"import { registerCopilotProvider } from './community/copilot/registration';\nimport { registerOpencodeProvider } from './community/opencode/registration';\nimport { registerPiProvider } from './community/pi/registration';\nimport { InvalidProviderRunConfigError, UnknownProviderError } from './errors';\nimport { createLogger } from '@archon/paths';\n\n/** Lazy-initialized logger (deferred so test mocks can intercept createLogger) */\nlet cachedLog: ReturnType<typeof createLogger> | undefined;\nfunction getLog(): ReturnType<typeof createLogger> {\n  if (!cachedLog) cachedLog = createLogger('provider.registry');\n  return cachedLog;\n}\n\n/** Backing store for registered providers. */\nconst registry = new Map<string, ProviderRegistration>();\n\nfunction assertValidCapabilities(entry: ProviderRegistration): void {\n  if (entry.capabilities.sessionFork === true && !entry.capabilities.sessionResume) {\n    throw new Error(`Provider '${entry.id}' cannot advertise sessionFork without sessionResume`);\n  }\n}\n\n/**\n * Register a provider. Throws on duplicate registration.\n */\nexport function registerProvider(entry: ProviderRegistration): void {\n  if (registry.has(entry.id)) {\n    throw new Error(`Provider '${entry.id}' is already registered`);\n  }\n  assertValidCapabilities(entry);\n  registry.set(entry.id, entry);\n  getLog().debug({ provider: entry.id, builtIn: entry.builtIn }, 'provider.registered');\n}\n\n/**\n * Get an instantiated agent provider by ID.\n * @throws UnknownProviderError if not registered","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/coleam00/Archon/blob/0773b9745896ef0612e709c80845a0f7db315b19/packages/providers/src/registry.ts#L22-L58","documentation":"The provider registry enforces capability consistency at registration: sessionFork (starting a new run that continues from an existing session) is only meaningful if the provider also supports sessionResume (re-opening an existing session). A provider advertising fork without resume would promise a capability it cannot deliver, so assertValidCapabilities throws during registerProvider or registerBuiltinProviders.","triggerScenarios":"registerProvider({ id, capabilities: { sessionFork: true, sessionResume: false|undefined }, ... }) — fork set true while resume unset/false.","commonSituations":"Hand-writing a custom provider registration and ticking capabilities without understanding their dependency; copying a capabilities object and editing one flag; a refactor that accidentally dropped sessionResume from a builtin.","solutions":["Set capabilities.sessionResume: true alongside sessionFork in the provider registration","If the provider truly cannot resume sessions, remove the sessionFork: true flag","Fix the builtin/registration code if a recent edit accidentally dropped sessionResume"],"exampleFix":"// before\nregisterProvider({ id: 'myprovider', capabilities: { sessionFork: true } });\n// after\nregisterProvider({ id: 'myprovider', capabilities: { sessionFork: true, sessionResume: true } });","handlingStrategy":"validation","validationCode":"function assertForkNeedsResume(caps: ProviderCapabilities): void {\n  if (caps.sessionFork === true && !caps.sessionResume) {\n    throw new Error('sessionFork requires sessionResume');\n  }\n}","typeGuard":"function forkIsValid(c: ProviderCapabilities): boolean {\n  return c.sessionFork !== true || c.sessionResume === true;\n}","tryCatchPattern":"try {\n  registerProvider(entry);\n} catch (err) {\n  if (String(err.message).includes('sessionFork without sessionResume')) {\n    console.error(`Fix capabilities for provider ${entry.id}`);\n  }\n  throw err;\n}","preventionTips":["Type capability objects so sessionResume is required when sessionFork is true","Copy capability blocks from a valid builtin registration","Run registration tests that touch every custom provider"],"tags":["provider-registry","capabilities","configuration","validation"],"backgroundTag":"invalid-capability-configuration","analyzedSha":"0773b9745896ef0612e709c80845a0f7db315b19","analyzedAt":"2026-09-01T02:28:07.064Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}