@rubytech/create-maxy-code 0.1.196 → 0.1.198

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/config/brand.json +3 -1
  3. package/payload/platform/plugins/admin/PLUGIN.md +3 -0
  4. package/payload/platform/plugins/admin/skills/investigate/SKILL.md +286 -0
  5. package/payload/platform/plugins/admin/skills/superpowers-sprint/SKILL.md +361 -0
  6. package/payload/platform/plugins/admin/skills/task/SKILL.md +283 -0
  7. package/payload/platform/plugins/docs/references/admin-ui.md +2 -1
  8. package/payload/platform/plugins/docs/references/internals.md +0 -2
  9. package/payload/platform/plugins/docs/references/investigate-and-task-skills.md +9 -0
  10. package/payload/platform/plugins/docs/references/platform.md +1 -1
  11. package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
  12. package/payload/server/public/assets/AdminShell-DPk5UgEJ.js +1 -0
  13. package/payload/server/public/assets/{Checkbox-DTxJvyG7.js → Checkbox-Bh3kwzxP.js} +1 -1
  14. package/payload/server/public/assets/{admin-tKgLki8m.js → admin-BWzKAudL.js} +1 -1
  15. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-CrQJbK3h.js → architectureDiagram-Q4EWVU46-Boys2mT1.js} +1 -1
  16. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BLCbhL8K.js → blockDiagram-DXYQGD6D-CvHqp46r.js} +1 -1
  17. package/payload/server/public/assets/{brand-lZz3OVIE.css → brand-VQtREmts.css} +1 -1
  18. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-X34EilDe.js → c4Diagram-AHTNJAMY-DiNQ95F6.js} +1 -1
  19. package/payload/server/public/assets/channel-BgwH_qhE.js +1 -0
  20. package/payload/server/public/assets/{chunk-336JU56O-CeRuGBQ2.js → chunk-336JU56O-9nS9-05M.js} +2 -2
  21. package/payload/server/public/assets/{chunk-426QAEUC-CUZOrcMu.js → chunk-426QAEUC-B2__9lRY.js} +1 -1
  22. package/payload/server/public/assets/{chunk-4TB4RGXK-CdrIHRcy.js → chunk-4TB4RGXK-R5F8rS0Z.js} +1 -1
  23. package/payload/server/public/assets/{chunk-5FUZZQ4R-CenIbTIp.js → chunk-5FUZZQ4R-B8HhJce-.js} +1 -1
  24. package/payload/server/public/assets/{chunk-5PVQY5BW-DGfzIUel.js → chunk-5PVQY5BW-Bjb08lbL.js} +1 -1
  25. package/payload/server/public/assets/{chunk-EDXVE4YY-DSft5oIH.js → chunk-EDXVE4YY-he0qCF3s.js} +1 -1
  26. package/payload/server/public/assets/{chunk-ENJZ2VHE-Dn8FFfaI.js → chunk-ENJZ2VHE-BTArFW5l.js} +1 -1
  27. package/payload/server/public/assets/{chunk-ICPOFSXX-JrwcKV7r.js → chunk-ICPOFSXX-CoyIL4q_.js} +1 -1
  28. package/payload/server/public/assets/{chunk-OYMX7WX6-C0X2fcAm.js → chunk-OYMX7WX6-DjLEhNFe.js} +1 -1
  29. package/payload/server/public/assets/{chunk-U2HBQHQK-DPdLe-f5.js → chunk-U2HBQHQK-tac2uvW1.js} +1 -1
  30. package/payload/server/public/assets/{chunk-X2U36JSP-Bw8pKkFu.js → chunk-X2U36JSP-DIWD9i88.js} +1 -1
  31. package/payload/server/public/assets/{chunk-YZCP3GAM-DcAJR-EA.js → chunk-YZCP3GAM-Ac7ogADz.js} +1 -1
  32. package/payload/server/public/assets/{chunk-ZZ45TVLE-DU374ZbR.js → chunk-ZZ45TVLE-QgqDaY9-.js} +1 -1
  33. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CwdV1-c8.js +1 -0
  34. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CS_jtevB.js +1 -0
  35. package/payload/server/public/assets/clone-BTishuSs.js +1 -0
  36. package/payload/server/public/assets/{dagre-DisbqNSB.js → dagre-D6qN4nkK.js} +1 -1
  37. package/payload/server/public/assets/{dagre-KV5264BT-D_n7R7V9.js → dagre-KV5264BT-C6TRKOg0.js} +1 -1
  38. package/payload/server/public/assets/data-CaZbNF-j.js +1 -0
  39. package/payload/server/public/assets/{diagram-5BDNPKRD-CJID_5OR.js → diagram-5BDNPKRD-BVk_J8Pt.js} +1 -1
  40. package/payload/server/public/assets/{diagram-G4DWMVQ6-ByepjvdE.js → diagram-G4DWMVQ6-BdV1IgwS.js} +1 -1
  41. package/payload/server/public/assets/{diagram-MMDJMWI5-DTkAHPHE.js → diagram-MMDJMWI5-OsvBkN6u.js} +1 -1
  42. package/payload/server/public/assets/{diagram-TYMM5635-CnVRa9NJ.js → diagram-TYMM5635-BQmKPyrb.js} +1 -1
  43. package/payload/server/public/assets/{erDiagram-SMLLAGMA-CRAGu7nV.js → erDiagram-SMLLAGMA-ChEx5_3C.js} +1 -1
  44. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BJusdlRz.js → flowDiagram-DWJPFMVM-B7sf6AG3.js} +1 -1
  45. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BFMOBBnF.js → ganttDiagram-T4ZO3ILL-DbpSraax.js} +1 -1
  46. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-CGWEzh7u.js → gitGraphDiagram-UUTBAWPF-BnxDElDh.js} +1 -1
  47. package/payload/server/public/assets/{graph-D-iQdRDk.js → graph-CBP5yppq.js} +2 -2
  48. package/payload/server/public/assets/{graph-labels-u2_3Eyfh.js → graph-labels-BsZNScfa.js} +1 -1
  49. package/payload/server/public/assets/{graphlib-DNUvypOi.js → graphlib-Dux06enE.js} +1 -1
  50. package/payload/server/public/assets/{infoDiagram-42DDH7IO-CBDrnRTc.js → infoDiagram-42DDH7IO-BLWb6oKx.js} +1 -1
  51. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-C7NwSQo_.js → ishikawaDiagram-UXIWVN3A-AFiRuE6G.js} +1 -1
  52. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DSaP7A3F.js → journeyDiagram-VCZTEJTY-CxHBRGGu.js} +1 -1
  53. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DmixHCD4.js → kanban-definition-6JOO6SKY-CGugF0N8.js} +1 -1
  54. package/payload/server/public/assets/{line-CGGoTheL.js → line-COFloj-X.js} +1 -1
  55. package/payload/server/public/assets/{mermaid-parser.core-BudFADW7.js → mermaid-parser.core-CxXuCDQf.js} +1 -1
  56. package/payload/server/public/assets/{mermaid.core-BBbdJxXY.js → mermaid.core-BRBNvNup.js} +3 -3
  57. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CUiD9km1.js → mindmap-definition-QFDTVHPH-DarW5Wwq.js} +1 -1
  58. package/payload/server/public/assets/{pieDiagram-DEJITSTG-BlAWpMr8.js → pieDiagram-DEJITSTG-CTokFAkN.js} +1 -1
  59. package/payload/server/public/assets/{public-CjeEF2vf.js → public-Bq-eOUu9.js} +3 -3
  60. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CXmIwc4W.js → quadrantDiagram-34T5L4WZ-BNawkg3I.js} +1 -1
  61. package/payload/server/public/assets/{requirementDiagram-MS252O5E-D_7_OeMC.js → requirementDiagram-MS252O5E-CWnO56oR.js} +1 -1
  62. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-BKm_PqzT.js → sankeyDiagram-XADWPNL6-D9c-EZfV.js} +1 -1
  63. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-CBSR0Zst.js → sequenceDiagram-FGHM5R23-In5lxCT5.js} +1 -1
  64. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-CHNpT69M.js → stateDiagram-FHFEXIEX-CYb5js-u.js} +1 -1
  65. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-z-TVJfRt.js +1 -0
  66. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CxZoew5-.js → timeline-definition-GMOUNBTQ-Cje-BY9v.js} +1 -1
  67. package/payload/server/public/assets/{useSelectionMode-CwxXQzEI.js → useSelectionMode-B_2EQ2CC.js} +1 -1
  68. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-CKJdFDcG.js → vennDiagram-DHZGUBPP-BqeuoPr1.js} +1 -1
  69. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-C-XBcm-g.js → wardleyDiagram-NUSXRM2D-DE7xAnoq.js} +1 -1
  70. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-Crb-ZtaP.js → xychartDiagram-5P7HB3ND-JE4x8YEZ.js} +1 -1
  71. package/payload/server/public/data.html +5 -5
  72. package/payload/server/public/graph.html +6 -6
  73. package/payload/server/public/index.html +6 -6
  74. package/payload/server/public/public.html +5 -5
  75. package/payload/server/server.js +221 -296
  76. package/payload/server/public/assets/AdminShell-DtABh34v.js +0 -1
  77. package/payload/server/public/assets/channel-ChZECiuj.js +0 -1
  78. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BpMBCYn6.js +0 -1
  79. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BU3HoIr1.js +0 -1
  80. package/payload/server/public/assets/clone-C3j5j6ku.js +0 -1
  81. package/payload/server/public/assets/data-DwY26t_T.js +0 -1
  82. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Kc8XO6yH.js +0 -1
  83. /package/payload/server/public/assets/{brand-CpGp9OyK.js → brand-CzeO4m4J.js} +0 -0
