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 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-20 16:10:23 +02:00
parent 0dc04a14c5
commit 67c0701bfe
2 changed files with 0 additions and 268 deletions
-169
View File
@@ -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 (6001000m²), 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
// ───────────────────────────────────────────────────────────────────────────
-99
View File
@@ -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',
},
]