# Portal Pro — feature backlog

Ideas discussed but not built. Each notes what it would lean on in the existing codebase and
where the Classic Era API constrains it, so none of that has to be re-derived later.

Ordered roughly by value-for-effort, not priority.

---

## 1. Guild mage coordination

Broadcast a lightweight **claim** when you answer a lead (`CLAIM:<name>`), so a guildmate
running Portal Pro sees "Riverfrost is handling this" and their card greys out instead of
both of you whispering the same customer seconds apart.

Same channel could **pool market observations** — three mages in different cities produce a
far better median than one. Observations already carry name + timestamp, so dedup-on-merge
is trivial.

**Leans on:** `Modules/Comms.lua` (the prefix, registration and throttling already exist).
**Constraint:** Classic addon messages can't reach Trade. Guild/group/say only — it
coordinates your guild, not the server.

---

## 2. Customer queue with position whispers

When four people want ports at once they have no idea you've seen them, so they wander off.
Give each lead a ticket number and auto-whisper *"you're #3, about two minutes"*, updating as
the queue drains.

**Leans on:** the lead queue and whisper templates. Nearly free.

---

## 3. Price experiments

We know what competitors charge. We don't know **what converts for us**. Record the price in
effect when each lead arrives, then report conversion by price point:

> at 10g: 34 leads → 6 paid (18%) · at 8g: 29 leads → 9 paid (31%)

**Leans on:** leads, ledger, timestamps — all already captured.
**Needs:** one new field, the price in effect at lead-creation time.

---

## 4. Rune economics

Two halves:

- **Measured cost** — hook merchant purchases and use the `MoneyWatch` delta to learn what
  you actually paid per rune, replacing the configured guess that currently drives the whole
  cost basis. Makes Net measured rather than partly assumed.
- **Burn rate** — "~40 minutes of stock at tonight's pace", plus a pre-session shopping list.

**Leans on:** `Reagents`, `MoneyWatch`, `Stats`.

---

## 5. Cast guard

A pre-flight line before you open a portal: **this group member hasn't paid** · **they asked
for UC, you're casting SW** · **no rune for this**.

The two expensive mistakes are free portals and wrong cities. Every input is already tracked.

**Constraint:** it can only warn, not block — intercepting a cast needs secure code that
can't be rewritten in combat.

---

## 6. Customer profiles

Extend the ledger's customer index into something the lead card shows: usual destination,
average tip, ports bought, last seen, private notes. Preselect their usual city.

Folds in **deadbeat tracking** — joined the group, took the portal, never traded — as a
reliability score, so `4 ports · 1 unpaid` appears *before* you invite.

---

## 7. Whisper threads

Two panes in the Leads tab: queue left, conversation right. Transcript opens with their
original Trade message, then all whispers both ways. Template strip plus a free-text
composer, because half of every exchange is "which bank?".

**Design decisions already settled:**
- Observes, never intercepts — must not fight WIM. No chat-frame filtering.
- `CHAT_MSG_WHISPER_INFORM` captures replies you type manually, so the thread stays complete.
- Threads outlive their leads: paid leads leave the queue, and the thread must not vanish
  mid-conversation.
- Session-only by default. Persisting other players' private messages to disk should be
  opt-in.
- Unread pips on the queue card.

**Constraints:** no backfill (only whispers received while loaded). At a 720px window a
300px thread pane needs a compact lead-card variant.

---

## Earlier ideas, still open

- **Batch fulfilment** — group leads by destination so one rune serves several customers
  heading to the same city. Three 10g sales for one 20s rune instead of three.
- **Earning heatmap** — when and where to sit. Needs the zone recorded at lead time.
- **One-click "serve next"** — cast the right portal for the front customer, announce, arm
  cleanup. Needs a `SecureActionButtonTemplate`; macro text can only be rewritten out of
  combat, so it's reliable while parked at a bank but can't retarget mid-fight.
