#2090

CAR v3: cross-vendor attention & escalation control plane

OpenGit-on-my-levelwants to merge intofrom

What this is

CAR v3: a ground-up pivot from "meta-harness that runs a ticket queue" to a cross-vendor attention & escalation control plane — the layer between David and every agent he runs. It ingests lifecycle/attention events from anything (Claude Code hooks, agentctl subscribe webhooks, Multica, plain curl from CI/cron), triages autonomously (rules first, LLM only as the exception path), keeps you informed via one Telegram bot, and escalates only when it can't unblock itself. Everything is durable in one SQLite file; the daemon is crash-only.

Why the pivot: v2's four pillars (queue runner, worktree isolation, chat bridge, notify-when-stuck) are now vendor-native (Claude Code workflows/channels, Codex cloud/resume, etc.). What no vendor will build is the neutral cross-vendor layer — one inbox, policy-bounded autonomy, durable across restarts. Full rationale and binding spec: v3/DESIGN.md.

Everything lives under v3/ (TypeScript + Bun). The v2 Python product is untouched and keeps working; the root README gains a 13-line pointer section. Side-by-side runnable: own state dir (~/.car/), own port (7171), own bot token, CLI named card.

Highlights

  • Wire contract car.event.v1 (zod, JSON Schema served at /v1/schema): idempotent ingest, cross-vendor session identity (one CAR session can hold multiple native refs), requires_response carrying v2's Dispatch notify/pause semantics forward.
  • In-band permission relay: Claude Code PermissionRequest hooks are parked as open HTTP responses; a policy verdict or your Telegram tap answers them before the hook deadline; timeout degrades to Claude's local prompt.
  • Autonomy is granted, never inferred: memory rules learn from your taps (confirm/override), promotion to autonomous action requires an explicit tap, and a single override demotes. Safety rails are enforced in executors, not prompts: self-event suppression, circuit breaker, budget stop, dedupe, rate limits, urgent-never-waits-for-LLM.
  • Unconditional daily digest + silence watchdog — the direct fix for the "degraded since June, unnoticed" v2 dogfooding failure. Silence is itself an event.
  • Reply-back adapter chains per vendor (claude-hook-http → claude-resume → file, codex exec resume, agentctl continuation runs, Multica API), runtime capability probes (the installed codex CLI has no queue — verified, probed, not assumed), and an honest staged-vs-delivered distinction. A reply that can't be delivered re-escalates loudly.
  • Zero-asset web UI (server-rendered, localhost): inbox, incident "why did CAR do that" chain, memory browser, policy view, digest archive, plus GET /brief.md for other agents to curl.

Verification

  • bun test: 567 pass / 0 fail (1610 assertions, 33 files) — all LLM paths via a scripted fake provider, no network, $0
  • bunx tsc --noEmit: clean
  • bun run scripts/e2e-smoke.ts: 13/13 (boot → ingest → dedupe → session identity → triage → brief → audit)
  • Legacy check.sh pre-commit hook bypassed for these commits: the change is v3-only + README, and the v3 gates (tests + typecheck) are green. The legacy Python suite is untouched.

How it was built

Two Fable design agents produced independent architecture proposals (synthesized into DESIGN.md), then a frozen Phase-0 scaffold (contract/store/ports/daemon), then seven parallel workstreams (5 Opus, 2 Sonnet) with disjoint directory ownership, integrated by the coordinator (single-recording of action rows, root /brief.md alias, session-aware policy gate).

Follow-ups (deliberately not in this PR)

  • Config additions: [multica] section (currently env CAR_MULTICA_URL/CAR_MULTICA_TOKEN), actions timeouts, templates path
  • Ingest injecting the server-assigned event_id into stored response_channel.hint (adapter has a working fallback)
  • MemoryWriter.propose explicit tier param; assembleContext host scoping; richer sendDigest signature (buttons currently ride a marker syntax)
  • Discord surface (same code path, second bot)
  • Legacy tree retirement plan once v3 dogfooding sticks

🤖 Generated with Claude Code

Activity

25
cursor[bot]2mo ago

PR Summary

Medium Risk Large new alpha daemon with ingest auth, LLM triage, subprocess execution, and permission relay, but isolated from v2 with policy executors and extensive tests; operational risk is mainly misconfiguration or premature production trust in autonomous actions.

Overview CAR v3 lands as a new Bun/TypeScript stack under v3/, run side-by-side with v2 (card on port 7171, ~/.car/, separate bot). The root README now points to v3 as the active direction while v2 stays in maintenance.

