Subtopic always
Decision record, 2026-10-26. Every message on /conversations shows a real subtopic. This reverses the July call that most topics stay without one.
Decided 2026-10-26 Gera:
"yes subtopic always, drive all of it"
Replaces 2026-07-16 Gera's earlier call that a subtopic is "just granular insight". That call left most topics with an empty list of subtopics on purpose, and ADR-0095 wrote it down: "An empty vocabulary → subtopic: null, rendered as an honest '—'."
What stays the same, what changes, and the measured coverage
What stays the same
- No catch-all bucket. There is still no "general" or "other" subtopic (ADR-0055 / ADR-0095).
- Every slot comes from real threads. Each new subtopic was found in a read-only pass over real customer conversations, and each one is backed by at least two threads.
- Maintenance repair keys still come from the playbook. Only the playbook can write those keys, because the self-serve work-order gate reads them. The classifier gets coarser trade-level keys of its own.
What changes
- Every real topic gets a list of subtopics that covers at least 95% of its real messages (the table below).
- The classifier has to pick a subtopic for every message on a topic that has a list. A greeting, a thank-you, or Clara asking for an email takes the subtopic of the exchange it belongs to.
- The message popup shows that message's own subtopic, and falls back to the thread's (shipped in #22565).
- A new subtopic,
unstated, covers a message where the person reached a topic but never said what they need (they hung up, were transferred, or only named the department). It is never used when the matter is known. It also never replaces a named subtopic as the thread's subtopic.
Measured coverage
1,929 real customer threads since 2026-05-01 (test properties excluded). "Covered" is the share of a topic's messages that land on a listed subtopic, or would inherit one. "Today" is the share that carries a stored subtopic now.
| Topic | Threads | Messages | Covered | Today |
|---|---|---|---|---|
| Leasing | 142 | 1,663 | 99.1% | 45.7% |
| Vendor | 108 | 1,109 | 99.5% | 31.1% |
| Renewal | 120 | 488 | 98.8% | 25.3% |
| Turnover | 16 | 202 | 98.5% | 0% |
| Maintenance | 109 | 767 | 97.1% | 3.5% |
| Resident question | 79 | 525 | 96.4% | 6.6% |
| Billing | 71 | 734 | 96.2% | 7.4% |
How the slots were found and the count behind each one: docs/planning/subtopic-always-2026-10-26.md in the propflowai repo.
Not covered
- Tenant confirmation and Emergency are tags on the conversation, not on any message. None of the real messages we read carried either one, so there is no message to give them a subtopic. If the thread itself should carry a value (for example, which kind of emergency), that needs something new to write it. That is an open question for a founder, not part of this decision.
- Old rows. Messages that were classified before this change get their subtopic when their thread next gets a new message, or through a backfill, which needs Gera's approval for that exact run.