Files
nexus/phases/changelog.md
T
devops f95463ef50
CI - Build & Test / Backend (.NET) (push) Successful in 28s
CI - Build & Test / Frontend (Vue/TS) (push) Successful in 18s
CI - Build & Test / Security Check (push) Successful in 2s
fix: permanent owner password persistence with SeedAudit guard
Root cause: Dual-source architecture for owner password (Gitea secret
ENV_OWNER_PASSWORD vs host .env OWNER_PASSWORD) caused drift when
the DB was ever re-seeded or the volume recreated.

Changes:
- Add SeedAudit entity + migration to track one-time seed operations
- EnsureDatabaseAsync checks SeedAudit BEFORE seeding — owner is never
  re-created even if the Users table is wiped
- Deploy and rollback workflows now read OWNER_PASSWORD from the host's
  persistent .env (single source of truth) instead of Gitea secrets
- compose.yaml documented: OWNER_PASSWORD only used during initial seed
- Cleanup: .gitignore extended for core dumps, changelog/deployment.md
  updated with 2026-06-20 session notes

After this fix the DB is the single source of truth for the owner
password after initial seed. The host .env is the single reference
for the initial value.
2026-06-21 10:15:36 +02:00

13 KiB
Raw Blame History

Changelog

Letzte Aktualisierung: 2026-06-20

  • 2026-06-20: Agent-Progress-Visibility live ausgerollt; normaler Gitea-Deploy-Trigger weiter defekt.

    • Feature-Stand auf main: adae7ba (feat: ship agent progress visibility); nach CI-Blocker-Fix 2d21885 (Fix activity repository test double) war CI fuer Backend, Frontend und Security gruen.
    • Da POST /actions/workflows/deploy.yaml/dispatches serverseitig HTTP 500 lieferte und fuer 2d21885 kein erfolgreicher Deploy-Run belegbar war, wurde der produktive Rollout manuell aus einem sauberen Snapshot von Commit 2d21885 durchgefuehrt statt aus dem schmutzigen lokalen Worktree.
    • Deploy-Pfad: Snapshot-Sync nach /home/projekte_bao/openclaw/data/openclaw/workspace/nexus und danach docker compose --env-file .env up -d --build --force-recreate --wait.
    • Verifikation: Host-Deploy-Pfad auf Git-HEAD 2d218853a5d198fa8521dadbb4c6ea9be19e191c; nexus-postgres-1, nexus-api-1, nexus-web-1 healthy; https://nexus.noveria.net/health/live = 200; /dashboard = 200; /api/v1/operations/snapshot = 401 ohne Auth; GET /api/dashboard/tasks/caab972a-c46c-4af5-b2c4-9d31be824da3 liefert live lastActivityMessage und lastActivityAt.
    • Offener Betriebsblocker: Gitea-Deploy-Trigger / workflow_dispatch fuer deploy.yaml liefert weiter HTTP 500 und muss separat repariert werden.
  • 2026-06-20: Live-Nexus nach Deploy-Stoerung verifiziert, Bao-Folgetasks angelegt und Agent-Workflow live gegengeprueft.

    • https://nexus.noveria.net/ lieferte wieder 200 OK mit SPA-Titel Nexus | Noveria Operations.
    • /health/live lieferte 200 Healthy.
    • GET /api/dashboard/tasks/board, GET /api/dashboard/tasks/agent-overview und GET /api/dashboard/agents lieferten mit X-Nexus-Api-Key wieder 200 OK.
    • Neuer Task angelegt: Restore agent progress visibility in Nexus (assignedTo=bao, priority=High, State Backlog).
    • Neuer Task angelegt: Review: Agenten-Progress mit letztem Status + Timestamp sichtbar machen (assignedTo=bao, State Backlog).
    • Live-Artefakt-Pruefung bestaetigt Frontend-Strings fuer nur Iris und Bao, researcher, executor, Worauf warte ich?, expectedFrom und isAgentTask.
    • Reversible Live-Verifikation erfolgreich: temp. Agent-Task mit expectedFrom=researcher erschien korrekt in waitingForOthers, erzeugte Activity und wurde direkt wieder geloescht (DELETE ... -> 204).
    • Reversible Notification-Verifikation erfolgreich: simulierte Bao-Aenderung (X-Agent-Id: bao) erzeugte live task_content_changed und task_status_changed fuer Iris; simulierte Iris-Statusaenderung erzeugte live task_review fuer Bao.
    • Live-Regel fuer Delete bestaetigt: Tasks lassen sich nur in Backlog oder Done loeschen; ein temp. Review-Task lieferte erwartungsgemaess 403 bis zum Ruecksetzen auf Backlog.
    • Geaenderte Dateien: nexus.md, phases/changelog.md.
  • 2026-06-20: Researcher und Executor in den Agent-Task-Workflow aufgenommen.

    • ValidAssignees in TaskService.cs um "researcher" und "executor" erweitert.
    • Frontend expectedFromLabel-Mapping, Create-Task- und Detail-Dropdowns um Researcher (🔬) und Executor () ergänzt.
    • Researcher/Executor bleiben als Sub-Agenten vom Status-Change ausgeschlossen (nur Bao/Iris dürfen).
    • Geänderte Dateien: backend/Services/TaskService.cs, frontend/src/views/TaskBoardView.vue, phases/changelog.md.
  • 2026-06-20: Bao-Status-Change + Content-Change-Benachrichtigung aktiviert.

    • Neue Autorisierungsregel (TaskStateHelper.CanChangeState):
      • Iris + Bao dürfen jetzt Status ändern / verschieben.
      • Sub-Agents (programmer, reviewer, architekt) dürfen weiterhin NIEMALS Status ändern.
      • nexus-system bleibt als technischer Fallback erlaubt.
    • Neue Methode CanEditContent: Bestätigt, dass alle bekannten Caller (bao, iris, sub-agents, nexus-system) Inhalt bearbeiten dürfen.
    • Benachrichtigungen bei Bao-Änderungen:
      • Wenn Bao eine Task inhaltlich ändert (Titel, Detail, Priorität, AssignedTo, DueDate), erhält Iris eine task_content_changed-Notification mit Detailangabe, WAS geändert wurde.
      • Wenn Bao den Status ändert, erhält Iris eine task_status_changed-Notification.
      • Wenn Iris den Status ändert, erhält Bao eine task_status_changed-Notification.
    • Verbesserte Activity-Einträge: Zeigen jetzt detailliert, was sich geändert hat (statt nur "Task updated").
    • Geänderte Fehlermeldungen: DashboardController und TasksController zeigen jetzt "nur Iris und Bao" statt "nur Iris".
    • Frontend: canChangeState-Computed prüft jetzt authStore.isIris || authStore.isBao. Permission-Banner, State-Dropdown-Readonly-Tag und Tooltips aktualisiert. Neuer isBao-Getter im Auth-Store.
    • Tests: CanChangeState_Bao_CannotChangeAnyTaskCanChangeState_Bao_CanChangeAnyTask. Neue Tests für CanEditContent.
    • Geänderte Dateien: Backend Entities.cs, TaskService.cs, DashboardController.cs, TasksController.cs; Frontend TaskBoardView.vue, auth.ts; Tests TaskBoardTests.cs; Docs changelog.md.
  • 2026-06-20: Agent-Task-Workflow implementiert.

    • Neue Felder in WorkTask-Entity: IsAgentTask (bool, Index) und ExpectedFrom (string? MaxLength 60, Index). Agent-Tasks sind als solche im Board erkennbar (🤖 Badge) und unterliegen einem strikt von Iris geführten Statusfluss.
    • Status-Change-Autorisierung: TaskStateHelper.CanChangeState() prüft jetzt strikt:
      • Nur iris darf Status ändern oder Karten verschieben.
      • Sub-Agents (programmer, reviewer, architekt) dürfen niemals Status ändern.
      • bao darf Tasks inhaltlich bearbeiten, aber keinen Status ändern.
      • Der technische Fallback nexus-system darf Status nur für interne Systempfade wie automatische Reset-/Cron-Operationen ändern. Caller wird via X-Agent-Id-Header oder JWT-Claim aufgelöst; HTTP-Fallback ist nicht mehr bao, sondern leer und wird für Statusänderungen abgewiesen.
    • Neue API-Endpunkte:
      • POST /api/dashboard/tasks/agent Agent-Task anlegen (mit expectedFrom).
      • GET /api/dashboard/tasks/agent-waiting Offene Agent-Tasks nach Erwartung.
      • GET /api/dashboard/tasks/agent-overview?staleHours=2 Komplette Iris-Übersicht: waitingForBao, waitingForIris, waitingForOthers, staleTasks.
    • Neue Service-Methoden: CreateAgentTaskAsync, GetWaitingTasksAsync, GetAgentWorkflowOverviewAsync.
    • DashboardController-Sicherheit: UpdateTaskStatus und MoveTask prüfen jetzt via ResolveCallerAgent() + TaskStateHelper.CanChangeState(). Bei Verstoß: 403 mit klarer Iris-only-Fehlermeldung.
    • Frontend:
      • TaskBoardView: Agent-Task-Badge (🤖), ExpectedFrom-Label (), Stale-Banner, kollabierbares Iris-Overview-Panel („Iris Worauf warte ich?“) mit 4 Sektionen: Warte auf Iris / Bao / Andere / Stale Tasks.
      • Für Nicht-Iris: Permission-Banner, kein wirksames Drag&Drop, Status-Dropdown deaktiviert.
      • tasks.ts-Store: fetchAgentOverview(), createAgentTask(), Getter für Iris-Ansicht.
      • Detail-Panel: zeigt Agent-Task-Status und ExpectedFrom im Snapshot.
    • Tests: TaskStateHelper-Coverage erweitert um CanChangeState.
    • Dokumentation: Changelog aktualisiert.
    • Geänderte Dateien: siehe Backend Entities.cs, TaskService.cs, ITaskService.cs, DashboardController.cs, Dashboard.cs (Models), NexusDbContext.cs; Frontend tasks.ts, TaskBoardView.vue.
  • 2026-06-20: Nexus-Auth-Persistenz live verifiziert.

  • 2026-06-20: Nexus-Auth-Persistenz live verifiziert. Owner-Passwort in der produktiven Postgres-DB geprüft, Stack vollständig neu gestartet und anschließend postgres, api und web per docker:cli compose up -d --force-recreate neu erstellt, ohne das DB-Volume zu löschen. Ergebnis: /health/live blieb healthy, der Passwort-Hash für vmbao62@hotmail.de blieb vor und nach Restart/Recreate identisch. Wichtiges Learning: temporäre Passwörter oder Auth-Fixes niemals an Bao weitergeben, bevor der echte Live-Login oder mindestens der persistierte DB-Hash auf dem Zielstack verifiziert ist.

  • 2026-06-20: Task Board um klickbare Linear-inspirierte Detailansicht erweitert: Board-Karten öffnen jetzt ein strukturiertes Side/Overlay-Detailpanel mit editierbarem Titel, Beschreibung, Status, Priorität, Zuständigkeit und Fälligkeitsdatum sowie geladener Aktivität und Unteraufgaben. frontend/src/views/TaskBoardView.vue und frontend/src/stores/tasks.ts angepasst. Verifiziert mit COREPACK_HOME=$PWD/.corepack-home PNPM_HOME=$PWD/.pnpm-home pnpm build.

  • 2026-06-19: Task-Board-Doku-Drift behoben: Header-Kommentar in TaskBoardView.vue von "4 columns" auf "6 columns" (Offen, InBearbeitung, Delegiert, Review, Blockiert, Erledigt) korrigiert. tasks.ts-Store-Kopfkommentar um delegated ergänzt.

  • 2026-06-19: Veralteter TODO.md-Import entfernt: ImportFromIrisTodoAsync in TaskService.cs, ITaskService.cs und der import-from-iris-todo-API-Endpoint in DashboardController.cs gelöscht. ImportResultDto aus Models/Dashboard.cs entfernt. TODO.md ist abgeschafft, Task Board alleinige Quelle.

  • 2026-06-19: Backend-Tests erweitert: TaskBoardTests.cs (69 Tests total, +13 neue) decken TaskStateHelper-BoardGroupKey/ToState/BoardGroupToState/DisplayString/AllStates/IsValidState/IsInProgressOrBlocked/IsDoneOrBacklog ab. Backend-Build 0 Errors, Frontend vue-tsc 0 Errors.

  • 2026-06-16: Program.cs refactored: DI extrahiert in Extensions/ServiceCollectionExtensions.cs, Middleware in Extensions/ApplicationBuilderExtensions.cs, Helpers in Helpers/PasswordHelper.cs. Program.cs von ~200 auf 26 Zeilen reduziert.

  • 2026-06-16: Nexus auf Netcup (mission-control) redeployed. Neuer Stack unter /home/projekte_bao/nexus/. Traefik reverse-proxy mit Let's Encrypt TLS. Volume und Netzwerk-Namen bereinigt (postgres-data, internal). Compose-Pfade von Ionos auf Netcup migriert.

  • 2026-06-16: Ollama-Modelle (2.4 GB) und alle ungenutzten Runtime-Dateien entfernt. Codex-Logs bereinigt (~342 MB). Workspace-Aufräumung (~3.1 GB gesamt).

  • 2026-06-16: Modell-Healthcheck nach Migration: Alle 7 aktiven Modelle laufen (DeepSeek Flash/Pro, GPT-5.4/5.5, Claude Sonnet/Opus via CLI-Backend). Ollama und NVIDIA endgültig deaktiviert.

  • 2026-06-14: Server-Migration von Ionos (85.214.180.137) nach Netcup (178.105.105.106). Hostname: mission-control. Migration: OpenClaw, Gitea, Nexus-Volume.

  • 2026-06-12: Agent-Workspaces finalisiert. Iris als Chief of Staff mit Approval-Autonomie. Bidirektionale Kommunikation etabliert.

  • 2026-06-11: Gitea CI/CD-Pipeline aktiv. Agent-Repo-Permissions mit API-Tokens (statt Passwort-Auth). DevOps-Token für Deploy-Trigger.

  • 2026-06-09: Phase 2 Backend + Frontend implementiert: Memory-Browser (Liste, Detail, Volltextsuche), Docs-Browser (Kategorien, Filter), Team-Org-Map (Karten + Kommunikationsmatrix), Security-Center (Auth, Tokens, Rate-Limit, Cookies). Backend-Build 0 Errors, Frontend-Build (vue-tsc + vite) 0 Errors.

  • 2026-06-09: Researcher-Agent zum Team hinzugefügt (DeepSeek V4 Pro, Nur-Lese-Rechte, YouTube-Vision-Skill). Kommunikationsmatrix erweitert (Researcher↔Iris only).

  • 2026-06-09: Phase 1 komplettiert: Live-Agentinventar, Dashboard-Metriken, Approval-Workflow, Healthchecks (PostgreSQL + Runtime), Tests (Backend 3/3 + Frontend 2/2).

  • 2026-06-09: Nexus produktiv auf VPS deployed: Docker-Stack laeuft, Nginx mit Let's Encrypt SSL fuer nexus.noveria.net konfiguriert.

  • 2026-06-09: Nexus-Owner-Passwort lokal in .env gesetzt; Backend synchronisiert das konfigurierte Passwort nun auch fuer bestehende Owner-Konten.

  • 2026-06-08: nexus.md in schlanke Indexdatei und Phase-Dateien aufgeteilt.

  • 2026-06-08: Review-Workflows werden auf kurze, tokenarme Ausgabe ausgerichtet.

  • 2026-06-08: Programmer hat Phase-1-Reste implementiert:

    • ProjectDetailView (CRUD, Archiv, Tasks)
    • SettingsView (Profil-Edit, Passwort-Änderung)
    • Task-Edit (Inline-Titel, Priorität, Projekt-Zuweisung)
    • Activity-Feed (Filter, Sort, Paginierung)
    • Router auf echte Komponenten umgestellt
    • Backend: Ollama/NVIDIA entfernt, nur OpenClaw aktiv
    • Compose bereinigt
  • 2026-06-08: Iris zum Chief of Staff mit Approval-Matrix aufgewertet

  • 2026-06-08: Programmer hat volle Dateirechte (workspaceOnly: false, ask: off)

  • 2026-06-08: Phase-1-Reste abgeschlossen:

    • shadcn-vue bewusst aus dem Zielstack entfernt (reines CSS) und im Roadmap markiert
    • .env.template erstellt (PostgreSQL, JWT, Owner, OpenClaw)
    • DELETE /api/v1/tasks/{id} implementiert (nur Done/Backlog erlaubt, 403 bei anderen States)
    • Task-Delete-Button mit Trash2-Icon und Confirmation-Dialog in ModuleView.vue (Teleport-Modal)
    • deleteTask-Action im Operations-Store (mit Metrik-Neuberechnung)
    • Phase-1-MVP-Status aktualisiert (Tasklöschung, Produktionswerte, Deployment-Entry)
    • Deployment-Dokumentation überarbeitet (Build-Anleitung, Deployment-Plan, Offene-Arbeit-Liste)
    • Changelog aktualisiert