Files
property-match/src/mock-data/signalPipelines.ts
T

861 lines
32 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { PipelineState, GateEvaluation, AuditTrailEntry } from '../domain/signalPipeline'
import { PipelineStage, GateType, GateStatus } from '../domain/signalPipeline'
function gate(
gateType: GateType,
status: GateStatus,
reason: string,
checks: GateEvaluation['checks'],
nextAction?: string,
): GateEvaluation {
return { gateType, status, reason, checks, nextAction, evaluatedAt: '2026-05-15T06:00:00Z' }
}
// ── sig-001: STAGE_4_REVIEW_CANDIDATE ─────────────────────────────────────────
const sig001Pipeline: PipelineState = {
signalId: 'sig-001',
currentStage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Mindestens ein valides Evidenzstück vorhanden.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Neue Zürcher Zeitung' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.72 liegt über dem Mindestschwellenwert von 0.60.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.72' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: false, value: '0.72', note: 'Mittlere Konfidenz' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Sensitivitätsstufe INTERNAL ist für interne Feed-Nutzung zulässig.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'INTERNAL' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Signal wartet auf manuellen Analyst-Review.',
[
{ label: 'Review angefordert', passed: true },
{ label: 'Review abgeschlossen', passed: false },
],
'Analyst-Review durchführen und Signal genehmigen oder ablehnen.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PENDING,
'Matchbarkeit kann erst nach abgeschlossenem Review bewertet werden.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE' },
{ label: 'Standort definiert', passed: true, value: 'Zürich' },
{ label: 'Zeithorizont definiert', passed: false },
{ label: 'Geschäftsrelevanz vorhanden', passed: true },
],
'Review abschliessen, dann Matchbarkeit neu bewerten.',
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Review-Gate noch ausstehend.',
[
{ label: 'Review-Gate bestanden', passed: false },
{ label: 'Matchbarkeits-Gate bestanden', passed: false },
],
'Review und Matchbarkeits-Prüfung abschliessen.',
),
},
}
// ── sig-002: STAGE_5_APPROVED_FUTURE ─────────────────────────────────────────
const sig002Pipeline: PipelineState = {
signalId: 'sig-002',
currentStage: PipelineStage.STAGE_5_APPROVED_FUTURE,
overallEligible: true,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Baugesuchdokument als verlässliche Primärquelle vorhanden.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Baugesuchregister BS' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.88 überschreitet den hohen Schwellenwert von 0.75.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.88' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: true, value: '0.88' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Öffentliche Quelle keine Einschränkungen.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'PUBLIC' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PASSED,
'Signal durch Analyst M. Huber am 12.05.2026 genehmigt.',
[
{ label: 'Review angefordert', passed: true },
{ label: 'Review abgeschlossen', passed: true, value: 'M. Huber, 12.05.2026' },
{ label: 'Genehmigt', passed: true },
],
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PASSED,
'Alle Pflichtfelder für Match-Engine vorhanden.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE, LOGISTICS, RETAIL' },
{ label: 'Standort definiert', passed: true, value: 'Basel' },
{ label: 'Zeithorizont definiert', passed: true, value: 'Q1 2026' },
{ label: 'Geschäftsrelevanz vorhanden', passed: true },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.PASSED,
'Alle Gates bestanden Signal ist feed-fähig.',
[
{ label: 'Review-Gate bestanden', passed: true },
{ label: 'Matchbarkeits-Gate bestanden', passed: true },
{ label: 'Sensitivität zulässig', passed: true, value: 'PUBLIC' },
],
),
},
}
// ── sig-003: STAGE_3_ENRICHED ─────────────────────────────────────────────────
const sig003Pipeline: PipelineState = {
signalId: 'sig-003',
currentStage: PipelineStage.STAGE_3_ENRICHED,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'LinkedIn-Datenauszug als Evidenz vorhanden.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'LinkedIn Hiring Data' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PENDING,
'Konfidenzwert 0.61 liegt im Grenzbereich (0.600.65). Zusätzliche Validierung empfohlen.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.61', note: 'Grenzbereich' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: false, value: '0.61' },
],
'Unternehmensidentität über HR-Netzwerke verifizieren, um Konfidenz zu erhöhen.',
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Öffentliche Quelle keine Einschränkungen.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'PUBLIC' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Signal noch nicht für Review eingereicht.',
[
{ label: 'Review angefordert', passed: false },
{ label: 'Review abgeschlossen', passed: false },
],
'Signal für Analyst-Review einreichen nach Konfidenz-Verbesserung.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PENDING,
'Matchbarkeit noch nicht bewertet Anreicherung läuft.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE' },
{ label: 'Standort definiert', passed: true, value: 'Zug' },
{ label: 'Zeithorizont definiert', passed: false },
{ label: 'Geschäftsrelevanz vorhanden', passed: false, note: 'Unternehmensname unbekannt' },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Mehrere vorgelagerte Gates ausstehend.',
[
{ label: 'Review-Gate bestanden', passed: false },
{ label: 'Matchbarkeits-Gate bestanden', passed: false },
],
),
},
}
// ── sig-004: STAGE_4_REVIEW_CANDIDATE ─────────────────────────────────────────
const sig004Pipeline: PipelineState = {
signalId: 'sig-004',
currentStage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Mietvertragsdokument als primäre Evidenz vorhanden.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Internes ERP' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.97 sehr hohe Verlässlichkeit (interne Vertragsdaten).',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.97' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: true, value: '0.97' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.FAILED,
'Sensitivitätsstufe CONFIDENTIAL: Signal darf nicht im Demand Feed erscheinen. Mieteridentität ist schützenswert.',
[
{ label: 'Nicht CONFIDENTIAL', passed: false, value: 'CONFIDENTIAL', note: 'Interne Vertragsdaten nur für Property Manager' },
{ label: 'Nicht RESTRICTED', passed: true },
],
'Daten anonymisieren oder auf aggregierter Ebene veröffentlichen.',
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Review angefordert Sensitivitäts-Gate muss zuerst adressiert werden.',
[
{ label: 'Review angefordert', passed: true },
{ label: 'Review abgeschlossen', passed: false },
],
'Sensitivitätsproblem lösen, dann Review abschliessen.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PENDING,
'Matchbarkeit ausstehend zuerst Sensitivitätsproblem lösen.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE' },
{ label: 'Standort definiert', passed: true, value: 'Zürich-West' },
{ label: 'Zeithorizont definiert', passed: true, value: '03/2026' },
{ label: 'Geschäftsrelevanz vorhanden', passed: true },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Sensitivitäts-Gate fehlgeschlagen.',
[
{ label: 'Sensitivitäts-Gate bestanden', passed: false, value: 'CONFIDENTIAL' },
{ label: 'Review-Gate bestanden', passed: false },
],
'Anonymisierung der Mieterdaten durchführen.',
),
},
}
// ── sig-005: STAGE_2_NORMALIZED ───────────────────────────────────────────────
const sig005Pipeline: PipelineState = {
signalId: 'sig-005',
currentStage: PipelineStage.STAGE_2_NORMALIZED,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Handelsregistermutation als verlässliche Primärquelle.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Zefix Handelsregister Schweiz' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PENDING,
'Konfidenzwert 0.63 Sitzverlegung bestätigt, aber Flächenbedarf am Zielort noch nicht validiert.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.63', note: 'Grenzbereich' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: false, value: '0.63' },
],
'Flächenbedarf in Kloten durch Direktkontakt oder weitere Quellenrecherche bestätigen.',
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Öffentliches Handelsregister keine Sensitivitätsbedenken.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'PUBLIC' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Signal noch in Normalisierungsphase kein Review angefordert.',
[
{ label: 'Review angefordert', passed: false },
{ label: 'Review abgeschlossen', passed: false },
],
'Anreicherung abschliessen, dann für Review einreichen.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PENDING,
'Anreicherung noch nicht abgeschlossen.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'LOGISTICS' },
{ label: 'Standort definiert', passed: true, value: 'Kloten' },
{ label: 'Zeithorizont definiert', passed: false },
{ label: 'Geschäftsrelevanz vorhanden', passed: false },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Signal befindet sich noch in der Normalisierungsphase.',
[
{ label: 'Review-Gate bestanden', passed: false },
{ label: 'Matchbarkeits-Gate bestanden', passed: false },
],
),
},
}
// ── sig-006: STAGE_1_RAW_EVIDENCE ────────────────────────────────────────────
const sig006Pipeline: PipelineState = {
signalId: 'sig-006',
currentStage: PipelineStage.STAGE_1_RAW_EVIDENCE,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Inserat auf Immoscout24 als Primärquelle vorhanden.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Immoscout24' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.83 direkte Nachfrage-Ausschreibung mit hoher Relevanz.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.83' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: true, value: '0.83' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Öffentliche Plattform keine Einschränkungen.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'PUBLIC' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Signal soeben erkannt Normalisierung und Anreicherung noch ausstehend.',
[
{ label: 'Review angefordert', passed: false },
{ label: 'Review abgeschlossen', passed: false },
],
'Signal normalisieren und anreichern, dann für Review einreichen.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PENDING,
'Matchbarkeit noch nicht bewertet Signal in früher Phase.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'LOGISTICS' },
{ label: 'Standort definiert', passed: true, value: 'Winterthur' },
{ label: 'Zeithorizont definiert', passed: true, value: 'September 2025' },
{ label: 'Geschäftsrelevanz vorhanden', passed: false },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Signal in Rohphase mehrere Stufen offen.',
[
{ label: 'Review-Gate bestanden', passed: false },
{ label: 'Matchbarkeits-Gate bestanden', passed: false },
],
),
},
}
// ── sig-007: STAGE_3_ENRICHED ─────────────────────────────────────────────────
const sig007Pipeline: PipelineState = {
signalId: 'sig-007',
currentStage: PipelineStage.STAGE_3_ENRICHED,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'SBB-Medienmitteilung als verlässliche behördliche Quelle.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'SBB Medienmitteilung' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.79 behördliche Bestätigung vorhanden.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.79' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: true, value: '0.79' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Öffentliche SBB-Mitteilung keine Sensitivitätsbedenken.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'PUBLIC' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Matchbarkeits-Problem muss zuerst gelöst werden.',
[
{ label: 'Review angefordert', passed: false },
{ label: 'Review abgeschlossen', passed: false },
],
'Matchbarkeits-Frage klären (kein direktes Verfügbarkeitssignal), dann Review starten.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.FAILED,
'Signal Typ PROJECT_DEVELOPMENT ohne direktes Verfügbarkeitssignal kein konkreter Flächenbedarf erkennbar.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE, PRODUCTION' },
{ label: 'Standort definiert', passed: true, value: 'Schlieren' },
{ label: 'Zeithorizont definiert', passed: true, value: 'Dezember 2027' },
{ label: 'Direktes Verfügbarkeitssignal', passed: false, note: 'Infrastrukturverbesserung ohne konkreten Flächenbedarf' },
],
'Signal als strategischen Kontext-Input klassifizieren oder konkreten Bedarf nachweisen.',
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Matchbarkeits-Gate fehlgeschlagen.',
[
{ label: 'Matchbarkeits-Gate bestanden', passed: false },
{ label: 'Review-Gate bestanden', passed: false },
],
'Signal als strategischen Input behandeln oder Matchbarkeit nachweisen.',
),
},
}
// ── sig-008: STAGE_6_MATCHABLE_RESULT ────────────────────────────────────────
const sig008Pipeline: PipelineState = {
signalId: 'sig-008',
currentStage: PipelineStage.STAGE_6_MATCHABLE_RESULT,
overallEligible: true,
publishedToFutureAvailability: true,
publishedAt: '2026-05-13T11:00:00Z',
feedDisclaimer: 'Nur in aggregierter Form Mieteridentität anonymisiert. Kein Rückschluss auf Vertragsparteien möglich.',
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Eigene Marktbeobachtung mit Vor-Ort-Begehung dokumentiert.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Eigene Beobachtung Marktanalyse' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.68 ausreichend für interne Verarbeitung.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.68' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: false, value: '0.68', note: 'Mittlere Konfidenz akzeptiert' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Sensitivitätsstufe INTERNAL mit Anonymisierungsauflage zulässig.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'INTERNAL' },
{ label: 'Nicht RESTRICTED', passed: true },
{ label: 'Anonymisierungsauflage gesetzt', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PASSED,
'Signal durch Analyst A. Müller am 13.05.2026 genehmigt und zur Publikation freigegeben.',
[
{ label: 'Review angefordert', passed: true },
{ label: 'Review abgeschlossen', passed: true, value: 'A. Müller, 13.05.2026' },
{ label: 'Genehmigt', passed: true },
],
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PASSED,
'Alle notwendigen Felder für Match-Engine vorhanden.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE' },
{ label: 'Standort definiert', passed: true, value: 'Lausanne' },
{ label: 'Zeithorizont definiert', passed: true, value: 'Sofort verfügbar (3+ Monate leer)' },
{ label: 'Geschäftsrelevanz vorhanden', passed: true },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.PASSED,
'Signal im Future Availability Feed publiziert anonymisiert und aggregiert.',
[
{ label: 'Review-Gate bestanden', passed: true },
{ label: 'Matchbarkeits-Gate bestanden', passed: true },
{ label: 'Anonymisierungsauflage umgesetzt', passed: true },
{ label: 'Im Feed publiziert', passed: true, value: '13.05.2026' },
],
),
},
}
export const MOCK_PIPELINE_STATES: PipelineState[] = [
sig001Pipeline,
sig002Pipeline,
sig003Pipeline,
sig004Pipeline,
sig005Pipeline,
sig006Pipeline,
sig007Pipeline,
sig008Pipeline,
]
// ── Audit Trails ──────────────────────────────────────────────────────────────
export const MOCK_AUDIT_TRAILS: AuditTrailEntry[] = [
// sig-001
{
id: 'audit-001-1',
signalId: 'sig-001',
timestamp: '2025-05-10T09:23:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / NZZ-Connector',
details: 'Signal automatisch aus NZZ-Medienbericht extrahiert. Rohtext gespeichert.',
},
{
id: 'audit-001-2',
signalId: 'sig-001',
timestamp: '2025-05-10T10:05:00Z',
stage: PipelineStage.STAGE_2_NORMALIZED,
action: 'Normalisierung abgeschlossen',
performedBy: 'System / NLP-Pipeline',
details: 'Felder normalisiert: Standort "Zürich ZH", Asset-Typ OFFICE, Signaltyp EXPANSION.',
},
{
id: 'audit-001-3',
signalId: 'sig-001',
timestamp: '2025-05-11T08:00:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Anreicherung abgeschlossen',
performedBy: 'System / Enrichment-Engine',
details: 'Entitäten extrahiert: UBS AG (Konfidenz 0.98), Zürich (0.95), Ende 2025 (0.87). Konfidenzwert: 0.72.',
},
{
id: 'audit-001-4',
signalId: 'sig-001',
timestamp: '2025-05-11T08:05:00Z',
stage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
action: 'Zur Prüfung eingereicht',
performedBy: 'System / Gate-Evaluator',
details: 'Evidenz-Gate, Konfidenz-Gate und Sensitivitäts-Gate bestanden. Review-Gate offen wartet auf Analyst.',
gateType: GateType.REVIEW_GATE,
},
// sig-002
{
id: 'audit-002-1',
signalId: 'sig-002',
timestamp: '2025-05-08T14:00:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / Baugesuch-Connector',
details: 'Baugesuch Nr. BS-2025-0312 aus öffentlichem Register extrahiert.',
},
{
id: 'audit-002-2',
signalId: 'sig-002',
timestamp: '2025-05-08T15:00:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Normalisierung und Anreicherung',
performedBy: 'System / NLP-Pipeline',
details: 'Alle Felder normalisiert und angereichert. Standort Basel-Nord, Asset-Typen: OFFICE, LOGISTICS, RETAIL. Konfidenz: 0.88.',
},
{
id: 'audit-002-3',
signalId: 'sig-002',
timestamp: '2025-05-12T09:30:00Z',
stage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
action: 'Analyst-Review gestartet',
performedBy: 'M. Huber',
details: 'Review-Kandidat angenommen. Öffentliche Quelle mit hoher Verlässlichkeit.',
},
{
id: 'audit-002-4',
signalId: 'sig-002',
timestamp: '2025-05-12T09:45:00Z',
stage: PipelineStage.STAGE_5_APPROVED_FUTURE,
action: 'Signal genehmigt',
performedBy: 'M. Huber',
details: 'Signal als Future Availability genehmigt. Alle Gates bestanden. Bereit zur Feed-Publikation.',
gateType: GateType.REVIEW_GATE,
},
// sig-003
{
id: 'audit-003-1',
signalId: 'sig-003',
timestamp: '2025-05-09T11:30:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / LinkedIn-Connector',
details: 'Stellenwachstumssignal aus LinkedIn-Daten extrahiert. 80 neue Stellenausschreibungen in 6 Monaten.',
},
{
id: 'audit-003-2',
signalId: 'sig-003',
timestamp: '2025-05-09T12:00:00Z',
stage: PipelineStage.STAGE_2_NORMALIZED,
action: 'Normalisierung abgeschlossen',
performedBy: 'System / NLP-Pipeline',
details: 'Standort Zug, Asset-Typ OFFICE, Signaltyp EXPANSION normalisiert. Unternehmensname nicht öffentlich.',
},
{
id: 'audit-003-3',
signalId: 'sig-003',
timestamp: '2025-05-11T14:00:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Anreicherung abgeschlossen',
performedBy: 'System / Enrichment-Engine',
details: 'Konfidenzwert 0.61 Grenzbereich. Unternehmensverifizierung empfohlen. Weiterer Review nötig.',
},
// sig-004
{
id: 'audit-004-1',
signalId: 'sig-004',
timestamp: '2025-05-05T08:00:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / ERP-Connector',
details: 'Vertragslaufdaten aus internem ERP importiert. Vertrag V-2019-0481, Ablauf 31.03.2026.',
},
{
id: 'audit-004-2',
signalId: 'sig-004',
timestamp: '2025-05-05T08:30:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Normalisierung und Anreicherung',
performedBy: 'System / NLP-Pipeline',
details: 'Alle Felder normalisiert. Hohe Konfidenz (0.97) da Primärquelle. Sensitivität CONFIDENTIAL erkannt.',
},
{
id: 'audit-004-3',
signalId: 'sig-004',
timestamp: '2025-05-10T10:00:00Z',
stage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
action: 'Sensitivitäts-Warnung gesetzt',
performedBy: 'System / Gate-Evaluator',
details: 'Sensitivitäts-Gate fehlgeschlagen: CONFIDENTIAL. Signal zur Review eingereicht mit Anonymisierungsauflage.',
gateType: GateType.SENSITIVITY_GATE,
},
{
id: 'audit-004-4',
signalId: 'sig-004',
timestamp: '2025-05-10T10:05:00Z',
stage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
action: 'Property Manager benachrichtigt',
performedBy: 'System / Notification-Service',
details: 'Property Manager über auslaufenden Grossmietvertrag informiert. Verlängerungsgespräch empfohlen.',
},
// sig-005
{
id: 'audit-005-1',
signalId: 'sig-005',
timestamp: '2025-05-07T16:20:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / Handelsregister-Connector',
details: 'Sitzverlegung aus Zefix extrahiert: 3014 Bern → 8302 Kloten, eingetragen 07.05.2025.',
},
{
id: 'audit-005-2',
signalId: 'sig-005',
timestamp: '2025-05-07T17:00:00Z',
stage: PipelineStage.STAGE_2_NORMALIZED,
action: 'Normalisierung abgeschlossen',
performedBy: 'System / NLP-Pipeline',
details: 'Standort Kloten (Zielort), Asset-Typ LOGISTICS normalisiert. Flächenbedarf noch nicht validiert.',
},
{
id: 'audit-005-3',
signalId: 'sig-005',
timestamp: '2025-05-08T09:00:00Z',
stage: PipelineStage.STAGE_2_NORMALIZED,
action: 'Anreicherung gestartet',
performedBy: 'System / Enrichment-Engine',
details: 'Konfidenzwert 0.63 Sitzverlegung bestätigt, konkreter Flächenbedarf am Zielort ausstehend.',
},
// sig-006
{
id: 'audit-006-1',
signalId: 'sig-006',
timestamp: '2025-05-12T08:15:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / Immoscout-Connector',
details: 'Neue Suchanzeige auf Immoscout24 erkannt: 800 m² Lagerfläche Winterthur, sofort gesucht.',
},
{
id: 'audit-006-2',
signalId: 'sig-006',
timestamp: '2025-05-12T08:30:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Evidenz-Gate bestanden',
performedBy: 'System / Gate-Evaluator',
details: 'Evidenz-Gate und Konfidenz-Gate (0.83) bestanden. Signal in Pipeline aufgenommen, Normalisierung startet.',
gateType: GateType.EVIDENCE_GATE,
},
// sig-007
{
id: 'audit-007-1',
signalId: 'sig-007',
timestamp: '2025-05-06T10:00:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / SBB-Feed-Connector',
details: 'SBB-Medienmitteilung zur neuen Haltestelle Schlieren-West 2027 automatisch verarbeitet.',
},
{
id: 'audit-007-2',
signalId: 'sig-007',
timestamp: '2025-05-06T11:00:00Z',
stage: PipelineStage.STAGE_2_NORMALIZED,
action: 'Normalisierung abgeschlossen',
performedBy: 'System / NLP-Pipeline',
details: 'Standort Schlieren, Asset-Typen OFFICE und PRODUCTION, Zeithorizont Dezember 2027 normalisiert.',
},
{
id: 'audit-007-3',
signalId: 'sig-007',
timestamp: '2025-05-10T15:00:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Matchbarkeits-Problem identifiziert',
performedBy: 'System / Gate-Evaluator',
details: 'Matchbarkeits-Gate fehlgeschlagen: PROJECT_DEVELOPMENT ohne direktes Verfügbarkeitssignal. Kein konkreter Flächenbedarf nachweisbar.',
gateType: GateType.MATCHABILITY_GATE,
},
{
id: 'audit-007-4',
signalId: 'sig-007',
timestamp: '2025-05-10T15:05:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Analyst-Notiz hinzugefügt',
performedBy: 'K. Bauer',
details: 'Infrastrukturverbesserung dokumentiert. Empfehlung: Als strategischen Kontext-Input behandeln, nicht als direktes Matchingobjekt.',
},
// sig-008
{
id: 'audit-008-1',
signalId: 'sig-008',
timestamp: '2025-05-03T14:30:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal manuell erfasst',
performedBy: 'A. Müller',
details: 'Vor-Ort-Begehung Tour de Berne, Lausanne. 4. OG leer stehend, keine Vermarktung erkennbar.',
},
{
id: 'audit-008-2',
signalId: 'sig-008',
timestamp: '2025-05-03T15:00:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Normalisierung und Anreicherung',
performedBy: 'System / NLP-Pipeline',
details: 'Standort Lausanne, Asset-Typ OFFICE, Signaltyp POSSIBLE_MOVE_OUT normalisiert. Konfidenz 0.68.',
},
{
id: 'audit-008-3',
signalId: 'sig-008',
timestamp: '2025-05-13T10:30:00Z',
stage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
action: 'Analyst-Review abgeschlossen',
performedBy: 'A. Müller',
details: 'Signal geprüft und genehmigt. Anonymisierungsauflage gesetzt: Mieteridentität darf nicht kommuniziert werden.',
gateType: GateType.REVIEW_GATE,
},
{
id: 'audit-008-4',
signalId: 'sig-008',
timestamp: '2025-05-13T11:00:00Z',
stage: PipelineStage.STAGE_6_MATCHABLE_RESULT,
action: 'In Future Availability publiziert',
performedBy: 'A. Müller',
details: 'Signal als Future Availability "fs-lausanne-001" in den Feed übertragen. Anonymisierter Disclaimer aktiv.',
gateType: GateType.FEED_ELIGIBILITY_GATE,
},
]