@@ -0,0 +1,361 @@
1
+ ---
2
+ name: superpowers-sprint
3
+ description: Structured sprint workflow built only on officially-distributed Claude Code skills (superpowers, code-review, plainly). Drives an eight-phase chain — worktree → brainstorm → plan → implement → verify → code review → land → final status — with every phase resolved to a skill that ships in `~/.claude/skills/` or the official plugin marketplaces. Use on installs that do not carry the `gstack` plugin. Triggers include "superpowers sprint", "sprint without gstack", or invoking against a `.tasks/NNN-*.md` file on a maxy-code install.
4
+ ---
5
+
6
+ # Superpowers Sprint
7
+
8
+ A structured workflow for executing development work — features, bug fixes, refactors, any scoped unit of work — using only skills that ship with the official Claude Code distribution. No `gstack`, no custom plugin required.
9
+
10
+ This skill is the maxy-code counterpart to `sprint`. The phase chain is identical in spirit; the difference is the skill at each phase. If both `gstack` and superpowers are installed and the project is set up for it, prefer `sprint` — its plan reviews are richer. Use this skill when `gstack` is not available.
11
+
12
+ ## Output discipline (applies to every emission in this skill)
13
+
14
+ Every message the sprint writes — plan summaries, change logs, status tables, the final summary — is written `/plainly`. That means:
15
+
16
+ - Plain English, spoken register, short sentences. Read it aloud; if it doesn't parse in conversation, rewrite it.
17
+ - Only pertinent information. The operator needs to know: the outcome was achieved, how it was achieved, where the agent deviated, and what they must do to verify. Anything that does not serve one of those four is cut.
18
+ - No filler, no inflation vocabulary, no em-dashes, no AI tells (see the `plainly` skill catalogue). No re-stating the brief back to the user.
19
+ - Tables and checklists stay only when they carry information the operator will act on. A table with one row of "✅" everywhere is replaced by one sentence.
20
+
21
+ Bloat in any phase's output is a defect, not a style choice.
22
+
23
+ ## Phase markers
24
+
25
+ Every phase emits exactly one marker line to stdout when it begins, in the form:
26
+
27
+ ```
28
+ [sprint] phase <N> — <name> — invoking <skill>
29
+ ```
30
+
31
+ If a phase invokes no skill (internal-only steps like Plan Conformity or Debrief), the marker names the internal step instead: `[sprint] phase <N> — <name> — internal`. Markers exist so the operator and any transcript reader can confirm which phases ran and in what order. A missing marker is a phase that did not run.
32
+
33
+ ## Workflow
34
+
35
+ ### Phase 0: Worktree Isolation — `superpowers:using-git-worktrees`
36
+
37
+ Invoke `superpowers:using-git-worktrees`. The skill creates an isolated git worktree on a fresh branch named for the task (e.g. `task-537-superpowers-sprint`). Without isolation, parallel sessions share one HEAD and one working directory — a branch switch in one session silently disrupts every other active session.
38
+
39
+ After entering the worktree, install dependencies before building. Worktrees only contain tracked files, so `node_modules`, build artifacts, and untracked configuration are absent. Run `npm install` in every directory you plan to build from.
40
+
41
+ `getmaxy` is one repo with two parallel installer trees living as plain directories — `packages/create-maxy/` ships `@rubytech/create-maxy`, and `maxy-code/packages/create-maxy-code/` ships `@rubytech/create-maxy-code`. Neither is a submodule, subtree, or sibling repo. Build only the tree the sprint touches; if a build needs `platform/` deps, install in the matching tree (`platform/` at the root for legacy work, `maxy-code/platform/` for Maxy Code work). If the sprint depends on recent main-branch work, merge main into the worktree branch at the start.
42
+
43
+ If already in a worktree (resuming a sprint), skip — but verify `node_modules` is present.
44
+
45
+ If the only repo-side artifact of the sprint is the task-file archive plus the LANES.md sync (the deliverable lives outside the repo entirely — e.g. an operator-side `~/.claude/skills/...` file), the worktree is still required: the archive commit must land on a feature branch and merge to main like any other change.
46
+
47
+ ### Phase 1: Brainstorm — `superpowers:brainstorming`
48
+
49
+ Invoke `superpowers:brainstorming`. The skill explores user intent, requirements, and design before any code is written. It is the forcing function that prevents starting implementation against an unclear brief.
50
+
51
+ Read the task file or operator brief first, then enter brainstorming with what you understood. The skill's questions surface implicit assumptions, unstated constraints, and scope ambiguity. The output of this phase is a shared understanding of *what* is being built and *why*, not yet *how*.
52
+
53
+ If the operator hands over a fully-formed plan that is already broken into specific files and behaviours, brainstorming can be a fast confirmation rather than an open exploration — but it still runs, because skipping it is the failure mode the phase exists to prevent.
54
+
55
+ ### Phase 2: Plan — `superpowers:writing-plans`
56
+
57
+ Invoke `superpowers:writing-plans` against the brainstorm output. The skill produces a single written plan: the files to touch, the behaviours to add or change, the edge cases, the test coverage, the deployment story. This is the artefact Phase 6 (Plan Conformity) checks the implementation against.
58
+
59
+ This is a deliberate downgrade from `sprint`'s separate CEO and Eng reviews — multi-approach architecture review is out of scope for the superpowers chain. One reviewed plan is the baseline.
60
+
61
+ Present the final plan to the operator and get explicit confirmation before writing any production code.
62
+
63
+ ### Phase 3: Implement — `superpowers:executing-plans` + `superpowers:test-driven-development`
64
+
65
+ Invoke `superpowers:executing-plans` to drive execution against the Phase 2 plan. Within each step, follow `superpowers:test-driven-development` — RED-GREEN-REFACTOR for every behaviour change.
66
+
67
+ Tests are ephemeral: design and run them to prove the implementation works during the sprint, then discard them. They are not committed to the repository unless the project's own test suite already lives in the tree and the new behaviour belongs in it. Their purpose is to enforce thinking through behaviour before writing production code, not to build a permanent regression suite.
68
+
69
+ - **Test first.** Write a failing test for each behaviour before implementing it. Watch it fail. Write minimal code to pass. Refactor.
70
+ - **Track progress.** Use TaskCreate/TaskUpdate for multi-step work. Mark tasks in_progress before starting, completed when done.
71
+ - **Build incrementally.** Make changes file by file. Verify as you go with build scripts to catch errors early, not at the end.
72
+ - **Follow project conventions.** Read CLAUDE.md rules.
73
+ - **Multi-surface sync.** On a maxy-code sprint, when adding or removing MCP tools, all registration surfaces must be updated in the same commit: tool server `index.ts`, `PLUGIN.md` declarations, `ADMIN_CORE_TOOLS`, and specialist agent templates under `platform/templates/specialists/agents/`. Grep for a sibling tool name to find affected files.
74
+ - **Don't over-engineer.** Only make changes that are directly needed. No speculative abstractions, no cleanup of surrounding code, no extra error handling for impossible scenarios.
75
+ - **Debug with discipline.** When something breaks and the cause isn't immediately obvious, invoke `superpowers:systematic-debugging`. It enforces root-cause-first: hypothesis → evidence → fix. No fixes without root cause. This replaces the instinct to chain speculative fixes.
76
+
77
+ ### Phase 4: Verify — `superpowers:verification-before-completion`
78
+
79
+ Invoke `superpowers:verification-before-completion`. The skill blocks any "it works" claim until an explicit verification command has been run and its output observed. Evidence before assertions, always.
80
+
81
+ Minimum verification surface:
82
+
83
+ 1. Build — no TypeScript errors. Build success does not imply boot success. When the change touches dependencies, the build pipeline, or plugin entry points, also run the bundle command for the matching tree and confirm no runtime errors in the assembled payload.
84
+ 2. Lint — no new lint errors in changed files.
85
+ 3. Tests — the ephemeral tests from Phase 3 pass, plus any pre-existing test surface that covers the changed code.
86
+ 4. **UI sprints.** Drive the change in a real browser via the `chrome-devtools-mcp:chrome-devtools` MCP, or the `playwright` MCP if that is what the project is set up for. Walk the user-visible flow that the sprint changed and confirm the expected state. Console messages and network requests are part of the verification surface, not optional polish.
87
+ 5. **Pi signal verification (for sprints touching hooks or MCP tool input handling).** Local tests validate hook logic but cannot verify that test inputs match what production actually sends. After deploying to the Pi, trigger the relevant flow via admin chat. SSH in and read the diagnostic log (`/tmp/maxy-gate.log` for gate hooks, or the relevant log for other hooks). Compare the actual `tool_input` field names and structure against what the local tests pipe as JSON. If they diverge, the tests are wrong — fix them before proceeding. The Pi is the only environment where the real Claude Code hook protocol runs.
88
+
89
+ If verification fails, return to Phase 3.
90
+
91
+ ### Phase 5: Code Review — `superpowers:requesting-code-review` → `code-review:code-review` → `superpowers:receiving-code-review`
92
+
93
+ Invoke `superpowers:requesting-code-review` to frame the review request. Then run `code-review:code-review` against the sprint's diff. Process the response through `superpowers:receiving-code-review`, which gates whether each finding is accepted, contested, or filed as follow-up.
94
+
95
+ Findings that are accepted and trivial are fixed before proceeding. Findings that are accepted but out-of-scope for this sprint become new `.tasks/NNN-*.md` files (the same deferral rule as Phase 6 — prose deferrals are banned). Findings that are contested get a one-line rebuttal in the debrief.
96
+
97
+ ### Phase 6: Land
98
+
99
+ Land has four internal steps in fixed order: Plan Conformity, Debrief, Task Archive + LANES sync, then worktree teardown via `superpowers:finishing-a-development-branch`.
100
+
101
+ **Gating model — fixed, not per-sprint.** The boundary between automatic and command-gated steps is the same on every sprint, so the user never has to remember which kind of sprint this was:
102
+
103
+ | Step | When |
104
+ |------|------|
105
+ | Commit, archive task file, merge to local `main`, worktree + branch cleanup | **Automatic** once the user confirms the task is done in this phase |
106
+ | `git push`, `npm publish` | **Always await explicit command** — never auto-run, never offer as a menu |
107
+
108
+ No "Want me to push, or hold?" phrasings. The rule above is the answer; restating it as a question is a menu-phrasing violation. If the user wants to push, they say so; otherwise the final-status block makes the pending state visible.
109
+
110
+ #### 6a. Plan Conformity
111
+
112
+ Compare the implementation against the approved Phase 2 plan. Every plan item must appear in exactly one section of the conformity report:
113
+
114
+ ```
115
+ ## Plan Conformity
116
+
117
+ ### Implemented as planned
118
+ - [item] — matches plan: [brief evidence]
119
+
120
+ ### Deviations
121
+ - [item] — DEVIATED: [what the plan said] → [what was actually built] — Reason: [why]
122
+ → Follow-up: [.tasks/NNN-*.md path] — REQUIRED if the deviation drops any plan commitment
123
+
124
+ ### Omissions
125
+ - [item] — NOT IMPLEMENTED — Follow-up: [.tasks/NNN-*.md path] — REQUIRED, no exceptions
126
+
127
+ ### Additions
128
+ - [item] — NOT IN PLAN: [what was added and why it was necessary]
129
+ ```
130
+
131
+ **100% coverage required.** Silent omissions — items that were in the plan but neither implemented nor flagged — are the failure mode this step exists to prevent.
132
+
133
+ **Deferrals require task files, never prose.** Any plan item moved out of this sprint must point to a concrete `.tasks/NNN-*.md` file created here, before the debrief. "Deferred because X" without a task file becomes a silent regression. Binary rule: either pull the item back into scope and finish it, or file a task.
134
+
135
+ If deviations or omissions are found, present them to the operator for acknowledgement before the debrief.
136
+
137
+ #### 6b. Debrief
138
+
139
+ **Change log.** For every file modified:
140
+
141
+ ```
142
+ ### `path/to/file.ts`
143
+ **What changed:** [concise description of the change]
144
+ **Why:** [the reason this change was needed]
145
+ **Implication:** [what this change means for the system — behavior change, new capability, dependency, etc.]
146
+ ```
147
+
148
+ Group related changes logically.
149
+
150
+ **Commit table.** Run `git log --oneline <base-branch>..HEAD` and present it as a table of hash, message, files. Nothing uncommitted at debrief time without an explanation.
151
+
152
+ **Testing instructions.** Specific UI steps the operator runs to exercise the feature, what to look for, what should NOT happen. "Test it" is not an instruction. "Open `/setup`, click the iMessage refresh button, verify the status shows Connected" is.
153
+
154
+ **Known limitations.** Every intentionally-deferred or out-of-scope item links to a `.tasks/NNN-*.md` file. No prose-only deferrals.
155
+
156
+ #### 6c. Task Archive and LANES Sync
157
+
158
+ Close the loop against the original task file. For every requirement in the task:
159
+
160
+ - **Complete** — implemented and verified during this sprint.
161
+ - **Deferred** — deliberately excluded; a new `.tasks/NNN-*.md` captures what remains and why.
162
+ - **Missing** — should have been done but wasn't. Fix it now before archiving.
163
+
164
+ Present the assessment and wait for operator confirmation. Do not archive until every requirement is accounted for.
165
+
166
+ Once confirmed, archive the task file. The recipe branches on whether the source is tracked, because `git mv` errors with `fatal: not under version control` on an untracked source:
167
+
168
+ ```bash
169
+ if git ls-files --error-unmatch .tasks/<task-file>.md >/dev/null 2>&1; then
170
+ git mv .tasks/<task-file>.md .tasks/archive/
171
+ else
172
+ mv .tasks/<task-file>.md .tasks/archive/<task-file>.md
173
+ git add .tasks/archive/<task-file>.md
174
+ fi
175
+ ```
176
+
177
+ Two post-conditions hold for both branches; a third holds only for tracked sources:
178
+
179
+ ```bash
180
+ # 1. No file remains at the live path.
181
+ [ ! -e .tasks/<task-file>.md ] || { echo "ERROR: live source still on disk"; exit 1; }
182
+
183
+ # 2. The archive add is staged.
184
+ git diff --cached --name-only | grep -qx ".tasks/archive/<task-file>.md" \
185
+ || { echo "ERROR: archive add not staged"; exit 1; }
186
+
187
+ # 3. (Tracked branch only) Confirm the rename was atomic.
188
+ if git ls-files --error-unmatch .tasks/<task-file>.md >/dev/null 2>&1; then
189
+ git diff --cached --name-status | grep -E "^R[0-9]+\s+\.tasks/<task-file>\.md\s+\.tasks/archive/<task-file>\.md$" \
190
+ || { echo "ERROR: tracked source not renamed atomically — re-run with git mv"; exit 1; }
191
+ fi
192
+ ```
193
+
194
+ Pre-archive safety net: if `.tasks/archive/<task-file>.md` already exists on disk, stop. A duplicate basename in archive is never a silent overwrite — investigate the prior archive cycle first.
195
+
196
+ **Update `.tasks/LANES.md` in the same commit as the archive move.** Three invariants hold after the LANES edit:
197
+
198
+ 1. **No Ready row references the archived task.** Verify: `grep -F "<task-file>.md" .tasks/LANES.md` returns zero hits inside the Ready section.
199
+ 2. **The archive sentence names the archived task number.** Verify: the regex `\b<NNN>\b` matches at least once inside the archive sentence.
200
+ 3. **Any new task file created for deferred work gets a Ready row in the same edit.** Otherwise the next sprint inherits an open file with no tracker entry.
201
+
202
+ Commit the archive move, the LANES update, and any new task files for deferred work as a single commit:
203
+
204
+ ```
205
+ chore: archive <task-name>
206
+ ```
207
+
208
+ #### 6d. Worktree Teardown — `superpowers:finishing-a-development-branch`
209
+
210
+ Invoke `superpowers:finishing-a-development-branch` to present the integration options (merge, PR, cleanup). On this sprint chain the default action is merge-to-local-main, because the gating model says push and publish await explicit operator command — the skill should be driven toward that outcome, not toward a PR.
211
+
212
+ The cleanup sequence after the operator confirms is order-sensitive:
213
+
214
+ 1. Return to the main working directory (the superpowers skill drives this via its worktree teardown action).
215
+ 2. Merge the feature branch into `main`: `git merge <branch-name>`.
216
+ 3. **Sweep post-merge debris in `.tasks/`.** When the worktree archived a task file that was never tracked on `main` (created in a prior session at the open path but never committed), the merge brings in the archive add but cannot delete the untracked open-path copy on main. Walk every `chore: archive` commit in the merged range and remove untracked open-path twins:
217
+
218
+ ```bash
219
+ MERGED_RANGE="$(git merge-base HEAD~ HEAD)..HEAD"
220
+ git log --format=%H --grep='^chore: archive' "$MERGED_RANGE" | while read -r sha; do
221
+ git show --name-only --format= "$sha" | grep -E '\.tasks/archive/.+\.md$' | while read -r archived; do
222
+ bn="$(basename "$archived")"
223
+ open="${archived%/archive/$bn}/$bn"
224
+ if [ -e "$open" ] && ! git ls-files --error-unmatch "$open" >/dev/null 2>&1; then
225
+ rm -f "$open"
226
+ echo "[sprint] post-merge debris removed: $open"
227
+ fi
228
+ done
229
+ done
230
+ ```
231
+
232
+ 4. Remove the worktree: `git worktree remove .claude/worktrees/<name>`.
233
+ 5. Force-delete the branch: `git branch -D <branch-name>` (capital `-D`; lowercase `-d` fails when `refs/remotes/origin/main` is behind local `main`).
234
+
235
+ If not in a worktree, merge and force-delete the branch directly, still running the debris sweep between them.
236
+
237
+ ### Phase 7: Final Status — `plainly`
238
+
239
+ The sprint's last emission has two parts in fixed order: (1) the live status table, computed from the working tree right now; (2) a three-sentence plain-English summary, written under the `plainly` skill rules.
240
+
241
+ Every sprint ends with this block as its final output, regardless of how it went.
242
+
243
+ #### 7a. Status table
244
+
245
+ Compute each row from a deterministic check, then render:
246
+
247
+ ```
248
+ ## Sprint Status
249
+
250
+ | Artifact | State | Detail |
251
+ |----------|-------|--------|
252
+ | Committed | ✅ / ❌ | `git status --porcelain` empty? |
253
+ | Merged to local main | ✅ / ❌ | `git branch --contains <sha> \| grep -q '^[* ] main$'` |
254
+ | Pushed to origin/main | ⏳ awaiting command / ✅ / N/A | `git rev-list main..origin/main --count` is 0 and HEAD == origin/main |
255
+ | Published (every brand) | ⏳ awaiting command / ✅ / N/A — no shipped files changed | one row per brand directory under `$BRANDS_DIR`; ✅ only when `npm view <pkg> version` returns the bumped version for ALL of them |
256
+ | Task archived | ✅ / ❌ | task file lives under `.tasks/archive/` |
257
+ | LANES synced | ✅ / ❌ | `.tasks/LANES.md` has no Ready row for the archived task, and the archive sentence names `<NNN>` |
258
+ ```
259
+
260
+ Rules:
261
+
262
+ - **Always emitted**, even if every row is ✅. Skipping it is the failure mode this phase prevents.
263
+ - **No menu phrasings.** Never end with "Want me to push, or hold?" or any variant.
264
+ - **States are computed, not narrated.** Don't write "I think it's pushed"; run the check and render ✅ or ⏳.
265
+ - **N/A is required when applicable.** A skill-only sprint (deliverable outside the published packages) shows publish rows as `N/A — no shipped files changed`, not ⏳.
266
+ - **The pending-commands block (below) is omitted entirely** if no row is ⏳.
267
+
268
+ #### 7b. Pending commands
269
+
270
+ If any row is ⏳, render the commands the operator runs when ready. Publish-tree detection picks the installer tree from the sprint's diff against the merge base — never from `basename` of the working directory; both trees live in the one `getmaxy` repo:
271
+
272
+ | Installer tree | Installer directory | Brands directory | Default brand | Default package |
273
+ |---|---|---|---|---|
274
+ | Repo root (legacy Maxy) | `packages/create-maxy/` | `brands/` | `maxy` | `@rubytech/create-maxy` |
275
+ | `maxy-code/` (Maxy Code) | `maxy-code/packages/create-maxy-code/` | `maxy-code/brands/` | `maxy-code` | `@rubytech/create-maxy-code` |
276
+
277
+ ```bash
278
+ git push
279
+ # (publish block — only if any Published row is ⏳; iterates every brand directory)
280
+ REPO_ROOT=$(git rev-parse --show-toplevel)
281
+ CHANGED=$(git diff --name-only "$(git merge-base HEAD main)" HEAD)
282
+ if echo "$CHANGED" | grep -q '^maxy-code/'; then
283
+ INSTALLER_DIR=maxy-code/packages/create-maxy-code
284
+ BRANDS_DIR=maxy-code/brands
285
+ DEFAULT_BRAND=maxy-code
286
+ else
287
+ INSTALLER_DIR=packages/create-maxy
288
+ BRANDS_DIR=brands
289
+ DEFAULT_BRAND=maxy
290
+ fi
291
+ cd "$REPO_ROOT/$INSTALLER_DIR" && npm run bundle && npm publish
292
+ cd "$REPO_ROOT/$INSTALLER_DIR" && for b in $(ls "$REPO_ROOT/$BRANDS_DIR" | grep -v "^${DEFAULT_BRAND}$"); do
293
+ npm run bundle -- --brand="$b" && npm publish --ignore-scripts
294
+ done
295
+ cd "$REPO_ROOT/$INSTALLER_DIR" && npm run bundle
296
+ ```
297
+
298
+ A diff that touches both trees is two sprints, not one — split it before publishing. A diff that touches neither tree is a docs/tooling sprint and publishes nothing; mark every Published row N/A. Every brand under `$BRANDS_DIR` ships a separate npm package and all of them must publish in lockstep at the same version — every new deployment of any brand pulls its own `@rubytech/create-<brand>` from npm, so a brand left behind silently regresses on the next install. `--ignore-scripts` on every non-default brand prevents `prepublishOnly` from re-bundling as the default brand and republishing under the wrong name. The final `npm run bundle` restores `package.json` to the default brand.
299
+
300
+ After publishing, verify every brand landed at the new version on npm:
301
+
302
+ ```bash
303
+ for pkg in $(for b in $(ls "$BRANDS_DIR"); do
304
+ python3 -c "import json; print(json.load(open('$BRANDS_DIR/'+'$b'+'/brand.json'))['npm']['packageName'])"
305
+ done); do
306
+ echo "$pkg: $(npm view "$pkg" version)"
307
+ done
308
+ ```
309
+
310
+ Every line must show the version just bumped — a lagging entry means the publish loop missed that brand and a manual `cd "$REPO_ROOT/$INSTALLER_DIR" && npm run bundle -- --brand=<that-brand> && npm publish --ignore-scripts` is required.
311
+
312
+ A version bump applies once to the default installer package and propagates to every brand at bundle time — there is no per-brand version. Bump once, publish all brands at that version, every time.
313
+
314
+ #### 7c. Plain summary (the literal last words of the sprint)
315
+
316
+ After the status block, write exactly three short sentences, under the `plainly` skill rules. Nothing follows them. The three sentences cover, in order:
317
+
318
+ 1. **Outcome** — what was achieved, in the operator's words. One sentence.
319
+ 2. **How / deviation** — the single most important thing the operator needs to know about how it was done, or where the work deviated from the brief. If there was no meaningful deviation, use this sentence for the one mechanism that matters. One sentence.
320
+ 3. **Verify** — the one concrete thing the operator does to confirm the outcome landed. One sentence, imperative.
321
+
322
+ Hard rules:
323
+
324
+ - Three sentences total. Not four. Not "three sentences plus a bullet list".
325
+ - No jargon, no acronyms, no file paths, no commit hashes, no em-dashes.
326
+ - No restating what the table already said.
327
+ - No follow-up offer, no "let me know if…", no `/schedule` tail.
328
+
329
+ If the sprint deferred work to a task file, the deviation sentence names that fact in plain English (e.g. "the retry cap is filed as a follow-up task"). The task number lives in the table or the conformity report, not in this summary.
330
+
331
+ ---
332
+
333
+ ## Commits
334
+
335
+ Every commit made during a sprint must include a `Session:` trailer linking it to the Claude Code session that produced it.
336
+
337
+ Derive the session ID from the most recently modified JSONL in the project's session directory:
338
+
339
+ ```bash
340
+ ls -t ~/.claude/projects/$(pwd | tr '/' '-')/*.jsonl | head -1 | xargs basename | sed 's/.jsonl//'
341
+ ```
342
+
343
+ Include it as a trailer:
344
+
345
+ ```
346
+ feat: implement feature X
347
+
348
+ Co-Authored-By: Claude <model> <noreply@anthropic.com>
349
+ Session: <session-id>
350
+ ```
351
+
352
+ ---
353
+
354
+ ## Principles
355
+
356
+ - **Ship complete.** A sprint is not done until the debrief and the final-status block are delivered. Code without documentation is unfinished work.
357
+ - **Explain the why.** Every change has a reason. "Refactored for clarity" is not a reason. "Extracted to avoid duplicate route derivation across WhatsApp and iMessage" is.
358
+ - **Operator perspective.** Testing instructions are written for the person running the product. If the operator is non-technical, instructions are UI-based.
359
+ - **No surprises.** If a change has side effects, non-obvious implications, or touches shared infrastructure, call it out explicitly.
360
+ - **Iterative by default.** Scope to what's achievable, and defer the rest by filing a `.tasks/NNN-*.md` for each unfinished piece before the sprint ends. Prose-only deferrals are banned.
361
+ - **Always close with status.** Every sprint, without exception, ends on the Phase 7 Final Status block. Same gating rule on every sprint (commit/merge automatic, push/publish await command), same final emission shape, no menu-phrasing tail.
@@ -0,0 +1,283 @@
1
+ ---
2
+ name: task
3
+ description: |
4
+ Generate a task entry that fully defines a unit of work — motivation,
5
+ boundaries, verification, and observability — so any session can
6
+ implement it without further conversation. Use when asked to "task it",
7
+ "create a task", "write a task file", or when the user describes work
8
+ that should be captured before a sprint.
9
+ allowed-tools:
10
+ - Read
11
+ - Write
12
+ - Glob
13
+ - Grep
14
+ - Bash
15
+ - AskUserQuestion
16
+ ---
17
+
18
+ # Task Generation
19
+
20
+ ## What this skill produces
21
+
22
+ A single task entry that fully defines a unit of work — its motivation,
23
+ boundaries, verification strategy, and deployment observability — so that
24
+ any session can implement it without further conversation.
25
+
26
+ The entry is written through the **task surface of the environment this
27
+ install exposes**. The surface resolution below decides where; the
28
+ structure, principles, and precision pass below are identical regardless
29
+ of surface.
30
+
31
+ ---
32
+
33
+ ## Task surface (where tasks live in this environment)
34
+
35
+ Before searching prior work or writing the deliverable, resolve where
36
+ tasks live in the current install. Check in this order; use the first
37
+ one that exists:
38
+
39
+ 1. **Graph tasks (deployed maxy).** If the `work-*` MCP tools are
40
+ available — `work-list` and `work-get` for prior-work search,
41
+ `work-create` to write the deliverable (it persists `:Task` nodes in
42
+ Neo4j and **owns the identifier — no number scan**) — tasks live in
43
+ the graph. Use those tools. The plugin is `work`, not `tasks` —
44
+ renamed to avoid colliding with Claude Code's built-in `Task*` family.
45
+ 2. **Local `.tasks/` directory.** If the repo has a `.tasks/` directory
46
+ (optionally with `archive/`, `in-progress/`, `parked/`, `backlog/`
47
+ subdirs and a `LANES.md`), tasks live on disk as
48
+ `.tasks/<N>-<slug>.md`.
49
+ 3. **Neither.** State this explicitly: "No task surface detected — this
50
+ install has no `work-*` graph tools and no `.tasks/` directory. The
51
+ deliverable will be a written report only."
52
+
53
+ Throughout this skill, "search prior tasks" and "write the task" mean:
54
+ use the resolved surface. Operate inside whatever tree/surface the
55
+ install exposes; never hard-code paths.
56
+
57
+ ## Before generating
58
+
59
+ 1. **Determine the next identifier.**
60
+ - **Graph surface:** `work-create` assigns the identifier on write —
61
+ no number scan, no manual numbering. For prior-work search use
62
+ `work-list` / `work-get`.
63
+ - **Local `.tasks/` surface:** scan `.tasks/`, `.tasks/in-progress/`,
64
+ `.tasks/archive/`, and `.tasks/parked/` for the highest existing
65
+ `<N>-<slug>.md` and increment by one. Never invent a numbering
66
+ convention not already in use in this tree.
67
+ - **No surface:** skip — the deliverable is a report.
68
+
69
+ 2. **Read the task tracker, if one exists.**
70
+ - **Local `.tasks/` surface:** read `.tasks/LANES.md` (if present) to
71
+ understand active lanes and file contention; the new task's lane
72
+ assignment and touches must be checked against in-progress work.
73
+ - **Graph surface:** skip — there is no `LANES.md` on a graph surface.
74
+
75
+ 3. **Gather context from the user.** If the user's description is
76
+ ambiguous or missing critical information (what's broken, what success
77
+ looks like, what's excluded), ask via AskUserQuestion — one focused
78
+ question at a time.
79
+
80
+ ## Task structure
81
+
82
+ Every task contains these sections. Each section has a purpose — if the
83
+ purpose can't be fulfilled, the section should say why (e.g., "No
84
+ existing logs cover this path — observability must be added as part of
85
+ the implementation").
86
+
87
+ ### Title and metadata
88
+
89
+ ```markdown
90
+ # Task <N> — <Descriptive title>
91
+
92
+ **Lane:** <lane from the tracker, or proposed new lane>
93
+ **Status:** Open
94
+ **Touches:** <precise file paths or graph node types this task will modify>
95
+ ```
96
+
97
+ Optional metadata when relevant: `**Depends on:**`, `**Blocks:**`,
98
+ `**Sequencing:**`, `**Priority:**`
99
+
100
+ ### Problem
101
+
102
+ What is wrong, missing, or suboptimal — grounded in evidence. Include log
103
+ extracts, reproduction steps, or code references when available. The
104
+ problem section answers "why does this task exist?" not "what will we
105
+ build?"
106
+
107
+ ### What success looks like
108
+
109
+ Observable outcomes that define completion. Each criterion is
110
+ verifiable — someone reading this section can confirm whether the task is
111
+ done without knowing the implementation details.
112
+
113
+ ### Scope boundaries
114
+
115
+ Two subsections, always paired:
116
+
117
+ - **In scope** — the specific changes, files, and behaviours this task
118
+ covers. Precise file paths and line ranges when known. **100% coverage
119
+ rule:** if the task delivers a capability that should apply uniformly
120
+ across a known set of surfaces (every brand JSON, every plugin
121
+ manifest, every specialist template, every IDENTITY.md, every CRM
122
+ connector, etc.), the in-scope list must enumerate **every member of
123
+ that set** — not a representative subset. A task that ships the
124
+ capability to 1-of-N surfaces and defers the rest is incomplete by
125
+ construction; the deferred N-1 surfaces become silent regressions
126
+ because the capability is "shipped" in the changelog while most users
127
+ never see it. If the set is genuinely large enough that staged rollout
128
+ is required, the task is split into N sibling tasks, each covering
129
+ one surface end-to-end — never one task covering one surface with the
130
+ others listed as "out of scope" or "future work".
131
+ - **Out of scope** — adjacent work that is explicitly excluded. This
132
+ prevents scope creep and makes the boundary between this task and
133
+ future tasks unambiguous. **Out of scope cannot be used to defer
134
+ members of a coverage set** (see 100% coverage rule above) — only
135
+ genuinely adjacent work (different capability, different layer,
136
+ different concern).
137
+
138
+ ### Verification
139
+
140
+ How the implementation will be proven correct. This section is mandatory
141
+ — a task without a verification strategy is incomplete.
142
+
143
+ The verification section addresses:
144
+
145
+ - **What is tested** — which behaviours, edge cases, and failure modes
146
+ have automated or manual verification. Not "write tests" but
147
+ specifically what the tests prove.
148
+ - **How to reproduce** — for bug fixes, the exact reproduction steps
149
+ that should fail before the fix and pass after. For features, the
150
+ user-visible scenario that demonstrates the new capability.
151
+ - **Regression boundary** — what existing behaviour must remain
152
+ unchanged and how that's confirmed (e.g., "existing tests pass",
153
+ "manual smoke test of X").
154
+
155
+ If the project has no test infrastructure for the affected area, the
156
+ verification section must acknowledge this and define what manual
157
+ verification is required.
158
+
159
+ ### Observability
160
+
161
+ How the change will be monitored once deployed. This section is
162
+ mandatory — code that cannot be observed in production is incomplete
163
+ code.
164
+
165
+ The observability section addresses:
166
+
167
+ - **What to log** — the specific events, state transitions, or error
168
+ conditions that must produce log output. Each log point should carry
169
+ enough structured context to diagnose failures without reproducing
170
+ them locally.
171
+ - **What signals confirm correct behaviour** — the log patterns,
172
+ metrics, or observable states that indicate the feature is working
173
+ as intended in deployment. An operator reading the logs should be
174
+ able to answer "is this working?" without reading the source code.
175
+ - **What signals indicate failure** — the absence patterns, error
176
+ signatures, or anomalous states that indicate something is wrong.
177
+ The absence of an expected log entry is as important a signal as the
178
+ presence of an error.
179
+ - **Diagnostic path** — given a failure signal, what targeted grep or
180
+ log query surfaces the cause. On a deployed install, this means
181
+ log-accessible forensics with specific tag/field patterns to search
182
+ for.
183
+
184
+ If existing observability already covers the change adequately, the
185
+ section should state what to look for in existing logs rather than
186
+ adding new instrumentation.
187
+
188
+ ### Touches
189
+
190
+ Precise file paths (local-`.tasks/` surface) or graph node/edge types
191
+ (graph surface) the task will modify. Used for lane contention checks
192
+ on the local-`.tasks/` surface.
193
+
194
+ **Documentation triple-target (local-`.tasks/` surface with a
195
+ `task-commit-gate` only).** When the task modifies source files under
196
+ `platform/` and the repo enforces a `task-commit-gate` hook that
197
+ mechanically requires all three documentation targets to be updated
198
+ before any commit is allowed, include the applicable targets in the
199
+ Touches list so the author scopes documentation work upfront:
200
+
201
+ - `.docs/` — developer and architecture reference
202
+ - `platform/plugins/docs/references/` — user guide shipped to device,
203
+ loaded by admin agent
204
+ - `.tasks/LANES.md` — task tracker reflecting what changed
205
+
206
+ A graph task surface has no `LANES.md`, and the commit-gate hook
207
+ governs only on-disk `platform/` commits — on a graph-only install
208
+ this paragraph does not apply.
209
+
210
+ ### Dependencies (when relevant)
211
+
212
+ What must exist or be true before this task can start. If nothing, omit
213
+ the section entirely rather than writing "None."
214
+
215
+ ## Principles
216
+
217
+ - **Evidence before prescription.** The problem section contains
218
+ observed facts. The success criteria describe verifiable outcomes.
219
+ Neither section prescribes implementation steps.
220
+
221
+ - **Scope is defined by exclusion.** What's out of scope is as important
222
+ as what's in scope. Adjacent improvements, refactors, and "while
223
+ we're here" changes are explicitly out of scope unless the user says
224
+ otherwise.
225
+
226
+ - **Coverage is defined by enumeration.** When a task delivers a
227
+ capability to a known set of surfaces, the in-scope list enumerates
228
+ every member of that set. Shipping to 1-of-N and deferring the rest
229
+ is incomplete by construction — the deferred members become silent
230
+ regressions. See § Scope boundaries / 100% coverage rule.
231
+
232
+ - **Testing is not optional.** Every task defines how its implementation
233
+ will be verified. "It works when I try it" is not verification —
234
+ it's anecdote.
235
+
236
+ - **Observability is not optional.** Every task defines how its
237
+ implementation will be monitored in deployment. If you can't tell
238
+ whether it's working from the logs, the task isn't done. If current
239
+ observability is insufficient to monitor the change, adding
240
+ observability is in-scope for the task.
241
+
242
+ - **Precision over brevity.** File paths are exact. Line ranges are
243
+ included when known. Error messages are quoted, not paraphrased.
244
+ Vague tasks produce vague implementations.
245
+
246
+ ## Precision pass (mandatory final step before commit)
247
+
248
+ After drafting the task and before staging it, compress it to ~25% of
249
+ its initial length (75% reduction) without losing informative value.
250
+ This step is non-optional — tasks are read by every sprint, indexed by
251
+ every learning extraction, and paid for in every context window that
252
+ loads them. Bloat compounds.
253
+
254
+ - **Strip:** planning narrative, restated repository context already in
255
+ linked docs, ceremonial framing, prose that paraphrases section
256
+ headings, redundant motivation, and verbose phrasing. Replace
257
+ multi-sentence explanations with single declarative lines.
258
+ - **Preserve:** every file path, line range, log extract quotation,
259
+ scope boundary item (in and out), verification criterion,
260
+ observability hook, error signature, dependency, and link. Precision
261
+ data is incompressible.
262
+ - **Verify:** re-read the compressed task once. Every detail an
263
+ implementer would need to execute the task without further
264
+ conversation must still be present. If a fact was lost, restore it;
265
+ if it wasn't needed, the original was bloated.
266
+
267
+ The same "additions require deletions" doctrine that governs
268
+ `CLAUDE.md` applies here.
269
+
270
+ ## After generating
271
+
272
+ 1. Confirm the task was written through the resolved surface and that
273
+ the precision pass has been applied.
274
+ 2. **Local `.tasks/` surface only:** stage and commit the task file with
275
+ message `task: add Task <N> — <title>` and the co-author trailer. If
276
+ `LANES.md` was updated (new lane or touches entry), include it in
277
+ the same commit. Report any lane contention found in `LANES.md`
278
+ (files touched by both this task and an in-progress task).
279
+ 3. **Graph surface:** the `work-create` write is the commit-equivalent;
280
+ no git step. If a project surface is implied by the work, set it on
281
+ the node at write time.
282
+ 4. Do not implement. The task entry is the deliverable. Implementation
283
+ is a separate step that goes through the sprint workflow.
@@ -43,7 +43,8 @@ either is a regression.
43
43
  | Mount | Purpose | Key methods |
