feat(livia): Runde 10 Prompt 2 — eine Leadliste, dynamische Quellen, zeitliche Relevanz
Livia arbeitet nicht mehr neben dem Leadbestand, sondern in ihn hinein. - Systemzugänge tragen Titel, Beschreibung und Adresse; die Liste zeigt je Eintrag nur noch Aktiv/Inaktiv und Lesen/Schreiben — kein Berechtigungsbalken, kein Auge-Icon, keine Lese-/Schreibgruppen - Die Quellenregistry ist dynamisch: Der Lauf liest genau die aktiven Lesezugänge mit Adresse aus Livias Personalblatt. Für die drei gepflegten Quellen greift weiterhin ihr eigener Leser, für alles andere ein allgemeiner — eine Übersichtsseite, bis zu zehn Unterseiten, kein Spider. Freie Adressen werden auf http/https geprüft und gegen interne Netze gesperrt - Manuell abgelegte PDF- und Word-Dokumente fliessen in denselben Lauf. Text wird beim Ablegen nativ extrahiert (ZIP + Flate über DecompressionStream, ohne neue Abhängigkeit), Datei und Text liegen in IndexedDB - Neuer harter Filter «Zeitliche Relevanz»: das Modell beurteilt die Ereigniszeit der Veränderung, nicht das Publikationsdatum. «unknown» fällt bewusst nicht durch — ein erfundenes Datum wäre die schlechtere Antwort - Quellentypen und Beobachtungsraum sind Chips mit Freitext; jeder Wert lässt sich einzeln entfernen, auch die vorgegebenen - Info-Knopf bei «Zeitliche Relevanz» und «Mindestrelevanz» erklärt, wie der Wert entsteht — ohne erfundene Prozentgewichte - Gefundene Leads gehen in den zentralen Signalbestand statt in eine zweite Ergebnisliste; die Herkunft steht am Signal (origin: RESEARCH_RUN) - Der Lauf erzeugt einen echten Protokolleintrag mit den Zahlen des Laufs - Lead-Detail: zeitliche Einordnung mit Fundstelle, semantisches Suchprofil bei Chancen mit «Matching starten», und bei Risiko ausdrücklich «Kein internes Objekt eindeutig zugeordnet» statt einer beliebigen Mock-Immobilie - Aufgabenliste nach §11 bereinigt, «Unsichere Signale in Review Queue legen» von Nora übernommen Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1c4b3f7dd8
commit
30daa77937
33 files changed
+2275
-301
No files matched your search
@@ -120,6 +120,19 @@ export interface AgentSystem {
|
||||
* die Zugänge ohne Schalter führt — fehlt das Feld, gilt der Zugang als aktiv.
|
||||
*/
|
||||
enabled?: boolean
|
||||
/**
|
||||
* Eigener Titel der Quelle (Runde 10, §2.1). Der Katalog benennt seine
|
||||
* Zugänge über `type`; selbst angebundene Quellen haben keinen passenden
|
||||
* Typ und tragen ihren Namen deshalb hier. Fehlt der Titel, gilt das Label
|
||||
* des Typs — so bleiben die Katalogeinträge unverändert.
|
||||
*/
|
||||
title?: string
|
||||
/**
|
||||
* Adresse der Quelle. Bei einer aktiven Lesequelle ist das die Seite, die
|
||||
* Livias Recherchelauf tatsächlich abruft — der angezeigte Link und der
|
||||
* gelesene Link sind damit derselbe Wert.
|
||||
*/
|
||||
url?: string
|
||||
/** Wofür der Agent dieses System nutzt — in Alltagssprache, ohne KI-Jargon. */
|
||||
usage: string
|
||||
/** Klartext zur Berechtigung, z. B. «Schreibt erst nach Freigabe». */
|
||||
@@ -149,6 +162,18 @@ export const AgentSettingKind = {
|
||||
MULTI_SELECT: 'MULTI_SELECT',
|
||||
BOOLEAN: 'BOOLEAN',
|
||||
TIME: 'TIME',
|
||||
/**
|
||||
* Mehrfachauswahl als Chips, jeder einzeln entfernbar (Runde 10, §§2.7–2.9).
|
||||
*
|
||||
* Der Unterschied zu `MULTI_SELECT` ist nicht bloss die Darstellung: Ein
|
||||
* Auswahlfeld kann nur anbieten, was jemand vorher als Option hinterlegt
|
||||
* hat. Quellentypen und Beobachtungsräume sind aber genau das, was sich von
|
||||
* Haus zu Haus unterscheidet — sie brauchen ein Feld, in das man schreiben
|
||||
* kann, was man meint.
|
||||
*/
|
||||
CHIPS: 'CHIPS',
|
||||
/** Abgelegte Dokumente als Datenbasis der Recherche (Runde 10, §2.6). */
|
||||
DOCUMENTS: 'DOCUMENTS',
|
||||
} as const
|
||||
export type AgentSettingKind = typeof AgentSettingKind[keyof typeof AgentSettingKind]
|
||||
|
||||
@@ -179,6 +204,21 @@ export interface AgentSetting {
|
||||
/** Fachlich nicht abschaltbar — z. B. Sinas Quellenzwang. */
|
||||
locked?: boolean
|
||||
lockedReason?: string
|
||||
/**
|
||||
* Erklärt auf Knopfdruck, wie ein Wert zustande kommt (Runde 10, §2.10).
|
||||
*
|
||||
* Gehört ans Datenmodell und nicht in die Komponente: Was ein Schwellenwert
|
||||
* bedeutet, weiss das Personalblatt, nicht das Eingabefeld. Und ein Text,
|
||||
* der eine Berechnung beschreibt, muss neben der Berechnung stehen, damit
|
||||
* beide zusammen geändert werden.
|
||||
*/
|
||||
infoText?: string
|
||||
/**
|
||||
* Nur bei `CHIPS`: ob eigene Werte erfasst werden dürfen. Bei einer
|
||||
* fachlich abgeschlossenen Liste — etwa den drei Zeitfenstern — bleibt es
|
||||
* aus, sonst entstünde ein vierter Wert, den niemand auswerten kann.
|
||||
*/
|
||||
allowCustom?: boolean
|
||||
}
|
||||
|
||||
// ── Kennzahlen & Profil ───────────────────────────────────────────────────────
|
||||
|
||||
Reference in new issue
Block a user