AQMH First Frontend Transition Plan¶
Version: v0.3.0 (2026-06-12)
Scope: web_frontend, web_backend_cpp, runner/config status contract
Related documents:
- docs/AQMH/aqmh_frontend_integration_plan.md
- docs/AQMH/aqmh_implementation_plan.md
- docs/AQMH/aqmh_methodik_en.md
- docs/AQMH/aqmh_frontend_default_switch.md
1. Zielbild¶
Das Frontend soll AQMH als primaere Rekonstruktionsmethode behandeln. Classic Tile Compile bleibt verfuegbar, ist aber eine explizit gewaehlte Alternative.
User-facing Auswahl:
AQMH darf dabei nicht als Variante von Classic dargestellt werden. Die UI muss AQMH als eigenstaendige Methode mit dichter Qualitaetskarten-Berechnung, AQMH-Rekonstruktion und AQMH-Diagnostik zeigen. Classic Tile Compile bleibt als separate Methode mit Classic-Tile-/Local-Metrics-Controls erhalten.
Explizite Nicht-Ziele:
- Kein kombinierter AQMH/Classic-Rekonstruktionsmodus.
- Kein AQMH-Fallback auf Classic Tile Weights.
- Kein AQMH Tile Mode.
- Kein stilles Umschalten der Methode innerhalb eines Runs.
- Kein default-enabled Cherry-Pick.
2. Affected Files¶
2.1 Config / Schema¶
| File | Change |
|---|---|
tile_compile_cpp/include/tile_compile/config/configuration.hpp |
Top-Level method in Config; AqmhConfig::enabled als abgeleitetes Runtime-Flag behandeln |
tile_compile_cpp/src/io/config.cpp |
method parsen, serialisieren und daraus das Runtime-Flag aqmh.enabled ableiten |
tile_compile_cpp/tile_compile.yaml |
method: aqmh als Default; aqmh.enabled: true |
tile_compile_cpp/tile_compile.schema.yaml |
method Property und AQMH-first Default-Beschreibung |
tile_compile_cpp/tile_compile.schema.json |
Gleiches Schema-Update fuer JSON |
tile_compile_cpp/examples/aqmh_enabled.example.yaml |
Entfernen; AQMH ist nicht mehr ein Sonderbeispiel |
tile_compile_cpp/examples/classic_mode.example.yaml |
Neu: explizites Classic-Beispiel |
2.2 Backend / Runner / Status¶
| File | Change |
|---|---|
web_backend_cpp/include/services/run_inspector.hpp |
Method-aware Phase Order oder Status-Mapping |
web_backend_cpp/src/services/run_inspector.cpp |
method aus Run-Config/Metadata ableiten und im Status ausgeben |
web_backend_cpp/src/services/report_generator.cpp |
Behalten: wird vom Web-Backend/API-Report verwendet; AQMH-Reportabschnitt und AQMH-native BGE-Inputquelle in Backend-generierten Reports ausweisen |
web_backend_cpp/src/routes/* |
Falls Status/Run-Start-Routen Method-Felder filtern oder erzeugen, entsprechend erweitern |
tile_compile_cpp/apps/*runner* |
Runner Events langfristig auf AQMH-spezifische Phasen erweitern |
2.3 Frontend¶
| File | Change |
|---|---|
web_frontend/src/app.js |
Zentrale currentMethod()-Logik, AQMH-first Defaults, method-aware Phase Order, Dashboard Groups |
web_frontend/index.html |
Dashboard Method Badge und Pipeline Preview AQMH-first |
web_frontend/wizard.html |
AQMH zuerst und vorausgewaehlt; Classic als zweite Option |
web_frontend/parameter-studio.html |
AQMH Kategorie/Controls als Default; Classic Controls methodenabhaengig |
web_frontend/parameter-studio-page.js |
Default Kategorie, Method-Sync, Sichtbarkeit |
web_frontend/run-monitor.html |
AQMH Status Panel primaer anzeigen |
web_frontend/history-tools.html |
Method Tag als primaeres Sortier-/Filterkriterium; fehlende Methode als AQMH behandeln |
web_frontend/i18n/de.json, web_frontend/i18n/en.json |
Labels, Tooltips und Warnungen fuer AQMH-first und Classic-Option |
2.4 Scripts / Reports¶
| File | Change |
|---|---|
tile_compile_cpp/scripts/generate_report.py |
Falls dieser Reportpfad weiterhin verwendet wird: eigenstaendiger AQMH-Reportabschnitt (_gen_aqmh_metrics) und AQMH-native BGE-Inputquelle ausweisen |
2.5 Documentation / Tests¶
| File | Change |
|---|---|
docs/AQMH/aqmh_frontend_integration_plan.md |
"Default-enabled AQMH" als Non-Goal entfernen |
docs/AQMH/aqmh_implementation_plan.md |
Default-Kommentare und Gating-Text von AQMH-off auf AQMH-first aktualisieren |
web_backend_cpp/tests/*, tile_compile_cpp/tests/* |
Fixtures und Erwartungen fuer AQMH Default auditieren |
| Frontend Tests | Wizard/Dashboard/Run-Monitor/Parameter-Studio Default-Erwartungen drehen |
3. Method Contract¶
3.1 Top-Level Method¶
Neue und vom Frontend erzeugte Konfigurationen sollen ein explizites Top-Level-Feld enthalten:
Normalisierungsregel:
method = aqmh -> aqmh (aqmh.enabled wird auf true normalisiert)
method = classic_tile_compile -> classic (aqmh.enabled wird auf false normalisiert)
method fehlt -> aqmh (aqmh.enabled wird auf true normalisiert)
method ist die einzige Quelle der Wahrheit. aqmh.enabled ist kein Eingabe- oder Kompatibilitaets-Schalter fuer die Methodenerkennung, sondern nur ein aus method abgeleitetes Runtime-Flag. Fehlt method, gilt immer AQMH.
3.2 Default¶
Der Default fuer neue Frontend-Konfigurationen ist:
Classic wird nur gesetzt, wenn der Nutzer explizit die Classic-Option waehlt:
3.3 Example Configs¶
aqmh_enabled.example.yaml wird entfernt. Stattdessen gibt es ein explizites Classic-Beispiel:
Optional kann ein AQMH-Tuning-Beispiel angelegt werden, das erweiterte Pyramid-/Storage-Parameter zeigt:
3.4 Default Construction Audit¶
Alle Codepfade, die config::Config{} oder config::AqmhConfig{} direkt konstruieren, muessen auditiert werden. Mit AQMH-first darf ein synthetisch gebauter Config-Default nicht versehentlich Classic testen oder umgekehrt.
Regel fuer Tests und Fixtures:
Classic-Test -> method=classic_tile_compile explizit setzen; aqmh.enabled=false nach Normalisierung erwarten
AQMH-Test -> method=aqmh explizit setzen; aqmh.enabled=true nach Normalisierung erwarten
Default-Test -> pruefen, dass method=aqmh entsteht
4. Backend-Aenderungen¶
4.1 Config Parsing und Validation¶
Erforderlich:
config::Configbekommt ein Top-Level-Feldmethod.- YAML Parsing liest
method. - YAML Serialization schreibt
method. - Validation erlaubt nur:
aqmhclassic_tile_compile- Normalisierung leitet
aqmh.enabledausschliesslich ausmethodab; Validation prueft nur noch den normalisierten Zustand.
Normalisierungsregel:
method explizit gesetzt -> aqmh.enabled daraus ableiten
method fehlt -> method = aqmh, danach aqmh.enabled = true ableiten
aqmh.enabled wird niemals als Quelle fuer method verwendet. method-freie Configs werden durch Normalisierung zu gueltigen AQMH-Configs.
Schema-Aenderungen:
methodals Top-Level Property in YAML- und JSON-Schema aufnehmen.- Enum-Werte:
aqmh,classic_tile_compile. - Default/Description: AQMH ist Default, Classic ist explizite Alternative.
aqmh.enabledBeschreibung aktualisieren: abgeleitetes Runtime-Flag, kein UI- oder Config-Method-Schalter.- Schema-Konsistenzprüfung: Schema muss validieren, dass:
- Bei
method=aqmhmussaqmh.enabled=true(oder wird automatisch gesetzt) - Bei
method=classic_tile_compilemussaqmh.enabled=false(oder wird automatisch gesetzt)
4.2 Config Normalization Function¶
Implementierungsort: tile_compile_cpp/src/io/config.cpp
Funktion normalizeMethod(config::Config& config) muss folgende Regeln anwenden:
// Wird aufgerufen nach dem Parsen der Config, vor der Validierung
void normalizeMethod(config::Config& config) {
if (!config.method.has_value()) {
config.method = "aqmh";
}
if (config.method == "aqmh") {
config.aqmh.enabled = true;
} else if (config.method == "classic_tile_compile") {
config.aqmh.enabled = false;
}
// Unbekannte Werte werden von der Validation abgefangen
}
config.method wird als std::optional<std::string> modelliert. Nach normalizeMethod() ist es immer gesetzt. aqmh.enabled darf nach der Normalisierung als Runtime-Flag gelesen werden, aber nirgendwo als Methodenquelle.
Aufrufpunkt:
- Nach YAML-Parsing in config::Config::from_yaml()
- In JSON-Parsing-Pfaden nur falls ein solcher Pfad tatsaechlich existiert
- Vor der Schema-Validierung
- Vor dem Serialisieren (um Konsistenz zu gewährleisten)
Test-Anforderung: - Unit-Test fuer alle 3 Faelle aus Section 3.1 (method=aqmh, method=classic_tile_compile, method fehlt)
4.3 Status Payload¶
Alle Run-Status-Antworten sollen method enthalten:
Eine separate api_version ist fuer diese Umstellung nicht erforderlich. Das Frontend wertet method aus; wenn method fehlt, gilt der AQMH-first Default aus Section 3.1.
Fuer AQMH-Runs soll der Status zusaetzlich AQMH-spezifische Daten enthalten, sobald verfuegbar:
{
"method": "aqmh",
"aqmh": {
"enabled": true,
"storage": {
"resolution_divisor": 2,
"dtype": "uint16",
"max_resident_maps": 2
},
"maps": {
"computed": 143,
"total": 300,
"stream": "luma"
},
"cache": {
"bytes_written": 7200000000,
"bytes_read": 1800000000,
"cache_hits": 1100,
"cache_misses": 100,
"max_resident_maps_observed": 2
}
}
}
Das Frontend darf AQMH nicht aus vorhandenen Cache-Dateien ableiten. Die Methode kommt aus Config, Status oder Run-Metadaten.
4.4 Phase Order¶
Die aktuell Classic-orientierte Phase Order muss methodenabhaengig werden.
Shared Phasen bleiben gemeinsam:
SCAN_INPUT
CHANNEL_SPLIT
NORMALIZATION
GLOBAL_METRICS
TILE_GRID
REGISTRATION
PREWARP
COMMON_OVERLAP
STACKING
DEBAYER
ASTROMETRY
BGE
PCC
HYPERMETRIC_STRETCH
Classic-spezifisch:
AQMH-spezifisch:
Der bestehende Code verwendet derzeit teilweise den Uebergangsnamen AQMH_QUALITY_MAPS. Zielname fuer die method-aware UI ist AQMH_MAPS; AQMH_QUALITY_MAPS bleibt nur als Compatibility-Alias.
Kompatibilitaetsmapping fuer die erste Umstellung:
| Backend event | Bedingung | Frontend label | Action |
|---|---|---|---|
AQMH_QUALITY_MAPS |
beliebig | AQMH_MAPS |
Umlabeln |
LOCAL_METRICS |
method=aqmh |
Ausgeblendet | Nicht anzeigen (nicht umlabeln!) |
TILE_RECONSTRUCTION |
method=aqmh |
AQMH_RECONSTRUCTION |
Umlabeln |
STATE_CLUSTERING |
method=aqmh |
Ausgeblendet | Nicht anzeigen |
SYNTHETIC_FRAMES |
method=aqmh |
Ausgeblendet | Nicht anzeigen |
Klärung:
- LOCAL_METRICS wird bei AQMH komplett ausgeblendet, nicht umgelabelt (im Gegensatz zur vorherigen Version).
- Nur AQMH_QUALITY_MAPS und TILE_RECONSTRUCTION werden umgelabelt.
Dieses Mapping ist nur eine Uebergangsschicht. Ziel ist, dass der Runner AQMH-spezifische Events direkt emittiert.
4.5 Backend Event Normalization Layer¶
Implementierungsort: web_backend_cpp/src/services/run_inspector.cpp
Die Funktion normalizePhaseEvent() wendet das Mapping aus Section 4.4 an:
std::string normalizePhaseEvent(const std::string& event, const std::string& method) {
if (method == "aqmh") {
if (event == "LOCAL_METRICS" ||
event == "STATE_CLUSTERING" ||
event == "SYNTHETIC_FRAMES") {
return ""; // Ausblenden
}
if (event == "AQMH_QUALITY_MAPS") return "AQMH_MAPS";
if (event == "TILE_RECONSTRUCTION") return "AQMH_RECONSTRUCTION";
}
return event; // Unverändert
}
Ziel: Langfristig soll der Runner direkt AQMH_MAPS, AQMH_RECONSTRUCTION, AQMH_DIAGNOSTICS emittieren.
5. Frontend-Aenderungen¶
5.1 Zentrale Method-Erkennung¶
Die Frontend-Logik soll von isAqmhEnabled() auf eine Methode-API wechseln:
function currentMethod() {
return "aqmh"; // aqmh | classic_tile_compile
}
function isAqmhMethod() {
return currentMethod() === "aqmh";
}
Prioritaet:
- Run-Monitor-Status
status.method, wenn ein konkreter Run angezeigt wird - expliziter Draft-Wert
method— im Frontend gerade bearbeitete, noch nicht gespeicherte Konfiguration - Config-Objekt
config.method - YAML
method: ... - UI-State/URL-Fallback fuer noch nicht geladene Configs
- Default fuer neue UI-Kontexte:
aqmh
aqmh.enabled wird von der Frontend-Methodenerkennung nicht ausgewertet. Fehlt method, gilt AQMH.
5.2 Dashboard¶
Das Dashboard muss AQMH als Default sichtbar machen:
| Feld | AQMH Default | Classic Option |
|---|---|---|
| Method badge | AQMH |
Tile Compile Classic |
| Quality model | AQMH dense quality maps |
Classic local/tile metrics |
| Reconstruction | AQMH pixel-wise reconstruction |
Classic weighted stack |
| Cache estimate | AQMH map cache estimate | normal run cache |
Die Pipeline-Vorschau soll fuer AQMH nicht TILES als Hauptbegriff verwenden. Empfohlen:
Fuer Classic:
AQMH Cache-Schaetzung:
stored_width = ceil(width / resolution_divisor)
stored_height = ceil(height / resolution_divisor)
bytes_per_map = stored_width * stored_height * dtype_bytes
total_cache = bytes_per_map * frame_count * map_stream_count
Erste Implementierung kann map_stream_count = 1 fuer luma annehmen.
Dashboard-Warnungen werden fuer AQMH als Default direkt angezeigt, nicht erst nach einem zusaetzlichen Opt-in:
| Condition | Warning |
|---|---|
resolution_divisor = 1 und frame_count > 50 |
grosser AQMH Cache erwartet; resolution_divisor=2 pruefen |
max_resident_maps > 4 |
hoher resident map count; moeglicher RAM-Druck |
cherry_pick.enabled = true |
Pixel-level frame selection aktiv; nicht Default |
5.3 Wizard¶
Die erste Methodenauswahl im Wizard:
Wenn AQMH aktiv ist, werden AQMH-Speicherprofile angeboten:
(*) Balanced AQMH cache
resolution_divisor=2, dtype=uint16, max_resident_maps=2
( ) Exact AQMH cache
resolution_divisor=2, dtype=float32, max_resident_maps=2
( ) Full resolution AQMH cache
resolution_divisor=1, dtype=float32, max_resident_maps=2
Diese drei Profile ersetzen die zwei Profile ("Conservative", "Full resolution") aus dem Integration Plan §F4. Die Bezeichnungen sind aktualisiert; das konservative Profil ist jetzt "Balanced" und entspricht unveraendert resolution_divisor=2, uint16.
Classic-spezifische Tile-/Local-Metrics-Controls werden nur gezeigt, wenn Classic gewaehlt ist.
Die AQMH Storage Section ist beim ersten Oeffnen sichtbar. Sie wird ausgeblendet, wenn method=classic_tile_compile gewaehlt wird.
5.4 Parameter Studio¶
Parameter Studio braucht methodenbewusste Sichtbarkeit:
AQMH-Kontext:
methodaqmh.storage.*aqmh.pyramid.*aqmh.diagnostics.*aqmh.cherry_pick.*- shared preprocessing/runtime/output controls
Classic-Kontext:
method- Classic tile/local metrics
- Classic reconstruction controls
- shared preprocessing/runtime/output controls
Nicht anzeigen:
- AQMH tile weighting
- AQMH/Classic combined mode
- Classic fallback fuer AQMH
- Classic local metric controls als AQMH-Rekonstruktionsparameter
Default:
Classic-only Controls erhalten eine eindeutige Markierung, z. B. data-method="classic", und sind im AQMH-Kontext verborgen. AQMH Controls erhalten entsprechend data-method="aqmh" oder bleiben sichtbar, wenn sie die Default-Methode betreffen.
Sichtbarkeitsregel:
method=aqmh -> AQMH Controls plus shared Controls
method=classic_tile_compile -> Classic Controls plus shared Controls
5.5 Run Monitor¶
Header:
AQMH Stage Labels:
Anzeigen:
- maps computed / total
- cache bytes written/read
- cache hit rate
- resident maps observed vs configured
- cache misses
- unsupported pixels
- cherry-pick warning, falls aktiv
Classic-only Phasen LOCAL_METRICS, TILE_RECONSTRUCTION, STATE_CLUSTERING und SYNTHETIC_FRAMES duerfen bei AQMH nicht als normale pending Phasen erscheinen. Gemaess dem Compatibility-Mapping in Section 4.4: AQMH_QUALITY_MAPS wird auf AQMH_MAPS umbenannt; TILE_RECONSTRUCTION im AQMH-Kontext wird als AQMH_RECONSTRUCTION angezeigt; LOCAL_METRICS, STATE_CLUSTERING und SYNTHETIC_FRAMES werden bei AQMH komplett ausgeblendet — sie erhalten kein AQMH-Label.
6. Artifacts, Reports, History¶
6.1 Artifacts¶
AQMH-Artefakte sollen prominent, aber cache-schonend gruppiert werden:
| Artifact | UI Label | Verhalten |
|---|---|---|
artifacts/aqmh_metrics.json |
AQMH Metrics |
Summary bevorzugen |
artifacts/aqmh_regions.json |
AQMH Regions |
Summary bevorzugen |
cache/aqmh/* |
AQMH cache |
gruppiert/standardmaessig eingeklappt |
Raw Map Cache-Dateien duerfen nicht einzeln als primaere Artefakte gerendert werden.
6.2 Reports¶
Der Report braucht einen eigenstaendigen AQMH-Abschnitt:
- AQMH quality heatmap
- AQMH artifact fraction heatmap
- per-frame
map_mean - per-frame
artifact_frac - AQMH cache/timing table
- optional AQMH-vs-Classic nur als Cross-Run-Vergleich
AQMH darf nicht unter Classic Local Metrics verschachtelt werden.
6.3 BGE AQMH-native Inputs¶
Wenn method=aqmh und BGE aktiv ist, darf BGE nicht auf local_metrics.json zurueckgreifen.
Implementierungsort: tile_compile_cpp/apps/runner (BGE-Integrationspunkt)
Das Backend setzt in diesem Fall tile_metrics_source = "aqmh_output" im BGE-Artifact.
Die Funktion setBgeTileMetricsSource() wird im Runner aufgerufen:
void setBgeTileMetricsSource(BgeArtifact& artifact, const Config& config) {
if (config.method == "aqmh") {
artifact.tile_metrics_source = "aqmh_output";
} else {
artifact.tile_metrics_source = "classic_local_metrics";
}
}
Das Frontend und der Report muessen das korrekt ausweisen:
- Report: BGE-Eingabequelle als
AQMH outputlabeln, nicht als Classic Local Metrics. - History/Comparison: Vergleichsfeld
tile_metrics_sourcezur Unterscheidung vonaqmh_outputundclassic_local_metrics. - Run Monitor: kein Signal, das
local_metrics.jsonals BGE-Input impliziert, wenn die Methode AQMH ist.
Classic-Runs behalten tile_metrics_source = "classic_local_metrics" und bleiben unveraendert.
6.4 History¶
History-Tags:
Vergleichsfelder:
method- AQMH cache size
- AQMH map compute time
- AQMH reconstruction time
- mean artifact fraction
AQMH-vs-Classic ist ein Vergleich zweier separater Runs, kein einzelner kombinierter Run-Modus.
History braucht eine einfache AQMH-first Ableitung:
Run metadata method=aqmh -> AQMH
Run metadata method=classic_tile_compile -> Tile Compile Classic
Kein method -> AQMH
7. No Migration¶
Es gibt keine Migration bestehender Run-Verzeichnisse oder Projekt-Configs. Fehlt method, wird nach AQMH-first-Regel AQMH angenommen. Classic bleibt nur dann aktiv, wenn eine Config oder ein UI-Draft explizit method=classic_tile_compile setzt. Neue Projekte, neue Wizard-Konfigurationen, Default-Resets und Configs ohne Method-Feld erzeugen AQMH:
Der Wizard muss diese Aenderung sichtbar machen:
AQMH is the default reconstruction method.
Select Tile Compile Classic for the previous Classic pipeline.
Keine stille Methodenumschaltung innerhalb eines laufenden oder resumed Runs: Resume verwendet die Methode des Run-Verzeichnisses.
8. Frontend State Persistence¶
8.1 Method State Management¶
Die gewählte Methode muss über Page-Reloads und Sessions hinweg konsistent bleiben:
Speicherorte:
1. URL-Hash: method=aqmh oder method=classic_tile_compile
2. Server UI State oder localStorage: bestehende UI-State-Infrastruktur bevorzugen; tileCompile.method nur als Fallback
3. Draft-Config: Im Frontend-State fuer nicht gespeicherte Änderungen
Priorität: aktiver Run-Status > Draft-Config > geladene Config/YAML > URL-Hash > Server UI State/localStorage > Default (AQMH). URL-Hash und gespeicherter UI-State duerfen eine geladene Config oder einen aktiven Run nicht ueberschreiben.
Implementierung in web_frontend/src/app.js:
// Lade Methode beim Start
function loadMethodFromState() {
const runMethod = currentRunStatus?.method;
if (runMethod && ['aqmh', 'classic_tile_compile'].includes(runMethod)) {
return runMethod;
}
const draftMethod = currentDraftValueForPath('method');
if (draftMethod && ['aqmh', 'classic_tile_compile'].includes(draftMethod)) {
return draftMethod;
}
const configMethod = currentConfig?.method || detectMethodFromYaml(currentConfigYaml);
if (configMethod && ['aqmh', 'classic_tile_compile'].includes(configMethod)) {
return configMethod;
}
const urlMethod = getUrlHashParam('method');
if (urlMethod && ['aqmh', 'classic_tile_compile'].includes(urlMethod)) {
return urlMethod;
}
const storedMethod = readUiStateValue('tileCompile.method') ||
localStorage.getItem('tileCompile.method');
if (storedMethod && ['aqmh', 'classic_tile_compile'].includes(storedMethod)) {
return storedMethod;
}
return 'aqmh'; // Default
}
// Speichere Methode bei Änderung
function saveMethodToState(method) {
setUrlHashParam('method', method);
writeUiStateValue('tileCompile.method', method);
localStorage.setItem('tileCompile.method', method);
}
URL-Hash Format:
8.2 Performance Warnings and Guards¶
Cache- und Speicherlimits:
- Warnung: resolution_divisor=1 + frame_count > 50 → Cache-Warnung
- Warnung: geschaetzter AQMH-Disk-Cache ist gross im Vergleich zum freien Speicherplatz
- Blockierung: geschaetzte residente Map-Speichernutzung ueberschreitet das konfigurierte Memory Budget deutlich:
"AQMH resident map cache would exceed the configured memory budget (X GB).
Please reduce max_resident_maps or increase resolution_divisor."
Implementierung:
function validateAqmhResourceLimits(scan, config) {
const diskCacheBytes = estimateAqmhDiskCacheBytes(scan, config);
const residentBytes = estimateAqmhResidentMapBytes(scan, config);
const memoryBudgetBytes = config.runtime_limits.memory_budget * 1024**2;
if (residentBytes > memoryBudgetBytes * 0.8) {
throw new Error(`Resident map cache exceeds budget: ${formatBytes(residentBytes)}`);
}
return { diskCacheBytes, residentBytes };
}
9. I18n und UX Labels¶
Verwenden:
AQMHAQMH dense quality mapsAQMH pixel-wise reconstructionAQMH cacheResident mapsTile Compile ClassicClassic local/tile metrics
Vermeiden:
AQMH tile modeAQMH/Classic combined modeClassic fallbackDense map modeAQMH as Classic local metrics
Mathematische interne Begriffe wie Phi_snr, Psi_s oder P_actual gehoeren nicht in normale UI-Texte. Sie koennen in Advanced Diagnostics oder Methodik-Dokumentation erscheinen.
10. Rollback und Notfallmechanismen¶
10.1 Rollback via Environment Variable¶
Zweck: Ermöglicht sofortige Rückkehr zu Classic, falls AQMH-First Probleme verursacht.
Implementierung:
// In tile_compile_cpp/src/io/config.cpp
std::string getEffectiveMethod(const Config& config) {
const char* forceClassic = std::getenv("FORCE_CLASSIC");
if (forceClassic && std::string(forceClassic) == "1") {
return "classic_tile_compile";
}
return config.method.value_or("aqmh");
}
Aufruf:
# Temporär für alle Runs
FORCE_CLASSIC=1 tile_compile_runner ...
# Oder als System-Environment-Variable
# (Linux): export FORCE_CLASSIC=1
# (Windows): set FORCE_CLASSIC=1
Wirkung: - Uebersteuert die effektive Methode nur fuer neu gestartete Runs - Uebersteuert den Default (AQMH) fuer neue Configs im aktuellen Prozess - Betrifft nur den aktuellen Prozess - Gilt nur fuer neue Run-Starts. Resume eines bestehenden Run-Verzeichnisses verwendet die dort gespeicherte Methode und darf nicht still umgeschaltet werden.
10.2 Rollback via CLI Flag¶
Alternative: Kommandzeilen-Flag für den Runner:
Implementierung: tile_compile_cpp/apps/runner/main.cpp
10.3 Rollback Prozedur¶
| Schritt | Aktion | Verantwortlich |
|---|---|---|
| 1 | Problem identifizieren (z. B. AQMH-Crash) | Nutzer/Dev |
| 2 | FORCE_CLASSIC=1 setzen oder --force-classic verwenden |
Nutzer |
| 3 | Run neu starten | Nutzer |
| 4 | Logs sammeln mit --verbose Flag |
Nutzer |
| 5 | Issue erstellen mit Logs und Reproduktionsschritten | Nutzer |
| 6 | Hotfix: Config-Normalisierung deaktivieren (falls nötig) | Dev |
10.4 Monitoring¶
Metriken zur Umstellungsüberwachung:
{
"method_usage": {
"aqmh": 1250,
"classic_tile_compile": 320,
"missing_method_defaulted_to_aqmh": 45
}
}
Implementierung: Prometheus-Metriken oder Logstash-Logs in web_backend_cpp
11. Testplan¶
11.1 Frontend¶
- Neue UI-Session zeigt AQMH als vorausgewaehlte Methode.
- Method Selector kann auf Tile Compile Classic wechseln.
- Wechsel auf Classic setzt
method=classic_tile_compile;aqmh.enabled=falseentsteht erst durch Normalisierung. - Wechsel auf AQMH setzt
method=aqmh;aqmh.enabled=trueentsteht erst durch Normalisierung. - Dashboard zeigt fuer AQMH die Gruppe
AQMH, nichtTILES. - Run Monitor zeigt fuer AQMH
AQMH mapsundAQMH reconstruction. - Classic-only Phasen erscheinen bei AQMH nicht als pending.
- Runs oder Configs ohne
methodwerden als AQMH angezeigt;aqmh.enabledwird fuer die Methodenerkennung ignoriert. - Keine combined/fallback/tile-weighting AQMH Controls werden gerendert.
- Dashboard ohne geladene Config zeigt
AQMH. - Wizard zeigt die AQMH Storage Section sofort.
- Parameter Studio startet in der AQMH Kategorie.
- AQMH Cache Estimate wird nach Scan ohne weitere Nutzerauswahl angezeigt.
- Dashboard-Warnungen erscheinen fuer grosse AQMH-Caches, hohe resident maps und Cherry-Pick.
11.2 Backend Contract¶
- Status endpoint enthaelt immer
method. - Neue Default-Config serialisiert
method: aqmh. - Config ohne
method, aber mit beliebigemaqmh.enabled, wird als AQMH erkannt. - Config ohne
methodund ohneaqmhwird als AQMH erkannt. - Inkonsistente Configs werden normalisiert oder mit klarer Validation-Fehlermeldung abgelehnt.
- AQMH-Status enthaelt storage/cache/map Summary, sobald verfuegbar.
- Schema YAML und JSON akzeptieren
method=aqmhundmethod=classic_tile_compile. Config{}/AqmhConfig{}Default-Konstruktion erzeugt den dokumentierten Default oder wird in Tests explizit gesetzt.
11.3 Integration¶
- Neuer Run aus dem Frontend startet als AQMH.
- Classic-Run aus dem Frontend startet nur nach expliziter Classic-Auswahl.
- AQMH-Run erzeugt AQMH-Artefaktgruppe und AQMH-Reportsektion.
- Resume eines AQMH-Runs behaelt
method=aqmh. - History zeigt AQMH und Classic eindeutig unterscheidbar.
11.4 Test Audit¶
Anzupassen sind alle Tests, die:
AqmhConfig{}ohne YAML bauen und implizit Classic erwarten.- Dashboard oder Wizard mit Classic als Default erwarten.
RUN_MONITOR_PHASE_ORDERals reine Classic-Liste erwarten.- Parameter Studio mit Classic als Startkategorie erwarten.
- History ohne
methodals Classic interpretieren.
11.5 Konkrete Test-Fixtures zu auditieren¶
Aktueller Audit-Stand im Repository:
| Datei | Status | Umsetzung |
|---|---|---|
web_backend_cpp/tests/test_run_status_resume_progress.cpp |
angepasst | Classic-Fixture setzt explizit method: classic_tile_compile; AQMH-Fixture setzt method: aqmh; Missing-Method-Fall erwartet AQMH; AQMH-Phasen erwarten AQMH_MAPS statt LOCAL_METRICS |
tile_compile_cpp/tests/* |
auditiert | Keine AQMH-first Default-Fixtures gefunden, die implizit Classic erwarten |
web_backend_cpp/tests/* |
auditiert | Keine weiteren AQMH-first Default-Fixtures gefunden |
| Frontend Tests | nicht vorhanden im aktuellen Repo | Keine Anpassung moeglich; UI wurde direkt in Wizard/Dashboard/Run-Monitor/Parameter-Studio/History angepasst |
Audit-Suchmuster:
rg -n "aqmh:\s*$|aqmh_enabled|AQMH_QUALITY_MAPS|method: aqmh|classic_tile_compile" web_backend_cpp/tests tile_compile_cpp/tests
Test-Kategorien:
- ✅ Unit Tests: normalizeMethod() Funktion und Config{} Defaults sind ueber Config-Code abgedeckt; dedizierter Unit-Test kann bei Bedarf ergaenzt werden.
- ✅ Integration Tests: Config-Parsing mit/ohne method-Feld wird im Backend-Status-Test abgedeckt.
- ⬜ E2E Tests: Wizard → Run → History Flow fuer beide Methoden existiert im aktuellen Repo nicht als automatisierter Frontend-Test.
- ✅ AQMH-first Missing-Method Tests: Configs ohne method werden als AQMH erkannt, unabhaengig von aqmh.enabled.
12. Empfohlene Umsetzungsreihenfolge¶
Phase 1: Backend Grundlagen (1-2 Tage)¶
- Config Schema (
tile_compile_cpp/include/tile_compile/config/configuration.hpp) - Top-Level
method-Feld hinzufügen aqmh.enabledals abgeleitetes Runtime-Flag dokumentieren- Config Parsing (
tile_compile_cpp/src/io/config.cpp) methodparsen/serialisierennormalizeMethod()implementieren- Schema-Konsistenzprüfung hinzufügen
- Schema Dateien aktualisieren:
tile_compile.schema.yamltile_compile.schema.json- Default Config (
tile_compile.yaml) method: aqmhals Default setzen
Phase 2: Backend Status & Events (1-2 Tage)¶
- Status Payload (
web_backend_cpp/src/services/run_inspector.cpp) methodin Status aufnehmennormalizePhaseEvent()implementieren- BGE Integration (
tile_compile_cpp/apps/runner) setBgeTileMetricsSource()implementieren- Example Configs
aqmh_enabled.example.yamlentfernen (AQMH ist jetzt Default, kein Sonderfall mehr)classic_mode.example.yamlerstellen- Optional:
aqmh_tuning.example.yamlmit erweiterter Pyramid-/Storage-Konfiguration
Phase 3: Code Audit (1 Tag)¶
- C++ Defaults auditieren
- Alle
Config{}Default-Konstruktionen prüfen - Test-Fixtures gemäß Section 11.5 anpassen
tile_compile_cpp/tests/config_test.cppweb_backend_cpp/tests/run_inspector_test.cpp
Phase 4: Frontend Grundlagen (2-3 Tage)¶
- Zentrale Method-Erkennung (
web_frontend/src/app.js) currentMethod()implementieren- State Persistence (URL-Hash/localStorage)
- Dashboard (
web_frontend/index.html,app.js)- Method Badge und Pipeline Preview AQMH-first
- Cache-Schätzung und Warnungen
Phase 5: Frontend UI (2-3 Tage)¶
- Wizard (
web_frontend/wizard.html)- AQMH als Default vorselektieren
- Storage-Profile anzeigen
- Parameter Studio (
web_frontend/parameter-studio-page.js)- Method-spezifische Sichtbarkeit
- AQMH als Default-Kategorie
- Run Monitor (
web_frontend/run-monitor.html)- Method-spezifische Phase Labels
- AQMH Metriken anzeigen
Phase 6: Reports & History (1 Tag)¶
- Artifacts & Reports
- AQMH-Artefaktgruppe in UI
- AQMH-Abschnitt im Report
- History
- Method-Tags und Vergleichsfelder
Phase 7: Rollback & Monitoring (1/2 Tag)¶
- Rollback-Mechanismen
FORCE_CLASSICEnvironment-Variable--force-classicCLI-Flag
- Monitoring-Metriken
- Method-Usage Tracking
Phase 8: Tests (2-3 Tage)¶
- Unit Tests für alle neuen Funktionen
- Integration Tests für Config-Parsing
- E2E Tests für Wizard → Run → History
- AQMH-first Missing-Method Tests für Configs ohne
method
Phase 9: Dokumentation & Finalisierung (1 Tag)¶
- Dokumentation aktualisieren
aqmh_frontend_integration_plan.mdaqmh_implementation_plan.md
- Finaler Review aller Änderungen
13. Abhaengigkeiten und Blockades¶
| Schritt | Blockiert von | Blockiert |
|---|---|---|
| Frontend Method-Erkennung | Backend Config method-Feld |
Dashboard, Wizard, Parameter Studio |
Status Payload method |
Config Normalisierung | Run Monitor, History |
| Rollback-Mechanismen | Config Parsing | Production Deployment |
| Frontend Tests | Backend Tests | Integration Tests |
14. Checkliste für Abnahme¶
- Alle
Config{}Default-Konstruktionen setzenmethod: aqmh -
normalizeMethod()ist implementiert und getestet - Schema-Validierung akzeptiert nur
aqmh/classic_tile_compile - Normalisierung leitet
aqmh.enabledausschliesslich ausmethodab - Status-Payload enthält
method -
FORCE_CLASSIC=1funktioniert fuer neue Runs als Rollback und wirkt nicht still auf Resume - Wizard zeigt AQMH als Default
- Dashboard zeigt AQMH Pipeline für neue Runs
- Run Monitor blendet Classic-Phasen bei AQMH aus
- Parameter Studio startet mit AQMH-Kategorie
- Alle Tests aus Section 11 passieren
- Dokumentation ist aktualisiert