Commit graph

8 commits

Author SHA1 Message Date
Nora
aae8c38a20 security(gate3): Security-Review-Haertung ueber 4 Pakete (luna-pro)
Phase 6 / Gate 3 — Security-Review auf den fertigen Code, 4 thematische Pakete:
- P1 Secrets+Injection (client/phraser/diagnostics): validate haertet URL/Entity/
  Unicode-Umgehungen (// , &entity; , Cc/Cf/Zl/Zp); kein Key-Leak.
- P2 XSS+externe (card/ha_entity/frontend): kein XSS; DoS-Caps (Forecast 400, Karte 60).
- P3 Mutator+Startup (coordinator/__init__/const): nicht-blockierender Startup via
  Background-Task, LLM-/Store-Ops defensiv, weather_entity_id-Guard, build_items
  NaN/inf+Caps, Warn-Log ohne Secret.
- P4 Flows (config_flow): test_entity exception-frei, _clean_item defensiv, finite
  Bandgrenzen + sanitized_options-Normalisierung, echte bool-Coercion, Typ-Log.
- 24 Findings, 14 uebernommen (mit Regressionstests), 10 verworfen mit Evidenz.
  Suite gruen 188/188. Gate 3 BESTANDEN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 16:01:31 +00:00
Nora
2996400098 feat(4.2): LLM-Phraser mit Prompt-Haertung & Ausgabe-Validierung
Story 4.2 (TDD, reiner Kern, Suite gruen 157/157):
- logic/phraser.py: build_prompt (nur strukturierte Empfehlung, JSON-escaped
  Untrusted-Stuecknamen + Ignorier-Instruktion, nie Fotos/Koordinaten/Entity-IDs),
  validate (a-e: kein Markup/Link/Code/Steuerzeichen, <=700, jeder Stueckname+Luecke,
  >=20; Verstoss->None=Regeltext), Injection-Katalog (AD-16/FR-6.6).
- luna-pro-Security-Review: 4/5 Findings uebernommen, 1 verworfen (Evidenz im Ledger).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 15:24:42 +00:00
Nora
e11e320093 feat(1.7): Coordinator (einziger Mutator) + reine Pipeline/Zieldatum
Story 1.7 (TDD, phcc, Suite gruen 97/97):
- logic/pipeline.py: reine End-to-End-Pipeline (normalize->rules->matcher->assemble)
  inkl. no-coverage-Fehlerpfad; logic/schedule.py: Zieldatum/Umschaltzeit (halboffen).
- coordinator.py: DataUpdateCoordinator, asyncio.Lock, timeout(10), einheitlicher
  Fehler-Contract (UpdateFailed mit Vorgaenger / fehler_prognose sonst), changed via
  helpers.storage.Store, last_success_utc, defensiver Item-Aufbau aus Subentries.
- luna-pro-Story-Review: 5/6 Findings uebernommen, 1 verworfen (.time()-naiv-Evidenz).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 14:05:57 +00:00
Nora
2a83ab7394 feat(1.5): Texte (de/en) & kanonische Payload-Projektionen
Story 1.5 (TDD, Suite gruen 72/72) — schliesst den reinen logic/-Kern ab:
- logic/texts.py: de/en-Katalog, build_short/build_full (webt Gruende + Datenlage ein).
- logic/assemble.py: reine Recommendation-Zusammenstellung + Sprach-Subtag.
- logic/model.py: to_payload + 4 Projektionen (state/attributes/event/response),
  Shedding-Kaskade mit finalem Groessen-Garant, compute_signature (AD-14/19/20).
- luna-pro-Story-Review: 5/6 Findings uebernommen, 1 verworfen (orjson-Evidenz).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 13:52:20 +00:00
Nora
4bf183530e feat(1.4): Matcher — Outfit-Komposition, Schichtung, Aussenschicht, Luecken
Story 1.4 (TDD, Suite gruen 59/59, inkl. normativer §8-Abnahmetest):
- logic/matcher.py: vollstaendiges Outfit (Basis + Schichten top->sweater->jacket
  bis Waermebedarf, Hosen-/Schuh-Mindestwaerme), Aussenschicht-Attribute auf
  aeusserster Schicht, sprachneutrale Grund-Keys, benannte Luecken (§4/§4a).
- §4.6-Prioritaetskonflikt Waerme<->Attribut, temp-range-Filter inklusiv (AD-22).
- luna-pro-Story-Review: 6/7 Findings uebernommen, 1 verworfen (Evidenz im Ledger).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 13:43:35 +00:00
Nora
6d87e1082b feat(1.3): deterministische Regel-Engine (Requirements aus Normprognose)
Story 1.3 (TDD, Suite gruen 47/47):
- logic/rules.py: Regeltabelle Addendum §3 + §3a-Degradation, Basis-Outfit immer,
  Offset genau einmal (+1 = Schwellen +2°C nach oben, mehr Waerme), kanonischer
  Merge (max-Prioritaet, warmth-Floor via max), Schwellen aus Options (AD-21/23).
- Doku-Fix: Offset-Beispiel in epics.md-AC korrigiert (Richtung).
- luna-pro-Story-Review: 1 Finding verworfen mit Evidenz (§3a 'uebrige Regeln').

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 13:32:54 +00:00
Nora
67430837c8 feat(1.2): SI-Forecast-Normalizer mit expliziter Missingness
Story 1.2 (TDD, Suite gruen 31/31):
- logic/normalize.py: RawForecast -> NormForecast (SI), NormField je Feld,
  Einheiten explizit konvertiert (nie geraten), Plausibilitaet nach Konvertierung,
  Morgenfenster [06:00,09:00) lokal, hourly-only-Ableitung, Condition-Mapping (AD-4/17).
- luna-pro-Story-Review fand echten Zeitzonen-Bug (UTC->lokal vor Fensterauswertung);
  6/8 Findings uebernommen, 1 teils, 1 verworfen (Evidenz im Ledger).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 13:27:48 +00:00
Nora
eff3fa28a9 feat(1.1): Skeleton, pure-core Datenmodell, Options-Schema & Layering-Guard
Story 1.1 (TDD, Suite gruen 19/19):
- logic/model.py: frozen Dataclasses (NormField, RawForecast, NormForecast,
  Requirement, Item, ChosenItem, Gap, Outfit, Recommendation) + Enums
  RequirementKey/Category/Priority (AD-14/21/22).
- const.py: normatives flaches Options-Schema + default_options()-Deepcopy,
  TO_REDACT, Timeouts, LLM-URLs (AD-5/6/23).
- manifest.json/hacs.json (min HA 2025.3), Layering-Guard per AST (AD-1).
- luna-pro-Story-Review: 4/6 Findings uebernommen, 2 verworfen (Evidenz im Ledger).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 13:20:42 +00:00