kimal3 0.6.4 → 0.7.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.
Files changed (51) hide show
  1. package/README.md +10 -4
  2. package/claude-plugins/.claude-plugin/marketplace.json +2 -1
  3. package/claude-plugins/README.md +2 -0
  4. package/claude-plugins/kimal3-logo/.claude-plugin/plugin.json +1 -1
  5. package/claude-plugins/kimal3-logo/hooks/ablage.ts +8 -0
  6. package/claude-plugins/kimal3-logo/hooks/app-oeffnen.ts +37 -9
  7. package/claude-plugins/kimal3-logo/hooks/register.tsx +42 -18
  8. package/claude-plugins/kimal3-logo/hooks/update-rechnung.ts +175 -0
  9. package/claude-plugins/kimal3-logo/hooks/update.ts +244 -0
  10. package/claude-plugins/kimal3-logo/types/index.d.ts +4 -0
  11. package/claude-plugins/kimal3-plan/.claude-plugin/plugin.json +7 -0
  12. package/claude-plugins/kimal3-plan/hooks/erinnerung.ts +79 -0
  13. package/claude-plugins/kimal3-plan/hooks/fehlerzeile.ts +41 -0
  14. package/claude-plugins/kimal3-plan/hooks/hooks.json +1 -0
  15. package/claude-plugins/kimal3-plan/hooks/lauf.ts +143 -0
  16. package/claude-plugins/kimal3-plan/hooks/lebenszeichen.ts +197 -0
  17. package/claude-plugins/kimal3-plan/hooks/ordner.ts +141 -0
  18. package/claude-plugins/kimal3-plan/hooks/register.tsx +22 -0
  19. package/claude-plugins/kimal3-plan/hooks/spec-text.ts +45 -0
  20. package/claude-plugins/kimal3-plan/types/index.d.ts +10 -0
  21. package/coach/de/kimal3-coach.md +33 -0
  22. package/coach/en/kimal3-coach.md +33 -0
  23. package/dist/argumente.js +12 -0
  24. package/dist/atomar.js +22 -0
  25. package/dist/befehle/einrichten.js +4 -4
  26. package/dist/befehle/login.js +2 -2
  27. package/dist/befehle/plan-hoch.js +8 -0
  28. package/dist/befehle/plan-melde.js +105 -0
  29. package/dist/befehle/plan-senden.js +149 -0
  30. package/dist/befehle/plan.js +45 -10
  31. package/dist/befehle/projekt-verbinden.js +141 -0
  32. package/dist/befehle/skill-install.js +2 -2
  33. package/dist/befehle-katalog-en.js +6 -6
  34. package/dist/befehle-katalog.js +8 -7
  35. package/dist/befehlswoerter.js +9 -0
  36. package/dist/einstellungen-schreiben.js +1 -1
  37. package/dist/kimal3.js +22 -0
  38. package/dist/meldungen-speicher.js +189 -0
  39. package/dist/{logo-ablegen.js → mods-ablegen.js} +87 -20
  40. package/dist/plugins-mischen.js +7 -2
  41. package/dist/projekt-ordner.js +189 -0
  42. package/dist/texte/einrichten.js +3 -1
  43. package/dist/texte/meldungen.js +127 -0
  44. package/dist/texte/plan.js +42 -22
  45. package/dist/texte/wache.js +4 -4
  46. package/dist/wache-rechnung.js +3 -1
  47. package/package.json +1 -1
  48. package/skill/commands/k3feierabend.md +20 -0
  49. package/skill/commands/k3plan.md +151 -211
  50. package/skill/en/commands/k3plan.md +157 -219
  51. package/skill/en/commands/k3wrapup.md +19 -0
@@ -1,122 +1,104 @@
1
1
  ---
2
- description: Check the specs against the code and upload the planning to the app
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 uploading the planning
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 upload **only the
13
- result** to the app — never the code. There, on the project page (tab "Planning"), the person
14
- sees what is open, what is waiting for their test and what is done, and gives a verdict with
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 file format
18
- (section 6) from section 2 onwards — read them first. What an exit code of `kimal3` means is in
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 uploads — it builds nothing.** Whatever needs fixing is
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 responses
24
+ ## 2. Fetch the state
25
25
 
26
- Work in the **project folder** (where the specs and the code are). The file is always called
27
- `plan/stand.json`, relative to that folder.
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 `There's no plan/stand.json in this folder.`**, it is the first time (or you are in
34
- the wrong folder — check that first):
35
-
36
- 1. `kimal3 project list` — look for the project this is about. If there is **no** matching one,
37
- ask the person which one is meant and suggest `/k3project <what you built>`
38
- (German: `/k3projekt`): without an entry in the success profile there is no project page.
39
- Stop there, don't invent anything.
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
- - `No project is called "…". Your projects: … Enter the name in plan/stand.json exactly like
79
- that.` — copy the matching name **word for word** from the list into `"projekt"`. If two could
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` itself, status notes and task lists
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 entry in `specs` per spec, one entry in `stories` per user story, one entry in `kriterien`
98
- per acceptance criterion (in short, at most 500 characters: starting point → action → result).
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/stand.json`, **keep its key unchanged** — a
102
- renamed key makes the person's verdict disappear. New: spec key = file name without `.md`; story
103
- key = the number from the spec (`US-3`); if the spec doesn't number them, count `US-1`, `US-2` …
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 plan upload` reads the **text** of the spec from
108
- this file and sends it along — it does not read paths outside the project folder.
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. `gebaut_am` is then `null`.
118
- - `gebaut` — built. `gebaut_am`: the date on which **this round** was finished (`YYYY-MM-DD`);
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` sentence (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.
@@ -134,23 +116,24 @@ Run the counter-check of each criterion **wherever you can**: the project's guar
134
116
  person. Reading only counts if the criterion says something about the file itself (a file
135
117
  exists, a text is there as written) — reading does not prove a behaviour.
136
118
 
137
- ⚠️ A story with an `offen` criterion is shown under "Claude test pending", and the person can't
138
- test it yet. Say in the report what is missing so the counter-check can run.
119
+ ⚠️ A story with an `offen` criterion is shown under "Claude test pending" — and its whole spec with it.
120
+ The person tests a spec as a whole: they only get buttons once no story of the spec is still being
121
+ built or checked (the spec is then under "Your test"). Until then the app calls the stories that
122
+ already passed "Checked by Claude". Say in the report what is missing so the counter-check can
123
+ run.
139
124
 
140
- **The `testen` sentence** (on every `gebaut` story, at most 1000 characters) names **the address
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".
125
+ **The `testen` sentence** (on every `gebaut` story, at most 1000 characters) is a guide for someone without technical knowledge. It says where to find it, what to do, what must appear, how to notice it is wrong. 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. Without a command: "In the app open 'Metrics' and click the post from 14 Oct - it says '4,210 seen'. If a cell is empty, say 'Doesn't work'." With a command: "In Claude Code in the project folder type `! node wortzaehler.js beispiel.txt` - five lines appear, at the top 'der (4)'. If an error message appears, say 'Doesn't work'." If the sentence is missing, the app shows: "Claude didn't write down how to test this".
144
126
 
145
127
  **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 — if it is
147
- already in the file, it keeps its old date.
128
+ and doesn't do, and that no criterion covers. `seit`: the date the finding came up. A `befunde`
129
+ field in a report **replaces** the story's list — so send all findings that are still open, not
130
+ just the new one. If the field is missing, the list stays as it is.
148
131
 
149
132
  **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.
133
+ - It starts at `1` and **never** goes down; if a report has no `runde`, it stays.
151
134
  - **Raise it by exactly 1** when a story with a finding from the person (`quelle: "mensch"`) has
152
135
  been fixed since (Git history, and the counter-checks pass now): then `befunde: []`,
153
- `stand: "gebaut"`, a new `gebaut_am`, a new `testen` sentence. The person tests again. If it is
136
+ `stand: "gebaut"`, `runde` + 1, a new `testen` sentence. The person tests again. If it is
154
137
  unclear whether it was fixed: leave the finding and ask in the report.
155
138
  - **Also raise it** if you changed a **confirmed** story in a way the person would notice — their
156
139
  old "Works" no longer applies (rule 7).
@@ -160,195 +143,150 @@ already in the file, it keeps its old date.
160
143
 
161
144
  The app shows them to the person in exactly this wording ("How planning stays short"):
162
145
 
163
- 1. **A finding is not a new card.** If a story doesn't hold what it promises — Claude's check fails or you say "Doesn't work" — the finding is attached to that story and its spec goes back to "In progress".
146
+ 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 and its spec goes back to "In progress".
164
147
  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`:** as a new story in a spec, as a finding on a story, or dropped with a reason. There is no "later". What happened to it is shown under "Recently sorted".
148
+ 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". What happened to it is shown under "Sorted in by Claude".
166
149
  4. **Nothing stays in the inbox longer than 14 days.**
167
150
  5. **At most one spec in progress at once** ("In progress" and "Claude test pending" together). Finish it before starting the next.
168
151
  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's checks passed, and you said "Works" — for exactly this version.
152
+ 7. **Done means checked twice:** Claude tried everything itself, and you said "Works" — for exactly this version.
170
153
  8. **A spec is only closed when every story is done or deliberately left out** — with a reason. There is no silent remainder.
171
154
 
172
- **What you do with them:**
155
+ **What you do with them** (every time a report, section 6):
173
156
 
174
- - **Rule 1 — every `doesn't work` from `kimal3 plan`:** if the story still exists, attach the
175
- person's sentence to it as a finding (`{ "text": "<their sentence>", "quelle": "mensch",
176
- "seit": "<today>" }`), `stand: "in_arbeit"`, `gebaut_am: null`. If it has already been fixed
177
- since, raise the round by 1 and set `befunde: []` instead (section 4). Plus in `uebernommen`:
178
- `{ "rueckmeldung": 12, "antwort": "Finding on US-2" }`. If the story no longer exists, the
179
- `antwort` says why. ⚠️ Without a finding from `mensch` and without a higher round, the server
180
- refuses the upload.
157
+ - **Rule 1 — every `doesn't work` from `kimal3 plan`:** if the story still exists, report it with
158
+ the person's sentence as a finding (`quelle: "mensch"`, `seit: "<today>"`) and
159
+ `stand: "in_arbeit"`, and right behind it in the same list `uebernommen` with the number:
160
+ `{ "art": "uebernommen", "rueckmeldung": 12, "antwort": "Finding on US-2" }`. If it has already
161
+ been fixed since, raise `runde` by 1 instead, with `befunde: []` and `stand: "gebaut"`
162
+ (section 4). If the story no longer exists, the `antwort` says why. ⚠️ Without a finding from
163
+ `mensch` and without a higher round, the app refuses the handover.
181
164
  - **Rule 2 — something new:** what you notice while checking, or what the person says in the
