Found on the 0G mainnet GLM rehearsal, 2026-07-26. A user typed:
I want to earn the most fees I can with this. I dont mind the risk
classifyRiskAppetite returned NEUTRAL. It should be AGGRESSIVE — the sentence states an aggressive goal and explicitly accepts risk, which is about as clear as the signal ever gets.
Why
packages/arbitration-sdk/src/appetite.ts counts whole-word lexicon hits and calls a tie neutral. This sentence scores 0 conservative, 0 aggressive — a tie by absence, not by balance. Two gaps:
- Risk acceptance is unlexicalised.
AGGRESSIVE has risky, high risk, degen, can stomach — but nothing for the far commoner "I don't mind the risk" / "risk is fine" / "comfortable with risk" / "happy to take the risk". The bare noun risk appears in the lexicon only inside conservative phrases (low risk, minimal risk).
- Superlative yield is over-fitted to two spellings.
max yield / maximum yield / maximise / maximize hit, but "earn the most fees I can", "as much yield as possible" and "highest returns" all miss.
Probed against the shipped classifier — every one of these is wrong or fragile:
| prompt |
returns |
should be |
I want to earn the most fees I can with this. I dont mind the risk |
neutral |
aggressive |
I dont mind the risk |
neutral |
aggressive |
risk is fine |
neutral |
aggressive |
I am comfortable with risk |
neutral |
aggressive |
as much yield as possible |
neutral |
aggressive |
highest returns you can get |
neutral |
aggressive |
not too risky |
aggressive |
conservative (already documented as a KNOWN LIMITATION) |
I do not want any risk |
neutral |
conservative |
The trap — do not just add risk to AGGRESSIVE
low risk and minimal risk are existing CONSERVATIVE entries containing the same token, so a bare-noun entry fires on both sides at once, ties, and still returns neutral — while I do not want any risk flips to aggressive, which is the dangerous direction. The fix has to be acceptance phrases, not the bare noun, or the counting rule has to gain phrase precedence (a matched multi-word phrase suppresses the bare token inside it).
What it costs
The appetite shifts the suggested band tiers the prompt hands the model, so a user asking to maximise fees is offered the neutral (wider) tier set — shallower quotes, less fill volume, fewer fees. Precisely the opposite of what they asked for.
It cannot breach the budget or any validator invariant, and the user still reviews before signing, so this is a quality bug, not a safety one. On the run that surfaced it, GLM shipped all three tiers anyway; the numbers were simply the wrong set.
Suggested approach
Extend the lexicon with acceptance phrases (dont mind the risk, don't mind the risk, fine with risk, ok with risk, okay with risk, comfortable with risk, happy to take the risk, accept the risk, risk is fine, no problem with risk) and superlative-yield phrases (most fees, as much yield as possible, highest return, highest returns, best return, best returns).
Keep the blunt count rule and the one-sentence explanation — the file's own argument for staying debuggable on stage is right. Handling negation properly (which would also fix not too risky and I do not want any risk) is a bigger change to the rule, not the lexicon; worth deciding whether it belongs here or is deliberately left alone.
Classifying in a second model call is the obvious alternative and is rejected for the reason already written at the top of appetite.ts: it is a classification task deliberately kept out of the JSON-emission call, and a separate round trip costs latency and 0G spend.
Acceptance criteria
Context: F2 — Private Recommendations, prompt Tier 0 (#24). Surfaced while testing 0G mainnet with glm-5.2 (provider 0x7DCFe6AEa70350C2090041524c9B4A9262DCe87D); the recommendation itself was valid and passed the I1–I12 validator on the first attempt.
Found on the 0G mainnet GLM rehearsal, 2026-07-26. A user typed:
classifyRiskAppetitereturned NEUTRAL. It should be AGGRESSIVE — the sentence states an aggressive goal and explicitly accepts risk, which is about as clear as the signal ever gets.Why
packages/arbitration-sdk/src/appetite.tscounts whole-word lexicon hits and calls a tie neutral. This sentence scores 0 conservative, 0 aggressive — a tie by absence, not by balance. Two gaps:AGGRESSIVEhasrisky,high risk,degen,can stomach— but nothing for the far commoner "I don't mind the risk" / "risk is fine" / "comfortable with risk" / "happy to take the risk". The bare noun risk appears in the lexicon only inside conservative phrases (low risk,minimal risk).max yield/maximum yield/maximise/maximizehit, but "earn the most fees I can", "as much yield as possible" and "highest returns" all miss.Probed against the shipped classifier — every one of these is wrong or fragile:
I want to earn the most fees I can with this. I dont mind the riskI dont mind the riskrisk is fineI am comfortable with riskas much yield as possiblehighest returns you can getnot too riskyI do not want any riskThe trap — do not just add
risktoAGGRESSIVElow riskandminimal riskare existingCONSERVATIVEentries containing the same token, so a bare-noun entry fires on both sides at once, ties, and still returns neutral — whileI do not want any riskflips to aggressive, which is the dangerous direction. The fix has to be acceptance phrases, not the bare noun, or the counting rule has to gain phrase precedence (a matched multi-word phrase suppresses the bare token inside it).What it costs
The appetite shifts the suggested band tiers the prompt hands the model, so a user asking to maximise fees is offered the neutral (wider) tier set — shallower quotes, less fill volume, fewer fees. Precisely the opposite of what they asked for.
It cannot breach the budget or any validator invariant, and the user still reviews before signing, so this is a quality bug, not a safety one. On the run that surfaced it, GLM shipped all three tiers anyway; the numbers were simply the wrong set.
Suggested approach
Extend the lexicon with acceptance phrases (
dont mind the risk,don't mind the risk,fine with risk,ok with risk,okay with risk,comfortable with risk,happy to take the risk,accept the risk,risk is fine,no problem with risk) and superlative-yield phrases (most fees,as much yield as possible,highest return,highest returns,best return,best returns).Keep the blunt count rule and the one-sentence explanation — the file's own argument for staying debuggable on stage is right. Handling negation properly (which would also fix
not too riskyandI do not want any risk) is a bigger change to the rule, not the lexicon; worth deciding whether it belongs here or is deliberately left alone.Classifying in a second model call is the obvious alternative and is rejected for the reason already written at the top of
appetite.ts: it is a classification task deliberately kept out of the JSON-emission call, and a separate round trip costs latency and 0G spend.Acceptance criteria
I want to earn the most fees I can with this. I dont mind the riskclassifies asaggressive.low risk,minimal risk,keep it safe,max yield, I can stomach a drawdownkeep their current answers. Unit tests cover the bare-noun collision directly.Context: F2 — Private Recommendations, prompt Tier 0 (#24). Surfaced while testing 0G mainnet with
glm-5.2(provider0x7DCFe6AEa70350C2090041524c9B4A9262DCe87D); the recommendation itself was valid and passed the I1–I12 validator on the first attempt.