kimal3 0.6.5 → 0.8.0
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/README.md +10 -4
- package/claude-plugins/.claude-plugin/marketplace.json +2 -1
- package/claude-plugins/README.md +2 -0
- package/claude-plugins/kimal3-logo/.claude-plugin/plugin.json +1 -1
- package/claude-plugins/kimal3-logo/hooks/app-oeffnen.ts +37 -9
- package/claude-plugins/kimal3-logo/hooks/register.tsx +1 -1
- package/claude-plugins/kimal3-plan/.claude-plugin/plugin.json +7 -0
- package/claude-plugins/kimal3-plan/hooks/erinnerung.ts +83 -0
- package/claude-plugins/kimal3-plan/hooks/fehlerzeile.ts +41 -0
- package/claude-plugins/kimal3-plan/hooks/hooks.json +1 -0
- package/claude-plugins/kimal3-plan/hooks/lauf.ts +143 -0
- package/claude-plugins/kimal3-plan/hooks/lebenszeichen.ts +197 -0
- package/claude-plugins/kimal3-plan/hooks/ordner.ts +141 -0
- package/claude-plugins/kimal3-plan/hooks/register.tsx +22 -0
- package/claude-plugins/kimal3-plan/hooks/spec-text.ts +45 -0
- package/claude-plugins/kimal3-plan/types/index.d.ts +10 -0
- package/coach/de/kimal3-coach.md +41 -1
- package/coach/en/kimal3-coach.md +41 -1
- package/dist/argumente.js +12 -0
- package/dist/atomar.js +22 -0
- package/dist/befehle/einrichten.js +4 -4
- package/dist/befehle/login.js +2 -2
- package/dist/befehle/plan-hoch.js +8 -0
- package/dist/befehle/plan-melde.js +105 -0
- package/dist/befehle/plan-senden.js +149 -0
- package/dist/befehle/plan.js +45 -10
- package/dist/befehle/projekt-verbinden.js +141 -0
- package/dist/befehle/skill-install.js +2 -2
- package/dist/befehle-katalog-en.js +6 -6
- package/dist/befehle-katalog.js +8 -7
- package/dist/befehlswoerter.js +9 -0
- package/dist/einstellungen-schreiben.js +1 -1
- package/dist/kimal3.js +22 -0
- package/dist/meldungen-speicher.js +189 -0
- package/dist/{logo-ablegen.js → mods-ablegen.js} +29 -18
- package/dist/plugins-mischen.js +7 -2
- package/dist/projekt-ordner.js +189 -0
- package/dist/texte/einrichten.js +3 -1
- package/dist/texte/meldungen.js +127 -0
- package/dist/texte/plan.js +42 -22
- package/dist/texte/skill.js +12 -12
- package/package.json +1 -1
- package/skill/commands/k3feierabend.md +29 -0
- package/skill/commands/k3plan.md +167 -213
- package/skill/en/commands/k3plan.md +174 -222
- package/skill/en/commands/k3show.md +3 -1
- package/skill/en/commands/k3wrapup.md +28 -0
|
@@ -1,122 +1,104 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Check the specs against the code and
|
|
2
|
+
description: Check the specs against the code and report every deviation to the board in the app
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
<!-- kimal3:erzeugt — this file is maintained by `kimal3 skill install` and
|
|
6
6
|
overwritten on every update. Your own changes will be lost; if you want
|
|
7
7
|
to keep them, copy the file under a different name. -->
|
|
8
|
-
# Checking and
|
|
8
|
+
# Checking and reporting the planning
|
|
9
9
|
|
|
10
10
|
## 1. What for
|
|
11
11
|
|
|
12
|
-
You check the user stories in this project's specs against the code and
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"Works" or "Doesn't work".
|
|
12
|
+
You check the user stories in this project's specs against the code and **report every deviation
|
|
13
|
+
individually** to the app — never the code, and since version 0.7.0 no whole file any more. There,
|
|
14
|
+
on the project page (tab "Planning", the board), the person sees what is open, what is waiting for
|
|
15
|
+
their test and what is done, and gives a verdict with "Works" or "Doesn't work".
|
|
16
16
|
|
|
17
|
-
Work through the sections in order. You need the rules (section 5) and the
|
|
18
|
-
|
|
17
|
+
Work through the sections in order. You need the rules (section 5) and the reports (section 6)
|
|
18
|
+
from section 2 onwards — read them first. What an exit code of `kimal3` means is in
|
|
19
19
|
**`~/.claude/skills/kimal3/SKILL.md`, section "Exit codes"**; this file does not repeat it.
|
|
20
20
|
|
|
21
|
-
🔑 **`/k3plan` checks, sorts and
|
|
21
|
+
🔑 **`/k3plan` checks, sorts and reports — it builds nothing.** Whatever needs fixing is
|
|
22
22
|
attached to the story as a finding afterwards; building happens when the person says so.
|
|
23
23
|
|
|
24
|
-
## 2. Fetch the
|
|
24
|
+
## 2. Fetch the state
|
|
25
25
|
|
|
26
|
-
Work in the **project folder** (
|
|
27
|
-
|
|
26
|
+
Work in the **project folder** (a folder directly inside `workbench-…/projects/`). The state is in
|
|
27
|
+
the app, not in a file:
|
|
28
28
|
|
|
29
29
|
```
|
|
30
30
|
kimal3 plan
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
**If you get `
|
|
34
|
-
the
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
2. Create `plan/stand.json` with the name **exactly as the list writes it**:
|
|
41
|
-
|
|
42
|
-
```json
|
|
43
|
-
{
|
|
44
|
-
"format": 1,
|
|
45
|
-
"projekt": "LinkedIn Content App",
|
|
46
|
-
"projekt_id": null,
|
|
47
|
-
"basis": null,
|
|
48
|
-
"geprueft_am": "2026-10-21T22:10:00+02:00",
|
|
49
|
-
"specs": [],
|
|
50
|
-
"themen": [],
|
|
51
|
-
"uebernommen": []
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
(Name and time are an example.) The field names are German and stay German. `kimal3 plan
|
|
56
|
-
upload` enters `projekt_id` and `basis` itself after the first upload — **leave them at
|
|
57
|
-
`null`**.
|
|
58
|
-
3. Run `kimal3 plan` again.
|
|
33
|
+
**If you get `This folder isn't connected to a project in the app yet.`**, create the project:
|
|
34
|
+
`kimal3 project connect` (the coach, section 3.6, says what to do there), then `kimal3 plan`
|
|
35
|
+
again. If you get `This isn't a project folder …`, you are in the wrong folder — check that first
|
|
36
|
+
and report nothing.
|
|
37
|
+
|
|
38
|
+
**If the folder has a `plan/stand.json`**, tell the person **once**: "The file plan/stand.json is
|
|
39
|
+
not needed any more — the state is in the app. You can delete it." You do not delete it yourself.
|
|
59
40
|
|
|
60
41
|
**What the output means** (example, made-up values):
|
|
61
42
|
|
|
62
43
|
```
|
|
44
|
+
Spec 2026-09-23-content-planner · Content planner as a page (plan/2026-09-23-content-planner-page-spec.md)
|
|
45
|
+
US-1 · built · round 1 · Create posts
|
|
46
|
+
US-2 · in progress · round 1 · Move posts in the calendar
|
|
47
|
+
Noted topic T-3: Export as PDF
|
|
63
48
|
#12 · doesn't work · 2026-09-23-content-planner / US-2 (round 1): When dragging, it jumps to Tuesday
|
|
64
49
|
#13 · Topic: The calendar should show public holidays
|
|
65
50
|
Confirmed: 2026-09-23-content-planner / US-1 (round 1)
|
|
66
51
|
View: https://app.kimal3.de/projekt/…
|
|
67
52
|
```
|
|
68
53
|
|
|
54
|
+
- `Spec <key> · <title> (<file>)` and below it one line per story, `<key> · <state> · round n ·
|
|
55
|
+
<title>` — the state the app knows. **The keys from here are binding** (section 3).
|
|
56
|
+
- `Noted topic <key>: …` — a topic that **Claude** noted earlier. → Rule 3.
|
|
69
57
|
- `#12 · doesn't work · <spec> / <story> (round n): <sentence>` — the person tested the story and
|
|
70
58
|
it doesn't hold. → Rule 1 in section 5. You need the number later for `uebernommen`.
|
|
71
59
|
- `#13 · Topic: <sentence>` — something new they noted in the app. → Rule 3.
|
|
72
60
|
- `Confirmed: …` — for these stories they said "Works" in **this** round; they are done. You
|
|
73
61
|
never need to hand on a "Works".
|
|
74
62
|
- `View: …` — the link to the planning. Keep it for the report.
|
|
63
|
+
- `No planning in the app yet.` — this is the first time; carry on with section 3, every spec is new.
|
|
75
64
|
- `No open responses.` — nothing to hand on; carry on with section 3.
|
|
76
65
|
|
|
77
|
-
**Refusals
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
fit, ask.
|
|
81
|
-
- `Several of your projects are called "…" (ids: …).` — ask the person which one is meant and
|
|
82
|
-
enter its id as `"projekt_id"`.
|
|
83
|
-
- `The project number in plan/stand.json belongs to none of your projects.` — the number comes from
|
|
84
|
-
a copied folder or a deleted project. Set `"projekt_id"` to `null` (the line stays, the field is
|
|
85
|
-
required); then kimal3 searches by name. This is the **only** case in which you change
|
|
86
|
-
`projekt_id` yourself.
|
|
87
|
-
- `The plan can't be read: plan/stand.json doesn't contain a valid JSON object.` — repair the
|
|
88
|
-
brackets or commas in the file.
|
|
66
|
+
**Refusals** are a whole sentence on the error output (exit code `1`): read it, tell the person
|
|
67
|
+
what it says, and don't repeat blindly. If `kimal3 plan` returns `3` (app not reachable), try once
|
|
68
|
+
more later.
|
|
89
69
|
|
|
90
70
|
## 3. Find the specs
|
|
91
71
|
|
|
92
72
|
In the project folder, look in **`docs/superpowers/specs/`**, **`plan/`** and **`docs/specs/`**
|
|
93
73
|
for Markdown files with user stories ("As … I want … so that …", often `US-1`, `US-2`, with
|
|
94
|
-
acceptance criteria and a counter-check). `plan/stand.json`
|
|
95
|
-
are not specs.
|
|
74
|
+
acceptance criteria and a counter-check). `plan/stand.json`, `plan/projekt.json`, status notes
|
|
75
|
+
and task lists are not specs.
|
|
96
76
|
|
|
97
|
-
One
|
|
98
|
-
|
|
77
|
+
One `spec` report per spec with its stories, one entry in `kriterien` per acceptance criterion
|
|
78
|
+
(in short, at most 500 characters: starting point → action → result).
|
|
99
79
|
|
|
100
80
|
🔴 **The keys are binding.** The app ties every "Works" and "Doesn't work" to spec key + story
|
|
101
|
-
key + round. If a spec or story is already in `plan
|
|
102
|
-
renamed key makes the person's verdict disappear. New: spec key = file name
|
|
103
|
-
key = the number from the spec (`US-3`); if the spec doesn't number them,
|
|
104
|
-
yourself in their order.
|
|
81
|
+
key + round. If a spec or story is already in the output of `kimal3 plan`, **keep its key
|
|
82
|
+
unchanged** — a renamed key makes the person's verdict disappear. New: spec key = file name
|
|
83
|
+
without `.md`; story key = the number from the spec (`US-3`); if the spec doesn't number them,
|
|
84
|
+
count `US-1`, `US-2` … yourself in their order.
|
|
105
85
|
|
|
106
86
|
- `titel`: the heading of the spec or the story. `datei`: the path of the spec in the project
|
|
107
|
-
folder (relative, ends in `.md`; otherwise `null`). `kimal3
|
|
108
|
-
|
|
87
|
+
folder (relative, ends in `.md`; otherwise `null`). The mod `kimal3-plan` uploads the **text** of
|
|
88
|
+
the spec when the file is written, and `kimal3 plan report` brings it along if the file was
|
|
89
|
+
written before the report — it does not read paths outside the project folder.
|
|
109
90
|
- The story key is **the same as in the heading of the spec**, where the spec numbers its stories
|
|
110
91
|
(`### US-3 · …` → `US-3`): the app finds the story in the spec text through this key.
|
|
111
92
|
- A spec without stories goes in with `"stories": []`; mention it in the report.
|
|
112
93
|
- Limits: at most 50 specs, 60 stories per spec, 400 altogether. If there are more, ask the
|
|
113
94
|
person which specs belong in.
|
|
95
|
+
- A story you can no longer find in the spec you **do not remove** — a report cannot delete a
|
|
96
|
+
story. Report it as `weggelassen` with a reason if the spec decided so.
|
|
114
97
|
|
|
115
98
|
**The state of each story (`stand`):**
|
|
116
99
|
- `offen` — nothing built yet.
|
|
117
|
-
- `in_arbeit` — partly built, or a finding is open.
|
|
118
|
-
- `gebaut` — built.
|
|
119
|
-
plus a `testen` sentence (section 4).
|
|
100
|
+
- `in_arbeit` — partly built, or a finding is open.
|
|
101
|
+
- `gebaut` — built. The app sets the date; plus a `testen` text (section 4).
|
|
120
102
|
- `weggelassen` — deliberately not built, `grund` is required (rule 8). Only if the spec or the
|
|
121
103
|
person decided so — never on your own to tidy up. If in doubt: leave it `offen` and ask in the
|
|
122
104
|
report.
|
|
@@ -128,29 +110,35 @@ Run the counter-check of each criterion **wherever you can**: the project's guar
|
|
|
128
110
|
|
|
129
111
|
- `bestanden` (passed) — **only** if the counter-check ran in this session and showed the
|
|
130
112
|
expected result. Never from memory, never from last time, never because the code "looks right".
|
|
131
|
-
- `gescheitert` (failed) — it ran and showed something else. That is a finding (rule 1)
|
|
132
|
-
then
|
|
113
|
+
- `gescheitert` (failed) — it ran and showed something else. That is a finding (rule 1): the story
|
|
114
|
+
then carries ⚠ and sits under "In progress" while a session is working on it, otherwise under
|
|
115
|
+
"Open" — its spec does not move to "Your test".
|
|
133
116
|
- `offen` (not run) — everything that did not run: needs a browser, a sign-in, real data or a
|
|
134
117
|
person. Reading only counts if the criterion says something about the file itself (a file
|
|
135
118
|
exists, a text is there as written) — reading does not prove a behaviour.
|
|
136
119
|
|
|
137
|
-
⚠️ A story with an `offen` criterion is shown under "Claude test pending"
|
|
138
|
-
|
|
120
|
+
⚠️ A story with an `offen` criterion is shown under "Claude test pending" — and its whole spec with it.
|
|
121
|
+
The person tests a spec as a whole: they only get buttons once no story of the spec is still being
|
|
122
|
+
built or checked (the spec is then under "Your test"). Until then the app calls the stories that
|
|
123
|
+
already passed "Checked by Claude". Say in the report what is missing so the counter-check can
|
|
124
|
+
run.
|
|
125
|
+
|
|
126
|
+
**The `testen` text** (on every `gebaut` story, at most 1000 characters) is a guide for someone without technical knowledge. If the story sits in a spec with the box "How you test it", you take it from there, word for word; if the box is missing, you write it yourself. **One line per step** — where to find it, what to do, what must appear —, **without** the box heading, and **last** the line "Doesn't work if: …". In the JSON you separate the lines with `\n`: a real line break inside the text breaks the JSON, and `kimal3 plan report` cannot read the report. If the text is longer than 1000 characters, shorten the steps — never cut off in the middle of a sentence; the line "Doesn't work if: …" must stay at the end. A command only if there is no other way - then say where to type it (in Claude Code in the project folder, with `!` in front) and put it in backticks. If the text is missing, the app shows: "Claude didn't write down how to test this".
|
|
127
|
+
|
|
128
|
+
**Checking is work.** Before you check a story with pending counter-checks (column "Claude test pending") against the code, you report it as `in_arbeit` **with** the session (so without `--no-session`): while you check, the dot at the project glows. After the check you report the result (`gebaut`, or `in_arbeit` with a finding). Stories under "Your test" or "Done" you do **not** report again during the reconciliation, even if you look through them: `in_arbeit` followed by `gebaut` sets their build date to today, and every report shows the label "changed" and, with two sessions, the ⚠ "changed at the same time". What stays unfinished at the end of `/k3plan`, you report with `--no-session` (section 6).
|
|
139
129
|
|
|
140
|
-
**
|
|
141
|
-
or the command** and **what must be visible there**, for example: "Start `npm run dev`, open
|
|
142
|
-
http://localhost:3000/calendar and drag the post from Monday to Wednesday — it is then on
|
|
143
|
-
Wednesday." Without it the app shows: "Claude didn't write down how to test this".
|
|
130
|
+
**How a spec is built.** If you find a spec while checking that is not built like this, say so in the report — you do not rewrite it. A story in it sits in four boxes: **User story** (the title names the person's goal) · **Acceptance criterion** (with counter-check) · **How you test it** (numbered steps, below them "Doesn't work if: …") · **Technical note**.
|
|
144
131
|
|
|
145
132
|
**Findings** (`befunde`): only **open** ones. `quelle: "claude"` for something the story promises
|
|
146
|
-
and doesn't do, and that no criterion covers. `seit`: the date the finding came up
|
|
147
|
-
|
|
133
|
+
and doesn't do, and that no criterion covers. `seit`: the date the finding came up. A `befunde`
|
|
134
|
+
field in a report **replaces** the story's list — so send all findings that are still open, not
|
|
135
|
+
just the new one. If the field is missing, the list stays as it is.
|
|
148
136
|
|
|
149
137
|
**The round** (`runde`) ties a verdict to a build — like a stamp on one version of a document:
|
|
150
|
-
- It starts at `1` and **never** goes down.
|
|
138
|
+
- It starts at `1` and **never** goes down; if a report has no `runde`, it stays.
|
|
151
139
|
- **Raise it by exactly 1** when a story with a finding from the person (`quelle: "mensch"`) has
|
|
152
140
|
been fixed since (Git history, and the counter-checks pass now): then `befunde: []`,
|
|
153
|
-
`stand: "gebaut"`,
|
|
141
|
+
`stand: "gebaut"`, `runde` + 1, a new `testen` text. The person tests again. If it is
|
|
154
142
|
unclear whether it was fixed: leave the finding and ask in the report.
|
|
155
143
|
- **Also raise it** if you changed a **confirmed** story in a way the person would notice — their
|
|
156
144
|
old "Works" no longer applies (rule 7).
|
|
@@ -160,195 +148,159 @@ already in the file, it keeps its old date.
|
|
|
160
148
|
|
|
161
149
|
The app shows them to the person in exactly this wording ("How planning stays short"):
|
|
162
150
|
|
|
163
|
-
1. **A
|
|
151
|
+
1. **A problem does not become a new card.** If a story doesn't hold what it promises — Claude's check fails or you say "Doesn't work" — the problem (finding) is attached to that story. It stays in "Open" until someone works on it.
|
|
164
152
|
2. **Only what nobody promised is new. It goes into the inbox, which has five places.**
|
|
165
|
-
3. **Claude sorts every topic at the next `/k3plan
|
|
153
|
+
3. **Claude sorts every topic at the next check (`/k3plan`):** as a new story in a spec, as a finding on a story, or dropped with a reason. There is no "later".
|
|
166
154
|
4. **Nothing stays in the inbox longer than 14 days.**
|
|
167
|
-
5. **At most one spec in progress at once** ("In progress" and "Claude test pending" together). Finish it before starting the next.
|
|
155
|
+
5. **At most one spec in progress at once** ("In progress" and "Claude test pending" together). "In progress" means: a Claude session is working on it right now. Finish it before starting the next.
|
|
168
156
|
6. **At most five stories wait for your test.** If there are more, Claude starts nothing new until you have tested.
|
|
169
|
-
7. **Done means checked twice:** Claude
|
|
157
|
+
7. **Done means checked twice:** Claude tried everything itself, and you said "Works" — for exactly this version.
|
|
170
158
|
8. **A spec is only closed when every story is done or deliberately left out** — with a reason. There is no silent remainder.
|
|
171
159
|
|
|
172
|
-
**What you do with them
|
|
160
|
+
**What you do with them** (every time a report, section 6):
|
|
173
161
|
|
|
174
|
-
- **Rule 1 — every `doesn't work` from `kimal3 plan`:** if the story still exists,
|
|
175
|
-
person's sentence
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
`antwort` says why. ⚠️ Without a finding from
|
|
180
|
-
refuses the
|
|
162
|
+
- **Rule 1 — every `doesn't work` from `kimal3 plan`:** if the story still exists, report it with
|
|
163
|
+
the person's sentence as a finding (`quelle: "mensch"`, `seit: "<today>"`) and
|
|
164
|
+
`stand: "in_arbeit"`, and right behind it in the same list `uebernommen` with the number:
|
|
165
|
+
`{ "art": "uebernommen", "rueckmeldung": 12, "antwort": "Finding on US-2" }`. If it has already
|
|
166
|
+
been fixed since, raise `runde` by 1 instead, with `befunde: []` and `stand: "gebaut"`
|
|
167
|
+
(section 4). If the story no longer exists, the `antwort` says why. ⚠️ Without a finding from
|
|
168
|
+
`mensch` and without a higher round, the app refuses the handover.
|
|
181
169
|
- **Rule 2 — something new:** what you notice while checking, or what the person says in the
|
|
182
|
-
conversation, and what **no** spec promises
|
|
183
|
-
`
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
- **Rule 3 — sort:** every `Topic` from `kimal3 plan` **and** every topic
|
|
187
|
-
|
|
170
|
+
conversation, and what **no** spec promises, you report as a `thema`. Take the next free number
|
|
171
|
+
(`T-4` after `T-3`) — and remember that a sorted topic keeps its key for 14 days: if the app
|
|
172
|
+
says a key appears twice, take the next number. The five places are shared by your topics and
|
|
173
|
+
the open notes from the app.
|
|
174
|
+
- **Rule 3 — sort:** every `Topic` from `kimal3 plan` **and** every `Noted topic` is sorted
|
|
175
|
+
**now** — one of three:
|
|
188
176
|
- **new story:** write it into the spec it belongs to (user story, acceptance criterion with
|
|
189
|
-
counter-check) and
|
|
190
|
-
|
|
177
|
+
counter-check), and report the spec with the new story (`stand` stays `offen`; the new one is
|
|
178
|
+
enough, the old ones stay). If no spec fits, ask where it goes. Answer:
|
|
179
|
+
`new story US-7 in "Content planner"`.
|
|
191
180
|
- **finding on a story:** as in rule 1. Answer: `finding on US-2 in "Content planner"`.
|
|
192
181
|
- **dropped:** answer `dropped: <reason in one sentence>`, for example
|
|
193
182
|
`dropped: public holidays are already in the calendar tool.`
|
|
194
183
|
|
|
195
|
-
For a note from the app, the answer goes into `uebernommen` as **one
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
report too.
|
|
202
|
-
- **Rule 4:** because you sort everything at every `/k3plan`, nothing stays long. A topic with
|
|
203
|
-
`seit` more than 14 days ago is sorted now **in any case**.
|
|
184
|
+
For a note from the app (`#13 · Topic`), the answer goes into an `uebernommen` report as **one
|
|
185
|
+
sentence**, **without** an arrow at the start. A `Noted topic` of yours you sort with an `eingeordnet`
|
|
186
|
+
report (key, text as above, answer) — the app takes it out of the topics.
|
|
187
|
+
The page doesn't show the answer; so name how it was sorted in the report.
|
|
188
|
+
- **Rule 4:** because you sort everything at every `/k3plan`, nothing stays long. A topic that has
|
|
189
|
+
been waiting more than 14 days is sorted now **in any case**.
|
|
204
190
|
- **Rules 5 and 6 — don't start a new spec** while another spec is in progress (one of its
|
|
205
191
|
stories is `in_arbeit`, has a finding or a failed counter-check, or is `gebaut` with an `offen`
|
|
206
192
|
criterion or with no criteria at all), or while more than five stories are waiting for the person's test (`gebaut`, all
|
|
207
|
-
passed, no finding, not yet confirmed
|
|
208
|
-
|
|
193
|
+
passed, no finding, not yet confirmed — **and** no story of their spec keeps the spec in progress: only then
|
|
194
|
+
is it under "Your test", and only then does the app count the story). **Tell the person what to test instead** — with the
|
|
195
|
+
`testen` texts. If you sort a topic in as a new story in a spec, you do not start that spec
|
|
209
196
|
with it: it stays `offen`, and the spec does not count as in progress.
|
|
210
|
-
- **Rule 7:** only the person sets "Done", with "Works" in the app;
|
|
197
|
+
- **Rule 7:** only the person sets "Done", with "Works" in the app; a report has no field for it.
|
|
211
198
|
You only keep the round stable (section 4).
|
|
212
199
|
- **Rule 8:** `weggelassen` only with a `grund` (section 3).
|
|
213
200
|
|
|
214
|
-
## 6. The
|
|
201
|
+
## 6. The reports
|
|
215
202
|
|
|
216
|
-
|
|
203
|
+
A report is a JSON object, several are a list. It goes through the input to `kimal3 plan report`;
|
|
204
|
+
the program sets the time itself, and the project comes from the folder note
|
|
205
|
+
`plan/projekt.json`. Checking is work — reported with the session, the dot on the board glows while you check.
|
|
217
206
|
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
"format": 1,
|
|
221
|
-
"projekt": "LinkedIn Content App",
|
|
222
|
-
"projekt_id": null,
|
|
223
|
-
"basis": null,
|
|
224
|
-
"geprueft_am": "2026-10-21T22:10:00+02:00",
|
|
225
|
-
"specs": [
|
|
226
|
-
{
|
|
227
|
-
"schluessel": "2026-09-23-content-planner",
|
|
228
|
-
"titel": "Content planner as a page",
|
|
229
|
-
"datei": "plan/2026-09-23-content-planner-page-spec.md",
|
|
230
|
-
"stories": [
|
|
231
|
-
{
|
|
232
|
-
"schluessel": "US-2",
|
|
233
|
-
"titel": "Move posts in the calendar",
|
|
234
|
-
"stand": "gebaut",
|
|
235
|
-
"runde": 1,
|
|
236
|
-
"gebaut_am": "2026-10-21",
|
|
237
|
-
"kriterien": [
|
|
238
|
-
{ "text": "Drag the post from Monday to Wednesday -> it is on Wednesday", "gegenprobe": "bestanden" }
|
|
239
|
-
],
|
|
240
|
-
"befunde": [],
|
|
241
|
-
"testen": "Open /calendar and drag the post from Monday to Wednesday.",
|
|
242
|
-
"grund": null
|
|
243
|
-
}
|
|
244
|
-
]
|
|
245
|
-
}
|
|
246
|
-
],
|
|
247
|
-
"themen": [
|
|
248
|
-
{ "schluessel": "T-1", "text": "The calendar should show public holidays", "quelle": "mensch", "seit": "2026-10-21" }
|
|
249
|
-
],
|
|
250
|
-
"uebernommen": [
|
|
251
|
-
{ "rueckmeldung": 12, "antwort": "Finding on US-2" }
|
|
252
|
-
],
|
|
253
|
-
"eingeordnet": [
|
|
254
|
-
{ "schluessel": "T-2", "text": "Export as PDF", "antwort": "dropped: the print button already does that.", "am": "2026-10-21" }
|
|
255
|
-
]
|
|
256
|
-
}
|
|
207
|
+
```
|
|
208
|
+
echo '[ … ]' | kimal3 plan report
|
|
257
209
|
```
|
|
258
210
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
- `format`: exactly `1`.
|
|
263
|
-
- `projekt`: the name as in the app, 1–200 characters.
|
|
264
|
-
- `projekt_id`, `basis`: `null` at first; after that `kimal3 plan upload` writes them — **never
|
|
265
|
-
change them by hand**. Only exception: the refusal "The project number in plan/stand.json
|
|
266
|
-
belongs to none of your projects." — then set `projekt_id` to `null` (section 2).
|
|
267
|
-
- `geprueft_am`: now, with time zone (`date +%Y-%m-%dT%H:%M:%S%:z` in Bash, `Get-Date -Format
|
|
268
|
-
"yyyy-MM-ddTHH:mm:sszzz"` in PowerShell).
|
|
269
|
-
- `specs[]`: `schluessel` (unique, 1–80 characters), `titel` (1–200), `datei` (path or `null`),
|
|
270
|
-
`stories[]`.
|
|
271
|
-
- `stories[]`: `schluessel` (unique within its spec), `titel`, `stand` (`offen` · `in_arbeit` ·
|
|
272
|
-
`gebaut` · `weggelassen`), `runde` (1–999), `gebaut_am` (`YYYY-MM-DD` for `gebaut`, otherwise
|
|
273
|
-
`null`), `kriterien[]`, `befunde[]`, `testen` (sentence or `null`), `grund` (required for
|
|
274
|
-
`weggelassen`, otherwise `null`).
|
|
275
|
-
- `kriterien[]`: `{ "text", "gegenprobe": "bestanden" | "gescheitert" | "offen" }`, at most 30
|
|
276
|
-
per story.
|
|
277
|
-
- `befunde[]`: `{ "text", "quelle": "claude" | "mensch", "seit": "YYYY-MM-DD" }` — open ones only,
|
|
278
|
-
at most 20.
|
|
279
|
-
- `themen[]`: `{ "schluessel", "text", "quelle", "seit" }`, at most 50 (the inbox has five places,
|
|
280
|
-
rule 2).
|
|
281
|
-
- `uebernommen[]`: `{ "rueckmeldung": <number from kimal3 plan>, "antwort": "<one sentence>" }`.
|
|
282
|
-
`kimal3 plan upload` empties it itself after uploading.
|
|
283
|
-
- `eingeordnet[]`: `{ "schluessel", "text", "antwort": "<one sentence>", "am": "YYYY-MM-DD" }`, at
|
|
284
|
-
most 50 — topics from `themen` that you have sorted (rule 3). A key is never in `themen` and
|
|
285
|
-
`eingeordnet` at the same time.
|
|
286
|
-
- The whole file: at most 300 KB.
|
|
287
|
-
|
|
288
|
-
## 7. Upload
|
|
289
|
-
|
|
290
|
-
First the dry run — it checks everything and saves nothing:
|
|
211
|
+
(In PowerShell: `'[ … ]' | kimal3 plan report`. For long texts, use a file.) The examples are
|
|
212
|
+
made up.
|
|
291
213
|
|
|
214
|
+
**At the very end** you report the stories that stay unfinished (in progress, a finding open) once more —
|
|
215
|
+
in their **own** call with `--no-session`, separate from the list of the finished ones: a mixed list
|
|
216
|
+
without the flag ties the unfinished story to the session too, and the dot keeps glowing. With the flag
|
|
217
|
+
the plan state stays `in_arbeit`, but the dot stops glowing while the window stays open — on the board the
|
|
218
|
+
story then sits under "Open" as started.
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
echo '[ … ]' | kimal3 plan report --no-session
|
|
292
222
|
```
|
|
293
|
-
|
|
223
|
+
|
|
224
|
+
**A spec** — when checking, and when stories are added:
|
|
225
|
+
|
|
226
|
+
```json
|
|
227
|
+
{ "art": "spec", "schluessel": "2026-10-24-test-month", "titel": "Test month",
|
|
228
|
+
"datei": "docs/superpowers/specs/2026-10-24-test-month-design.md",
|
|
229
|
+
"stories": [ { "schluessel": "US-1", "titel": "The test month starts" },
|
|
230
|
+
{ "schluessel": "US-2", "titel": "The test month ends" },
|
|
231
|
+
{ "schluessel": "US-3", "titel": "Export of the test month" } ] }
|
|
294
232
|
```
|
|
295
233
|
|
|
296
|
-
|
|
297
|
-
an example). **Compare the second number** with the open responses from `kimal3 plan`: if it is
|
|
298
|
-
smaller, you forgot one — it would stay in the app under "Waiting for Claude".
|
|
234
|
+
**A story** — one deviation, one entry. Built, with a counter-check:
|
|
299
235
|
|
|
300
|
-
|
|
236
|
+
```json
|
|
237
|
+
{ "art": "story", "spec": "2026-10-24-test-month", "story": "US-1", "stand": "gebaut",
|
|
238
|
+
"kriterien": [ { "text": "If Sabine starts on 1 Nov, the test month ends on 30 Nov.", "gegenprobe": "bestanden" } ],
|
|
239
|
+
"testen": "1. In the app open 'Test month'.\n2. Click Start.\n3. Below it says 'Ends on 30 Nov'.\nDoesn't work if: it shows another date." }
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
With an open finding (here from you; `quelle: "mensch"` only for the person's sentence):
|
|
301
243
|
|
|
244
|
+
```json
|
|
245
|
+
{ "art": "story", "spec": "2026-10-24-test-month", "story": "US-2", "stand": "in_arbeit",
|
|
246
|
+
"befunde": [ { "text": "On 30 Nov the reminder mail the spec promises is missing.", "quelle": "claude", "seit": "2026-10-23" } ] }
|
|
302
247
|
```
|
|
303
|
-
|
|
248
|
+
|
|
249
|
+
Deliberately left out (`grund` is required):
|
|
250
|
+
|
|
251
|
+
```json
|
|
252
|
+
{ "art": "story", "spec": "2026-10-24-test-month", "story": "US-3", "stand": "weggelassen", "grund": "The spec drops the export." }
|
|
304
253
|
```
|
|
305
254
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
255
|
+
**A topic** (rule 2), **sorting a topic of yours** (rule 3), **handing on a response from the
|
|
256
|
+
person** (rules 1 and 3):
|
|
257
|
+
|
|
258
|
+
```json
|
|
259
|
+
{ "art": "thema", "schluessel": "T-4", "text": "The calendar could show public holidays" }
|
|
260
|
+
{ "art": "eingeordnet", "schluessel": "T-3", "text": "Export as PDF", "antwort": "dropped: the print button can already do that." }
|
|
261
|
+
{ "art": "uebernommen", "rueckmeldung": 12, "antwort": "Finding on US-2" }
|
|
262
|
+
```
|
|
310
263
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
264
|
+
**What the program returns:** on success it is silent (`0`) — and **so are you**: don't tell the
|
|
265
|
+
person that you reported. `1` — the app refused or the input was unreadable; the sentence on the
|
|
266
|
+
error output says why. Reports it doesn't name arrived. `3` — the app is not reachable; the report
|
|
267
|
+
is **kept** and goes along with the next command (`kimal3 plan send` sends it right away) — don't
|
|
268
|
+
send it again. `2` — no longer signed in: tell the person `kimal3 login`; the report is kept.
|
|
316
269
|
|
|
317
|
-
**Refusals — read the message, fix it,
|
|
270
|
+
**Refusals — read the message, fix it, send again:**
|
|
318
271
|
|
|
319
|
-
|
|
|
272
|
+
| Message starts with | What you do |
|
|
320
273
|
|---|---|
|
|
321
|
-
| `The
|
|
322
|
-
| `
|
|
323
|
-
|
|
|
324
|
-
|
|
|
325
|
-
| `Response 12
|
|
326
|
-
| `
|
|
327
|
-
| `The
|
|
328
|
-
| `The
|
|
329
|
-
|
|
|
330
|
-
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
- what
|
|
341
|
-
- what is **waiting for their test** — with the `testen` sentence, so they can start right away,
|
|
274
|
+
| `The report on <story> from <time> arrived too late …` | Another session or the person changed the story afterwards. **Do not send again.** `kimal3 plan` shows today's state; report only what is still missing. |
|
|
275
|
+
| `The spec … doesn't exist in this project yet.` · `… has no story …` | Report the spec with its stories first (section 6, "A spec"), then the story. |
|
|
276
|
+
| `Report no. 2 can't be read (meldung).` | The report has a wrong field or lacks one — hold it against the examples above. Nothing was sent. |
|
|
277
|
+
| `<spec> / <story> has round 1, round 2 is already saved.` | Your round is older than the saved one. Send again with the saved one or higher — never lower. |
|
|
278
|
+
| `Response 12 doesn't exist in this project or is listed twice …` | Only numbers from `kimal3 plan`, each once. |
|
|
279
|
+
| `Response 12 ("…") is marked as handled, but US-2 has no finding from you …` | Report the story with the finding `quelle: "mensch"` first (rule 1) — or `runde` + 1 if it has been fixed — then `uebernommen`. |
|
|
280
|
+
| `The plan can't be read: <place> …` | Correct the named place in the report (length, `grund` on `weggelassen`, duplicate key). |
|
|
281
|
+
| `The report arrived, but the text of <file> didn't …` | Send the report again — sending twice does no harm. If the text no longer fits (over 300 KB), tell the person. |
|
|
282
|
+
| `The reports are saved, but not fully recorded yet.` | Send again — sending twice does no harm. |
|
|
283
|
+
| `The planning saved in the app is damaged …` | Tell the person. `kimal3 plan upload --overwrite` replaces the planning with a whole file `plan/stand.json` — **only after their explicit yes.** |
|
|
284
|
+
|
|
285
|
+
🔴 **`--overwrite` replaces what others reported.** Never on your own decision, not even if the
|
|
286
|
+
message suggests it.
|
|
287
|
+
|
|
288
|
+
## 7. Report to the person
|
|
289
|
+
|
|
290
|
+
**At most five lines**, without jargon — and nothing about the reports themselves:
|
|
291
|
+
|
|
292
|
+
- what became **done** (confirmed since last time),
|
|
293
|
+
- what is **waiting for their test** (only stories from specs under "Your test") — with the `testen` text so they can start right away,
|
|
342
294
|
- what was decided in the **inbox** (each topic with its answer),
|
|
343
|
-
- a **warning** if rule 5 or 6 is broken: "Test …
|
|
295
|
+
- a **warning** if rule 5 or 6 is broken: "Test first …" instead of a new story,
|
|
344
296
|
- the **link** from `View: …`.
|
|
345
297
|
|
|
346
298
|
Example (made-up values):
|
|
347
299
|
|
|
348
300
|
```
|
|
349
301
|
Done: US-1 "Create posts".
|
|
350
|
-
Your test: US-2
|
|
351
|
-
Inbox: "The calendar should show public holidays"
|
|
352
|
-
Claude test pending: US-4 needs a browser I don't have here.
|
|
302
|
+
Your test: US-2 — open /calendar and drag the post from Monday to Wednesday.
|
|
303
|
+
Inbox: "The calendar should show public holidays" → new story US-7 in "Content planner".
|
|
304
|
+
Claude test pending: US-4 needs a browser, which I don't have here.
|
|
353
305
|
Planning: https://app.kimal3.de/projekt/…
|
|
354
306
|
```
|
|
@@ -60,7 +60,9 @@ workbench) · “The project folder is nested too deeply for the recorder …”
|
|
|
60
60
|
|
|
61
61
|
If the session is in the workbench, say **that first**, in one sentence: the recording belongs in
|
|
62
62
|
a project, and you'll suggest one in a moment. Then explain in at most five short sentences what
|
|
63
|
-
happens, and ask **one** question:
|
|
63
|
+
happens, and ask **one** question. **Word for word: the first sentence of that explanation is
|
|
64
|
+
exactly this one: “You show me the task once and talk while you do it.”** Don't open with anything
|
|
65
|
+
else and don't reword it (only the workbench sentence above may come before it); the rest follows as written:
|
|
64
66
|
|
|
65
67
|
> “You show me the task once and talk while you do it. I record the screen, sound, clicks and
|
|
66
68
|
> keys. It stays on your computer. Before I read any of it, I'll ask you. Which task do you want
|
|
@@ -18,6 +18,34 @@ and skip it — no filler.
|
|
|
18
18
|
- Is it a Git repo? Then `git status` + `git diff --stat`: what was changed in this
|
|
19
19
|
session? Summarise it in 1–2 sentences.
|
|
20
20
|
- Not a Git repo? Say so briefly and offer to set one up (a safety net) — don't force anything.
|
|
21
|
+
- **Reconcile the board — only in a project folder that has a project in the app** (otherwise skip
|
|
22
|
+
it and say nothing). `kimal3 plan` shows the state the app knows; hold it against what really
|
|
23
|
+
happened today. What is done and whose counter-checks ran in this session is `gebaut` with
|
|
24
|
+
criteria and a `testen` text; what was started and isn't done stays `in_arbeit` — and goes into its **own** call `kimal3 plan report --no-session`, separate from the list of the finished ones (a mixed list without the flag ties the unfinished story to the session too, and the dot keeps glowing although the window is merely open); what came
|
|
25
|
+
up today and no spec promises goes in as a `thema`. Report only what differs from that state: the finished ones in
|
|
26
|
+
one list with `kimal3 plan report` (format and exit codes: the coach, section 3.6, and
|
|
27
|
+
`/k3plan`, section 6; what an exit code means is in `~/.claude/skills/kimal3/SKILL.md`):
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
[ { "art": "story", "spec": "2026-10-24-test-month", "story": "US-1", "stand": "gebaut",
|
|
31
|
+
"kriterien": [ { "text": "If Sabine starts on 1 Nov, it ends on 30 Nov.", "gegenprobe": "bestanden" } ],
|
|
32
|
+
"testen": "1. Open /test-month.\n2. Click Start.\n3. Below it says Ends on 30 Nov.\nDoesn't work if: it shows another date." } ]
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
And what stays unfinished, separately, with the flag:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
[ { "art": "story", "spec": "2026-10-24-test-month", "story": "US-2", "stand": "in_arbeit" } ]
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
echo '[ … ]' | kimal3 plan report --no-session
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
On success you say nothing about it. If you mention the board in the wrap-up (step 6), then only
|
|
46
|
+
what did **not** work (a refusal, or kept because the app was not reachable). The dot at the
|
|
47
|
+
project on the project page stays for work in progress, as long as the window is open; when the person closes it, it
|
|
48
|
+
is gone in under a second.
|
|
21
49
|
|
|
22
50
|
## 2. Update the status file — and tidy it up
|
|
23
51
|
The status file (`NEXT-STEPS.md` or `ROADMAP.md`) is the note for the next start. It is only
|