182
- conversation, and what **no** spec promises goes into `themen`:
183
- `{ "schluessel": "T-1", "text": "…", "quelle": "claude" | "mensch", "seit": "<today>" }`.
184
- Take the next free number, counting `eingeordnet` too (a key stays taken there for 14 days).
185
- The five places are shared by `themen` and the open notes from the app.
186
- - **Rule 3 — sort:** every `Topic` from `kimal3 plan` **and** every topic already in `themen` from
187
- earlier is sorted **now** — one of three:
165
+ conversation, and what **no** spec promises, you report as a `thema`. Take the next free number
166
+ (`T-4` after `T-3`) — and remember that a sorted topic keeps its key for 14 days: if the app
167
+ says a key appears twice, take the next number. The five places are shared by your topics and
168
+ the open notes from the app.
169
+ - **Rule 3 — sort:** every `Topic` from `kimal3 plan` **and** every `Noted topic` is sorted
170
+ **now** — one of three:
188
171
  - **new story:** write it into the spec it belongs to (user story, acceptance criterion with
189
- counter-check) and into `plan/stand.json` with `stand: "offen"`. If no spec fits, ask where it
190
- goes. Answer: `new story US-7 in "Content planner"`.
172
+ counter-check), and report the spec with the new story (`stand` stays `offen`; the new one is
173
+ enough, the old ones stay). If no spec fits, ask where it goes. Answer:
174
+ `new story US-7 in "Content planner"`.
191
175
  - **finding on a story:** as in rule 1. Answer: `finding on US-2 in "Content planner"`.
