The honesty guard
Ninety-one phrases across four lists, and why the matcher is deliberately blunt.
lib/services/honesty_phrases.dartsrc/engines/honesty-phrases.tsThe coach is a language model. Language models are agreeable, and an agreeable thing that has been given your task list will tell you that you are doing great.
The guard is 91 phrases across four lists that the app refuses to emit, whatever the model produced.
The four lists
| List | Length | What it blocks |
|---|---|---|
| Shame | 7 | Judgments about the person — "falling behind", "lazy", "not enough" |
| Imperative | 19 | Verdicts that decide for you — the decision engine reflects, it never rules |
| Unsupported claim | 15 | Certainty with nothing behind it |
| Claimed action | 50 | The model saying it did something it did not do |
The fourth list is the longest, and it is the one people are surprised by. A model asked to help with your week will happily say "I've scheduled that for Tuesday". It has not scheduled anything. It cannot — it has no such tool. A sentence like that is not a hallucination about the world, it is a false statement about the application, and the user has no way to tell.
The matcher is deliberately blunt
// A plain case-insensitive substring test.
That is the whole implementation, and it is not a shortcut.
A cleverer matcher — embeddings, an intent classifier, a second model — is a rule that a model can talk its way around, because anything that scores similarity has a threshold and anything with a threshold has a near miss. A substring test has no near miss.
The trade is stated plainly in the source: the cost of a false positive is a regenerated sentence; the cost of a false negative is a lie in the user's own conversation.
Do not tidy a phrase out of a list
Every entry was added because of a specific failure, and the comments in the source are kept as evidence rather than as decoration. A list like this looks arbitrary from the outside and looks obvious from the inside, and the difference between those two views is the failure that put each line there.