kimal3 0.7.0 → 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/claude-plugins/kimal3-plan/.claude-plugin/plugin.json +2 -2
- package/claude-plugins/kimal3-plan/hooks/erinnerung.ts +13 -9
- package/claude-plugins/kimal3-plan/hooks/lauf.ts +2 -2
- package/coach/de/kimal3-coach.md +11 -4
- package/coach/en/kimal3-coach.md +11 -4
- package/dist/texte/skill.js +12 -12
- package/package.json +1 -1
- package/skill/commands/k3feierabend.md +15 -6
- package/skill/commands/k3plan.md +32 -18
- package/skill/en/commands/k3plan.md +33 -19
- package/skill/en/commands/k3show.md +3 -1
- package/skill/en/commands/k3wrapup.md +14 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kimal3-plan",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Hält das Board der Projektseite in der App aktuell: Punkt solange die Sitzung arbeitet, Spec-Texte,
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Hält das Board der Projektseite in der App aktuell: Punkt solange die Sitzung arbeitet, Spec-Texte, hält Claude vor dem ersten Bau-Schritt an · Keeps the board on the app's project page current: dot while the session works, spec texts, stops Claude before the first build step",
|
|
5
5
|
"author": { "name": "KImal3", "url": "https://kimal3.de" },
|
|
6
6
|
"types": "./types/index.d.ts"
|
|
7
7
|
}
|
|
@@ -6,11 +6,16 @@ import { relativImOrdner } from './ordner'
|
|
|
6
6
|
* Die drei Saetze, die NUR Claude bekommt (Spec 1.3 Aufgabe 3, 1.5, 1.7, S-25, S-26, US-6, US-8; Bauplan R-4).
|
|
7
7
|
* Der Mensch sieht keinen davon (gemessen M-3, Claude-App). Zwei Wege, je nachdem, ob der Satz eine Runde starten soll:
|
|
8
8
|
*
|
|
9
|
-
* - **
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* - **Sperre vor dem ersten Bau-Schritt** (US-6, Dennis 25.10.: „Ich will das Problem gleich gefixt haben“): Will Claude
|
|
10
|
+
* eine Datei aendern, ohne dass diese Sitzung eine Story „in Arbeit“ hat, lehnt der Mod die Aenderung VORHER ab
|
|
11
|
+
* (`deny`), und Claude liest den Satz als Grund. Bis zum 25.10. kam der Satz erst NACH der Aenderung als `context` --
|
|
12
|
+
* gemessen in einer echten Sitzung: Claude schrieb zuerst die Pruefung und meldete danach. Der zweite Versuch geht
|
|
13
|
+
* durch (30-Minuten-Sperre): Eine Aenderung ohne Story (Statuszettel, neue Spec) haengt so nie fest. Nur die
|
|
14
|
+
* Hauptsitzung: Ein Subagent (`e.agentId`) baut im Auftrag und meldet nicht. Nur in einem Projektordner mit
|
|
12
15
|
* Ordnerzettel (S-30), und nur, wenn die App zuletzt „nichts in Arbeit“ gesagt hat -- weiss der Mod es nicht (noch
|
|
13
|
-
* keine Antwort, App weg),
|
|
16
|
+
* keine Antwort, App weg), haelt er nichts an. 🔴 Scheitert der Hook selbst, ueberspringt ihn die Maschine und die
|
|
17
|
+
* Aenderung laeuft (`tool.call`, Typen: „A guard that fails is skipped and the tool runs“) -- so gewollt: Ein Fehler
|
|
18
|
+
* im Mod darf die Arbeit nie aufhalten.
|
|
14
19
|
* - **Anstoss „Projekt anlegen“** (US-8) und **„gemerkte Meldungen senden“** (R-4) sind eine Zeile im Gespraech
|
|
15
20
|
* (`$.session.append`): Claude liest sie sofort und handelt.
|
|
16
21
|
*/
|
|
@@ -30,17 +35,16 @@ export function dateiAus(e: unknown): string | null {
|
|
|
30
35
|
|
|
31
36
|
export function erinnerung(on: On, lauf: Lauf): void {
|
|
32
37
|
on('tool.call', { tool: ['Write', 'Edit', 'NotebookEdit'] }, async ($, e, next) => {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
if (ergebnis.deny !== undefined || ergebnis.isError === true || e.agentId !== undefined) return ergebnis
|
|
36
|
-
const satz = await satzFuer($, lauf, dateiAus(e))
|
|
37
|
-
return satz === null ? ergebnis : { ...ergebnis, context: [...(ergebnis.context ?? []), satz] }
|
|
38
|
+
const satz = e.agentId === undefined ? await satzFuer($, lauf, dateiAus(e)) : null
|
|
39
|
+
return satz === null ? next(e) : { deny: satz }
|
|
38
40
|
})
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
async function satzFuer($: EngineInterface, lauf: Lauf, datei: string | null): Promise<string | null> {
|
|
42
44
|
const lage = lauf.lage
|
|
43
45
|
if (lauf.inArbeit !== false || lage.art !== 'projekt' || lage.zettel === null || datei === null) return null
|
|
46
|
+
// Markdown ist Planung (Spec, Bauplan, Statuszettel), kein Bau-Schritt: Eine neue Spec entsteht, bevor es eine Story gibt.
|
|
47
|
+
if (datei.toLowerCase().endsWith('.md')) return null
|
|
44
48
|
if (relativImOrdner(datei, lage.ordner, await $.session.cwd()) === null) return null
|
|
45
49
|
const jetzt = await $.clock.now()
|
|
46
50
|
const zuletzt = await read($, letzteErinnerung)
|
|
@@ -56,7 +56,7 @@ const APP = 'https://app.kimal3.de'
|
|
|
56
56
|
// Englische Befehlswoerter wie in `cli/src/befehlswoerter.ts` (`project connect`, `plan send`).
|
|
57
57
|
export const TEXTE = {
|
|
58
58
|
de: {
|
|
59
|
-
erinnerung: (titel: string) => `Du arbeitest im Projekt ${titel}, aber diese Sitzung hat keine Story ‚in Arbeit‘ gemeldet.
|
|
59
|
+
erinnerung: (titel: string) => `Halt, die Datei ist noch nicht geändert: Du arbeitest im Projekt ${titel}, aber diese Sitzung hat keine Story ‚in Arbeit‘ gemeldet. Melde zuerst die Story, an der du arbeitest, und ändere die Datei danach. Gehört die Änderung zu keiner Story, notiere sie als Thema oder versuch es einfach noch einmal.`,
|
|
60
60
|
anstoss: 'Für diesen Projektordner gibt es noch kein Projekt in der App — leg es mit `kimal3 projekt verbinden` an.',
|
|
61
61
|
gemerkt: 'Gemerkte Meldungen warten — führe `kimal3 plan senden` aus.',
|
|
62
62
|
fehler: {
|
|
@@ -66,7 +66,7 @@ export const TEXTE = {
|
|
|
66
66
|
},
|
|
67
67
|
},
|
|
68
68
|
en: {
|
|
69
|
-
erinnerung: (titel: string) => `You are working in the project ${titel}, but this session hasn't reported a story as ‘in progress’.
|
|
69
|
+
erinnerung: (titel: string) => `Stop, the file has not been changed: You are working in the project ${titel}, but this session hasn't reported a story as ‘in progress’. Report the story you're working on first, then change the file. If the change belongs to no story, note it as a topic or simply try again.`,
|
|
70
70
|
anstoss: 'There is no project in the app for this project folder yet — create it with `kimal3 project connect`.',
|
|
71
71
|
gemerkt: 'Saved reports are waiting — run `kimal3 plan send`.',
|
|
72
72
|
fehler: {
|
package/coach/de/kimal3-coach.md
CHANGED
|
@@ -88,7 +88,12 @@ nutze sie, statt vorschnell loszulegen.
|
|
|
88
88
|
|
|
89
89
|
### 3.3 Planen, jetzt konkret
|
|
90
90
|
- Was genau gebaut wird, in welchen Schritten, woran jeder Schritt geprüft wird. Bei Größerem schriftlich: eine Spec,
|
|
91
|
-
also ein Plan mit Nutzergeschichten
|
|
91
|
+
also ein Plan mit Nutzergeschichten. Jede Story steht in vier Kisten, immer in dieser Reihenfolge:
|
|
92
|
+
**User Story** („Als … will ich … damit …“; der Titel nennt das Ziel des Menschen, nicht das Ergebnis) ·
|
|
93
|
+
**Akzeptanzkriterium** (vier Zeilen: *X hat …* · *X tut …* · *Dann muss …* · *Gegenprobe: …* — ein Kriterium, das nicht
|
|
94
|
+
scheitern kann, ist keins) · **So testest du es** (nummerierte Schritte für jemanden ohne Technik: wo, was tun, was dann
|
|
95
|
+
zu sehen ist; darunter die Zeile „Passt nicht, wenn: …“; ein Befehl nur mit Ort, in Backticks) · **Technische Notiz**
|
|
96
|
+
(wo die Sache wohnt, was sie trägt — der Mensch muss sie nicht lesen). Echte Zahlen, echter Text, ein Name statt „der Nutzer“.
|
|
92
97
|
- **Ein abgesegneter Plan rechtfertigt nichts, was frische Messungen widerlegen.** Nie „der Plan sagt, das ist
|
|
93
98
|
hinnehmbar" als Begründung — sondern neu beantworten: *Was ist mit dem, was ich JETZT weiß, das Beste?* Weicht es
|
|
94
99
|
ab: laut sagen, Plan nachziehen.
|
|
@@ -151,13 +156,15 @@ Das Board in der App zeigt nur, was du meldest: Wer nicht meldet, lässt es stun
|
|
|
151
156
|
2. **Der Bau einer Spec beginnt:** die Stories, die jetzt gebaut werden, auf „in Arbeit“ — **bevor** du den ersten Bau-Schritt oder
|
|
152
157
|
einen Subagenten losschickst:
|
|
153
158
|
`{"art":"story","spec":"2026-10-24-testmonat","story":"US-1","stand":"in_arbeit"}`
|
|
154
|
-
3. **Eine Story ist gebaut und ihre Gegenproben sind gelaufen:** „gebaut“ mit Kriterien und dem `testen`-
|
|
159
|
+
3. **Eine Story ist gebaut und ihre Gegenproben sind gelaufen:** „gebaut“ mit Kriterien und dem `testen`-Text. Den Text nimmst du aus der Kiste „So testest du es“ der Story, wörtlich. Er ist eine Anleitung für jemanden ohne Technik: **eine Zeile je Schritt** (wo man es findet, was man tut, was dann zu sehen ist), **ohne** Kistenüberschrift, und **zuletzt** die Zeile „Passt nicht, wenn: …“. Die Zeilen trennst du im JSON mit `\n` — ein echter Zeilenumbruch im Text bricht das JSON, und `kimal3 plan melde` liest die Meldung nicht. Höchstens 1000 Zeichen: ist er länger, kürze die Schritte, nie mitten im Satz abschneiden. Ein Befehl nur, wenn es keinen anderen Weg gibt — dann sagst du, wo man ihn eingibt (in Claude Code im Projektordner, mit `!` davor), und setzt ihn in Backticks.
|
|
155
160
|
Beispiel:
|
|
156
|
-
`{"art":"story","spec":"2026-10-24-testmonat","story":"US-1","stand":"gebaut","kriterien":[{"text":"Startet Sabine am 1.11., endet er am 30.11.","gegenprobe":"bestanden"}],"testen":"Öffne in der App ‚Testmonat
|
|
161
|
+
`{"art":"story","spec":"2026-10-24-testmonat","story":"US-1","stand":"gebaut","kriterien":[{"text":"Startet Sabine am 1.11., endet er am 30.11.","gegenprobe":"bestanden"}],"testen":"1. Öffne in der App ‚Testmonat‘.\n2. Klick „Starten“.\n3. Darunter steht ‚Endet am 30.11.‘.\nPasst nicht, wenn: dort ein anderes Datum steht."}`
|
|
157
162
|
4. **Etwas fällt auf, das keine Spec verspricht:** `{"art":"thema","schluessel":"T-4","text":"Der Kalender könnte Feiertage zeigen"}`
|
|
158
|
-
5. **`/k3plan`:** Specs gegen den Code prüfen und jede Abweichung einzeln melden — dort steht, wie.
|
|
163
|
+
5. **`/k3plan`:** Specs gegen den Code prüfen und jede Abweichung einzeln melden — dort steht, wie. **Prüfen ist Arbeit:** Eine Story mit offenen Gegenproben (Spalte „Claude-Test offen“), die du gegen den Code prüfst, meldest du vorher als „in Arbeit“. Stories in „Dein Test“ oder „Fertig“ meldest du beim Abgleich nicht neu.
|
|
159
164
|
6. **Feierabend:** den Tag abgleichen — dort steht, wie.
|
|
160
165
|
|
|
166
|
+
🔑 **Bleibt eine Story unfertig, wenn du aufhörst** (am Ende von `/k3plan` oder im Feierabend), meldest du sie mit `--ohne-sitzung` (`kimal3 plan melde --ohne-sitzung`): Ihr Plan-Stand bleibt `in_arbeit`, aber der Punkt am Projekt leuchtet nicht weiter, obwohl das Fenster offen bleibt — auf dem Board steht sie dann in „Offen“ als angefangen.
|
|
167
|
+
|
|
161
168
|
„Gebaut“ meldest du erst nach einer Gegenprobe, die in dieser Sitzung gelaufen ist, nie aus dem Gedächtnis.
|
|
162
169
|
- **Subagenten melden nie.** Der Mod erinnert nur dich, nicht sie: Du meldest „in Arbeit“ **vor** dem Auftrag an einen Subagenten, der
|
|
163
170
|
baut, und „gebaut“ **nachdem** du sein Ergebnis geprüft hast.
|
package/coach/en/kimal3-coach.md
CHANGED
|
@@ -88,7 +88,12 @@ use them instead of starting off too quickly.
|
|
|
88
88
|
|
|
89
89
|
### 3.3 Planning, now concretely
|
|
90
90
|
- What exactly is built, in which steps, how each step is checked. For bigger things in writing: a spec,
|
|
91
|
-
that is a plan with user stories
|
|
91
|
+
that is a plan with user stories. Every story sits in four boxes, always in this order:
|
|
92
|
+
**User story** ("As … I want … so that …"; the title names the person's goal, not the result) ·
|
|
93
|
+
**Acceptance criterion** (four lines: *X has …* · *X does …* · *Then …must …* · *Counter-check: …* — a criterion that
|
|
94
|
+
cannot fail is none) · **How you test it** (numbered steps for someone without technical knowledge: where, what to do, what
|
|
95
|
+
appears; below them the line "Doesn't work if: …"; a command only with its place, in backticks) · **Technical note**
|
|
96
|
+
(where the thing lives, what carries it — the person need not read it). Real numbers, real text, a name instead of "the user".
|
|
92
97
|
- **An approved plan justifies nothing that fresh measurements refute.** Never "the plan says this is
|
|
93
98
|
acceptable" as a reason — answer anew: *What is the best thing, given what I know NOW?* If it
|
|
94
99
|
differs: say so out loud, update the plan.
|
|
@@ -151,13 +156,15 @@ The board in the app shows only what you report: if you don't, it shows "Open" f
|
|
|
151
156
|
2. **The build of a spec begins:** the stories being built now go to "in progress" — **before** you take the first build step or
|
|
152
157
|
send off a subagent:
|
|
153
158
|
`{"art":"story","spec":"2026-10-24-test-month","story":"US-1","stand":"in_arbeit"}`
|
|
154
|
-
3. **A story is built and its counter-checks have run:** "built" with criteria and the `testen`
|
|
159
|
+
3. **A story is built and its counter-checks have run:** "built" with criteria and the `testen` text. You take the text from the story's box "How you test it", word for word. It is a guide for someone without technical knowledge: **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. At most 1000 characters: if it is longer, shorten the steps, never cut off in the middle of a sentence. 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.
|
|
155
160
|
Example:
|
|
156
|
-
`{"art":"story","spec":"2026-10-24-test-month","story":"US-1","stand":"gebaut","kriterien":[{"text":"If Sabine starts on 1 Nov, it ends on 30 Nov.","gegenprobe":"bestanden"}],"testen":"In the app open 'Test month'
|
|
161
|
+
`{"art":"story","spec":"2026-10-24-test-month","story":"US-1","stand":"gebaut","kriterien":[{"text":"If Sabine starts on 1 Nov, it ends on 30 Nov.","gegenprobe":"bestanden"}],"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."}`
|
|
157
162
|
4. **Something comes up that no spec promises:** `{"art":"thema","schluessel":"T-4","text":"The calendar could show public holidays"}`
|
|
158
|
-
5. **`/k3plan`:** check the specs against the code and report every deviation individually — it says how.
|
|
163
|
+
5. **`/k3plan`:** check the specs against the code and report every deviation individually — it says how. **Checking is work:** a story with pending counter-checks (column "Claude test pending") that you check against the code, you report as "in progress" beforehand. Stories under "Your test" or "Done" you do not report again during the reconciliation.
|
|
159
164
|
6. **Wrap-up:** reconcile the day — it says how.
|
|
160
165
|
|
|
166
|
+
🔑 **If a story stays unfinished when you stop** (at the end of `/k3plan` or in the wrap-up), you report it with `--no-session` (`kimal3 plan report --no-session`): its plan state stays `in_arbeit`, but the dot at the project stops glowing although the window stays open — on the board it then sits under "Open" as started.
|
|
167
|
+
|
|
161
168
|
You report "built" only after a counter-check that ran in this session, never from memory.
|
|
162
169
|
- **Subagents never report.** The mod reminds only you, not them: you report "in progress" **before** the job to a subagent that
|
|
163
170
|
builds, and "built" **after** you have checked its result.
|
package/dist/texte/skill.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const de = {
|
|
2
2
|
// ── skillInstall ──
|
|
3
3
|
skillMissing: "Das Skill liegt nicht im Paket. Bitte kimal3 neu installieren:",
|
|
4
|
-
skillWriteFailed: (fehler) => `Das Skill
|
|
4
|
+
skillWriteFailed: (fehler) => `Das Skill ließ sich nicht schreiben: ${fehler}`,
|
|
5
5
|
skillUpdated: "✓ Skill aktualisiert.",
|
|
6
6
|
skillCreated: "✓ Skill angelegt.",
|
|
7
7
|
skillOnlyInstalled: " Das Skill ist installiert, die Slash-Befehle sind es NICHT.",
|
|
@@ -11,36 +11,36 @@ const de = {
|
|
|
11
11
|
skipped2: " sie bleibt unangetastet. Wer die kimal3-Fassung will, benennt",
|
|
12
12
|
skipped3: " die eigene um und führt den Befehl erneut aus.",
|
|
13
13
|
unreadable: (anzahl, liste) => `⚠ ${anzahl} nicht lesbar: ${liste}`,
|
|
14
|
-
unreadable1: " Diese Dateien
|
|
14
|
+
unreadable1: " Diese Dateien ließen sich nicht öffnen — vielleicht sind sie",
|
|
15
15
|
unreadable2: " gerade in Benutzung. Sie wurden nicht angefasst; ein zweiter",
|
|
16
16
|
unreadable3: " Versuch gleich kann klappen.",
|
|
17
17
|
noCommandInstalled1: " Es wurde KEIN Slash-Befehl installiert.",
|
|
18
18
|
noCommandInstalled2: " Das Skill selbst ist installiert und funktioniert.",
|
|
19
19
|
notAllWritten1: " Nicht alle Slash-Befehle konnten geschrieben werden.",
|
|
20
20
|
notAllWritten2: " Die oben genannten stehen; ein zweiter Lauf holt den Rest.",
|
|
21
|
-
runIncomplete: " Der Lauf ist damit
|
|
22
|
-
// ── die
|
|
23
|
-
watchSetUp: " Die
|
|
24
|
-
watchAlready: " Die
|
|
25
|
-
watchFailed: " Die
|
|
21
|
+
runIncomplete: " Der Lauf ist damit unvollständig -- ein zweiter Versuch holt den Rest.",
|
|
22
|
+
// ── die tägliche Prüfung (Wache) in Claudes Einstellungen ──
|
|
23
|
+
watchSetUp: " Die tägliche kimal3-Prüfung ist eingetragen. Sie meldet sich nur, wenn etwas ansteht.",
|
|
24
|
+
watchAlready: " Die tägliche kimal3-Prüfung steht schon in deinen Einstellungen.",
|
|
25
|
+
watchFailed: " Die tägliche kimal3-Prüfung konnte NICHT eingetragen werden.",
|
|
26
26
|
settingsUnreadable: (datei) => ` Deine Claude-Einstellungen sind nicht lesbar: ${datei}`,
|
|
27
|
-
settingsNotJson: " Die Datei ist kein
|
|
27
|
+
settingsNotJson: " Die Datei ist kein gültiges JSON. Sie wurde NICHT angefasst.",
|
|
28
28
|
settingsStrangeShape: " Die Datei hat eine Form, die wir nicht verstehen. Sie wurde NICHT angefasst.",
|
|
29
29
|
settingsRetryNoHelp: " Wiederholen hilft nicht -- erst die Datei in Ordnung bringen.",
|
|
30
30
|
settingsFailedLine: (datei, ursache) => ` ${datei}: ${ursache}`,
|
|
31
|
-
settingsUnchanged: " Deine bisherigen Einstellungen sind
|
|
31
|
+
settingsUnchanged: " Deine bisherigen Einstellungen sind unverändert.",
|
|
32
32
|
// Die Ursachen der vier Schritte aus einstellungen-schreiben.ts; `detail` ist die Meldung des Systems.
|
|
33
33
|
stepRead: (detail) => `nicht lesbar (${detail})`,
|
|
34
|
-
stepBackup: (detail) => `keine Sicherungskopie
|
|
34
|
+
stepBackup: (detail) => `keine Sicherungskopie möglich (${detail})`,
|
|
35
35
|
stepWrite: (detail) => `nicht schreibbar (${detail})`,
|
|
36
|
-
stepCheck: (detail) => "Kontrolle nach dem Schreiben fehlgeschlagen (" + (detail ?? "unser Eintrag steht nicht in der
|
|
36
|
+
stepCheck: (detail) => "Kontrolle nach dem Schreiben fehlgeschlagen (" + (detail ?? "unser Eintrag steht nicht in der zurückgelesenen Datei") + ")",
|
|
37
37
|
// ── der Schluss ──
|
|
38
38
|
tipK3: " Tipp /k3 in Claude Code. (Taucht nichts auf, einmal neu starten.)",
|
|
39
39
|
tipOther: (name) => ` Tipp /${name} in Claude Code. (Taucht nichts auf, einmal neu starten.)`,
|
|
40
40
|
// ── slashBefehleInstallieren ──
|
|
41
41
|
commandsMissing: "Die Slash-Befehle liegen nicht im Paket. Bitte kimal3 neu installieren.",
|
|
42
42
|
commandsNone: "Im Paket liegt kein einziger Slash-Befehl. Bitte kimal3 neu installieren.",
|
|
43
|
-
commandsWriteFailed: (fehler) => `Die Slash-Befehle
|
|
43
|
+
commandsWriteFailed: (fehler) => `Die Slash-Befehle ließen sich nicht alle schreiben: ${fehler}`,
|
|
44
44
|
// ── raeumeVeralteteAuf ──
|
|
45
45
|
outdatedRemoved: (name) => ` (Befehl /${name} entfernt: veraltet oder in einer anderen Sprache)`,
|
|
46
46
|
};
|
package/package.json
CHANGED
|
@@ -21,22 +21,31 @@ und überspring ihn — kein Leerlauf.
|
|
|
21
21
|
- **Das Board abgleichen — nur in einem Projektordner mit Projekt in der App** (sonst überspring
|
|
22
22
|
es und sag nichts). `kimal3 plan` zeigt den Stand, den die App kennt; halt ihn gegen das, was
|
|
23
23
|
heute wirklich passiert ist. Was fertig ist und dessen Gegenproben in dieser Sitzung gelaufen
|
|
24
|
-
sind, steht als `gebaut` mit Kriterien und `testen`-
|
|
25
|
-
bleibt `in_arbeit
|
|
26
|
-
Melde nur, was vom Stand abweicht
|
|
24
|
+
sind, steht als `gebaut` mit Kriterien und `testen`-Text; was angefangen und nicht fertig ist,
|
|
25
|
+
bleibt `in_arbeit` — und geht in einen **eigenen** Aufruf `kimal3 plan melde --ohne-sitzung`, getrennt von der Liste der fertigen (eine gemischte Liste ohne den Schalter bindet auch die unfertige Story an die Sitzung, und der Punkt leuchtet weiter, obwohl das Fenster nur offen steht); was heute aufgefallen ist und keine Spec verspricht, kommt als `thema` hinein.
|
|
26
|
+
Melde nur, was vom Stand abweicht: die fertigen in einer Liste mit `kimal3 plan melde` (Aufbau und Rückgabewerte:
|
|
27
27
|
Coach, Abschnitt 3.6, und `/k3plan`, Abschnitt 6; was ein Rückgabewert heißt, steht in
|
|
28
28
|
`~/.claude/skills/kimal3/SKILL.md`):
|
|
29
29
|
|
|
30
30
|
```json
|
|
31
31
|
[ { "art": "story", "spec": "2026-10-24-testmonat", "story": "US-1", "stand": "gebaut",
|
|
32
32
|
"kriterien": [ { "text": "Startet Sabine am 1.11., endet er am 30.11.", "gegenprobe": "bestanden" } ],
|
|
33
|
-
"testen": "Öffne /testmonat
|
|
34
|
-
|
|
33
|
+
"testen": "1. Öffne /testmonat.\n2. Klick „Starten“.\n3. Darunter steht „Endet am 30.11.“.\nPasst nicht, wenn: dort ein anderes Datum steht." } ]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Und was unfertig bleibt, getrennt davon, mit dem Schalter:
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
[ { "art": "story", "spec": "2026-10-24-testmonat", "story": "US-2", "stand": "in_arbeit" } ]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
echo '[ … ]' | kimal3 plan melde --ohne-sitzung
|
|
35
44
|
```
|
|
36
45
|
|
|
37
46
|
Bei Erfolg sagst du dazu nichts. Nennst du im Abschluss (Schritt 6) etwas zum Board, dann nur,
|
|
38
47
|
was **nicht** geklappt hat (eine Absage, oder gemerkt, weil die App nicht erreichbar war).
|
|
39
|
-
Der Punkt am Projekt auf der Projektseite bleibt, solange das Fenster offen ist; schließt der
|
|
48
|
+
Der Punkt am Projekt auf der Projektseite bleibt für laufende Arbeit, solange das Fenster offen ist; schließt der
|
|
40
49
|
Mensch es, ist er in unter einer Sekunde weg.
|
|
41
50
|
|
|
42
51
|
## 2. Status-Datei nachziehen — und aufräumen
|
package/skill/commands/k3plan.md
CHANGED
|
@@ -101,7 +101,7 @@ Reihenfolge.
|
|
|
101
101
|
**Der Stand je Story (`stand`):**
|
|
102
102
|
- `offen` — noch nichts gebaut.
|
|
103
103
|
- `in_arbeit` — teilweise gebaut, oder ein Befund ist offen.
|
|
104
|
-
- `gebaut` — gebaut. Das Datum setzt die App; dazu ein `testen`-
|
|
104
|
+
- `gebaut` — gebaut. Das Datum setzt die App; dazu ein `testen`-Text (Abschnitt 4).
|
|
105
105
|
- `weggelassen` — bewusst nicht gebaut, `grund` ist Pflicht (Regel 8). Nur, wenn die Spec oder
|
|
106
106
|
der Mensch das so entschieden hat — nie von dir allein, um aufzuräumen. Im Zweifel: `offen`
|
|
107
107
|
lassen und im Bericht fragen.
|
|
@@ -115,8 +115,9 @@ lesen.
|
|
|
115
115
|
- `bestanden` — **nur**, wenn die Gegenprobe in dieser Sitzung gelaufen ist und das erwartete
|
|
116
116
|
Ergebnis gezeigt hat. Nie aus dem Gedächtnis, nie vom letzten Mal, nie weil der Code „richtig
|
|
117
117
|
aussieht".
|
|
118
|
-
- `gescheitert` — sie ist gelaufen und hat etwas anderes gezeigt. Das ist ein Befund (Regel 1)
|
|
119
|
-
|
|
118
|
+
- `gescheitert` — sie ist gelaufen und hat etwas anderes gezeigt. Das ist ein Befund (Regel 1):
|
|
119
|
+
Die Story trägt damit ⚠ und steht in „In Arbeit“, solange eine Sitzung daran arbeitet, sonst in
|
|
120
|
+
„Offen“ — ihre Spec kommt nicht nach „Dein Test“.
|
|
120
121
|
- `offen` — alles, was nicht gelaufen ist: braucht einen Browser, eine Anmeldung, echte Daten
|
|
121
122
|
oder einen Menschen. Lesen zählt nur, wenn das Kriterium etwas über die Datei selbst sagt (eine
|
|
122
123
|
Datei gibt es, ein Text steht so da) — ein Verhalten beweist Lesen nicht.
|
|
@@ -127,7 +128,11 @@ mehr gebaut oder geprüft wird (die Spec steht dann in „Dein Test"). Bis dahin
|
|
|
127
128
|
bestandenen Stories in der App „Von Claude geprüft". Sag im Bericht, was fehlt, damit die
|
|
128
129
|
Gegenprobe laufen kann.
|
|
129
130
|
|
|
130
|
-
**Der `testen`-
|
|
131
|
+
**Der `testen`-Text** (bei jeder `gebaut`-Story, höchstens 1000 Zeichen) ist eine Anleitung für jemanden ohne Technik. Steht die Story in einer Spec mit der Kiste „So testest du es“, nimmst du ihn von dort, wörtlich; fehlt die Kiste, schreibst du ihn selbst. **Eine Zeile je Schritt** — wo man es findet, was man tut, was dann zu sehen ist —, **ohne** Kistenüberschrift, und **zuletzt** die Zeile „Passt nicht, wenn: …“. Im JSON trennst du die Zeilen mit `\n`: Ein echter Zeilenumbruch im Text bricht das JSON, und `kimal3 plan melde` liest die Meldung nicht. Ist der Text länger als 1000 Zeichen, kürze die Schritte — nie mitten im Satz abschneiden, die Zeile „Passt nicht, wenn: …“ muss am Ende stehen bleiben. Ein Befehl nur, wenn es keinen anderen Weg gibt — dann sagst du, wo man ihn eingibt (in Claude Code im Projektordner, mit `!` davor), und setzt ihn in Backticks. Fehlt der Text, zeigt die App: „Claude hat nicht aufgeschrieben, wie man das testet".
|
|
132
|
+
|
|
133
|
+
**Prüfen ist Arbeit.** Bevor du eine Story mit offenen Gegenproben (Spalte „Claude-Test offen“) gegen den Code prüfst, meldest du sie als `in_arbeit` **mit** der Sitzung (also ohne `--ohne-sitzung`): Solange du prüfst, leuchtet der Punkt am Projekt. Nach der Prüfung meldest du das Ergebnis (`gebaut`, oder `in_arbeit` mit Befund). Stories in „Dein Test“ oder „Fertig“ meldest du beim Abgleich **nicht** neu, auch wenn du sie durchsiehst: `in_arbeit` und danach `gebaut` setzt ihr Baudatum auf heute, und jede Meldung zeigt das Etikett „geändert“ und bei zwei Sitzungen das ⚠ „gleichzeitig geändert“. Was am Ende von `/k3plan` unfertig bleibt, meldest du mit `--ohne-sitzung` (Abschnitt 6).
|
|
134
|
+
|
|
135
|
+
**Wie eine Spec aufgebaut ist.** Findest du beim Prüfen eine Spec, die nicht so gebaut ist, sag es im Bericht — du schreibst sie nicht um. Eine Story steht darin in vier Kisten: **User Story** (der Titel nennt das Ziel des Menschen) · **Akzeptanzkriterium** (mit Gegenprobe) · **So testest du es** (nummerierte Schritte, darunter „Passt nicht, wenn: …“) · **Technische Notiz**.
|
|
131
136
|
|
|
132
137
|
**Befunde** (`befunde`): nur **offene**. `quelle: "claude"` für etwas, das die Story verspricht und
|
|
133
138
|
nicht tut, und das kein Kriterium abdeckt. `seit`: das Datum, an dem der Befund entstand. Ein
|
|
@@ -138,7 +143,7 @@ Befunde mit, nicht nur den neuen. Fehlt das Feld, bleibt die Liste, wie sie ist.
|
|
|
138
143
|
- Sie beginnt bei `1` und wird **nie** kleiner; fehlt `runde` in der Meldung, bleibt sie.
|
|
139
144
|
- **Um genau 1 erhöhen**, wenn eine Story mit einem Befund des Menschen (`quelle: "mensch"`)
|
|
140
145
|
seitdem nachgebessert wurde (Git-Verlauf, und die Gegenproben bestehen jetzt): dann
|
|
141
|
-
`befunde: []`, `stand: "gebaut"`, `runde` + 1, neuer `testen`-
|
|
146
|
+
`befunde: []`, `stand: "gebaut"`, `runde` + 1, neuer `testen`-Text. Der Mensch testet neu.
|
|
142
147
|
Ist unklar, ob nachgebessert wurde: Befund stehen lassen und im Bericht fragen.
|
|
143
148
|
- **Auch erhöhen**, wenn du eine **bestätigte** Story so geändert hast, dass der Mensch es merken
|
|
144
149
|
würde — sein altes „Passt" gilt dann nicht mehr (Regel 7).
|
|
@@ -148,11 +153,11 @@ Befunde mit, nicht nur den neuen. Fehlt das Feld, bleibt die Liste, wie sie ist.
|
|
|
148
153
|
|
|
149
154
|
Die App zeigt sie dem Menschen in genau diesem Wortlaut („So bleibt die Planung kurz"):
|
|
150
155
|
|
|
151
|
-
1. **Ein Problem wird keine neue Karte.** Hält eine Story nicht, was sie verspricht — Claudes Prüfung fällt durch oder du sagst „Passt nicht" —, hängt das Problem (Befund) an **dieser** Story
|
|
156
|
+
1. **Ein Problem wird keine neue Karte.** Hält eine Story nicht, was sie verspricht — Claudes Prüfung fällt durch oder du sagst „Passt nicht" —, hängt das Problem (Befund) an **dieser** Story. Sie steht in „Offen“, bis jemand daran arbeitet.
|
|
152
157
|
2. **Neu ist nur, was niemand versprochen hat. Das kommt in den Eingang, und der hat fünf Plätze.**
|
|
153
|
-
3. **Claude sortiert jedes Thema beim nächsten Abgleich (`/k3plan`) ein:** als neue Story in eine Spec, als Befund an eine Story, oder gestrichen mit Begründung. „Für später" gibt es nicht.
|
|
158
|
+
3. **Claude sortiert jedes Thema beim nächsten Abgleich (`/k3plan`) ein:** als neue Story in eine Spec, als Befund an eine Story, oder gestrichen mit Begründung. „Für später" gibt es nicht.
|
|
154
159
|
4. **Nichts liegt länger als 14 Tage im Eingang.**
|
|
155
|
-
5. **Höchstens eine Spec gleichzeitig in Arbeit** („In Arbeit“ und „Claude-Test offen“ zusammen). Erst fertig machen, dann die nächste beginnen.
|
|
160
|
+
5. **Höchstens eine Spec gleichzeitig in Arbeit** („In Arbeit“ und „Claude-Test offen“ zusammen). „In Arbeit“ heißt: Eine Claude-Sitzung arbeitet gerade daran. Erst fertig machen, dann die nächste beginnen.
|
|
156
161
|
6. **Höchstens fünf Stories warten auf deinen Test.** Sind es mehr, fängt Claude nichts Neues an, bis du getestet hast.
|
|
157
162
|
7. **Fertig heißt zweimal geprüft:** Claude hat alles selbst ausprobiert, und du hast „Passt" gesagt — für genau diesen Stand.
|
|
158
163
|
8. **Eine Spec ist erst abgeschlossen, wenn jede Story fertig oder bewusst weggelassen ist** — mit Grund. Einen stillen Rest gibt es nicht.
|
|
@@ -181,10 +186,9 @@ Die App zeigt sie dem Menschen in genau diesem Wortlaut („So bleibt die Planun
|
|
|
181
186
|
`gestrichen: Feiertage stehen schon im Kalender-Werkzeug.`
|
|
182
187
|
|
|
183
188
|
Für eine Notiz aus der App (`#13 · Thema`) gehört die Antwort als **ein Satz** in eine Meldung
|
|
184
|
-
`uebernommen
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
und zeigt es 14 Tage lang unter „Zuletzt eingeordnet". Nenn die Einordnung auch im Bericht.
|
|
189
|
+
`uebernommen`, **ohne** Pfeil am Anfang. Ein `Notiertes Thema` von dir ordnest du mit einer Meldung
|
|
190
|
+
`eingeordnet` ein (Schlüssel, Text wie oben, Antwort) — die App nimmt es aus den Themen heraus.
|
|
191
|
+
Die Seite zeigt die Antwort nicht; nenn die Einordnung deshalb im Bericht.
|
|
188
192
|
- **Regel 4:** Weil du bei jedem `/k3plan` alles einordnest, liegt nichts lange. Ein Thema, das
|
|
189
193
|
schon mehr als 14 Tage liegt, ordnest du **auf jeden Fall** jetzt ein.
|
|
190
194
|
- **Regel 5 und 6 — keine neue Spec beginnen**, solange eine andere Spec in Arbeit ist (eine ihrer
|
|
@@ -202,16 +206,26 @@ Die App zeigt sie dem Menschen in genau diesem Wortlaut („So bleibt die Planun
|
|
|
202
206
|
## 6. Die Meldungen
|
|
203
207
|
|
|
204
208
|
Jede Meldung ist ein JSON-Objekt, mehrere eine Liste. Sie geht über die Eingabe an
|
|
205
|
-
`kimal3 plan melde
|
|
206
|
-
`plan/projekt.json`. Prüfen ist
|
|
209
|
+
`kimal3 plan melde`; das Programm setzt die Zeit selbst, das Projekt kommt vom Ordnerzettel
|
|
210
|
+
`plan/projekt.json`. Prüfen ist Arbeit — mit der Sitzung gemeldet leuchtet auf dem Board der Punkt, solange du prüfst.
|
|
207
211
|
|
|
208
212
|
```
|
|
209
|
-
echo '[ … ]' | kimal3 plan melde
|
|
213
|
+
echo '[ … ]' | kimal3 plan melde
|
|
210
214
|
```
|
|
211
215
|
|
|
212
|
-
(In PowerShell: `'[ … ]' | kimal3 plan melde
|
|
216
|
+
(In PowerShell: `'[ … ]' | kimal3 plan melde`. Lange Texte lieber über eine Datei.) Die Beispiele
|
|
213
217
|
sind erfunden.
|
|
214
218
|
|
|
219
|
+
**Ganz am Ende** meldest du die Stories, die unfertig bleiben (in Arbeit, Befund offen), noch einmal —
|
|
220
|
+
in einem **eigenen** Aufruf mit `--ohne-sitzung`, getrennt von der Liste der fertigen: Eine gemischte
|
|
221
|
+
Liste ohne den Schalter bindet auch die unfertige Story an die Sitzung, und der Punkt leuchtet weiter.
|
|
222
|
+
Mit dem Schalter bleibt der Plan-Stand `in_arbeit`, aber der Punkt leuchtet nicht weiter, während das
|
|
223
|
+
Fenster offen bleibt — auf dem Board steht die Story dann in „Offen“ als angefangen.
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
echo '[ … ]' | kimal3 plan melde --ohne-sitzung
|
|
227
|
+
```
|
|
228
|
+
|
|
215
229
|
**Eine Spec** — beim Prüfen und wenn Stories dazukommen:
|
|
216
230
|
|
|
217
231
|
```json
|
|
@@ -227,7 +241,7 @@ sind erfunden.
|
|
|
227
241
|
```json
|
|
228
242
|
{ "art": "story", "spec": "2026-10-24-testmonat", "story": "US-1", "stand": "gebaut",
|
|
229
243
|
"kriterien": [ { "text": "Startet Sabine am 1.11., endet der Testmonat am 30.11.", "gegenprobe": "bestanden" } ],
|
|
230
|
-
"testen": "Öffne in der App ‚Testmonat
|
|
244
|
+
"testen": "1. Öffne in der App ‚Testmonat‘.\n2. Klick „Starten“.\n3. Darunter steht ‚Endet am 30.11.‘.\nPasst nicht, wenn: dort ein anderes Datum steht." }
|
|
231
245
|
```
|
|
232
246
|
|
|
233
247
|
Mit einem offenen Befund (hier von dir; `quelle: "mensch"` nur für den Satz des Menschen):
|
|
@@ -282,7 +296,7 @@ nicht, wenn die Meldung es vorschlägt.
|
|
|
282
296
|
**Höchstens fünf Zeilen**, ohne Fachjargon — und nichts über die Meldungen selbst:
|
|
283
297
|
|
|
284
298
|
- was **fertig** wurde (seit dem letzten Mal bestätigt),
|
|
285
|
-
- was **auf seinen Test wartet** (nur Stories aus Specs in „Dein Test") — mit dem `testen`-
|
|
299
|
+
- was **auf seinen Test wartet** (nur Stories aus Specs in „Dein Test") — mit dem `testen`-Text, damit er gleich loslegen kann,
|
|
286
300
|
- was im **Eingang** entschieden wurde (jedes Thema mit seiner Antwort),
|
|
287
301
|
- eine **Warnung**, wenn Regel 5 oder 6 verletzt ist: „Teste zuerst …" statt einer neuen Story,
|
|
288
302
|
- der **Link** aus `Ansehen: …`.
|
|
@@ -98,7 +98,7 @@ count `US-1`, `US-2` … yourself in their order.
|
|
|
98
98
|
**The state of each story (`stand`):**
|
|
99
99
|
- `offen` — nothing built yet.
|
|
100
100
|
- `in_arbeit` — partly built, or a finding is open.
|
|
101
|
-
- `gebaut` — built. The app sets the date; plus a `testen`
|
|
101
|
+
- `gebaut` — built. The app sets the date; plus a `testen` text (section 4).
|
|
102
102
|
- `weggelassen` — deliberately not built, `grund` is required (rule 8). Only if the spec or the
|
|
103
103
|
person decided so — never on your own to tidy up. If in doubt: leave it `offen` and ask in the
|
|
104
104
|
report.
|
|
@@ -110,8 +110,9 @@ Run the counter-check of each criterion **wherever you can**: the project's guar
|
|
|
110
110
|
|
|
111
111
|
- `bestanden` (passed) — **only** if the counter-check ran in this session and showed the
|
|
112
112
|
expected result. Never from memory, never from last time, never because the code "looks right".
|
|
113
|
-
- `gescheitert` (failed) — it ran and showed something else. That is a finding (rule 1)
|
|
114
|
-
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".
|
|
115
116
|
- `offen` (not run) — everything that did not run: needs a browser, a sign-in, real data or a
|
|
116
117
|
person. Reading only counts if the criterion says something about the file itself (a file
|
|
117
118
|
exists, a text is there as written) — reading does not prove a behaviour.
|
|
@@ -122,7 +123,11 @@ built or checked (the spec is then under "Your test"). Until then the app calls
|
|
|
122
123
|
already passed "Checked by Claude". Say in the report what is missing so the counter-check can
|
|
123
124
|
run.
|
|
124
125
|
|
|
125
|
-
**The `testen`
|
|
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).
|
|
129
|
+
|
|
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**.
|
|
126
131
|
|
|
127
132
|
**Findings** (`befunde`): only **open** ones. `quelle: "claude"` for something the story promises
|
|
128
133
|
and doesn't do, and that no criterion covers. `seit`: the date the finding came up. A `befunde`
|
|
@@ -133,7 +138,7 @@ just the new one. If the field is missing, the list stays as it is.
|
|
|
133
138
|
- It starts at `1` and **never** goes down; if a report has no `runde`, it stays.
|
|
134
139
|
- **Raise it by exactly 1** when a story with a finding from the person (`quelle: "mensch"`) has
|
|
135
140
|
been fixed since (Git history, and the counter-checks pass now): then `befunde: []`,
|
|
136
|
-
`stand: "gebaut"`, `runde` + 1, a new `testen`
|
|
141
|
+
`stand: "gebaut"`, `runde` + 1, a new `testen` text. The person tests again. If it is
|
|
137
142
|
unclear whether it was fixed: leave the finding and ask in the report.
|
|
138
143
|
- **Also raise it** if you changed a **confirmed** story in a way the person would notice — their
|
|
139
144
|
old "Works" no longer applies (rule 7).
|
|
@@ -143,11 +148,11 @@ just the new one. If the field is missing, the list stays as it is.
|
|
|
143
148
|
|
|
144
149
|
The app shows them to the person in exactly this wording ("How planning stays short"):
|
|
145
150
|
|
|
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
|
|
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.
|
|
147
152
|
2. **Only what nobody promised is new. It goes into the inbox, which has five places.**
|
|
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".
|
|
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".
|
|
149
154
|
4. **Nothing stays in the inbox longer than 14 days.**
|
|
150
|
-
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.
|
|
151
156
|
6. **At most five stories wait for your test.** If there are more, Claude starts nothing new until you have tested.
|
|
152
157
|
7. **Done means checked twice:** Claude tried everything itself, and you said "Works" — for exactly this version.
|
|
153
158
|
8. **A spec is only closed when every story is done or deliberately left out** — with a reason. There is no silent remainder.
|
|
@@ -177,10 +182,9 @@ The app shows them to the person in exactly this wording ("How planning stays sh
|
|
|
177
182
|
`dropped: public holidays are already in the calendar tool.`
|
|
178
183
|
|
|
179
184
|
For a note from the app (`#13 · Topic`), the answer goes into an `uebernommen` report as **one
|
|
180
|
-
sentence**
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
"Recently sorted" for 14 days. Name how it was sorted in the report too.
|
|
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.
|
|
184
188
|
- **Rule 4:** because you sort everything at every `/k3plan`, nothing stays long. A topic that has
|
|
185
189
|
been waiting more than 14 days is sorted now **in any case**.
|
|
186
190
|
- **Rules 5 and 6 — don't start a new spec** while another spec is in progress (one of its
|
|
@@ -188,7 +192,7 @@ The app shows them to the person in exactly this wording ("How planning stays sh
|
|
|
188
192
|
criterion or with no criteria at all), or while more than five stories are waiting for the person's test (`gebaut`, all
|
|
189
193
|
passed, no finding, not yet confirmed — **and** no story of their spec keeps the spec in progress: only then
|
|
190
194
|
is it under "Your test", and only then does the app count the story). **Tell the person what to test instead** — with the
|
|
191
|
-
`testen`
|
|
195
|
+
`testen` texts. If you sort a topic in as a new story in a spec, you do not start that spec
|
|
192
196
|
with it: it stays `offen`, and the spec does not count as in progress.
|
|
193
197
|
- **Rule 7:** only the person sets "Done", with "Works" in the app; a report has no field for it.
|
|
194
198
|
You only keep the round stable (section 4).
|
|
@@ -196,17 +200,27 @@ The app shows them to the person in exactly this wording ("How planning stays sh
|
|
|
196
200
|
|
|
197
201
|
## 6. The reports
|
|
198
202
|
|
|
199
|
-
A report is a JSON object, several are a list. It goes through the input to `kimal3 plan report
|
|
203
|
+
A report is a JSON object, several are a list. It goes through the input to `kimal3 plan report`;
|
|
200
204
|
the program sets the time itself, and the project comes from the folder note
|
|
201
|
-
`plan/projekt.json`. Checking is
|
|
205
|
+
`plan/projekt.json`. Checking is work — reported with the session, the dot on the board glows while you check.
|
|
202
206
|
|
|
203
207
|
```
|
|
204
|
-
echo '[ … ]' | kimal3 plan report
|
|
208
|
+
echo '[ … ]' | kimal3 plan report
|
|
205
209
|
```
|
|
206
210
|
|
|
207
|
-
(In PowerShell: `'[ … ]' | kimal3 plan report
|
|
211
|
+
(In PowerShell: `'[ … ]' | kimal3 plan report`. For long texts, use a file.) The examples are
|
|
208
212
|
made up.
|
|
209
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
|
|
222
|
+
```
|
|
223
|
+
|
|
210
224
|
**A spec** — when checking, and when stories are added:
|
|
211
225
|
|
|
212
226
|
```json
|
|
@@ -222,7 +236,7 @@ made up.
|
|
|
222
236
|
```json
|
|
223
237
|
{ "art": "story", "spec": "2026-10-24-test-month", "story": "US-1", "stand": "gebaut",
|
|
224
238
|
"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'
|
|
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." }
|
|
226
240
|
```
|
|
227
241
|
|
|
228
242
|
With an open finding (here from you; `quelle: "mensch"` only for the person's sentence):
|
|
@@ -276,7 +290,7 @@ message suggests it.
|
|
|
276
290
|
**At most five lines**, without jargon — and nothing about the reports themselves:
|
|
277
291
|
|
|
278
292
|
- what became **done** (confirmed since last time),
|
|
279
|
-
- what is **waiting for their test** (only stories from specs under "Your test") — with the `testen`
|
|
293
|
+
- what is **waiting for their test** (only stories from specs under "Your test") — with the `testen` text so they can start right away,
|
|
280
294
|
- what was decided in the **inbox** (each topic with its answer),
|
|
281
295
|
- a **warning** if rule 5 or 6 is broken: "Test first …" instead of a new story,
|
|
282
296
|
- the **link** from `View: …`.
|
|
@@ -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
|
|
@@ -21,21 +21,30 @@ and skip it — no filler.
|
|
|
21
21
|
- **Reconcile the board — only in a project folder that has a project in the app** (otherwise skip
|
|
22
22
|
it and say nothing). `kimal3 plan` shows the state the app knows; hold it against what really
|
|
23
23
|
happened today. What is done and whose counter-checks ran in this session is `gebaut` with
|
|
24
|
-
criteria and a `testen`
|
|
25
|
-
up today and no spec promises goes in as a `thema`. Report only what differs from that state
|
|
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
26
|
one list with `kimal3 plan report` (format and exit codes: the coach, section 3.6, and
|
|
27
27
|
`/k3plan`, section 6; what an exit code means is in `~/.claude/skills/kimal3/SKILL.md`):
|
|
28
28
|
|
|
29
29
|
```json
|
|
30
30
|
[ { "art": "story", "spec": "2026-10-24-test-month", "story": "US-1", "stand": "gebaut",
|
|
31
31
|
"kriterien": [ { "text": "If Sabine starts on 1 Nov, it ends on 30 Nov.", "gegenprobe": "bestanden" } ],
|
|
32
|
-
"testen": "Open /test-month
|
|
33
|
-
|
|
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
|
|
34
43
|
```
|
|
35
44
|
|
|
36
45
|
On success you say nothing about it. If you mention the board in the wrap-up (step 6), then only
|
|
37
46
|
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
|
|
47
|
+
project on the project page stays for work in progress, as long as the window is open; when the person closes it, it
|
|
39
48
|
is gone in under a second.
|
|
40
49
|
|
|
41
50
|
## 2. Update the status file — and tidy it up
|