Write a polite but firm email to a landlord who has not fixed the heating for three weeks. I want the repair, not a fight.
GLM 5.3 Flash
Subject: Urgent: Heating Repair Still Outstanding – Request for Immediate Action
Dear [Landlord's Name],
I hope you're doing well. I'm writing to follow up on the heating issue in my apartment at [address], which I first reported on [date of first report] — three weeks ago.
Despite my previous messages on [dates of any follow-ups], the heating has not been repaired. As you'll appreciate, living without adequate heating is more than an inconvenience; it affects my health, comfort, and possibly the habitability of the unit, particularly with [cold weather / a cold snap / young children in the home, as applicable].
I would very much like to resolve this amicably and quickly. To that end, I'd appreciate it if you could:
Confirm a repair date in writing within [48 hours / 3 business days] of this email; and
Arrange for a qualified technician to complete the repair by [specific reasonable date, e.g., end of this week].
If it's helpful, I'm happy to be flexible on timing to accommodate the contractor — I just need a firm commitment and a date.
For my records, I'm keeping a written log of all communications regarding this issue, including this email. I'm confident we can sort this out without needing to involve the local housing authority or consult my tenancy rights, but I do need the repair scheduled now rather than later.
Thank you for your prompt attention. I look forward to your reply by [date].
Kind regards, [Your Name] [Address / Unit Number] [Phone Number]
A few tips for using this:
Fill in the specific dates — documenting the timeline ("reported on X, followed up on Y") is what makes the email firm rather than just polite.
The reference to the housing authority is your leverage. It's phrased as "I'm confident we won't need to..." — which signals you know your rights without threatening.
Keep the paper trail. Send it by email rather than phone, and save a copy. If this drags on, a dated record is your best friend.
Check your local rules. In many places, landlords are legally required to fix heating within a specific timeframe (often much shorter than three weeks) — mentioning "my tenancy rights" hints you may know this.
Want me to adjust the tone (softer or firmer), or tailor it to a specific country's tenancy laws?
Asked Nov 1, 2026. Unedited.
Claude Haiku 5.5
Here's a draft you can adapt. It's firm about the deadline and the facts, but it keeps the tone cooperative, since that's usually what gets repairs done fastest.
Subject: Heating repair needed at [Property Address], reported [date]
Dear [Landlord's Name],
I'm writing about the heating at [property address], which has not been working since [date]. I first reported the problem on [date] by [phone/text/email], and I have followed up on [dates] without a repair being scheduled.
It has now been three weeks without heat. The apartment is [describe conditions briefly, e.g., "often below 60°F"], which is affecting our comfort and health, and I'd like to resolve this as quickly as possible.
Could you please:
Confirm by [date, e.g., 2 business days from now] when a technician will be coming to inspect and repair the heating system.
Let me know the name and contact details of the company doing the work, so I can coordinate access.
Tell me if you need anything from me, such as a specific time window or access to a particular room.
I'm happy to work around your schedule and make sure someone is available to let the technician in. If I don't hear back by [date], I'll need to explore my options under [local tenancy law / the terms of our lease], which may include contacting [local housing authority / code enforcement] to request an inspection.
Thank you for your prompt attention to this. I'd much prefer to get this resolved directly with you, and I appreciate your help.
Best regards, [Your Name] [Unit number, phone number]
Tips before sending:
Keep a paper trail. Send this by email or a text so there's a written record, even if you've already called.
Check your lease and local law for the repair deadline and what you're entitled to (repair-and-deduct, rent withholding, or reporting to the housing authority). Rules vary a lot by location, and the threat in the last paragraph should only name remedies that actually apply to you.
Take photos or note the temperature with a dated thermometer reading. This helps if you escalate.
Don't withhold rent until you've confirmed what's legal where you live.
If you tell me your city or country and the approximate temperature in the apartment, I can tailor the legal reference and the wording.
Asked Nov 1, 2026. Unedited.
Write a React hook that debounces a value and cancels on unmount. Include the TypeScript types.
GLM 5.3 Flash
Here's a well-typed useDebouncedValue hook that cancels pending updates on unmount:
import { useEffect, useState } from "react";
/**
* Returns a debounced copy of `value` that only updates after
* no new value has been provided for `delay` milliseconds.
*/
function useDebouncedValue<T>(value: T, delay = 300): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value);
useEffect(() => {
// Set up the timer for this value
const timeoutId = window.setTimeout(() => {
setDebouncedValue(value);
}, delay);
// Cleanup: cancels the pending update when the value changes
// OR when the component unmounts.
return () => {
window.clearTimeout(timeoutId);
};
}, [value, delay]);
return debouncedValue;
}
export default useDebouncedValue;Usage
import { useState } from "react";
import useDebouncedValue from "./useDebouncedValue";
function SearchResults() {
const [query, setQuery] = useState("");
const debouncedQuery = useDebouncedValue(query, 500);
useEffect(() => {
if (!debouncedQuery) return;
// This only fires once typing pauses for 500ms
fetchResults(debouncedQuery);
}, [debouncedQuery]);
return <input value={query} onChange={(e) => setQuery(e.target.value)} />;
}Key points
Generic
<T>: The hook preserves the exact type of the value you pass in —useDebouncedValue<string>, objects, etc.Unmount safety: The
return () => window.clearTimeout(...)in the effect cleanup runs on unmount, so no state update is attempted on an unmounted component. React 18+ no longer warns about this, but it avoids unnecessary work regardless.Value-change cancellation: Because the cleanup also runs before each re-run of the effect, rapid changes cancel the previous timer — that's the actual debouncing mechanism.
Default
window.setTimeout: Usingwindow.setTimeoutexplicitly ensures the return type isnumber(notNodeJS.Timeout), avoiding a DOM/Node type mismatch. If you're in a browser-only codebase, this is the safest form.
Optional: leading/trailing behavior
If you want more control, here's a variant with an options object:
interface DebounceOptions {
delay?: number;
/** Fire immediately on first value, then debounce (default: false) */
leading?: boolean;
}
function useDebouncedValue<T>(value: T, options: DebounceOptions = {}): T {
const { delay = 300, leading = false } = options;
const [debouncedValue, setDebouncedValue] = useState<T>(value);
const isFirstRender = useRef(true);
useEffect(() => {
if (isFirstRender.current && leading) {
isFirstRender.current = false;
setDebouncedValue(value);
return;
}
isFirstRender.current = false;
const timeoutId = window.setTimeout(() => setDebouncedValue(value), delay);
return () => window.clearTimeout(timeoutId);
}, [value, delay, leading]);
return debouncedValue;
}For most use cases, the simple version at the top is all you need.
Asked Nov 1, 2026. Unedited.
Claude Haiku 5.5
import { useEffect, useState } from "react";
/**
* Returns a copy of `value` that only updates after `delay` milliseconds
* have passed without `value` changing. The pending timer is cleared when
* `value` or `delay` changes and when the component unmounts.
*/
export function useDebouncedValue<T>(value: T, delay: number = 300): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value);
useEffect(() => {
const timeoutId = window.setTimeout(() => {
setDebouncedValue(value);
}, delay);
// Runs before the next effect and on unmount, cancelling the pending update.
return () => {
window.clearTimeout(timeoutId);
};
}, [value, delay]);
return debouncedValue;
}Usage:
import { ChangeEvent, useEffect, useState } from "react";
import { useDebouncedValue } from "./useDebouncedValue";
export function Search() {
const [query, setQuery] = useState("");
const debouncedQuery = useDebouncedValue(query, 400);
useEffect(() => {
if (debouncedQuery) {
console.log("Fetching results for:", debouncedQuery);
}
}, [debouncedQuery]);
const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
setQuery(e.target.value);
};
return <input value={query} onChange={handleChange} placeholder="Search..." />;
}Notes:
window.setTimeoutreturns anumber, which avoids theNodeJS.Timeoutvs.numbertype mismatch you can hit in mixed Node/browser TypeScript setups.Because the cleanup function clears the timer, a pending update never calls
setDebouncedValueafter unmount, so there is no state update on an unmounted component.
Asked Nov 1, 2026. Unedited.
A drug test is 99% accurate, and 0.5% of people use the drug. Someone tests positive. What is the probability they use it, and why does the answer surprise people?
GLM 5.3 Flash
The Answer: About 33% — not 99%
This is the classic base rate fallacy, and the math is worth seeing.
Setting Up Bayes' Theorem
Given:
99% test accuracy (sensitivity: 99% of users test positive; specificity: 99% of non-users test negative)
0.5% of the population uses the drug (the base rate)
Among 10,000 people:
| Group | Count | Test Positive | Test Negative |
|---|---|---|---|
| Users (0.5%) | 50 | ~49.5 | ~0.5 |
| Non-users (99.5%) | 9,950 | ~99.5 | ~9,850.5 |
| Total | 10,000 | ~149 |
$$P(\text{user} \mid \text{positive}) = \frac{0.99 \times 0.005}{(0.99 \times 0.005) + (0.01 \times 0.995)} = \frac{0.00495}{0.00495 + 0.00995} \approx 33\%$$
Why This Surprises People
We ignore the base rate. Our intuition latches onto "99% accurate" and ignores how rare drug use is. But the rare condition means most positives come from the huge pool of non-users.
False positives outnumber true positives. Even though only 1% of non-users test positive wrongly, there are so many non-users (9,950) that they generate ~100 false positives — twice as many as the ~50 true positives from actual users.
"99% accurate" ≠ "99% chance it's right." Accuracy is a property of the test. The probability you want depends on both the test and how common the condition is.
The Takeaway
For rare conditions, even excellent tests produce mostly false positives. This is why:
Doctors often order a second, independent test before diagnosing a rare disease (two positive results would push the probability past ~98%)
Screening entire populations for rare diseases is controversial — you may harm more people with false alarms than you help with true catches
Rule of thumb: the rarer the condition, the less a single positive test tells you.
Asked Nov 1, 2026. Unedited.
Claude Haiku 5.5
The probability is about 33%, not 99%.
Setup. I'll assume "99% accurate" means the test correctly identifies users 99% of the time and correctly clears non-users 99% of the time.
Prior: P(user) = 0.005
P(positive | user) = 0.99
P(positive | non-user) = 0.01
Bayes' theorem:
$$P(\text{user} \mid +) = \frac{0.99 \times 0.005}{0.99 \times 0.005 + 0.01 \times 0.995} = \frac{0.00495}{0.0149} \approx 0.33$$
Counting people instead (out of 10,000):
50 users → about 49.5 test positive
9,950 non-users → about 99.5 test positive (false positives)
Total positives ≈ 149, of which about 49.5 are actual users
So roughly 1 in 3 positive results is a true positive.
Why it surprises people:
Base-rate neglect. We focus on the test's 99% accuracy and ignore how rare the drug use is. Only 0.5% of people use the drug, so the pool of non-users is huge, and even a 1% false-positive rate applied to that pool produces many more false alarms than there are true users.
The error rates apply to different groups. The 1% false-positive rate applies to the ~99.5% who don't use the drug. The 99% sensitivity applies only to the 0.5% who do. The large group's small error rate can outweigh the small group's large hit rate.
Intuition treats the test result as the answer. Bayes' theorem combines the test result with the prior. Intuition often skips the prior.
The practical lesson: a positive result from a screening test for a rare condition is a reason for confirmation, not a diagnosis. Follow-up tests with a different method are standard for this reason. If the prevalence were 10% instead of 0.5%, the same test would give a positive result about 92% probability of being a true positive.
Asked Nov 1, 2026. Unedited.
Head to head
Ranked against 42 models, from public leaderboards and our own blind tests where we have them. How we rank
| Task | GLM 5.3 Flash | Claude Haiku 5.5 | Leads |
|---|---|---|---|
| Coding | #14 | #16 | GLM 5.3 Flash |
| Writing | #7 | #16 | GLM 5.3 Flash |
| Math | #14 | #16 | GLM 5.3 Flash |
| Research | #5 | #14 | GLM 5.3 Flash |
| Everyday chat | #12 | #19 | GLM 5.3 Flash |
The facts
Scores from artificialanalysis.ai and lmarena.ai.
| Fact | GLM 5.3 Flash | Claude Haiku 5.5 |
|---|---|---|
| Made by | Z.ai | Anthropic |
| API price, per 1M tokens | $0.15 in, $0.50 out | $0.10 in, $0.50 out |
| Speed | 74 tokens a second | 234 tokens a second |
| Artificial Analysis Index | 41.8 | 43.4 |
| LMArena text | 1,472 | No public score |
| LMArena coding | 1,508 | No public score |
| Updated | Oct 26, 2026 | |