Tencent/WeKnora · error

validate sandbox binding: %w

Error message

validate sandbox binding: %w

What it means

After a successful Get, readBinding validates that the returned SessionSandboxBinding actually matches the requested session key (binding.Validate). A mismatch means the store returned corrupt or cross-key data, so the library refuses to trust it. This indicates data corruption or a misbehaving store, not a transient failure.

Source

Thrown at internal/sandbox/session_lifecycle.go:525

	if current == nil {
		return nil
	}
	return errors.New("sandbox binding changed during destroy")
}

func (l *remoteSessionLifecycle) readBinding(
	ctx context.Context,
	key SessionSandboxKey,
) (*SessionSandboxBinding, error) {
	binding, err := l.bindings.Get(ctx, key)
	if err != nil {
		return nil, fmt.Errorf("get sandbox binding: %w", err)
	}
	if binding == nil {
		return nil, nil
	}
	if err := binding.Validate(key); err != nil {
		return nil, fmt.Errorf("validate sandbox binding: %w", err)
	}
	return binding, nil
}

func (l *remoteSessionLifecycle) cleanupCreated(
	parent context.Context,
	handle RemoteSandboxHandle,
) error {
	if handle == nil || handle.ID() == "" {
		return errors.New("cannot clean up remote sandbox without an ID")
	}
	return l.cleanupSandboxID(parent, handle.ID())
}

func (l *remoteSessionLifecycle) cleanupSandboxID(
	parent context.Context,
	sandboxID string,
) error {

View on GitHub (pinned to 988cbb0330)

Solutions

  1. Inspect the Validate error in the %w chain to see which field mismatched
  2. Audit/fix the SessionSandboxBindingStore implementation for key encoding or retrieval bugs
  3. Delete the corrupt binding record so the next resolve recreates it cleanly
  4. Check for recent migrations or version changes that altered key formats

Example fix

// before (custom store)
func (s *memStore) Get(ctx context.Context, key SessionSandboxKey) (*SessionSandboxBinding, error) {
    return s.m[s.keyString(key)], nil // may return wrong record
}
// after
func (s *memStore) Get(ctx context.Context, key SessionSandboxKey) (*SessionSandboxBinding, error) {
    b, ok := s.m[s.keyString(key)]
    if !ok { return nil, nil }
    if b.SessionID != key.SessionID { return nil, fmt.Errorf("key mismatch: stored %q want %q", b.SessionID, key.SessionID) }
    return b, nil
}
Defensive patterns

Strategy: validation

Validate before calling

// Guard custom store implementations against key/record mismatch
func (s *memStore) Get(ctx context.Context, key SessionSandboxKey) (*SessionSandboxBinding, error) {
    b := s.m[s.encode(key)]
    if b != nil && b.SessionID != key.SessionID {
        return nil, fmt.Errorf("corrupt record for key %v", key)
    }
    return b, nil
}

Try / catch

if err != nil && strings.Contains(err.Error(), "validate sandbox binding") {
    // store returned data inconsistent with the key: purge record, do not retry blindly
    log.Printf("corrupt binding: %v", err)
}

Prevention

When it happens

Trigger: The binding store returns a non-nil binding whose provider/sandbox/session fields do not match the requested SessionSandboxKey — typically from store corruption, a bug in a custom SessionSandboxBindingStore implementation, or key collisions from bad key encoding.

Common situations: Custom/in-memory store implementations returning wrong records; key serialization bugs after upgrades; manual edits or migrations corrupting binding records.

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


AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02). Data as JSON: /api/errors/2f77dca2dac8f3a5. Report an issue: GitHub.