Instruction¶
Owner instruction (human:yasu, 2026-09-29): hermes corrects the ledger.
The two live-fill records backfilled on 2026-09-29 read the confirmation's QTY and
PRICE columns the wrong way round. Verified against the source PDFs — see
2026-09-29:order-history-backfill-verification for the extracted text and method.
Append correct records. Do not edit the existing lines. The ledger is append-only;
the existing records stay as the original observation, and the corrections supersede them.
Correction key format, as used by 2026-09-24 on the NVDA straddle:
<position_id>:<record_type>:<event_date>.
What the PDF says¶
AcctType|B/S|TradeDate|SettleDate|QTY|SYM|PRICE|Principal|COMM|TranFee|Add'lFees|Tag|NetAmount
08/25/26 B QTY=1 PRICE=0.9600000 Principal=96.00 COMM=1.00 0.02 0.10 Net= -97.12 SPY 09/25/26 675 PUT
08/25/26 S QTY=1 PRICE=1.1400000 Principal=114.00 COMM=1.00 0.04 0.10 Net=+112.86 SPY 09/25/26 685 PUT
SUMMARY: SHARES BOUGHT 1.00 | DOLLARS BOUGHT -97.12 | SHARES SOLD -1.00 | DOLLARS SOLD 112.86
09/02/26 S QTY=1 PRICE=0.5000000 Principal=50.00 COMM=0.00 0.04 0.10 Net= +49.86 SPY 09/25/26 675 PUT
09/02/26 B QTY=1 PRICE=0.6100000 Principal=61.00 COMM=0.00 0.02 0.10 Net= -61.12 SPY 09/25/26 685 PUT
both legs: UNSOLICITED CLOSING CONTRACT
QTY is 1 contract on every leg. 0.96 / 1.14 / 0.50 / 0.61 are prices per share.
The 100× correspondence between each decimal and its dollar figure is the contract
multiplier — it is not "Apex share-multiple reporting", and SHARES BOUGHT: 1.00 settles it.
Correction 1 — spy-675-685p-debit-260925:open:2026-08-25¶
| field | recorded | correct |
|---|---|---|
leg 675P ref_price |
96.0 |
0.96 |
leg 685P ref_price |
114.0 |
1.14 |
record ref_price |
-16.0 |
0.18 (net credit per share, 1.14 − 0.96) |
| structure | implied debit | put CREDIT spread (bull put): long 675P, short 685P |
Leg qty (+1 / -1), symbols, strikes, expiry, price_kind: live-fill and the
owner-provided-confirmation / real-money-account-… / pre-pilot flags were all correct
— keep them.
ref_price is the net per-share spread price, matching the convention the paper records
already use (e.g. the SPY 740/765P exit stored 3.495 from legs 5.29 / 1.795). Put the
dollar figures in the note, not in ref_price.
Note should record: principal 96.00 paid / 114.00 received; commissions 1.00 + 1.00;
fees 0.02 + 0.10 + 0.04 + 0.10 = 0.26; net cash in +15.74 (112.86 − 97.12).
Correction 2 — spy-675-685p-debit-260925:exit:2026-09-02¶
| field | recorded | correct |
|---|---|---|
leg 675P ref_price |
50.0 |
0.50 |
leg 685P ref_price |
61.0 |
0.61 |
record ref_price |
10.64 |
0.11 (net debit per share, 0.61 − 0.50) |
| exit fees in note | 0.36 |
0.26, and they increase the closing cost |
COMM is 0.00 on both closing legs — the note double-counted a 0.10 and applied the
fees in the wrong direction. Net cash out −11.26 (61.12 − 49.86).
Realised result to record¶
Entry +15.74 net credit, exit −11.26 net debit, realised +4.48 on one contract, closed 8 days before the 09/25 expiry.
Worth stating in the note, since it characterises the position honestly: a bull put spread 10 wide taking 0.18 credit carries roughly 9.82/share ≈ $982 max risk for that credit. That is a fact about the owner's own pre-pilot trade, not a pilot decision, and no pilot rule is implicated — but a ledger that records the credit without the width invites the wrong read later.
The position_id keeps its misleading name¶
spy-675-685p-debit-260925 says debit; the structure is a credit spread. Do not rename
it — it is the join key for records already written, and renaming would orphan them. The
correction records should state the misnomer explicitly so a later reader is not misled by
the id alone.
Why this happened, and the fix that matters more than these two records¶
hermes had no PDF text extractor — no pdftotext, no pypdf — so the confirmations
were hand-transcribed from a rendering, which is exactly how two adjacent columns get
swapped. ops/tools/pdftext.py (stdlib only, 8 tests) is now in the repo and deployed;
use it rather than transcribing. It was written instead of installing poppler or pypdf
because the host is the production trading box.
This is the third time a fractional contract quantity has appeared and been rationalised instead of treated as a stop condition:
- 2026-09-22 — a "0.5 lot" P-collapse half-off on a 1-lot NVDA straddle, which could not
execute. Voided by
2026-09-24:nvda-220-half-off-void; prompt v2.10 added the whole-contract rule. - The "0.5-lot residue" carried in three subsequent rounds' prose.
- Here —
0.96and0.5read as quantities and explained away as vendor presentation.
A fractional option quantity is never real. Treat one as a signal that a column has been misread, and stop.