@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.
- package/package.json +1 -1
- package/payload/platform/config/brand.json +3 -1
- package/payload/platform/plugins/admin/PLUGIN.md +3 -0
- package/payload/platform/plugins/admin/skills/investigate/SKILL.md +286 -0
- package/payload/platform/plugins/admin/skills/superpowers-sprint/SKILL.md +361 -0
- package/payload/platform/plugins/admin/skills/task/SKILL.md +283 -0
- package/payload/platform/plugins/docs/references/admin-ui.md +2 -1
- package/payload/platform/plugins/docs/references/internals.md +0 -2
- package/payload/platform/plugins/docs/references/investigate-and-task-skills.md +9 -0
- package/payload/platform/plugins/docs/references/platform.md +1 -1
- package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
- package/payload/server/public/assets/AdminShell-DPk5UgEJ.js +1 -0
- package/payload/server/public/assets/{Checkbox-DTxJvyG7.js → Checkbox-Bh3kwzxP.js} +1 -1
- package/payload/server/public/assets/{admin-tKgLki8m.js → admin-BWzKAudL.js} +1 -1
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-CrQJbK3h.js → architectureDiagram-Q4EWVU46-Boys2mT1.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BLCbhL8K.js → blockDiagram-DXYQGD6D-CvHqp46r.js} +1 -1
- package/payload/server/public/assets/{brand-lZz3OVIE.css → brand-VQtREmts.css} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-X34EilDe.js → c4Diagram-AHTNJAMY-DiNQ95F6.js} +1 -1
- package/payload/server/public/assets/channel-BgwH_qhE.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-CeRuGBQ2.js → chunk-336JU56O-9nS9-05M.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-CUZOrcMu.js → chunk-426QAEUC-B2__9lRY.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-CdrIHRcy.js → chunk-4TB4RGXK-R5F8rS0Z.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-CenIbTIp.js → chunk-5FUZZQ4R-B8HhJce-.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-DGfzIUel.js → chunk-5PVQY5BW-Bjb08lbL.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-DSft5oIH.js → chunk-EDXVE4YY-he0qCF3s.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-Dn8FFfaI.js → chunk-ENJZ2VHE-BTArFW5l.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-JrwcKV7r.js → chunk-ICPOFSXX-CoyIL4q_.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-C0X2fcAm.js → chunk-OYMX7WX6-DjLEhNFe.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-DPdLe-f5.js → chunk-U2HBQHQK-tac2uvW1.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-Bw8pKkFu.js → chunk-X2U36JSP-DIWD9i88.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-DcAJR-EA.js → chunk-YZCP3GAM-Ac7ogADz.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-DU374ZbR.js → chunk-ZZ45TVLE-QgqDaY9-.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-CwdV1-c8.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CS_jtevB.js +1 -0
- package/payload/server/public/assets/clone-BTishuSs.js +1 -0
- package/payload/server/public/assets/{dagre-DisbqNSB.js → dagre-D6qN4nkK.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-D_n7R7V9.js → dagre-KV5264BT-C6TRKOg0.js} +1 -1
- package/payload/server/public/assets/data-CaZbNF-j.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-CJID_5OR.js → diagram-5BDNPKRD-BVk_J8Pt.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-ByepjvdE.js → diagram-G4DWMVQ6-BdV1IgwS.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-DTkAHPHE.js → diagram-MMDJMWI5-OsvBkN6u.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-CnVRa9NJ.js → diagram-TYMM5635-BQmKPyrb.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-CRAGu7nV.js → erDiagram-SMLLAGMA-ChEx5_3C.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BJusdlRz.js → flowDiagram-DWJPFMVM-B7sf6AG3.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BFMOBBnF.js → ganttDiagram-T4ZO3ILL-DbpSraax.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-CGWEzh7u.js → gitGraphDiagram-UUTBAWPF-BnxDElDh.js} +1 -1
- package/payload/server/public/assets/{graph-D-iQdRDk.js → graph-CBP5yppq.js} +2 -2
- package/payload/server/public/assets/{graph-labels-u2_3Eyfh.js → graph-labels-BsZNScfa.js} +1 -1
- package/payload/server/public/assets/{graphlib-DNUvypOi.js → graphlib-Dux06enE.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-CBDrnRTc.js → infoDiagram-42DDH7IO-BLWb6oKx.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-C7NwSQo_.js → ishikawaDiagram-UXIWVN3A-AFiRuE6G.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DSaP7A3F.js → journeyDiagram-VCZTEJTY-CxHBRGGu.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DmixHCD4.js → kanban-definition-6JOO6SKY-CGugF0N8.js} +1 -1
- package/payload/server/public/assets/{line-CGGoTheL.js → line-COFloj-X.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-BudFADW7.js → mermaid-parser.core-CxXuCDQf.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-BBbdJxXY.js → mermaid.core-BRBNvNup.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CUiD9km1.js → mindmap-definition-QFDTVHPH-DarW5Wwq.js} +1 -1
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-BlAWpMr8.js → pieDiagram-DEJITSTG-CTokFAkN.js} +1 -1
- package/payload/server/public/assets/{public-CjeEF2vf.js → public-Bq-eOUu9.js} +3 -3
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CXmIwc4W.js → quadrantDiagram-34T5L4WZ-BNawkg3I.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-D_7_OeMC.js → requirementDiagram-MS252O5E-CWnO56oR.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-BKm_PqzT.js → sankeyDiagram-XADWPNL6-D9c-EZfV.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-CBSR0Zst.js → sequenceDiagram-FGHM5R23-In5lxCT5.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-CHNpT69M.js → stateDiagram-FHFEXIEX-CYb5js-u.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-z-TVJfRt.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CxZoew5-.js → timeline-definition-GMOUNBTQ-Cje-BY9v.js} +1 -1
- package/payload/server/public/assets/{useSelectionMode-CwxXQzEI.js → useSelectionMode-B_2EQ2CC.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-CKJdFDcG.js → vennDiagram-DHZGUBPP-BqeuoPr1.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-C-XBcm-g.js → wardleyDiagram-NUSXRM2D-DE7xAnoq.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-Crb-ZtaP.js → xychartDiagram-5P7HB3ND-JE4x8YEZ.js} +1 -1
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +6 -6
- package/payload/server/public/index.html +6 -6
- package/payload/server/public/public.html +5 -5
- package/payload/server/server.js +221 -296
- package/payload/server/public/assets/AdminShell-DtABh34v.js +0 -1
- package/payload/server/public/assets/channel-ChZECiuj.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BpMBCYn6.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BU3HoIr1.js +0 -1
- package/payload/server/public/assets/clone-C3j5j6ku.js +0 -1
- package/payload/server/public/assets/data-DwY26t_T.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Kc8XO6yH.js +0 -1
- /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
|
|
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.
|