Benjamin Sutter
e1f4beb898
refactor: architecture compliance pass — DS tokens, hook boundary, god component split, AI hardening
...
- DS token migration: Anfragen.tsx + child components (AnfragenInquiryItem, AnfragenMessageBubble)
fully migrated; DS_TEXT.brandDark added; scoreTheme.ts moved to src/lib/ with re-export proxy
- Hook boundary: Results.tsx no longer calls needService directly — routes through useNeeds()
with optional refetchOnMount/gcTime overrides
- NewListing.tsx (440L) split into useNewListingForm hook + 8 section components under
src/components/new-listing/; page shell reduced to 121 lines
- AI hardening: Zod .strict() on all schemas, AIProvenance extended with schemaVersion/
fallbackReason/traceId/latencyMs, AITraceStore stats with p50/p90/p99 + failure breakdowns,
MockAIService buildFollowUpQuestions with priority ordering + area-ambiguity detection,
prompt templates updated (LIGHT_INDUSTRIAL, budget unit, ambiguity detection, decimal precision)
- Tests: all 154 passing; fixed test regression caused by OfferEmailResponseSchema body min(50)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-24 16:10:39 +02:00
Benjamin Sutter
eedee83b49
refactor: extract SignalSourcesSection from FutureAvailabilityContextPanel (314 → 227 lines)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-24 01:18:49 +02:00
Benjamin Sutter
01c0f8b06f
refactor: extract helpers from 3 match-detail/match-card components
...
- LocationIntelligencePanel (333→275): KpiTile + NEW_PROJECTS → own files
- FutureAvailabilityContextPanel (351→315): constants + utils → own files
- FutureAvailabilityCard (310→244): helpers + SignalQualityDots → own files
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-24 01:16:32 +02:00
Benjamin Sutter
0bacd188d6
refactor: split AppShell, match-detail panels, extract useCompareData
...
AppShell.tsx: 627→116 lines
- appShellConfig.ts: NavItem/WorkspaceConfig types, WORKSPACE_CONFIG, nav helpers
- AppShellSidebar.tsx: Sidebar component with visual constants
- AppShellTopBar.tsx: TopBar component
Match-detail panels:
- ScoreBreakdownPanel: 377→303 lines (scoreBreakdownConstants.ts + CriterionRow.tsx extracted)
- LocationIntelligencePanel: 383→333 lines (SoftFactorBar.tsx extracted)
- FutureAvailabilityContextPanel: 386→351 lines (futureAvailabilityConstants.tsx extracted)
Compare.tsx: 485→441 lines
- useCompareData hook: all queries and derived state extracted to hooks/useCompareData.ts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-24 01:00:38 +02:00
Benjamin Sutter
22c195b4a5
refactor: split large page components + taxonomy/HeatBadge/FutureAvailability improvements
...
- Taxonomy: merge VERIFIED_PORTFOLIO + EXTERNAL_MARKET display → 'Plattform' (dark blue) across all surfaces
- HeatBadge: new flame indicator for hot properties (grid, list, pipeline views)
- FutureAvailabilityContextPanel: richer detail page with AI summary, strategic assessment, sources
- Refactor Pipeline.tsx (630→152 lines) → pipeline/PipelineCard, PipelineColumn, PipelineDetailPanel, pipelineConstants, pipelineUtils
- Refactor IntelligenceMatchCard.tsx (483→179 lines) → FutureAvailabilityCard extracted
- Refactor MatchDetail.tsx (559→464 lines) → useMatchDetailData hook, MatchDetailPropertyDetails
- Refactor Compare.tsx (638→485 lines) → compareUtils, CompareCriteriaCard extracted
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-23 23:36:03 +02:00
Benjamin Sutter
8f7372157c
feat: Pre-Market Intelligence UX rework — institutional positioning
...
Redesign the Future Availability card system to clearly distinguish two classes:
PRE-MARKET VERIFIED (Verwaltung-controlled):
- Soft purple (#7c3aed) accent, institutional premium feel
- Badge: "PRE-MARKET VERIFIED" with shield icon
- "Direkte Verwaltungsquelle" attribution chip in header
- Shows confirmed ERP facts with green checkmarks
MARKET SIGNAL (crawler/probabilistic):
- Slate blue (#1d4ed8) accent, analytical feel
- Badge: "MARKET SIGNAL"
- Amber notice box: "Probabilistischer Marktindikator — kein bestätigtes Objekt"
- Shows market indicators and explicit probability %
- Source attribution (press, job posting, etc.)
Both cards answer: What? How reliable? Where from? Why relevant? Risks? Action?
PropertyDetailView: rename SchattenmarktReleasePanel → PreMarketPanel, update
toggle label to "Pre-Market Matching aktivieren", add Matching Demand Intelligence
block showing active search profile counts and early matching opportunity.
FutureAvailabilityContextPanel: update LEASE_EXPIRY signal type label and
relevance bridge text to remove "Schattenmarkt" references.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-20 17:50:37 +02:00
Benjamin Sutter
5fe15bac62
feat: Future Availability Intelligence — rebrand & card redesign
...
Replaces "Schattenmarkt" branding with professional Future Availability
Intelligence throughout the UI. Two distinct card types: Pre-Market
(LEASE_EXPIRY + verified, green accent) and Market Signal (probabilistic,
blue accent). Professioneller Data-Header replaces dark purple gradient.
New detail panel sections: Erkannte Marktindikatoren, Strategische
Interpretation, Bestätigt/Nicht bestätigt. All 15 mock signals enriched
with concrete Swiss CRE market indicators and strategic interpretations.
Signal quality shown as 4-dot indicator (Hoch/Mittel/Niedrig).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-20 13:06:16 +02:00
Benjamin Sutter
d5a4862a28
feat: redesign Schattenmarkt card & detail view for explainability
...
- Remove abstract Konfidenz/DQ badges from match detail header
- Replace ScoreBreakdownPanel with 3-step Bewertungsherleitung for
FUTURE_AVAILABILITY: Kriterien-Match per factor with bars, Signal-
Abschlag (verified ERP = kein Abschlag / probabilistic = -N Punkte),
Gesamt-Score
- Restructure FutureAvailabilityContextPanel: source section first,
verified ERP box for LEASE_CONTRACT, remove Konfidenz row, disclaimer
as grey footnote instead of yellow alert
- Add LEASE_EXPIRY to signal type/relevance bridge labels
- Show up to 3 match reasons with explanation on cards (was 1)
- matchCardAdapter: return top-3 positive factors as reasons
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-20 12:39:12 +02:00
Benjamin Sutter
9cf3e72033
feat: Schattenmarkt UX — separate section, relevance bridge, source links
...
Signals are now in their own feed section with an explanation banner
so users understand they are not confirmed properties. Each signal card
shows WHY it appears in their search (e.g. 'Fläche könnte frei werden').
Source pills are now clickable links. FutureAvailabilityContextPanel
redesigned with full AI summary, source button, and relevance bridge.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-18 21:59:08 +02:00
Benjamin Sutter
7cf8d8ba72
feat: F012 match detail view
...
Full decision analysis page at /demand/results/:matchId:
- MatchDetailHeader: score, badges, CTA (compare/shortlist), back button
- ExecutiveSummaryPanel: 4-row summary (fit, top reason, tradeoff, next step)
- PropertyOverviewPanel: key facts grid; signal-aware for FUTURE_AVAILABILITY
- NeedAlignmentPanel: comparison table with fit indicators (MATCH/PARTIAL/NO_MATCH)
- ScoreBreakdownPanel: hard/soft scores + modifiers + total (sidebar)
- TradeoffPanel: severity-coded list with mitigation hints
- RiskPanel: risks sorted CRITICAL→LOW with category chips
- MissingInformationPanel: priority-grouped with per-item CTAs
- SourceProvenancePanel: source type, label, URL, freshness
- FutureAvailabilityContextPanel: mandatory disclaimer + signal metadata
- NextActionsPanel: engine-ranked actions + standard actions (sidebar)
- Details button on result cards now navigates to match detail
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 13:55:46 +02:00