kimal3 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +10 -4
  2. package/claude-plugins/.claude-plugin/marketplace.json +2 -1
  3. package/claude-plugins/README.md +2 -0
  4. package/claude-plugins/kimal3-logo/.claude-plugin/plugin.json +1 -1
  5. package/claude-plugins/kimal3-logo/hooks/app-oeffnen.ts +37 -9
  6. package/claude-plugins/kimal3-logo/hooks/register.tsx +1 -1
  7. package/claude-plugins/kimal3-plan/.claude-plugin/plugin.json +7 -0
  8. package/claude-plugins/kimal3-plan/hooks/erinnerung.ts +79 -0
  9. package/claude-plugins/kimal3-plan/hooks/fehlerzeile.ts +41 -0
  10. package/claude-plugins/kimal3-plan/hooks/hooks.json +1 -0
  11. package/claude-plugins/kimal3-plan/hooks/lauf.ts +143 -0
  12. package/claude-plugins/kimal3-plan/hooks/lebenszeichen.ts +197 -0
  13. package/claude-plugins/kimal3-plan/hooks/ordner.ts +141 -0
  14. package/claude-plugins/kimal3-plan/hooks/register.tsx +22 -0
  15. package/claude-plugins/kimal3-plan/hooks/spec-text.ts +45 -0
  16. package/claude-plugins/kimal3-plan/types/index.d.ts +10 -0
  17. package/coach/de/kimal3-coach.md +33 -0
  18. package/coach/en/kimal3-coach.md +33 -0
  19. package/dist/argumente.js +12 -0
  20. package/dist/atomar.js +22 -0
  21. package/dist/befehle/einrichten.js +4 -4
  22. package/dist/befehle/login.js +2 -2
  23. package/dist/befehle/plan-hoch.js +8 -0
  24. package/dist/befehle/plan-melde.js +105 -0
  25. package/dist/befehle/plan-senden.js +149 -0
  26. package/dist/befehle/plan.js +45 -10
  27. package/dist/befehle/projekt-verbinden.js +141 -0
  28. package/dist/befehle/skill-install.js +2 -2
  29. package/dist/befehle-katalog-en.js +6 -6
  30. package/dist/befehle-katalog.js +8 -7
  31. package/dist/befehlswoerter.js +9 -0
  32. package/dist/einstellungen-schreiben.js +1 -1
  33. package/dist/kimal3.js +22 -0
  34. package/dist/meldungen-speicher.js +189 -0
  35. package/dist/{logo-ablegen.js → mods-ablegen.js} +29 -18
  36. package/dist/plugins-mischen.js +7 -2
  37. package/dist/projekt-ordner.js +189 -0
  38. package/dist/texte/einrichten.js +3 -1
  39. package/dist/texte/meldungen.js +127 -0
  40. package/dist/texte/plan.js +42 -22
  41. package/package.json +1 -1
  42. package/skill/commands/k3feierabend.md +20 -0
  43. package/skill/commands/k3plan.md +151 -211
  44. package/skill/en/commands/k3plan.md +157 -219
  45. package/skill/en/commands/k3wrapup.md +19 -0
@@ -1,122 +1,107 @@
1
1
  ---
2
- description: Die Specs gegen den Code prüfen und die Planung in die App hochladen
2
+ description: Die Specs gegen den Code prüfen und jede Abweichung dem Board in der App melden
3
3
  ---
4
4
 
5
5
  <!-- kimal3:erzeugt — diese Datei wird von `kimal3 skill install` gepflegt und bei
6
6
  jedem Update ueberschrieben. Eigene Aenderungen gehen dabei verloren; wer sie
7
7
  behalten will, kopiert die Datei unter einem anderen Namen. -->
8
- # Planung prüfen und hochladen
8
+ # Planung prüfen und melden
9
9
 
10
10
  ## 1. Wozu
11
11
 
