alibaba/open-code-review · error

create session writer: %w

Error message

create session writer: %w

What it means

session.New initializes the JSONL session writer (newJSONLWriter). If it cannot create the writer, the error is cached in sh.persistInitErr (not printed, to keep machine-readable stdout clean) wrapped as 'create session writer: ...', and delivered later by Finalize to the command layer. The command still runs; only session persistence fails.

Source

Thrown at internal/session/history.go:175

		RepoDir:      repoDir,
		GitBranch:    gitBranch,
		Model:        model,
		ReviewMode:   opts.ReviewMode,
		DiffFrom:     opts.DiffFrom,
		DiffTo:       opts.DiffTo,
		DiffCommit:   opts.DiffCommit,
		ScanPaths:    append([]string(nil), opts.ScanPaths...),
		ResumedFrom:  opts.ResumedFrom,
		StartTime:    time.Now(),
		FileSessions: make(map[string]*FileSession),
	}

	p, err := newJSONLWriter(sessionID, repoDir, gitBranch, model, opts)
	if err != nil {
		// Do not print here: New runs before JSON output is silenced, so writing a
		// warning to stdout would corrupt the command's machine-readable output.
		// Finalize returns this cached delivery error to the command layer.
		sh.persistInitErr = fmt.Errorf("create session writer: %w", err)
	} else {
		sh.persist = p
		p.WriteSessionStart(sh.StartTime)
	}

	if opts.Operation != "" {
		sh.manifest = NewManifestBuilder(sessionID, opts.Operation)
	}

	return sh
}

// Manifest returns the run's coverage builder, or nil for legacy/scan sessions
// that did not opt in via SessionOptions.Operation. Callers must be nil-safe.
func (sh *SessionHistory) Manifest() *ManifestBuilder {
	if sh == nil {
		return nil
	}

View on GitHub (pinned to 5cf97d0d15)

Solutions

  1. Ensure $HOME is set and writable; create ~/.opencodereview with correct permissions.
  2. Free disk space if the disk is full.
  3. Remove/rename any file that occupies the expected session directory path.
  4. Inspect the wrapped cause from Finalize's returned error for the exact OS error.

Example fix

// before
// HOME unset in CI container, session writer creation fails
// after (CI setup step)
export HOME=/home/runner
mkdir -p $HOME/.opencodereview
Defensive patterns

Strategy: try-catch

Validate before calling

home, err := os.UserHomeDir()
if err != nil {
    return err
}
sdir := filepath.Join(home, ".opencodereview")
if err := os.MkdirAll(sdir, 0o755); err != nil {
    return fmt.Errorf("cannot prepare session dir: %w", err)
}
if fi, err := os.Stat(sdir); err == nil && !fi.IsDir() {
    return fmt.Errorf("%s exists but is not a directory", sdir)
}

Type guard

func hasPersistInitErr(sh *session.History) error {
    return sh.PersistInitErr() // accessor for the cached writer-creation error, if exported
}

Try / catch

err := cmd.Execute()
// New caches the failure; Finalize delivers it.
if err != nil && strings.Contains(err.Error(), "create session writer") {
    log.Warnf("session persistence disabled: %v", err) // command output itself may still be usable
    return nil
}

Prevention

When it happens

Trigger: Calling session.New when newJSONLWriter fails — e.g. ~/.opencodereview/sessions cannot be created (HOME unset, permission denied, path is a file) or the session file cannot be opened for writing.

Common situations: Read-only home directory, disk full, HOME not set in CI containers, ~/.opencodereview/sessions/<repo> existing as a regular file, SELinux/AppArmor restrictions.

Related errors


AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02). Data as JSON: /api/errors/1ed8180765c713bd. Report an issue: GitHub.