Skip to content

Commit 7800a78

Browse files
lroolleclaude
andcommitted
docs(devlog): receipts stack + session-manager roadmap session
Decision chain for the #516/#523/#517 stack and issues #518-#524: scope corrections (ps already existed), stacked-PR reasoning, goal source-of-truth choice, and the #518 layout decision as the live wire. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 9f772bf commit 7800a78

1 file changed

Lines changed: 86 additions & 0 deletions

File tree

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
* [2026-07-28] Shipping the receipts stack + session-manager roadmap :FEAT:ARCH:PROCESS:
2+
3+
** Tension
4+
The "launcher -> session manager" direction existed only as a chat
5+
brainstorm. On disk: =feat/goal-receipts= (#499) committed but never
6+
pushed, with two UNRELATED dirty files riding the worktree (pin bumps
7+
in =versions.env=, a stale container-context block in =AGENTS.md=).
8+
Receipts themselves were write-only — nothing read them back, so
9+
=--goal= bought attribution for ccx archaeology but zero operator
10+
visibility. And the roadmap (config/state split, options registry,
11+
ps/doctor/serve) had no issues, so nothing was actionable.
12+
13+
** Observation
14+
- =deva ps= ALREADY EXISTS (=list_containers_pretty=, dispatch token
15+
=ps | --ps=), and =deva status= already prints per-container
16+
agent/auth/uptime/mounts plus a Health section that is half of the
17+
imagined =deva doctor=. The brainstorm was designing features the
18+
script already had. Filed issue #520 before checking; the PR
19+
carries the scope correction.
20+
- The #518 double-mount is live, not theoretical: =status= on a real
21+
container shows =~/.config/deva/claude/.claude -> /home/deva/.claude=
22+
AND =~/.config/deva -> /home/deva/.config/deva= simultaneously.
23+
- =origin/main= had moved TWO releases (0.18.0, 0.18.1) under the
24+
unpushed receipts branch. Both prepend-at-top files (CHANGELOG,
25+
DEV-LOGS) conflict by construction on every rebase; everything else
26+
merged clean.
27+
- The =claude= security-audit action fails in ~2-4s on EVERY PR
28+
(#507, #508 included — both merged anyway). Empty
29+
=ANTHROPIC_API_KEY=, oauth token passed, dies right after settings
30+
setup: smells like an expired secret (#524). A permanently red
31+
check is training everyone to ignore it.
32+
- Two test scripts (=test-ccx-args.sh=, =test-status-helpers.sh=) are
33+
=100644= in git — the suite silently can't run via =./=.
34+
35+
** Decision
36+
- Three PRs, not one: #516 receipts as-committed, #517 chore
37+
(pins + AGENTS block + exec bits), #523 goal column STACKED on #516
38+
(=--base feat/goal-receipts=) so its diff is only the join.
39+
Rejected: folding the dirty files into #516 (unrelated concerns),
40+
and waiting for #516 to merge before building on it (serializes an
41+
autonomous session on a human review).
42+
- Goal source of truth: last matching receipt wins, =docker inspect=
43+
=DEVA_GOAL= env as fallback. Rejected: env-only (attach restamps
44+
never reach create-time env, so it goes stale) and receipts-only
45+
(writes are warning-only and the dir is prunable — the fallback is
46+
the honest path for exactly those cases).
47+
- =container_goal()= assignments are =|| goal=""= guarded — under
48+
=set -euo pipefail= a failed pipeline substitution aborts AT the
49+
assignment (same trap as the #484 silent exit); the receipt glob
50+
loop uses =if/fi= not =[ ] &&= so the subshell never ends on a
51+
failed test (the #414 flock lesson).
52+
- CHANGELOG entries written in main's CURRENT Keep-a-Changelog format.
53+
The claude-code-style restyle sits on local =chore/changelog-style=
54+
with no PR; matching an unmerged style would conflict every branch.
55+
56+
** Tradeoff
57+
- Stacked PRs put a merge-order burden on the reviewer (#516 first;
58+
GitHub retargets #523 to main when the branch deletes).
59+
- =container_goal()= scans every =launches/*.jsonl= per container per
60+
=ps= invocation. Fine at day-file scale; if launches accumulate for
61+
years this wants a "recent files only" cut. Not built now — no
62+
evidence it's needed.
63+
- Issue #520's body describes a feature that didn't need building.
64+
Left as-is with the correction in the PR; the lesson (check the
65+
dispatch table before filing) is cheaper than rewriting history.
66+
67+
** Next
68+
The live wire is #518: the config/state split must be decided BEFORE
69+
the bun port freezes the current layout, and it interlocks with the
70+
accounts/<tag> scoping from #497. Everything else on the roadmap
71+
(#519 registry, #521 doctor, #522 serve) composes cleanly after it.
72+
73+
** Artifacts
74+
- PRs: #516 (receipts, rebased onto v0.18.1), #517 (pins chore,
75+
2 commits), #523 (goal column, stacked)
76+
- Issues: #518 config/state split (+live evidence comment),
77+
#519 options registry, #520 ps/goal, #521 doctor, #522 serve
78+
umbrella, #524 broken PR bot
79+
- =scripts/test-launch-receipts.sh=: 13 hermetic cases (scratch XDG,
80+
stubbed docker), wired into ci.yml — first coverage for
81+
=write_launch_receipt= at all
82+
- Verified: shellcheck severity=error clean; local suite green
83+
(mount-shape, image-precedence, kimi-auth, version-targets,
84+
container-slug, status-helpers, launch-receipts); live =ps -g= /
85+
=status -g= against the real daemon renders the GOAL column; all
86+
five bumped pins resolve on npm.

0 commit comments

Comments
 (0)