alibaba/open-code-review · error
resume session %q carries manifest schema %q, but this build
Error message
resume session %q carries manifest schema %q, but this build can only verify %q; %s
What it means
validateInputIdentity refuses to resume a session whose recorded manifest schema version differs from the version this build can verify (ManifestSchemaVersion). Schema evolution means the stored manifest's fields cannot be trusted or compared safely, so resume is blocked rather than risk a false identity match.
Source
Thrown at internal/session/resume_identity.go:97
func (s *ResumeState) validateInputIdentity(id RunIdentity) error {
if s == nil {
return nil
}
m := s.Manifest
switch {
case m == nil && !s.Closed:
// Distinguishing all of these from "manifest present, zero completed
// items" is the whole point: that one is resumable, none of these are.
return fmt.Errorf("resume session %q was interrupted before it closed, so it never recorded a run manifest and its input identity cannot be verified; %s", s.SessionID, resumeHint)
case m == nil:
// It closed cleanly, so blaming an interruption would send the user
// looking for a crash that never happened. A session_end with no manifest
// is a session older than run manifests, or a run that failed before
// freezing one.
return fmt.Errorf("resume session %q closed without a run manifest, so its input identity cannot be verified — it either predates run manifests or failed before recording one; %s", s.SessionID, resumeHint)
case m.SchemaVersion != ManifestSchemaVersion:
return fmt.Errorf("resume session %q carries manifest schema %q, but this build can only verify %q; %s", s.SessionID, m.SchemaVersion, ManifestSchemaVersion, resumeHint)
case m.Operation != OperationReview:
return fmt.Errorf("resume session %q recorded operation %q, not %q; %s", s.SessionID, m.Operation, OperationReview, resumeHint)
case len(m.Coverage.Selected) == 0:
// Without this, an empty parent and an empty child would both hash to the
// canonical empty digest, pass every comparison, and produce a run that
// reuses nothing and dispatches nothing.
return fmt.Errorf("resume session %q selected no input, so it has nothing to resume; %s", s.SessionID, resumeHint)
}
if m.Input.Mode != id.Mode {
// Mode feeds item_id derivation, so parent and child items cannot even be
// put side by side.
return fmt.Errorf("resume rejected: input mode changed from %q to %q; %s", m.Input.Mode, id.Mode, resumeHint)
}
// Both sides empty means a repository with no remote, which is unchanged.
if m.Repository.IdentitySHA256 != id.RepositorySHA256 {
return fmt.Errorf("resume rejected: repository identity changed, so this is not the repository the parent run reviewed; %s", resumeHint)
}View on GitHub (pinned to 5cf97d0d15)
Solutions
- Use the same binary version that created the session to resume it
- Start a new review with the current build instead of resuming
- Check release notes for manifest schema migrations; migrate or discard old sessions
Defensive patterns
Strategy: validation
Validate before calling
// Verify schema compatibility before resuming
if sess.Manifest != nil && sess.Manifest.SchemaVersion != session.ManifestSchemaVersion {
return fmt.Errorf("schema %s unsupported by this build (%s)",
sess.Manifest.SchemaVersion, session.ManifestSchemaVersion)
} Type guard
func schemaSupported(m *session.Manifest) bool {
return m != nil && m.SchemaVersion == session.ManifestSchemaVersion
} Try / catch
if err := ValidateResume(s, req); err != nil {
if strings.Contains(err.Error(), "schema") {
return startNewReview(req) // or retry with the original binary version
}
return err
} Prevention
- Resume with the same binary version that created the session
- Read release notes for manifest schema bumps before upgrading mid-review
- Archive or discard sessions from incompatible builds instead of resuming
When it happens
Trigger: ValidateResume where m.SchemaVersion != ManifestSchemaVersion — typically resuming a session created by an older or newer build of the tool after the manifest schema changed.
Common situations: Upgrading or downgrading the binary between the original run and the resume; switching between release channels (stable vs dev) with different manifest schema versions; resuming sessions from an old machine's session store with a new binary.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- resume session %q closed without a run manifest, so its inpu
- load resume session: %w (run 'ocr session list' to see avail
- %w (run 'ocr session list' to see available sessions)
- resume session %q has no completed scan items (run 'ocr sess
- open resume session %q: %w
AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02).
Data as JSON: /api/errors/69d4ba154ae02937.
Report an issue: GitHub.