Codex adapter note
This skill is generated from skills/thesis-drift.md so Claude Code and Codex users share one canonical workflow.
- Treat
$ARGUMENTSas the user's request in the current Codex thread. - When the source mentions Claude-only surfaces such as Task, Agent, WebSearch, Bash, Read, or Write, use the closest Codex capability available in this session: subagents when available, web search when needed, shell commands for local tools, and normal file edits for workspace files.
- Use shared project tools from
tools/in this repository. Prefer running commands from the repository root with paths likepython3 tools/financial_rigor.py ...; if the current thread starts outside the repo, locate the actual checkout path first instead of assuming a fixed home-directory path. - Before starting research, run the
datecommand to confirm today's date; treat it as the baseline for "latest" data and state the data cutoff date in the report header. Never assume the current date from training data. - Preserve the research quality rules from
AGENTS.md: cross-check financial data, use exact arithmetic tools for valuation/math, and clearly label uncertainty and source gaps.
Run investment thesis drift detection on $ARGUMENTS.
Supported input formats:
公司名 旧报告路径 新报告路径— Specify two research reports or thesis snapshots for comparison公司名 reports/{公司名}-thesis-旧日期.md reports/{公司名}-thesis-新日期.md— Compare two dated thesis snapshots公司名— Automatically findreports/{公司名}-thesis.mdand historical snapshots in the same directory; if there is no baseline, switch to missing baseline handling
"When the facts change, I change my mind. What do you do?" — Keynes
"Stock price fluctuations are not thesis drift; only changed facts are." — AI Berkshire
Design philosophy
The hardest part of long-term holding is not reading the news every day, but distinguishing three things:
- Facts change: verifiable changes occur in revenue, profit margins, competitive landscape, management behavior, or capital allocation
- Prices change: market sentiment or valuation multiples change, but the business itself has not changed
- Wording changes: the two reports are expressed differently, but the underlying evidence and judgments have not changed
The goal of investment thesis drift detection is:only acknowledge thesis change when the evidence changes. Do not create drift just because a report is written differently, and do not misjudge the fundamentals just because the stock price rises or falls.
This Skill depends on /thesis-tracker structured dimensions output: core assumption checklist, red line checklist, valuation anchors, tracking record table. When these structures are absent, fill in the baseline first, then perform drift detection.
Execution flow
Step 1: Determine the operating mode
Parse $ARGUMENTS:
- If two report paths are provided → enterspecified report comparisonmode
- If only a company name is provided → find
reports/{公司名}-thesis.mdand historical snapshots, enterautomatic snapshot comparisonmode - If only one report is found or there is no historical baseline → entermissing baseline handlingmode
- If the two reports are not for the same company → stop and ask the user to confirm; do not make cross-company drift judgments
Mode A: Specified report comparison
A1: Read and validate the two reports
Read the old report and the new report, and extract:
- Report date, company name, stock ticker
- Core thesis (5 sentences)
- Core assumption checklist
- Red line checklist
- Valuation anchors
- Tracking record table
- Management quality judgment
- Competitive moat judgment
- Current recommended action (buy / hold / watch / reduce / exit)
If a report lacks key structures, first mark "structure missing", but still try as much as possible to extract evidence from the body text; dimensions from which nothing can be extracted should be marked "unable to judge"; do not fabricate conclusions.
A2: Evidence normalization
Organize the factual evidence in the two reports into the same table:
| Dimension | Old report evidence | New report evidence | Data source | Verifiable or not |
|---|---|---|---|---|
| Valuation anchors | ||||
| Core assumptions | ||||
| Red lines | ||||
| Management quality | ||||
| Competitive moat |
Compare only the evidence, not the writing style. If the new and old reports are merely synonymous rewrites, reorderings, or tonal changes, with no changes to factual data or judgment thresholds, the determination is Unchanged.
A3: Numerical and valuation verification
All numerical changes must use tools/financial_rigor.py for precise calculation; LLM mental arithmetic is prohibited:
python3 tools/financial_rigor.py verify-valuation \
--price {当前价格} \
--eps {EPS} \
--bvps {每股净资产} \
--fcf-per-share {每股自由现金流}
If you need to calculate market capitalization, percentage changes, target price differences, or scenario valuations, use:
python3 tools/financial_rigor.py verify-market-cap --price {价格} --shares {股本} --reported {报告市值} --currency {币种}
python3 tools/financial_rigor.py cross-validate --field {字段} --values '{JSON}' --unit {单位}
python3 tools/financial_rigor.py three-scenario --price {价格} --eps {EPS} --shares {股本亿} --growth {乐观} {中性} {悲观} --pe {乐观PE} {中性PE} {悲观PE}
python3 tools/financial_rigor.py calc --expr '{精确算式}'
Key financial data must be cross-verified by at least two independent sources. Figures with insufficient sources, inconsistent definitions, or that cannot be reviewed must be marked as "low confidence / to be verified."
A4: Dimension-by-dimension drift determination
Use the following dimensions consistently; do not add or remove them on an ad hoc basis:
| Dimension | Determination focus | Improved | Unchanged | Weakened |
|---|---|---|---|---|
| Valuation anchor | Intrinsic value, PE/PB/FCF Yield, margin of safety, target price range | Margin of safety widens or intrinsic value is revised upward and verified with tools | No substantive change in the valuation range and margin of safety | Margin of safety narrows, intrinsic value is revised downward, or valuation assumptions become invalid |
| Core assumptions checklist | Verifiable assumptions such as revenue growth, profit margin, cash flow, users/orders/capacity, etc. | More assumptions are strengthened by new evidence | Assumption status is broadly consistent with the evidence | Assumptions are marginally weakened, impaired, or broken |
| Red line checklist | Integrity, regulation, business decline, competitive breakthrough, abnormal management actions | The original red line risk is removed or significantly reduced | Not triggered and the risk level is unchanged | The red line is triggered or the probability of triggering increases |
| Management quality | Integrity, capital allocation, buybacks and dividends, execution, shareholder friendliness | New behavior increases trust | Behavior continues the previous judgment | Behavior damages trust or capital allocation worsens |
| Competitive moat | Market share, pricing power, network effects, cost advantage, substitution threat | The moat widens or the competitive advantage is verified | No substantive change in the landscape | The moat is weakened or a competitor breaks through |
Each dimension can only give three types of conclusions:Improved / Unchanged / Weakened。
A5: Evidence-driven rule
Every conclusion other than Unchanged must cite the specific new evidence that caused the change:
- Financial statement line items: e.g., revenue growth, gross margin, operating cash flow, buyback amount, net cash
- Regulatory disclosures: e.g., 10-K/20-F, annual report, interim report, HKEX announcement, SEC filing
- News events: e.g., management changes, regulatory penalties, loss of a major customer, competitor breakthrough
- Price and valuation: must specify whether this is a "valuation change" or a "fundamental change"; do not confuse them
If no evidence can be found to explain the change, the determination must be Unchanged or Cannot determine, and drift must not be inferred from wording differences.
A6: Output drift report
Report structure
一、对比对象与时间跨度
二、总体结论:论文是否漂移
三、维度漂移表
四、证据差异明细
五、估值与数值验算
六、建议动作迁移
七、不确定项与需补充来源
八、下次跟踪重点
Dimension drift table
| Dimension | Old judgment | New judgment | Drift direction | Triggering evidence | Confidence |
|---|---|---|---|---|---|
| Valuation anchor | Improved / Unchanged / Weakened | High/Medium/Low | |||
| Core assumptions checklist | Improved / Unchanged / Weakened | High/Medium/Low | |||
| Red lines checklist | Improved / Unchanged / Weakened | High/Medium/Low | |||
| Management quality | Improved / Unchanged / Weakened | High/Medium/Low | |||
| Competitive moat | Improved / Unchanged / Weakened | High/Medium/Low |
For Unchanged rows, write the trigger evidence —, do not fabricate evidence just to fill in the table.
The overall conclusion must answer
- Has the thesis drifted? No drift / Positive drift / Negative drift / Insufficient evidence to determine
- Where did the drift come from? Valuation / Fundamentals / Management / Competitive landscape / Red-line event
- Is it a factual change or a price change? Clearly separate and explain
- How should the recommended action migrate? For example: Watch → Buy, Buy → Hold, Hold → Reduce, Reduce → Exit
- What evidence is needed next? Next financial report / regulatory disclosure / management explanation / competitor data
Mode B: Automatic snapshot comparison
B1: Locate snapshots
In reports/ search for:
reports/{公司名}-thesis.mdreports/{公司名}-thesis-*.mdreports/{公司名}/reports under thethesis、论文、追踪directory containing thesis, thesis, or tracking
Select the earliest file with a complete structure as the old report, and the latest file as the new report. If the user specifies a date, the user's specification takes precedence.
B2: Prevent incorrect pairing
Before comparison, confirm:
- The company name or stock ticker is consistent
- The report dates are different
- Both reports contain an extractable thesis structure or research conclusions
If it cannot be confirmed to be the same company, stop and ask the user to provide an explicit path.
B3: Execute Mode A
After finding two valid snapshots, execute fully according to Mode A.
Mode C: Missing baseline handling
If only one report is found or no old snapshot is found:
- Clearly state:There is no comparable historical baseline, so drift detection cannot be performed
- Do not fabricate an old thesis based on memory or market impressions
- Guide the user to first use
/thesis-tracker {公司名} 建立论文to establish a structured baseline - If the current report is already complete enough, suggest saving it as
reports/{公司名}-thesis.mdas the baseline for future drift detection
Output format:
无法执行论文漂移检测:缺少历史基线。
已找到:
- 当前报告:{路径 / 未找到}
- 历史基线:未找到
建议:
1. 先运行 /thesis-tracker {公司名} 建立论文
2. 下次有新财报或重大事件后,再运行 /thesis-drift {公司名} 旧报告 新报告
Key principles
- Evidence takes priority over wording — synonymous rewording is not drift; only changes in factual evidence are drift
- Fundamentals take priority over stock price — stock price rises and falls only affect the valuation anchor and do not automatically change business quality
- Values must be recalculated — all percentages, valuation multiples, and target price differences must use
tools/financial_rigor.py - Mark uncertain when uncertain — when sources are missing, definitions are inconsistent, or verification is impossible, do not force a judgment
- Handle red lines separately — red-line triggers take priority over cheap valuation and cannot be masked by a low PE
- Output must be reviewable — every Improved / Weakened conclusion must be traceable to specific evidence