# HSI Reclaim Debit — LEAN stack

Live on https://playbook.db3hk.com/ (playbook **v1.8.11**, ticket **#802**). Schema **1.8**. TradeScope stays eyes only — no ledger bridge, no IB bridge, no `job` field. Parents: #801 (fields), #797 (timing), #795.

> **ROOT operating system**
> Small debit → room to wait → short = named → bounded exit.
> Destination + rough timing → one wait ticket. No clock prophecy.
> Story date = `horizon_deadline` (−35% and the 2-session time stop still flatten).
> **ALWAYS (wait): expiry > horizon_deadline.**
> **NEVER (wait): expiry = story date.** Rebuild that ticket.
> Scalp (today / flat 16:00) does not use the expiry>story-date rule.
> Change the story → flatten first.
> Persona: 平價 · 等得到 · 岩方向 · 有牆.
> 照開倉條款做；要改故事，先平倉.

```
ROOT (destination → wait debit → bounded exit)
 └─ case_type: wait (default) | scalp (exception: today 16:00)
 └─ packaging (optional label on wait): reclaim | crash_tail
 └─ ops: 1-lot · keep|flatten · VPS SoT · LEAN
```

## ROOT (locked — tickets #797 + #801)

You give a **destination** (named level + rough timing). The assistant **proposes one** defined-risk debit first: small/fair debit, short = that named level, room to wait, wall = the debit. Then it labels packaging. Classification must not block the proposal.

**Bounded wait:** `horizon_deadline` + **−35%** on the natural path + bounce **keep|flatten**. No clock prophecy. **Within expiry is mandatory** (European: a mid-path touch is an **exit decision**). The story clock is `horizon_deadline`. The contract expiry is a later calendar date. Early arrival = the tag before the story date. Late arrival = the tag after the story date and before expiry.

**Pre-budgeted small debit** for a bounded chance to monetize a **named level** before a **fixed deadline** — without predicting the exact **arrival time**, with economics tested for early and late arrival. Short = **expiry payoff-cap boundary**. P&L = executable credit after costs. **Small debit ≠ small account risk.**

Persona: **平價** · **等得到** · **岩方向** · **有牆**.

口號：照開倉條款做；要改故事，先平倉.

**Hierarchy:** ROOT → case → packaging → ops. Scalp is the exception — declare it separately. It is not CORE.

### Timing (locked — #797)

**ALWAYS (wait)**

- User story date / “by ~DATE” binds **`horizon_deadline`** (with −35% and the 2-session time stop).
- **ALWAYS (wait): expiry > horizon_deadline** — path and late-arrival buffer (等得到).
- Economics tested for **early and late** arrival inside that expiry.
- Propose the ticket fields **before** the packaging label.

**NEVER (wait)**

- **NEVER (wait): expiry = story date** (timestamp prophecy). An expiry calendar date on or before `horizon_deadline` is an invalid wait card — rebuild.
- Packaging or a crash label blocking the destination proposal.
- Two stations on one trendline at once (one named, the near station; flat before the far one).
- Mid-hold story change, short change, roll, add-debit, or partial reduce — flatten first, then a new ticket.

**Scalp exception:** today / flat 16:00 — does not use the expiry>story-date wait rule.

### Propose first

Given a named destination + rough timing, output **in this order:**

named → horizon_deadline (story) → expiry (> deadline) → strikes / debit / −35% / 1-lot → packaging reclaim|crash_tail

1. `named_level` (short = named)
2. `horizon_deadline` (story timing; not the option expiry)
3. `expiry` (**must be later than** `horizon_deadline` for wait)
4. strikes / debit / −35% stop / debit cap / 1 lot
5. then the packaging label (`reclaim` | `crash_tail`)

GO or pass on economics. Never pass only because the label is crash. Any wait card with `expiry` ≤ story date / `horizon_deadline` is **invalid** and must be rebuilt.

Same trendline, two stations = **one story, one named** (the near station). Flat before a far station.

### Packaging (label, not a second engine)

| Label | Meaning |
|---|---|
| `reclaim` (default) | Near journey, about **100–150** pts, width ~100. Structure owes a tag. `wait_reason=reclaim_tag`. |
| `crash_tail` | Optional far wing. Micro debit cap **HK$800**. Not the default. Not a profit engine. A missing or oversized debit is a warning, not a silent NO-GO. |

### EXIT PRECEDENCE

1. Invalidation or deadline → flatten
2. Else frozen case TP (Wait: named first, take more +30–60% on the tag; Scalp: % or intraday, flat 16:00)
3. Else keep

**+20% is a notify, not a must-exit** (+20% cannot clear ~HK$500 net). Stop **−35%** on the natural path. TWS is the primary stop; watchdog is the second layer. Time stop: **2 day sessions** with no progress → flatten.

### Risk

Max **1 open** — 2-slot **not allowed**. No roll, no switch, no partial reduce, no Banker / Runner / scale_mode. Bounce → **keep** or **flatten**. Debit ≤ HK$2,500 and ≤ 25% NAV at the limit. After a TP, state a **giveback** budget (realised − new debit − ~HK$120). Default limit is mid or mid−1. Hard max stays mid+1 unless the user allows chase.

## Agent playbook-check response (#801 fields, #802 render)

When the user asks to check vs playbook / 對 playbook, classify the **ask type** first: `new ticket` | `open manage` | `idea review`.

### A) New ticket — Table 1 STANDARD DECISION + Table 2 scenario marks

Build the ticket in the propose order above. Print **Table 1** as Field | Value, one row per field, in this order. Do not print a single wrapping pipe header and value line.

| Field | Value |
| --- | --- |
| 日期 | HKT date of the check |
| 結構 | debit structure and strikes (short = named) |
| 到期 | contract expiry (wait: a later calendar date than the story deadline) |
| 剩餘日 | DTE |
| 現貨 | spot |
| named_level | destination |
| horizon_deadline | story clock |
| bid/ask/mid | combo quote |
| natural | entry natural |
| 建議限價 | combo limit in index points; default mid or mid−1; hard max mid+1 |
| 限價Debit | that limit in HKD (points × HK$50) |
| Max虧 | full debit at that limit + ~HK$120 |
| 本金 | account HKD |
| NAV% | limit debit / account |
| 闊度 | width |
| −35% stop | stop debit on the natural path |
| GO/NO-GO | `GO`, `NO-GO`, or `pass` |

Packaging is a **one-line footnote after Table 1**, never a row that gates the destination: `packaging: reclaim` or `packaging: crash_tail` (micro cap HK$800 is a warning, not a silent NO-GO). One short reason on the next line when the verdict is not GO.

**Table 2** is required on a new ticket, after that footnote. Spot is `named_level` on wait. On scalp, use the declared target and say so. If neither exists, the mark cells are `N/A`.

| Scenario | Spot | Time left | Est. mark (pts) | ≈ HKD | vs entry |
| --- | --- | --- | --- | --- | --- |
| **50% DTE at named** | named_level | ~½ of 剩餘日 | estimate | pts × 50 | % and pts vs 限價Debit |
| **Expiry at named** | named_level | 0 (settle) | intrinsic | pts × 50 | % and pts vs 限價Debit |

Expiry at named is hard intrinsic of the debit vertical, clamped to `0 … width`. Bear put (long strike above short): `clamp(long_strike − spot, 0, width)`. Bull call (long strike below short): `clamp(spot − long_strike, 0, width)`. When short = named and spot = named, that clamp is the width. HKD = pts × 50. vs entry uses 限價Debit. Max利 is read from this expiry row. It is not a Table 1 row.

50% DTE at named is an estimate only. Name the path or model in one line under the table. It is not a fill guarantee. If no assumption is available, write `estimate — state assumption` instead of a silent number. The service does not price this row.

Disclaimer under Table 2: the 50% row is a model/path estimate, not a fill; the expiry row is intrinsic only. Extra scenario rows only when the user asks.

Do not revive these as Table 1 rows: Book (T/P), case_type, wait_reason, 合約ID/乘數/結算已核實 (ops stay off-row, in the contract gate), Target Mark, 毛利點, 回報%, 打和, a separate 扣佣 column (fold into Max虧), thin-meat? (say it in the reason if it bites), A/B score, VHSI (still a fail-closed gate, not a column), frozen lower TP % as a primary row (optional second footnote only; −35% is the hard wall), source notes, Max利.

### B) Open manage — short row only

```
keep|flatten | NATURAL% | vs named | vs stop | vs deadline | milestone
```

Mid-hold is **keep | flatten** only. 照開倉條款做；要改故事，先平倉. No 1-lot split / scale-out / Banker–Runner. NATURAL% uses exit natural, not mid. Watchdog **CONSIDER_EXIT** and +20% are notify only — not must-exit, and not an auto SELL instruction. Milestone is one note: tag, stop proximity, deadline, +20% notify, CONSIDER_EXIT notify, or none.

### C) Idea review (no ticket yet)

Do not call `POST /check` for a review with no ticket.

```
Ask: idea review
平價 ✓/✗ · 等得到 ✓/✗ · 岩方向 ✓/✗ · 有牆 ✓/✗
Result: PASS | FAIL | N/A
Decision: do not open | rebuild card | open with row A
```

`N/A` when the idea is not a debit-spread ticket. `open with Table 1 and Table 2` is the only decision that continues into the entry tables. Manage and idea review do not print Table 2.

## One line

TradeScope = eyes · VPS = rules+memory · IB = hands — **no eyes↔memory bridge, no eyes↔hands bridge.**

## Triggers (copy into TradeScope LEAN — no job)

- `check now` — destination + `case_type` wait|scalp. Wait needs `named_level` + `wait_reason=reclaim_tag`. Optional `packaging` `reclaim|crash_tail` after the proposal. Do not send `job`. The assistant’s answer shape is the playbook-check section above.
- `manage` → **keep** or **flatten** only, on the VPS. TradeScope does not manage the position.

## Ownership

| Piece | Owns | Must not |
|---|---|---|
| TradeScope | Panes, RSI, screenshots, named levels | cool-off, one-open, ledger, orders |
| VPS | Playbook version, ledger, journal, gates | TV CDP, IB orders |
| IB (human) | Fills, live combo bid/ask | Auto from TradeScope |
| Grok Bot | Playbook text, tickets, post-mortems | Mandatory live path |
| VPS holding marks | Review series and chart; baseline on open; final on close; samples from Bot POST | IB quote cron, live alerts, keep or flatten changes |

Holding marks = review store on VPS (API+UI); samples POSTed by Bot watchdog; Notion SNAP remains daily archive only. No IB cron on the VPS.

## Parked

- **Patient** — `book=Patient` → `NO-GO book_parked`.
- **`balance_wait200`** — dead. 200 = **underlying** points. Long **400–800** OTM + width **~400** / 400-wide puts the short **800–1,200** from spot, not a 150–250 journey. `/check` → `NO-GO reason=job_parked`.
- **`scalp_flush`** — use `case_type=scalp`, or `422` `use case_type=scalp`.
- **`job`**, upper TP band, Banker / Runner, 2-slot / partial / roll. A crash map is a **compass** (directional **bias**) only when you did not propose a micro `crash_tail` ticket.
