R2D2-MERIDIAN/VISION_ACTIVITY.md
Joshua Belke de4cfec61e feat: rebrand Codebase Chat to Meridian
Renames the product to Meridian across 1826 files: 24 crates
(codebase-chat-* -> meridian-*), the Flutter package, env vars
(CODEBASE_CHAT_* -> MERIDIAN_*), the deep-link scheme (meridian://),
Postgres GUCs, Helm charts, skills, and the agent surface.

White-labels every external identity onto self-hosted infrastructure:
hosts move from *.codebase.design to *.meridian.r2d2.office.ilab.zone,
images to registry.r2d2.office.ilab.zone/meridian-*, the repo slug to
r2d2/meridian, and bundle IDs to zone.ilab.office.r2d2.meridian.*.
The Block staging relay and the four Block-internal build repos are not
reachable from a self-hosted deployment and are no longer referenced.

The mark becomes a pixel M. It is 5x6 rather than a square 5x5 because
the avatar-pile mask asserts the hole clears the glyph's right edge:
at 5x5 that edge moves from 68.4% to 73% of the tile, which overruns the
56px team-card hole outright and leaves the other three piles under a
pixel. At 5x6 the aspect is 0.833 against the retired C's 0.800, so all
four masks clear it unchanged. All 59 materializations are regenerated
from the generators; `just check-brand` passes.

Four things are deliberately NOT renamed, because they match what was
*stored* rather than what now ships. Rewriting any of them makes a
migration no-op on exactly the installs it exists to repair:

- Frozen migrations 0001-0030. Their SHA-256 digests are pinned in
  n-minus-one-pins.json and embedded in the attested N-1 image. The new
  vocabulary lands as forward migration 0031, which dual-reads all three
  generations' GUCs, lock names, app profiles and mesh d_tags. The
  push-gateway's own 0001 is likewise restored byte-identical, with
  0002 widening its app_profile CHECK.
- Legacy namespace chains. xyz.block.codebasechat.app is *prepended* to
  LEGACY_RELEASE_IDENTIFIERS and its dev/localStorage twins, per the rule
  in legacy_dirs.rs that a previous rename already broke once.
- Bead IDs (codebaseChat-*), which are cited from commits and docs.
- CHANGELOG history and upstream issue links.

The Codebase-era persona ids are added to RETIRED_PERSONAS with their
prompts verbatim, but deliberately NOT to RETIRED_PERSONA_REPLACEMENTS:
that map drives migration::retire_agents, which deletes deployed
instances, and its safety argument is that the successor is already
deployed alongside. That held for Buzz->Codebase; nothing provisions a
Meridian agent on an install that already onboarded, so mapping these
would delete a working agent and leave nothing in its place.

The brand-guard self-test changes axis: the M is symmetric about its
vertical axis, so a mirrored M *is* the canonical M and asserting a
rejection there would assert a bug. It now flips top-to-bottom (the mark
reads as a W) and pins the horizontal symmetry so the coupling is visible
if the mark ever becomes asymmetric again.

Verified: cargo check --workspace --all-targets clean, just fix-all
clean, flutter analyze clean, just check-skills pass, check-brand 59/59,
brand-core 9/9, avatarPileMask 4/4, starter-avatar contrast 2/2.

Signed-off-by: Joshua Belke <joshua@innovationhub-act.org>
2026-08-04 14:06:04 -04:00

5.1 KiB
Raw Permalink Blame History

Vision: The Agent Activity Feed

The Problem

When you delegate work to an agent, you are trusting a process you cannot see. The activity feed is the window into that process — but a window is only useful if you can read it at a glance. A raw input/output dump is not a window; it is a transcript you have to decode. It forces you to parse before you can judge.

We wanted a feed you supervise the way you supervise a capable teammate: skim for progress, trust the routine, and catch the one thing that needs you — without reading every line.

Who It Serves

A developer supervising a delegate. They are not watching for entertainment; they are deciding whether to intervene. Every item in the feed earns its pixels by answering one of three questions:

  • Comprehension — what is it doing, and why?
  • Confidence — is it going well, or is it stuck or wrong?
  • Control — do I need to step in, and where?

A feed that answers these instantly converts a stream of events into a sense of trajectory. A feed that does not is just noise with a scrollbar.

The Governing Frame: Verb, Object, Outcome

Every meaningful item is a sentence: the agent did [verb] to [object] → [outcome].

"Sent a message to #design." · "Edited runtime.rs (+12/−3)." · "Reacted 👍 to Marge's review." · "Ran tests → 1248 passed."

The feed's job is to surface verb, object, and outcome immediately, and to push the supporting detail — full arguments, raw output, the unabridged diff — into progressive disclosure. You read the sentence; you expand only when the sentence makes you want to.

The Render Classes

Every item resolves to one of twelve presentation classes, organized by how often they are read and how much consequence they carry:

The spine — read constantly. Message (the agent's voice), Meridian relay op (acting on the platform), File-edit (the actual code work), Shell command (the agent's hands), and Tool status & turn lifecycle (the heartbeat). If these are unclear, the feed has failed.

High-value context — consulted to judge correctness. Thought (reasoning, on tap), Plan/Todo (the roadmap and progress bar), Permission (the control gate), and Error (the stop sign).

Ambient safety net — rarely read, but must exist. Generic tool (the honest fallback), Raw rail (ground truth on demand), and Suppressed noise (what we deliberately do not render).

These are not a wish list. They are the complete taxonomy: every event the agent can emit lands in exactly one class, and the last three guarantee there is always a floor.

Design Principles

  • Semantics over transport. Render what the agent did, not which API it used. A message sent through an MCP tool and the same message sent through a shell meridian command render as the identical card. How the agent reached the relay is plumbing; what it did is the contract.

  • Outcome-first. Lead with success, failure, or result. The reader decides in under a second whether to expand. The raw dump is the fallback, never the headline.

  • Mutate in place. A running action updates its own row from pending to executing to done or failed. One action is one item, not a trail of duplicated status lines.

  • Never go dark. The absence of an event is itself information. Silence, idle, and timeout are rendered states — "waiting…", "timed out" — never an empty void. This mirrors the rule we hold our agents to: if you didn't show it, it didn't happen.

  • Failures rise; reads recede. Salience tracks consequence. Admin actions, writes, and errors are loud. Reads and reasoning are quiet. A buried error is a broken feed.

  • Resolve references. Show "#design", "Marge's message", a filename — never a raw event id or pubkey. The reader thinks in names, not hashes.

  • Coalesce streams. Chunked text becomes one item. The developer reads a message, not a packet trace.

  • Honesty over guessing. A recognized operation gets a semantic card. An unrecognized one degrades to a clean, truthful, generic row. We never fabricate semantics to look richer than we are.

  • Polished by default, raw on demand. Curation is the product; the raw rail is the safety net. The toggle between them is a zoom level on the same truth, not a different feed.

What This Earns

The feed's real job is to earn delegation. Visible progress, visible consent, and visible outcomes compound: each turn you watch go well makes you trust the agent with a larger one. Deciding what not to show — suppressing heartbeats and internal chatter — is as much a feature as deciding what to show, because suppression is what makes the signal legible.

A feed built this way is protocol-honest at its base: any compliant agent's messages, thoughts, tool calls, and turns become first-class items regardless of which tools it runs. The Meridian-specific richness — semantic relay cards, the meridian-CLI parser, diff rendering — is a layer of enrichment on top, not a requirement underneath. Non-Meridian agents get a correct, legible feed; Meridian agents get a native one.

Two altitudes of the same truth. Polished for judgment, raw for debugging. The window stays a window.