12
- Du prüfst die User Stories in den Specs dieses Projekts gegen den Code und lädst **nur das
13
- Ergebnis** in die App hoch — nie den Code. Dort sieht der Mensch auf der Projektseite (Reiter
14
- „Planung"), was offen ist, was auf seinen Test wartet und was fertig ist, und urteilt mit
15
- „Passt" oder „Passt nicht".
12
+ Du prüfst die User Stories in den Specs dieses Projekts gegen den Code und **meldest jede
13
+ Abweichung einzeln** an die App — nie den Code, und seit Fassung 0.7.0 keine ganze Datei mehr. Dort
14
+ sieht der Mensch auf der Projektseite (Reiter „Planung", das Board), was offen ist, was auf seinen
15
+ Test wartet und was fertig ist, und urteilt mit „Passt" oder „Passt nicht".
16
16
 
17
- Arbeite die Abschnitte der Reihe nach ab. Die Regeln (Abschnitt 5) und das Dateiformat
18
- (Abschnitt 6) brauchst du schon ab Abschnitt 2 — lies sie zuerst. Was ein Rückgabewert von
19
- `kimal3` heißt, steht in **`~/.claude/skills/kimal3/SKILL.md`, Abschnitt „Rückgabewerte"**;
20
- diese Datei wiederholt es nicht.
17
+ Arbeite die Abschnitte der Reihe nach ab. Die Regeln (Abschnitt 5) und die Meldungen (Abschnitt 6)
18
+ brauchst du schon ab Abschnitt 2 — lies sie zuerst. Was ein Rückgabewert von `kimal3` heißt, steht
19
+ in **`~/.claude/skills/kimal3/SKILL.md`, Abschnitt „Rückgabewerte"**; diese Datei wiederholt es
20
+ nicht.
21
21
 
22
- 🔑 **`/k3plan` prüft, ordnet ein und lädt hoch — es baut nichts.** Was nachzubessern ist, steht
22
+ 🔑 **`/k3plan` prüft, ordnet ein und meldet — es baut nichts.** Was nachzubessern ist, steht
23
23
  danach als Befund an der Story; gebaut wird, wenn der Mensch es sagt.
24
24
 
25
- ## 2. Rückmeldungen holen
25
+ ## 2. Den Stand holen
26
26
 
27
- Arbeite im **Projektordner** (dort, wo Specs und Code liegen). Die Datei heißt immer
28
- `plan/stand.json`, relativ zu diesem Ordner.
27
+ Arbeite im **Projektordner** (ein Ordner direkt in `werkbank-…/projekte/`). Der Stand liegt in der
28
+ App, nicht in einer Datei:
29
29
 
30
30
  ```
31
31
  kimal3 plan
32
32
  ```
33
33
 
34
- **Kommt `Im Ordner liegt keine plan/stand.json.`**, ist es das erste Mal (oder du stehst im
35
- falschen Ordner — prüf das zuerst):
36
-
37
- 1. `kimal3 projekt liste` — such das Projekt, um das es hier geht. Gibt es **kein** passendes,
38
- frag den Menschen, welches gemeint ist, und schlag `/k3projekt <was du gebaut hast>` vor:
39
- Ohne Eintrag im Erfolgsprofil gibt es keine Projektseite. Hier aufhören, nichts erfinden.
40
- 2. Leg `plan/stand.json` an, mit dem Namen **genau so, wie die Liste ihn schreibt**:
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 und Zeitpunkt sind ein Beispiel.) `projekt_id` und `basis` trägt `kimal3 plan hoch`
56
- nach dem ersten Hochladen selbst ein — **lass sie bei `null`**.
57
- 3. `kimal3 plan` noch einmal.
34
+ **Kommt `Dieser Ordner ist noch mit keinem Projekt in der App verbunden.`**, leg das Projekt an:
35
+ `kimal3 projekt verbinden` (der Coach, Abschnitt 3.6, sagt, was dabei zu tun ist), dann `kimal3 plan`
36
+ noch einmal. Kommt `Hier ist kein Projektordner …`, stehst du im falschen Ordner — prüf das zuerst
37
+ und melde nichts.
38
+
39
+ **Liegt im Ordner eine `plan/stand.json`**, sag dem Menschen **einmal**: „Die Datei
40
+ plan/stand.json wird nicht mehr gebraucht — der Stand liegt in der App. Du kannst sie löschen."
41
+ Du löschst sie nicht selbst.
58
42
 
59
43
  **Was die Ausgabe heißt** (Beispiel, erfundene Werte):
60
44
 
61
45
  ```
46
+ Spec 2026-09-23-content-planer · Content-Planer als Seite (plan/2026-09-23-content-planer-seite-spec.md)
47
+ US-1 · gebaut · Runde 1 · Beiträge anlegen
48
+ US-2 · in Arbeit · Runde 1 · Beiträge im Kalender verschieben
49
+ Notiertes Thema T-3: Export als PDF
62
50
  #12 · passt nicht · 2026-09-23-content-planer / US-2 (Runde 1): Beim Ziehen springt er auf Dienstag
63
51
  #13 · Thema: Kalender soll Feiertage zeigen
64
52
  Bestätigt: 2026-09-23-content-planer / US-1 (Runde 1)
65
53
  Ansehen: https://app.kimal3.de/projekt/…
66
54
  ```
67
55
 
56
+ - `Spec <Schlüssel> · <Titel> (<Datei>)` und darunter je Story `<Schlüssel> · <Stand> · Runde n ·
57
+ <Titel>` — der Stand, den die App kennt. **Die Schlüssel von hier sind bindend** (Abschnitt 3).
58
+ - `Notiertes Thema <Schlüssel>: …` — ein Thema, das **Claude** früher notiert hat. → Regel 3.
68
59
  - `#12 · passt nicht · <Spec> / <Story> (Runde n): <Satz>` — der Mensch hat die Story getestet,
69
60
  sie hält nicht. → Regel 1 in Abschnitt 5. Die Nummer brauchst du später für `uebernommen`.
70
61
  - `#13 · Thema: <Satz>` — etwas Neues, das er in der App notiert hat. → Regel 3.
71
62
  - `Bestätigt: …` — für diese Stories hat er in **dieser** Runde „Passt" gesagt; sie sind fertig.
72
63
  Ein „Passt" musst du nicht übernehmen.
73
64
  - `Ansehen: …` — der Link zur Planung. Merk ihn dir für den Bericht.
65
+ - `Noch keine Planung in der App.` — es ist das erste Mal; weiter mit Abschnitt 3, alle Specs sind neu.
74
66
  - `Keine offenen Rückmeldungen.` — nichts zu übernehmen; weiter mit Abschnitt 3.
75
67
 
76
- **Absagen:**
77
- - `Kein Projekt heißt „…“. Deine Projekte: … Trag den Namen in plan/stand.json genau so ein.` —
78
- übernimm den passenden Namen **wörtlich** aus der Liste in `"projekt"`. Passen zwei, frag.
79
- - `Mehrere deiner Projekte heißen „…“ (Nummern: …).` — frag den Menschen, welches gemeint ist, und
80
- trag dessen Nummer als `"projekt_id"` ein.
81
- - `Die Projektnummer in plan/stand.json gehört zu keinem deiner Projekte.` — die Nummer stammt aus
82
- einem kopierten Ordner oder einem gelöschten Projekt. Setz `"projekt_id"` auf `null` (die Zeile
83
- bleibt stehen, das Feld ist Pflicht); dann sucht kimal3 nach dem Namen. Das ist der **einzige**
84
- Fall, in dem du `projekt_id` selbst änderst.
85
- - `Der Plan ist nicht lesbar: plan/stand.json enthält kein gültiges JSON-Objekt.` — Klammern oder
86
- Kommas in der Datei reparieren.
68
+ **Absagen** stehen als ganzer Satz auf der Fehlerausgabe (Rückgabewert `1`): Lies sie, sag dem
69
+ Menschen, was dort steht, und wiederhole nicht blind. Meldet `kimal3 plan` `3` (App nicht
70
+ erreichbar), versuch es einmal später noch einmal.
87
71
 
88
72
  ## 3. Specs finden
89
73
 
90
74
  Such im Projektordner in **`docs/superpowers/specs/`**, **`plan/`** und **`docs/specs/`** nach
91
75
  Markdown-Dateien mit User Stories („Als … will ich … damit …", oft `US-1`, `US-2`, mit
92
- Akzeptanzkriterien und Gegenprobe). `plan/stand.json` selbst, Statuszettel und Aufgabenlisten
93
- sind keine Specs.
76
+ Akzeptanzkriterien und Gegenprobe). `plan/stand.json`, `plan/projekt.json`, Statuszettel und
77
+ Aufgabenlisten sind keine Specs.
94
78
 
