Here is the review of the Cattle frontend wording and mechanics, based strictly on the provided source files and product facts. ### 1. Most Consequential Misunderstandings **A. Short Strategy Intent is Framed Directionally** * **Source File/Phrase:** `model.js` (`STRATEGIES.short.title: 'Trade the other side.'`) and `app.html` (`Sells into strength.
Buys as price falls.
`). * **Wrong Inference:** A reader may infer the covered short is a bearish directional bet (the "other side" of a bullish long), which directly contradicts the product facts and FAQ. * **Exact Replacement Wording:** * In `model.js`: Change `title: 'Trade the other side.'` to `title: 'Target a range.'` * In `app.html`: Change the short radio button text to `Targets range-bound yield.
Sells into strength.
` * **Factual Rationale:** The product facts dictate that a short expresses a range-bound/yield intent intended to cover option premium via the delta-hedging spread. It is not a directional bet on a price fall. **B. Live Balances Labeled as "Supplied"** * **Source File/Phrase:** `portfolio.js` (`node('span', 'small muted', 'Supplied collateral')`). * **Wrong Inference:** A reader viewing a live position card may assume these numbers represent their *initial historical deposit*, hiding the reality that the strategy has actively traded and altered the asset mix (impermanent loss). Alternatively, they might think their collateral hasn't been traded at all. * **Exact Replacement Wording:** `node('span', 'small muted', 'Current strategy holdings')`. * **Factual Rationale:** The lens reads *current* Aave account values at a specific block, not a static record of what was originally supplied. **C. Omission of Infrastructure Pauses in Order Previews** * **Source File/Phrase:** `portfolio.js` (`'No tradeable order in this snapshot. The position may be near its target, below the order floor, or outside its trading window.'`). * **Wrong Inference:** If the Aave oracle is down or the sequencer is in grace, the user will assume the strategy is merely resting near its target or below the floor, masking a critical chain/infrastructure pause. * **Exact Replacement Wording:** `'No tradeable order in this snapshot. The position may be near its target, below the order floor, outside its trading window, or paused by oracle downtime.'` * **Factual Rationale:** The backend notes explicitly list oracle unavailability and sequencer grace periods as reasons for a leg being absent. Hiding this makes the contract look inexplicably stalled rather than safely paused. **D. Incomplete Short Explanation on Landing Page** * **Source File/Phrase:** `landing.js` (`text: 'The covered-short side sells into strength and buys into weakness. It is a short-option strategy, not a bearish leveraged short.'`). * **Wrong Inference:** Mechanically true, but omits *why* a user would want this. A user is left wondering what the goal is if it isn't bearish. * **Exact Replacement Wording:** `'The covered-short side aims for yield in range-bound markets by earning the trading spread. It sells into strength and buys into weakness. It is a short-option strategy, not a bearish leveraged short.'` * **Factual Rationale:** The instructions require explaining intent before trading mechanics where useful. ### 2. Consistent Naming & Explanation Proposal To ensure the UI clearly separates intent from mechanics across the landing page, builder, and live cards, use the following framework: **Long Strategy:** * **Name:** "Long call" * **Intent/Headline:** "Follow the upside." * **Mechanics:** "Buys WETH as price rises and sells it as price falls." * **Optional Detail (FAQs/Tooltips):** "Replicates a long call using collateral to adjust holdings. This is not a premium-only call purchase." **Short Strategy:** * **Name:** "Covered short" * **Intent/Headline:** "Target a range." *(Replaces "Trade the other side.")* * **Mechanics:** "Sells WETH as price rises and buys it as price falls." * **Optional Detail (FAQs/Tooltips):** "Aims for yield in range-bound markets by earning the trading spread. It is a short-option strategy, not a bearish leveraged short." ### 3. Disagreements & Uncertainties for the Implementing Agent The following items represent structural or data-mapping uncertainties that the implementing agent must adjudicate: 1. **"Collateral − debt" Presentation:** `portfolio.js` calculates and displays `Collateral − debt` as a raw monetary line item in the live account grid. While mathematically true and disclaimed inside a `
` block, standard DeFi users often reflexively read this exact subtraction as "Net Equity" or "Lifetime Profit/Loss." Because the product facts explicitly state this is *not* lifetime P&L (as it ignores execution costs, spreads, and entry basis), the agent must adjudicate if a safer, more precise label (e.g., `Net Aave balance`) should be used to prevent silent misinterpretation. 2. **Missing Order Floor (`minNotionalQuote`):** The backend notes heavily emphasize calculating the order floor based on mainnet gas (asserting that a hardcoded Base config is "wrong on mainnet by two orders of magnitude"). However, the builder form (`app.html` / `model.js`) currently lacks any input, display, or projection for this order floor tolerance. The agent must decide whether to expose this setting/warning in the preview builder or formally document that it is a factory-level default deliberately omitted from this UI scope. 3. **Lens Data Mapping Mismatch:** The backend notes state the lens returns `hfAfterAsk` and `hfAfterBid`. However, the frontend (`portfolio.js`) expects a unified `order.healthAfter` property. The agent will need to adjudicate the intermediary data mapping layer (which bridges the RPC to the frontend) to ensure the correct directional health factor is assigned based on the order's `direction`.