From 67c0701bfe1c7a41651c7aaa0854448c6e1c48ef Mon Sep 17 00:00:00 2001 From: Benjamin Sutter Date: Wed, 20 May 2026 16:10:23 +0200 Subject: [PATCH] fix: remove EXPANSION fake properties and their matches from mock data Deleted prop-005, prop-026, prop-028, prop-030 (resultType FUTURE_AVAILABILITY but representing demand-side Expansion signals) and the 6 associated matches (match-007, match-018, match-029, match-047, match-054, match-055). These fake properties bypassed the signalDirection filter in useUnifiedResults, causing EXPANSION signals to appear in the demand search feed. Future Availability in the demand feed now contains only genuine supply-side signals. Co-Authored-By: Claude Sonnet 4.6 --- src/mock-data/matches.ts | 169 ------------------------------------ src/mock-data/properties.ts | 99 --------------------- 2 files changed, 268 deletions(-) diff --git a/src/mock-data/matches.ts b/src/mock-data/matches.ts index b339eba..260e342 100644 --- a/src/mock-data/matches.ts +++ b/src/mock-data/matches.ts @@ -123,34 +123,6 @@ export const mockMatches: Match[] = [ updatedAt: '2025-05-10T08:25:00Z', }, - { - id: 'match-007', - propertyId: 'prop-005', - needId: 'need-001', - matchScore: 59, - matchStrength: MatchStrength.MODERATE, - status: MatchStatus.PENDING_REVIEW, - scoreBreakdown: { hardMatchScore: 82, softFactorScore: 66, confidenceModifier: 0.55, dataQualityModifier: 0.38, totalScore: 59 }, - positiveFactors: [ - { criterion: 'Standort', weight: 0.20, score: 90, contribution: 18, explanation: 'Zürich Technopark – bevorzugte Lage' }, - { criterion: 'Fläche', weight: 0.20, score: 88, contribution: 17.6, explanation: '600m² an unterem Rand des Zielkorridors' }, - ], - negativeFactors: [ - { criterion: 'Konfidenz', weight: 0.15, score: 28, contribution: 4.2, explanation: 'Probabilistisches Signal – kein bestätigtes Objekt' }, - { criterion: 'Datenqualität', weight: 0.10, score: 22, contribution: 2.2, explanation: 'Kritische Felder fehlen, Daten nicht verifiziert' }, - ], - tradeoffs: [ - { criterion: 'Verfügbarkeit', concern: 'Signal nur 55% Wahrscheinlichkeit – keine Garantie', severity: 'HIGH', mitigation: 'Für Monitoring-Watchlist geeignet' }, - ], - explainabilitySummary: 'Lage und Fläche passen gut, aber die hohe Unsicherheit durch das probabilistische Signal zieht den Score deutlich nach unten.', - confidenceLevel: 0.48, - riskLevel: RiskLevel.HIGH, - uncertaintyIndicators: ['Probabilistisches Signal', 'Kritische Daten fehlen'], - organizationId: 'org-wincasa', - createdAt: '2025-05-10T08:30:00Z', - updatedAt: '2025-05-10T08:30:00Z', - }, - { id: 'match-008', propertyId: 'prop-023', @@ -492,34 +464,6 @@ export const mockMatches: Match[] = [ updatedAt: '2025-05-11T08:10:00Z', }, - { - id: 'match-018', - propertyId: 'prop-005', - needId: 'need-003', - matchScore: 38, - matchStrength: MatchStrength.WEAK, - status: MatchStatus.REJECTED, - scoreBreakdown: { hardMatchScore: 61, softFactorScore: 45, confidenceModifier: 0.55, dataQualityModifier: 0.38, totalScore: 38 }, - positiveFactors: [ - { criterion: 'Fläche', weight: 0.20, score: 88, contribution: 17.6, explanation: '600m² im Zielkorridor' }, - ], - negativeFactors: [ - { criterion: 'Standort', weight: 0.25, score: 35, contribution: 8.75, explanation: 'Zürich statt Basel – 80km Entfernung' }, - { criterion: 'Budget', weight: 0.20, score: 70, contribution: 14, explanation: 'CHF 42/m² liegt 5% über Budget-Maximum' }, - { criterion: 'Konfidenz', weight: 0.15, score: 25, contribution: 3.75, explanation: 'Future-Signal, kein bestätigtes Objekt' }, - ], - tradeoffs: [ - { criterion: 'Standort & Verfügbarkeit', concern: 'Falscher Standort + Future-Signal macht diesen Match nicht empfehlenswert', severity: 'HIGH' }, - ], - explainabilitySummary: 'Zu viele kritische Mängel: falscher Standort, Budget leicht über Maximum, und probabilistisches Signal. Abgelehnt.', - confidenceLevel: 0.36, - riskLevel: RiskLevel.HIGH, - uncertaintyIndicators: ['Falscher Standort', 'Future-Signal', 'Budget knapp'], - organizationId: 'org-wincasa', - createdAt: '2025-05-11T08:15:00Z', - updatedAt: '2025-05-11T08:15:00Z', - }, - { id: 'match-019', propertyId: 'prop-015', @@ -797,34 +741,6 @@ export const mockMatches: Match[] = [ updatedAt: '2025-05-11T10:15:00Z', }, - { - id: 'match-029', - propertyId: 'prop-026', - needId: 'need-005', - matchScore: 64, - matchStrength: MatchStrength.MODERATE, - status: MatchStatus.PENDING_REVIEW, - scoreBreakdown: { hardMatchScore: 87, softFactorScore: 71, confidenceModifier: 0.52, dataQualityModifier: 0.34, totalScore: 64 }, - positiveFactors: [ - { criterion: 'Standort', weight: 0.25, score: 100, contribution: 25, explanation: 'Zug – exakter Standortwunsch' }, - { criterion: 'Budget', weight: 0.20, score: 90, contribution: 18, explanation: 'CHF 43/m² unter Maximum CHF 48/m²' }, - ], - negativeFactors: [ - { criterion: 'Konfidenz', weight: 0.15, score: 30, contribution: 4.5, explanation: '52% Signalwahrscheinlichkeit – Future-Signal' }, - { criterion: 'Datenqualität', weight: 0.10, score: 22, contribution: 2.2, explanation: 'Kritische Felder fehlen' }, - ], - tradeoffs: [ - { criterion: 'Verfügbarkeit', concern: 'Expansion-Signal – Fläche noch nicht auf dem Markt', severity: 'HIGH' }, - ], - explainabilitySummary: 'Perfekter Standort Zug, Budget stimmt. Als Future-Signal mit 52% Konfidenz – Watchlist-Kandidat.', - confidenceLevel: 0.44, - riskLevel: RiskLevel.HIGH, - uncertaintyIndicators: ['Future-Signal', 'Daten unvollständig'], - organizationId: 'org-wincasa', - createdAt: '2025-05-11T10:20:00Z', - updatedAt: '2025-05-11T10:20:00Z', - }, - { id: 'match-030', propertyId: 'prop-022', @@ -1304,34 +1220,6 @@ export const mockMatches: Match[] = [ updatedAt: '2025-05-11T15:00:00Z', }, - { - id: 'match-047', - propertyId: 'prop-030', - needId: 'need-010', - matchScore: 58, - matchStrength: MatchStrength.MODERATE, - status: MatchStatus.PENDING_REVIEW, - scoreBreakdown: { hardMatchScore: 81, softFactorScore: 65, confidenceModifier: 0.55, dataQualityModifier: 0.36, totalScore: 58 }, - positiveFactors: [ - { criterion: 'Standort', weight: 0.28, score: 100, contribution: 28, explanation: 'St. Gallen Riethüsli – Präferenzstadt' }, - { criterion: 'Budget', weight: 0.20, score: 95, contribution: 19, explanation: 'CHF 27/m² deutlich unter Maximum' }, - ], - negativeFactors: [ - { criterion: 'Konfidenz', weight: 0.15, score: 30, contribution: 4.5, explanation: 'Future-Signal 55% Wahrscheinlichkeit' }, - { criterion: 'Datenqualität', weight: 0.10, score: 22, contribution: 2.2, explanation: 'Kritische Felder fehlen' }, - ], - tradeoffs: [ - { criterion: 'Verfügbarkeit', concern: 'Future-Signal – kein bestätigter Auszug', severity: 'HIGH', mitigation: 'Auf Watchlist setzen' }, - ], - explainabilitySummary: 'Bester Standort St. Gallen, Budget sehr gut. Als Future-Signal mit mittlerer Konfidenz Watchlist-Kandidat.', - confidenceLevel: 0.44, - riskLevel: RiskLevel.HIGH, - uncertaintyIndicators: ['Future-Signal', 'Daten unvollständig'], - organizationId: 'org-wincasa', - createdAt: '2025-05-11T15:05:00Z', - updatedAt: '2025-05-11T15:05:00Z', - }, - { id: 'match-048', propertyId: 'prop-007', @@ -1500,63 +1388,6 @@ export const mockMatches: Match[] = [ updatedAt: '2025-05-12T08:05:00Z', }, - { - id: 'match-054', - propertyId: 'prop-028', - needId: 'need-010', - matchScore: 37, - matchStrength: MatchStrength.WEAK, - status: MatchStatus.PENDING_REVIEW, - scoreBreakdown: { hardMatchScore: 60, softFactorScore: 50, confidenceModifier: 0.53, dataQualityModifier: 0.35, totalScore: 37 }, - positiveFactors: [ - { criterion: 'Fläche', weight: 0.22, score: 88, contribution: 19.36, explanation: '520m² im Zielkorridor' }, - ], - negativeFactors: [ - { criterion: 'Standort', weight: 0.28, score: 35, contribution: 9.8, explanation: 'Genf ist nicht St. Gallen – 600km Entfernung' }, - { criterion: 'Budget', weight: 0.20, score: 72, contribution: 14.4, explanation: 'CHF 36/m² über Maximum CHF 35/m² knapp' }, - { criterion: 'Konfidenz', weight: 0.15, score: 28, contribution: 4.2, explanation: 'Future-Signal' }, - ], - tradeoffs: [ - { criterion: 'Standort', concern: 'Genf ist nicht kompatibel mit St. Gallen Bedarf', severity: 'HIGH' }, - ], - explainabilitySummary: 'Falscher Standort, Budget knapp über Maximum und Future-Signal. Keine Empfehlung.', - confidenceLevel: 0.38, - riskLevel: RiskLevel.HIGH, - uncertaintyIndicators: ['Falscher Standort', 'Future-Signal'], - organizationId: 'org-wincasa', - createdAt: '2025-05-12T08:10:00Z', - updatedAt: '2025-05-12T08:10:00Z', - }, - - { - id: 'match-055', - propertyId: 'prop-026', - needId: 'need-001', - matchScore: 56, - matchStrength: MatchStrength.MODERATE, - status: MatchStatus.PENDING_REVIEW, - scoreBreakdown: { hardMatchScore: 79, softFactorScore: 63, confidenceModifier: 0.52, dataQualityModifier: 0.34, totalScore: 56 }, - positiveFactors: [ - { criterion: 'Budget', weight: 0.15, score: 92, contribution: 13.8, explanation: 'CHF 43/m² unter Maximum CHF 45/m²' }, - { criterion: 'Fläche', weight: 0.20, score: 85, contribution: 17, explanation: '580m² im Zielkorridor (600–1000m²), knapp unter Minimum' }, - ], - negativeFactors: [ - { criterion: 'Standort', weight: 0.20, score: 60, contribution: 12, explanation: 'Zug liegt nicht in Zürich, aber gleiche Wirtschaftsregion' }, - { criterion: 'Konfidenz', weight: 0.15, score: 30, contribution: 4.5, explanation: 'Future-Signal 52% Wahrscheinlichkeit' }, - ], - tradeoffs: [ - { criterion: 'Standort', concern: 'Zug ist nicht Zürich – Pendeldistanz 30 Min.', severity: 'MEDIUM' }, - { criterion: 'Verfügbarkeit', concern: 'Future-Signal – erst ab April 2026 möglicherweise verfügbar', severity: 'HIGH' }, - ], - explainabilitySummary: 'Budget und Fläche passen. Zug ist eine Alternativlage zur bevorzugten Lage Zürich. Future-Signal mit mittlerer Konfidenz.', - confidenceLevel: 0.42, - riskLevel: RiskLevel.HIGH, - uncertaintyIndicators: ['Standort ausserhalb Präferenz', 'Future-Signal'], - organizationId: 'org-wincasa', - createdAt: '2025-05-12T08:15:00Z', - updatedAt: '2025-05-12T08:15:00Z', - }, - // ─────────────────────────────────────────────────────────────────────────── // need-001 · Innovatech AG · OFFICE Zürich-West — new external/maison matches // ─────────────────────────────────────────────────────────────────────────── diff --git a/src/mock-data/properties.ts b/src/mock-data/properties.ts index 46fc4ae..f8f9102 100644 --- a/src/mock-data/properties.ts +++ b/src/mock-data/properties.ts @@ -876,31 +876,6 @@ export const mockProperties: Property[] = [ // FUTURE_AVAILABILITY (10) // ───────────────────────────────────────────────────────────────────────────── - { - id: 'prop-005', - title: 'Bürofläche Technoparkstrasse (Signal: Expansion)', - assetType: AssetType.OFFICE, - resultType: ResultType.FUTURE_AVAILABILITY, - location: { city: 'Zürich', district: 'Technopark', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3923, lng: 8.5142 } }, - address: { street: 'Technoparkstrasse', houseNumber: '1', postalCode: '8005', city: 'Zürich', country: 'CH' }, - areaSqm: 600, - rentPricePerSqm: 504, - availabilityDate: '2026-03-01', - availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL, - sourceType: 'AI_SIGNAL', - confidenceScore: 0.55, - dataQuality: { - score: 0.38, - missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'], - missingOptionalFields: ['ancillaryCosts', 'floorLevel', 'parkingSpots'], - freshness: DataFreshness.FRESH, - warnings: ['Probabilistisches Signal – kein bestätigtes Objekt', 'Daten nicht verifiziert'], - }, - riskLevel: RiskLevel.HIGH, - createdAt: '2025-05-01T07:00:00Z', - updatedAt: '2025-05-10T07:00:00Z', - }, - { id: 'prop-006', title: 'Produktionsfläche Reinach (Signal: möglicher Auszug)', @@ -1001,31 +976,6 @@ export const mockProperties: Property[] = [ updatedAt: '2025-05-10T08:00:00Z', }, - { - id: 'prop-026', - title: 'Bürofläche Zug Industriestrasse (Signal: Expansion)', - assetType: AssetType.OFFICE, - resultType: ResultType.FUTURE_AVAILABILITY, - location: { city: 'Zug', district: 'Industrie', canton: 'ZG', country: 'CH', coordinates: { lat: 47.1672, lng: 8.5198 } }, - address: { street: 'Industriestrasse', houseNumber: '60', postalCode: '6300', city: 'Zug', country: 'CH' }, - areaSqm: 580, - rentPricePerSqm: 516, - availabilityDate: '2026-04-01', - availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL, - sourceType: 'AI_SIGNAL', - confidenceScore: 0.52, - dataQuality: { - score: 0.34, - missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'], - missingOptionalFields: ['ancillaryCosts', 'floorLevel', 'softFactors'], - freshness: DataFreshness.FRESH, - warnings: ['Probabilistisches Signal – kein bestätigtes Objekt', 'Lage approximiert'], - }, - riskLevel: RiskLevel.HIGH, - createdAt: '2025-04-22T07:00:00Z', - updatedAt: '2025-05-10T08:00:00Z', - }, - { id: 'prop-027', title: 'Produktionsfläche Münchenbuchsee BE (Signal: Auszug)', @@ -1051,31 +1001,6 @@ export const mockProperties: Property[] = [ updatedAt: '2025-05-09T09:00:00Z', }, - { - id: 'prop-028', - title: 'Bürofläche Genf La Praille (Signal: Expansion)', - assetType: AssetType.OFFICE, - resultType: ResultType.FUTURE_AVAILABILITY, - location: { city: 'Genf', district: 'La Praille', canton: 'GE', country: 'CH', coordinates: { lat: 46.1912, lng: 6.1285 } }, - address: { street: 'Route de la Praille', houseNumber: '30', postalCode: '1227', city: 'Genf', country: 'CH' }, - areaSqm: 520, - rentPricePerSqm: 432, - availabilityDate: '2027-01-01', - availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL, - sourceType: 'AI_SIGNAL', - confidenceScore: 0.53, - dataQuality: { - score: 0.35, - missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'], - missingOptionalFields: ['ancillaryCosts', 'floorLevel'], - freshness: DataFreshness.FRESH, - warnings: ['Probabilistisches Signal – Standort approximiert', 'Mietzins geschätzt'], - }, - riskLevel: RiskLevel.HIGH, - createdAt: '2025-03-10T09:00:00Z', - updatedAt: '2025-05-09T10:00:00Z', - }, - { id: 'prop-029', title: 'Logistiklager Frenkendorf BL (Signal: Auszug)', @@ -1285,28 +1210,4 @@ export const mockProperties: Property[] = [ updatedAt: '2025-05-02T10:00:00Z', }, - { - id: 'prop-030', - title: 'Bürofläche St.Gallen Riethüsli (Signal: Expansion)', - assetType: AssetType.OFFICE, - resultType: ResultType.FUTURE_AVAILABILITY, - location: { city: 'St. Gallen', district: 'Riethüsli', canton: 'SG', country: 'CH', coordinates: { lat: 47.4182, lng: 9.3888 } }, - address: { street: 'Riethüslistrasse', houseNumber: '40', postalCode: '9000', city: 'St. Gallen', country: 'CH' }, - areaSqm: 480, - rentPricePerSqm: 324, - availabilityDate: '2026-05-01', - availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL, - sourceType: 'AI_SIGNAL', - confidenceScore: 0.55, - dataQuality: { - score: 0.36, - missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'], - missingOptionalFields: ['ancillaryCosts', 'floorLevel', 'softFactors'], - freshness: DataFreshness.FRESH, - warnings: ['Probabilistisches Signal – kein bestätigtes Objekt', 'Lage und Preis approximiert'], - }, - riskLevel: RiskLevel.HIGH, - createdAt: '2025-04-26T07:00:00Z', - updatedAt: '2025-05-10T08:00:00Z', - }, ]