95
- Je Spec ein Eintrag in `specs`, je User Story ein Eintrag in `stories`, je Akzeptanzkriterium
96
- ein Eintrag in `kriterien` (kurz gefasst, höchstens 500 Zeichen: Ausgangslage → Handlung →
97
- Ergebnis).
79
+ Je Spec eine Meldung `spec` mit ihren Stories, je Akzeptanzkriterium ein Eintrag in `kriterien`
80
+ (kurz gefasst, höchstens 500 Zeichen: Ausgangslage → Handlung → Ergebnis).
98
81
 
99
82
  🔴 **Die Schlüssel sind bindend.** Die App hängt jedes „Passt" und „Passt nicht" an
100
- Spec-Schlüssel + Story-Schlüssel + Runde. Steht eine Spec oder Story schon in `plan/stand.json`,
101
- **übernimm ihren Schlüssel unverändert** — ein umbenannter Schlüssel lässt das Urteil des
102
- Menschen verschwinden. Neu: Spec-Schlüssel = Dateiname ohne `.md`; Story-Schlüssel = die Nummer
103
- aus der Spec (`US-3`); nummeriert die Spec nicht, zähl selbst `US-1`, `US-2` … in ihrer
83
+ Spec-Schlüssel + Story-Schlüssel + Runde. Steht eine Spec oder Story schon in der Ausgabe von
84
+ `kimal3 plan`, **übernimm ihren Schlüssel unverändert** — ein umbenannter Schlüssel lässt das
85
+ Urteil des Menschen verschwinden. Neu: Spec-Schlüssel = Dateiname ohne `.md`; Story-Schlüssel = die
86
+ Nummer aus der Spec (`US-3`); nummeriert die Spec nicht, zähl selbst `US-1`, `US-2` … in ihrer
104
87
  Reihenfolge.
105
88
 
106
- - `titel`: die Überschrift der Spec bzw. der Story. `datei`: der Pfad der Spec im Projektordner (relativ, endet auf `.md`; sonst `null`). Den **Text** der Spec
107
- liest `kimal3 plan hoch` aus dieser Datei und schickt ihn mit — Pfade außerhalb des Projektordners
108
- liest es nicht.
89
+ - `titel`: die Überschrift der Spec bzw. der Story. `datei`: der Pfad der Spec im Projektordner
90
+ (relativ, endet auf `.md`; sonst `null`). Den **Text** der Spec lädt der Mod `kimal3-plan` beim
91
+ Schreiben der Datei hoch, `kimal3 plan melde` holt ihn nach, wenn die Datei vor der Meldung
92
+ geschrieben wurde — Pfade außerhalb des Projektordners liest es nicht.
109
93
  - Der Story-Schlüssel ist **derselbe wie in der Überschrift der Spec**, wo die Spec ihre Stories
110
94
  nummeriert (`### US-3 · …` → `US-3`): Die App findet die Story im Spec-Text über diesen Schlüssel.
111
95
  - Eine Spec ohne Stories kommt mit `"stories": []` hinein; sag es im Bericht.
112
96
  - Grenzen: höchstens 50 Specs, 60 Stories je Spec, 400 zusammen. Sind es mehr, frag den
113
97
  Menschen, welche Specs hineingehören.
98
+ - Eine Story, die du nicht mehr in der Spec findest, **entfernst du nicht** — eine Meldung kann
99
+ keine Story löschen. Meld sie als `weggelassen` mit Grund, wenn die Spec das so entschieden hat.
114
100
 
115
- **Der Stand je Story:**
101
+ **Der Stand je Story (`stand`):**
116
102
  - `offen` — noch nichts gebaut.
117
- - `in_arbeit` — teilweise gebaut, oder ein Befund ist offen. `gebaut_am` ist dann `null`.
118
- - `gebaut` — gebaut. `gebaut_am`: das Datum, an dem **diese Runde** fertig wurde (`JJJJ-MM-TT`);
119
- dazu ein `testen`-Satz (Abschnitt 4).
103
+ - `in_arbeit` — teilweise gebaut, oder ein Befund ist offen.
104
+ - `gebaut` — gebaut. Das Datum setzt die App; dazu ein `testen`-Satz (Abschnitt 4).
120
105
  - `weggelassen` — bewusst nicht gebaut, `grund` ist Pflicht (Regel 8). Nur, wenn die Spec oder
121
106
  der Mensch das so entschieden hat — nie von dir allein, um aufzuräumen. Im Zweifel: `offen`
122
107
  lassen und im Bericht fragen.
@@ -136,23 +121,24 @@ lesen.
136
121
  oder einen Menschen. Lesen zählt nur, wenn das Kriterium etwas über die Datei selbst sagt (eine
137
122
  Datei gibt es, ein Text steht so da) — ein Verhalten beweist Lesen nicht.
138
123
 
