thedotmack/claude-mem · info
Skipped Codex transcript watch because native Codex hooks…
Error message
Skipped Codex transcript watch because native Codex hooks are authoritative
What it means
When native Codex hooks are enabled (authoritative ingestion path), the transcript watcher removes any Codex file-watch entries from the config to avoid double-ingesting Codex transcripts. This warning reports how many watch entries were removed and how to opt back into transcript-file ingestion.
Solutions
- Do nothing if you want hook-based ingestion — remove the now-redundant Codex watch entry from the config.
- Set CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION=true to opt back into transcript-file ingestion for Codex.
- Disable the native Codex hooks if you specifically prefer file-watching ingestion.
Example fix
// before // (no env var set, Codex watch entry present) // after: opt back in CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION=true
Defensive patterns
Strategy: validation
Validate before calling
if (hasCodexWatch(config.watches) && !process.env.CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION) {
console.warn('Codex transcript watch will be skipped; native hooks are active');
} Prevention
- Choose one Codex ingestion path (hooks OR transcript watch), not both
- Clean up watch configs when upgrading to hook-based ingestion
- Document the CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION opt-in for your team
When it happens
Trigger: startTranscriptWatcher (via initializeBackground) loads the watch config and strips Codex watches because Codex native hooks are active and CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION is not set to true.
Common situations: User previously configured a Codex transcript watch, then upgraded to a version where native Codex hooks are the default ingestion path; both mechanisms would duplicate observations, so the watch is dropped.
Understand the failure class
Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.
Related errors
- Missing schema for watch
- Native Codex hooks registered, but failed to disable legacy…
- Transcript watch config not found
- ActiveServerQueueManager requires…
- CLAUDE_MEM_QUEUE_ENGINE is not "bullmq"
AI-assisted analysis of thedotmack/claude-mem@d8bc9755e7 (2026-09-17).
Data as JSON: /api/errors/561eb4b08401da6a.
Report an issue: GitHub.
Appendix: source
Thrown at src/services/worker-service.ts:819
const configPath = settings.CLAUDE_MEM_TRANSCRIPTS_CONFIG_PATH || DEFAULT_CONFIG_PATH;
const resolvedConfigPath = expandHomePath(configPath);
if (!existsSync(resolvedConfigPath)) {
logger.info('TRANSCRIPT', 'Transcript watcher config not found; skipping automatic transcript capture', {
configPath: resolvedConfigPath
});
return;
}
const allowCodexTranscriptIngestion = settings.CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION === 'true';
const { config: transcriptConfig, removed } = filterNativeHookBackedCodexWatches(
loadTranscriptWatchConfig(configPath),
allowCodexTranscriptIngestion
);
const statePath = expandHomePath(transcriptConfig.stateFile ?? DEFAULT_STATE_PATH);
if (removed > 0) {
logger.warn('TRANSCRIPT', 'Skipped Codex transcript watch because native Codex hooks are authoritative', {
removed,
optInSetting: 'CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION=true',
});
}
if (transcriptConfig.watches.length === 0) {
logger.info('TRANSCRIPT', 'Transcript watcher config has no active watches; skipping automatic transcript capture', {
configPath: resolvedConfigPath,
});
return;
}
try {
this.transcriptWatcher = new TranscriptWatcher(transcriptConfig, statePath);
await this.transcriptWatcher.start();
} catch (error) {
this.transcriptWatcher?.stop();
this.transcriptWatcher = null;View on GitHub (pinned to d8bc9755e7)