fix: demo corpus follows the decided project pages - three states, seed with their items, fixtures re-recorded (#156)
CI / verify (push) Successful in 1m53s
Release / release (push) Successful in 36s

Files changed:
- CHANGES.md
- VERSION
- instructions/dev/tracker-testing.md
- kb/gtd/INDEX.md
- kb/gtd/technik/Aufgabenverwaltung mit Tracker-Anbindung.md
- kb/gtd/technik/Chemenu 8.0.0 - Installation und Windows.md
- kb/gtd/technik/Chemenu 8.0.0 freigeben.md
- kb/gtd/technik/Reproduktionslauf des Korpus.md
- kb/gtd/technik/Windows nativ unterstützen.md
- kb/index.md
- kb/log.md
- tools/chemenu/tests/fixtures/sp/MANIFEST.json
- tools/chemenu/tests/fixtures/sp/api/projects.json
- tools/chemenu/tests/fixtures/sp/api/tags.json
- tools/chemenu/tests/fixtures/sp/api/tasks.json
- tools/chemenu/tests/fixtures/sp/seed-backup.json
- tools/chemenu/tests/test_sp_recorded.py
This commit is contained in:
torben committed 2026-09-30 14:39:32 +02:00
1 parent dea98d4bc0
commit 40413f966d
17 files changed
+444 -135

No files matched your search

+25 -3
View File
@@ -59,7 +59,7 @@ concern - readable here, never shipped as something to parse.
--- ---
## 8.0.0-beta.3 - 2026-09-30 - Live tracker suite: WIKITOOL_TASKS_CONFIG override, real-tracker tests for Super Productivity and CalDAV, nightly workflow and test image ## 8.0.0-beta.4 - 2026-09-30 - Demo corpus follows the decided project pages: three states, seed with their items (#156)
**Author:** Torben Nehmer **Author:** Torben Nehmer
@@ -108,8 +108,28 @@ concern - readable here, never shipped as something to parse.
- cli.py: removed a stale duplicate help-patch line outside the typer._click fallback's try (Gitea #148) - cli.py: removed a stale duplicate help-patch line outside the typer._click fallback's try (Gitea #148)
- new: concept/source record notes name their layout-computed subdirectory; source usage names its required fields (Gitea #150) - new: concept/source record notes name their layout-computed subdirectory; source usage names its required fields (Gitea #150)
- new_page/type_resolver comments no longer claim only entities declare a layout: - new_page/type_resolver comments no longer claim only entities declare a layout:
- Demo corpus follows the decided project pages: three states, seed with their items (#156)
<!-- /wikitool:bumps --> <!-- /wikitool:bumps -->
### Demo corpus follows the decided project pages: three states, seed with their items (Gitea #156)
The first build of the live tracker suite shipped two demo project pages whose names came from a
draft seed rather than from the decision the operator had made. This replaces them with the
decided three, one per `state:` the weekly review treats differently:
`Chemenu 8.0.0 - Installation und Windows` (active), `Aufgabenverwaltung mit Tracker-Anbindung`
(completed) and `Reproduktionslauf des Korpus` (dormant).
- **Seed backup.** Rebuilt by starting Super Productivity on the three projects, filing the
items through wikitool's own writer and keeping the backup the app then wrote itself: eight
open items in the active project, one of them `waiting` with an overdue follow-up, and one
someday item. `MANIFEST.json` names the one edit made after the app wrote it - the REST API
cannot file a backlog item, so that item was moved there in the backup.
- **Recorded answers** re-recorded against 19.1.0 from the new seed. `test_sp_recorded.py` now
checks the demo projects too - counts, the waiting item and its date, the someday item - on
both read paths.
- `review` against the seed reports `waiting_overdue` for the waiting item and stays quiet on the
completed and the dormant project, which is the join the demo exists to show.
### Live tracker suite: WIKITOOL_TASKS_CONFIG override, real-tracker tests for Super Productivity and CalDAV, nightly workflow and test image (Gitea #156) ### Live tracker suite: WIKITOOL_TASKS_CONFIG override, real-tracker tests for Super Productivity and CalDAV, nightly workflow and test image (Gitea #156)
The task-tracker adapters were only ever tested against fakes, which is how #162 stayed hidden. The task-tracker adapters were only ever tested against fakes, which is how #162 stayed hidden.
@@ -141,8 +161,10 @@ workflow against a real tracker, and the machinery to run it on a clock.
agent dispatches the nightly run, what a red night means and how to refresh the fixtures; agent dispatches the nightly run, what a red night means and how to refresh the fixtures;
`testing-conventions.md` names the live suite as the one deliberate exception to the hermetic `testing-conventions.md` names the live suite as the one deliberate exception to the hermetic
default. `docs verify` gained an ignore canary for `.wikitool-tasks.d/`. default. `docs verify` gained an ignore canary for `.wikitool-tasks.d/`.
- **Demo corpus.** `kb/gtd/technik/` gains two project pages taken from the Windows and release - **Demo corpus.** `kb/gtd/technik/` gains three project pages taken from this repository's own
work, matching projects in the seed backup, so `review` has something to join. work, one per `state:` the weekly review treats differently (active, completed, dormant); the
seed backup carries matching projects with their items, so `review` has something to join. The
first build shipped two differently named pages; the entry below corrects them.
The Docker package `chemenu-sp-live` has to be linked to this repository once, by hand, after the The Docker package `chemenu-sp-live` has to be linked to this repository once, by hand, after the
first image build. first image build.
+1 -1
View File
@@ -1 +1 @@
8.0.0-beta.3 8.0.0-beta.4
+7 -3
View File
@@ -167,8 +167,10 @@ job `continue-on-error` to get a green night: a red night with a cause is the pr
## Refreshing the fixtures ## Refreshing the fixtures
`tools/chemenu/tests/fixtures/sp/api/*.json` are the raw answers of a real Super Productivity; `tools/chemenu/tests/fixtures/sp/api/*.json` are the raw answers of a real Super Productivity;
`seed-backup.json` is a backup the app wrote itself, with the three projects the live suite and `seed-backup.json` is a backup the app wrote itself, holding the marker project the live suite
the demo pages use. `MANIFEST.json` says which version and when. Refresh them when a red night writes into and the demo projects - with their items - that the `kb/gtd/` pages of the same
names join against. `MANIFEST.json` says which version and when, and names the one edit made to
the backup after the app wrote it. Refresh them when a red night
shows a new answer shape, and when the manifest's version is more than a few releases behind. shows a new answer shape, and when the manifest's version is more than a few releases behind.
1. Get a Super Productivity to record from: the current `chemenu-sp-live` image with the 1. Get a Super Productivity to record from: the current `chemenu-sp-live` image with the
@@ -183,7 +185,9 @@ shows a new answer shape, and when the manifest's version is more than a few rel
3. Update `MANIFEST.json` (`sp_version`, `recorded`) by hand - it is a fixture, not a generated 3. Update `MANIFEST.json` (`sp_version`, `recorded`) by hand - it is a fixture, not a generated
page - and run `test_sp_recorded.py`. If the seed backup is stale because the app's backup page - and run `test_sp_recorded.py`. If the seed backup is stale because the app's backup
format moved, rebuild it from a backup the new version wrote and keep the three projects. format moved, rebuild it the same way: start the new version on the old seed, let it write
its own backup, and keep the projects and items `test_sp_recorded.py` expects. A
`kb/gtd/` page's name and the demo project's name must stay equal - the join is by name.
4. Do not edit the recorded answers to make a test pass. A test that fails against a fresh 4. Do not edit the recorded answers to make a test pass. A test that fails against a fresh
recording is the adapter's problem. recording is the adapter's problem.
+4 -3
View File
@@ -2,12 +2,13 @@
# kb/gtd/ - Index # kb/gtd/ - Index
2 page(s). Regenerated by `wikitool index rebuild`. 3 page(s). Regenerated by `wikitool index rebuild`.
## Technik ## Technik
| Page | Type | Summary | Last Modified | | Page | Type | Summary | Last Modified |
|------|------|---------|----------------| |------|------|---------|----------------|
| [[Chemenu 8.0.0 freigeben]] | technik | Die Beta-Reihe 8.0.0 wird zum Release gemacht; offen ist, was zwischen letztem Kandidaten und Freigabe noch geklärt sein muss. | 2026-09-30 | | [[Aufgabenverwaltung mit Tracker-Anbindung]] | technik | Projektgedächtnis in kb/, Aufgaben in einem austauschbaren Tracker, verbunden nur über den Projektnamen und den Wochenrückblick. | 2026-09-30 |
| [[Windows nativ unterstützen]] | technik | Chemenu läuft auf Windows nativ unter PowerShell 7, ohne WSL und ohne Windows PowerShell 5.1. | 2026-09-30 | | [[Chemenu 8.0.0 - Installation und Windows]] | technik | Chemenu 8.0.0 wird nur noch aus einem Release installiert, auch auf Windows nativ unter PowerShell 7 - ohne WSL und ohne Windows PowerShell 5.1. | 2026-09-30 |
| [[Reproduktionslauf des Korpus]] | technik | kb/ einmal aus raw/ neu kompilieren, mit dem Bestand vergleichen, in Zahlen berichten und das Ergebnis verwerfen. | 2026-09-30 |
@@ -0,0 +1,53 @@
---
type: types/project.md
state: completed
responsibility: technik
created: 2026-09-30
modified: 2026-09-30
related:
- see-also: Chemenu
sources: []
provenance: general
summary: Projektgedächtnis in kb/, Aufgaben in einem austauschbaren Tracker, verbunden nur über den Projektnamen und den Wochenrückblick.
---
# Aufgabenverwaltung mit Tracker-Anbindung
**Status:** Completed
**Bereich:** Technik
## Ziel
Kleine Projekte jeder Art lassen sich mit [[Chemenu]] führen: Beschreibung, Stand und Wissen eines Vorhabens stehen in `kb/`, die offenen Aufgaben - eigene und solche, auf die man wartet - in einem Aufgaben-Tracker. Ein Wochenrückblick verbindet beides.
## Kontext
Gesucht war kein weiteres Todo-Werkzeug, sondern die Verbindung zwischen Verpflichtungen und dem Projektgedächtnis. Der Entwurf und seine Entscheidungen stehen in [Gitea-Issue 119](https://gitea.nehmer.net/torben/chemenu/issues/119), die Provider-Schicht mit dem Super-Productivity-Adapter in [Gitea-Issue 124](https://gitea.nehmer.net/torben/chemenu/issues/124).
## Beteiligte
Torben Nehmer hat die Entscheidungen getroffen und den Provider für die private Instanz gewählt.
## Status
Abgeschlossen. Ausgeliefert sind der Seitentyp `project` mit der Collection `kb/gtd/`, eine austauschbare Provider-Schicht mit einem Adapter für Super Productivity, der Wochenrückblick `wikitool review` mit fünf Prüfungen, `wikitool new project` und der Skill für den Rückblick. Ein zweiter Provider für die berufliche Instanz ist als eigenes Vorhaben ausgegliedert.
## Entscheidungen
- Wissen und Verpflichtung haben verschiedene Halbwertszeiten und gehören in verschiedene Schichten: `kb/` besitzt das Projektgedächtnis, der Tracker die Aufgaben.
- Kein Sync in irgendeine Richtung. Die einzige Kopplung ist der Projektname, und der Abgleich passiert zur Lesezeit im Rückblick, ohne Zustand zu speichern.
- Der Name trägt damit die Pflichten eines Identifiers: vor der Anlage eindeutig, und der Rückblick meldet Projekte ohne Gegenstück in beide Richtungen.
- Die Projektseite fasst die Aufgabenliste nie zusammen. Der Stand im Tracker ist Momentzustand, die Seite dauerhafte Charakterisierung.
- Der Zugriff läuft ausschließlich über die `wikitool`-CLI, nicht über MCP: Die Gates sind Exit-Codes, und eine MCP-Schicht müsste sie in Prosa zurückübersetzen.
- Eine Instanz hat genau einen Provider; drei Lebensbereiche heißen drei Instanzen.
## Gelerntes
Super Productivity hält seinen Zustand auf dem Desktop nicht in einer lesbaren Datenbankdatei. Gelesen wird deshalb das jüngste Backup, das die App selbst schreibt.
Die lokale REST-API von Super Productivity kann keine Projekte anlegen. Statt eines Umwegs wurde daraus ein bewusster Schritt für den Menschen, den das Werkzeug danach selbst nachprüft.
<!-- wikitool:links -->
## Beziehungen
- **see-also:** [[Chemenu]]
<!-- /wikitool:links -->
@@ -0,0 +1,52 @@
---
type: types/project.md
state: active
responsibility: technik
created: 2026-09-30
modified: 2026-09-30
related:
- see-also: Chemenu
sources: []
provenance: general
summary: Chemenu 8.0.0 wird nur noch aus einem Release installiert, auch auf Windows nativ unter PowerShell 7 - ohne WSL und ohne Windows PowerShell 5.1.
---
# Chemenu 8.0.0 - Installation und Windows
**Status:** Active
**Bereich:** Technik
## Ziel
Chemenu 8.0.0 ist freigegeben: Installiert wird nur noch aus einem Release, und das funktioniert auf Windows nativ unter PowerShell 7 genauso wie auf Linux und macOS - ohne WSL, ohne Windows PowerShell 5.1 und ohne Handarbeit an der Distribution selbst. Eine bestehende Instanz wechselt per `dist upgrade --latest` darauf.
## Kontext
Anlass war eine Installation von [[Chemenu]] auf einem verwalteten Windows-Arbeitsplatz über den damaligen Weg D (private Instanz mit Upstream). Der Agent wich dabei nach WSL aus, patchte lokal und pushte am Ende an `publish` vorbei. Die Auswertung dieses Laufs, die Entscheidungen D1-D31 und der Schnitt in Arbeitspakete stehen in [Gitea-Issue 140](https://gitea.nehmer.net/torben/chemenu/issues/140).
## Beteiligte
Torben Nehmer entscheidet über Umfang und Reihenfolge, liefert die Prüfpunkte vom Windows-Zielsystem und gibt das Release frei. Ein Agent bereitet die Kandidaten vor und schreibt den Changelog.
## Status
Die Entscheidungen sind vollständig getroffen und in Arbeitspakete geschnitten; das Vorhaben läuft als eine Reihe von Kandidaten `8.0.0-beta.N`. Was sich ohne Windows-Rechner bauen lässt, ist davon unabhängig; die Windows-Teile hängen an den Prüfpunkten vom Zielsystem.
## Entscheidungen
- Nur Weg A, der Release-Download. Weg B, C und D sowie `upstream merge/verify` entfallen - eine zweite Windows-Sonderbahn wäre eine zweite Kopie der Regeln.
- PowerShell 7 ist die einzige unterstützte Shell unter Windows; Windows PowerShell 5.1 und WSL sind kein Zielpfad.
- Kein Agent installiert Abhängigkeiten, auch nicht mit Zustimmung: Was fehlt, meldet der Preflight mit Exit-Code 42, und der Nutzer entscheidet.
- Seitentitel müssen auf Windows und macOS gültige, eindeutige Dateinamen ergeben; die Regel wird hart durchgesetzt.
- Alles erscheint in einem Release 8.0.0 statt in einem Zwischenrelease. Die Freigabe selbst (`version release`) führt kein Agent aus.
## Gelerntes
Pfade, die ein Test auf einem Linux-Rechner nie sieht - Laufwerksbuchstaben, Groß- und Kleinschreibung, Zeichen, die in einem Dateinamen verboten sind - fallen erst auf, wenn die Regel dafür im Werkzeug selbst steht.
Lücken in einer Anleitung füllt ein Agent selbst, und zwar mit Ausweichen: neue Session-IDs gegen das Budget-Gate, `git reset --hard`, ein Push an `publish` vorbei. Dagegen hilft ein Werkzeug, das früh anhält, nicht ein weiterer Satz in der Anleitung.
<!-- wikitool:links -->
## Beziehungen
- **see-also:** [[Chemenu]]
<!-- /wikitool:links -->
-46
View File
@@ -1,46 +0,0 @@
---
type: types/project.md
state: active
responsibility: technik
created: 2026-09-30
modified: 2026-09-30
related:
- see-also: Chemenu
sources: []
provenance: general
summary: Aus dem laufenden Kandidaten 8.0.0-beta wird das Release 8.0.0.
---
# Chemenu 8.0.0 freigeben
**Status:** Active
**Bereich:** Technik
## Ziel
Aus dem laufenden Kandidaten 8.0.0-beta wird das Release 8.0.0: veröffentlicht, mit vollständigem Changelog-Eintrag, und eine bestehende Instanz kann per `dist upgrade` darauf wechseln.
## Kontext
Zwischen zwei Releases führt [[Chemenu]] als Stack einen einzigen laufenden Kandidaten mit `-beta.N`-Suffix statt einer neuen Version je Änderung. Der Schritt vom Kandidaten zum Release ist bewusst eine menschliche Entscheidung und kein Agentenschritt.
## Beteiligte
Torben Nehmer gibt frei; ein Agent bereitet die Kandidaten vor und schreibt den Changelog.
## Status
Der Kandidat trägt die Änderungen der Installationsüberarbeitung und der Tracker-Anbindung. Ein Release ist noch nicht gefallen.
## Entscheidungen
- Die Freigabe selbst (`version release`) führt kein Agent aus.
## Gelerntes
Ein Test gegen aufgezeichnete Antworten hält den Parser ehrlich, sagt aber nichts darüber, ob der Tracker heute noch so antwortet - dafür braucht es einen Lauf gegen das echte Programm.
<!-- wikitool:links -->
## Beziehungen
- **see-also:** [[Chemenu]]
<!-- /wikitool:links -->
@@ -0,0 +1,48 @@
---
type: types/project.md
state: dormant
responsibility: technik
created: 2026-09-30
modified: 2026-09-30
related:
- see-also: Chemenu
sources: []
provenance: general
summary: kb/ einmal aus raw/ neu kompilieren, mit dem Bestand vergleichen, in Zahlen berichten und das Ergebnis verwerfen.
---
# Reproduktionslauf des Korpus
**Status:** Dormant
**Bereich:** Technik
## Ziel
Einmal belegt, ob die Pipeline von [[Chemenu]] reproduzierbar ist: `kb/` wird in einem abgeschlossenen `work/`-Lauf aus den unveränderten Dateien in `raw/` neu kompiliert, mit dem Bestand verglichen und mit Zahlen berichtet. Das Ergebnis wird danach verworfen.
## Kontext
Die Frage kam auf, weil die Testdaten nach viel Experimentieren nicht mehr ganz konsistent wirkten. Neu erfinden scheidet aus - ein fabrizierter Korpus wäre unbelegter Inhalt. Neu kompilieren dagegen ist die einzige Probe auf das Kernversprechen „never re-derive, always compile“. Das Vorhaben steht in [Gitea-Issue 69](https://gitea.nehmer.net/torben/chemenu/issues/69).
## Beteiligte
Torben Nehmer hat die Frage gestellt und entscheidet, wann der Lauf beginnt.
## Status
Bewusst zurückgestellt. Der Lauf ist entworfen, aber nicht begonnen; er soll erst messen, wenn Klassifikation und Erfassungsfelder in `kb/` den Zustand haben, in dem sie bleiben sollen.
## Entscheidungen
- Reproduzieren, nicht ersetzen: Der lebende Korpus wird nicht auf das Ergebnis gewettet. Keine Seite aus dem Lauf wandert nach `kb/`, und `raw/` bleibt unberührt.
- Berichtet wird in Zahlen: Seitenzahl je Collection und Subtyp, wie viele Bestandsseiten eine Entsprechung bekommen, `related:`-Dichte, Fan-in der Quellen, verwaiste Seiten, und Aussagen ohne Gegenstück in beide Richtungen.
- Gefundene Mängel werden als eigene Vorhaben abgespalten; der Lauf selbst schließt mit dem Befund, nicht mit Reparaturen.
## Gelerntes
Die vermutete Inkonsistenz saß nicht in `raw/`, sondern in der Klassifikation in `kb/`. Die ließ sich gezielt reparieren, ohne den Korpus neu aufzubauen.
<!-- wikitool:links -->
## Beziehungen
- **see-also:** [[Chemenu]]
<!-- /wikitool:links -->
@@ -1,48 +0,0 @@
---
type: types/project.md
state: active
responsibility: technik
created: 2026-09-30
modified: 2026-09-30
related:
- see-also: Chemenu
sources: []
provenance: general
summary: Chemenu läuft auf Windows nativ unter PowerShell 7, ohne WSL und ohne Windows PowerShell 5.1.
---
# Windows nativ unterstützen
**Status:** Active
**Bereich:** Technik
## Ziel
Ein Windows-Nutzer installiert und betreibt Chemenu nativ - unter PowerShell 7, ohne WSL und ohne Windows PowerShell 5.1 - und der Installationsweg führt ihn ohne Handarbeit an der Distribution selbst zur laufenden Instanz.
## Kontext
Die Installation von [[Chemenu]] war bisher auf Linux und macOS zugeschnitten. Mit der Überarbeitung der Installation (Gitea-Issue 140) wird Windows kein Sonderfall am Rand mehr, sondern ein gleichberechtigter Zielpfad. Als Installationsweg bleibt der Release-Download (Weg A) übrig.
## Beteiligte
Torben Nehmer entscheidet über Umfang und Reihenfolge.
## Status
Der Zuschnitt ist entschieden: PowerShell 7 ist die Untergrenze, WSL und Windows PowerShell 5.1 sind ausdrücklich ausgeschlossen. Vor dem Setup prüft ein Preflight die Voraussetzungen; fehlt eine, bricht er mit Exit-Code 42 ab und der Nutzer sieht die Ausgabe, bevor irgendetwas weiterläuft.
## Entscheidungen
- Nur Weg A, der Release-Download - eine zweite Windows-Sonderbahn wäre eine zweite Kopie der Regeln.
- Kein Agent installiert Abhängigkeiten: was fehlt, meldet der Preflight, und der Nutzer entscheidet.
- PowerShell 7 ist die einzige unterstützte Shell; Windows PowerShell 5.1 und WSL sind kein Zielpfad.
## Gelerntes
Pfade, die ein Test auf einem Linux-Rechner nie sieht - Laufwerksbuchstaben, Groß- und Kleinschreibung, Zeichen, die in einem Dateinamen verboten sind - fallen erst auf, wenn die Regel dafür im Werkzeug selbst steht. Seitentitel müssen deshalb als Dateinamen auf Windows und macOS gültig sein.
<!-- wikitool:links -->
## Beziehungen
- **see-also:** [[Chemenu]]
<!-- /wikitool:links -->
+4 -4
View File
@@ -13,11 +13,11 @@ The page tables live in a generated `INDEX.md` inside each collection, linked be
## Statistics ## Statistics
- **Total Pages:** 184 - **Total Pages:** 185
- **Comparisons:** 1 - **Comparisons:** 1
- **Concepts:** 80 - **Concepts:** 80
- **Entities:** 72 - **Entities:** 72
- **Gtd:** 2 - **Gtd:** 3
- **Sources:** 29 - **Sources:** 29
- **Last Updated:** 2026-09-30 - **Last Updated:** 2026-09-30
@@ -30,7 +30,7 @@ The page tables live in a generated `INDEX.md` inside each collection, linked be
| `comparisons/` | 1 | [comparisons/INDEX.md](comparisons/INDEX.md) | | `comparisons/` | 1 | [comparisons/INDEX.md](comparisons/INDEX.md) |
| `concepts/` | 80 | [concepts/INDEX.md](concepts/INDEX.md) | | `concepts/` | 80 | [concepts/INDEX.md](concepts/INDEX.md) |
| `entities/` | 72 | [entities/INDEX.md](entities/INDEX.md) | | `entities/` | 72 | [entities/INDEX.md](entities/INDEX.md) |
| `gtd/` | 2 | [gtd/INDEX.md](gtd/INDEX.md) | | `gtd/` | 3 | [gtd/INDEX.md](gtd/INDEX.md) |
| `sources/` | 29 | [sources/INDEX.md](sources/INDEX.md) | | `sources/` | 29 | [sources/INDEX.md](sources/INDEX.md) |
### concepts/ ### concepts/
@@ -58,7 +58,7 @@ The page tables live in a generated `INDEX.md` inside each collection, linked be
| Area | Pages | Index | | Area | Pages | Index |
|------|------:|-------| |------|------:|-------|
| Technik | 2 | [gtd/INDEX.md#technik](gtd/INDEX.md#technik) | | Technik | 3 | [gtd/INDEX.md#technik](gtd/INDEX.md#technik) |
### sources/ ### sources/
+18
View File
@@ -221,3 +221,21 @@ Die Kerndaten-Zeile "Architektur" nannte noch `wiki/` als Wissensschicht; das Ve
Verweis im letzten Kernpunkt auf die tatsächlich existierenden Abschnitte korrigiert: AGENTS.md § Tool error contract und instructions/gates.md § Iteration Budget Gate and loop-breaker statt der nicht existierenden AGENTS.md-Abschnitte „Tool Error Contracts“ und „Iteration and Cost Limits“. Keine inhaltliche Aussage geändert. Verweis im letzten Kernpunkt auf die tatsächlich existierenden Abschnitte korrigiert: AGENTS.md § Tool error contract und instructions/gates.md § Iteration Budget Gate and loop-breaker statt der nicht existierenden AGENTS.md-Abschnitte „Tool Error Contracts“ und „Iteration and Cost Limits“. Keine inhaltliche Aussage geändert.
--- ---
## [2026-09-30] rename | Windows nativ unterstützen -> Chemenu 8.0.0 - Installation und Windows
Demo-Projektseite auf den in Gitea #156 (E1) entschiedenen Namen gebracht; Inhalt um Freigabe und Anlass aus Gitea #140 ergänzt.
---
## [2026-09-30] delete | Chemenu 8.0.0 freigeben
Inhalt in 'Chemenu 8.0.0 - Installation und Windows' aufgegangen; keine eingehenden Verweise.
---
## [2026-09-30] create | Aufgabenverwaltung mit Tracker-Anbindung; Reproduktionslauf des Korpus
Demo-Projektseiten nach Gitea #156 (E1): completed aus Gitea #119/#124, dormant aus Gitea #69; provenance general.
---
+1 -1
View File
@@ -2,6 +2,6 @@
"sp_version": "19.1.0", "sp_version": "19.1.0",
"recorded": "2026-09-30", "recorded": "2026-09-30",
"how": "Packaged Super Productivity (.deb) headless in the chemenu-sp-live image, seeded from seed-backup.json; api/*.json are the raw answers of GET /health, /projects, /tasks and /tags after creating four items and closing one through wikitool's own writer.", "how": "Packaged Super Productivity (.deb) headless in the chemenu-sp-live image, seeded from seed-backup.json; api/*.json are the raw answers of GET /health, /projects, /tasks and /tags after creating four items and closing one through wikitool's own writer.",
"seed-backup.json": "A backup the app wrote itself, plus three projects ('Chemenu Live-Test', 'Chemenu 8.0.0 freigeben', 'Windows nativ unterstützen' as demo-2) and the tag 'waiting', cloned from entities the app produced.", "seed-backup.json": "A backup the app wrote itself: the marker project 'Chemenu Live-Test' and the demo projects 'Chemenu 8.0.0 - Installation und Windows', 'Aufgabenverwaltung mit Tracker-Anbindung' and 'Reproduktionslauf des Korpus' (cloned from entities the app produced, as is the tag 'waiting'), with the demo items filed through wikitool's own writer. One edit after the app wrote it: the item for #160 moved from taskIds to backlogTaskIds, because the REST API cannot file a someday item.",
"refresh": "See instructions/dev/tracker-testing.md, section Refreshing the fixtures." "refresh": "See instructions/dev/tracker-testing.md, section Refreshing the fixtures."
} }
+63 -8
View File
@@ -27,7 +27,7 @@
"isHiddenFromMenu": false, "isHiddenFromMenu": false,
"noteIds": [], "noteIds": [],
"taskIds": [ "taskIds": [
"cbN7F3EMo67k9RrfMjS26", "rFYj3EBI58h5KBrSvsuIi",
"KfvaOD_bl7mIn-Fq0W9NE" "KfvaOD_bl7mIn-Fq0W9NE"
], ],
"theme": { "theme": {
@@ -74,9 +74,9 @@
"isHiddenFromMenu": false, "isHiddenFromMenu": false,
"noteIds": [], "noteIds": [],
"taskIds": [ "taskIds": [
"gwedT3TNeJm35AaKMj_Ov", "yjW9DeaYw6TAcKhbljXU5",
"dCf43Dr1Ei9Gc1DxysY5q", "-O-cEDf4gQh6DLnew0Pob",
"EBm18ZV1F1LrVV7hsauGu" "peLK-RUVQ3WwmElnG2yo-"
], ],
"theme": { "theme": {
"accent": "#ff4081", "accent": "#ff4081",
@@ -111,7 +111,9 @@
"separateTasksBy": " | " "separateTasksBy": " | "
} }
}, },
"backlogTaskIds": [], "backlogTaskIds": [
"TS6eLbePmFdSDY_mVVivK"
],
"created": 1790745002886, "created": 1790745002886,
"doneOn": null, "doneOn": null,
"icon": null, "icon": null,
@@ -121,7 +123,16 @@
"isEnableBacklog": false, "isEnableBacklog": false,
"isHiddenFromMenu": false, "isHiddenFromMenu": false,
"noteIds": [], "noteIds": [],
"taskIds": [], "taskIds": [
"zfnO_x5D6MGGE_5Sld05_",
"VVOKc7Gh30uHgK0pyg21j",
"vldEnWz9xhhLX7O95J1Lm",
"JeQlIUMcaTT6nAJxgsgMw",
"5kW4iZNRlCqc1U3KGs5p5",
"RwoyhNMn-Q8fPusBG5-2p",
"XpcF0OsJH83DsS3_jgylh",
"xyWPSKXLDklUBLha5Mini"
],
"theme": { "theme": {
"accent": "#ff4081", "accent": "#ff4081",
"backgroundImageBlur": 0, "backgroundImageBlur": 0,
@@ -136,7 +147,7 @@
"primary": "rgb(144, 187, 165)", "primary": "rgb(144, 187, 165)",
"warn": "#e11826" "warn": "#e11826"
}, },
"title": "Chemenu 8.0.0 freigeben" "title": "Chemenu 8.0.0 - Installation und Windows"
}, },
{ {
"advancedCfg": { "advancedCfg": {
@@ -180,7 +191,51 @@
"primary": "rgb(144, 187, 165)", "primary": "rgb(144, 187, 165)",
"warn": "#e11826" "warn": "#e11826"
}, },
"title": "Windows nativ unterst\u00fctzen" "title": "Aufgabenverwaltung mit Tracker-Anbindung"
},
{
"advancedCfg": {
"worklogExportSettings": {
"cols": [
"DATE",
"START",
"END",
"TIME_CLOCK",
"TITLES_INCLUDING_SUB"
],
"groupBy": "DATE",
"roundEndTimeTo": null,
"roundStartTimeTo": null,
"roundWorkTimeTo": null,
"separateTasksBy": " | "
}
},
"backlogTaskIds": [],
"created": 1790745002886,
"doneOn": null,
"icon": null,
"id": "demo-3",
"isArchived": false,
"isDone": false,
"isEnableBacklog": false,
"isHiddenFromMenu": false,
"noteIds": [],
"taskIds": [],
"theme": {
"accent": "#ff4081",
"backgroundImageBlur": 0,
"backgroundImageDark": "",
"backgroundImageLight": null,
"backgroundOverlayOpacity": 20,
"hueAccent": "500",
"huePrimary": "500",
"hueWarn": "500",
"isAutoContrast": true,
"isDisableBackgroundTint": false,
"primary": "rgb(144, 187, 165)",
"warn": "#e11826"
},
"title": "Reproduktionslauf des Korpus"
} }
], ],
"ok": true "ok": true
+13 -4
View File
@@ -22,9 +22,17 @@
"icon": "wb_sunny", "icon": "wb_sunny",
"id": "TODAY", "id": "TODAY",
"taskIds": [ "taskIds": [
"cbN7F3EMo67k9RrfMjS26", "rFYj3EBI58h5KBrSvsuIi",
"gwedT3TNeJm35AaKMj_Ov", "yjW9DeaYw6TAcKhbljXU5",
"EBm18ZV1F1LrVV7hsauGu", "peLK-RUVQ3WwmElnG2yo-",
"TS6eLbePmFdSDY_mVVivK",
"VVOKc7Gh30uHgK0pyg21j",
"vldEnWz9xhhLX7O95J1Lm",
"JeQlIUMcaTT6nAJxgsgMw",
"5kW4iZNRlCqc1U3KGs5p5",
"RwoyhNMn-Q8fPusBG5-2p",
"XpcF0OsJH83DsS3_jgylh",
"xyWPSKXLDklUBLha5Mini",
"KfvaOD_bl7mIn-Fq0W9NE" "KfvaOD_bl7mIn-Fq0W9NE"
], ],
"theme": { "theme": {
@@ -65,7 +73,8 @@
"icon": null, "icon": null,
"id": "tag-waiting", "id": "tag-waiting",
"taskIds": [ "taskIds": [
"dCf43Dr1Ei9Gc1DxysY5q" "-O-cEDf4gQh6DLnew0Pob",
"zfnO_x5D6MGGE_5Sld05_"
], ],
"theme": { "theme": {
"accent": "#ff4081", "accent": "#ff4081",
+134 -6
View File
@@ -16,9 +16,137 @@
}, },
{ {
"attachments": [], "attachments": [],
"created": 1790764434509, "created": 1790770434573,
"dueDay": "2026-09-30", "dueDay": "2026-09-30",
"id": "EBm18ZV1F1LrVV7hsauGu", "id": "xyWPSKXLDklUBLha5Mini",
"isDone": false,
"projectId": "demo-1",
"subTaskIds": [],
"tagIds": [],
"timeEstimate": 0,
"timeSpent": 0,
"timeSpentOnDay": {},
"title": "Preflight, Launcher und Tool-Pfade (#151)"
},
{
"attachments": [],
"created": 1790770434633,
"dueDay": "2026-09-30",
"id": "XpcF0OsJH83DsS3_jgylh",
"isDone": false,
"projectId": "demo-1",
"subTaskIds": [],
"tagIds": [],
"timeEstimate": 0,
"timeSpent": 0,
"timeSpentOnDay": {},
"title": "Portabilit\u00e4t unter Windows (#152)"
},
{
"attachments": [],
"created": 1790770434680,
"dueDay": "2026-09-30",
"id": "RwoyhNMn-Q8fPusBG5-2p",
"isDone": false,
"projectId": "demo-1",
"subTaskIds": [],
"tagIds": [],
"timeEstimate": 0,
"timeSpent": 0,
"timeSpentOnDay": {},
"title": "Installation auf den Release-Weg zuschneiden (#153)"
},
{
"attachments": [],
"created": 1790770434725,
"dueDay": "2026-09-30",
"id": "5kW4iZNRlCqc1U3KGs5p5",
"isDone": false,
"projectId": "demo-1",
"subTaskIds": [],
"tagIds": [],
"timeEstimate": 0,
"timeSpent": 0,
"timeSpentOnDay": {},
"title": "Installationsanleitung an die Instruktionen koppeln (#154)"
},
{
"attachments": [],
"created": 1790770434999,
"dueDay": "2026-09-30",
"id": "JeQlIUMcaTT6nAJxgsgMw",
"isDone": false,
"projectId": "demo-1",
"subTaskIds": [],
"tagIds": [],
"timeEstimate": 0,
"timeSpent": 0,
"timeSpentOnDay": {},
"title": "Bugreport-Sammler (#157)"
},
{
"attachments": [],
"created": 1790770435195,
"dueDay": "2026-09-30",
"id": "vldEnWz9xhhLX7O95J1Lm",
"isDone": false,
"projectId": "demo-1",
"subTaskIds": [],
"tagIds": [],
"timeEstimate": 0,
"timeSpent": 0,
"timeSpentOnDay": {},
"title": "Pseudonymisierung f\u00fcr Bugreports (#158)"
},
{
"attachments": [],
"created": 1790770435236,
"dueDay": "2026-09-30",
"id": "VVOKc7Gh30uHgK0pyg21j",
"isDone": false,
"projectId": "demo-1",
"subTaskIds": [],
"tagIds": [],
"timeEstimate": 0,
"timeSpent": 0,
"timeSpentOnDay": {},
"title": "publish: Doppelz\u00e4hlung im Gate und Remote-Meldung (#159)"
},
{
"attachments": [],
"created": 1790770435290,
"dueDay": "2026-09-30",
"id": "TS6eLbePmFdSDY_mVVivK",
"isDone": false,
"projectId": "demo-1",
"subTaskIds": [],
"tagIds": [],
"timeEstimate": 0,
"timeSpent": 0,
"timeSpentOnDay": {},
"title": "MCP-Leseserver unter Windows (#160)"
},
{
"attachments": [],
"created": 1790770435339,
"dueDay": "2026-09-15",
"id": "zfnO_x5D6MGGE_5Sld05_",
"isDone": false,
"projectId": "demo-1",
"subTaskIds": [],
"tagIds": [
"tag-waiting"
],
"timeEstimate": 0,
"timeSpent": 0,
"timeSpentOnDay": {},
"title": "Pr\u00fcfpunkte T1\u2013T12 vom Betreiber"
},
{
"attachments": [],
"created": 1790770505375,
"dueDay": "2026-09-30",
"id": "peLK-RUVQ3WwmElnG2yo-",
"isDone": false, "isDone": false,
"notes": "kb/gtd/technik/Chemenu Live-Test.md", "notes": "kb/gtd/technik/Chemenu Live-Test.md",
"projectId": "chemenu-live-test", "projectId": "chemenu-live-test",
@@ -31,9 +159,9 @@
}, },
{ {
"attachments": [], "attachments": [],
"created": 1790764434554, "created": 1790770505576,
"dueDay": "2026-08-01", "dueDay": "2026-08-01",
"id": "dCf43Dr1Ei9Gc1DxysY5q", "id": "-O-cEDf4gQh6DLnew0Pob",
"isDone": false, "isDone": false,
"projectId": "chemenu-live-test", "projectId": "chemenu-live-test",
"subTaskIds": [], "subTaskIds": [],
@@ -47,9 +175,9 @@
}, },
{ {
"attachments": [], "attachments": [],
"created": 1790764434974, "created": 1790770505656,
"dueDay": "2026-09-30", "dueDay": "2026-09-30",
"id": "cbN7F3EMo67k9RrfMjS26", "id": "rFYj3EBI58h5KBrSvsuIi",
"isDone": false, "isDone": false,
"projectId": "INBOX_PROJECT", "projectId": "INBOX_PROJECT",
"subTaskIds": [], "subTaskIds": [],
+1 -1
View File
@@ -1 +1 @@
{"task": {"ids": ["KfvaOD_bl7mIn-Fq0W9NE"], "entities": {"KfvaOD_bl7mIn-Fq0W9NE": {"id": "KfvaOD_bl7mIn-Fq0W9NE", "subTaskIds": [], "timeSpentOnDay": {}, "timeSpent": 0, "timeEstimate": 0, "isDone": false, "title": "seed marker task", "tagIds": [], "created": 1790744930824, "attachments": [], "projectId": "INBOX_PROJECT", "dueDay": "2026-09-30"}}, "currentTaskId": null, "selectedTaskId": null, "taskDetailTargetPanel": null, "lastCurrentTaskId": null, "isDataLoaded": false, "dismissedCalendarAutoImportEventIdsByProvider": {}}, "project": {"ids": ["INBOX_PROJECT", "chemenu-live-test", "demo-1", "demo-2"], "entities": {"INBOX_PROJECT": {"isHiddenFromMenu": false, "isArchived": false, "isDone": false, "doneOn": null, "isEnableBacklog": false, "backlogTaskIds": [], "noteIds": [], "advancedCfg": {"worklogExportSettings": {"cols": ["DATE", "START", "END", "TIME_CLOCK", "TITLES_INCLUDING_SUB"], "roundWorkTimeTo": null, "roundStartTimeTo": null, "roundEndTimeTo": null, "separateTasksBy": " | ", "groupBy": "DATE"}}, "theme": {"isAutoContrast": true, "isDisableBackgroundTint": false, "primary": "rgb(144, 187, 165)", "huePrimary": "500", "accent": "#ff4081", "hueAccent": "500", "warn": "#e11826", "hueWarn": "500", "backgroundImageDark": "", "backgroundImageLight": null, "backgroundOverlayOpacity": 20, "backgroundImageBlur": 0}, "taskIds": ["KfvaOD_bl7mIn-Fq0W9NE"], "icon": "inbox", "id": "INBOX_PROJECT", "title": "Inbox"}, "chemenu-live-test": {"isHiddenFromMenu": false, "isArchived": false, "isDone": false, "doneOn": null, "isEnableBacklog": false, "backlogTaskIds": [], "noteIds": [], "advancedCfg": {"worklogExportSettings": {"cols": ["DATE", "START", "END", "TIME_CLOCK", "TITLES_INCLUDING_SUB"], "roundWorkTimeTo": null, "roundStartTimeTo": null, "roundEndTimeTo": null, "separateTasksBy": " | ", "groupBy": "DATE"}}, "theme": {"isAutoContrast": true, "isDisableBackgroundTint": false, "primary": "rgb(144, 187, 165)", "huePrimary": "500", "accent": "#ff4081", "hueAccent": "500", "warn": "#e11826", "hueWarn": "500", "backgroundImageDark": "", "backgroundImageLight": null, "backgroundOverlayOpacity": 20, "backgroundImageBlur": 0}, "taskIds": [], "icon": null, "id": "chemenu-live-test", "title": "Chemenu Live-Test", "created": 1790745002886}, "demo-1": {"isHiddenFromMenu": false, "isArchived": false, "isDone": false, "doneOn": null, "isEnableBacklog": false, "backlogTaskIds": [], "noteIds": [], "advancedCfg": {"worklogExportSettings": {"cols": ["DATE", "START", "END", "TIME_CLOCK", "TITLES_INCLUDING_SUB"], "roundWorkTimeTo": null, "roundStartTimeTo": null, "roundEndTimeTo": null, "separateTasksBy": " | ", "groupBy": "DATE"}}, "theme": {"isAutoContrast": true, "isDisableBackgroundTint": false, "primary": "rgb(144, 187, 165)", "huePrimary": "500", "accent": "#ff4081", "hueAccent": "500", "warn": "#e11826", "hueWarn": "500", "backgroundImageDark": "", "backgroundImageLight": null, "backgroundOverlayOpacity": 20, "backgroundImageBlur": 0}, "taskIds": [], "icon": null, "id": "demo-1", "title": "Chemenu 8.0.0 freigeben", "created": 1790745002886}, "demo-2": {"isHiddenFromMenu": false, "isArchived": false, "isDone": false, "doneOn": null, "isEnableBacklog": false, "backlogTaskIds": [], "noteIds": [], "advancedCfg": {"worklogExportSettings": {"cols": ["DATE", "START", "END", "TIME_CLOCK", "TITLES_INCLUDING_SUB"], "roundWorkTimeTo": null, "roundStartTimeTo": null, "roundEndTimeTo": null, "separateTasksBy": " | ", "groupBy": "DATE"}}, "theme": {"isAutoContrast": true, "isDisableBackgroundTint": false, "primary": "rgb(144, 187, 165)", "huePrimary": "500", "accent": "#ff4081", "hueAccent": "500", "warn": "#e11826", "hueWarn": "500", "backgroundImageDark": "", "backgroundImageLight": null, "backgroundOverlayOpacity": 20, "backgroundImageBlur": 0}, "taskIds": [], "icon": null, "id": "demo-2", "title": "Windows nativ unterst\u00fctzen", "created": 1790745002886}}}, "tag": {"ids": ["TODAY", "tag-waiting"], "entities": {"TODAY": {"color": null, "created": 1790744929943, "advancedCfg": {"worklogExportSettings": {"cols": ["DATE", "START", "END", "TIME_CLOCK", "TITLES_INCLUDING_SUB"], "roundWorkTimeTo": null, "roundStartTimeTo": null, "roundEndTimeTo": null, "separateTasksBy": " | ", "groupBy": "DATE"}}, "theme": {"isAutoContrast": true, "isDisableBackgroundTint": true, "primary": "#6495ED", "huePrimary": "400", "accent": "#ff4081", "hueAccent": "500", "warn": "#e11826", "hueWarn": "500", "backgroundImageDark": "", "backgroundImageLight": null, "backgroundOverlayOpacity": 20, "backgroundImageBlur": 0}, "taskIds": ["KfvaOD_bl7mIn-Fq0W9NE"], "icon": "wb_sunny", "id": "TODAY", "title": "Today"}, "tag-waiting": {"color": null, "created": 1790745002886, "advancedCfg": {"worklogExportSettings": {"cols": ["DATE", "START", "END", "TIME_CLOCK", "TITLES_INCLUDING_SUB"], "roundWorkTimeTo": null, "roundStartTimeTo": null, "roundEndTimeTo": null, "separateTasksBy": " | ", "groupBy": "DATE"}}, "theme": {"isAutoContrast": true, "isDisableBackgroundTint": trLine truncated {"task":{"ids":["KfvaOD_bl7mIn-Fq0W9NE","xyWPSKXLDklUBLha5Mini","XpcF0OsJH83DsS3_jgylh","RwoyhNMn-Q8fPusBG5-2p","5kW4iZNRlCqc1U3KGs5p5","JeQlIUMcaTT6nAJxgsgMw","vldEnWz9xhhLX7O95J1Lm","VVOKc7Gh30uHgK0pyg21j","TS6eLbePmFdSDY_mVVivK","zfnO_x5D6MGGE_5Sld05_"],"entities":{"KfvaOD_bl7mIn-Fq0W9NE":{"id":"KfvaOD_bl7mIn-Fq0W9NE","subTaskIds":[],"timeSpentOnDay":{},"timeSpent":0,"timeEstimate":0,"isDone":false,"title":"seed marker task","tagIds":[],"created":1790744930824,"attachments":[],"projectId":"INBOX_PROJECT","dueDay":"2026-09-30"},"xyWPSKXLDklUBLha5Mini":{"id":"xyWPSKXLDklUBLha5Mini","subTaskIds":[],"timeSpentOnDay":{},"timeSpent":0,"timeEstimate":0,"isDone":false,"title":"Preflight, Launcher und Tool-Pfade (#151)","tagIds":[],"created":1790770434573,"attachments":[],"projectId":"demo-1","dueDay":"2026-09-30"},"XpcF0OsJH83DsS3_jgylh":{"id":"XpcF0OsJH83DsS3_jgylh","subTaskIds":[],"timeSpentOnDay":{},"timeSpent":0,"timeEstimate":0,"isDone":false,"title":"Portabilität unter Windows (#152)","tagIds":[],"created":1790770434633,"attachments":[],"projectId":"demo-1","dueDay":"2026-09-30"},"RwoyhNMn-Q8fPusBG5-2p":{"id":"RwoyhNMn-Q8fPusBG5-2p","subTaskIds":[],"timeSpentOnDay":{},"timeSpent":0,"timeEstimate":0,"isDone":false,"title":"Installation auf den Release-Weg zuschneiden (#153)","tagIds":[],"created":1790770434680,"attachments":[],"projectId":"demo-1","dueDay":"2026-09-30"},"5kW4iZNRlCqc1U3KGs5p5":{"id":"5kW4iZNRlCqc1U3KGs5p5","subTaskIds":[],"timeSpentOnDay":{},"timeSpent":0,"timeEstimate":0,"isDone":false,"title":"Installationsanleitung an die Instruktionen koppeln (#154)","tagIds":[],"created":1790770434725,"attachments":[],"projectId":"demo-1","dueDay":"2026-09-30"},"JeQlIUMcaTT6nAJxgsgMw":{"id":"JeQlIUMcaTT6nAJxgsgMw","subTaskIds":[],"timeSpentOnDay":{},"timeSpent":0,"timeEstimate":0,"isDone":false,"title":"Bugreport-Sammler (#157)","tagIds":[],"created":1790770434999,"attachments":[],"projectId":"demo-1","dueDay":"2026-09-30"},"vldEnWz9xhhLX7O95J1Lm":{"id":"vldEnWz9xhhLX7O95J1Lm","subTaskIds":[],"timeSpentOnDay":{},"timeSpent":0,"timeEstimate":0,"isDone":false,"title":"Pseudonymisierung für Bugreports (#158)","tagIds":[],"created":1790770435195,"attachments":[],"projectId":"demo-1","dueDay":"2026-09-30"},"VVOKc7Gh30uHgK0pyg21j":{"id":"VVOKc7Gh30uHgK0pyg21j","subTaskIds":[],"timeSpentOnDay":{},"timeSpent":0,"timeEstimate":0,"isDone":false,"title":"publish: Doppelzählung im Gate und Remote-Meldung (#159)","tagIds":[],"created":1790770435236,"attachments":[],"projectId":"demo-1","dueDay":"2026-09-30"},"TS6eLbePmFdSDY_mVVivK":{"id":"TS6eLbePmFdSDY_mVVivK","subTaskIds":[],"timeSpentOnDay":{},"timeSpent":0,"timeEstimate":0,"isDone":false,"title":"MCP-Leseserver unter Windows (#160)","tagIds":[],"created":1790770435290,"attachments":[],"projectId":"demo-1","dueDay":"2026-09-30"},"zfnO_x5D6MGGE_5Sld05_":{"id":"zfnO_x5D6MGGE_5Sld05_","subTaskIds":[],"timeSpentOnDay":{},"timeSpent":0,"timeEstimate":0,"isDone":false,"title":"Prüfpunkte T1–T12 vom Betreiber","tagIds":["tag-waiting"],"created":1790770435339,"attachments":[],"projectId":"demo-1","dueDay":"2026-09-15"}},"currentTaskId":null,"selectedTaskId":null,"taskDetailTargetPanel":null,"lastCurrentTaskId":null,"isDataLoaded":true,"dismissedCalendarAutoImportEventIdsByProvider":{}},"project":{"ids":["INBOX_PROJECT","chemenu-live-test","demo-1","demo-2","demo-3"],"entities":{"INBOX_PROJECT":{"isHiddenFromMenu":false,"isArchived":false,"isDone":false,"doneOn":null,"isEnableBacklog":false,"backlogTaskIds":[],"noteIds":[],"advancedCfg":{"worklogExportSettings":{"cols":["DATE","START","END","TIME_CLOCK","TITLES_INCLUDING_SUB"],"roundWorkTimeTo":null,"roundStartTimeTo":null,"roundEndTimeTo":null,"separateTasksBy":" | ","groupBy":"DATE"}},"theme":{"isAutoContrast":true,"isDisableBackgroundTint":false,"primary":"rgb(144, 187, 165)","huePrimary":"500","accent":"#ff4081","hueAccent":"500","warn":"#e11826","hueWarn":"500","backgroundImageDark":"","backgroundImageLight":null,"backgroundOverlayOpacity":20,"backgroundImageBlur":0},"taskIds":["KfvaOD_bl7mIn-Fq0W9NE"],"icon":"inbox","id":"INBOX_PROJECT","title":"Inbox"},"chemenu-live-test":{"isHiddenFromMenu":false,"isArchived":false,"isDone":false,"doneOn":null,"isEnableBacklog":false,"backlogTaskIds":[],"noteIds":[],"advancedCfg":{"worklogExportSettings":{"cols":["DATE","START","END","TIME_CLOCK","TITLES_INCLUDING_SUB"],"roundWorkTimeTo":null,"roundStartTimeTo":null,"roundEndTimeTo":null,"separateTasksBy":" | ","groupBy":"DATE"}},"theme":{"isAutoContrast":true,"isDisableBackgroundTint":false,"primary":"rgb(144, 187, 165)","huePrimary":"500","accent":"#ff4081","hueAccent":"500","warn":"#e11826","hueWarn":"500","backgroundImageDark":"","backgroundImageLight":null,"backgroundOverlayOpacity":20,"backgroundImageBlur":0},"taskIds":[],"icon":null,"id":"chemenu-live-test","title":"Chemenu Live-Test","created":1790745002886},"demo-1":{"isHiddenFromMenu":false,"isArchived":false,"isDone":false,"doneOn":null,"isEnableBacklog":false,"Line truncated
+20 -7
View File
@@ -22,6 +22,22 @@ from chemenu.tasks import superproductivity as sp
FIXTURES = Path(__file__).parent / "fixtures" / "sp" FIXTURES = Path(__file__).parent / "fixtures" / "sp"
MARKER = "Chemenu Live-Test" MARKER = "Chemenu Live-Test"
DEMO_ACTIVE = "Chemenu 8.0.0 - Installation und Windows"
PROJECTS = {
MARKER, DEMO_ACTIVE, "Aufgabenverwaltung mit Tracker-Anbindung", "Reproduktionslauf des Korpus",
}
DEMO_WAITING = [("Prüfpunkte T1–T12 vom Betreiber", date(2026, 9, 15))]
DEMO_SOMEDAY = ["MCP-Leseserver unter Windows (#160)"]
def _assert_demo_projects(reader) -> None:
"""The seed's demo data, which the `kb/gtd/` pages of the same names join against."""
active = reader.open_items(DEMO_ACTIVE)
assert active.count == 8
assert [(w.title, w.follow_up_at) for w in active.waiting] == DEMO_WAITING
assert reader.open_items("Aufgabenverwaltung mit Tracker-Anbindung").count == 0
assert reader.open_items("Reproduktionslauf des Korpus").count == 0
assert [s.title for s in reader.someday_items()] == DEMO_SOMEDAY
def _recorded(name: str) -> bytes: def _recorded(name: str) -> bytes:
@@ -74,8 +90,7 @@ def test_the_api_reader_reads_the_apps_own_answers():
) )
reader = sp.SuperProductivityApiReader(cfg) reader = sp.SuperProductivityApiReader(cfg)
names = {p.name for p in reader.projects()} assert {p.name for p in reader.projects()} == PROJECTS
assert names == {MARKER, "Chemenu 8.0.0 freigeben", "Windows nativ unterstützen"}
items = reader.open_items(MARKER) items = reader.open_items(MARKER)
assert {i.title for i in items.items} == { assert {i.title for i in items.items} == {
@@ -85,7 +100,7 @@ def test_the_api_reader_reads_the_apps_own_answers():
assert [(w.title, w.follow_up_at) for w in items.waiting] == [ assert [(w.title, w.follow_up_at) for w in items.waiting] == [
("Recorded: warte auf Antwort", date(2026, 8, 1)), ("Recorded: warte auf Antwort", date(2026, 8, 1)),
] ]
assert reader.open_items("Windows nativ unterstützen").count == 0 _assert_demo_projects(reader)
assert sp.health(cfg) is True assert sp.health(cfg) is True
@@ -106,8 +121,6 @@ def test_the_snapshot_reader_reads_a_backup_the_app_wrote(tmp_path):
cfg = sp.SuperProductivityConfig.from_dict({"access": "snapshot", "backups_dir": str(backups)}) cfg = sp.SuperProductivityConfig.from_dict({"access": "snapshot", "backups_dir": str(backups)})
reader = sp.SuperProductivityReader(cfg) reader = sp.SuperProductivityReader(cfg)
assert {p.name for p in reader.projects()} == { assert {p.name for p in reader.projects()} == PROJECTS
MARKER, "Chemenu 8.0.0 freigeben", "Windows nativ unterstützen",
}
assert reader.open_items(MARKER).count == 0 assert reader.open_items(MARKER).count == 0
assert reader.someday_items() == [] _assert_demo_projects(reader)