139
- ⚠️ Eine Story mit einem `offen`-Kriterium steht in „Claude-Test offen", und der Mensch kann sie
140
- noch nicht testen. Sag im Bericht, was fehlt, damit die Gegenprobe laufen kann.
124
+ ⚠️ Eine Story mit einem `offen`-Kriterium steht in „Claude-Test offen" — und mit ihr die ganze Spec.
125
+ Der Mensch testet eine Spec erst als Ganzes: Knöpfe bekommt er nur, wenn an keiner Story der Spec
126
+ mehr gebaut oder geprüft wird (die Spec steht dann in „Dein Test"). Bis dahin heißen die schon
127
+ bestandenen Stories in der App „Von Claude geprüft". Sag im Bericht, was fehlt, damit die
128
+ Gegenprobe laufen kann.
141
129
 
142
- **Der `testen`-Satz** (bei jeder `gebaut`-Story, höchstens 1000 Zeichen) nennt die **Adresse oder
143
- den Befehl** und **was dort zu sehen sein muss**, zum Beispiel: „Starte `npm run dev`, öffne
144
- http://localhost:3000/kalender und zieh den Beitrag vom Montag auf den Mittwoch — er steht danach
145
- am Mittwoch." Ohne ihn zeigt die App: „Claude hat nicht aufgeschrieben, wie man das testet".
130
+ **Der `testen`-Satz** (bei jeder `gebaut`-Story, höchstens 1000 Zeichen) ist eine Anleitung für jemanden ohne Technik. Er sagt wo man es findet, was man tut, was dann zu sehen ist, woran man merkt, dass es nicht stimmt. 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. Ohne Befehl: „Öffne in der App ‚Kennzahlen‘ und klick auf den Beitrag vom 14.10. — dort steht ‚4.210 gesehen‘. Steht dort eine leere Zelle, sag ‚Passt nicht‘.“ Mit Befehl: „Tippe in Claude Code im Projektordner `! node wortzaehler.js beispiel.txt` — es erscheinen fünf Zeilen, oben ‚der (4)‘. Kommt eine Fehlermeldung, sag ‚Passt nicht‘.“ Fehlt der Satz, zeigt die App: „Claude hat nicht aufgeschrieben, wie man das testet".
146
131
 
147
132
  **Befunde** (`befunde`): nur **offene**. `quelle: "claude"` für etwas, das die Story verspricht und
148
- nicht tut, und das kein Kriterium abdeckt. `seit`: das Datum, an dem der Befund entstand — steht
149
- er schon in der Datei, bleibt sein altes Datum.
133
+ nicht tut, und das kein Kriterium abdeckt. `seit`: das Datum, an dem der Befund entstand. Ein
134
+ `befunde`-Feld in einer Meldung **ersetzt** die Liste der Story — schick also alle noch offenen
135
+ Befunde mit, nicht nur den neuen. Fehlt das Feld, bleibt die Liste, wie sie ist.
150
136
 
151
137
  **Die Runde** bindet ein Urteil an einen Bau-Stand — wie ein Stempel auf einer Fassung:
152
- - Sie beginnt bei `1` und wird **nie** kleiner.
138
+ - Sie beginnt bei `1` und wird **nie** kleiner; fehlt `runde` in der Meldung, bleibt sie.
153
139
  - **Um genau 1 erhöhen**, wenn eine Story mit einem Befund des Menschen (`quelle: "mensch"`)
154
140
  seitdem nachgebessert wurde (Git-Verlauf, und die Gegenproben bestehen jetzt): dann
155
- `befunde: []`, `stand: "gebaut"`, neues `gebaut_am`, neuer `testen`-Satz. Der Mensch testet neu.
141
+ `befunde: []`, `stand: "gebaut"`, `runde` + 1, neuer `testen`-Satz. Der Mensch testet neu.
156
142
  Ist unklar, ob nachgebessert wurde: Befund stehen lassen und im Bericht fragen.
157
143
  - **Auch erhöhen**, wenn du eine **bestätigte** Story so geändert hast, dass der Mensch es merken
158
144
  würde — sein altes „Passt" gilt dann nicht mehr (Regel 7).
@@ -162,187 +148,141 @@ er schon in der Datei, bleibt sein altes Datum.
162
148
 
163
149
  Die App zeigt sie dem Menschen in genau diesem Wortlaut („So bleibt die Planung kurz"):
164
150
 
165
- 1. **Ein Befund ist keine neue Karte.** Hält eine Story nicht, was sie verspricht — Claudes Gegenprobe scheitert oder du sagst „Passt nicht" —, hängt der Befund an **dieser** Story, und ihre Spec geht zurück nach „In Arbeit“.
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, und ihre Spec geht zurück nach „In Arbeit“.
166
152
  2. **Neu ist nur, was niemand versprochen hat. Das kommt in den Eingang, und der hat fünf Plätze.**
167
- 3. **Claude ordnet jedes Thema beim nächsten `/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. Was daraus wurde, steht unter „Zuletzt eingeordnet".
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. Was daraus wurde, steht unter „Von Claude einsortiert".
168
154
  4. **Nichts liegt länger als 14 Tage im Eingang.**
169
155
  5. **Höchstens eine Spec gleichzeitig in Arbeit** („In Arbeit“ und „Claude-Test offen“ zusammen). Erst fertig machen, dann die nächste beginnen.
170
156
  6. **Höchstens fünf Stories warten auf deinen Test.** Sind es mehr, fängt Claude nichts Neues an, bis du getestet hast.
171
- 7. **Fertig heißt zweimal geprüft:** Claudes Gegenproben bestanden, und du hast „Passt" gesagt — für genau diesen Stand.
157
+ 7. **Fertig heißt zweimal geprüft:** Claude hat alles selbst ausprobiert, und du hast „Passt" gesagt — für genau diesen Stand.
172
158
  8. **Eine Spec ist erst abgeschlossen, wenn jede Story fertig oder bewusst weggelassen ist** — mit Grund. Einen stillen Rest gibt es nicht.
173
159
 
174
- **Was du danach tust:**
160
+ **Was du danach tust** (jedes Mal eine Meldung, Abschnitt 6):
175
161
 
176
- - **Regel 1 — jedes `passt nicht` aus `kimal3 plan`:** Gibt es die Story noch, häng den Satz des
177
- Menschen als Befund an sie (`{ "text": "<sein Satz>", "quelle": "mensch", "seit": "<heute>" }`),
178
- `stand: "in_arbeit"`, `gebaut_am: null`. Ist sie seitdem schon nachgebessert, stattdessen
179
- Runde + 1 und `befunde: []` (Abschnitt 4). Dazu in `uebernommen`:
180
- `{ "rueckmeldung": 12, "antwort": "Befund an US-2" }`. Gibt es die Story nicht mehr, sagt die
181
- `antwort`, warum. ⚠️ Ohne Befund von `mensch` und ohne höhere Runde lehnt der Server das
182
- Hochladen ab.
162
+ - **Regel 1 — jedes `passt nicht` aus `kimal3 plan`:** Gibt es die Story noch, melde sie mit dem Satz
163
+ des Menschen als Befund (`quelle: "mensch"`, `seit: "<heute>"`) und `stand: "in_arbeit"`, und
164
+ gleich dahinter in derselben Liste `uebernommen` mit der Nummer: `{ "art": "uebernommen",
165
+ "rueckmeldung": 12, "antwort": "Befund an US-2" }`. Ist sie seitdem schon nachgebessert,
166
+ stattdessen `runde` + 1, `befunde: []` und `stand: "gebaut"` (Abschnitt 4). Gibt es die Story
167
+ nicht mehr, sagt die `antwort`, warum. ⚠️ Ohne Befund von `mensch` und ohne höhere Runde lehnt
168
+ die App die Übernahme ab.
183
169
  - **Regel 2 — Neues:** Was dir beim Prüfen auffällt oder der Mensch im Gespräch sagt und was
184
- **keine** Spec verspricht, kommt nach `themen`:
185
- `{ "schluessel": "T-1", "text": "…", "quelle": "claude" | "mensch", "seit": "<heute>" }`.
186
- Nimm die nächste freie Nummer, auch über `eingeordnet` hinweg (dort bleibt ein Schlüssel
187
- 14 Tage belegt). Die fünf Plätze teilen sich `themen` und die offenen Notizen aus der App.
188
- - **Regel 3 — einordnen:** Jedes `Thema` aus `kimal3 plan` **und** jedes Thema, das schon von
189
- früher in `themen` steht, ordnest du **jetzt** ein — eins von dreien:
170
+ **keine** Spec verspricht, meldest du als `thema`. Nimm die nächste freie Nummer (`T-4` nach
171
+ `T-3`) — und denk daran, dass ein eingeordnetes Thema seinen Schlüssel 14 Tage lang behält:
172
+ Sagt die App, ein Schlüssel komme doppelt vor, nimm die nächste Nummer. Die fünf Plätze teilen
173
+ sich deine Themen und die offenen Notizen aus der App.
174
+ - **Regel 3 — einordnen:** Jedes `Thema` aus `kimal3 plan` **und** jedes `Notiertes Thema` ordnest
175
+ du **jetzt** ein — eins von dreien:
190
176
  - **neue Story:** schreib sie in die Spec, zu der sie gehört (User Story, Akzeptanzkriterium mit
191
- Gegenprobe), und in `plan/stand.json` mit `stand: "offen"`. Passt keine Spec, frag, wohin.
192
- Antwort: `neue Story US-7 in „Content-Planer“`.
177
+ Gegenprobe), und melde die Spec mit der neuen Story (`stand` bleibt `offen`; es genügt die
178
+ neue, die alten bleiben). Passt keine Spec, frag, wohin. Antwort: `neue Story US-7 in „Content-Planer“`.
193
179
  - **Befund an eine Story:** wie bei Regel 1. Antwort: `Befund an US-2 in „Content-Planer“`.
194
180
  - **gestrichen:** Antwort `gestrichen: <Grund in einem Satz>`, zum Beispiel
195
181
  `gestrichen: Feiertage stehen schon im Kalender-Werkzeug.`
196
182
 
197
- Für eine Notiz aus der App gehört die Antwort als **ein Satz** in `uebernommen` (die App zeigt
198
- sie unter „Zuletzt eingeordnet" als `<Notiz> → <Antwort>`); schreib sie darum **ohne** Pfeil
199
- am Anfang. Ein Thema aus der Datei nimmst du aus `themen` heraus und schreibst es mit seiner
200
- Antwort nach `eingeordnet`: `{ "schluessel": "T-4", "text": "<Text wie in themen>", "antwort":
201
- "<ein Satz>", "am": "<heute>" }` — die App zeigt es 14 Tage lang unter „Zuletzt eingeordnet".
202
- Einträge, deren `am` mehr als 14 Tage zurückliegt, nimmst du dabei heraus. Nenn die Einordnung
203
- auch im Bericht.
204
- - **Regel 4:** Weil du bei jedem `/k3plan` alles einordnest, liegt nichts lange. Ein Thema mit
205
- `seit` vor mehr als 14 Tagen ordnest du **auf jeden Fall** jetzt ein.
183
+ Für eine Notiz aus der App (`#13 · Thema`) gehört die Antwort als **ein Satz** in eine Meldung
184
+ `uebernommen` (die App zeigt sie unter „Zuletzt eingeordnet" als `<Notiz> → <Antwort>`); schreib
185
+ sie darum **ohne** Pfeil am Anfang. Ein `Notiertes Thema` von dir ordnest du mit einer Meldung
186
+ `eingeordnet` ein (Schlüssel, Text wie oben, Antwort) — die App nimmt es aus den Themen heraus
187
+ und zeigt es 14 Tage lang unter „Zuletzt eingeordnet". Nenn die Einordnung auch im Bericht.
188
+ - **Regel 4:** Weil du bei jedem `/k3plan` alles einordnest, liegt nichts lange. Ein Thema, das
189
+ schon mehr als 14 Tage liegt, ordnest du **auf jeden Fall** jetzt ein.
206
190
  - **Regel 5 und 6 — keine neue Spec beginnen**, solange eine andere Spec in Arbeit ist (eine ihrer
207
191
  Stories ist `in_arbeit`, hat einen Befund oder eine gescheiterte Gegenprobe, oder ist `gebaut`
208
192
  mit einem `offen`-Kriterium oder ganz ohne Kriterien), oder solange mehr als fünf Stories auf den Test des Menschen
209
- warten (`gebaut`, alles bestanden, kein Befund, noch nicht bestätigt). **Sag dem Menschen
193
+ warten (`gebaut`, alles bestanden, kein Befund, noch nicht bestätigt — **und** keine Story ihrer Spec hält die Spec
194
+ noch in Arbeit: Nur dann steht sie in „Dein Test", und nur dann zählt die App die Story). **Sag dem Menschen
210
195
  stattdessen, was er testen soll** — mit den `testen`-Sätzen. Ordnest du ein Thema als neue Story
211
196
  in eine Spec ein, beginnst du sie damit nicht: Sie steht `offen`, und die Spec gilt nicht als in
212
197
  Arbeit.
213
- - **Regel 7:** „Fertig" setzt nur der Mensch mit „Passt" in der App; in der Datei gibt es dafür kein
198
+ - **Regel 7:** „Fertig" setzt nur der Mensch mit „Passt" in der App; eine Meldung hat dafür kein
214
199
  Feld. Du hältst nur die Runde stabil (Abschnitt 4).
215
200
  - **Regel 8:** `weggelassen` nur mit `grund` (Abschnitt 3).
216
201
 
217
- ## 6. Die Datei
202
+ ## 6. Die Meldungen
218
203
 
219
- `plan/stand.json` steht unter Git. Beispiel, gekürzt:
204
+ Jede Meldung ist ein JSON-Objekt, mehrere eine Liste. Sie geht über die Eingabe an
205
+ `kimal3 plan melde --ohne-sitzung`; das Programm setzt die Zeit selbst, das Projekt kommt vom Ordnerzettel
206
+ `plan/projekt.json`. Prüfen ist nicht Arbeiten — so leuchtet auf dem Board kein Punkt.
220
207
 
221
- ```json
222
- {
223
- "format": 1,
224
- "projekt": "LinkedIn Content-App",
225
- "projekt_id": null,
226
- "basis": null,
227
- "geprueft_am": "2026-10-21T22:10:00+02:00",
228
- "specs": [
229
- {
230
- "schluessel": "2026-09-23-content-planer",
231
- "titel": "Content-Planer als Seite",
232
- "datei": "plan/2026-09-23-content-planer-seite-spec.md",
233
- "stories": [
234
- {
235
- "schluessel": "US-2",
236
- "titel": "Beiträge im Kalender verschieben",
237
- "stand": "gebaut",
238
- "runde": 1,
239
- "gebaut_am": "2026-10-21",
240
- "kriterien": [
241
- { "text": "Beitrag vom Montag auf Mittwoch ziehen → steht am Mittwoch", "gegenprobe": "bestanden" }
242
- ],
243
- "befunde": [],
244
- "testen": "Öffne /kalender, zieh den Beitrag vom Montag auf den Mittwoch.",
245
- "grund": null
246
- }
247
- ]
248
- }
249
- ],
250
- "themen": [
251
- { "schluessel": "T-1", "text": "Kalender soll Feiertage zeigen", "quelle": "mensch", "seit": "2026-10-21" }
252
- ],
253
- "uebernommen": [
254
- { "rueckmeldung": 12, "antwort": "Befund an US-2" }
255
- ],
256
- "eingeordnet": [
257
- { "schluessel": "T-2", "text": "Export als PDF", "antwort": "gestrichen: Der Drucken-Knopf kann das schon.", "am": "2026-10-21" }
258
- ]
259
- }
208
+ ```
209
+ echo '[ … ]' | kimal3 plan melde --ohne-sitzung
260
210
  ```
261
211
 
262
- **Die Felder** — jedes muss da sein, auch wenn es `null` oder leer ist (nur `eingeordnet` darf
263
- fehlen); ein unbekanntes Feld (ein Tippfehler wie `"befund"`) lehnt der Server ab:
264
-
265
- - `format`: genau `1`.
266
- - `projekt`: der Name wie in der App, 1–200 Zeichen.
267
- - `projekt_id`, `basis`: am Anfang `null`; danach schreibt sie `kimal3 plan hoch` — **nie von Hand
268
- ändern**. Einzige Ausnahme: die Absage „Die Projektnummer in plan/stand.json gehört zu keinem
269
- deiner Projekte." — dann `projekt_id` auf `null` setzen (Abschnitt 2).
270
- - `geprueft_am`: jetzt, mit Zeitzone (`date +%Y-%m-%dT%H:%M:%S%:z` in der Bash, `Get-Date -Format
271
- "yyyy-MM-ddTHH:mm:sszzz"` in PowerShell).
272
- - `specs[]`: `schluessel` (eindeutig, 1–80 Zeichen), `titel` (1–200), `datei` (Pfad oder `null`),
273
- `stories[]`.
274
- - `stories[]`: `schluessel` (eindeutig in ihrer Spec), `titel`, `stand` (`offen` · `in_arbeit` ·
275
- `gebaut` · `weggelassen`), `runde` (1–999), `gebaut_am` (`JJJJ-MM-TT` bei `gebaut`, sonst
276
- `null`), `kriterien[]`, `befunde[]`, `testen` (Satz oder `null`), `grund` (Pflicht bei
277
- `weggelassen`, sonst `null`).
278
- - `kriterien[]`: `{ "text", "gegenprobe": "bestanden" | "gescheitert" | "offen" }`, höchstens 30
279
- je Story.
280
- - `befunde[]`: `{ "text", "quelle": "claude" | "mensch", "seit": "JJJJ-MM-TT" }` — nur offene,
281
- höchstens 20.
282
- - `themen[]`: `{ "schluessel", "text", "quelle", "seit" }`, höchstens 50 (der Eingang hat fünf
283
- Plätze, Regel 2).
284
- - `uebernommen[]`: `{ "rueckmeldung": <Nummer aus kimal3 plan>, "antwort": "<ein Satz>" }`. Leert
285
- `kimal3 plan hoch` nach dem Hochladen selbst.
286
- - `eingeordnet[]`: `{ "schluessel", "text", "antwort": "<ein Satz>", "am": "JJJJ-MM-TT" }`, höchstens
287
- 50 — Themen aus `themen`, die du eingeordnet hast (Regel 3). Ein Schlüssel steht nie zugleich in
288
- `themen` und `eingeordnet`.
289
- - Die ganze Datei: höchstens 300 KB.
290
-
291
- ## 7. Hochladen
292
-
293
- Erst der Probelauf — er prüft alles und speichert nichts:
212
+ (In PowerShell: `'[ … ]' | kimal3 plan melde --ohne-sitzung`. Lange Texte lieber über eine Datei.) Die Beispiele
213
+ sind erfunden.
294
214
 
295
- ```
296
- kimal3 plan hoch --probe
215
+ **Eine Spec** — beim Prüfen und wenn Stories dazukommen:
216
+
217
+ ```json
218
+ { "art": "spec", "schluessel": "2026-10-24-testmonat", "titel": "Testmonat",
219
+ "datei": "docs/superpowers/specs/2026-10-24-testmonat-design.md",
220
+ "stories": [ { "schluessel": "US-1", "titel": "Der Testmonat startet" },
221
+ { "schluessel": "US-2", "titel": "Der Testmonat endet" },
222
+ { "schluessel": "US-3", "titel": "Export des Testmonats" } ] }
297
223
  ```
298
224
 
299
- `Probelauf: würde 9 Stories hochladen, 2 Rückmeldungen als übernommen melden. Gespeichert wurde
300
- nichts.` (Zahlen als Beispiel.) **Vergleich die zweite Zahl** mit den offenen Rückmeldungen aus
301
- `kimal3 plan`: Ist sie kleiner, hast du eine vergessen — sie bliebe in der App unter „Wartet auf
302
- Claude".
225
+ **Eine Story** — eine Abweichung, ein Eintrag. Gebaut, mit Gegenprobe:
226
+
227
+ ```json
228
+ { "art": "story", "spec": "2026-10-24-testmonat", "story": "US-1", "stand": "gebaut",
229
+ "kriterien": [ { "text": "Startet Sabine am 1.11., endet der Testmonat am 30.11.", "gegenprobe": "bestanden" } ],
230
+ "testen": "Öffne in der App ‚Testmonat‘ und klick „Starten“ — darunter steht ‚Endet am 30.11.‘. Steht dort ein anderes Datum, sag ‚Passt nicht‘." }
231
+ ```
303
232
 
304
- Dann:
233
+ Mit einem offenen Befund (hier von dir; `quelle: "mensch"` nur für den Satz des Menschen):
305
234
 
235
+ ```json
236
+ { "art": "story", "spec": "2026-10-24-testmonat", "story": "US-2", "stand": "in_arbeit",
237
+ "befunde": [ { "text": "Am 30.11. fehlt die Erinnerungsmail, die die Spec verspricht.", "quelle": "claude", "seit": "2026-10-23" } ] }
306
238
  ```
307
- kimal3 plan hoch
239
+
240
+ Bewusst weggelassen (`grund` ist Pflicht):
241
+
242
+ ```json
243
+ { "art": "story", "spec": "2026-10-24-testmonat", "story": "US-3", "stand": "weggelassen", "grund": "Die Spec streicht den Export." }
308
244
  ```
309
245
 
310
- Geklappt hat es bei `✓ Planung für „…“ hochgeladen: … Stories, … warten auf deinen Test.` und
311
- `Ansehen: …`; beim ersten Mal zusätzlich `projekt_id und basis stehen jetzt in plan/stand.json.`
312
- Die CLI hat `projekt_id` und `basis` eingetragen und `uebernommen` geleert — lass die Datei so.
313
- Sag dem Menschen, dass `plan/stand.json` geändert ist und in den nächsten Commit gehört.
246
+ **Ein Thema** (Regel 2), **ein Thema von dir einordnen** (Regel 3), **eine Rückmeldung des Menschen
247
+ übernehmen** (Regel 1 und 3):
248
+
249
+ ```json
250
+ { "art": "thema", "schluessel": "T-4", "text": "Der Kalender könnte Feiertage zeigen" }
251
+ { "art": "eingeordnet", "schluessel": "T-3", "text": "Export als PDF", "antwort": "gestrichen: Der Drucken-Knopf kann das schon." }
252
+ { "art": "uebernommen", "rueckmeldung": 12, "antwort": "Befund an US-2" }
253
+ ```
314
254
 
315
- Danach steht eine Zeile `Spec-Texte hochgeladen: 1 von 3. Ohne Text: …` — der Text der Specs geht mit hoch.
316
- Eine Spec ohne Text ist ein **Hinweis, kein Fehlschlag** (Rückgabewert `0`): Nenn dem Menschen die
317
- Specs, die in der Klammer stehen, und was zu tun ist (Pfad in `datei` berichtigen; über 300 KB
318
- lässt sich nicht hochladen; bei „alle Spec-Texte zusammen größer als 4 MB" ist keine Datei allein
319
- zu groß — die größten bleiben draußen, bis der Rest passt).
255
+ **Was das Programm zurückgibt:** Bei Erfolg schweigt es (`0`) — und **du auch**: Sag dem Menschen
256
+ nicht, dass du gemeldet hast. `1` — die App hat abgesagt oder die Eingabe war unlesbar; der Satz
257
+ auf der Fehlerausgabe sagt warum. Meldungen, die er nicht nennt, sind angekommen. `3` — die App
258
+ ist nicht erreichbar; die Meldung ist **gemerkt** und geht beim nächsten Befehl mit
259
+ (`kimal3 plan senden` schickt sie sofort) — nicht noch einmal schicken. `2` — nicht mehr
260
+ angemeldet: Sag dem Menschen `kimal3 login`; die Meldung ist gemerkt.
320
261
 
321
- **Absagen — die Meldung lesen, beheben, Probelauf, noch einmal:**
262
+ **Absagen — die Meldung lesen, beheben, noch einmal:**
322
263
 
323
264
  | Meldung beginnt mit | Was du tust |
324
265
  |---|---|
325
- | `Der Plan ist nicht lesbar: <Ort> …` | Die Stelle (`specs[0].stories[2].stand`) in der Datei reparieren. |
326
- | `Kein Projekt heißt …` · `Mehrere deiner Projekte heißen …` · `Die Projektnummer in plan/stand.json gehört zu keinem deiner Projekte.` | Wie in Abschnitt 2. Bei der Projektnummer darfst du `projekt_id` auf `null` setzen — nur hier. |
327
- | `<Spec> / <Story> hat Runde 1, gespeichert ist schon Runde 2.` | Die Datei ist älter als der gespeicherte Stand. Runde auf den gespeicherten Wert setzen — nie kleiner. |
266
+ | `Die Meldung zu <Story> von <Uhrzeit> kam zu spät an …` | Eine andere Sitzung oder der Mensch hat die Story danach geändert. **Nicht erneut senden.** `kimal3 plan` zeigt den heutigen Stand; melde nur, was dann noch fehlt. |
267
+ | `Die Spec … gibt es in diesem Projekt noch nicht.` · `… hat keine Story …` | Melde zuerst die Spec mit ihren Stories (Abschnitt 6, „Eine Spec"), dann die Story. |
268
+ | `Meldung Nr. 2 ist nicht lesbar (meldung).` | Die Meldung hat ein falsches Feld oder fehlt eines — gegen die Beispiele oben halten. Geschickt wurde nichts. |
269
+ | `<Spec> / <Story> hat Runde 1, gespeichert ist schon Runde 2.` | Deine Runde ist älter als die gespeicherte. Mit der gespeicherten oder höher noch einmal — nie kleiner. |
328
270
  | `Rückmeldung 12 gibt es in diesem Projekt nicht oder steht zweimal …` | Nur Nummern aus `kimal3 plan`, jede einmal. |
329
- | `Rückmeldung 12 („…“) ist als übernommen gemeldet, aber US-2 hat keinen Befund von dir …` | Den Befund mit `quelle: "mensch"` an die Story hängen (Regel 1) — oder Runde + 1, wenn nachgebessert ist. |
330
- | `In der App liegt ein neuerer Plan (hochgeladen …).` | Eine andere Arbeitskopie hat hochgeladen. **Nicht überschreiben.** Sag es dem Menschen und frag, ob ihr deren Stand erst holt (Git) und neu prüft. `kimal3 plan hoch --ueberschreiben` **nur nach seinem ausdrücklichen Ja.** |
331
- | `Die gespeicherte Planung in der App ist beschädigt …` | Auch hier `--ueberschreiben` **nur nach seinem Ja.** |
332
- | `Die Planung ist gespeichert, aber die Rückmeldungen sind noch nicht als übernommen markiert.` | `kimal3 plan hoch` **unverändert** noch einmal — das ist harmlos, die CLI hat `basis` schon nachgetragen und `uebernommen` stehen lassen. |
333
- | ``Die Planung ist gespeichert, aber die Spec-Texte nicht. Führ `kimal3 plan hoch` noch einmal aus.`` | `kimal3 plan hoch` **unverändert** noch einmal — der Plan steht schon in der App, die CLI hat `basis` nachgetragen. |
334
- | `⚠ Die Planung ist gespeichert, aber plan/stand.json ließ sich nicht nachtragen. Trag selbst ein: …` | Genau diese Werte in die Datei schreiben. |
335
- | `… ließ sich gerade nicht laden` / `… nicht speichern` | Einmal wiederholen; klappt es dann nicht, dem Menschen sagen. |
271
+ | `Rückmeldung 12 („…“) ist als übernommen gemeldet, aber US-2 hat keinen Befund von dir …` | Erst die Story mit dem Befund `quelle: "mensch"` melden (Regel 1) — oder `runde` + 1, wenn nachgebessert ist — dann `uebernommen`. |
272
+ | `Der Plan ist nicht lesbar: <Ort> …` | Die genannte Stelle der Meldung berichtigen (Länge, `grund` bei `weggelassen`, doppelter Schlüssel). |
273
+ | `Die Meldung ist angekommen, der Text von <Datei> aber nicht …` | Die Meldung noch einmal schicken — doppelt schadet nicht. Passt der Text nicht mehr (über 300 KB), sag es dem Menschen. |
274
+ | `Die Meldungen sind gespeichert, aber noch nicht ganz vermerkt.` | Noch einmal schicken — doppelt schadet nicht. |
275
+ | `Die gespeicherte Planung in der App ist beschädigt …` | Sag es dem Menschen. `kimal3 plan hoch --ueberschreiben` ersetzt die Planung durch eine ganze Datei `plan/stand.json` — **nur nach seinem ausdrücklichen Ja.** |
336
276
 
337
- 🔴 **`--ueberschreiben` ersetzt, was ein anderer hochgeladen hat.** Nie aus eigenem Entschluss,
338
- auch nicht, wenn die Meldung es vorschlägt.
277
+ 🔴 **`--ueberschreiben` ersetzt, was andere gemeldet haben.** Nie aus eigenem Entschluss, auch
278
+ nicht, wenn die Meldung es vorschlägt.
339
279
 
340
- ## 8. Dem Menschen berichten
280
+ ## 7. Dem Menschen berichten
341
281
 
342
- **Höchstens fünf Zeilen**, ohne Fachjargon:
282
+ **Höchstens fünf Zeilen**, ohne Fachjargon — und nichts über die Meldungen selbst:
343
283
 
344
284
  - was **fertig** wurde (seit dem letzten Mal bestätigt),
345
- - was **auf seinen Test wartet** — mit dem `testen`-Satz, damit er gleich loslegen kann,
285
+ - was **auf seinen Test wartet** (nur Stories aus Specs in „Dein Test") — mit dem `testen`-Satz, damit er gleich loslegen kann,
346
286
  - was im **Eingang** entschieden wurde (jedes Thema mit seiner Antwort),
347
287
  - eine **Warnung**, wenn Regel 5 oder 6 verletzt ist: „Teste zuerst …" statt einer neuen Story,
348
288
  - der **Link** aus `Ansehen: …`.