44
44
  |---|---|---|
45
45
  | `/session` | Admin cookie session: PIN-gated mint, validate, rotate. | `GET /`, `POST /` |
46
- | `/sessions` | Legacy conversation list and lifecycle (kept for the ConversationsModal styling class and the post-action reconcile). | `GET /`, `POST /new`, `POST /switch`, `DELETE /:id`, `POST /:id/resume` |
46
+ | `/sessions` | Legacy admin-server conversation routes. No UI consumer remains after the ConversationsModal was retired; the surviving handlers are deletion candidates and not described here. | (legacy, no live caller) |
47
+ | `/sidebar-sessions` | Sole data path for the sidebar Sessions list (Task 538). One JSONL on disk equals one row; deleting the JSONL is the only way a row disappears. Each row carries `sessionId`, `title` (first user turn, falling back to a short UUID prefix), `startedAt` (file mtime ISO string), `live: boolean` (PID-file cross-reference), `isSubagent: boolean` (path matches `*/subagents/*`), and an optional `rcUrl` extracted from the JSONL body when a `claude.ai/code/session_<slug>` banner is present. The five-rule contract — JSONL on disk equals a row, subagents tagged and hidden by default, PID match paints the dot, in-body RC URL paints the external-link icon, anything else dead — lives in [`.tasks/archive/538-sessions-list-equals-jsonl-on-disk.md`](../../../.tasks/archive/538-sessions-list-equals-jsonl-on-disk.md). | `GET /` |
47
48
  | `/claude-sessions` | **Spawn surface only** (Task 500). The single `POST /` is shared by three callers: the public/visitor bridge, `linkedin-ingest`, and the turn-completed-graph-write Stop-hook recorder. The former UI-facing handlers (SSE row feed, list, resume, stop, rename, archive, delete, `/:id/meta`, `/:id/input`, `/:id/log`) were removed — the maxy dashboard no longer manages or displays sessions. | `POST /` |
48
49
 
49
50
  Task 500 — **admin session management moved entirely to claude's own interfaces** (claude.ai/code, claude desktop). A manager-owned per-account `claude rc --spawn same-dir` daemon registers the device as a Remote Control target there; the composer creates / resumes / stops / renames / archives / deletes sessions, with model + permission-mode applied at inception. The model lever is `account.json.adminModel` → `CLAUDE_CONFIG_DIR/settings.json "model"`, written by the daemon supervisor at boot. The maxy admin UI keeps a single "New session" link (`https://claude.ai/code`, opens in a new tab) and no session list, viewer, controls, or model/mode picker. The daemon supervisor lives at [`platform/services/claude-session-manager/src/rc-daemon.ts`](../../../services/claude-session-manager/src/rc-daemon.ts). The `/session-defaults` route and `SpawnPreference` node were deleted with the picker. `/new-session-failure`, `/new-session-submit`, and `/claude-capabilities` are now orphaned (consumed only by the deleted NewSessionModal) — see [`.tasks/501`](../../../.tasks/) for their removal.