<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sl0ppi.git/cli/test/sessions.test.ts, branch main</title>
<subtitle>a sl0p.foo repository</subtitle>
<id>https://git.sl0p.foo/sl0ppi.git/atom/cli/test/sessions.test.ts?h=main</id>
<link rel='self' href='https://git.sl0p.foo/sl0ppi.git/atom/cli/test/sessions.test.ts?h=main'/>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0ppi.git/'/>
<updated>2026-08-12T21:49:19Z</updated>
<entry>
<title>cli: survive a dead session, and a flaky terminal</title>
<updated>2026-08-12T21:49:19Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-08-12T21:49:19Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0ppi.git/commit/?id=acf61609ee7b99138251cea879d593d5f1689392'/>
<id>urn:sha1:acf61609ee7b99138251cea879d593d5f1689392</id>
<content type='text'>
Three bugs found on a fresh Debian box, all of which made sl0ppi look broken
when the terminal underneath it was the problem.

1. JSON crash on startup. `action list-panes --json` against a session that has
   died exits 0 with EMPTY stdout, and JSON.parse("") threw "JSON Parse error:
   Unexpected EOF" at the user. Empty output is now "nothing", and genuinely
   malformed output is reported with the command name and the offending text.

2. `up` silently resurrected. A dead-but-resurrectable session is not an empty
   slot: `attach --create-background NAME` restores it from the serialised copy
   and IGNORES --layout. The result was a root full of projects coming back as
   plain shells with no agents and no purposes -- and the resurrected background
   session then exited again within seconds. sl0ppi now refuses to guess and
   explains the two real options (`up --fresh` to rebuild, `sl0ppij attach` to
   restore it properly in a terminal). Verified on a clean slate that a fresh
   `up` produces exactly the right panes: purpose='agent:main' held=true cmd='pi'.

3. The terminal's CLI actions are racy. Measured against a LIVE session on a
   2-vCPU box: list-tabs and list-panes each fail ~60% of the time while the
   session is detached, ~25% with a client attached, either with empty output or
   "There is no active session!" (the action client consults
   get_active_session() before it looks at -s). That is a defect in sl0ppij --
   filed as a known issue -- but these are idempotent reads, so sl0ppi retries
   them with backoff and distinguishes "the session is gone" from "the terminal
   would not answer". `sl0ppi ls` went from failing most runs to 8/8.

Also:
  - session creation returns before the server is registered, so `up` now waits
    for readiness instead of racing its own next command
  - UserError: actionable answers ("no project foo", "that session is a saved
    dead copy") print and exit 1 instead of falling through to sl0ppij, which
    buried the explanation and started a session nobody asked for
  - `sl0ppi print &lt;project&gt;` implemented; it was referenced by the init template
    and the design doc but did not exist
</content>
</entry>
</feed>
