Config files

July 19, 2026 ยท View on GitHub

Every file Observal reads or writes on the client (~/.observal/) and in each harness's config directory.

Client-side: ~/.observal/

FilePurposePermissions
config.jsonCLI config (server URL, access token, user info, timeout)0600
aliases.jsonUser-defined shortcuts (@my-mcp โ†’ UUID)0600
last_results.jsonLast list / show output - enables row-number references0600
telemetry_buffer.dbDurable SQLite outbox for Python session exporters awaiting contiguous server acknowledgement0600
opencode_session_outbox/Per-session durable OpenCode plugin batches and acknowledged line state0600 files
pi_session_outbox/Durable pending Pi extension batches0600 files
sync_state.jsonAcknowledged byte/line cursors for file-backed exportersowner read/write
keys/Server-side JWT keys (operators only; path controlled by JWT_KEY_DIR)0600

config.json schema

{
  "server_url": "https://observal.your-company.internal",
  "access_token": "ey...",
  "refresh_token": "ey...",
  "user_id": "f9f3...",
  "user_name": "alice@example.com",
  "output": "table",
  "color": "auto",
  "timeout": 30
}

Override any field at runtime with observal config set <key> <value> or with an env var (see Environment variables).

Durable session outbox

Python session exporters persist each observed batch in telemetry_buffer.db before network delivery. OpenCode and Pi use per-session files under their native outbox directories because their TypeScript runtimes cannot call the Python SQLite engine. All follow the same protocol: pending data survives process restarts and failed attempts, and the source line advances only when the server's contiguous checkpoint covers the complete batch. Observal does not silently evict unacknowledged records at capacity.

sync_state.json is a cache of acknowledged local positions, not the authority for delivered history. If it is missing, corrupt, or stale, recovery validates and restores positions from the authenticated server checkpoint. Finalized sessions also send a SHA-256 audit manifest; hashing is not performed on ordinary incremental uploads.

Use observal ops telemetry status to inspect pending batch count, disk use, oldest pending time, and last successful acknowledgement.

aliases.json schema

{
  "my-mcp":   "498c17ac-1234-4567-89ab-cdef01234567",
  "reviewer": "a01c5..."
}

Use anywhere that accepts <id-or-name> by prefixing with @.

harness-side

Claude Code

PathPurpose
~/.claude/settings.jsonHooks, MCP servers, telemetry config
~/.claude/agents/<name>.jsonUser-scoped sub-agent definitions
.claude/agents/<name>.jsonProject-scoped sub-agent definitions
.claude/skills/<skill>/Installed skills (SKILL.md + assets)
AGENTS.md / CLAUDE.mdRules loaded into context

Kiro

PathPurpose
.kiro/settings/mcp.jsonProject-level MCP servers with direct commands or URLs
~/.kiro/settings/mcp.jsonGlobal MCP servers
.kiro/agents/<name>.jsonProject-level agent config with telemetry hooks
~/.kiro/agents/<name>.jsonGlobal agent config
.kiro/steering/<name>.mdSteering files (system instructions with YAML frontmatter for inclusion modes)
.kiro/skills/Kiro skills (SKILL.md)
.kiro/hooks/Standalone hook definitions
AGENTS.mdRules loaded into context (compat with Claude Code)

Cursor

PathPurpose
.cursor/mcp.jsonMCP servers with direct commands or URLs
.cursor/rules/Cursor rules
AGENTS.mdRules

VS Code

PathPurpose
.vscode/mcp.jsonMCP servers with direct commands or URLs
AGENTS.mdRules loaded into context

Codex CLI

PathPurpose
AGENTS.mdRules (rules-only integration)

Backups

Every config modification by observal doctor patch or observal agent pull creates a timestamped .bak file next to the original:

~/.claude/settings.json.20260421_143055.bak
.kiro/settings/mcp.json.20260421_143055.bak
.cursor/mcp.json.20260421_143055.bak

Restore by moving the .bak back in place.

File permissions

Client-side files under ~/.observal/ are created with mode 0600 (owner read/write only). This holds your access token, so don't loosen the permissions.