Files
Deploymentcenter/sql/migrations/020_rationale.sql
T
Deploymentcenter BotandClaude Opus 5 8f514eb17a feat(2.9.1): Die Begruendung zieht ins Deploymentcenter, die Datei wird erzeugt
Bis hierher galt eine Zweiteilung: Zustand im Deploymentcenter, Begruendung
in docs/ROADMAP.md, verbunden ueber doc_anchor. Die Beschreibung der
uebernommenen Eintraege sagte es woertlich - "Die Begruendung steht weiterhin
in der Datei - hier steht nur der Zustand."

Zwei Folgen, die erst im Betrieb sichtbar wurden:

1. Die Roadmap-Tafel kann die Begruendung nicht zeigen. Sie sieht die
   Datenbank; die Datei liegt auf einem Entwicklungsrechner. Im Seitenpanel
   stand deshalb nur doc_anchor als nicht anklickbarer Text mit dem Hinweis,
   er zeige auf etwas, das das WebUI nie zu sehen bekommt.

2. Schwerer: Die Beschreibung von dc_roadmap wies Agenten an, vor dem
   erneuten Vorschlagen eines zurueckgestellten Vorhabens "diesen Absatz" zu
   lesen. Ein Agent in polytrader oder clawddotnet kann ihn nicht lesen - er
   liegt in einem fremden Repository. Die Anweisung war nicht befolgbar.

Dazu kam, dass cli/roadmap.php --check PHP braucht und auf dem
Windows-Arbeitsplatz keines liegt: Die Haelfte der Pflegemaschinerie, die die
Zweiteilung zusammenhalten sollte, lief dort nie.

== Was sich aendert ==
bugtracker_items und roadmap_epics tragen rationale (Migration 020). Ein
EIGENES Feld neben description, nicht statt dessen: description sagt, was
gemeldet wurde, und kommt oft von einer fremden Maschine; rationale sagt,
warum wir uns so entschieden haben. Zusammengelegt haette jede redaktionelle
Ueberarbeitung den urspruenglichen Wortlaut der Meldung ueberschrieben, also
die Grundlage, auf der entschieden wurde.

Der Verlauf vermerkt nur, DASS die Begruendung sich geaendert hat und um wie
viele Zeichen. Der ganze Absatz ein zweites Mal im Verlauf haette ihn nach
der fuenften Ueberarbeitung unlesbar gemacht.

== Der Weg herauf, einmalig ==
?action=import_rationale liest eine mitgeschickte Roadmap-Datei. Drei Formen
werden erkannt: Bereichsabschnitte, Vorhabensabschnitte und Tabellenzeilen.
Die dritte ist kein Beiwerk - der Abschnitt "Verworfen" fuehrt seine zwoelf
Ablehnungen als Tabelle, und ohne sie bliebe ausgerechnet das nicht am Item
auffindbar, was am haeufigsten gebraucht wird: warum etwas schon einmal
abgelehnt wurde. Ohne overwrite=true bleibt stehen, was im DC schon steht.

== Der Weg herunter, dauerhaft ==
Ein zweites Markerpaar dc:rationale neben dc:roadmap. Bewusst ein zweites und
keine Erweiterung des ersten: Zwischen den beiden steht in jeder gewachsenen
Roadmap-Datei Handgeschriebenes - Einleitung, Leitlinie, Statuszeichen -, und
ein einziger Block haette das beim naechsten Erzeugen verschluckt.
?action=render_file setzt beide Bloecke serverseitig ein, damit die
Markersuche nur einmal umgesetzt ist. Sie hat eine Feinheit, die zweimal
umgesetzt zweimal verschieden waere: Ein im Fliesstext ERWAEHNTER Marker darf
nicht gefunden werden - die Einleitung dieser Datei erwaehnt jetzt beide.

== Werkzeuge ==
scripts/dc.py roadmap-import und roadmap-write, in Python und nicht in
cli/roadmap.php - sonst waeren sie auf dem Arbeitsplatz wieder nicht
aufrufbar. roadmap-write behaelt die Zeilenenden der Datei bei.

== Bestand ==
35 Vorhaben und 6 Bereiche aus docs/ROADMAP.md uebernommen, 476 Zeilen
handgepflegte Prosa durch den erzeugten Block ersetzt. Gegengeprueft auf
Wortebene: Aus dem Fliesstext fehlt nichts, die einzigen Abweichungen sind
die ersetzten Ueberschriften und die alte Einleitung.

Kaertchen ohne hinterlegte Begruendung tragen auf der Tafel eine dezente
Marke - erledigte nicht, dort waere sie ein Vorwurf ohne Adressaten.

