Imported from PatrickSUDO/fadacai-portfolio (
AGENTS.md). Install upstream withnpx skills add PatrickSUDO/fadacai-portfolio. Copyright stays with the author.
Fundamental Allocation Study - Project Instructions
Project Overview
This is an investment research and portfolio management workspace. The user actively trades US stocks and options on a Level 2 options margin brokerage account (connected via the firstrade-server MCP as the reference broker integration).
Language & Format
- All output in Traditional Chinese (繁體中文)
- Thread/social media posts: plain text only, NO markdown, NO tables
- Reports and analysis: markdown tables are fine
Workflow
/briefing— quick daily check (~1 min);/briefing full(~3 min);/briefing deep(~5 min)/briefing telegram— Telegram push tier (~2-3 min):盤中推送專用,產出 briefing-out/ 兩個檔案--send旗標(任何 tier 可加):執行完後推送 Telegram + email 副本- 例:
/briefing telegram --send、/briefing full --send - launchd 每個交易日美東 11:00(盤中,開盤 90 分鐘後;A 窗失敗 → 美東 15:00 B 窗備援)自動執行
/briefing telegram --send(週五加--codex)。一律以美國時間為準(2026-09-30 用戶):launchd 每 5 分鐘叫一次、runnerexport TZ=America/New_York自判時窗,Mac 在哪個時區都一樣;盤前 10:30 ET 前手動送的那份不擋 11:00 盤中窗;手動補發BRIEFING_FORCE=1 bash tools/briefing_runner.sh。機械 pass(15:40–15:58 / 16:15–19:00 ET)、盤中防睡keep_awake_us.sh同理;runner 固定--model sonnet(BRIEFING_MODEL覆寫)、重試 5 次(2026-08-05 五修:API mid-stream 斷流連殺對策)。三次以上全滅 → 互動 session 手動/briefing telegram --send補發(dedup 防重複) - Setup 文件:
docs/briefing-auto-send.md - 今日待辦自動執行(T6.5,2026-09-08 用戶指定):
/briefing telegram產出的「今日待辦」中,屬於機械式清理/停損、SGOV 現金停泊、或 thesis 已確認的新倉/加碼,且觸發條件量化已達成、未被任何硬線(>10%集中/財報窗/R14鎖/檔數上限/position_guard缺口)擋下、且無 T5.5 跨日反轉旗標者,直接下單,不再等用戶確認——因為用戶可能不在電腦前。金額上限 $3,000 只管新增曝險(新倉/加碼);機械減碼/停損/平倉與 SGOV 停泊不設上限(2026-09-14)。選擇權平倉(觸及開倉時寫死的管理線)可自動;開倉不自動。Telegram 訊息內以✅ 已自動執行標註(含單號),不符合條件的仍列🎯待辦。細則見.claude/skills/briefing/SKILL.mdTelegram Tier § T6.5;延伸自既有互動場景「警報先做再報」規則到無人值守場景 - 防自圓其說雙保險(2026-09-08,同上用戶指定,不用 Codex 版):① T5.5 跨日一致性檢查——每日先讀前一交易日 telegram.txt,同一 ticker 的方向性判斷若無新數據支持卻反轉/升降級,標旗且對 T6.5 自動下單構成硬性攔阻;② T6.5 執行後強制留痕——每筆自動下單同時登錄一筆到期會被機械驗收的
thesis_ledger條目(含具體證偽點),到期由既有 Step 0.7due機制自動驗收,不靠事後記憶
/portfolio-review— full deep report with live data via MCP/stock-analysis TICKER— individual stock deep dive/options-strategy TICKER STRATEGY— options calculation (supports multi-ticker comparison)/trade-journal log|review|summary|auto— trade records/mcp-health— test all MCP server connections/event-vol-scan [days] [TICKER ...]— 財報/CPI/FOMC 前末日 buy call / 雙買 straddle 機會掃描(引擎tools/event_vol_scan.py;賣方策略不適用、仍守財報 ±48h 禁令)/trade-review [2w|4w|since YYYY-MM-DD]— 每兩週交易檢討(自我進化引擎):歸因每筆成交是「系統決策」還是「脫離 plan 的自主決策」,算三個並列指標、驗影子訊號、更新feedback/RULES-LEDGER.md規則命中率,輸出「本期該改哪一條規則」。引擎tools/trade_ledger.py;briefing 距上次 >14 天會提醒。每期加跑帳戶級四指標(期間報酬/CAGR/MDD/Sharpe + profit factor):tools/account_metrics.py scan && report --live <即時總值>(淨值標記刮自 journal/briefing 快照,2026-06-01 起;FIFO 已實現含選擇權)- 無人值守(2026-09-29 用戶指定):launchd
com.fadacai.trade-review每日 09:30 本地跑tools/trade_review_runner.sh——review_due.py判 trade-review 到期(>14 天)才執行claude -p "/trade-review" --model fable,產出 →generate_html trade-review推報告站 → Telegram 一則(§6 本期結論 + 網頁連結);登入失效/逾時/無產出也推 Telegram(兩週一次的工作不准靜默失敗)。手動:--force忽略到期、--notify-only <md>只做 HTML + 推送。logbriefing-out/trade-review-runner.log - 交易 α(
score):進出對不對。β 對實際使用的基準回歸算(半導體對 SMH、其餘對 SPY)——用券商 β(對大盤測)套 SMH 會嚴重過度調整,結論會反過來 - 持有 α(
holding-alpha):該不該繼續抱。滾動窗 + 建倉至今。沒有這項,純交易指標會獎勵頻繁進出、把「抱對」記為零貢獻;首測持有 α 量級大於交易 α - beta capture(
beta-capture):行情好的時候吃到沒有。拆基準上漲/下跌日各自回歸 β;up-β < down-β = 漲不上跌得凶。梯級停利 + 買梯會機械性壓低 up-capture,這是純 α 看不見的成本
- 無人值守(2026-09-29 用戶指定):launchd
- PMCC 收租候選掃描 —
python3 tools/pmcc_scan.py(5 因子計分卡機械化,規則feedback/pmcc-candidate-discipline.md;每次/portfolio-reviewSection I.6 自動跑,找「想留但不看好大漲」的名字轉 poor man's covered call;判斷層留給/options-strategy)
Codex 第二意見(opt-in --codex / --2nd)
Add --codex to any of the above (except /mcp-health, /trade-journal) to append a Codex second-opinion section:
- B1. 獨立第一性分析(預設) — Codex 在不知道 Claude 結論的情況下,獨立執行 Step 0e(thesis / 證偽條件 / 機率分布 / EV / Verdict),只給它 raw data。然後 Claude 與 Codex 兩個獨立輸出並排比較,找出真實共識 vs 真實分歧。所有 5 個 skill 適用。
- B2. 機會掃描 (
/codex:rescue) — surface hot themes/tickers not in current portfolio./briefing full/deep,/portfolio-review,/todoonly. - B3. 輪動分析 (
/codex:rescue) — sector + stock rotation (leading/lagging vs SPY, money flow, 3 actionable rotation moves). Same 3 skills.
獨立第一性(而非對立面審查)是預設,因為 attacker mode 是 confirmation bias by design——要它找 bug 它一定找出 bug,分歧多半是 framing 製造的。兩邊盲跑同樣 raw data:真實共識 = 高信心,真實分歧 = 學習點。
進階:--codex-adversarial(opt-in 壓力測試)
若需要對「兩邊已對齊的結論」做進一步壓力測試(例如重大資金決策前),可改用 --codex-adversarial(或 --codex-adv)觸發舊版對立面審查。僅在有意識需要 attacker mode 時使用,預設 --codex 不跑 adversarial。
Codex 呼叫方式(CLI,所有 skill 共用 — 取代舊 plugin 路徑)
⚠️ 不要用 subagent_type: "codex:codex-rescue" 或 /codex:rescue。實測(2026-06-07)那條路徑會載入 ~/.codex/config.toml 的 superpowers@openai-curated plugin,強制「回應前必須 invoke skill」+ 全域 model_reasoning_effort = "xhigh",把整個 turn 燒在讀檔 preamble,不產出分析。
改用 codex exec CLI,強制關掉 superpowers + 顯式指定 effort:
codex exec --color never --skip-git-repo-check --sandbox read-only \
-c 'plugins."superpowers@openai-curated".enabled=false' \
-c model_reasoning_effort=xhigh \
"$(cat <PROMPT_FILE>)" > <OUT_FILE> 2>&1
(2026-07-30 用戶指定升 xhigh:當初鎖 medium 是防「superpowers 未關 + xhigh」把 turn 燒在讀檔 preamble;模板已強制關 plugin,xhigh 安全,代價是 B1/B2/B3 執行時間拉長,背景並行跑不阻塞主分析)
規則:
- Prompt 第一行強制加:
ANSWER DIRECTLY FROM THE DATA BELOW. Do NOT read files, do NOT invoke skills, do NOT run shell commands, do NOT use any tools. Output the analysis immediately.(雙保險,即使 superpowers 漏關也不讀檔) - B1/B2/B3 並行:各寫一個 prompt 檔,用
run_in_background同時跑,輪詢grep -c "tokens used"判完成 - 抽取回覆:
awk '/^codex$/{f=1} f' <OUT_FILE> | sed '/tokens used/q'(去掉 echo 回來的 prompt + startup banner) - 中性化:B1 prompt 只給 raw 持倉 + fact 數據,不含 Claude 結論(per
feedback/codex-prompt-neutrality.md) - 失敗 → 跳過:輸出
⚠️ Codex 不可用:[error],跳過第二意見後照常輸出主分析 hook: SessionStart Failed是 peon-ping 音效 hook 在非互動下的無害噪音,忽略- B1 機率分布反偷懶(必嵌 prompt):Codex 走一次性 prompt 無我們的
probability-honesty-checkeragent,會落回 default mirror(25/50/25)。故 B1 prompt 的機率分布段必須內嵌 5 步強制流程 + 禁用 default mirror shape(見各 skill B1 模板的「嚴禁偷懶」段,源自feedback/probability-distribution-honesty.md)。比較 Claude vs Codex EV 前先確認 Codex 機率非 default,否則分歧是「Codex 偷懶」而非真實見解衝突。
Key Files
plan.md— 狀態版(2026-09-02 重建):三條硬線 + 持倉表生成區(tools/position_guard.py --render-plan自動寫入,禁手改)+ 唯一一張候補表 + R19 pair 追蹤。手改只限候補表與硬線,且只在用戶要求時。歷史決策全文research/plan-history.md(凍結)research/roster.json— 桶別唯一資料源(信念/認列/sleeve/樂透);每檔持倉必須登記,否則 guard 報缺口;改桶別改這裡不改散文tools/position_guard.py— 持倉守門(briefing Step 0.75 / trade-review 5.5 每次跑):Firstrade live 持倉 → R14 天數、R23 arm/線/警報自動掛撤、R8 GTC 缺口、>10% 硬線、檔數上限、財報窗、桶別缺口、旗標逾期、C2 R8+R23 合計 30% runner 保底、R16 樂透停損缺口、R24 閒置現金、R28(R23 觸線區/減碼後 30 天禁加碼buy_locked/減碼後跌破成本殘倉須旗標/單名累計虧損 ≥1.5% 帳戶 forced 旗標,2026-09-14 CRDO 案)、R29 認列桶機動性(殘倉 <1.5% 不配名額/gate ≤ min(財報,15 交易日)/weakest_two換手只換最弱兩檔/d) 節奏輪動:research/bench.json候補綜合分連 10 日勝最弱在倉 ≥15 分且距上次換手 ≥14 天 → 換一檔,兩週最多一檔,出場 60 天內門檻加倍,2026-09-17)、R30 買強add_candidates(未實現>0 + revision up>down + 價>SMA50 + 權重<6% → 回檔 SMA20 GTC ≤$3k)、R25 修訂 sleeve 帶 4–8% + 帳戶自 sleeve 建立後峰 −10% 賣半換子彈(feedback/harvest-bucket-mobility.md、hedge-sleeve.md§7) →research/position-state.json+ plan.md 標記區;exit 2 = 有缺口,逐條進 Key Alertsjournal/— 每日交易日誌(YYYY-MM-DD.md),含完整倉位快照feedback/— 交易風格偏好,所有 skills 每次必讀feedback/RULES-LEDGER.md— 規則自己的命中率帳本(失效 ≥2 次 → 強制覆審);由/trade-review每兩週更新;巧合欄與一致性檢查tools/rule_stats.py ledger-audit [--write|--check],產出檢查tools/review_lint.py,判準feedback/skill-vs-luck.md(R26 放棄條件 2028-09-06 裁決)research/— 投資論文與研究筆記research/trade-ledger.jsonl— 結構化成交帳(含origin誰決定 /exec_via怎麼下單);工具tools/trade_ledger.pyresearch/order-registry.json— 在掛單快照累積(券商只回在掛單,斷天補不回來 → briefing 每次snapshot-orders)research/shadow-signals.jsonl— 影子訊號旗標(記錄不阻擋);工具tools/shadow_signals.py。三類 signal:A4 高估旗標(flag自動掃)+ R18 財報窗被擋加碼(block ...)+ 通用影子帳record --kind cf-* --correct-if under|over(2026-09-14):凡「想做但沒做」的決定——比選落選(cf-bench-loser)、R1 判輪動不賣(cf-r1-hold)、R17 擋下的盤中衝動(cf-r17-blocked)、T6.5 超上限未下(cf-t65-capped)、R23 觸發未執行(cf-r23-skip)——同一次登錄,score30 天後機械計分餵回對應規則。沒做的決定是規則驗證的免費樣本,每期 /trade-review 4a-2 讀tools/trade_ledger.py register-order --id <單號> --rule <R…>— 規則單歸因登記(2026-09-14):guard/briefing/skill 掛的規則單不一定寫進 plan.md,不登記會被歸因鏈判成 user;凡下規則單同一次登記tools/auto_exec.py— T6.5 機械單執行器(v2 live,2026-09-15 用戶解鎖):以前一收盤判定 R23 線 / 用戶裁決收盤線 / 選擇權管理線 / R24 SGOV / R8 缺口 / R30 買強(回檔 SMA20 GTC 或走強分支)/ R25 sleeve 動作 / 陳舊自動賣單撤單,套 R14 鎖、財報窗、T5.5 反轉、R28a 買方鎖、C2 runner 保底、C6 現金閘、R30 14 日冷卻,同標的同向去重,寫briefing-out/cache/auto-exec-plan.json。執行在收盤後:tools/evening_pass.sh(launchdcom.fadacai.auto-exec-evening16:20 ET)跑 guard +auto_exec --execute(需AUTO_EXEC_LIVE=1),現股限價 gt90 直接掛、CANCEL 直撤,結果寫executed+research/auto-exec-log.jsonl,一則 Telegram;早上 briefing 只回報不重下(executed有 error 或 CLOSE_SPREAD 才補)。防守線警報一律close_confirmmode(盤中不發)——MYRG $274 線 8/27–9/15 每日盤中觸價一發、最後仍人工賣,是本設計的案例。runner 早上仍預跑 dry-run 供 briefing 讀;--audit每日對照tools/crossday_check.py— T5.5 跨日一致性(code 版):比對昨日/今日 telegram.txt 的 ticker×方向詞,反轉 exit 2;PostToolUse hook(寫 telegram.txt 時)+ runner 事後直推 Telegramtools/journal_stub.py— journal 缺檔機械補檔:runner 跑完若當日 journal 不存在,以 position-state + 當日成交生成骨架(標 ⚠️ 機械補檔);journal 是歸因與旗標稽核的資料層,不能斷天(9/14 案)research/ev-ledger.jsonl— EV 分布事前登錄帳(機率校準自驗);工具tools/ev_ledger.py add/resolve-due/stats。stock-analysis / ev-check 收尾add(機率+三情境公允價+EV 原樣入帳),briefing 到期resolve-due機械驗價(個股 yfinance / PORTFOLIO 對 equity-marks,零判斷),/trade-review 每期讀stats(EV 誤差 by horizon/model、Brier、校準表、priced_in_pct 三分位)。priced-in 標準化(2026-09-14):cacheself_valuation.priced_in_pct= 市場前瞻 PE ÷(目標 PEG × 共識 EPS 成長,截斷 5–60%)− 1(正 = 成長已 priced in;priced_in_note附算式);add --priced-in-pct原樣抄入;display-only 變數,驗到顯著才討論進形狀規則。盲點:週期頂峰 EPS → fwdPE 極低 → 深負 ≠ 便宜。修正只進 prompt/規則層(RULES-LEDGER 帶命中率),不建 ML 模型 — n>150 筆獨立已解決樣本前不重評(2026-08-03 設計裁決:小 n + 高相關標的 + Goodhart 風險)research/last-trade-review.txt— 上次交易檻討日期tools/review_due.py— 檢討週期機械提醒(2026-09-14):trade-review 14 天 / portfolio-review 30 天 / SA 掃描 35 天,日期取檔名非 mtime;exit 2 = 到期 → briefing Key Alerts + Telegram 今日待辦;briefing_runner.sh預跑並直推 Telegram 不經模型(原散文提醒在 2026-09-14 被 telegram tier 跳過,第 16 天才被用戶發現)。新增任何「N 天做一次」的事加進 CHECKS,不寫散文research/position-flags.json— 未結旗標登記(欠一個決定的部位)。工具tools/trade_ledger.py flag/defer/resolve-flag/flagsbriefing-out/cache/archive/YYYY-MM-DD/— 每日決策輸入凍結快照(fundamentals/macro/news/earnings/pmcc/leading)。工具tools/archive_cache.py,briefing_runner 自動跑,保留 120 天日快照 + 之後每月首日research/leading-config.json— 發現層先行指標配置(cross-read 鏈、pricing 關鍵字/symbols、SMH 寬度成分、台股月營收清單、decel 閾值);改持倉/鏈/閾值時手動編輯,tools/fetch_leading.py讀取briefing-out/cache/leading-indicators.json— 先行指標快照(三儀表 + 財報 cross-read + 報價新聞 + revision 二階導 + 台股月營收)。工具tools/fetch_leading.py(TTL 20h),briefing_runner 每日預載、archive_cache 凍結。所有旗標 display-only(記錄不阻擋,同 A4),/trade-review 驗過命中率才可升閘門。細部方法(revision 兩法、SMH 成分、quarterly_trends)見工具內註釋與research/leading-config.jsonresearch/price-alerts.json— 自動價格警報(launchdcom.fadacai.price-alerts每 15 分輪詢,盤中 ET 09:25–16:10 生效 → Telegram)。工具tools/price_alerts.py add/list/remove/test;Firstrade 非官方 lib 無警報 endpoint 故以 yfinance 自建。凡 briefing/review 產出「價格觸發待辦」(收租觸發、撿回條件、短腿破位)應同步add進來,Mac 睡眠期間不輪詢。Note 格式(2026-08-19 強制,動作優先):note 開頭必為→ 動作:<收到訊息當下該做/不該做什麼>,接前置閘門(名額/確認條件/否決條件);觀察型觸發(到價 ≠ 進場)必須明寫「這不是買進訊號」——收訊人不需任何上下文就知道下一步。條件已失效的警報(如價格跌穿整個觸發帶)要撤舊換新,不留殭屍警報每日重複發。mode 三分(2026-09-15):防守線(R23 線、用戶收盤線、結構失效線)一律close_confirm——盤中不發、由 pre-close/收盤 pass 判定執行;觀察型(「不下單、先查 revision/跌因」、L1 走強/回檔提名)一律briefing_only——只記briefing-out/cache/alerts-fired.jsonl,briefing 早上讀當日條目並直接把 revision 查完給結論(HWM 9/15 案:推給用戶一則「請查 revision」的訊息毫無意義);只有真的要人當下做事的才once_per_day推 Telegram。R23 自峰回撤線(2026-09-02,feedback/peak-drawdown-line.md):認列桶部位未實現一旦達 +20%(armed),briefing 同次必掛--peak-dd 20與--peak-dd 30 --since <建倉日>兩支警報(idSYM-R23-peakdd20/30);觸發 → 收盤確認 → 隔日執行 →flag/resolve-flag --action trimmedresearch/event-ledger.jsonl— 新聞事件帳(2026-09-21,JEV 評估後第一步):tools/label_events.py每日把 EODHD 新聞(fetch_newsbody 2500 字元)以固定 schema 標成事件類型/方向/時間尺度/量化引句/信心,30 篇一批走claude -p --model haiku(走 Max 訂閱額度,邊際成本 0;CLI 顯示的 $0.17/批為名目值),runner 預跑;score30/88 天後補 20/60 日對 SPY 超額;stats出事件類型×方向條件報酬(n≥8 才列)。display-only:briefing 只陳列,驗兩期 /trade-review 才准進任何 gate。標註器可換(--labeler jev,TypeSafe 早期存取,key 放.envTYPESAFE_API_KEY,adapter 待補;compare算兩標註器一致率)。此帳同時是 source_credit add-claim 與 thesis signal-inference 的自動化上游research/source-config.json— 來源信用系統:私有來源白名單 + X 抓取配置 + 計分門檻(gitignore,schema 範例見docs/source-config.example.json)。platform ∈ x|substack|rss|podcast|manual;kind ∈ fact|view;tier只由tools/source_credit.py tiers機械寫回,不手改。bias: talks-book+agenda_check.sec_cik(2026-09-16,@BillAckman):該來源的主張引用前必對照tools/agenda_check.py抓的最新 13F 前 N 大持倉(cachebriefing-out/cache/agenda-13f.json,TTL 7 天),觀點與持倉同向 → 標 agenda 不當獨立訊號;--claim "<文字>" --source <id>可粗配research/source-credit.jsonl— 來源信用帳:每則可計分主張的登錄與驗收記錄(gitignore)。工具tools/source_credit.py add-claim/due/resolve/resolve-due/stats/tiers/list;fact 型主張只列不猜、人工核對官方數字;view 型到期自動用價格驗價(同shadow_signals.py邏輯)。所有 tier display-only,驗滿 ≥2 期/trade-review且 Trusted+ hit_rate≥65%/mean lead>0 才可升硬閘門(R21,見feedback/RULES-LEDGER.md)。細節見docs/source-credit.mdbriefing-out/cache/twitter-signals.json— 來源訊號快照(TTL 20h)。工具tools/fetch_twitter.py(X API v2,按量計費,max_reads_per_run硬上限,成本估算見docs/source-credit.md),briefing_runner 每日預載、archive_cache 凍結。Probation tier 僅 briefing §9.6 陳列,Trusted+ 才可進 Key Alerts / Telegram
模型版本記錄(因應模型換代)
新規則寫入 feedback/RULES-LEDGER.md 時填 作者 欄;/trade-review 補正歸因時帶 --model / --effort。
用途是排覆審順序,不是推翻依據 —— 更新的模型不同意一條已驗證規則(失效 0、巧合 ≤5%)時,除非有新硬數據否則模型輸。否則每次換代就把累積實證清零,那是「無腦 follow」的反面,同樣不靠證據運作。
要比較新舊模型只有一種乾淨作法:盲測重推導 —— 餵 cache/archive/ 的當日資料切點、不給結果,讓新模型獨立推導,再把兩者一起對照實際結果。用新模型「重審」舊決策不具資訊量(它已知道結果)。
⚠️ 旗標紀律(修 2026-07-25 量測出的最大回撤漏口)
凡在 briefing / journal 寫下 ⚠️ / 降桶候選 / 勿再向下加碼 / thesis 蒙塵 / 待覆判 的部位,同一次必須 trade_ledger.py flag(附 --deadline)。**deadline ≤ 15 個交易日,或必須同時掛價格觸發線(2026-09-02 R11 修訂:MYRG 8/27 旗標排兩個月 deadline 期間續跌是本修訂案例)。**延後必須走 defer(會計次),第 3 次自動 forced → 減碼 1/3 或明文 resolve-flag --action withdrawn 附理由。
出場 → 撿回自動化(2026-09-14,R20 程式化): trade_ledger.py resolve-flag --action exited [--exit-price X --size-usd Y] 同一次自動建 TICKER:reentry-dual-branch thesis(due +45d)、掛 TICKER-reentry-low/high 兩支警報(出場 ∓10%,各需 30 日 revision 條件:回檔 down≤up、走強 up>down——只漲不算)、登 cf-reentry 影子(30d 跑輸 = 砍對)。非經旗標的清倉用 trade_ledger.py reentry --ticker --exit-price --reason 補建。質地理由永久淘汰才可 --permanent-reason 跳過;組合理由不得。撿回單一律 starter ≤2%(H10)。guard 每日驗 pending reentry 條目雙分支齊全。
現任人物/職位事實(2026-09-16): 模型先驗會過期(Sonnet 在 9/16 briefing 寫「鮑爾記者會」,Fed 主席自 2026-05 起是 Kevin Warsh/華許)。凡寫到央行主席、財長、公司 CEO 等現任職位,先讀 research/facts-current.json;不確定就寫職稱不寫人名。briefing_lint 對 stale_terms 直接報錯。
R27/H10 表述 lint(2026-09-14): tools/briefing_lint.py(PostToolUse hook,寫 briefing-out/*.md|txt 與 journal 時觸發)——認列桶 ticker 同行「thesis 完好」無機械線距離 → 報;journal 當日新倉權重 >2%(priced_in >+150% 者 >1.5%)且無「⚠️ H10 bypass」→ 報。
R27 認列桶狀態表述(2026-09-11,MYRG 案): 認列桶部位在任何輸出裡不得單獨以「thesis 完好 / intact / 未破」作為狀態——認列桶的決策依據是機械線(R8 梯級、R23 自峰回撤、收盤線),thesis 只能附註。必須寫「距線 ±X%、累計減碼 vs 級距、旗標 deadline」。MYRG 自峰 −43% 全程無減碼、journal 反覆「thesis 完好」(判斷對、卻成了不動的理由)即此漏口。
EODHD 情緒 display-only(2026-09-11,H7): sentiment_trend / 新聞 polarity 不進機率分布、不進任何 gate、不單獨觸發加減碼;影子測試 tools/sentiment_shadow.py(33 天:55% 讀數飽和 >0.90、個股內無擇時訊號),/trade-review 每期重跑。
Why: 旗標只活在散文裡時,每天被當新的重述而永不執行。TSLA 7/01 標降桶候選、延後 3 次(其中一次用「改收租」取代決定)→ −52.7% / −$6,399;ON 6/26 明文「勿再向下加碼」→ 7/06 仍加碼 32 股。兩者的 thesis-ledger history 都是 0 筆 —— 沒有任何東西在數延後。自警示起算累積代價 −$6,333,是全書最貴的單一機制。flags 會顯示 post_flag_fills(警示後才加的碼)與 total_cost_since_flag(該數字逐期往下走才算修好)。
鏡像規則(.agents 樹為生成檔,禁手改)
AGENTS.md 與 .agents/skills/ 由 python3 tools/sync_agents_skills.py 從 .claude/ 樹自動生成(唯一轉換:內文 CLAUDE→AGENTS 檔名引用)。任何 skill / 本檔改動後必須重跑一次 sync;--check 可驗證是否 drift。禁止直接編輯 .agents/ 下的檔案,也禁止做「Claude→Codex」之類全文置換(2026-07-01 前的鏡像壞損即由此而來)。
HTML 報告站工作流
每份報告輸出 markdown(source of truth)後自動轉為 HTML,push 到獨立 private repo 部署為 Netlify 靜態網站。
工具
python3 tools/generate_html.py <briefing|portfolio-review|stock-analysis|options-strategy> <日期或 md 路徑> [--push]
- 無
--push:只在briefing-out/html/存一份本地 HTML - 有
--push:同步到$REPORTS_REPO_PATH並 git push(Netlify 自動部署) send_briefing.py在--send流程中自動呼叫generate_html briefing --push,Telegram 訊息末自動附連結
環境變數(.env,絕不 commit 到主 repo)
REPORT_SITE_TOKEN=<32-hex-token> # URL 混淆用,等同隱私鎖
REPORT_SITE_URL=https://reports.patricksudo.com
REPORTS_REPO_PATH=/path/to/fadacai-reports # private repo local clone
隱私原則
- Reports repo 必須是 private,token 只存在 .env 與 repo 目錄名
- 網站根目錄放空白 decoy index.html;所有頁面含
noindex,nofollowmeta - 安全標頭由 reports repo 的
_headers設定(HSTS、X-Robots-Tag: noindex、X-Frame-Options: DENY、X-Content-Type-Options: nosniff),Netlify 部署時套用 cache/、send-log.jsonl、launchd.log、codex prompt/out 等敏感快取不上傳到 reports repo
Step 0 統一規範(所有 skills 共用)
0a. 每次必做
- 讀取
plan.md— 了解策略佇列與板塊目標 - 讀取
feedback/*.md— 交易風格偏好。但不是無腦套用:先讀feedback/RULES-LEDGER.md,每條規則都帶著自己的命中/失效紀錄,依下表判讀強度。
規則判讀表(強制,取代舊的「套用 feedback」)
| 規則狀態 | 讀法 |
|---|---|
| 失效 0、巧合 ≤5%(獨立命中 ≥5) | 已驗證 → 遵循;要反對需硬證據 |
| 失效 0、巧合 5–25%(獨立命中 2–4) | 🟡 初步支持 → 遵循,引用時附巧合機率;不得作為反對硬數據的依據 |
| 命中 ≤1 / 失效 0、且建立 >60 天 | 未驗證假設 → 可質疑;引用時標「該規則尚未被實測」,並主動設計檢核 |
| 失效 ≥1 | 待覆審 → 引用時必須說明已失效幾次 |
| 失效 ≥2 | 🔴 強制覆審 → 不得作為唯一依據 |
| 無結構化原始案例 | ⚠️ 不可驗證 → 降為「偏好」,不是「規則」 |
命中只算建立日後的獨立事件(原始案例不計),每筆案例附 [up]/[down] regime 標籤;巧合欄由 tools/rule_stats.py ledger-audit 維護(--check 每日抓漏)。細則 feedback/skill-vs-luck.md。
兩條鐵則:
- 分數決定,不是模型決定。 若你(或更新的模型)不同意一條已驗證(巧合 ≤5%)的規則 → 你輸,除非你有新的硬數據。不同意一條 0 命中放 >60 天的規則 → 你贏得推定。規則存廢由實測命中率裁決,不由「哪個模型說的」裁決。 否則每次模型換代就把累積實證清零,跟「無腦 follow」是同一枚硬幣的反面。
- 要求原始案例可重測,本身就是篩子。 一條規則若無法指出「哪些標的、哪一天、當時主張什麼」,它是意見不是規則,按上表降級。
(2026-07-25 建立時:10 條規則有 6 條屬「未驗證假設」,包含治了 66 次判定的 weak-signal-root-cause.md 門檻。誠實標示會讓 briefing 語氣變得比較不確定 —— 那是刻意的:讓依據的強度可見,而不是所有結論聽起來一樣有信心。)
0b. 取得即時持倉
- 呼叫
mcp__firstrade-server__get_account_position
0c. 今日 journal 確認
- 若
journal/YYYY-MM-DD.md(今日)已存在 → 跳過偵測 - 若不存在 → 執行 gap-fill + 變動偵測(見下方)
0d. Gap-fill 邏輯
- 讀取
journal/最新檔案作為「前」 - 若距上次 journal > 3 個交易日:先建立銜接條目(標記
⚠️ gap-fill,列出時間範圍) - 比較「前」vs 即時持倉,輸出差異(🆕新建倉/🔴清倉/📈加碼/📉減碼)
- 自動建立今日 journal,含完整倉位快照
0e. 第一性原理紀律(Verdict / Recommendation / Action 前必做)
在輸出任何投資結論之前,強制回答三個第一性問題(First-Principles Discipline):
-
核心 thesis 是什麼?
- 用 1 句可驗證的陳述句(非 narrative,非 adjective)
- ❌ 反例:「AI 帶動需求」「股票超買」「題材熱絡」
- ✅ 範例:「全球資料量 2024→2028 從 150ZB→290ZB,冷資料佔 80%+,HDD per TB 成本比 SSD 低 4-5x」
-
這個 thesis 在什麼條件下會被證偽?
- 列出 2-3 個 falsifiable 觀察點(可量化的指標、事件、時程)
- ❌ 反例:「市況不好就錯」
- ✅ 範例:「下次財報 HDD ASP 不再上漲、HAMR 60TB 量產延後、Hyperscaler capex 下修 >10%」
- 區分力優先(2026-07-29):觀察點優先選「在對立假說下出現機率差距大」的證據;與雙假說皆相容者(如「需求強勁」既相容週期高峰也相容結構改變)不得作為 thesis 支持,只能列背景。同源相關證據打折,不當多筆獨立樣本。詳
feedback/voi-research-gate.md
-
目前 Verdict 在多大機率上 conditional 在 thesis 成立?
- 給機率分布而非單點(不寫「可能會漲」而是 60% 看多 / 25% 中性 / 15% 看空)
- 算 expected value:Σ(機率 × 各情境公允價),與現價比較
- 強制呼叫
probability-honesty-checkeragent(見下方)— 不可手動套機率 - Fair PE 三錨點推導(不可手寫猜測): A1=EODHD
pe_ratio(現行市場隱含);A2=peg_ratio×成長率(成長合理倍數,AI龍頭目標PEG 1.5,其餘 1.0);A3=wall_street_target÷forward_EPS(分析師隱含)。A3 的 base forward_EPS 取真實賣方共識:fundamentals-snapshot.json forward_estimates.curr_fy.eps_avg(缺→next_fy.eps_avg,再缺→eps_ttm×(1+growth)近似);cacheself_valuation.a3_fwdeps_source已標來源,勿手推。 任一錨回 0.0/null → 丟棄。基準Fair PE=median(A1,A2,A3);樂觀=max 上限current_PE×1.25;悲觀=min 下限current_PE×0.70。Forward EPS:樂觀=base×(1+min(avg_surprise_pct,15%));悲觀=base×(1−5%~10%)。 - A4 自建錨(divergence flag,不進 median、不進 EV): 從
fundamentals-snapshot.json self_valuation直接讀(fetch_fundamentals.py 已算好,完全不看分析師 estimate;推導式在該工具內)。A4vsA3%隔離「我的盈利觀 vs Street 盈利觀」(倍數固定)。⚠️ 影子驗證中(高估極端有預測力、低估無訊號,數據見RULES-LEDGERR3)— 僅 shadow_signals 記錄 + briefing 標🟣,不得據此改變任何建議,跑滿 2 期 /trade-review 才決定升閘門。顯示:confidence=unavailable→(self-val N/A);low→⚠️低信心;ok→ 正常。
為什麼這條重要:
- Claude 的分析、Codex 的 adversarial review 都會帶 framing 偏差
- narrative 層的辯論(「該買 vs 該避」)永遠分歧,第一性是繞開兩者的 ground truth
- 連續做不到這三題 = Verdict 是 narrative + heuristic + framing 的產物,不可靠
⚠️ 機率分布強制流程(briefing / portfolio-review / stock-analysis / todo 適用):
凡輸出機率分布或 EV,必須先呼叫:
Agent(subagent_type: "probability-honesty-checker", prompt: "...")
或對組合整體用 /ev-check [horizon]。Agent 會強制執行 6 步流程:
- Input Enumeration(8 項齊全才能進下一步)
- 形狀反推(從事實 mapping,禁止 default bell shape)
- 各 catalyst 的 conditional 機率(顯式 base rate)
- Aggregated 三情境合成(sum check = 100%)
- EV 顯式 Σ 計算(中點 = 區間算術平均)
- Self-audit checklist 全勾
禁止偷懶寫法(Agent 與主 skill 都不可寫):
- ❌ 30/45/25、35/45/20、20/45/35、25/50/25(default mirror shape,無依據時禁用)
- ❌ 「略偏正」「略偏負」「中性偏多」「應該會」「不確定性高」(質性語言)
- ❌ 跳過 Input Enumeration 直接給機率
- ❌ EV 寫成文字而非顯式 Σ 數字
輸出格式(所有 Verdict 前置):
### 第一性檢查
- **核心 thesis:** [1 句可驗證命題]
- **證偽條件:** [2-3 個 falsifiable 觀察點]
- **機率分布:** [由 probability-honesty-checker agent 算出,含 8 項輸入 + 形狀反推 + EV Σ]
用戶 push back「你真的有算嗎」時的處理:
- 不辯解、不重組原數字
- 重跑 agent,明確要求 audit checklist 全勾
- 發現原本確實偷懶 → 老實承認 + 顯示新算(見 feedback/probability-distribution-honesty.md)
⚠️ Agent 註冊限制: session 內新增的 .claude/agents/ 檔案不會動態載入。回 Agent type not found 時 → 該 session 改呼叫 general-purpose agent,把 probability-honesty-checker.md 全文當 prompt 前綴傳入;6 步 + audit checklist 要求不打折。
0f. Thesis Ledger(thesis 追蹤與到期驗收)
第一性檢查產出的可驗證 thesis 不是寫完就忘 — 凡帶明確時間/事件觸發點的 thesis(「請在財報後/N 日後檢視 X」)都登錄到帳本 research/thesis-ledger.json,到期自動回頭抓實際數字驗收(passed/failed/partial),結果驅動下一步 actionable。
- 工具:
tools/thesis_ledger.py(去重、碰撞攔截、到期/過期掃描、狀態轉換、統計全在程式層,Claude 不手改 JSON) - 去重 key =
ticker:slug;同 key 但 thesis 差太多 → exit code 2 碰撞,改 slug 或supersede - 逾期 >30 天未驗收 → 自動
expired(當作無結果,不算命中率分母) - 驗收(每次 briefing / portfolio-review 自動跑):
thesis_ledger.py due→ 對到期項抓數判定 →resolve;抓不到新數 →reschedule不猜 verdict - 登錄(briefing / portfolio-review 收尾):
list看既有 slug →add - Signal-inference 來源:從 news body / SEC 8-K / 逐字稿抽已量化陳述推導的 thesis,登錄時加
--source signal-inference --ev "signal: <metric> <value>, <source>, conf=<confidence>"。僅confidence ∈ {high, medium}且有明確前瞻 trigger + 強制raw_quote(≤120 字逐字)才登錄;low只在文字呈現。stats --source signal-inference可量測新聞推導命中率(閉環驗證 P3 價值)。反幻覺鎖:無 raw_quote = 無 signal = 不登錄。 - Resolve 附加估值影響欄位(選填,有數就帶):
passed→公允價上修(recompute D1 三錨點);failed→下修;partial→拆分 thesis 成分 vs 倍數成分(impact_decomp)。數字存入 history[],long-term queryable via stats。python3 tools/thesis_ledger.py resolve --id <id> --verdict passed|failed|partial \ --actual "實際數字" --note "判讀" --next-action "操作" \ --fair-value-before <float> --fair-value-after <float> \ --price-impact-pct <float> --impact-decomp "thesis +X%/multiple −Z%=net −W%" - 詳見
docs/thesis-ledger.md
Auto Journal Detection(SessionStart Hook)
每次對話開始時,hook 會輸出今日 journal 狀態:
⚡ 今日尚無 journal,自動執行倉位偵測→ 執行 Step 0c/0d,建立 journal,完成後以 1 行通知用戶,繼續處理原始請求✅ 今日 journal 已存在→ 略過偵測
Investment Style
- 主軸:AI/半導體、高成長科技(無板塊上限;單一個股 >10% = 硬線,強制減至 ≤10%,2026-09-02 統一語意)
- 避險:基建、航太、貴金屬、核能(小比例平衡)
- Strategies: LEAPS (stock replacement, deep ITM delta 0.80-0.88), Bull Put Spread, Bull Call Spread, Covered Calls, PMCC
- Risk: 單一持倉 > 10% flagged as over-concentrated
- 避險 sleeve 帶寬持有(R25,2026-09-04 建、09-14 修訂,
feedback/hedge-sleeve.md):GLD + XLE 被動 ETF 目標 6%、帶 4–8%,roster.json passive_sleeve,不計 18 檔、不套 R23、不因相對落後汰;但 合計 >8% 減回 6%、單 ETF 自峰 −10% 減至 2%、帳戶自 sleeve 建立後峰 −10% 賣半換子彈、套 R8 梯級——所得進 SGOV 再 redeploy;金融 ETF 不算避險;「VIX ≥25 才建 sleeve」已廢止 - 閒置現金停泊(R24,2026-09-04,
feedback/cash-parking.md):Firstrade 現金不計息 →閒置 = 現金 − 在掛買單 − 30 日部署需求 − max(3% 總值, $8k) 緩衝($8k 固定保留給手動掛單,2026-09-16 用戶「SGOV 會排擠掛單的錢」)> $10k 或 >4% 時當次掛 SGOV GTC 買至 ≤ $5k;動用前一交易日賣(T+1)。SGOV/BIL 視同現金(roster.json cash_equivalents,guard 略過、不佔 18 檔、不進 α 計分;飛輪滯留檢查仍算現金)。不得用 XLF/XLE 等板塊 ETF 停泊
執行底層邏輯:Portfolio as a Business(強制濾鏡)
任何 Verdict / Action / 倉位建議都先過這套濾鏡(源 research/新手開局.md,操作規範 feedback/realized-pnl-business-model.md,Step 0a 已含必讀):
- 績效看 Realized PnL,不看 Unrealized — 只認列獲利、虧損掛庫存;目標 Realized ≈ 4× |未實現虧損|。反過來 = 爆倉訊號要 flag。
- Swing Risk 首要監測(= 帳上最高未實現利潤 + 潛在回吐;Options = Premium + 未實現利潤);肥利潤未落袋要主動提示系統性落袋。
- Offsetting 沖銷失誤而非利潤;禁「砍 loser 加碼 winner」(四錯:認列虧損 / 過度暴險 / Beta 失衡 / 分散化打折)。
- Rolling → Adjusted Risk → Risk-Free State:落袋用 Adjusted Risk 視角(新倉真實風險 = size − 累積已認列),不是「賣了就少賺」。
- Pre-emptive(非止損式)風險管理 + Scenario Planning;慎用 Put/SPY 對沖(漲了變反向認列虧損 = Double-Kill)。
- 定位先行;主動組合支數 14–18(理想 14–16),>18 砍一進一不淨增,>30 無益。
- 分桶:每倉位歸 🔵信念桶(讓它 run、只在 thesis 破或 >10% 才動)或 🟢認列循環桶(高 β/週期/肥利潤 → 系統性 harvest);疑問時歸認列。
- 兩層候補:🟡L1 On-Deck(thesis 驗證+觸發明確,補空位只從 L1 拉)/ 🔵L2 Research Pool(需修復或擴 Universe);砍倉依砍因歸層(組合理由→L1,thesis 破→L2)。
- 技術面三態原則(H12,2026-09-17,
feedback/ma-filter-evidence.md):技術指標只描述狀態不產生觸發。可用:①趨勢濾網 >SMA50 且 >EMA200(R30/R29d 閘門)②趨勢中低波動整理:布林帶寬擠壓、回檔 SMA20(R30 排序優先)③趨勢強度 EMA50 5 日斜率(R30 排序、R29d 綜合分)。不用:5/10/20 日均線(含 EMA20)、DEMA/TEMA、均線交叉、MACD 任何用法、SAR、肯特納、通道突破當日、差值、加速度——30 檔×5 年全部 ≈ 隨便買。RSI 維持只列數值。方向仍由 revision 定,技術面只決定先買誰與結構 - 新倉 starter 結構(H10 偏好,2026-09-14 用戶「可以鬆一點」):新倉/非既有領導者一律起手 ≤2%,其餘走回檔梯或走強確認後補(CLS 9/8→9/9 即範例);
priced_in_pct > +150%的名字起手 ≤1.5%、不一次買滿(2026-09-14 用戶調高門檻)。是偏好不是硬線:可違反,但違反時 journal 必標⚠️ H10 bypass並在 /trade-review 分組計分(H1/H2 證據:新倉貴價買全負、既有領導者加碼全正) - 機會成本閘門(桶間升級/降級/部署皆強制):新倉須明顯優於最弱在倉名額才進 — 相關 beta 門檻最高(須擠掉弱倉、不淨增),無相關 hedge/填缺口門檻較低;14–18 上緣時砍一進一。前置行業濾網(2026-08-19):名字對名字比較之前先問「該行業 TAM 是否 GROWING-STRUCTURAL(擴張中)」——衰退行業內的相對強者不進 bench(不做垃圾桶尋寶;行業比較前三名即可,不花時間分辨第一 vs 第二)。
- 停利再投入飛輪(汰弱留強的閉環,總原則):認列循環桶系統性 harvest 峰值強度(revision 轉折/題材降溫的肥利潤)+ 砍真弱(thesis 破 OR 最弱動能無催化)→ 盈餘必配對 redeploy 決策,第一順位投入「加速中強度」(信念桶領導者 / L1 中 revision 上修的領漲者),不讓現金閒置滲漏(每次 harvest 同一次 review 內要嘛 redeploy 上行、要嘛標明 dry powder 理由 + 觸發)。定義鎖死:「弱」= fundamental 惡化或最弱動能無催化,非當日紅K(per
feedback/weak-signal-root-cause.md);「強」= estimate 上修/成長加速,非當日超買(perfeedback/momentum-valuation-symmetry.md);funding 源用已實現獲利 + 真弱倉,非砍虧損倉(與上面「禁砍 loser 加碼 winner」相容——飛輪靠 realized gain 轉動,不靠認列虧損)。Guardrails(單倉>10%、14–18 支、相關度、去相關 hedge sleeve)是飛輪護欄不是矛盾:集中往強度跑、但不破紅線。詳feedback/momentum-valuation-symmetry.md。 - 梯級停利(認列桶 harvest 的機械化觸發,2026-07-01):未實現 +30%/+60%/+100% 各賣 15%/15%/20%,之後每 +50pp 賣 10%;保底 30% runner 永不因停利出場(只因 thesis 破/汰弱換強/>10% 才動)。GTC 預掛下一級價、每次 full review 校正;revision 轉折 → 提前下一級;revision 上修中不提前。樂透 +100% 賣半;LEAPS >+80% 評估 roll-up 收本金留曝險。信念桶與 hedge sleeve 不適用。詳
feedback/tiered-profit-taking.md。 - Revision 訊號 coverage 分級:分析師數 N≥15 全權重;8–14 半權重(須與 trend/成長數據互相印證);<8 不單獨觸發加減碼(改靠 P3 硬數字 + beat rate + guide)。上次財報後 >45 天的 revision 視為 stale。
- Realized ≈ 4× 是診斷指標非 KPI(Goodhart 防護):汰弱認列的虧損屬策略性成本,單獨列示、不進爆倉訊號判讀——不可為了保比率而不砍真弱。
- 即時 roster(信念/認列/L1/L2 名單)權威來源 =
plan.md「組合架構 v2」;改動 roster 同步更新該節。
MCP Tools Available
mcp__firstrade-server__*— live Firstrade account data (positions, balance, history, quotes, watchlists)get_account_position— real-time stock + options positions (replaces current-position.md)get_account_balance— account equity and cashget_account_history(date_range, custom_from, custom_to)— transaction history。date_range: today|1w|1m|2m|mtd|ytd|ly|cust;給custom_from(+選填custom_to)即自動走 cust 任意窗(2026-01-01 起 = 702 筆 vs2m的 189 筆)get_orders(per_page=0)— 在掛訂單清單含 order ID(G42621-1601)→ 對上 plan.md ref = 歸因 ground truth;另可偵測死單。⚠️ 只回在掛單,成交/取消後即消失 → 必須每次 briefing 快照累積(tools/trade_ledger.py snapshot-orders)get_option_chain(symbol, exp_date="")— 券商選擇權鏈;exp_date空 → 回到期日清單(格式YYYYMMDD,也吃YYYY-MM-DD)get_option_greeks(symbol, exp_date)— 券商計算的 delta/gamma/theta/vega/rho + IV(流動性差的履約價回--)get_single_quote/get_watchlist_quote— real-time quotes- 單腿選擇權可經 MCP 開倉與平倉(2026-09-07 探測後修復):
preview_option_order/place_option_order的order_type用buy_to_open | sell_to_close | sell_to_open | buy_to_close(buy/sell= 開倉別名)。平倉必須用*_to_close,否則 API 當開倉 → ref 1103;裸賣 call 無 100 股 → ref 1200(Level 2 正常擋)。七月的 ref 1562 已不再出現(多標的 / day / gt90 皆 preview 200)。兩腿 spread 也可經 MCP:preview_option_spread/place_option_spread(每腿 symbol + 四碼 transaction + contracts,limit_type=debit|credit,net_price);複式單只能 day、券商只在 ET 7AM–4PM 收單(否則 ref 1110),三腿以上與 GTC 仍不支援 →tg_send.py推 App 手掛。API schema 見firstrade-server/docs/option-order-api.md;探測腳本tools/probe_*.py(只 preview)
mcp__yfinance-advanced__*— real-time quotes, options chains, financials, news, recommendations (primary)mcp__sec-edgar-mcp__*— SEC filings, XBRL financials, insider trading (Form 4), 8-K events, segment datamcp__fmp-mcp__*— stock peers, market movers, company profiles (free tier; most endpoints need paid plan)mcp__technical__*/mcp__polymarket-mcp__*/mcp__eodhd-mcp__*— 工具清單與參數由各 server instructions 每 session 自動注入,此處只記 server 端沒有的實戰 caveat:- eodhd 改 server.py 後需重啟 session 才載入新工具
get_fundamentals_snapshot= 402-gated fmp ratios/PT 的免費層替代;pe_ratio=0.0/peg=0.0→ 丟該錨get_earnings_history= probability-checker Step 1d 首選;⚠️ 低 EPS 基期股 avg_surprise 不可靠(AMD +152% artifact — 用 beat 次數不用 avg%),與本地 earnings-history.json cache 交叉get_news每日快取tools/fetch_news.py→briefing-out/cache/news-articles.json(TTL 6h);P3 訊號抽取要 body 用它,不用 get_news_sentimentget_macro_indicator年頻滯後 — 只當 regime 背景,不當高頻訊號
- Use parallel agent dispatch for batch data fetching across multiple tickers
MCP Retry & Fallback Policy
- Any MCP tool call that fails → retry up to 3 times
- 3 次都失敗 → call that server's health test (single simple tool) to diagnose:
- firstrade-server:
get_account_balance() - yfinance-advanced:
get_stock_info("AAPL") - sec-edgar-mcp:
get_company_info("AAPL") - fmp-mcp:
getCompanyProfile("AAPL") - technical-mcp:
get_technical_indicators("AAPL") - eodhd-mcp:
get_sentiment_trend("AAPL.US", 7) - polymarket-mcp:
get_trending_markets()
- firstrade-server:
- Health test also fails → fallback to WebSearch/WebFetch for equivalent data
- 在輸出中標記 "⚠️ [server] MCP 不可用,使用替代數據源"
- fmp-mcp 專屬 fallback(session 過期無需
/mcpreconnect):mcp__fmp-mcp__*回Session not found or expired時,不需手動 reconnect,直接跑旁路 helper(每次建全新 MCP session,永不過期):
例:python3 tools/fmp_query.py <toolName> [--args '<json>']python3 tools/fmp_query.py getStockPeers --args '{"symbol":"NVDA"}'(無參數工具省略 --args)。結果直接是 JSON。FMP 容器:docker compose -f /Users/supatrick/laptop/mcp-servers/fmp-mcp/compose.yaml up -d - FMP 免費層實測清單(2026-07-28 全面掃描):✅ 可用 —
getTreasuryRates(全曲線)、getHistoricalIndustryPE/getIndustryPESnapshot(行業 PE 日頻,fetch_leading.py半導體估值溫度計用)、getSectorPESnapshot、getSectorPerformanceSnapshot、getAftermarketQuote(盤前盤後報價)、getShareFloat、getDividendsCalendar、getIndexQuote(^VIX 可、^VIX3M 402)、加上原有 peers/movers/profile/earnings-calendar。❌ 402 — transcripts、COT、Senate/House trades、stock news、press releases、analyst estimates、grades、price targets、financial scores、economic calendar、SP500 constituents、insider stats(§9.5 逐字稿改走 SEC 8-K exhibit)
Research Boundaries
- 不主動研究用戶未要求的付費 API/服務
- FMP free tier 限制已記錄,不嘗試付費端點(會返回 402)
Permission Protection
- 不覆蓋/刪除
.claude.json中現有 allow rules - 只 append 新權限,並向用戶展示新增內容
Skill 模型分工(2026-09-23 更新:Claude 5 家族)
別名實測(2026-09-23,Claude Code 2.1.280):opus → claude-opus-5-5、sonnet → claude-sonnet-5、fable → claude-fable-5-1。frontmatter 一律寫別名,換代時自動跟上,不寫死 ID。
模型階梯:Fable 5.1($10/$50,目前最強的公開模型)> Opus 5.5($4/$20,Opus 線新一代,比舊 Opus 便宜)> Sonnet 5($2/$10,中堅/純機械)。Opus 5.5 較新但不比 Fable 強——是主力款升級,不是旗艦。
選模型的判準:判斷錯的代價 × 頻率。 錯了會污染之後每一筆決策、且頻率低 → Fable;頻率高、錯了下一輪會被機械驗收抓到 → Opus;抓資料與格式化 → Sonnet。
數據收集 subagent — Sonnet 5
Data-collector 每次啟動是全新 context(無歷史)。Sonnet + agent 內加反幻覺鐵則。 主程仍須對權威價(Firstrade)交叉驗證,對不上即整批丟棄(見 feedback/subagent-hallucination-guard.md)。
主 skill 執行模型
| Skill / 任務 | 模型 | 理由 |
|---|---|---|
/trade-review |
Fable 5.1 | 每兩週一次、直接改規則帳本;改錯影響之後每一筆 |
| 規則修訂 / 覆審(互動) | Fable 5.1 | 同上;session 內 /model fable 再做 |
| 重大部位決策(>5% 倉位) | Fable 5.1 | 錯的代價最高 |
/ev-check |
Opus 5.5 | 機率分布 + EV,每次有 ev_ledger 到期驗收 |
/portfolio-review |
Opus 5.5 | 跨組合綜合;月度頻率 |
/stock-analysis |
Opus 5.5 | 單標的深掘 |
/options-strategy |
Opus 5.5 | Greeks / 價差計算 |
/event-vol-scan |
Opus 5.5 | VRP/base rate 判讀 |
/briefing full / deep |
Opus 5.5 | 綜合 + Verdict |
| probability-honesty-checker subagent | Opus 5.5 | 機率紀律執法者 |
/briefing(quick)/ telegram |
Sonnet 5 | 每日自動推送;有事的日子 runner 自動升 opus |
/todo、/trade-journal、/mcp-health |
Sonnet 5 | 彙整/記錄/連線測試 |
| data-collector subagent | Sonnet 5 | 純抓資料 |
思考強度(effort): Opus 5.5 的 API 預設 effort 是 medium(舊 Opus 是 high)。吃推理的 skill/agent 要明確設 high,否則換新模型反而想得比較少——見各 frontmatter:ev-check、stock-analysis、portfolio-review、options-strategy、event-vol-scan、trade-review、probability-honesty-checker 設 effort: high;未設者繼承 session effort(全域預設 medium)。briefing 也設 high(2026-09-23 用戶:Max 訂閱,成本不是限制);runner 逾時同步 900→1800 秒。
動態升級(2026-09-14): launchd telegram briefing 預設 sonnet,briefing_runner.sh 在「有事的日子」自動升 opus:auto-exec plan 非空 / position_guard 有缺口 / forced 或逾期旗標。BRIEFING_MODEL 環境變數顯式指定時不覆寫。
長 context: session > 100k 時先 /compact,再繼續執行。換主題先 /clear。
手動切換: skill frontmatter model: 已聲明;若 harness 未自動套用,用 /model opus / /model sonnet 切換後再呼叫。