This PR introduces the attention control plane: ingest and normalize car.event.v1 (generic HTTP, Claude hooks, agentctl, Multica), durable SQLite state, a card serve daemon (HTTP ingest/UI, Telegram, triage loop, scheduler), rules-first triage with bounded LLM tooling, policy-gated probes/actions, memory tiers with grant-only autonomy, reply-back adapter chains (including in-band Claude PermissionRequest parking), an unconditional daily digest, and a silence watchdog. Docs cover integration and ops (launchd/systemd); bun test and scripts/e2e-smoke.ts exercise the scaffold.

v2 Python/Svelte and legacy workspace config are not modified beyond the README pointer.

Reviewed by Cursor Bugbot for commit 7f2f22e281b31473d849efac68e930d50a976122. Configure here.

cursor[bot]2mo ago

PR Summary

Medium Risk The change is mostly documentation but sets binding product, security, and grant semantics that future v3 code must follow; misalignment during migration could confuse operators still on v2.

Overview This PR repositions the repo around CAR v3 as a cross-vendor attention router (one inbox, durable SQLite core, explicit grants, capability providers) and deprecates the v2 Python ticket/runner product in favor of side-by-side alpha under v3/ with card, ~/.car/, and port 7171.

Root and governance docs are rewritten to match: the README and root DESIGN.md now lead with v3 and fence legacy quickstart content; the codebase constitution, architecture map, security posture, observability contract, agent onboarding/cheatsheet, and glossary now encode v3 invariants (router vs providers, grants never inferred, providers propose / core executes, delivery truth, external dead-man liveness).

New binding material under v3/ includes the full DESIGN.md spec (car.event.v1, data model, daemon loops, native + Hermes providers, safety kernel, Telegram UX, reply-back adapters, cutover gates), README.md quickstart, ADR 0001 (accepted router/provider boundary), HISTORICAL_SCARS.md (v2 failures that constrain v3), per-source integration guides, file-reply contract, UX polish plan and round-1 audits, plus bun.lock for the Bun/TypeScript v3 package.

Reviewed by Cursor Bugbot for commit 82d34c980b1aa679bcecfa046159dc9441d7506e. Configure here.

cursor[bot]2mo ago

PR Summary

High Risk Adds a new core runtime with human/agent auth separation, grant-based effects, and durable lifecycle semantics alongside a full product-direction pivot; mistakes in routing, receipt, or authorization would have broad blast radius even though v2 remains separate.

Overview This PR introduces CAR v3 under v3/ and reframes the repo: v3 is the active cross-vendor attention router (SQLite core, grants, typed effects, native/Hermes providers); v2 is deprecated in README, root DESIGN.md, and the constitution docs, with legacy content kept below the fold.

Product and docs: Root and docs/car_constitution/* are rewritten around router vs capability providers, explicit grants, durable audit/delivery semantics, and a v3 decision hierarchy (ADRs, v3/DESIGN.md). New v3 docs cover the guided car.request.v1 lane (Needs you / Watching / Handled), HTTP/CLI/MCP protocol, deployment, ingest integrations, foundation invariant matrix, and ADRs 0001–0003 plus historical scars.

Engineering: Adds .github/workflows/v3.yml — Linux/macOS matrix running frozen Bun install, check:foundation, typecheck, Bun tests, portable regressions, and smoke tests on v3/** changes. The v3/ package ships card, binding design, agent change contract (AGENTS.md), validation/handoff notes, and locked dependencies; implementation follows the documented bootstrap (no v3 migration chain; v2 Python tree untouched).

Reviewed by Cursor Bugbot for commit e6995faa160615a7b0f4ea82fec06f80bb5477dc. Configure here.

cursor[bot]2mo ago

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_105fe0b5-c178-484b-bdc7-6156be10ba17)

cursor[bot]2mo ago

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_105fe0b5-c178-484b-bdc7-6156be10ba17)

cursor[bot]2mo ago

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_105fe0b5-c178-484b-bdc7-6156be10ba17)

cursor[bot]2mo ago

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_e82b9b37-d357-4186-995d-b29710f42105)

cursor[bot]2mo ago

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_e82b9b37-d357-4186-995d-b29710f42105)

cursor[bot]2mo ago

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_e82b9b37-d357-4186-995d-b29710f42105)

cursor[bot]2mo ago

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_21749a0b-01e0-4510-819b-44511ef1d15f)

cursor[bot]2mo ago

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_21749a0b-01e0-4510-819b-44511ef1d15f)

cursor[bot]1mo ago

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_ee9ff082-f6e7-4dfe-99ec-054848a95b9b)

cursor[bot]1mo ago

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_5cc1cd43-af49-4947-a8a0-86b87cdfe194)

cursor[bot]1mo ago

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_19bb0710-4058-467b-b731-fe31d030f749)

Git-on-my-level1mo ago

Probably will abandon this direction and come up with a new v3

This current v3 idea is being folded into my other project, anx