Linux: what the CI leg proves, what it does not, and that discovery is a decision
Follows claude-jam 0.23.3 (commits 58ce3fb..c4a7b9c), which added an ubuntu-latest CI leg.
Home: the "Not built yet" bullet said Linux was "thinly proven: the sound path has never been run,
and discovery needs Apple's dns-sd, with no avahi fallback yet". Two of those are no longer true as
written. The sound DECISION is tested now (which player, which file, per kind) — what is untested is
whether the three are audibly distinguishable, and that needs a person at a Linux desktop. The avahi
"yet" was a decision, not a gap, so it says so. And hosting on Linux is named as the real remaining
hole: no tmux, claude or pty path has ever run there.
Security-Model: the state-dir gate section described the fix well and said nothing about where it
had been RUN — which matters more here than usual, because the attack cannot happen on macOS and
every review of it until now was a macOS review. That is exactly why it survived five of them. Now
states what is measured (all four filesystem branches, including the false positive against a real
1777 parent) and what is not: nobody has run the original attack as two real logins on a real shared
Linux box, and no WSL2 install has been tried with its state directory on a mounted Windows drive.
Joining: "claude-jam find says so and names the fix" understated it — find REFUSES and exits
non-zero rather than reporting an empty network, which is the whole point, and on Linux that is the
normal state rather than an edge case.
Hosting: the Linux sound line now names the two players' file sets and says plainly that nobody has
heard one.
Hosting: what the adopted re-brief can and cannot notice
The re-brief is edge detection over the pane, because a running claude cannot
be given a hook. A /compact and a /clear each leave their own marker and each
fires; the same event twice with nothing observable between them reads as one.
Says so, and names the roster re-brief as the backstop.
Pairs with claude-jam 894ed2b (campaign F7).
the release gate's doc check: five shipped features the entry page called unbuilt
Home.md's "Not built yet" list was never revisited after the first commit, so the entry
page — the one an agent reads first — was telling people that LAN discovery, join/knock
sounds, /nudge, `--uploads auto` and guest-side scrollback do not exist. All five have
shipped and all five have a page here. What remains genuinely unbuilt is Windows, and
Linux is honest about being thinly proven rather than silently fine.
Hosting-a-Jam: the flag table was missing `--history` and `--peer-tasks`, and then
claimed `--help` prints the same list. It does not, in either direction — the table also
carries four flags `--help` deliberately leaves out. Say what is actually true.
Architecture: 283 tests -> 389, two lints -> four, thirteen smokes -> eighteen, and it
quoted a SPEC.md heading ("Running the thirteen end-to-end smokes") that has never
existed under that name.
Joining-a-Jam: /peer and /peers were missing from the only command list a guest gets,
on the release that ships them. Verified every form against parseClientLine.
Security-Model: the mDNS example record still advertised v0.18.0.
Hosting: adopt the session you are already in (v0.33)
`--resume` restarts a conversation in a pane of claude-jam's own; `claude-jam
adopt` shares the one already running, where it stands. The new section says
how it is run (from inside the session, or `--pane` from another terminal),
that it shows what it resolved and asks before sharing anything, and what
happens when there is no tmux at all.
Most of it is about what claude-jam does NOT do, because adoption is the first
time it points tmux at a server it does not own: reads and typing into the one
pane, no session or option or key binding written, and `claude-jam end` taking
the daemon and leaving the pane, its session and claude exactly as they were.
The two inherent ceilings — no Stop/Notification hooks on a running claude, and
no resizing of somebody's own window — are named rather than left to be
discovered.
The `--resume` row in the flag table now points at it, since "share this
session" is what people are usually looking for when they find that flag, and
the Ending section says an adopted jam ends differently.
wiki: sounds, nudges, and the upload policy that only removes the prompt
- Files-and-Export: the three upload policies in a table, the list of
protections that do NOT move with them (and the note that smoke-nudge proves
each one still refuses while the policy is auto), the 40-file/200 MB session
quota and why the fallback line exists, and export's own separate toggle.
- Hosting-a-Jam: the four new flags in the flag table; a 'Hearing what needs
you' section with the two arrival sounds, why they differ, the once-only
knock repeat, and the three toggles.
- Joining-a-Jam: /ping and /sound in the command table, and a full section on
nudges — what the addressee sees, what the room sees, why it is never queued,
the rate limit, the once-only escalation, what idle actually reports, and the
opt-in phone config with the topic warning.
- Security-Model: a new section, 'The ntfy topic stays on your machine' — the
topic is a bearer credential, it lives only in the recipient's config, their
own client posts it, and it is never in a frame, an invite link, the
protocol or a log. Plus three new entries under 'What to assume': the upload
policy is a prompt setting and not a protection, export is separate and stays
ask, and a nudge is deliberately not on the approval ladder.
wiki: finding a jam on your network, and what announcing tells the room
Joining-a-Jam leads with finding one, because on the same wifi that is now the
easiest way in — the find/join commands, a real listing, and a table of what
each `access` value still requires of you. It also answers the three ordinary
reasons a jam is not in the list (the host used --no-announce, you are not on
that network, this machine has no mDNS tool), none of which is a fault.
Security-Model gets the privacy note as a section of its own: the six fields
that go on the wire and why each is safe, the list of what is never in it and
the fact that this is enforced by an allow-list rather than a redaction pass,
and the two consequences worth thinking about — that a jam name is a project
name and the default is the directory's, and that on an untrusted network you
should turn it off. Plus the point that discovery does not bypass any gate on
that page, and the one it would be easy to get wrong: --no-announce hides the
name, not the port. That is a bind and a firewall question.
Hosting-a-Jam gets the two flags, told apart from --tmux (which is the
identifier, not the label), and a short section pointing at the full note.
wiki: the ten pages — install, agent-install, hosting, joining, remote, files, security, architecture, troubleshooting
Written against what actually shipped (README/MANUAL/SPEC 'what shipped' notes and
the real flags in the source). Everything specced but not built — LAN discovery,
sounds, nudges, upload auto-allow, guest scrollback, peer tasks, Windows — is listed
on Home under 'Not built yet' and described nowhere else.
Agent-Install is the page another person's agent is pointed at: the never-do list
first, then numbered non-interactive commands with a verification after each, the
steps that need a human called out, and a self-test whose expected output was
recorded from a real run on 2026-08-29.