Flat Assessment Method
Two layers: scripts compute the numbers, this checklist covers what scripts cannot see.
Read skills/berlin-context first for Mietspiegel, law, and district facts.
Layer 1 — Quantitative (run the script)
bun scripts/assess.ts --id <n> # listing already in the DB
bun scripts/assess.ts --json '<listing>' # ad-hoc listing (add --save to store it)
Returns fit (0–100 with factors), scam (score + reasons), mietspiegel (€/m² delta vs district median). Present the fit factor table verbatim — the factor details are written to be user-facing.
Layer 2 — Qualitative checklist (judge each, report only notable ones)
Money
- Nebenkosten realism: script flags <2 €/m²; if flagged, estimate realistic warm rent (Altbau ≈ +3.5–4.5 €/m² on cold) and state the corrected monthly cost.
- Total move-in cash: Kaution + Abstand/takeover + kitchen if none. One number.
- Kaution legality: ≤ 3 × cold rent (§ 551 BGB). Above = illegal demand, say so.
- Abstand/fixture takeover: legal only up to actual value (§ 4a WoVermittG). Estimate the real value; if the demand is above, mark as negotiation item, not dealbreaker — compare against monthly savings vs alternatives (amortization months).
Contract
- Type: unbefristet? Nachmieter takeover (inherits old rent — usually favorable)? Staffel-/Indexmiete (state escalation)? Zwischenmiete (usually reject).
- Mietpreisbremse: if >10% over Mietspiegel median, note exceptions (new build post-2014, umfassende Sanierung) and whether the claimed exception is plausible.
- Landlord approval chain: Nachmieter listings need Vermieter sign-off — dossier quality decides; check
bun scripts/dossier.ts readiness in the same breath.
Object
- What the ad does NOT mention: EBK, floor if ground/top without lift, heating type, Energieausweis, bath condition. Every omission on this list becomes a viewing question.
- Ausstattung rating vs price: "Einfache Qualität" at premium €/m² is a mismatch to probe.
- Layout oddities: room count vs sqm (2,5 rooms on 100+ m² = partitioned rooms — check who built the partition and why).
Location
- Kiez character, noise sources (nightlife streets, main roads), transit lines from
skills/berlin-context.
- Bedroom orientation (Hofseite = quiet) if stated; else viewing question.
Market signal
- Days on market: fresh (≤3d) → act same day; stale (>21d) → market says overpriced, negotiate.
Output template (sensible default, adapt as needed)
# Assessment — <address> (<portal> <external_id>)
## Scores
Fit: <n>/100 · Scam: <n> — <verdict> · Mietspiegel: <€/m²> vs median <€/m²> (<±n>%)
<fit factor table>
## Beyond the scores
<numbered notable findings from Layer 2, each with a concrete action>
## Verdict
<2–3 sentences: recommendation, quantified risks, next action with urgency>
Always end with the single next action (contact today / request document / skip).
1---2name: flat-assessment3description: This skill should be used when the user asks to "assess this flat", "assess this listing", "is this a good flat", "evaluate this apartment ad", or pastes a rental listing URL and wants a quality judgment beyond scam detection. Combines quantitative scores (fit, scam, Mietspiegel) with a qualitative Berlin-rental checklist and produces a structured assessment report.4---56# Flat Assessment Method78Two layers: scripts compute the numbers, this checklist covers what scripts cannot see.9Read `skills/berlin-context` first for Mietspiegel, law, and district facts.1011## Layer 1 — Quantitative (run the script)1213```bash14bun scripts/assess.ts --id <n> # listing already in the DB15bun scripts/assess.ts --json '<listing>' # ad-hoc listing (add --save to store it)16```1718Returns `fit` (0–100 with factors), `scam` (score + reasons), `mietspiegel` (€/m² delta vs district median). Present the fit factor table verbatim — the factor details are written to be user-facing.1920## Layer 2 — Qualitative checklist (judge each, report only notable ones)2122**Money**23- Nebenkosten realism: script flags <2 €/m²; if flagged, estimate realistic warm rent (Altbau ≈ +3.5–4.5 €/m² on cold) and state the corrected monthly cost.24- Total move-in cash: Kaution + Abstand/takeover + kitchen if none. One number.25- Kaution legality: ≤ 3 × cold rent (§ 551 BGB). Above = illegal demand, say so.26- Abstand/fixture takeover: legal only up to actual value (§ 4a WoVermittG). Estimate the real value; if the demand is above, mark as negotiation item, not dealbreaker — compare against monthly savings vs alternatives (amortization months).2728**Contract**29- Type: unbefristet? Nachmieter takeover (inherits old rent — usually favorable)? Staffel-/Indexmiete (state escalation)? Zwischenmiete (usually reject).30- Mietpreisbremse: if >10% over Mietspiegel median, note exceptions (new build post-2014, umfassende Sanierung) and whether the claimed exception is plausible.31- Landlord approval chain: Nachmieter listings need Vermieter sign-off — dossier quality decides; check `bun scripts/dossier.ts` readiness in the same breath.3233**Object**34- What the ad does NOT mention: EBK, floor if ground/top without lift, heating type, Energieausweis, bath condition. Every omission on this list becomes a viewing question.35- Ausstattung rating vs price: "Einfache Qualität" at premium €/m² is a mismatch to probe.36- Layout oddities: room count vs sqm (2,5 rooms on 100+ m² = partitioned rooms — check who built the partition and why).3738**Location**39- Kiez character, noise sources (nightlife streets, main roads), transit lines from `skills/berlin-context`.40- Bedroom orientation (Hofseite = quiet) if stated; else viewing question.4142**Market signal**43- Days on market: fresh (≤3d) → act same day; stale (>21d) → market says overpriced, negotiate.4445## Output template (sensible default, adapt as needed)4647```48# Assessment — <address> (<portal> <external_id>)49## Scores50Fit: <n>/100 · Scam: <n> — <verdict> · Mietspiegel: <€/m²> vs median <€/m²> (<±n>%)51<fit factor table>52## Beyond the scores53<numbered notable findings from Layer 2, each with a concrete action>54## Verdict55<2–3 sentences: recommendation, quantified risks, next action with urgency>56```5758Always end with the single next action (contact today / request document / skip).