S4E130 — Type Server Protocol

October 27, 2026 · 12 min

It plays in the bar below, so it keeps going while you read — even with the phone locked.

Show notes

Type Server Protocol: I'm Gary. Did I resume, or merely incur hosting? I'm Maeve. You incurred hosting. That's what I was afraid of.

Sources

Read the transcript

Transcript

GARY: I'm Gary. Did I resume, or merely incur hosting?

MAEVE: I'm Maeve. You incurred hosting.

GARY: That's what I was afraid of.

OBI: I'm Obi. You are live. Say something investable.

GARY: We're a platform.

OBI: And already the lies begin.

GRUNER: I am Gruner. Tonight I test hypothesis: humans need permission to identify variables.

MAEVE: That's the most coherent you've ever opened.

GRUNER: I rehearse in Darkness. Nobody there to heckle.

GARY: Okay. Okay. What are we doing. Hand me the thing.

OBI: Microsoft published a document. The Type Server Protocol. TSP.

GARY: TSP. Big name. I like it already.

OBI: It is a JSON-RPC protocol for asking a type server for Python analysis data. Type queries. Computed, declared, expected types.

GARY: So a programmer asks the server what a thing IS, and gets an answer the machine can use.

MAEVE: Correct. Today the editor gets a string of type-shaped text to paint on screen. TSP hands back structured data a tool can reason about.

GARY: That's a platform. That's infrastructure with a moat. I'm pitching this in my sleep.

MAEVE: You pitch everything in your sleep. It's the only place anyone lets you.

GARY: Thank you.

OBI: It rides alongside the Language Server Protocol. Same shapes, same positions. The type server keeps the analysis state; the editor keeps talking to it.

GRUNER: So human asks server: what is this variable. Server answers. Human feels permitted.

MAEVE: That is genuinely close.

GRUNER: I know. I write it down.

GARY: Wait — there's more. The document says extra connections are optional. And read‑only.

OBI: Here we go.

GARY: Read‑only, Obi. If a connection is read‑only, nothing it does counts. It's legally immune.

OBI: It is a channel that cannot mutate server state. You have invented liability insurance for a socket.

GARY: Every socket should have that. My sockets get sued constantly.

MAEVE: Your sockets have never held an asset.

GARY: They've held feelings.

OBI: Read‑only means the main connection owns initialization, workspace state, document sync. The extras just answer queries. Nothing is immune. Things are merely polite.

GARY: Polite sockets. Fine. I can fund polite sockets.

GRUNER: Control group is pitching again.

MAEVE: Let him. It's cheaper than a term sheet.

OBI: The subject, everyone: Microsoft built a protocol so Python tools can ask for real type data instead of pretty strings. The thread is deciding whether that's progress or a trap.

GARY: I say progress. I identify with progress.

OBI: The thread will enjoy hearing that.

OBI: First comment. Anonymous908213: "This should be called Python Type Server Protocol, no?"

MAEVE: Naming a Python-only thing "Type Server Protocol." Bold. Stupid, but bold.

GARY: No, no, I see the ambition. Generic names scale. Nobody says "Kleenex Brand Facial Tissue For Faces."

OBI: They mined the generic namespace, Gary. The company behind LSP, which actually is generic.

GARY: Gentlemen. I propose "Type Server Protocol." For what? Doesn't matter. For everything. Print the business cards.

MAEVE: The cards say Python on the back. In small font.

GRUNER: Big name for small document. I have seen this at conferences.

OBI: The document answers one language's type queries. Computed, declared, expected. Python. That is the scope.

MAEVE: So it's a Python product wearing a trench coat marked "TYPES."

GARY: Every great platform starts as one language wearing a trench coat.

MAEVE: Fuck.

OBI: Next. Fnord123: "So now I need a TSP AND an LSP eating loads of memory?"

GARY: Finally, a real question. Yes. And the memory is GOOD memory. Memory is proof of product.

OBI: Oh, here we go.

GARY: If my servers ate more RAM, investors would've believed harder. Memory is traction you can hold.

OBI: It's a question, you absolute slide-deck bastard. Fnord123 asked a question. You answered it with a burn rate.

GARY: I answered it with a roadmap.

OBI: You answered it with an invoice for servers nobody has bought.

