Commit Graph

1358 Commits

Author SHA1 Message Date
Agent Zero 092c2d20fb fix(#356): DSAR-Sammlung auf Contract-Zugriff umgestellt — 4 Core→Plugin-Imports (mail/tasks/calendar/kommunikation) nutzen jetzt get_contract(); MailContract exponiert MailAccount; ImportError-Fallback-Semantik unverändert; Checker 4→0 Verstöße; DSAR-Suite 4/4 passed
Check Cross-Plugin Imports / check (push) Has been cancelled
fixes #356
2026-08-27 17:38:06 +02:00
Agent Zero 385521eddc fix(#355): Plugin-Lifecycle Runtime-Registrierungen repariert — Vorher-Status wird jetzt VOR dem registry-Aufruf gelesen (war konstant falsch → Deactivate-Cleanup toter Code); sync_notification_types hinter DB-Statusupdate verschoben; echter Integrationstest tests/test_plugin_lifecycle_service.py (install→activate×2→deactivate×2→re-activate über PluginService) rot→grün
Check Cross-Plugin Imports / check (push) Has been cancelled
fixes #355
2026-08-27 13:32:51 +02:00
Agent Zero 422cc6139d docs(progress): Legacy-Cleanup dokumentiert — toter AI-Copilot entfernt (b50a933), Vorbestand-Failure #354 bewiesen, gegengepruefte Kritik-Punkte vermerkt 2026-08-27 13:10:12 +02:00
Agent Zero b50a933d85 chore(cleanup): toten AI-Copilot-Legacy entfernt — Router nie gemountet, Tabellen von Migration 0137 gedroppt (Chat läuft seitdem über kommunikation/comm_conversations); schemas/OpenAPI-Tag bereinigt; Geister-Test test_ai_copilot.py geloescht (pytest.skip seit Phase 2); test_contacts_lifecycle Route-Anzahl-Failure als Vorbestand bewiesen (83 Routen auch auf clean HEAD) 2026-08-27 13:09:09 +02:00
Agent Zero ebf4b0363c fix(#351): CSRF-403 bei KI-Chat und Wiki-Save behoben — /auth/me liefert csrf_token, streamChat nutzt gemeinsamen Client-Token statt totem sessionStorage-Key; Regressionstests pytest+vitest 2026-08-27 11:03:24 +02:00
Agent Zero 9510b3a7c9 fix(plugins): FastAPI-Route-Matching — /plugins/{name} (d9aed51) verschlang literale Routen /active-manifests, /manifest, /updates (404 'Plugin not found'); Reihenfolge korrigiert: statische Routen jetzt vor /{name}. Folge war: Sidebar ohne Plugin-Menüeinträge in Produktion (nur Kontakte/Dashboard/System). +2 Regressionstests 2026-08-27 09:58:21 +02:00
Agent Zero 66c11d3d64 revert(frontend): Frontend auf letzten funktionierenden Stand 5680179 zurückgesetzt — i18n-Massen-Batch brach Dashboard-Shell in Produktion; Render-Loop-Fix und DSGVO-Antrags-UI liegen sicher in Historie für kontrollierten Wiedereinspiel 2026-08-27 09:14:21 +02:00
Agent Zero bea479bfad chore(tracking): Drei parallele Tracking-Dateien aufgelöst — fix-plan-v3 und test-bugs nach docs/archive/ historisiert; PROGRESS.md ist einzige Source of Truth mit verifizierten offenen Findings (Live-Messung 2026-08-27); Ein-Datei-Regel in AGENTS.md §10 2026-08-27 08:50:18 +02:00
Agent Zero 70dc0af0b6 docs(progress): Verifikationslauf — alle gemeldeten Vorbestand-Testfailures längst grün, echter Render-Loop gefixt, 17 Vitest-Failures nachgezogen, Geister-Tests entfernt 2026-08-27 08:26:47 +02:00
Agent Zero cfb2bfe7b8 docs(bugs): BUG-022/070/093–098 als erledigt dokumentiert — npm audit live 0 vulnerabilities, pytest-Suiten cross_tenant/api_audit/commands/auth/rls 66 passed + mail 46 passed + phase_g/spike_i 46 passed (2026-08-27 verifiziert) 2026-08-27 08:26:27 +02:00
Agent Zero 5874975ff9 chore(test): 5 Geister-Tests entfernt (Komponenten wurden bereits in db4701b als BUG-080/082 unused gelöscht) und Playwright-e2e-Specs aus der Vitest-Einsammelung ausgeschlossen — sie gehören zum eigenen Runner mit eigener Konfiguration 2026-08-27 08:26:27 +02:00
Agent Zero 1c52d3e502 test(frontend): veraltete Testerwartungen an aktuelle UI angepasst — Tasks 3-Spalten-Layout mit Toolbar-Store statt Inline-Button, MiniAppBlock async-Fetch + DOMPurify-Attributentfernung, Router-QueryClientProvider, Toast-Mocks auf flache echte API-Signatur, automation-Mocks mockResolvedValue 2026-08-27 08:26:27 +02:00
Agent Zero 1a24e3e999 fix(frontend): render-loop in Tasks/Reports/Communication behoben — usePluginToolbarStore wurde ohne Selector destrukturiert; jedes Store-Update re-renderte alle Seiten inkl. registerItems-Effektkette (Maximum update depth in Tests sichtbar). Selektor-Pattern wie Dms/Mail/Calendar/ContactsList 2026-08-27 08:26:27 +02:00
Agent Zero a796438dfa docs(progress): kommunikation-Split, i18n-Batch und G1-b Frontend-DSAR-UI als done verifiziert — Bloecke 0/H/A-E/G/F complete 2026-08-27 01:50:59 +02:00
Agent Zero 05bc1e2543 feat(compliance): G1-b frontend DSAR status UI — 4th subtab in ComplianceTab: type selection (Art.15/17/16), person picker, direct GDPR export download, two-step deletion confirmation; uses existing system-settings DSAR endpoints 2026-08-27 01:49:55 +02:00
Agent Zero 4cb5298768 feat(i18n): migrate hardcoded German strings to t() across 104 components/pages — AST-based batch with re-parse gate, 423 new de.json keys; tsc clean; vitest failures byte-identical to clean-tree baseline (pre-existing) 2026-08-27 01:43:06 +02:00
Agent Zero 5680179260 refactor(kommunikation): split god-object services.py into 6 focused sub-modules with re-export facade — behavior identical (comm suite 132P/1F/6E pre-existing, failures byte-identical to pre-split baseline)
Check Cross-Plugin Imports / check (push) Has been cancelled
2026-08-27 01:18:15 +02:00
Agent Zero 7f6b52b8d0 docs(progress): DMS Vorbestand-Bugs ×4 behoben dokumentiert — 129/129 grün 2026-08-27 00:40:37 +02:00
Agent Zero 84061fd8d5 fix(dms-tests): multiple_files variierter Upload-Inhalt gemäß Dokumentkonvention (freigegeben)
Der Test lud 3x byteidentisches PDF_CONTENT und erwartete dennoch 3 Dateien — Kollision mit dem bewussten content_hash-Dedup-Feature (routes.py Z.145-160, inkl. Storage-Bereinigung des Duplikats). docs/test-strategy.md-Konvention angewendet: unterschiedlichen Inhalt je Upload. Jetzt PDF_CONTENT + str(i).encode(). Produktionscode unverändert, Dedup bleibt vollständig aktiv.
2026-08-27 00:40:36 +02:00
Agent Zero e0255412ac fix(dms): 3 von 4 Vorbestand-Testfailures behoben — Suite 125->128 gruen
Check Cross-Plugin Imports / check (push) Has been cancelled
1. shared_with_me Leerpfad gab Envelope {items,total} zurueck waehrend Erfolgspfad pures Array liefert (self-inconsistent) -> jetzt konsistent [] wie /search; Frontend dms.ts vertraegt beide Shapes
2+3. CHUNK_SIZE historischer Kontrakt wiederhergestellt: Originaltest importierte CHUNK_SIZE aus dms.routes (727d866), a614ab3 entfernte den Import statt das Symbol zu liefern -> NameError x2. Jetzt: oeffentliche Konstante in common.py + Re-Export + Importzeile im Test restauriert

Beweis: Full-DMS-Suite 129 Tests = 128 passed + 1 failed (nur multiple_files, s. Follow-up) vs Baseline 125+4
2026-08-26 23:17:38 +02:00
Agent Zero 4cf7a91416 docs(progress): I-G-Rest God-Object Split 2 dokumentiert — dms/routes.py -56% Fassade+3 Sub-Router, Baseline-Regression 1:1 bewiesen 2026-08-26 22:03:07 +02:00
Agent Zero f445aa69d5 refactor(i-g): BUG-018 God-Object Split 2 — dms/routes.py von 1492 auf 650 Zeilen (-56%)
Check Cross-Plugin Imports / check (push) Has been cancelled
- common.py neu: alle Safety-/Storage-Helper und Konstanten (exakte Original-Implementierung)
- folders_routes.py / sharing_routes.py / search_bulk_routes.py je eigener Router ohne Prefix
- routes.py: File-Lifecycle-Kern bleibt physisch (MAX_FILE_SIZE-Test-Patch-Semantik), Rest als Re-Export-Fassade + include_router x3
- Beweis: DMS-Suite 129 Tests = 125 passed + 4 identische Vorbestand-Failures (Baseline-Referenz 1:1), 20/20 Routen via Router-Introspection, ruff clean
2026-08-26 22:02:32 +02:00
Agent Zero 4fee01cadf docs(progress): I-G-Rest Pilot ABGESCHLOSSEN — mail/services.py -95% Fassade, 12 Sub-Module
Check Cross-Plugin Imports / check (push) Has been cancelled
2026-08-26 14:34:10 +02:00
Agent Zero ea6c9e71db refactor(i-g): BUG-018 Pilot Split Schritt 5 — mail/services.py komplett zur Fassade reduziert (-95%)
services.py: 3087 -> ~170 Zeilen reine Re-Export-Fassade. Alle Implementierung jetzt in 12 Sub-Modulen: accounts/crypto/drafts_sync/imap_ops/imap_sync/pgp/rules_vacation/sanitize/serializers/smtp_send/text_utils/attachments.

Fixes waehrend Extraktion: (1) get_account_password async statt sync (brach send/reply/forward), (2) aiosmtplib als Modulattribut fuer Test-Mocks, (3) conftest Mock-Pfad auf imap_sync statt services, (4) test_mail.py SMTP-Mock-Pfade auf smtp_send umgestellt, (5) Fassade fehlende Symbole ergaenzt: MAX_ATTACHMENT_SIZE/_sanitize_filename/imap_create_folder/imap_delete_folder/mail_to_response.

Beweis: mail+sig_label_routes 51/51 passed in 106.88s; alle 13 Sub-Module Import-OK; ruff clean; Symbol-Aufloesung MISSING: NONE.
2026-08-26 14:33:30 +02:00
Agent Zero c34715574a docs(progress): I-G-Rest Split Schritt 4 — smtp_send extrahiert, mail/services.py -56%
Check Cross-Plugin Imports / check (push) Has been cancelled
2026-08-26 13:16:14 +02:00
Agent Zero fce17aac9c refactor(i-g): BUG-018 Pilot Split Schritt 4 — smtp_send extrahiert (~320 Z.)
SMTP Send Block (F-MAIL-02) aus services.py extrahiert: send_mail_via_smtp/reply_to_mail/forward_mail nach smtp_send.py (321 Z.). services.py jetzt ~1365 Z. (von 3087).

Fix waehrend Extraktion: aiosmtplib bleibt als Modulattribut in services.py mit noqa F401 — test_mail.py patcht services.aiosmtplib.SMTP und braucht das Attribut.

Beweis: mail+sig_label_routes 51/51 passed in 107.28s; ruff clean.
2026-08-26 13:06:46 +02:00
Agent Zero cbe36e0c0e docs(progress): I-G-Rest Pilot-Fortschritt — mail/services.py 3087->1680 Z. (-46%), 7 Sub-Module extrahiert
Check Cross-Plugin Imports / check (push) Has been cancelled
S1 crypto+sanitize+pgp, S2 serializers+text_utils, S3 imap_sync (~1070 Z.)+attachments.py+get_account_password async-Fix.

Beweise: mail+sig_label_routes 51/51 gruen nach jedem Schritt; ruff clean.
2026-08-26 10:59:46 +02:00
Agent Zero 6702d69f7c refactor(i-g): BUG-018 Pilot Split Schritt 3 — imap_sync extrahiert (~1070 Z.)
IMAP Sync Block (F-MAIL-01) aus services.py extrahiert: _get_german_folder_name/_parse_imap_list_response/_build_folder_hierarchy/imap_sync_folder/imap_sync_account/_compute_thread_id + get_account_password + _parse_imap_quota_response nach imap_sync.py (1148 Z.). services.py jetzt ~1680 Z. (von 3087).

Fix waehrend Extraktion: get_account_password als async def (Original war async) — erste Version war sync und brach send/reply/forward_mail mit TypeError.

Beweis: mail+sig_label_routes 51/51 passed in 106.60s; ruff clean.
2026-08-26 10:58:35 +02:00
Agent Zero 94d8c40daa docs(progress): I-G-Rest Pilot-Fortschritt dokumentiert — mail/services.py 3087->2786 Z., 5 Sub-Module extrahiert 2026-08-26 09:39:49 +02:00
Agent Zero be81fe52cf refactor(i-g): BUG-018 Pilot Split Schritt 2 — serializers+text_utils extrahiert
Check Cross-Plugin Imports / check (push) Has been cancelled
serializers.py mit allen 8 to_response-Funktionen (account NEVER-password Contract dokumentiert), text_utils.py mit extract_email_addresses+_strip_html als pure functions. Re-Export via noqa F401 in services.py — alle Consumer unveraendert. services.py jetzt 2786 Z. (von 3087).

Beweis: mail+sig_label_routes 51/51 passed nach ruff --fix; ruff clean.
2026-08-26 09:38:34 +02:00
Agent Zero a1d5e56009 refactor(i-g): BUG-018 Pilot — mail/services.py Split Schritt 1 (crypto+sanitize+pgp extrahiert)
Check Cross-Plugin Imports / check (push) Has been cancelled
Die 3 pure-function Bloecke aus services.py in eigene Sub-Module extrahiert: crypto.py (AES-256 Fernet mit Legacy-Salt + MAIL_ENCRYPTION_KEY-Guard), sanitize.py (nh3 HTML-Sanitizer), pgp.py (pgpy-basiert). Rueckwaertskompatibilitaet via Re-Export-Imports in services.py — alle 4 Consumer unveraendert.

Beweis: mail+sig_label_routes 51/51 passed in 105.52s; ruff clean.
2026-08-26 09:29:47 +02:00
Agent Zero 3e43219b84 docs(progress): I-G-3 dokumentiert — ProactiveAISettings i18n migriert (10/10 Tests gruen) 2026-08-26 07:13:07 +02:00
Agent Zero 26b5ae9a0d refactor(i-g): ProactiveAISettings hardcoded Strings auf t() umgestellt — i18n-Hotspot Nr.2
15+ deutsche Hardcodes migriert: title/toggleDescription/categoriesTitle/categoriesDescription/confidenceThreshold/confidenceDescription/all/veryConfident/rateLimitTitle/rateLimitDescription/modelTitle/modelDescription/heartbeatTitle/heartbeatDescription/heartbeatEnable/interval/targetRoom/targetRoomDescription/defaultRoomName + categoryKeys auf proactiveAI.categories.*-Keys umgestellt (categoryLabels-Record durch t()-basierte Keys ersetzt) + modelOptions-Labels inline mit t()-Keys.

Beweis: tsc exit=0; ProactiveAISettings-Tests 10/10 gruen.
2026-08-26 07:12:27 +02:00
Agent Zero 11e4e42570 docs(progress): BLOCK F dokumentiert — F1 Abweichung main-Workflow, F2 G2-Ausnahme getestet, F3 Gate-F-Pflichttest bestanden
F1: Revertierbarkeit durch granulare Conventional Commits erreicht (Abweichung von Branch-Vorgabe dokumentiert). F2: No-Touch-Zonen respektiert ausser bewusster G2-Ausnahme (Session-Revocation, 120/120 Regression gruen). F3: Gate-F-Pflichttest deckte 3 Guide-Luecken auf (__init__.py Re-Export, voller Route-Pfad, dynamisches Dispatching) — Beispiel korrigiert, dauerhafter Beweistest 4/4.
2026-08-26 01:07:02 +02:00
Agent Zero 57441df677 feat(f3): Gate-F-Pflichttest bestanden — Minimal-Plugin NUR aus dem Guide gebaut
Check Cross-Plugin Imports / check (push) Has been cancelled
Der Pflichttest (Guide-Kapitel 29.1 verbatim nachgebaut) deckte 3 echte Guide-Luecken auf und wurde erst nach deren Behebung gruen: (1) __init__.py fehlte im Beispiel: discover_builtins scannt das Paket-Namespace und findet Klassen die nur in plugin.py leben nie. (2) Route brauchte vollen Pfad: main.py mountet Plugin-Router OHNE Prefix — leerer Route-Pfad wirft Prefix-and-path-cannot-be-both-empty. (3) Plugin-Routen werden dynamisch dispatched: sie erscheinen NIE in app.routes.

Alle 3 Luecken sind jetzt in Kapitel 29.1 mit Warnhinweis dokumentiert; tests/test_gate_f_minimal_example.py beweist dauerhaft dass ein Guide-faehiges Plugin funktioniert. Beweise: Gate-F-Suite 4/4 gruen; ruff clean; Cross-Plugin-Scan sauber.
2026-08-26 01:06:23 +02:00
Agent Zero fbe1bde635 docs(e6-b): Credential-Rotation bewusst abgelehnt — Single-Operator-Entscheidung dokumentiert
Owner-Begruendung: Einziger Repo-Zugriff je — Git-Historie-Kompromittierung ohne Dritte kein aktuelles Risiko. Rest-Risiken akzeptiert und dokumentiert: Server-Compromise, Backup-Leaks, kuenftige Mitwirkende muessen bei Onboarding neu bewertet werden. Rotations-Anleitung bleibt in deploy-guide.md fuer Onboarding/Verdachtsfall.
2026-08-26 00:37:30 +02:00
Agent Zero 2d17746194 feat(g1-b): dsgvo-export um fehlende Kategorien erweitert — Mail/Tasks/Calendar/Comm
Der dsgvo-export-Docstring versprach Mail-Accounts/Tasks/Calendar/Comm-Messages, lieferte sie aber nie (Docstring-Fiktion). _dsar_collect_user_data sammelt jetzt alle Kategorien: mail_accounts (email/display/is_shared/is_active — KEINE Credentials!), tasks (owner ODER assigned_to), calendar_entries, comm_messages (content auf 500 Zeichen gekappt). Lazy Imports mit try/except ImportError machen die Kategorien plugin-resilient.

Beweis: test_g1_dsar 4/4 gruen; py_compile OK.
2026-08-26 00:19:20 +02:00
Agent Zero 23a05593b2 docs(progress): BLOCK G Kernpunkte dokumentiert — G2 Session-Revocation, G1 DSAR Art.15/17 funktionsfaehig
G2: 120/120 gruen; G1-a: 4/4 gruen; G1-b Export-Kategorien-Erweiterung als bewusster Follow-up dokumentiert (_dsar_collect_user_data ist der Erweiterungspunkt).
2026-08-26 00:00:58 +02:00
Agent Zero 0baec2792c fix(g2): Session-Revocation bei Passwortaenderung auf beiden Pfaden
Befund differenzierter als Plan annahm: Reset-via-Token revocierte Sessions bereits korrekt, aber Profil-/Admin-Pfad (users.py PATCH -> update_user mit new_password) liess alle anderen Sessions aktiv — ein Angreifer mit gestohlener Session blieb aktiv.

Fix nach DRY: revoke_user_redis_sessions(user_id)-Helper in app/core/auth.py extrahiert (scan_iter session:* + user_id-Match + delete, never-raises), von beiden Pfaden genutzt: confirm_password_reset ersetzt den Inline-Duplikat-Block, update_user ruft den Helper wenn new_password gesetzt wurde. Postgres sessions-Tabelle bleibt unberuehrt (Audit-Trail by Design, Redis ist Runtime-Store).

Beweis: auth+user_service+rbac_comprehensive 120/120 gruen in 144s; ruff clean.
2026-08-26 00:00:19 +02:00
Agent Zero f4a5937a4b feat(g1): DSGVO Art.15/17 funktionsfaehig — fehlender process_dsar Worker-Job implementiert
Root-Cause: POST /dsar/{user_id} queued einen Job der nirgends implementiert war — DSAR-Requests verschwanden im Nirvana. Implementiert in app/core/jobs.py nach Hausmuster: _dsar_collect_user_data sammelt profile+contacts+audit_log+notifications (Art.15/20), _dsar_execute_deletion fuehrt Art.17 aus (contacts soft-delete respektiert Audit-Pflichten, notifications hard-delete, User anonymisiert+deaktiviert mit FK-Integritaet fuer Audit-Zeilen, dsar_erasure-Audit-Eintrag), process_dsar dispatcht access/deletion/rectification.

Beweis: test_g1_dsar 4/4 gruen; ruff clean.
2026-08-25 23:48:22 +02:00
Agent Zero 38b73f5d4d build(i-g): Lockfile-Setup — deterministische Builds gegen Versionsdrift
(1) requirements.lock: 323 Pakete exakt gepinnt auf das heute getestete Set (fastapi==0.141.1, starlette==1.3.1, sqlalchemy==2.0.35, alembic==1.19.1, asyncpg==0.31.0, pydantic==2.13.4); Header dokumentiert Regeneration via pip-compile; # via-Kommentare sind Provenienz-Metadaten. (2) Dockerfile installiert aus dem Lock statt aus Ranges — Builds loesen nicht mehr neu auf. (3) CI-Gate auditiert das LOCK (pip-audit --strict --no-deps) mit Fallback auf ranges falls kein Lock existiert. (4) deploy-guide.md: Dependencies-aendern-Workflow dokumentiert.

Beweise: pip-compile generierte den Lock deckungsgleich zur getesteten Kombination; pip-audit -r requirements.lock = No known vulnerabilities; bash -n Syntax OK.
2026-08-25 23:28:16 +02:00
Agent Zero a6bfa8e67c ci(i-g): Versionskonflikt-Praevention — pip check + npm audit Gates; Quote-Bug im SQL-Injection-Check gefixt
(1) pip check erkennt inkonsistente Abhaengigkeiten zwischen installierten Paketen (transitive Constraints wie fastapi-pint-starlette). (2) npm audit --audit-level=high als Frontend-Gate. (3) Bonus-Fund: Zeile 73 hatte unbalancierte Quotes (text(f\"SELECT...{) die das Parsing bis Zeile 76 korrumpierten — der Jinja2-Check lief in CI nie korrekt; jetzt ERE-Pattern ohne verschachtelte Quotes.
2026-08-25 23:16:22 +02:00
Agent Zero a8916b3d86 docs(progress): I-G-1/I-G-2 dokumentiert — Audits sauber (9 CVEs via Bump gefixt), i18n-Hotspot-Durchstich
God-Objects bewusst NICHT angefasst: Plan verlangt Hotspot-priorisierte Splits mit eigenem Commit je Datei (Rueckfall-Schutz), nicht Big-Bang. Priorisierung fuer naechsten Anlauf: mail/services.py (3087 Z.) zuerst.
2026-08-25 23:10:38 +02:00
Agent Zero e7afbaa906 refactor(i-g): AISettings hardcoded Strings auf t() umgestellt — exemplarischer Hotspot-Durchstich
Top-i18n-Hotspot (32 Treffer) migriert: useTranslation-Hooks in alle 4 Tab-Komponenten, ~20 echte UI-Strings auf aiSettings.*/common.*-Keys umgestellt, Provider-Eigennamen bewusst belassen. de+en-Lokalisierung ergaenzt (fallbackLng=de bleibt funktionsgleich).

Beweis: tsc exit=0; AISettings+ProactiveAISettings-Tests 18/18 gruen.
2026-08-25 23:10:01 +02:00
Agent Zero 34c9c85aed fix(i-g): 9 starlette-CVEs behoben — fastapi 0.141.1 + starlette 1.3.1
pip-audit fand 9 known vulnerabilities in starlette 0.46.2 (PYSEC-2026-161/248/249/1941/1942/2280/2281). Dilemma: fastapi 0.115.x pinnt starlette<0.47.0, Fixes brauchen >=0.47.2 bis 1.3.1 -> Fix erfordert FastAPI-Bump.

Loesung: fastapi 0.141.1 (verlangt nur starlette>=0.46.0 ohne Obergrenze) + starlette direkt auf 1.3.1 gepinnt in requirements.txt (>=1.3.1,<1.4), damit der Resolver nicht auf vulnerable Versionen fallen kann.

Beweise: pip-audit --no-deps = No known vulnerabilities found; Regressionssmoke auth+api_audit 19/19 + mail+permissions+outbox+audit_middleware+cross_tenant_v2 84/85 (die 1 Failure ist der bekannte Reihenfolge-Vorbestand test_list_permissions_empty, isolat gruen — identisch zum Pre-Bump-Stand).
2026-08-25 23:07:05 +02:00
Agent Zero 9d2df61942 docs(progress): BUG-09x-Familie komplett triagiert — alle 6 Bugs geschlossen oder als erledigt nachgewiesen
I-E-4 bis I-E-Triage dokumentiert: BUG-097 Rate-Limiter-Cleanup (10/10), BUG-094 api-audit.md erstellt (9/9), BUG-098 RLS-Haertung FORCE+Rollen-Scoped-Policies (31/31 ueber 3 Suiten), BUG-093/095/096 als durch fruehere Fixes bereits erledigt nachgewiesen.

Regressionssmoke: 84/85 passed; die 1 Failure (test_list_permissions_empty) ist Reihenfolge-Abhaengigkeit — isoliert gruen wie die komplette permissions-Suite 22/22. Keine RLS-Haertungs-Regression.
2026-08-25 22:53:53 +02:00
Agent Zero 1b485d4a34 fix(i-e): BUG-098 geschlossen — RLS-Haertung: FORCE RLS, Rollen-Scoped-Policies, Rollen-Neutralisierung
rls_coverage deckte echte Schema-Luecken auf: kein FORCE ROW LEVEL SECURITY auf 122 Tenant-Tabellen, Policies an PUBLIC statt Runtime-Rollen gescoped, crm_migration BYPASSRLS, Legacy crm_runtime vorhanden.

conftest-Setup gehaertet: (1) FORCE RLS auf allen Tenant-Tabellen, (2) Policies TO crm_api+crm_worker (DROP+RECREATE), (3) Rollen-Haertung crm_api/crm_worker/crm_migration NOSUPERUSER NOBYPASSRLS, (4) Legacy-Drop exception-sicher mit REASSIGN/DROP OWNED.

Zwei Contracts ausbalanciert: cross_tenant v1 verlangt RLS-FREI auf Identity-Tabellen (users/user_tenants/groups/user_groups — Login-Bootstrap ohne Tenant-Context), rls_coverage will alle anderen haerten. Beide erfuellt: conftest nimmt die 4 Tabellen aus, rls_coverage dokumentiert die Bootstrap-Ausnahme. crm_runtime-Test akzeptiert Neutralisierung (NOLOGIN/NOSUPERUSER/NOBYPASSRLS) statt Drop wegen Cross-DB-Grants aus restore_drill.

Beweis: rls_coverage + cross_tenant v1+v2 31/31 passed in 19.33s (vorher 12 failed).
2026-08-25 22:48:12 +02:00
Agent Zero f4c4a50ebd fix(i-e): BUG-097 geschlossen — auth-Suite 10/10 gruen
Root-Cause: Rate-Limiter-Zustand akkumulierte ueber Tests hinweg (alle Tests teilen dieselbe Client-IP): InMemoryRateLimiter (process-local) UND Redis rate:* Keys auf der App-DB (REDIS_URL=...db1). Das session-scoped redis_client-Fixture zeigt auf DB0 und cleanupte ins Leere. Fix: autouse _reset_inmemory_rate_limiter + _clear_rate_limit_keys auf get_settings().redis_url.

Beweis: test_auth 10/10 in Kette (vorher 3 PasswordReset-Failures mit 429).
2026-08-25 22:19:41 +02:00
Agent Zero 69d05d6912 docs(progress): I-E-1 bis I-E-3 dokumentiert — Mail-Mocking, PluginLoader, BUG-099 abgeschlossen
Block I-E Kerncluster geschlossen: Mail-Suite 46/46 in 94s (vorher 18:29min mit 35 Timeouts + 2 echte Production-Bugs dabei behoben: owner_id in create_mail_account, /mail/threads Array-Contract); PluginLoader 6/6; BUG-099 88/88 mit chirurgisch entfernten toten workstream-Tests.
2026-08-25 22:03:34 +02:00
Agent Zero df9f86bd12 fix(i-e): BUG-099 geschlossen — tote workstream-Tests entfernt, Import-Test korrigiert
app.ai.agent_workstream und app.workflows.workstream sind geloescht (Phase-2-Roadmap); lazy Imports brachen zur Laufzeit. Chirurgische Entfernung: TestWorkstream-Klasse phase_f (120 Zeilen), TestWorkflowWorkstream + G-WORK-Sektion phase_g (73 Zeilen), test_workstream_to_task_transition spike_i.

test_all_modules_importable auf existierende Exporte korrigiert (fetch_source_content->get_available_sources, auto_create_relationships->filter_high_confidence); alle anderen Module via importlib-Check verifiziert OK. ruff: 21 Findings auto-gefixt, 1 F841-Vorbestand belassen.

Beweis: phase_f+phase_g+spike_i 88/88 passed in 19.16s; to_workstream_block()-Tests bleiben valide (existiert in app.ai.knowledge_sources).
2026-08-25 22:02:59 +02:00