192
176
  - **dropped:** answer `dropped: <reason in one sentence>`, for example
193
177
  `dropped: public holidays are already in the calendar tool.`
194
178
 
195
- For a note from the app, the answer goes into `uebernommen` as **one sentence** (the app shows
196
- it under "Recently sorted" as `<note> → <answer>`); so write it **without** an arrow at the
197
- start. A topic from the file you take out of `themen` and write it with its answer into
198
- `eingeordnet`: `{ "schluessel": "T-4", "text": "<text as in themen>", "antwort": "<one
199
- sentence>", "am": "<today>" }` — the app shows it under "Recently sorted" for 14 days. Entries
200
- whose `am` is more than 14 days ago you take out at the same time. Name how it was sorted in the
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**.
179
+ For a note from the app (`#13 · Topic`), the answer goes into an `uebernommen` report as **one
180
+ sentence** (the app shows it under "Recently sorted" as `<note> → <answer>`); so write it
181
+ **without** an arrow at the start. A `Noted topic` of yours you sort with an `eingeordnet`
182
+ report (key, text as above, answer) — the app takes it out of the topics and shows it under
183
+ "Recently sorted" for 14 days. Name how it was sorted in the report too.
184
+ - **Rule 4:** because you sort everything at every `/k3plan`, nothing stays long. A topic that has
185
+ been waiting more than 14 days is sorted now **in any case**.
204
186
  - **Rules 5 and 6 — don't start a new spec** while another spec is in progress (one of its
205
187
  stories is `in_arbeit`, has a finding or a failed counter-check, or is `gebaut` with an `offen`
206
188
  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). **Tell the person what to test instead** — with the
189
+ passed, no finding, not yet confirmed — **and** no story of their spec keeps the spec in progress: only then
190
+ is it under "Your test", and only then does the app count the story). **Tell the person what to test instead** — with the
208
191
  `testen` sentences. If you sort a topic in as a new story in a spec, you do not start that spec
209
192
  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; the file has no field for it.
193
+ - **Rule 7:** only the person sets "Done", with "Works" in the app; a report has no field for it.
211
194
  You only keep the round stable (section 4).
212
195
  - **Rule 8:** `weggelassen` only with a `grund` (section 3).
213
196
 
214
- ## 6. The file
197
+ ## 6. The reports
215
198
 
216
- `plan/stand.json` is under Git. Example, shortened:
199
+ A report is a JSON object, several are a list. It goes through the input to `kimal3 plan report --no-session`;
200
+ the program sets the time itself, and the project comes from the folder note
201
+ `plan/projekt.json`. Checking is not working — this way no dot lights up on the board.
217
202
 
218
- ```json
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
- }
203
+ ```
204
+ echo '[ … ]' | kimal3 plan report --no-session
257
205
  ```
258
206
 
259
- **The fields** — every one must be there, even if it is `null` or empty (only `eingeordnet` may
260
- be missing); the server refuses an unknown field (a typo like `"befund"`):
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:
207
+ (In PowerShell: `'[ … ]' | kimal3 plan report --no-session`. For long texts, use a file.) The examples are
208
+ made up.
291
209
 
292
- ```
293
- kimal3 plan upload --dry-run
210
+ **A spec** — when checking, and when stories are added:
211
+
212
+ ```json
213
+ { "art": "spec", "schluessel": "2026-10-24-test-month", "titel": "Test month",
214
+ "datei": "docs/superpowers/specs/2026-10-24-test-month-design.md",
215
+ "stories": [ { "schluessel": "US-1", "titel": "The test month starts" },
216
+ { "schluessel": "US-2", "titel": "The test month ends" },
217
+ { "schluessel": "US-3", "titel": "Export of the test month" } ] }
294
218
  ```
295
219
 
