{"record":{"id":"4c05aef3d70ff3dd","repo":"chenhg5/cc-connect","slug":"platform-q-does-not-support-proactive-messaging-4c05ae","errorCode":null,"errorMessage":"platform %q does not support proactive messaging (timer)","messagePattern":"platform %q does not support proactive messaging \\(timer\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/engine.go","lineNumber":1709,"sourceCode":"\t// Multi-workspace fallback: strip workspace prefix from session key.\n\tif targetPlatform == nil {\n\t\tfor _, p := range e.platforms {\n\t\t\tneedle := \":\" + p.Name() + \":\"\n\t\t\tif idx := strings.Index(sessionKey, needle); idx >= 0 {\n\t\t\t\ttargetPlatform = p\n\t\t\t\tplatformName = p.Name()\n\t\t\t\tsessionKey = sessionKey[idx+1:]\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tif targetPlatform == nil {\n\t\treturn fmt.Errorf(\"platform %q not found for session %q\", platformName, sessionKey)\n\t}\n\n\trc, ok := targetPlatform.(ReplyContextReconstructor)\n\tif !ok {\n\t\treturn fmt.Errorf(\"platform %q does not support proactive messaging (timer)\", platformName)\n\t}\n\n\trunSessionKey := sessionKey\n\tvar replyCtx any\n\tvar err error\n\tif !job.Mute {\n\t\tif resolver, ok := targetPlatform.(CronReplyTargetResolver); ok {\n\t\t\tresolvedSessionKey, resolvedReplyCtx, err := resolver.ResolveCronReplyTarget(sessionKey, timerRunTitle(job))\n\t\t\tif err != nil {\n\t\t\t\tif !errors.Is(err, ErrNotSupported) {\n\t\t\t\t\treturn fmt.Errorf(\"resolve timer reply target: %w\", err)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif resolvedSessionKey != \"\" {\n\t\t\t\t\trunSessionKey = resolvedSessionKey\n\t\t\t\t}\n\t\t\t\tif resolvedReplyCtx != nil {\n\t\t\t\t\treplyCtx = resolvedReplyCtx","sourceCodeStart":1691,"sourceCodeEnd":1727,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/core/engine.go#L1691-L1727","documentation":"Thrown when the resolved platform does not implement the optional ReplyContextReconstructor interface, which is required to rebuild a reply context for proactive (timer) messages. Normal reply flows work, but the engine cannot originate a new message without that capability.","triggerScenarios":"A cron/timer job targets a platform adapter that lacks ReplyContextReconstructor implementation.","commonSituations":"Using a minimal/custom platform adapter for scheduled messages; older platform plugin versions predating the ReplyContextReconstructor capability.","solutions":["Implement ReplyContextReconstructor on the platform adapter","Switch the timer job to a platform that supports proactive messaging","Check the platform adapter version and upgrade to one with proactive support"],"exampleFix":"// before\nfunc (p *Platform) Stop() {}\n// after\nfunc (p *Platform) ReconstructReplyContext(sessionKey string) (any, error) { return p.rebuildCtx(sessionKey) }","handlingStrategy":"type-guard","validationCode":"if _, ok := platform.(core.ReplyContextReconstructor); !ok { /* choose another platform for timers */ }","typeGuard":"rc, ok := targetPlatform.(core.ReplyContextReconstructor); if !ok { return fmt.Errorf(\"platform %q lacks proactive support\", name) }","tryCatchPattern":"if err := engine.ScheduleTimer(job); err != nil && strings.Contains(err.Error(), \"proactive messaging\") { fallbackToManualReminder() }","preventionTips":["Implement ReplyContextReconstructor in all custom platform adapters","Document which platforms support proactive messaging","Test timer jobs against each platform during integration"],"tags":["go","timer","capability"],"backgroundTag":"unsupported-operation","analyzedSha":"4000b2338aa6e850c99df54f8b0ed6ed7460b401","analyzedAt":"2026-09-06T11:45:09.575Z","contentChangedAt":"2026-09-06T11:45:09.575Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}