feat(startseite): digitale Belegschaft mit Präsenz, eigener Stimme und Nachweis

Der nachgebaute Meetingraum entfällt. Eine gezeichnete Kulisse bleibt neben
fotografierten Porträts erkennbar gezeichnet — und ein Raum allein macht
niemanden menschlich. Menschlich wirkt im echten Büro dasselbe wie hier: dass
jemand da ist, etwas zu sagen hat und nachweisbar gearbeitet hat.

Die Startseite zeigt deshalb sechs Personenkarten vor einer abgedunkelten
Büroaufnahme. Jede Karte trägt, was ein Personalblatt trägt:

- Porträt mit Dienstpunkt — ist da oder pausiert
- Name, Funktion, Abteilung, Personalnummer
- Autonomiestufe: «Autonom», «Freigabe erforderlich», «Nur Vorschlag».
  Sie sagt, wie viel Verantwortung jemand trägt, und trennt Personal von
  Automatisierung.
- Ein Satz in der ersten Person zur aktuellen Lage, statt einer Kennzahl:
  «Bei 12 Fristen ist der Termin durch. Fürs Eskalieren brauche ich deine
  Freigabe.»
- Die zuletzt protokollierte Handlung mit Zeitangabe. Diese Zeile ist der
  Unterschied zwischen Behauptung und Beleg — eine Kennzahl kann jede
  Software anzeigen.

Darüber fasst ein Anriss zusammen, wie viele Mitarbeitende heute eine
Entscheidung brauchen, samt Dienststand der Belegschaft.

Schichten nach CLAUDE.md §4.2: `agentPresenceService` entscheidet, was als
letzte Handlung gilt und wie eine Zeitangabe in Alltagssprache lautet;
`agentWorkloadService` hält Zeitfenster, Schwellen und Formulierungen. Beide
nehmen den Stichzeitpunkt als Parameter — dieselbe Datenlage ergibt immer
dasselbe Ergebnis und ist ohne Renderer prüfbar (22 Tests).

Giorgio hat kein Personalblatt; Abteilung, Personalnummer und Stufe kommen
aus der zentralen Rollendefinition. Wer kein Dossier hat, gilt als im Dienst —
sonst stünde die halbe Belegschaft still, weil Stammdaten fehlen.

Bild: Unsplash, freie kommerzielle Lizenz. Herkunft und Austauschhinweis in
`src/assets/meeting-room/HERKUNFT.md`.

Geprüft: 435 Tests, Typecheck, Build, ESLint, Token-Schwelle (889/925).
Browser 1280–1920 px und Tablet: sechs Karten ohne Überlappung, Titel und
«Filter & Übersicht» beim Einstieg sichtbar, alle sechs Klicks auf der
richtigen Subpage, keine Konsolenfehler, keine 404.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-08-06 14:50:16 +02:00
parent d8f8f728cc
commit 435f2aa2f1
17 changed files with 698 additions and 487 deletions
+25
View File
@@ -0,0 +1,25 @@
import { useMemo } from 'react'
import { useTeamAgents } from './useTeamAgents'
import { useAgentProtocol } from './useAgentProtocol'
import { useAgentWorkload } from './useAgentWorkload'
import { buildAgentPresence } from '../services/agentPresenceService'
import type { AgentPresence } from '../domain/agentPresence'
/**
* Die Belegschaft, wie sie auf der Startseite auftritt (Runde 5).
*
* Der Hook sammelt Personalblätter, Protokoll und Auslastung ein; was daraus
* wird, entscheidet `agentPresenceService` (CLAUDE.md §4.2).
*/
export function useAgentPresence(): { data: AgentPresence[]; isLoading: boolean } {
const { data: agents = [], isLoading: agentsLoading } = useTeamAgents()
const { data: protocol = [], isLoading: protocolLoading } = useAgentProtocol()
const { data: workload, isLoading: workloadLoading } = useAgentWorkload()
const data = useMemo(
() => buildAgentPresence({ agents, protocol, workload }),
[agents, protocol, workload],
)
return { data, isLoading: agentsLoading || protocolLoading || workloadLoading }
}