296
- `Dry run: would upload 9 stories and mark 2 responses as handled. Nothing was saved.` (numbers as
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".
220
+ **A story** — one deviation, one entry. Built, with a counter-check:
221
+
222
+ ```json
223
+ { "art": "story", "spec": "2026-10-24-test-month", "story": "US-1", "stand": "gebaut",
224
+ "kriterien": [ { "text": "If Sabine starts on 1 Nov, the test month ends on 30 Nov.", "gegenprobe": "bestanden" } ],
225
+ "testen": "In the app open 'Test month' and click \"Start\" - below it says 'Ends on 30 Nov'. If it shows another date, say 'Doesn't work'." }
226
+ ```
299
227
 
300
- Then:
228
+ With an open finding (here from you; `quelle: "mensch"` only for the person's sentence):
301
229
 
230
+ ```json
231
+ { "art": "story", "spec": "2026-10-24-test-month", "story": "US-2", "stand": "in_arbeit",
232
+ "befunde": [ { "text": "On 30 Nov the reminder mail the spec promises is missing.", "quelle": "claude", "seit": "2026-10-23" } ] }
302
233
  ```
303
- kimal3 plan upload
234
+
235
+ Deliberately left out (`grund` is required):
236
+
237
+ ```json
238
+ { "art": "story", "spec": "2026-10-24-test-month", "story": "US-3", "stand": "weggelassen", "grund": "The spec drops the export." }
304
239
  ```
305
240
 
306
- It worked if you see `✓ Planning for "…" uploaded: … stories, … waiting for your test.` and
307
- `View: …`; the first time also `projekt_id and basis are now in plan/stand.json.` The CLI has
308
- entered `projekt_id` and `basis` and emptied `uebernommen` — leave the file like that. Tell the
309
- person that `plan/stand.json` has changed and belongs in the next commit.
241
+ **A topic** (rule 2), **sorting a topic of yours** (rule 3), **handing on a response from the
242
+ person** (rules 1 and 3):
243
+
244
+ ```json
245
+ { "art": "thema", "schluessel": "T-4", "text": "The calendar could show public holidays" }
246
+ { "art": "eingeordnet", "schluessel": "T-3", "text": "Export as PDF", "antwort": "dropped: the print button can already do that." }
247
+ { "art": "uebernommen", "rueckmeldung": 12, "antwort": "Finding on US-2" }
248
+ ```
310
249
 
311
- After that comes a line `Spec texts uploaded: 1 of 3. Without text: …` — the text of the specs goes up too.
312
- A spec without text is a **hint, not a failure** (exit code `0`): tell the person which specs are in
313
- the brackets and what to do (correct the path in `datei`; over 300 KB cannot be uploaded; with
314
- "all spec texts together larger than 4 MB" no single file is too large — the largest stay out
315
- until the rest fits).
250
+ **What the program returns:** on success it is silent (`0`) — and **so are you**: don't tell the
251
+ person that you reported. `1` — the app refused or the input was unreadable; the sentence on the
252
+ error output says why. Reports it doesn't name arrived. `3` — the app is not reachable; the report
253
+ is **kept** and goes along with the next command (`kimal3 plan send` sends it right away) — don't
254
+ send it again. `2` — no longer signed in: tell the person `kimal3 login`; the report is kept.
316
255
 
317
- **Refusals — read the message, fix it, dry run, again:**
256
+ **Refusals — read the message, fix it, send again:**
318
257
 
319
- | The message starts with | What you do |
258
+ | Message starts with | What you do |
320
259
  |---|---|
321
- | `The plan can't be read: <place> …` | Repair that place (`specs[0].stories[2].stand`) in the file. |
322
- | `No project is called …` · `Several of your projects are called …` · `The project number in plan/stand.json belongs to none of your projects.` | As in section 2. For the project number you may set `projekt_id` to `null` — only here. |
323
- | `<spec> / <story> has round 1, round 2 is already saved.` | The file is older than the saved state. Set the round to the saved value — never lower. |
324
- | `Response 12 doesn't exist in this project or is listed twice …` | Only numbers from `kimal3 plan`, each one once. |
325
- | `Response 12 ("…") is marked as handled, but US-2 has no finding from you …` | Attach the finding with `quelle: "mensch"` to the story (rule 1) — or raise the round by 1 if it has been fixed. |
326
- | `The app has a newer plan (uploaded …).` | Another working copy has uploaded. **Do not overwrite.** Tell the person and ask whether you should first fetch that state (Git) and check again. `kimal3 plan upload --overwrite` **only after their explicit yes.** |
327
- | `The planning saved in the app is damaged …` | Here too, `--overwrite` **only after their yes.** |
328
- | `The planning is saved, but the responses aren't marked as handled yet.` | Run `kimal3 plan upload` **unchanged** once more — that is harmless, the CLI has already entered `basis` and left `uebernommen` in place. |
329
- | ``The plan is saved, but the spec texts are not. Run `kimal3 plan upload` again.`` | Run `kimal3 plan upload` **unchanged** once more — the plan is already in the app, the CLI has entered `basis`. |
330
- | `⚠ The planning is saved, but plan/stand.json couldn't be updated. Enter it yourself: …` | Write exactly these values into the file. |
331
- | `… couldn't be loaded just now` / `… couldn't be saved just now` | Try once more; if it still fails, tell the person. |
332
-
333
- 🔴 **`--overwrite` replaces what someone else uploaded.** Never on your own decision, not even
334
- when the message suggests it.
335
-
336
- ## 8. Report to the person
337
-
338
- **At most five lines**, without jargon:
339
-
340
- - what was **done** (confirmed since last time),
341
- - what is **waiting for their test** — with the `testen` sentence, so they can start right away,
260
+ | `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. |
261
+ | `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. |
262
+ | `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. |
263
+ | `<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. |
264
+ | `Response 12 doesn't exist in this project or is listed twice …` | Only numbers from `kimal3 plan`, each once. |
265
+ | `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`. |
266
+ | `The plan can't be read: <place> …` | Correct the named place in the report (length, `grund` on `weggelassen`, duplicate key). |
267
+ | `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. |
268
+ | `The reports are saved, but not fully recorded yet.` | Send again — sending twice does no harm. |
269
+ | `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.** |
270
+
271
+ 🔴 **`--overwrite` replaces what others reported.** Never on your own decision, not even if the
272
+ message suggests it.
273
+
274
+ ## 7. Report to the person
275
+
276
+ **At most five lines**, without jargon — and nothing about the reports themselves:
277
+
278
+ - what became **done** (confirmed since last time),
279
+ - what is **waiting for their test** (only stories from specs under "Your test") — with the `testen` sentence so they can start right away,
342
280
  - what was decided in the **inbox** (each topic with its answer),
343
- - a **warning** if rule 5 or 6 is broken: "Test … first" instead of a new story,
281
+ - a **warning** if rule 5 or 6 is broken: "Test first …" instead of a new story,
344
282
  - the **link** from `View: …`.
345
283
 
346
284
  Example (made-up values):
347
285
 
348
286
  ```
349
287
  Done: US-1 "Create posts".
350
- Your test: US-2 - open /calendar and drag the post from Monday to Wednesday.
351
- Inbox: "The calendar should show public holidays" -> new story US-7 in "Content planner".
352
- Claude test pending: US-4 needs a browser I don't have here.
288
+ Your test: US-2 — open /calendar and drag the post from Monday to Wednesday.
289
+ Inbox: "The calendar should show public holidays" → new story US-7 in "Content planner".
290
+ Claude test pending: US-4 needs a browser, which I don't have here.
353
291
  Planning: https://app.kimal3.de/projekt/…
354
292
  ```
@@ -18,6 +18,25 @@ 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` sentence; what was started and isn't done stays `in_arbeit`; what came
25
+ up today and no spec promises goes in as a `thema`. Report only what differs from that state, 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": "Open /test-month and click Start - below it says Ends on 30 Nov." },
33
+ { "art": "story", "spec": "2026-10-24-test-month", "story": "US-2", "stand": "in_arbeit" } ]
34
+ ```
35
+
36
+ On success you say nothing about it. If you mention the board in the wrap-up (step 6), then only
37
+ what did **not** work (a refusal, or kept because the app was not reachable). The dot at the
38
+ project on the project page stays as long as the window is open; when the person closes it, it
39
+ is gone in under a second.
21
40
 
22
41
  ## 2. Update the status file — and tidy it up
23
42
  The status file (`NEXT-STEPS.md` or `ROADMAP.md`) is the note for the next start. It is only