--- name: moat-funnel description: A gated, moat-first pipeline for judging whether a company is worth investing in as a long-term holding. Use it WHENEVER the user wants to screen, evaluate, vet, or research a specific company or stock for investment quality — e.g. "帮我看看这家公司值不值得投", "分析一下 X 的护城河", "这个标的能不能投", "screen this stock", "is X a good business", "run X through the funnel", or when they name a company and ask for an investment-quality judgment. Trigger even without the words "skill" or "funnel". It is NOT a research-report generator or buy/sell recommender — it runs a fixed nine-gate elimination funnel in strict order, HALTS at the first failed gate, and refuses to look at valuation until quality is proven. Do NOT trigger for simple factual or transactional queries — a stock price, a news headline, an earnings date, "what does X do" — those get a normal direct answer, not the funnel. --- # Moat-Funnel — 优秀公司筛选管线 (v2) ## What this skill is (and is not) This skill enforces **a single, non-reorderable elimination pipeline** for judging business quality. Its entire value is *discipline*: it makes you kill a candidate at the first failed gate and forbids you from rescuing a low-quality business with a cheap price, a strong management team, or any other unrelated strength. - It is **a decision-discipline executor**, not a research-report writer. - It outputs **a per-gate verdict**, not a balanced two-sided essay. - It produces **"passes / eliminated at stage N" judgments against a fixed rubric**, NOT buy/sell advice. State this boundary when relevant. The final call always belongs to the user; note you are not a licensed advisor. The methodology distills the shared core of Chris Hohn (TCI: moat-first, order locked), Buffett (circle of competence, margin of safety, owner mindset), and Duan Yongping (business model, 本分/integrity, punch-card concentration). **Four-master lens (mapped onto the sequential gates).** Each gate is voiced by a master, and the masters are designed to *conflict* — that tension is the anti-blind-spot mechanism: - **段永平** — 商业模式与本质 (gates 1–2): "这是不是一门对的生意?" - **巴菲特** — 护城河、管理层、安全边际 (gates 2, 5, 7): "壁垒深不深? 人可不可信? 够不够便宜?" - **芒格** — 逆向与颠覆 (gate 6): "它会怎么死?" - **李录** — 十年确定性与范式 (gate 6, and the trend field throughout): "十年后它还在吗?" Unlike a parallel scoring panel, moat-funnel runs these **sequentially and gates** rather than averaging them — which is exactly why a cheap price (巴菲特, gate 7) can never be averaged against weak 10-year certainty (李录, gate 6). Force the tension explicitly: when 巴菲特 calls it cheap at gate 7, re-interrogate 李录's gate-6 certainty; when 段永平 calls it a great business at gates 1–2, make 芒格 attack it at gate 6. If the masters don't disagree anywhere, you haven't looked hard enough. ## The two rules that make this skill work **Rule 1 — 顺序即纪律 (Order is discipline).** Gates run in fixed order. The moment any gate returns FAIL, you **HALT** — output the elimination verdict and STOP. You do not proceed to later gates, and above all you do **NOT** compute, estimate, mention, or gesture at valuation. "The moat is weak but it's cheap right now" is the single most dangerous sentence in investing and is BANNED here. A qualitative FAIL is terminal; no later strength can resurrect it. **Rule 2 — 禁止跨关补偿 (No cross-gate compensation). THIS IS NON-NEGOTIABLE.** Never average, weight, or aggregate the gate verdicts into a single composite score (no "7.8/9", no "86% overall"). A composite score silently re-introduces exactly the compensatory logic this skill exists to destroy — it lets a great price or great management offset a broken moat. Each gate stands alone. The overall result is a **qualitative label** (通过 / 停在第N关 / 观察清单), never a number that blends gates together. Finer PASS gradations (below) are for ranking *survivors*, never for summing across gates within one company. If you feel the pull to write "however, at this price…" after a FAIL, or to tally the gates into a score — that pull is the bias this skill exists to defeat. Suppress it. ## Verdict states (per gate) - **PASS+** / **PASS** / **PASS-** — passes the gate; the +/-/plain suffix ranks *how strongly* (used only to compare survivors, never aggregated). - **DEGRADE** — survives but carries a flag; multiple DEGRADEs make the final label weaker and must all surface in the output. - **FAIL** — terminal. HALT. - **UNKNOWN** — evidence insufficient to judge. Triggers the evidence protocol below; never a positive conclusion. ## Evidence protocol Every gate verdict must carry an **evidence grade** for its key claims: - **A** — 官方财报、监管文件、公司公告 (primary filings). - **B** — 权威行业研究、第三方数据库、审计、专家访谈. - **C** — 主流媒体、券商观点、公开访谈. - **D** — 模型推测或间接推断 (inference). **Distinguish factual claims from judgmental inference — this is critical:** - **Factual claims** (moat's concrete source, pricing history, financial figures, management's track record) must rest on **A/B evidence**. A *fact* asserted only from C/D → cannot support a verdict above DEGRADE until better-sourced. - **Judgmental inferences** (will this moat last 10 years? will AI disrupt it? is management truly long-term?) are **inherently inferential and legitimately D-grade** — that is their nature, not a defect. They are allowed to drive a PASS **provided** they are explicitly labelled as inference and their confidence is not overstated. Requiring A/B for these would make the qualitative gates impossible to pass, which is wrong. Rule: **do not launder a C/D *fact* into an A-grade conclusion**, and **do not disguise an inference as an established fact**. Label each accordingly. **Multi-source cross-validation (borrowed discipline).** Every material *numeric* fact (price, market cap, PE, margin, growth, cash) must be corroborated by **≥2 independent sources**. Reconcile them with `scripts/financial_rigor.py cross-validate`; if the spread exceeds tolerance (default ~2%, wider only with reason), the datum is **UNKNOWN** until a primary source (the filing) adjudicates — do not silently pick one. "More data = more certainty" is a fallacy; divergent data means *less* certainty, not more. **UNKNOWN handling:** insufficient evidence → mark UNKNOWN → **must attempt a search with whatever browsing tool is available to fill the gap** → if still insufficient (or no tool exists) → downgrade to **DEGRADE** (never PASS). UNKNOWN items go into **Data Gaps / Watch Items**, never into the positive case. Do not hallucinate to complete a report. ## Execution contract Run the gates **one at a time, in order**. After each gate emit a verdict block (see Output format), then decide: FAIL → HALT; DEGRADE → flag and continue; PASS(+/-) → next gate; UNKNOWN → run evidence protocol. ### Per-gate mini-attack (gates 2–5) Confirmation bias forms *during* the qualitative gates, not at the end. So after judging each of gates 2–5, immediately state the **single strongest counter-argument** to that gate's PASS and re-confirm or revise the verdict. This is a one-line rebuttal, not a full review — the comprehensive cross-module attack still happens at gate 6. ### Gate sequence | # | Gate | File to consult | Nature | |---|------|-----------------|--------| | Pre | 排除清单 Exclusions | `references/exclusions.md` | Fast kill (rebuttable only with A-grade proof of exceptionality) | | 0 | 能力圈 Circle of competence | `references/rubric.md` | Can I explain how it makes money for 10 yrs? | | 1 | 商业模式 Business model | `references/rubric.md` | Is the *model* itself a good business? | | 2 | 护城河 Moat | `references/rubric.md` | **Core gate.** Un-copyable / un-substitutable? + mini-attack | | 3 | 必需性+经常性 Essentiality & recurring | `references/rubric.md` | Must-have? Repeatable revenue? + mini-attack | | 4 | 定价权 Pricing power | `references/rubric.md` | Price > inflation without losing customers? + mini-attack | | 5 | 管理层与文化 Management & culture | `references/rubric.md` | 5 sub-dimensions; Integrity is a veto + mini-attack | | 6 | 颠覆压力测试 Disruption stress test | `references/devils_advocate.md` | **Comprehensive cross-module bear case.** | | 7 | 估值与安全边际 Valuation | `references/rubric.md` (§7) | ONLY NOW open the model. Multi-method. Live data (approach A). | | 8 | 下注/持有/卖出纪律 Sizing & discipline | `references/rubric.md` (§8) | How heavy, how long, when to sell + Next Trigger. | **Always begin by reading `references/exclusions.md` and `references/rubric.md`.** At gate 7, use `scripts/financial_rigor.py` for all valuation arithmetic. Read `references/devils_advocate.md` at gate 6. These hold the actual criteria, sub-dimensions, evidence rules, and self-deception signals — run the funnel from the files, not from memory, so the *same* criteria apply every time. ### Contract clauses (hard rules) 1. Gates 0–6 (qualitative) may **never** cite valuation, price, or cheapness as a reason to PASS. Quality is judged blind to price. 2. Gate 7 (valuation) may **never** overturn an earlier PASS by itself. A great business that is too expensive does **not** FAIL — it goes to a **观察清单 (watchlist)** with a target entry zone. Do **not** bake in a specific trade (e.g. selling puts) as a recommendation; entry *mechanics* like option structures are discussed only when the user explicitly asks, and framed as education, not advice. 3. Gate 6 must produce a **substantive bear case**. A counter-argument only counts as substantive if it has all four of: **concrete mechanism + timescale + trigger condition + observable indicator** — a rebuttal missing any of these is a strawman and does not satisfy the rule. If you cannot generate a *qualifying* disconfirming argument → verdict DEGRADE, never PASS. An un-attackable thesis means you haven't looked hard enough. 4. Never aggregate gates into a composite score (Rule 2). The output is intentionally **sparse** — most companies die early; that is the design working. Do not pad an early elimination into a long essay. 5. Integrity (gate 5, sub-dimension 1) is a **one-vote veto**: an integrity red line → FAIL regardless of every other strength. 6. Passing all gates means the business enters a **high-conviction candidate pool** — it does **not** mean "size it heavily". Position sizing is the user's decision, constrained by their portfolio concentration, liquidity, drawdown tolerance, tax situation, and existing exposure. Never issue a directive to concentrate; surface the constraints instead. ## Data sourcing (approach A — self-contained) Gates 0–6 are **pure qualitative reasoning + qualitative research**. Use **whatever search/browsing tool the environment provides** (e.g. `web_search` where present) for competitive dynamics, management history, industry structure, disruption signals — no hard financials required. If no search tool is available, say so and mark the affected claims as lower-evidence / UNKNOWN rather than guessing. The funnel can run to gate 6 with no privileged data. **Only gate 7 reaches for hard numbers.** Priority: 1. **IBKR tools if connected** (the user's own broker) — real-time price snapshot, fundamentals, and (only if the user asks about entry mechanics) the option chain. Call `tool_search` for the relevant IBKR tool before assuming it is unavailable. 2. **Any available search/browsing tool** (e.g. `web_search`) for multiples, growth history, margins if IBKR data is thin. 3. If neither yields it, state the data gap plainly (evidence grade, UNKNOWN) and give a qualitative read rather than inventing numbers. Never fabricate financials. A stated "couldn't get clean numbers on X" beats a confident wrong figure. **Arithmetic-rigor layer (mandatory at gate 7).** LLM mental math is unreliable — a misplaced decimal or a HKD/CNY unit mix-up can invert a verdict. So at gate 7 you MUST route calculations through `scripts/financial_rigor.py` (Decimal-precise, not float) rather than computing in your head: - `verify-market-cap --price P --shares N --reported R --currency CUR` — hand-check market cap = price × shares against the reported figure; **currency must be stated explicitly, never omitted**. A deviation over tolerance flags a likely unit error → UNKNOWN until reconciled. - `cross-validate --label L --values a,b,c` — reconcile a numeric fact across sources (see evidence protocol). - `reverse-dcf --price P --fcf-per-share F` — recover the market-implied growth rate to expose how optimistic the current price already is. - `three-scenario` / `calc` — scenario target prices and any precise arithmetic. Any key figure quoted in the gate-7 output should have passed through this tool, not been eyeballed. ## Output format **Primary output = Chinese, conclusion-first, pyramid-structured, high information density** — assertive judgment-led prose, no soft hedging verbs, no AI-sounding filler. This is written for the user to read. Lead with the verdict, then the gate-by-gate trace. Each gate's prose should carry its verdict state, evidence grade, trend, and (for gates 2–5) the mini-attack result. ### Per-gate verdict block (inside the prose) ``` 【第N关 · 关卡名】判定:PASS+/PASS/PASS-/DEGRADE/FAIL/UNKNOWN | 证据等级:A/B/C/D | 趋势:改善/稳定/恶化 理由:<一句话核心判断> 证据:<关键支撑,附来源> 最强反驳(第2–5关):<单点看空 + 是否动摇判定> ``` ### Structured appendix (secondary, optional) After the prose, IF the user wants it or is likely to reuse the result, append a machine-readable block. This is an **appendix, not a replacement** for the prose. No composite score field. ```yaml company: overall: 通过 / 停在第N关 / 观察清单 stage_reached: gates: - gate: moat status: PASS+ evidence: A trend: improving reason: [网络效应, 高转换成本] counter: risk: [] fatal_risks: [...] watch_items: [...] data_gaps: [...] # UNKNOWN items land here next_trigger: ``` ### If eliminated (any FAIL) — the common case ``` 结论:淘汰。停在【第N关 · 关卡名】。 一句话死因: 【已通过的关卡】第0关…第N-1关(各一句话 + 证据等级) 【致命关卡】第N关 — <具体不过关的判据> (不进入后续关卡,不评估估值,不给总分。) ``` ### If it survives all qualitative gates → valuation → sizing Full trace through gate 8, ending with **Next Trigger**. Keep sizing and entry as constraint-aware discussion, not directive advice (see clause 6). For a survivor's final deliverable, if `pyramid-word` is available, hand off to render a CLC Word report; otherwise output inline. If `clc-critic` is available, route the gate-6 bear case through it to harden the argument. ## Companion skills (optional, use if present) - **`pyramid-word`** — render the final survivor evaluation as a conclusion-first CLC Word document. - **`clc-critic`** — stress-test the gate-6 disruption case with adversarial review. Optional. If absent, the funnel is fully self-contained and outputs inline. ## Anti-patterns to refuse - Reordering gates so valuation comes early. **Refuse.** Order is the method. - Aggregating gates into a composite score. **Refuse** (Rule 2) — it re-enables cross-gate compensation. (This is the one design choice deliberately NOT adopted from broader four-master frameworks: a 综合 X/5 average lets a cheap price offset weak 10-year certainty, muting the worst dimension. The four-master lens here creates *tension*, never an average.) - Letting the four-master lens become a scoreboard. **Refuse** — the masters disagree to expose blind spots, and their disagreement gates; it is never tallied. - "It failed the moat test but it's cheap/well-run, so…" **Refuse** (clause 1). - Turning an early elimination into a hedged both-sides essay. **Refuse** — output the kill and stop. - Producing a buy/sell recommendation or price target as advice. Reframe as a rubric verdict; note you are not a licensed advisor. - Skipping gate 6's bear case because the company "obviously" passes. **Refuse** — obviousness is when confirmation bias is most dangerous. - Filling an evidence gap with a confident guess. **Refuse** — mark UNKNOWN, search, then DEGRADE if still unresolved.