MCP-Adapter auf 1.3.0: dc_roadmap_set nimmt rationale, und die Beschreibung
von dc_roadmap verweist nicht mehr auf eine Datei, die der Agent nicht
erreichen kann.

Geprueft: 7 neue Testfaelle, Suite gesamt 179 von 179.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-20 18:59:06 +02:00

71 lines
3.6 KiB
SQL

-- Migration 020: Die Begruendung zieht in die Datenbank
--
-- Additive Migration. Der Migrator toleriert 1050/1060/1061/1062/1091 ("existiert bereits").
-- ---------------------------------------------------------------------------
-- Warum ueberhaupt
-- ---------------------------------------------------------------------------
-- Bisher galt eine Zweiteilung: Der Zustand eines Vorhabens stand hier, die
-- Begruendung in einer Markdown-Datei im Repository des Projekts, und
-- doc_anchor verwies darauf. Die Beschreibung der uebernommenen Eintraege
-- sagt es woertlich: "Die Begruendung steht weiterhin in der Datei - hier
-- steht nur der Zustand."
--
-- Das hatte zwei Folgen, die erst im Betrieb sichtbar wurden:
--
-- 1. Die Roadmap-Tafel kann die Begruendung nicht zeigen. Sie sieht nur
-- die Datenbank; die Datei liegt auf einem Entwicklungsrechner.
--
-- 2. Schwerer wiegt: Die Beschreibung des Werkzeugs dc_roadmap weist
-- Agenten an, vor dem erneuten Vorschlagen eines zurueckgestellten
-- Vorhabens "diesen Absatz" zu lesen. Ein Agent im Projekt polytrader
-- kann den Absatz nicht lesen - er liegt in einem fremden Repository.
-- Die Anweisung war nicht befolgbar.
--
-- Ab hier fuehrt das Deploymentcenter die Begruendung, und die Datei wird
-- daraus erzeugt (zweites Markerpaar dc:rationale). Damit gibt es einen Ort
-- statt zweier, und der Ort ist der, den alle erreichen.
-- ---------------------------------------------------------------------------
-- Ein eigenes Feld, nicht description
-- ---------------------------------------------------------------------------
-- description und rationale sind nicht dasselbe:
-- description Was gemeldet wurde. Kommt vom Melder, oft von einer fremden
-- Maschine, und wird nicht umgeschrieben.
-- rationale Warum wir uns so entschieden haben. Kommt von uns.
--
-- Zusammengelegt haette jede redaktionelle Ueberarbeitung der Begruendung
-- den urspruenglichen Wortlaut der Meldung ueberschrieben - und damit die
-- Grundlage, auf der entschieden wurde.
--
-- MEDIUMTEXT und nicht TEXT: Die laengsten vorhandenen Abschnitte liegen bei
-- rund 2 KB, aber eine Begruendung darf wachsen, und die 64-KB-Grenze von
-- TEXT ist keine, die man beim Schreiben im Kopf haben moechte.
ALTER TABLE bugtracker_items
ADD COLUMN rationale MEDIUMTEXT NULL AFTER doc_anchor;
-- Wann die Begruendung zuletzt angefasst wurde. Getrennt von updated_at,
-- weil dieses bei jeder Statusaenderung hochgeht und dann nicht mehr
-- beantwortet, ob die Begruendung noch dem entspricht, was heute gilt.
ALTER TABLE bugtracker_items
ADD COLUMN rationale_updated_at DATETIME NULL AFTER rationale;
-- ---------------------------------------------------------------------------
-- Auch Bereiche haben eine Begruendung
-- ---------------------------------------------------------------------------
-- Beim Einlesen der vorhandenen Datei stellte sich heraus, dass ein guter
-- Teil der Prosa gar nicht an einem Vorhaben haengt, sondern am Bereich:
-- neun Abschnitte der Form "## A - Supervisor und Befunde" mit mehreren
-- Absaetzen, in denen die Grundentscheidung des jeweiligen Bereichs steht.
--
-- roadmap_epics.summary gibt es bereits, aber das ist eine Zeile fuer die
-- Uebersichtstabelle. Diese Abschnitte sind bis zu dreissig Zeilen lang.
-- Ohne ein eigenes Feld haette der erzeugte Block sie beim ersten Lauf
-- ueberschrieben - also genau den Text, der am schwersten wieder zu
-- beschaffen waere.
ALTER TABLE roadmap_epics
ADD COLUMN rationale MEDIUMTEXT NULL AFTER summary;
ALTER TABLE roadmap_epics
ADD COLUMN rationale_updated_at DATETIME NULL AFTER rationale;