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
- Ensure $HOME is set and writable; create ~/.opencodereview with correct permissions.
- Free disk space if the disk is full.
- Remove/rename any file that occupies the expected session directory path.
- 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
- Ensure HOME is set and writable in CI/containers.
- Pre-create ~/.opencodereview with correct ownership.
- Keep free disk space for session logs.
- Never shadow the sessions directory with a regular file.
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
- finalize session: %w
- finalize session: %w
- list sessions: %w
- read sessions dir %q: %w
- open session %q: %w
AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02).
Data as JSON: /api/errors/1ed8180765c713bd.
Report an issue: GitHub.