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

  1. Do nothing if you want hook-based ingestion — remove the now-redundant Codex watch entry from the config.
  2. Set CLAUDE_MEM_CODEX_TRANSCRIPT_INGESTION=true to opt back into transcript-file ingestion for Codex.
  3. 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

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


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)