Skip to content

P1 invariant: the REPL works out of the box — no daemon, no config, no latency change #428

Description

@justrach

The standing guarantee that gates the entire detachment arc (#420, built on #422). Typing graff in a directory must always give exactly today's experience: one process, no daemon, no socket, no setup step, in-process rendering at in-process latency. Detachment is strictly opt-in (backgrounding a session, graff attach), never the default path.

Concretely, every slice of #422/#420 is bound by:

  1. In-process TuiSink stays the default transport. The event contract is the same either way; the socket is an alternative sink transport, not a replacement. A Phase-2 PR that makes the plain REPL depend on a daemon, a socket handshake, or any background service violates this issue.
  2. Behavior gate: the golden eval harness (byte-identical --json + PTY transcripts) rides every conversion PR, as it has for feat(engine): #422 slice 1 — typed event vocabulary + EngineSink inversion for agent_stream #423/feat(engine): #422 slice 1b — agent_ws and argstream emit typed events; spinner aliases and inline notices gone #426.
  3. Latency gate (from the first transport milestone): the same scripted session run in-process vs attached must byte-match its rendered transcript, and a delta-to-paint benchmark (p99) must show no regression on the in-process default.
  4. Cold start: no measurable startup regression on the plain graff path (no daemon probe on the hot path; discovery of background sessions happens in graff agents, not at REPL boot).

This issue stays open for the life of the arc; close it only when #420 ships with all gates in CI.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions