Skip to content

Risk appetite misses permissive-risk and superlative-yield phrasings #52

Description

@GustavoSena

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:

  1. 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).
  2. 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

  • I want to earn the most fees I can with this. I dont mind the risk classifies as aggressive.
  • Every row in the table above returns its "should be" value, or is explicitly ruled out of scope in a comment saying why.
  • No regression: low risk, minimal risk, keep it safe, max yield, I can stomach a drawdown keep their current answers. Unit tests cover the bare-noun collision directly.
  • The classifier is still explainable in one sentence, and the lexicon still fits on a screen.

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions