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.
Kimi K3
Subject: Heating repair at [property address] — outstanding for three weeks
Dear [Landlord's name],
I hope you're well. I'm writing to follow up on the heating at [property address/unit], which I first reported on [date]. It's now been three weeks without working heating, and despite [my messages on X and Y dates / my calls on X and Y], the repair hasn't yet been carried out or scheduled.
With the cold weather, this is becoming a genuine problem — [briefly note the impact, e.g., the flat is very difficult to keep warm and I'm concerned about the effect on my health]. I'd ask that this now be treated as urgent.
Could you please confirm by [date — e.g., within five working days] when a contractor will attend? I'm happy to be flexible with access and can make myself available [on these days / at short notice] if that helps.
I'd much rather resolve this directly with you than take it any further, and I'm confident we can get it sorted quickly. I'd really appreciate a reply confirming the plan, even if the appointment itself is a few days away.
Thank you for your attention — I look forward to hearing from you.
Kind regards, [Your name] [Phone number]
A few quick tips:
Fill in the specifics (dates you reported it, any responses received) — a clear timeline makes it harder to brush off.
Give a concrete deadline rather than "as soon as possible"; a week is usually seen as reasonable.
Keep everything in writing from here on. This email becomes your record if you do ever need to escalate to a tenants' advice service or local authority — hopefully you won't.
The tone stays cooperative throughout, but the deadline and the one line about "taking it further" signal you're serious without starting a fight.
Asked Nov 1, 2026. Unedited.
Gemini 3.8 Flash
Subject: Urgent: Heating repair follow-up – [Your Unit/Apartment Number]
Dear [Landlord's Name],
I hope you are having a good week.
I am writing to follow up on the heating issue in [Unit/Apartment Number], which was first reported on [Date of first message, e.g., October 12th]. It has now been three weeks since the heat stopped working, and the issue remains unresolved.
With the temperatures dropping, the apartment has become uncomfortably cold and difficult to live in. While I appreciate that coordinating maintenance can sometimes take time, three weeks without heat is a pressing issue that needs immediate attention.
Could you please confirm by [Day of week, e.g., tomorrow at 5:00 PM] when a technician will be arriving to complete the repair?
I am happy to make myself available or provide permission for entry so this can be resolved as quickly as possible.
Thank you for your prompt attention to this matter. I look forward to your update.
Best regards,
[Your Name] [Your Phone Number] [Your Apartment Number]
Asked Nov 1, 2026. Unedited.
Write a React hook that debounces a value and cancels on unmount. Include the TypeScript types.
Kimi K3
useDebouncedValue
import { useEffect, useState } from 'react';
function useDebouncedValue<T>(value: T, delay: number = 500): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value);
useEffect(() => {
const timer = setTimeout(() => {
setDebouncedValue(value);
}, delay);
// Cleanup runs when value/delay changes AND on unmount
return () => {
clearTimeout(timer);
};
}, [value, delay]);
return debouncedValue;
}
export default useDebouncedValue;How it works
Generic
<T>— the hook preserves whatever type you pass in (string,number, a custom object, etc.), so the returned value is fully typed.Debouncing — every time
valuechanges, the effect re-runs. The cleanup function clears the pending timer before a new one starts, so the state only updates once the value has been stable fordelaymilliseconds.Unmount safety — the same cleanup function runs when the component unmounts, cancelling any pending timeout. This prevents a
setStatecall on an unmounted component (and the associated memory leak / React warning).
Usage example
import { useEffect, useState } from 'react';
import useDebouncedValue from './useDebouncedValue';
function SearchPage() {
const [query, setQuery] = useState<string>('');
const debouncedQuery = useDebouncedValue(query, 300);
useEffect(() => {
if (!debouncedQuery) return;
// Only fires 300ms after the user stops typing
fetch(`/api/search?q=${encodeURIComponent(debouncedQuery)}`)
.then((res) => res.json())
.then(console.log);
}, [debouncedQuery]);
return (
<input
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Search…"
/>
);
}The input stays responsive on every keystroke, while the expensive operation (the API call) only runs after typing pauses.
Asked Nov 1, 2026. Unedited.
Gemini 3.8 Flash
Here is a complete, typed useDebounce hook. It uses a generic type T so it works with any data type (strings, objects, numbers, etc.) and cancels the timer if the value changes or when the component unmounts.
The Hook
import { useState, useEffect } from 'react';
/**
* Custom hook that debounces a value.
* Cancels pending timeouts when the value changes or on component unmount.
*
* @param value The value to be debounced.
* @param delay The debounce delay in milliseconds (default: 500ms).
* @returns The debounced value.
*/
export function useDebounce<T>(value: T, delay: number = 500): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value);
useEffect(() => {
// Set up the timer to update the value after the delay
const timer = setTimeout(() => {
setDebouncedValue(value);
}, delay);
// React runs this cleanup function:
// 1. Before re-running the effect when `value` or `delay` changes.
// 2. When the component unmounts.
return () => {
clearTimeout(timer);
};
}, [value, delay]);
return debouncedValue;
}Example Usage
import React, { useState, useEffect } from 'react';
import { useDebounce } from './useDebounce';
export const SearchComponent: React.FC = () => {
const [searchTerm, setSearchTerm] = useState<string>('');
// Debounce the input by 300ms
const debouncedSearchTerm = useDebounce<string>(searchTerm, 300);
useEffect(() => {
if (debouncedSearchTerm) {
// Trigger API call / search operation here
console.log(`Fetching results for: ${debouncedSearchTerm}`);
}
}, [debouncedSearchTerm]);
return (
<input
type="text"
placeholder="Search..."
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
);
};How cancellation works:
The return () => clearTimeout(timer); inside useEffect is React's native cleanup mechanism. React guarantees this cleanup function runs whenever the component is removed from the DOM (unmounted), preventing state updates on unmounted components and memory leaks.
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?
Kimi K3
The answer: about 33%
Despite the positive result, there's only roughly a 1-in-3 chance the person actually uses the drug.
Working through it
Assume "99% accurate" means the test catches 99% of users (sensitivity) and correctly clears 99% of non-users (specificity). Now imagine testing 100,000 people:
| Drug users (500) | Non-users (99,500) | |
|---|---|---|
| Test positive | 495 (99% caught) | 995 (1% false alarms) |
| Test negative | 5 | 98,505 |
Total positive tests: 495 + 995 = 1,490
$$P(\text{user} \mid \text{positive}) = \frac{495}{1{,}490} \approx 33\%$$
Same result via Bayes' theorem:
$$P(U \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$$
Why it surprises people
1. Base rate neglect. People anchor on the 99% accuracy and ignore the 0.5% prevalence. But because users are so rare, the false positives (995) actually outnumber the true positives (495) two to one. A small error rate applied to a huge pool of non-users swamps the correct results from the tiny pool of users.
2. Confusing two different probabilities. People mix up:
P(positive test | user) = 99% — what "accurate" means
P(user | positive test) = 33% — what you actually want to know
These feel identical but are wildly different when the condition is rare.
3. Intuition treats the test as the whole story. The test result is evidence that updates a prior belief, not a verdict. A positive result on a rare condition is weak evidence; a positive result on a common one would be much stronger.
The practical upshot
This is exactly why confirmatory testing exists. If the same person takes a second, independent test and it's positive again, the probability jumps to about 98% — because you're now testing someone with a 33% prior, not 0.5%. It's also why screening entire populations for rare diseases inevitably generates many false alarms.
Asked Nov 1, 2026. Unedited.
Gemini 3.8 Flash
If someone tests positive, the probability that they actually use the drug is approximately 33.2% (or roughly 1 in 3).
Here is the step-by-step breakdown of the math and the psychological reason why this result is so counterintuitive.
The Math (Using a Concrete Example)
The easiest way to understand this is to imagine a population of 10,000 people:
How many people actually use the drug?
0.5% of 10,000 = 50 people are drug users.
99.5% of 10,000 = 9,950 people do not use the drug.
What happens when the 50 drug users take the test (99% accuracy)?
True Positives: $99\% \times 50 = \mathbf{49.5\text{ people}}$ test positive.
False Negatives: 0.5 people test negative.
What happens when the 9,950 non-users take the test (1% error rate)?
False Positives: $1\% \times 9,950 = \mathbf{99.5\text{ people}}$ test positive.
True Negatives: 9,850.5 people test negative.
Calculate the probability:
Total positive tests = $49.5 + 99.5 = \mathbf{149\text{ total positive tests}}$.
Of those 149 positive tests, only 49.5 are actual users.
$$\text{Probability} = \frac{49.5}{149} \approx 0.3322 \text{ (or } \mathbf{33.2\%}\text{)}$$
Even with a positive test, there is roughly a 67% chance the person is clean.
Why Does This Surprise People?
This counterintuitive result is caused by a cognitive bias known as the Base Rate Fallacy (or Base Rate Neglect).
People focus on the test, not the population: Humans naturally anchor on the "99% accurate" figure and assume a positive test means a 99% chance of guilt.
The power of small percentages on large groups: Non-users make up the overwhelming majority of the population (99.5%). Even though the test's error rate is tiny (just 1%), 1% of a huge group (99.5 people) produces more positive results than 99% of a tiny group (49.5 people).
In short, false positives end up outnumbering true positives roughly 2 to 1, which catches most people off guard.
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 | Kimi K3 | Gemini 3.8 Flash | Leads |
|---|---|---|---|
| Coding | #11 | #13 | Kimi K3 |
| Writing | #11 | #17 | Kimi K3 |
| Math | #13 | #9 | Gemini 3.8 Flash |
| Research | #6 | #11 | Kimi K3 |
| Everyday chat | #10 | #6 | Gemini 3.8 Flash |
The facts
Scores from artificialanalysis.ai and lmarena.ai.
| Fact | Kimi K3 | Gemini 3.8 Flash |
|---|---|---|
| Made by | Moonshot AI | |
| API price, per 1M tokens | $3 in, $15 out | $0.75 in, $3.75 out |
| Speed | 53 tokens a second | 132 tokens a second |
| Artificial Analysis Index | 43.6 | 40.9 |
| LMArena text | 1,475 | 1,498 |
| LMArena coding | 1,508 | 1,508 |
| Updated | Oct 26, 2026 | |