|
| 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