{"record":{"id":"561eb4b08401da6a","repo":"thedotmack/claude-mem","slug":"skipped-codex-transcript-watch-because-native-code","errorCode":null,"errorMessage":"Skipped Codex transcript watch because native Codex hooks are authoritative","messagePattern":"Skipped Codex transcript watch because native Codex hooks are authoritative","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/services/worker-service.ts","lineNumber":738,"sourceCode":"    const configPath = settings.CLAUDE_MEM_TRANSCRIPTS_CONFIG_PATH || DEFAULT_CONFIG_PATH;\n    const resolvedConfigPath = expandHomePath(configPath);\n\n    if (!existsSync(resolvedConfigPath)) {\n      logger.info('TRANSCRIPT', 'Transcript watcher config not found; skipping automatic transcript capture', {\n        configPath: resolvedConfigPath\n      });\n      return;\n    }\n\n    const allowCodexTranscriptIngestion = settings.CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION === 'true';\n    const { config: transcriptConfig, removed } = filterNativeHookBackedCodexWatches(\n      loadTranscriptWatchConfig(configPath),\n      allowCodexTranscriptIngestion\n    );\n    const statePath = expandHomePath(transcriptConfig.stateFile ?? DEFAULT_STATE_PATH);\n\n    if (removed > 0) {\n      logger.warn('TRANSCRIPT', 'Skipped Codex transcript watch because native Codex hooks are authoritative', {\n        removed,\n        optInSetting: 'CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION=true',\n      });\n    }\n\n    if (transcriptConfig.watches.length === 0) {\n      logger.info('TRANSCRIPT', 'Transcript watcher config has no active watches; skipping automatic transcript capture', {\n        configPath: resolvedConfigPath,\n      });\n      return;\n    }\n\n    try {\n      this.transcriptWatcher = new TranscriptWatcher(transcriptConfig, statePath);\n      await this.transcriptWatcher.start();\n    } catch (error) {\n      this.transcriptWatcher?.stop();\n      this.transcriptWatcher = null;","sourceCodeStart":720,"sourceCodeEnd":756,"githubUrl":"https://github.com/thedotmack/claude-mem/blob/e2d1df569a8f04075d40e92461128ece7cf04c82/src/services/worker-service.ts#L720-L756","documentation":"claude-mem captures Codex sessions through native Codex hooks, which are authoritative. filterNativeHookBackedCodexWatches() therefore removes the canonical Codex transcript watch (name 'codex' targeting ~/.codex/sessions/**/*.jsonl) from the watch config unless CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION is exactly 'true'. This warning reports how many watches were removed so ingestion is not duplicated.","triggerScenarios":"The watch config ships the default codex watch while native hooks are installed, and the opt-in env var is unset or set to anything other than the literal string 'true'.","commonSituations":"Users re-enabling an old transcript-watch config after upgrading to a claude-mem version that ships native Codex hooks; setting CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION in the wrong env file so it never reaches the worker.","solutions":["Do nothing if native Codex hooks are active — sessions are still captured, this skip is intentional and avoids duplicates","If you genuinely need transcript tailing instead, set CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION=true in the worker's environment (e.g. ~/.claude-mem/.env) and restart"],"exampleFix":"# ~/.claude-mem/.env - add to re-enable tailing\nCLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION=true","handlingStrategy":"validation","validationCode":"function expectCodexIngestion(env: NodeJS.ProcessEnv): void {\n  const tailing = env.CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION === 'true';\n  const nativeHooks = fs.existsSync(path.join(os.homedir(), '.codex'));\n  if (!tailing && !nativeHooks) {\n    throw new Error('Codex capture disabled: no native hooks and transcript ingestion not opted in');\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Default to native Codex hooks; do not re-enable tailing unless hooks are unavailable","If you set CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION, it must equal the literal string 'true' and reach the worker env","Expect duplicate Codex observations if both capture paths run"],"tags":["codex","transcript-watcher","config","hooks"],"backgroundTag":"optional-feature-disabled","analyzedSha":"e2d1df569a8f04075d40e92461128ece7cf04c82","analyzedAt":"2026-08-20T23:58:13.836Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}