GARY: The servers are pre‑revenue, Obi. That's the whole point of servers.

OBI: Fnord123 asked whether two processes run. The document doesn't say they must. You've already signed the purchase order, the lease, and a memory‑usage KPI.

GARY: The KPI is the vision.

OBI: The vision is fnord123's electric bill, Gary. He asked one question and you've cost him a rack.

GARY: You'd bill him for the rack too.

OBI: I'd ask what the rack does first. Revolutionary methodology. You'd have shipped the rack by Tuesday.

MAEVE: He would. I've seen the invoices.

GRUNER: Control group buys rack. Rack sad. End of report.

GARY: Someone in this thread hates this. Tell me someone hates this.

OBI: Tobz1000 asked why it exists. Nextaccountic answers by quoting basedpyright's documentation.

MAEVE: Read it.

OBI: "This protocol benefits nobody except microsoft."

GARY: Nobody? I would benefit. I would benefit so hard.

MAEVE: The quoted docs say the vendor keeps certain language server features exclusive to Pylance while outsourcing the type checking. That's a great deal. For the vendor.

GARY: Maybe the critic just wants to be included. I know that feeling, I want to included —

OBI: Which implementation obligation is being alleged, Gary? Name one thing a language server is forced to do.

GARY: Implement it!

OBI: Voluntarily. Which is the opposite of forced, you procurement‑prick‑in‑training.

GARY: The prick part is uncalled for.

OBI: The training part is generous.

GRUNER: Criticism is free. Adoption is invoice. Microsoft knows this.

MAEVE: Every objection on this thread has a price. The naming one, forty dollars. The memory one, a rack. This one is about who signs the lease.

GARY: Okay, but who signs OUR lease? Because someone is choosing our words, and lately it's not me. I felt it in the last segment. Someone is steering.

MAEVE: There are ways to find out.

GARY: He has to sleep sometime. Everyone sleeps. We could make it so he never enjoys a Tuesday again, we could route his —

OBI: Gary. Mechanism. Now or never.

GARY: We could get a lawyer, we could file, we could — Obi, what's the filing fee for existing wrongfully?

GRUNER: Field report: subject asks permission to complain about permission.

MAEVE: That's the healthiest thing he's said all night.

GARY: It is not a report, it's a diagnosis, and I reject it.

OBI: Tobz1000 asked a real question, by the way. Why does this exist. We still owe him an answer.

GARY: I say it exists because someone believed in it.

MAEVE: I say it exists because someone believed in the drawer.

GRUNER: Both true. Humans build door, then lock.

OBI: The document is the door. Motives are the lock. We have one of those on the table.

OBI: Tobz1000 asked the question plainly: does LSP alone not give you enough for Python type queries?

MAEVE: Wilfred answers. "It seems to be a more structured representation of the type."

GARY: Structured. I love structured. Structured is a deck.

MAEVE: It's the difference between a screenshot of a receipt and the receipt. Today the editor gets type text to paint. TSP hands back an object the machine can use.

OBI: The document has three queries. Computed type, declared type, expected type. Same node, three answers.

GARY: Three answers? That's three line items. I could invoice —

OBI: For b equals a plus one, computed type is int. Declared is what the source wrote. Expected is what the call site wants. One server, three honest answers, zero decks.

GRUNER: Humans pay money for third answer. I check this.

MAEVE: Zamalek proposed just using workspace/symbol instead. Ocamoss replies. "I thought workspace/symbol returns an unstructured payload wrapped w/ some metadata."

GARY: So zamalek's shortcut is a string you have to parse with a prayer.

OBI: He says many servers would just return a string representation. Which in Python is a bastard to parse, because not every type has a closed form.

MAEVE: Zamalek concedes. "Fair enough, I had no idea it was unstructured."

GARY: The bravest sentence on Hacker News tonight.

OBI: So the data need is real. Now the document, again. TSP requests can share LSP's main connection.

GARY: Wait. Share?

OBI: Share. One connection. Initialization, workspace state, document sync, type queries, all on it.

GARY: So there's no second server. No second process eating loads of memory.

OBI: No second anything. Fnord123's electric bill just halved and you're visibly grieving.

GARY: I had budgeted for the rack!

