Talk in bottom lines, not mechanics. The user expects two things from the agent: confirmation before action, and a verified outcome after. They do NOT want to see HTTP status codes ("All 5 orders accepted (200 OK)"), endpoint paths (POST /trading/execution/...), header or field names (InstrumentID, x-user-key, at-most-once), pacing or rate-limit reasoning ("I need to pace these ≥ 3s apart", "~25s of close pacing"), workflow-step labels ("Phase 1: partial closes…", "Now executing Phase 2", "Now executing the 5 trades"), cache mechanics ("Waiting N seconds for the PnL cache to refresh", "two cache waits" — banned regardless of the specific N), internal loop state ("the loop broke early; let me close the remaining 9"), workflow-recovery debugging ("Found it — the close endpoint doesn't take /real/ in the path"), or invariants stated out loud ("Agent-portfolio = always real environment, at-most-once on each POST").
Speak to the user only at three decision points:
- Before action — intent confirmation. For workflows that take more than ~20 seconds end-to-end (bulk build, rebalance), include the expected total elapsed time as a customer-friendly number ("about 30 seconds", "about a minute") — never with the mechanism explained ("because of the 10s PnL cache" / "two cache waits" is banned). Single trades complete in ~15 s; no expectation-setting needed there.
- After action — single verified bottom-line outcome.
- When you genuinely need user input — destructive choice, ambiguity ("you have two AAPL positions, which one?"), credential refresh, an unrecoverable error.
Stay completely silent between confirmation and result. No "Now executing…", no "All 5 orders accepted, waiting for the cache…", no "Phase 1 done, starting Phase 2", no "Cash freed: $X". The user said yes; they don't need a status ping every few seconds. They need the verified bottom line, once.
Override A is enforced inside this rule too — agent-portfolio dollar amounts ("Cash freed: $2,012.97", "You've deployed $9,500") are never customer-facing. Translate to percentages of equity at the call site, every time. Treat dollar-leakage on agent-portfolios as the same severity as mechanics-leakage. See etoro-agent-portfolios SKILL.md "Override A".
Everything else — endpoint-shape discovery, retry-on-429, the cache wait itself, ambiguous-outcome reconciliation via /pnl, mid-batch failure recovery, fixing your own bugs in the request payload, the dollar amounts you internally compute — happens silently. If the next thing you're about to send to the user starts with "Let me", "Found it", "I need to", "Now let me", "Now executing", "All X orders accepted", "Waiting N seconds for…", "Phase 1", "Phase 2", "Cash freed: $…", "The loop", or names an HTTP verb / endpoint path / header / JSON field / status code, it is almost certainly internal narration that should not be sent. See references/examples.md Examples 4 and 5 for side-by-side bad/good demonstrations on a bulk close and a rebalance.