feat(roadmap): Roadmap des Deploymentcenters uebernommen (I9)

61 Eintraege aus docs/ROADMAP.md stehen jetzt als Items im Deploymentcenter:
17 offen, 24 erledigt, 7 zurueckgestellt, 13 verworfen. Keine Waisen, jedes
Item mit doc_anchor. Der Abgleich laeuft ohne Befund durch.

Die Datei behaelt, was eine Tabellenzelle nicht traegt: die Begruendungen.
Der Zustand steht zwischen dc:roadmap-Markern und wird erzeugt.

  - scripts/roadmap_import.py: wertet die Datei aus und uebertraegt sie.
    Wiederholbar ueber client_ref, legt fehlende Themenbereiche an, wartet
    bei Drosselung. Die Prioritaet liest es aus dem Abschnitt "Als
    Naechstes" - solange die Datei die Quelle ist, soll auch die Prioritaet
    von dort kommen.
  - docs/ROADMAP.md: Statustabellen raus, erzeugter Block rein,
    21 Ueberschriften und 14 Querverweise auf Item-Nummern umgestellt,
    Abschnitt H mit Item-Nummern versehen.

WAS DIE UEBERNAHME ZUTAGE FOERDERTE

  - G8 war zweimal vergeben: einmal offen, einmal erledigt. Genau die
    Kollision handvergebener Kennungen, gegen die der Entwurf argumentiert.
    Beide sind eigene Items.
  - Bereich H fehlte in roadmap_epics - Migration 016 hatte nur A-G und I
    gesetzt. Die Waisenerkennung meldete es. Das Importskript legt fehlende
    Bereiche jetzt an, ueberschreibt aber keine vorhandenen: Ein
    Uebernahmeskript darf anlegen, kuratierte Angaben nicht ueberschreiben.
  - "Item #42" stand als erfundenes Beispiel im Rueckkanal-Absatz - und #42
    gibt es wirklich, in predictalytics. Der Abgleich hat es gemeldet, ein
    Mensch haette es nie bemerkt.
  - Vier Marker waren veraltet (E1, E2, I8, D1).

BEHOBEN: spliceBlock() zerstoerte Dateien, die den Marker erwaehnen

strpos() nahm die erste Fundstelle von "<!-- dc:roadmap". Erwaehnt eine Datei
den Marker im Fliesstext - und die Einleitung einer ordentlichen Roadmap tut
genau das - setzte der Splice dort an und ueberschrieb den halben Dateikopf.
check() klammerte aus demselben Grund Prosa aus statt des Blocks.

Es trifft also ausgerechnet die Dateien, die das Verfahren beschreiben. Der
echte Block wird jetzt am Zeilenanfang samt "stand=" erkannt; das Blockende
wird ab dem Anfang gesucht, nicht ab Dateibeginn.

BEHOBEN: IPv6-Erkennung im Testlauf war launisch

erreichbar() prueft seit jeher IPv6 mit einem blossen connect(). Auf dieser
Strecke gelingt der Verbindungsaufbau zeitweise, waehrend danach nichts mehr
fliesst - der Lauf blieb dann auf IPv6 und jede Anfrage lief 21 Sekunden in
einen Timeout. Weil es launisch war, sah es mal nach einem Haenger und mal
nach einem sauberen Lauf aus. Geprueft wird jetzt bis zur Antwort:
TLS-Handschlag und ein HTTP-HEAD.

WebUI: Verweise im Inhalt hatten keine Farbregel und erschienen im
Browservorgabeblau auf schwarzem Grund. Der Bereichsverweis der Roadmap
springt ausserdem auf die Liste statt auf die Uebersicht - dort wirkt der
Filter, den er setzt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Deploymentcenter Bot
2026-08-30 00:10:32 +02:00
co-authored by Claude Opus 5
parent 8b6d6a307e
commit c9bad697e5
7 changed files with 872 additions and 163 deletions
+36 -4
View File
@@ -2043,8 +2043,15 @@ $roadmapCandidates = $bugRepo->getItems([
'limit' => 60,
])['items'];
/** Baut eine URL mit den aktuellen Roadmap-Filtern. */
function rmUrl(array $overrides = []): string
/**
* Baut eine URL mit den aktuellen Roadmap-Filtern.
*
* Das Sprungziel ist einstellbar, weil ein gesetzter Filter nur dort etwas
* bewirkt, wo die gefilterte Liste auch steht. Ein Verweis auf einen
* Themenbereich, der auf der Uebersicht landet, setzt den Filter zwar - man
* sieht davon aber nichts und haelt den Link fuer kaputt.
*/
function rmUrl(array $overrides = [], string $anker = '#tab-roadmap'): string
{
$params = [
'rm_project' => $_GET['rm_project'] ?? null,
@@ -2058,7 +2065,7 @@ function rmUrl(array $overrides = []): string
$params = array_merge($params, $overrides);
$params = array_filter($params, static fn($v): bool => $v !== null && $v !== '' && $v !== 'all');
return 'index.php' . ($params !== [] ? '?' . http_build_query($params) : '') . '#tab-roadmap';
return 'index.php' . ($params !== [] ? '?' . http_build_query($params) : '') . $anker;
}
/** Zeichen und Klartext zu einem Status, fuer Abzeichen in der Liste. */
@@ -2250,6 +2257,30 @@ $csrfField = Csrf::field();
.modal-backdrop.active { display: flex; }
.modal-card { background: #14171d; border: 1px solid rgba(255,255,255,0.12); border-radius: 18px; padding: 1.75rem; max-width: 600px; width: 95%; max-height: 90vh; overflow-y: auto; box-shadow: 0 20px 50px rgba(0,0,0,0.8); }
/*
Verweise im Inhalt.
Es gab dafuer bisher keine Regel - Links in Karten und Tabellen
erschienen also im Browservorgabeblau (#0000EE) auf beinahe
schwarzem Grund und waren schlicht nicht lesbar. Aufgefallen ist es
an den Bereichsnamen der Roadmap, betrifft aber jeden Verweis im
Inhaltsbereich.
Bewusst eng gefasst: .btn und .nav-link sind ebenfalls <a> und
bringen ihre eigene Gestaltung mit. Eine Regel auf blankes "a"
haette sie ueberschrieben.
*/
.card a:not(.btn), table a:not(.btn) {
color: var(--primary);
text-decoration: none;
border-bottom: 1px solid rgba(91,157,255,0.35);
transition: color .15s, border-color .15s;
}
.card a:not(.btn):hover, table a:not(.btn):hover {
color: #9cc4ff;
border-bottom-color: #9cc4ff;
}
.tab-content, .subtab-content { display: none; }
.tab-content.active, .subtab-content.active { display: block; }
</style>
@@ -4023,7 +4054,8 @@ chmod +x update-agent
<tr>
<td><strong style="font-family:'Roboto Mono';"><?= e((string)$rmE['epic']) ?></strong></td>
<td>
<a href="<?= e(rmUrl(['rm_epic' => (string)$rmE['epic'], 'rm_project' => (string)$rmE['project_slug']])) ?>">
<a href="<?= e(rmUrl(['rm_epic' => (string)$rmE['epic'], 'rm_project' => (string)$rmE['project_slug']], '#sub-roadmap-list')) ?>"
title="Vorhaben dieses Bereichs anzeigen">
<?= e((string)$rmE['title']) ?>
</a>
<?php if (!empty($rmE['summary'])): ?>