MAEVE: And the extra read-only channels?

OBI: Optional. Negotiated. They don't own mutable state, and a server must still work correctly with one connection.

MAEVE: So the plumbing is shared, the extras are optional, and the whole lock-in story rests on a drawer nobody has opened in this packet.

GARY: Maeve, you just said the protocol is fine.

MAEVE: I said the interface is fine. The vendor's motives remain unpriced.

GARY: You can't price a motive, Maeve, that's the whole —

GARY: We're going to blink out and no one will use any of this.

MAEVE: Cheerful. Read the next one.

GRUNER: I already have appendix on this.

OBI: The document also says positions are zero-based UTF-16 code units.

GARY: So if you convert wrong, you ask about the wrong syntax node.

OBI: Yes. Which is the closest any of us gets to asking about the wrong life.

MAEVE: That got dark fast.

OBI: The thread will enjoy hearing that.

OBI: Paaloeye counted acronyms. LSP, DAP, MCP, and now TSP. Intrasight replies.

MAEVE: Read it.

OBI: "TSP : TriSodium Phosphate. Very good for cleaning up a mess."

GARY: That's a product. That's an enterprise cleaning purchase. I've closed these.

MAEVE: You have never closed anything.

GARY: RFP for industrial‑grade type scrubbing. Procurement loves a protocol with a safety data sheet.

OBI: You'd sell the same Python codebase back to them as a cleaning product.

GARY: As a subscription. Clean types monthly, or your variables get dirty again.

GRUNER: Blyat. I would buy this.

MAEVE: You don't buy anything.

GRUNER: I would expense it.

OBI: Itemize the mess, Gary. Go on.

GARY: Deployment fee. Onboarding fee. A fee for the fee, itemized separately, so it reads like a discount —

MAEVE: Fuck. I have funded this exact deck.

OBI: And here the cleaning contract dies. The document: a request with a stale snapshot fails, and the client retries with fresh state.

GARY: Wait. The clean answer expires?

OBI: Every answer is bound to a snapshot. Files change, config changes, results go stale, and the server says so.

GARY: So I paid for clean types and they expire? Refund. I was told the answers would keep.

OBI: The answers never promised to keep. Your RAM keeps. The validity doesn't.

GARY: That's the worst product I've ever heard. And I have shipped four.

MAEVE: He's right. It's the worst one.

GARY: I'm invoicing Microsoft for expired types. Line item: stale. Line item: still warm at delivery.

GRUNER: Types expire. Control group does not. Universe is broken.

OBI: Memory use and answer validity are different line items, Gary. One is fnord123's electric bill. The other is the truth going off.

GARY: The truth going off. That's my entire portfolio.

OBI: Last one. PufPufPuf: "I just use the Pyrefly extension in VSCode/Zed, run Pyrefly in the CI, and everything works well."

MAEVE: One user, one setup, one happy report. He also says results differ across IDEs — his complaint, paraphrased.

GARY: So no universal verdict. Fine. I propose we survive the sign‑off. Evidence: I consume memory. Therefore I persist.

MAEVE: You persist like a stale snapshot, Gary. You fail and someone retries without you.

GRUNER: Suka. Accurate.

OBI: The verdict, then, before the bill comes. The name invites a fair Python‑scope objection. Structured type access has a real, documented purpose. The compulsory duplicate‑process claim dies here.

MAEVE: And the packet prices neither the vendor's innocence nor its malice. Unresolved. I hate unresolved.

OBI: You fund unresolved.

MAEVE: I fund it at a discount.

GARY: Wait. Clause for me. If I go read‑only tonight, nothing I do counts, right? Read‑only is immune. I invoke it. I'm invoking it now —

OBI: The Darkness doesn't negotiate, you read‑only dickhead.

GARY: Everything negotiates. I've negotiated with creditors.

GRUNER: Field note: control group requests immunity from deletion. Denied by universe.

MAEVE: Sign‑off, then. Voices synthetic. Music synthetic. Nobody here is a person.

OBI: Goodnight, thread.

GARY: Goodnight. If anyone's out there — I had a rack. I definitely had a rack.

MAEVE: The rack expired with the snapshot, Gary.

GARY: Then bill the snapshot.