kimal3 0.4.0 → 0.6.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.
@@ -0,0 +1,342 @@
1
+ ---
2
+ description: Check the specs against the code and upload the planning to the app
3
+ ---
4
+
5
+ <!-- kimal3:erzeugt — this file is maintained by `kimal3 skill install` and
6
+ overwritten on every update. Your own changes will be lost; if you want
7
+ to keep them, copy the file under a different name. -->
8
+ # Checking and uploading the planning
9
+
10
+ ## 1. What for
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".
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
19
+ **`~/.claude/skills/kimal3/SKILL.md`, section "Exit codes"**; this file does not repeat it.
20
+
21
+ 🔑 **`/k3plan` checks, sorts and uploads — it builds nothing.** Whatever needs fixing is
22
+ attached to the story as a finding afterwards; building happens when the person says so.
23
+
24
+ ## 2. Fetch the responses
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.
28
+
29
+ ```
30
+ kimal3 plan
31
+ ```
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.
59
+
60
+ **What the output means** (example, made-up values):
61
+
62
+ ```
63
+ #12 · doesn't work · 2026-09-23-content-planner / US-2 (round 1): When dragging, it jumps to Tuesday
64
+ #13 · Topic: The calendar should show public holidays
65
+ Confirmed: 2026-09-23-content-planner / US-1 (round 1)
66
+ View: https://app.kimal3.de/projekt/…
67
+ ```
68
+
69
+ - `#12 · doesn't work · <spec> / <story> (round n): <sentence>` — the person tested the story and
70
+ it doesn't hold. → Rule 1 in section 5. You need the number later for `uebernommen`.
71
+ - `#13 · Topic: <sentence>` — something new they noted in the app. → Rule 3.
72
+ - `Confirmed: …` — for these stories they said "Works" in **this** round; they are done. You
73
+ never need to hand on a "Works".
74
+ - `View: …` — the link to the planning. Keep it for the report.
75
+ - `No open responses.` — nothing to hand on; carry on with section 3.
76
+
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.
89
+
90
+ ## 3. Find the specs
91
+
92
+ In the project folder, look in **`docs/superpowers/specs/`**, **`plan/`** and **`docs/specs/`**
93
+ 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.
96
+
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).
99
+
100
+ 🔴 **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.
105
+
106
+ - `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.
109
+ - The story key is **the same as in the heading of the spec**, where the spec numbers its stories
110
+ (`### US-3 · …` → `US-3`): the app finds the story in the spec text through this key.
111
+ - A spec without stories goes in with `"stories": []`; mention it in the report.
112
+ - Limits: at most 50 specs, 60 stories per spec, 400 altogether. If there are more, ask the
113
+ person which specs belong in.
114
+
115
+ **The state of each story (`stand`):**
116
+ - `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).
120
+ - `weggelassen` — deliberately not built, `grund` is required (rule 8). Only if the spec or the
121
+ person decided so — never on your own to tidy up. If in doubt: leave it `offen` and ask in the
122
+ report.
123
+
124
+ ## 4. Check against the code
125
+
126
+ Run the counter-check of each criterion **wherever you can**: the project's guards or tests
127
+ (`npm test`, `npm run …`), a command, starting the app and calling the address, reading a file.
128
+
129
+ - `bestanden` (passed) — **only** if the counter-check ran in this session and showed the
130
+ 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); the app
132
+ then puts the story and its spec under "In progress".
133
+ - `offen` (not run) — everything that did not run: needs a browser, a sign-in, real data or a
134
+ person. Reading only counts if the criterion says something about the file itself (a file
135
+ exists, a text is there as written) — reading does not prove a behaviour.
136
+
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.
139
+
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".
144
+
145
+ **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.
148
+
149
+ **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.
151
+ - **Raise it by exactly 1** when a story with a finding from the person (`quelle: "mensch"`) has
152
+ 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
154
+ unclear whether it was fixed: leave the finding and ask in the report.
155
+ - **Also raise it** if you changed a **confirmed** story in a way the person would notice — their
156
+ old "Works" no longer applies (rule 7).
157
+ - Otherwise **leave it alone**: a confirmed story stays done as long as its round stays the same.
158
+
159
+ ## 5. The eight rules
160
+
161
+ The app shows them to the person in exactly this wording ("How planning stays short"):
162
+
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".
164
+ 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".
166
+ 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.
168
+ 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.
170
+ 8. **A spec is only closed when every story is done or deliberately left out** — with a reason. There is no silent remainder.
171
+
172
+ **What you do with them:**
173
+
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.
181
+ - **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
+ The five places are shared by `themen` and the open notes from the app.
185
+ - **Rule 3 — sort:** every `Topic` from `kimal3 plan` **and** every topic already in `themen` from
186
+ earlier is sorted **now** — one of three:
187
+ - **new story:** write it into the spec it belongs to (user story, acceptance criterion with
188
+ counter-check) and into `plan/stand.json` with `stand: "offen"`. If no spec fits, ask where it
189
+ goes. Answer: `new story US-7 in "Content planner"`.
190
+ - **finding on a story:** as in rule 1. Answer: `finding on US-2 in "Content planner"`.
191
+ - **dropped:** answer `dropped: <reason in one sentence>`, for example
192
+ `dropped: public holidays are already in the calendar tool.`
193
+
194
+ For a note from the app, the answer goes into `uebernommen` as **one sentence** (the app shows
195
+ it under "Recently sorted" as `<note> → <answer>`); so write it **without** an arrow at the
196
+ start. A topic from the file you take out of `themen` and name how it was sorted in the
197
+ report.
198
+ - **Rule 4:** because you sort everything at every `/k3plan`, nothing stays long. A topic with
199
+ `seit` more than 14 days ago is sorted now **in any case**.
200
+ - **Rules 5 and 6 — don't start a new spec** while another spec is in progress (one of its
201
+ stories is `in_arbeit`, has a finding or a failed counter-check, or is `gebaut` with an `offen`
202
+ criterion or with no criteria at all), or while more than five stories are waiting for the person's test (`gebaut`, all
203
+ passed, no finding, not yet confirmed). **Tell the person what to test instead** — with the
204
+ `testen` sentences. If you sort a topic in as a new story in a spec, you do not start that spec
205
+ with it: it stays `offen`, and the spec does not count as in progress.
206
+ - **Rule 7:** only the person sets "Done", with "Works" in the app; the file has no field for it.
207
+ You only keep the round stable (section 4).
208
+ - **Rule 8:** `weggelassen` only with a `grund` (section 3).
209
+
210
+ ## 6. The file
211
+
212
+ `plan/stand.json` is under Git. Example, shortened:
213
+
214
+ ```json
215
+ {
216
+ "format": 1,
217
+ "projekt": "LinkedIn Content App",
218
+ "projekt_id": null,
219
+ "basis": null,
220
+ "geprueft_am": "2026-10-21T22:10:00+02:00",
221
+ "specs": [
222
+ {
223
+ "schluessel": "2026-09-23-content-planner",
224
+ "titel": "Content planner as a page",
225
+ "datei": "plan/2026-09-23-content-planner-page-spec.md",
226
+ "stories": [
227
+ {
228
+ "schluessel": "US-2",
229
+ "titel": "Move posts in the calendar",
230
+ "stand": "gebaut",
231
+ "runde": 1,
232
+ "gebaut_am": "2026-10-21",
233
+ "kriterien": [
234
+ { "text": "Drag the post from Monday to Wednesday -> it is on Wednesday", "gegenprobe": "bestanden" }
235
+ ],
236
+ "befunde": [],
237
+ "testen": "Open /calendar and drag the post from Monday to Wednesday.",
238
+ "grund": null
239
+ }
240
+ ]
241
+ }
242
+ ],
243
+ "themen": [
244
+ { "schluessel": "T-1", "text": "The calendar should show public holidays", "quelle": "mensch", "seit": "2026-10-21" }
245
+ ],
246
+ "uebernommen": [
247
+ { "rueckmeldung": 12, "antwort": "Finding on US-2" }
248
+ ]
249
+ }
250
+ ```
251
+
252
+ **The fields** — every one must be there, even if it is `null` or empty; the server refuses an
253
+ unknown field (a typo like `"befund"`):
254
+
255
+ - `format`: exactly `1`.
256
+ - `projekt`: the name as in the app, 1–200 characters.
257
+ - `projekt_id`, `basis`: `null` at first; after that `kimal3 plan upload` writes them — **never
258
+ change them by hand**. Only exception: the refusal "The project number in plan/stand.json
259
+ belongs to none of your projects." — then set `projekt_id` to `null` (section 2).
260
+ - `geprueft_am`: now, with time zone (`date +%Y-%m-%dT%H:%M:%S%:z` in Bash, `Get-Date -Format
261
+ "yyyy-MM-ddTHH:mm:sszzz"` in PowerShell).
262
+ - `specs[]`: `schluessel` (unique, 1–80 characters), `titel` (1–200), `datei` (path or `null`),
263
+ `stories[]`.
264
+ - `stories[]`: `schluessel` (unique within its spec), `titel`, `stand` (`offen` · `in_arbeit` ·
265
+ `gebaut` · `weggelassen`), `runde` (1–999), `gebaut_am` (`YYYY-MM-DD` for `gebaut`, otherwise
266
+ `null`), `kriterien[]`, `befunde[]`, `testen` (sentence or `null`), `grund` (required for
267
+ `weggelassen`, otherwise `null`).
268
+ - `kriterien[]`: `{ "text", "gegenprobe": "bestanden" | "gescheitert" | "offen" }`, at most 30
269
+ per story.
270
+ - `befunde[]`: `{ "text", "quelle": "claude" | "mensch", "seit": "YYYY-MM-DD" }` — open ones only,
271
+ at most 20.
272
+ - `themen[]`: `{ "schluessel", "text", "quelle", "seit" }`, at most 50 (the inbox has five places,
273
+ rule 2).
274
+ - `uebernommen[]`: `{ "rueckmeldung": <number from kimal3 plan>, "antwort": "<one sentence>" }`.
275
+ `kimal3 plan upload` empties it itself after uploading.
276
+ - The whole file: at most 300 KB.
277
+
278
+ ## 7. Upload
279
+
280
+ First the dry run — it checks everything and saves nothing:
281
+
282
+ ```
283
+ kimal3 plan upload --dry-run
284
+ ```
285
+
286
+ `Dry run: would upload 9 stories and mark 2 responses as handled. Nothing was saved.` (numbers as
287
+ an example). **Compare the second number** with the open responses from `kimal3 plan`: if it is
288
+ smaller, you forgot one — it would stay in the app under "Waiting for Claude".
289
+
290
+ Then:
291
+
292
+ ```
293
+ kimal3 plan upload
294
+ ```
295
+
296
+ It worked if you see `✓ Planning for "…" uploaded: … stories, … waiting for your test.` and
297
+ `View: …`; the first time also `projekt_id and basis are now in plan/stand.json.` The CLI has
298
+ entered `projekt_id` and `basis` and emptied `uebernommen` — leave the file like that. Tell the
299
+ person that `plan/stand.json` has changed and belongs in the next commit.
300
+
301
+ After that comes a line `Spec texts uploaded: 1 of 3. Without text: …` — the text of the specs goes up too.
302
+ A spec without text is a **hint, not a failure** (exit code `0`): tell the person which specs are in
303
+ the brackets and what to do (correct the path in `datei`; over 300 KB cannot be uploaded).
304
+
305
+ **Refusals — read the message, fix it, dry run, again:**
306
+
307
+ | The message starts with | What you do |
308
+ |---|---|
309
+ | `The plan can't be read: <place> …` | Repair that place (`specs[0].stories[2].stand`) in the file. |
310
+ | `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. |
311
+ | `<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. |
312
+ | `Response 12 doesn't exist in this project or is listed twice …` | Only numbers from `kimal3 plan`, each one once. |
313
+ | `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. |
314
+ | `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.** |
315
+ | `The planning saved in the app is damaged …` | Here too, `--overwrite` **only after their yes.** |
316
+ | `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. |
317
+ | ``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`. |
318
+ | `⚠ The planning is saved, but plan/stand.json couldn't be updated. Enter it yourself: …` | Write exactly these values into the file. |
319
+ | `… couldn't be loaded just now` / `… couldn't be saved just now` | Try once more; if it still fails, tell the person. |
320
+
321
+ 🔴 **`--overwrite` replaces what someone else uploaded.** Never on your own decision, not even
322
+ when the message suggests it.
323
+
324
+ ## 8. Report to the person
325
+
326
+ **At most five lines**, without jargon:
327
+
328
+ - what was **done** (confirmed since last time),
329
+ - what is **waiting for their test** — with the `testen` sentence, so they can start right away,
330
+ - what was decided in the **inbox** (each topic with its answer),
331
+ - a **warning** if rule 5 or 6 is broken: "Test … first" instead of a new story,
332
+ - the **link** from `View: …`.
333
+
334
+ Example (made-up values):
335
+
336
+ ```
337
+ Done: US-1 "Create posts".
338
+ Your test: US-2 - open /calendar and drag the post from Monday to Wednesday.
339
+ Inbox: "The calendar should show public holidays" -> new story US-7 in "Content planner".
340
+ Claude test pending: US-4 needs a browser I don't have here.
341
+ Planning: https://app.kimal3.de/projekt/…
342
+ ```
@@ -0,0 +1,302 @@
1
+ ---
2
+ description: Show a task instead of describing it — I record it and turn it into a plan
3
+ ---
4
+
5
+ <!-- kimal3:erzeugt — this file is maintained by `kimal3 skill install` and
6
+ overwritten on every update. Your own changes will be lost; if you want
7
+ to keep them, copy the file under a different name. -->
8
+ # Show
9
+
10
+ > You do a task once on screen and say out loud what you are doing and why.
11
+ > I record it, evaluate it on your computer and write a description of it into the
12
+ > project — so that we can automate the task afterwards without you first having to write
13
+ > it down as a requirement.
14
+
15
+ Carry out the steps in order. Stay in the coaching tone: English, friendly, **one question at a
16
+ time and always with a suggestion**, the why before the how, no prior knowledge assumed. The
17
+ mechanics are done by the program (`kimal3 show …`); you lead the conversation with the person. How
18
+ to deal with `kimal3`'s exit codes in general is in `~/.claude/skills/kimal3/SKILL.md`; here are only
19
+ the cases of this command.
20
+
21
+ ## 🔴 Three rules for the whole conversation
22
+
23
+ 1. **Before the yes in step 10 you read nothing from the recording.** No `zeitleiste.md`, no
24
+ picture, no log, no other file from `material/aufnahmen/` — and you don't **search** there
25
+ either: no grep, no glob, no file search across the project that includes this folder. What
26
+ lies there only leaves the computer with the person's yes. You may read the output of
27
+ `kimal3 show …` — it contains only numbers, times and folder names.
28
+ 2. **Install nothing, record nothing, delete nothing without an explicit yes to exactly that
29
+ step.** You open a file from the recording for the person only in Notepad, and in a way that
30
+ your call returns at once: in Bash `cmd //c start "" notepad "<path>"`, in PowerShell
31
+ `Start-Process notepad -ArgumentList '"<path>"'`. A bare `notepad "<path>"` blocks until the
32
+ window is closed again. Never in an IDE or an editor that Claude Code is attached to (selected
33
+ lines end up in the conversation there by themselves).
34
+ 3. **A failure never looks like a success.** If a `kimal3 show …` doesn't end with `0`, say
35
+ honestly what its message says, and don't carry on as if it had worked.
36
+
37
+ Every `kimal3 show …` runs **in the project folder** (step 3) — the program finds the recording
38
+ through the folder it is started in. If a recording lies in another project, change into it first:
39
+ the project folder is the part of the path before `material/aufnahmen/`.
40
+
41
+ ## 1. Arrive and look
42
+
43
+ First run `kimal3 show status`. It only reads. **Don't** read the “Set up:” block out to the
44
+ person — just note whether anything in it is missing (a line with “missing”, “can't be checked”,
45
+ “I can't tell” or “(… is needed)” → step 4).
46
+
47
+ | The output says | What you do |
48
+ |---|---|
49
+ | `kimal3 show` is Windows-only for now; the Mac follows. | Say exactly that, kindly: showing a task doesn't work on this computer yet, the Mac is coming. Offer that the person describes the task in words instead. The command ends here. |
50
+ | “I can't tell whether a recording is running.” (exit code 1) | Say honestly that you can't tell right now. **Start nothing.** Offer to look again in a minute. |
51
+ | “Running since 09:12 (3 minutes), folder `…`, stops at 09:27 at the latest.” | A recording from an earlier session is still running. If the folder is a full path outside this project, first change into its project folder. Then ask: “There's still a recording running from 09:12 — are you through with showing the task? Then I'll stop it now.” Yes → step 8. |
52
+ | “Running (started in another session).” | A recording is running that this project can't match. Say so, **don't start a second one**, and suggest checking with `kimal3 show status` once it has ended. |
53
+ | “No recording is running.” followed by “The last one (`…`) stopped by itself after 15 minutes.” | A recording is finished but probably not evaluated yet. **Don't silently start a new one over it.** Ask with a suggestion: “The recording from 09:12 stopped by itself after 15 minutes — shall I evaluate it, or would you rather show the task again? I'd evaluate it; whatever you did after the 15 minutes is then missing.” Evaluate → step 9 (the time is in the folder name, `…-0912`). Again → carry on here. |
54
+ | “No recording is running.” followed by “The last one (`…`) broke off.” | Kindly: the last recording broke off in the middle — the person did nothing wrong. Offer to show the task again. |
55
+ | “No recording is running.” | Carry on. |
56
+
57
+ The last line says whether the folder is right — remember it for step 3:
58
+ “Recordings go here: …” (right) · “Switch into a project first …” (the session is in the
59
+ workbench) · “The project folder is nested too deeply for the recorder …” (the path is too long).
60
+
61
+ If the session is in the workbench, say **that first**, in one sentence: the recording belongs in
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:
64
+
65
+ > “You show me the task once and talk while you do it. I record the screen, sound, clicks and
66
+ > keys. It stays on your computer. Before I read any of it, I'll ask you. Which task do you want
67
+ > to show me — in one sentence?”
68
+
69
+ Until the person has answered, nothing is installed and nothing is recorded.
70
+
71
+ ## 2. The task in one sentence
72
+
73
+ Wait for the answer. You take the person's sentence **unchanged** — it will stand at the top of
74
+ the timeline, and exactly where it and the demonstration differ lies the most important follow-up
75
+ question (step 11). A rough sentence is enough; don't dig.
76
+
77
+ ## 3. The right folder
78
+
79
+ - **Recordings already go to the right place here?** Carry on with step 4.
80
+ - **The session is in the workbench** (`workbench-…`): suggest a project with a short name from the
81
+ task — lower case, hyphens: “I'd create the project `projects/quote-list` for this — does that
82
+ work?” (if the folder in the workbench is called `projekte/`, then there). Only after the yes do
83
+ you create **only** `plan/` and `material/` in it, nothing in advance. From now on every
84
+ `kimal3 show …` runs in this project folder (e.g. `cd "<project folder>" && kimal3 show status`).
85
+ Check with `kimal3 show status` that the last line now says “Recordings go here: …”.
86
+ - **The path is too deep:** name the number from the message and why (the recorder fails on long
87
+ paths). Suggest creating the project closer to the drive, and ask before you create anything.
88
+
89
+ ## 4. Setting up — only if something is missing
90
+
91
+ If nothing is missing, skip this step without a word about it. If something is missing, say
92
+ **exactly this first** and wait for the answer:
93
+
94
+ > “For this I'll set up the recorder once — a free program that records screen, sound, clicks
95
+ > and keys. About 2.1 GB, 10 to 20 minutes depending on your connection, only in your user
96
+ > folder, no admin rights. Because it records keystrokes, your company's antivirus may flag it;
97
+ > on a work computer, check with IT first if in doubt. Shall I?”
98
+
99
+ - **Yes:** start `kimal3 show setup` **in the background** — it can take longer than the ten
100
+ minutes a command may run in the foreground. Say that it is running and the person can do
101
+ something else meanwhile. **Wait for the notice that it has finished** — don't check in between,
102
+ and don't sleep in a loop. After that:
103
+ - exit code `0` → `kimal3 show status`; if all four parts are there (uv, recorder, FFmpeg,
104
+ speech model), carry on with step 5.
105
+ - exit code `1` (“Step … didn't work.”) → name that step, and offer a ready-made
106
+ message to IT: **what** (uv from Astral · the recorder openadapt-capture 1.3.0, MIT licence,
107
+ with Python 3.12 · FFmpeg · the speech model large-v3-turbo from Hugging Face), **what for**
108
+ (showing a work task once on screen and evaluating it on the computer), **where from**
109
+ (astral.sh or winget, pypi.org, huggingface.co), **which folders** (only the user folder, no
110
+ admin rights).
111
+ - **No:** “No problem — you can do it any time later with `/k3show`.” The command ends here.
112
+
113
+ ## 5. The briefing before the start
114
+
115
+ Say these four points before anything records:
116
+
117
+ 1. **All screens** are recorded. Close anything that shows other people's data, switch on “Do
118
+ not disturb”, and not during a call. If you can, use a **test customer** instead of a real
119
+ one.
120
+ 2. **Don't type a password** — every key is recorded.
121
+ 3. Say out loud **why** you do something.
122
+ 4. When you're done, come back here and type **“done”**; the recording stops by itself after 15
123
+ minutes at the latest.
124
+
125
+ Then: “Type ‘go’ when you're ready.” — and wait.
126
+
127
+ - **A clear go** — “go”, “ready”, “start” — → step 6.
128
+ - **A bare “ok” or “yes”** → ask once: “Shall I start now?”
129
+ - **Anything else** → answer and say that it starts with “go”.
130
+
131
+ **Nothing starts before the go.**
132
+
133
+ ## 6. Starting
134
+
135
+ After the go: `kimal3 show start '<the person's sentence>'`. Pass the sentence as **one** argument,
136
+ so that the shell changes nothing in it — in Bash in single quotes (a `'` inside as `'\''`), in
137
+ PowerShell in single quotes (a `'` inside doubled). `--at-most` (1 to 15 minutes) only if the person
138
+ explicitly wants it shorter.
139
+
140
+ | The output says | What you do |
141
+ |---|---|
142
+ | “The recording is running (folder …), stops at … at the latest.” (exit code 0) | Say exactly: “Running. Show me — and type ‘done’ here when you're through.” **Then end your turn** — no further command, no checking. |
143
+ | “A recording is already running (since 09:12, folder `…`).” · “A recording is already starting …” | No second one is created. Ask: “There's still a recording running from 09:12 — shall I stop it so that we can start again?” Yes → `kimal3 show stop` (step 8), then back to step 5. |
144
+ | “A recording is already running (started in another session).” | Ask: “There's still a recording running from another session — shall I stop it so that we can start again?” Yes → `kimal3 show stop`; if it says it can't match it here, say so honestly and suggest waiting until it stops by itself (`kimal3 show status`). |
145
+ | “I can't tell whether a recording is running — so I won't start a second one.” | Say it honestly, force nothing, look again later. |
146
+ | “The recorder isn't set up yet: `kimal3 show setup`.” | Back to step 4. |
147
+ | “The recording didn't start: <reason>. Log: …” | Name the reason. **Don't open the log** — it contains window titles. If “Whether the recorder is still running: `kimal3 show status`.” follows, run `kimal3 show status` and say what it reports. Offer another attempt. |
148
+ | “Switch into a project first …” · “The project folder is nested too deeply …” | Back to step 3. |
149
+
150
+ ## 7. While recording
151
+
152
+ If the person writes anything other than “done” (a question, a thought), answer briefly and end
153
+ with: “The recording is still running — type ‘done’ when you're through.” Open nothing on the
154
+ screen meanwhile (it would end up in the video) and don't stop the recording on your own.
155
+ “done”, “finished”, “I'm through” and the like → step 8.
156
+
157
+ ## 8. Stopping
158
+
159
+ First say: “I'm finishing the recording — that can take a minute, with a long recording several.”
160
+ Otherwise the person sees nothing happen while it finishes.
161
+
162
+ Then `kimal3 show stop` — with the **longest wait the tool allows (10 minutes)**: the recorder finishes
163
+ the video, and with a long recording that takes a while; with the default of 2 minutes the call
164
+ would break off in the middle. The program answers after a little over 8 minutes at the latest, so
165
+ before the 10 minutes are up.
166
+
167
+ | The output says | What you do |
168
+ |---|---|
169
+ | “Recording stopped: 1:33 minutes, 30 clicks, 49 keys, audio present.” | Repeat the numbers in one sentence, carry on with step 9. |
170
+ | “The recording is still being finished — run `kimal3 show stop` again in a moment.” (exit code 1) | Say: “The recorder is still finishing the recording — I'll check again in a moment.” Then run `kimal3 show stop` again, again with the 10-minute wait. **Never** say “not closed cleanly”, and don't offer a new recording. |
171
+ | “The recording stopped by itself after 15 minutes: …” (exit code 0) | Say: “The recording stopped by itself after 15 minutes — whatever you did after that isn't in it.” Carry on with step 9. |
172
+ | “No recording is running.” | Check with `kimal3 show status`. If it says “The last one (`…`) stopped by itself after … minutes.”, carry on with step 9; otherwise say honestly that there is no recording. |
173
+ | “I can't tell whether a recording is running.” | Say it honestly — **never** “stopped”. Offer to look again in a minute with `kimal3 show status`. |
174
+ | “The recording wasn't closed cleanly: <reason>.” (exit code 1) | Name the reason and offer a new recording. |
175
+ | “The recording broke off: <reason>. …” (exit code 1) | Kindly: the person did nothing wrong. Name the reason and offer a new recording. |
176
+ | “The recording couldn't be stopped …” · “A recording is running that I can't match here …” | Run `kimal3 show status` and say honestly what it reports — **never** “stopped”. If the session is in the wrong folder, change into the recording's project. |
177
+
178
+ ## 9. Evaluating — on the person's computer
179
+
180
+ `kimal3 show evaluate` (without a folder it takes the project's latest recording; the language of
181
+ the speech recognition follows the account — `--language de` or `--language en` only if the person
182
+ spoke the other language). This takes about as long as the recording:
183
+
184
+ - **Recording up to about 3 minutes:** in the foreground, with the longest wait (10 minutes).
185
+ - **Longer — and always when it stopped by itself after 15 minutes:** **in the background**, as
186
+ with the setup. Say that it takes about as long as the recording, and **wait for the notice that
187
+ it has finished** — no checking in between, no loop.
188
+
189
+ | The output says | What you do |
190
+ |---|---|
191
+ | “Timeline ready: … File: `…`.” | Say the numbers in one sentence. Remember the path — **don't open the file**. Carry on with step 10. |
192
+ | “I didn't recognise any speech — was the microphone muted or the wrong one selected?” | Ask exactly that and offer a new recording. |
193
+ | “The recording has no audio track — without sound there's no timeline. A new recording helps.” | Offer a new recording. |
194
+ | “I can't find a recording in this project (`material/aufnahmen/`).” | The session isn't in the recording's project: change into it (the part of the path before `material/aufnahmen/`, from `kimal3 show status` or the stop message) and evaluate again. |
195
+ | “The recording folder doesn't exist: …” | Say honestly that the recording isn't (or is no longer) there. Check with `kimal3 show status`; otherwise offer a new recording. |
196
+ | “The recorder isn't set up yet: `kimal3 show setup`.” | Back to step 4, then evaluate again. |
197
+ | “The timeline wasn't created: <reason>.” | Name the reason; if the speech model is missing, back to step 4. |
198
+ | “The recording is still running — first `kimal3 show stop`.” | Back to step 8. |
199
+
200
+ ## 10. Data protection — before you read
201
+
202
+ First one question, and wait for the answer:
203
+
204
+ > “Did the demonstration show real data about people — customer names, email addresses?”
205
+
206
+ **Yes:** then the four questions from `context/security.md` (in the workplace above the workbench;
207
+ in a German workplace `kontext/sicherheit.md`) come **now**, before reading — one at a time, each
208
+ with a suggestion: which fields · where to (to Anthropic, the company behind Claude, data centres
209
+ in the USA) · on what legal basis · can it be done more sparingly, e.g. once more with test
210
+ customers. You write the answers to `results/data-protection-demonstration.md` (in a German
211
+ workbench `ergebnisse/`). If the answer is “once more with test customers”, read nothing, suggest
212
+ deleting this recording (step 13, the sentence **without** the plan), and start again at step 5.
213
+
214
+ Then this question, word for word:
215
+
216
+ > “For me to read the timeline, it goes to Anthropic: what you said, where you clicked (with the
217
+ > names of the buttons and fields — these can contain names) and what you typed. Screenshots show
218
+ > your whole screen — I'll only look at those where the text isn't enough, and ask you before
219
+ > each one. Shall I open the file for you so you can look first? Agreed — or would you rather
220
+ > leave out the typed parts?”
221
+
222
+ - **“Open it”:** in Notepad, as in rule 2 (`cmd //c start "" notepad "<full path>"` or
223
+ `Start-Process`), with the full path to `zeitleiste.md` (the project folder plus the path from
224
+ step 9). The person reads it themselves; you don't read along. Then ask the question about
225
+ agreeing once more.
226
+ - **“Without the typed parts”:** `kimal3 show evaluate --without-typed` — with the same
227
+ `--language` as the first time, if you set one, and with the same waiting rule as in step 9. The
228
+ timeline is rewritten, and typed text then stands as “[typed, left out]”. The person has agreed
229
+ to this version → step 11.
230
+ - **Agreed:** → step 11.
231
+ - **No:** read nothing. Say: “You can read the file yourself and describe the task to me — or I
232
+ delete the recording.”
233
+ - **The person describes it:** take the description, ask follow-up questions as in step 11,
234
+ point 4 (one at a time), and carry on with step 12 — plan and way to build it **from the
235
+ description**, without reading anything from the recording. Then step 13.
236
+ - **Delete:** step 13, the sentence **without** the plan.
237
+
238
+ ## 11. Read, retell, ask
239
+
240
+ Now — and only now — you read `zeitleiste.md`, and only this file.
241
+
242
+ 1. **Retell the task:** in numbered steps, in the **person's words** (quote what was said), each
243
+ step with the time from the timeline (`0:26`).
244
+ 2. **Look for the contradictions, explicitly.** Three sources say something about the task: the
245
+ task sentence at the top of the timeline, what the person **says**, and what they **click and
246
+ type**. Go through the task sentence part by part (what, where to, to whom, when) and ask for
247
+ each part: does the demonstration show exactly that? Then check every spoken sentence against
248
+ the click next to it. Every place where two sources differ, you name in the retelling with ⚠️ —
249
+ for example: “You clicked ‘tomorrow’, but said ‘for the current day’ — which one applies?” or
250
+ “The task sentence says ‘into a channel’, but you showed a direct message — which one applies?”
251
+ *These places are exactly why showing reveals more than describing.*
252
+ 3. **Screenshots only one by one and only after asking.** If the text isn't enough at a point (a
253
+ click without a name, a sentence pointing at something visible), ask first: “At 0:26 the text
254
+ only says ‘…’. May I look at the screen at that point?” Yes → `kimal3 show picture 0:26`; it
255
+ reports “Picture: <path>”, and you look at **only this one** picture. No → ask what was to be
256
+ seen there.
257
+ 4. **Then ask — one question at a time, always with a suggestion:** first the contradictions, one
258
+ after the other. After that, what a single demonstration can never show: **how often and when**
259
+ (“I'd guess every Monday morning — is that right?”) · **what happens in an exception** (a
260
+ public holiday, an empty list, the system can't be reached) · **who the result goes to**.
261
+
262
+ ## 12. Write it into the plan and suggest a way to build it
263
+
264
+ Write `plan/task-shown.md` with these parts:
265
+
266
+ - **Goal** in one sentence
267
+ - **The steps**, numbered
268
+ - **Rules and exceptions** from the answers
269
+ - **What is still open**
270
+ - **Where it comes from:** demonstration of <date> (or: description of <date>, if nothing was
271
+ read)
272
+
273
+ The plan carries the content **itself** and doesn't point to files in the recording — that is
274
+ about to go. Typed text that looks like access data doesn't go into it.
275
+
276
+ Then say how you **would build it**: through the programs' interfaces (fetching the data
277
+ directly, sending the message directly), **not** by re-clicking the clicks — that way it doesn't
278
+ break when a screen changes. The building doesn't happen here; it is the next step in the
279
+ project, right away or in the next session with `/k3start`.
280
+
281
+ ## 13. Deleting the recording — only after a yes
282
+
283
+ Measure the size of the recording folder and suggest, with the real values. If the task is in
284
+ the plan (step 12):
285
+
286
+ > “The recording is 12.9 MB and lies in `material/aufnahmen/2026-10-19-0912`. I'd delete it —
287
+ > the description is in the plan, and the recording contains everything you typed. What I read
288
+ > from it stays in the conversation history on this computer. Is that alright?”
289
+
290
+ If the suggestion comes without a plan (no in step 10, or “once more with test customers”), leave
291
+ out the part about the plan:
292
+
293
+ > “The recording is 12.9 MB and lies in `material/aufnahmen/2026-10-19-0912`. I'd delete it —
294
+ > the recording contains everything you typed. What I read from it stays in the conversation
295
+ > history on this computer. Is that alright?”
296
+
297
+ - **Yes:** delete **exactly this one** folder — not `material/aufnahmen/` as a whole, not the
298
+ `.gitignore` and `.ignore` next to it — and check that it is gone.
299
+ - **No:** it stays. Say where, and that it doesn't end up in Git.
300
+
301
+ Finally, in two sentences without jargon, what is now in the project, and **one** concrete next
302
+ step.