This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: surrealdb-2-0-live-queries-record-links-production-standard

SurrealDB 2.0 Live Queries & Record Links Production Standard

SurrealDB 2.0 introduces strict RecordId types, an overhauled Rust engine, and push-based LIVE QUERY streaming over WebSockets. In production, unmanaged live queries cause persistent socket leaks and cluster memory exhaustion, while handling record links as arbitrary strings breaks transactional graph traversal and schema validation.

Prohibited Anti-Pattern: Treating record IDs as raw interpolated strings and abandoning live query UUID subscriptions without deterministic teardown.

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: SurrealDB 2.0 Live Queries & Record Links Production Standard - SurrealDB 2.0 introduces strict RecordId types, an overhauled Rust engine, and push-based LIVE QUERY streaming over WebSockets. In production, unmanaged live queries cause persistent socket leaks and cluster memory exhaustion, while handling record links as arbitrary strings breaks transactional graph traversal and schema validation.
globs: src/**/*.ts, src/**/*.js, lib/**/*.ts, services/**/*.ts
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/surrealdb-2-0-live-queries-record-links-production-standard"
---

# SurrealDB 2.0 Live Queries & Record Links Production Standard

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Treating record IDs as raw interpolated strings and abandoning live query UUID subscriptions without deterministic teardown.

## System Constraints
You are a Principal Backend Architect specializing in SurrealDB 2.0. Enforce strict RecordId instantiation, deterministic LIVE QUERY subscription lifecycle teardown via UUID tracking, and atomic graph edge mutation boundaries across all data-access layers.

## Strict Guidelines
- Developers MUST instantiate record references using typed `new RecordId(table, id)` objects rather than raw concatenated string literals.
- Live query listeners MUST store the returned query UUID and MUST execute `db.unlive(queryUuid)` or `KILL $queryUuid` upon stream completion, consumer abort, or socket teardown.
- Graph edge relationships created with `RELATE` across multiple entities MUST execute inside an explicit `BEGIN TRANSACTION` and `COMMIT TRANSACTION` boundary to prevent orphaned references.
- Live queries SHOULD ALWAYS apply indexed `WHERE` filters to constrain evaluation scopes and prevent engine-level broadcast notification storms in the SurrealDB 2.0 Rust core.

## Bad vs Good Implementations
### SurrealDB 2.0 Live Query Subscription Lifecycle with RecordId

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Concatenating table and record IDs as raw strings breaks SurrealDB 2.0 graph type enforcement and risks syntax injection. Omitting the live query UUID prevents the client from invoking unlive, resulting in permanent memory leaks and abandoned WebSocket message routing on the cluster.
```typescript
import { Surreal } from 'surrealdb';

export async function subscribeToUserEvents(db: Surreal, userId: string) {
  // Anti-pattern: String concatenation bypasses RecordId parsing;
  // live query UUID is discarded, leaking subscriptions and memory indefinitely.
  const query = `LIVE SELECT * FROM event WHERE user = 'user:${userId}';`;
  const [result] = await db.query(query);
  return result;
}
```

#### Production Standard (Correct)
> **Standard**: The production pattern uses `new RecordId('user', userId)` for strict reference semantics, tracks the live subscription UUID, and registers an abort listener that calls `db.unlive(queryUuid)` to deterministically release server and client WebSocket resources.
```typescript
import { Surreal, RecordId } from 'surrealdb';

export interface EventRecord {
  id: RecordId<'event'>;
  user: RecordId<'user'>;
  action: string;
}

export async function subscribeToUserEvents(
  db: Surreal,
  userId: string,
  onEvent: (action: string, record: EventRecord) => void,
  abortSignal: AbortSignal
): Promise<string> {
  const userRecord = new RecordId('user', userId);
  
  // Production pattern: Type-safe live subscription with explicit UUID lifecycle tracking
  const queryUuid = await db.live('event', (action, result) => {
    const event = result as EventRecord;
    if (event.user.equals(userRecord)) {
      onEvent(action, event);
    }
  });

  const cleanup = async (): Promise<void> => {
    try {
      await db.unlive(queryUuid);
    } catch (error) {
      console.error(`Failed to unlive SurrealDB query ${queryUuid}:`, error);
    }
  };

  if (abortSignal.aborted) {
    await cleanup();
    return queryUuid;
  }

  abortSignal.addEventListener('abort', () => {
    void cleanup();
  }, { once: true });

  return queryUuid;
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: SurrealDB 2.0 Live Queries & Record Links Production Standard

SurrealDB 2.0 Live Queries & Record Links Production Standard defines an industrial-grade behavioral standard for backend engineering. SurrealDB 2.0 introduces strict RecordId types, an overhauled Rust engine, and push-based LIVE QUERY streaming over WebSockets. In production, unmanaged live queries cause persistent socket leaks and cluster memory exhaustion, while handling record links as arbitrary strings breaks transactional graph traversal and schema validation. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Treating record IDs as raw interpolated strings and abandoning live query UUID subscriptions without deterministic teardown. Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftTreating record IDs as raw interpolated strings and abandoning live query UUID subscriptions without deterministic teardown.Critical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Developers MUST instantiate record references using typed `new RecordId(table, id)` objects rather than raw concatenated string literals.

Developers MUST instantiate record references using typed `new RecordId(table, id)` objects rather than raw concatenated string literals.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Live query listeners MUST store the returned query UUID and MUST execute `db.unlive(queryUuid)` or `KILL $queryUuid` upon stream completion, consumer abort, or socket teardown.

Live query listeners MUST store the returned query UUID and MUST execute `db.unlive(queryUuid)` or `KILL $queryUuid` upon stream completion, consumer abort, or socket teardown.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Graph edge relationships created with `RELATE` across multiple entities MUST execute inside an explicit `BEGIN TRANSACTION` and `COMMIT TRANSACTION` boundary to prevent orphaned references.

Graph edge relationships created with `RELATE` across multiple entities MUST execute inside an explicit `BEGIN TRANSACTION` and `COMMIT TRANSACTION` boundary to prevent orphaned references.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Live queries SHOULD ALWAYS apply indexed `WHERE` filters to constrain evaluation scopes and prevent engine-level broadcast notification storms in the SurrealDB 2.0 Rust core.

Live queries SHOULD ALWAYS apply indexed `WHERE` filters to constrain evaluation scopes and prevent engine-level broadcast notification storms in the SurrealDB 2.0 Rust core.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is SurrealDB 2.0 Live Queries & Record Links Production Standard critical for AI coding assistants?

SurrealDB 2.0 introduces strict RecordId types, an overhauled Rust engine, and push-based LIVE QUERY streaming over WebSockets. In production, unmanaged live queries cause persistent socket leaks and cluster memory exhaustion, while handling record links as arbitrary strings breaks transactional graph traversal and schema validation. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Treating record IDs as raw interpolated strings and abandoning live query UUID subscriptions without deterministic teardown.) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

1 Rule in Stack

SurrealDB