@v587d/capital-generation 2.6.5 β†’ 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/LICENSE +1 -1
  3. package/README.md +83 -30
  4. package/THIRD_PARTY_NOTICES.md +51 -0
  5. package/capital-config/client.js +58 -2
  6. package/capital-config/client.src.cjs +482 -27
  7. package/capital-config/index.js +177 -4
  8. package/capital-config/package.json +1 -1
  9. package/capital-watchlist/client.js +48 -7
  10. package/capital-watchlist/client.src.cjs +383 -66
  11. package/capital-watchlist/holding-rules.js +64 -0
  12. package/capital-watchlist/index.js +117 -2
  13. package/capital-watchlist/package.json +2 -1
  14. package/chart-ui/package.json +1 -1
  15. package/lib/agents/selected-skills-provider.d.ts +26 -0
  16. package/lib/agents/selected-skills-provider.js +99 -0
  17. package/lib/index.d.ts +13 -0
  18. package/lib/index.js +35 -11
  19. package/lib/time/tools.d.ts +6 -0
  20. package/lib/time/tools.js +6 -1
  21. package/lib/watchlist/tools.d.ts +52 -0
  22. package/lib/watchlist/tools.js +146 -0
  23. package/lib/web-retriever/local-fetch.d.ts +1 -1
  24. package/lib/web-retriever/local-fetch.js +1 -1
  25. package/lib/web-retriever/wind-client.d.ts +1 -1
  26. package/lib/web-retriever/wind-client.js +1 -1
  27. package/package.json +13 -3
  28. package/preset/capital-generation/agent.patch.yml +7 -0
  29. package/preset/capital-generation/skills/capital-equity-research/SKILL.md +45 -0
  30. package/preset/capital-generation/skills/capital-event-impact/SKILL.md +29 -0
  31. package/preset/capital-generation/skills/capital-portfolio-review/SKILL.md +29 -0
  32. package/selected-skills/InvestSkill/ADDING-NEW-SKILLS.md +546 -0
  33. package/selected-skills/InvestSkill/CHANGELOG.md +373 -0
  34. package/selected-skills/InvestSkill/CI-CD-GUIDE.md +432 -0
  35. package/selected-skills/InvestSkill/CLAUDE.md +148 -0
  36. package/selected-skills/InvestSkill/CONTRIBUTING.md +291 -0
  37. package/selected-skills/InvestSkill/DEPLOYMENTS.md +321 -0
  38. package/selected-skills/InvestSkill/FAQ.md +509 -0
  39. package/selected-skills/InvestSkill/GEMINI.md +419 -0
  40. package/selected-skills/InvestSkill/LICENSE +21 -0
  41. package/selected-skills/InvestSkill/PLATFORM-COMPATIBILITY.md +529 -0
  42. package/selected-skills/InvestSkill/README-claude-code.md +435 -0
  43. package/selected-skills/InvestSkill/README-cursor.md +475 -0
  44. package/selected-skills/InvestSkill/README-gemini.md +532 -0
  45. package/selected-skills/InvestSkill/README-ollama.md +106 -0
  46. package/selected-skills/InvestSkill/README-zh-TW.md +461 -0
  47. package/selected-skills/InvestSkill/README.md +311 -0
  48. package/selected-skills/InvestSkill/RELEASE-QUICK-REFERENCE.md +230 -0
  49. package/selected-skills/InvestSkill/RELEASE_NOTES.md +121 -0
  50. package/selected-skills/InvestSkill/SECURITY.md +232 -0
  51. package/selected-skills/InvestSkill/TODO.md +28 -0
  52. package/selected-skills/InvestSkill/UPSTREAM.md +62 -0
  53. package/selected-skills/InvestSkill/install.sh +212 -0
  54. package/selected-skills/InvestSkill/package.json +64 -0
  55. package/selected-skills/InvestSkill/plugins/us-stock-analysis/README.md +119 -0
  56. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/10k-digest/SKILL.md +338 -0
  57. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/bear-case/SKILL.md +233 -0
  58. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/catalyst-calendar/SKILL.md +327 -0
  59. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/chart-master/SKILL.md +648 -0
  60. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/competitor-analysis/SKILL.md +478 -0
  61. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/dcf-valuation/SKILL.md +109 -0
  62. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/dividend-analysis/SKILL.md +684 -0
  63. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/earnings-call-analysis/SKILL.md +456 -0
  64. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/earnings-preview/SKILL.md +277 -0
  65. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/economics-analysis/SKILL.md +349 -0
  66. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/etf-analysis/SKILL.md +279 -0
  67. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/fact-check/SKILL.md +288 -0
  68. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/financial-report-analyst/SKILL.md +544 -0
  69. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/full-report/SKILL.md +301 -0
  70. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/fundamental-analysis/SKILL.md +67 -0
  71. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/industry-map/SKILL.md +336 -0
  72. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/insider-trading/SKILL.md +502 -0
  73. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/institutional-ownership/SKILL.md +548 -0
  74. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/learning-coach/SKILL.md +311 -0
  75. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/options-analysis/SKILL.md +495 -0
  76. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/portfolio-review/SKILL.md +465 -0
  77. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/position-ladder/SKILL.md +429 -0
  78. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/report-generator/SKILL.md +857 -0
  79. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/research-bundle/SKILL.md +94 -0
  80. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/result-validator/SKILL.md +174 -0
  81. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/risk-stress-test/SKILL.md +293 -0
  82. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/sector-analysis/SKILL.md +426 -0
  83. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/short-interest/SKILL.md +397 -0
  84. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-eval/SKILL.md +645 -0
  85. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-screener/SKILL.md +244 -0
  86. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/stock-valuation/SKILL.md +640 -0
  87. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/tax-lens/SKILL.md +351 -0
  88. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/technical-analysis/SKILL.md +654 -0
  89. package/selected-skills/InvestSkill/plugins/us-stock-analysis/skills/thesis-tracker/SKILL.md +317 -0
  90. package/selected-skills/README.md +54 -0
  91. package/selected-skills/catalog.js +733 -0
  92. package/selected-skills/china-stock-research-skills/.github/ISSUE_TEMPLATE/bug_report.md +35 -0
  93. package/selected-skills/china-stock-research-skills/.github/ISSUE_TEMPLATE/skill_request.md +28 -0
  94. package/selected-skills/china-stock-research-skills/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  95. package/selected-skills/china-stock-research-skills/CHANGELOG.md +59 -0
  96. package/selected-skills/china-stock-research-skills/CONTRIBUTING.md +121 -0
  97. package/selected-skills/china-stock-research-skills/GITHUB_PUBLISHING.md +259 -0
  98. package/selected-skills/china-stock-research-skills/INSTALL.md +151 -0
  99. package/selected-skills/china-stock-research-skills/LICENSE +21 -0
  100. package/selected-skills/china-stock-research-skills/PUBLISH_CHECKLIST.md +165 -0
  101. package/selected-skills/china-stock-research-skills/README.en.md +209 -0
  102. package/selected-skills/china-stock-research-skills/README.md +209 -0
  103. package/selected-skills/china-stock-research-skills/RELEASE_ASSETS.md +222 -0
  104. package/selected-skills/china-stock-research-skills/ROADMAP.md +45 -0
  105. package/selected-skills/china-stock-research-skills/SKILLS.md +85 -0
  106. package/selected-skills/china-stock-research-skills/UPSTREAM.md +11 -0
  107. package/selected-skills/china-stock-research-skills/examples/full-report-flow.md +20 -0
  108. package/selected-skills/china-stock-research-skills/examples/module-select-cases.md +26 -0
  109. package/selected-skills/china-stock-research-skills/examples/quickstart-prompts.md +25 -0
  110. package/selected-skills/china-stock-research-skills/skills/business-decomposition-order-quality/SKILL.md +55 -0
  111. package/selected-skills/china-stock-research-skills/skills/business-decomposition-order-quality/references/idc-order-ledger-guide.md +34 -0
  112. package/selected-skills/china-stock-research-skills/skills/business-decomposition-order-quality/references/order-quality-checklist.md +16 -0
  113. package/selected-skills/china-stock-research-skills/skills/china-stock-research-orchestrator/SKILL.md +75 -0
  114. package/selected-skills/china-stock-research-skills/skills/china-stock-research-orchestrator/references/final-output-contract.md +62 -0
  115. package/selected-skills/china-stock-research-skills/skills/china-stock-research-orchestrator/references/routing-matrix.md +34 -0
  116. package/selected-skills/china-stock-research-skills/skills/china-stock-research-orchestrator/references/sector-overlay-escalation-rules.md +38 -0
  117. package/selected-skills/china-stock-research-skills/skills/financial-health/SKILL.md +54 -0
  118. package/selected-skills/china-stock-research-skills/skills/financial-health/references/idc-balance-sheet-stress-guide.md +31 -0
  119. package/selected-skills/china-stock-research-skills/skills/financial-health/references/red-flag-checklist.md +14 -0
  120. package/selected-skills/china-stock-research-skills/skills/industry-competition-moat/SKILL.md +54 -0
  121. package/selected-skills/china-stock-research-skills/skills/industry-competition-moat/references/idc-value-chain-and-peers.md +42 -0
  122. package/selected-skills/china-stock-research-skills/skills/industry-competition-moat/references/moat-grid.md +13 -0
  123. package/selected-skills/china-stock-research-skills/skills/risk-warning-catalysts/SKILL.md +54 -0
  124. package/selected-skills/china-stock-research-skills/skills/risk-warning-catalysts/references/idc-monitoring-indicators.md +33 -0
  125. package/selected-skills/china-stock-research-skills/skills/risk-warning-catalysts/references/monitoring-dashboard.md +25 -0
  126. package/selected-skills/china-stock-research-skills/skills/shared/references/analysis-pattern-selector.md +24 -0
  127. package/selected-skills/china-stock-research-skills/skills/shared/references/asset-heavy-ramp-overlay.md +28 -0
  128. package/selected-skills/china-stock-research-skills/skills/shared/references/business-model-transition-overlay.md +28 -0
  129. package/selected-skills/china-stock-research-skills/skills/shared/references/citation-standard.md +48 -0
  130. package/selected-skills/china-stock-research-skills/skills/shared/references/company-disclosure-map.md +37 -0
  131. package/selected-skills/china-stock-research-skills/skills/shared/references/consumer-channel-brand-overlay.md +29 -0
  132. package/selected-skills/china-stock-research-skills/skills/shared/references/cyclical-price-driven-overlay.md +29 -0
  133. package/selected-skills/china-stock-research-skills/skills/shared/references/export-manufacturing-supply-chain-overlay.md +29 -0
  134. package/selected-skills/china-stock-research-skills/skills/shared/references/financial-kpi-dictionary.md +43 -0
  135. package/selected-skills/china-stock-research-skills/skills/shared/references/idc-heavy-asset-transition-overlay.md +73 -0
  136. package/selected-skills/china-stock-research-skills/skills/shared/references/language-output-standard.md +36 -0
  137. package/selected-skills/china-stock-research-skills/skills/shared/references/project-order-business-overlay.md +28 -0
  138. package/selected-skills/china-stock-research-skills/skills/shared/references/regulated-healthcare-policy-overlay.md +29 -0
  139. package/selected-skills/china-stock-research-skills/skills/shared/references/research-output-template.md +50 -0
  140. package/selected-skills/china-stock-research-skills/skills/shared/references/sector-adaptation-checklist.md +42 -0
  141. package/selected-skills/china-stock-research-skills/skills/shared/references/source-registry.md +49 -0
  142. package/selected-skills/china-stock-research-skills/skills/shared/templates/catalyst-calendar.md +5 -0
  143. package/selected-skills/china-stock-research-skills/skills/shared/templates/company-fact-sheet.md +25 -0
  144. package/selected-skills/china-stock-research-skills/skills/shared/templates/evidence-table.md +5 -0
  145. package/selected-skills/china-stock-research-skills/skills/shared/templates/idc-project-ledger.md +5 -0
  146. package/selected-skills/china-stock-research-skills/skills/shared/templates/valuation-scenario-table.md +7 -0
  147. package/selected-skills/china-stock-research-skills/skills/strategy-business-transition/SKILL.md +55 -0
  148. package/selected-skills/china-stock-research-skills/skills/strategy-business-transition/references/idc-transition-markers.md +27 -0
  149. package/selected-skills/china-stock-research-skills/skills/strategy-business-transition/references/transition-scorecard.md +13 -0
  150. package/selected-skills/china-stock-research-skills/skills/valuation-investment-strategy/SKILL.md +55 -0
  151. package/selected-skills/china-stock-research-skills/skills/valuation-investment-strategy/references/idc-valuation-overlays.md +31 -0
  152. package/selected-skills/china-stock-research-skills/skills/valuation-investment-strategy/references/method-selection.md +14 -0
  153. package/selected-skills/investment-skills/.github/workflows/validate.yml +25 -0
  154. package/selected-skills/investment-skills/.tbd/config.yml +107 -0
  155. package/selected-skills/investment-skills/LICENSE +21 -0
  156. package/selected-skills/investment-skills/Makefile +29 -0
  157. package/selected-skills/investment-skills/README.md +253 -0
  158. package/selected-skills/investment-skills/UPSTREAM.md +12 -0
  159. package/selected-skills/investment-skills/docs/development.md +37 -0
  160. package/selected-skills/investment-skills/docs/roadmap.md +25 -0
  161. package/selected-skills/investment-skills/skills/buffett-investment-framework/SKILL.md +192 -0
  162. package/selected-skills/investment-skills/skills/buffett-investment-framework/agents/openai.yaml +4 -0
  163. package/selected-skills/investment-skills/skills/buffett-investment-framework/references/00-source-key.md +82 -0
  164. package/selected-skills/investment-skills/skills/buffett-investment-framework/references/01-decision-posture.md +242 -0
  165. package/selected-skills/investment-skills/skills/buffett-investment-framework/references/02-business-economics.md +188 -0
  166. package/selected-skills/investment-skills/skills/buffett-investment-framework/references/03-management-governance.md +213 -0
  167. package/selected-skills/investment-skills/skills/buffett-investment-framework/references/04-financial-reality.md +192 -0
  168. package/selected-skills/investment-skills/skills/buffett-investment-framework/references/05-valuation.md +166 -0
  169. package/selected-skills/investment-skills/skills/buffett-investment-framework/references/06-capital-allocation.md +238 -0
  170. package/selected-skills/investment-skills/skills/buffett-investment-framework/references/07-risk-monitoring.md +189 -0
  171. package/selected-skills/investment-skills/skills/buffett-investment-framework/references/08-specialized-overlays.md +309 -0
  172. package/selected-skills/investment-skills/skills/buffett-investment-framework/scripts/framework.py +470 -0
@@ -0,0 +1,279 @@
1
+ ---
2
+ name: etf-analysis
3
+ description: ETF / index-fund due diligence β€” expense ratio vs. category, tracking difference, liquidity, holdings concentration and tilt, overlap with your other positions, distribution and capital-gains history, structure warnings, and an ETF-vs-top-holdings comparison, scored as an ETF Fitness Score 0–10
4
+ ---
5
+
6
+ # ETF Analysis β€” What You Actually Own, and What It Costs You
7
+
8
+ ## ⚠️ Data Verification β€” Do This Before Any Analysis
9
+
10
+ Before running any analysis, always retrieve the latest fund data for the ticker:
11
+
12
+ 1. **Fetch current price and NAV** β€” get the live price, the fund's net asset value, and the premium/discount to NAV through the host's own data path; delegate the request in a role-split host. Never assume a price from training data.
13
+ 2. **Confirm the fund facts from the issuer** β€” expense ratio, index tracked, AUM, inception date, holdings count, top-10 weights, and distribution history come from the issuer's factsheet and prospectus, not from memory. Fund facts change: expense ratios get cut, indexes get swapped, funds get merged or closed.
14
+ 3. **State your data source** β€” fill in the `Data & Sources` header (next section) so the origin, as-of date, retrieval path, and confidence of every figure are explicit at the top of the output.
15
+ 4. **Stop on missing data** β€” if a figure cannot be retrieved through the host's data path, name what is missing and stop; the analysis does not run on remembered values:
16
+
17
+ > ⚠️ **Data unavailable.** <list the figures this analysis could not retrieve>. Those fields are reported as missing and are not estimated β€” retrieval is a precondition, not a nicety.
18
+
19
+ Never substitute a remembered value for a retrieved one. Getting the factsheet is the host data path's job β€” delegate it; asking the user is the last resort only where the host has no retrieval path at all.
20
+
21
+ ---
22
+
23
+ ## πŸ“‹ Data & Sources Header β€” Open Every Output With It
24
+
25
+ The first thing in the output is this provenance block, filled in β€” never left as placeholders. It is the standard documented on the [Data & Accuracy](https://yennanliu.github.io/InvestSkill/data-and-accuracy.html) page and the first thing `result-validator` looks for:
26
+
27
+ ```
28
+ Data & Sources
29
+ As of: <date the figures represent, e.g. 2026-06-30>
30
+ Source: <primary docs β€” SEC EDGAR 10-K/10-Q, company IR, FRED, exchange data …>
31
+ Retrieval: <delegated retrieval | web/tool retrieval | pasted by user>
32
+ Confidence: <HIGH | MEDIUM | LOW>
33
+ ```
34
+
35
+ - Memory is not a retrieval path. A figure that was neither retrieved nor supplied by the user is reported as missing, never estimated β€” and never written into this block as if it had been retrieved.
36
+ - Mixed sources: list each with its own as-of date rather than blending them.
37
+ - Data the user pasted is reported as `pasted by user`; do not upgrade its confidence beyond what the user's own source supports.
38
+
39
+ ---
40
+
41
+ ## Overview
42
+
43
+ Most portfolios are built on an ETF core, yet every other framework in this catalog evaluates a single company. Nobody asks the questions that decide whether an ETF is a good *vehicle*: what does it cost to hold, does it deliver the index it promises, can you get out of it, what is actually inside it, and how much of it do you already own through other positions?
44
+
45
+ **This skill is due diligence on the wrapper, not a market call.** It does not predict whether US large caps will outperform; `sector-analysis` and `economics-analysis` do that. It answers: *given that you want this exposure, is this fund a fit way to get it β€” and is it a fit for the portfolio you already have?* The output is an **ETF Fitness Score (0–10)** built from cost, tracking, liquidity, what-you-own, overlap, distributions, and structure, plus a direct comparison against two or three peers and against simply buying the top five holdings.
46
+
47
+ **Where it sits.** `stock-screener` ranks stocks; `portfolio-review` judges the whole portfolio; `sector-analysis` picks where to be. This skill sits between them: it vets the fund that would carry the exposure, then hands the result to `portfolio-review` (does it fit the allocation?), `risk-stress-test` (what does it do in a drawdown?), and `tax-lens` (what does the wrapper cost after tax?).
48
+
49
+ ---
50
+
51
+ ## 1. Inputs
52
+
53
+ | Input | Required | Default if unstated |
54
+ |-------|----------|---------------------|
55
+ | ETF ticker(s) β€” one fund, or several to compare | βœ… | β€” |
56
+ | The exposure the user *thinks* they are buying ("US large cap", "global ex-US", "dividend growth") | recommended | infer from the fund name and index, and say so |
57
+ | Current holdings with weights (tickers, other funds) | optional β€” required for the overlap section | overlap reported as "not assessed" and its 15% weight redistributed (Phase 9) |
58
+ | Intended purchase size (as % of the post-purchase portfolio) | optional β€” required for post-purchase exposure | 10% of the portfolio, stated |
59
+ | Account type (taxable / IRA / non-US) | optional | taxable US assumed; state it |
60
+ | Holding horizon | optional | 5+ years |
61
+
62
+ **Overlap and tilt need holdings data.** Top-10 weights are on every factsheet; the full holdings file (issuer CSV) is needed for an exact overlap or factor tilt. If the user has not pasted it, compute from the top 10 only, label the result as a lower bound, and say what file would sharpen it.
63
+
64
+ ---
65
+
66
+ ## 2. Framework
67
+
68
+ ### Phase 1 β€” Fund card
69
+
70
+ Establish the facts before any judgment:
71
+
72
+ | Field | Why it matters |
73
+ |-------|----------------|
74
+ | Issuer, ticker, inception date | Funds under 3 years old have no full-cycle record; funds under $100M AUM have closure risk |
75
+ | Index tracked (or "active") | The index *is* the strategy β€” read its methodology: cap-weighted? screened? rebalanced when? |
76
+ | Expense ratio (net, after waivers) and waiver expiry | A fee waiver that expires is a fee increase with a date |
77
+ | Structure: physical replication / sampling / synthetic (swap) / ETN / grantor trust / commodity pool | Determines counterparty risk, tax form, and whether "holdings" means anything |
78
+ | Legal domicile (US 1940-Act ETF, Irish UCITS, …) | Drives withholding tax and estate-tax exposure for non-US holders |
79
+ | Distribution policy (accumulating / distributing, frequency) | Matters for taxable accounts and for income users |
80
+
81
+ ### Phase 2 β€” Cost and tracking
82
+
83
+ **Expense ratio vs. category.** Compare to the median for funds tracking the *same kind* of index, not to "all ETFs":
84
+
85
+ | Category | Cheap | Expensive | Needs a reason |
86
+ |----------|-------|-----------|----------------|
87
+ | Broad US large-cap index | ≀ 0.05% | > 0.20% | > 0.75% |
88
+ | Broad international developed / EM index | ≀ 0.10% | > 0.35% | > 0.75% |
89
+ | Sector, factor, dividend, thematic | ≀ 0.15% | > 0.50% | > 0.95% |
90
+ | Active, leveraged, inverse, alternatives | ≀ 0.50% | > 1.00% | β€” (the whole product needs a reason) |
91
+
92
+ **Tracking difference vs. tracking error β€” keep them apart.**
93
+ - **Tracking difference** = fund total return βˆ’ index total return over a period. This is the *cost you actually paid*. For a well-run physical fund it should be close to βˆ’(expense ratio); a fund that trails its index by more than the expense ratio every year is leaking money (sampling, cash drag, poor securities lending, withholding tax at the fund level).
94
+ - **Tracking error** = the standard deviation of that difference. It measures *consistency*, not cost. Low tracking error with a large negative tracking difference is a fund that reliably underperforms.
95
+
96
+ Report the 1-, 3-, and 5-year tracking difference from the issuer's own performance table (NAV return vs. index return). Flag a **tracking gap** whenever |tracking difference| exceeds the expense ratio by more than 0.10% per year β€” and say which direction (a *positive* gap usually means securities-lending revenue, which is fine but not guaranteed).
97
+
98
+ ### Phase 3 β€” Liquidity and closure risk
99
+
100
+ | Metric | Comfortable | Caution | Warning |
101
+ |--------|-------------|---------|---------|
102
+ | AUM | > $1B | $100M – $1B | < $100M (closure risk; issuers cull small funds) |
103
+ | Average daily $ volume | > $10M | $1M – $10M | < $1M (use limit orders, avoid the open/close) |
104
+ | Bid-ask spread (median, %) | ≀ 0.05% | 0.05% – 0.25% | > 0.25% (a round trip costs more than a year of fees) |
105
+ | Premium/discount to NAV (typical range) | Β±0.10% | Β±0.50% | wider, or persistently one-sided |
106
+
107
+ Note the caveat that matters: ETF liquidity comes from the underlying basket, not only from the ETF's own volume β€” a thinly traded ETF on liquid large caps trades fine with limit orders; a heavily traded ETF on illiquid bonds does not. Say which case applies.
108
+
109
+ ### Phase 4 β€” What you own
110
+
111
+ - **Holdings count** and **top-10 weight**. Flag concentration when top-10 > 40% for a "broad" fund, or when a single name > 10%. Cap-weighted indexes concentrate in bull markets β€” a fund that was diversified five years ago may not be now.
112
+ - **Sector tilt** β€” the fund's sector weights vs. the broad benchmark the user thinks they are buying (e.g. the total US market). Report the three largest over/under-weights in percentage points.
113
+ - **Factor tilt** β€” size, value/growth, quality, momentum, low-vol, yield: which way does the index methodology lean, and does the user know it? A "dividend" fund is usually a value + low-growth tilt; an "equal-weight" fund is a small-cap tilt.
114
+ - **Country / currency exposure** for international funds β€” and whether the fund is currency-hedged (a bet on the dollar, held whether the user wants it or not).
115
+ - **Look-through**: if the fund holds other funds, look through to the final securities.
116
+
117
+ ### Phase 5 β€” Overlap with the user's other holdings
118
+
119
+ With the holdings the user supplied, compute **overlap by weight**:
120
+
121
+ 1. **Look through** every existing fund position to its underlying securities (top holdings from the issuer's factsheet; label the coverage β€” "top 10 = 34% of the fund" β€” so the reader knows the rest is unassessed). Existing single stocks are their own exposure.
122
+ 2. Express both sides as weights of the **same denominator**: the candidate ETF's holdings as % of the ETF; the existing portfolio's look-through exposures as % of the existing portfolio.
123
+ 3. **Overlap % = Ξ£ over shared securities of min(weight in ETF, weight in existing portfolio).** This is the share of the ETF that duplicates what the user already owns, on a like-for-like basis.
124
+ 4. With the **intended purchase size** *p* (as % of the post-purchase portfolio; default 10%, stated), compute the post-purchase exposure to each shared name: (1 βˆ’ p) Γ— existing weight + p Γ— ETF weight.
125
+
126
+ Report:
127
+
128
+ - Overlap % (by weight) and the duplicated names, largest first; the look-through coverage used.
129
+ - The *effective* post-purchase exposure to the top duplicated names (e.g. "at a 10% purchase you would own the largest holding through three vehicles at a combined 11% of the portfolio").
130
+ - A plain verdict: **redundant** (> 60% overlap β€” this is the same bet in a second wrapper), **partially overlapping** (25–60% β€” fine if intentional), **complementary** (< 25%).
131
+
132
+ Without a holdings file, report the top-10-only overlap as a lower bound and say so.
133
+
134
+ ### Phase 6 β€” Distributions and taxes
135
+
136
+ - Trailing 12-month distribution yield and its **composition**: qualified dividends, non-qualified income, return of capital, capital gains. REIT-, bond-, and commodity-heavy funds pay mostly non-qualified income taxed at ordinary rates.
137
+ - **Capital-gains distributions, last 5 years.** Most equity ETFs distribute none, because in-kind creation/redemption lets them hand appreciated shares to authorized participants instead of selling them; a mutual fund cannot. An equity ETF that *has* distributed gains (heavy rebalancing, index reconstitution, small AUM with big redemptions) deserves a note. Bond and commodity funds are a different matter.
138
+ - **Tax form**: 1099 for ordinary ETFs; **K-1** and 60/40 treatment for many commodity and volatility funds structured as partnerships; grantor-trust rules for physically backed metals. A K-1 is a paperwork and timing cost, not just a tax rate.
139
+ - Hand the detail to `tax-lens` β€” this skill flags, that one computes.
140
+
141
+ ### Phase 7 β€” Structure warnings
142
+
143
+ State any that apply, in a box the reader cannot miss:
144
+
145
+ | Structure | Warning to print |
146
+ |-----------|-----------------|
147
+ | Leveraged (2Γ—, 3Γ—) or inverse | Resets daily. Over more than a day, path dependence ("volatility decay") means the return is *not* 2Γ— or βˆ’1Γ— the index. A holding tool for days, not years β€” say so even if the user asked for a long-term view |
148
+ | Synthetic / swap-based | The fund holds a swap, not the securities. Counterparty exposure to the swap provider; "holdings" listed are collateral |
149
+ | ETN | An unsecured note issued by a bank. If the issuer fails, the ETN fails, regardless of the index. Check the issuer's credit and whether the ETN is still creating shares (closed ETNs trade at wild premiums) |
150
+ | Single-stock ETF | A leveraged or option-overlaid position in one company. Concentration + decay + fees β€” nearly always dominated by owning the stock |
151
+ | Commodity pool / futures-based | Roll yield (contango) can make the fund diverge sharply from spot; K-1 tax form; not an investment in the physical commodity |
152
+ | Currency-hedged | Embeds a short position in the foreign currency; hedging cost β‰ˆ the interest-rate differential |
153
+ | Covered-call / buffer / defined-outcome | Caps upside by design; the "yield" is option premium, partly return of your own capital. Compare total return, never headline yield |
154
+ | Actively managed | Compare to the cheapest index fund in the same category over the manager's tenure, not to the category average |
155
+
156
+ ### Phase 8 β€” Alternatives and the direct-ownership check
157
+
158
+ - **Peers**: two or three funds tracking the same or a very similar index. Compare expense ratio, 3-yr tracking difference, AUM, spread, and structure in one table. Prefer the cheapest fund with the smallest tracking gap and adequate liquidity β€” everything else is marketing.
159
+ - **ETF vs. buying the top 5 holdings directly**: what share of the fund's weight the top 5 represent, the fund's fee on that share, what the investor would give up (the other Nβˆ’5 holdings, rebalancing, dividend reinvestment convenience) and what they would gain (zero ongoing fee, tax-lot control, no tracking gap). For a broad fund with top-5 weight under 25%, direct ownership is a different, more concentrated bet β€” say so. For a "sector" fund where the top 5 are 60%+ of the weight, direct ownership is a serious alternative.
160
+
161
+ ### Phase 9 β€” ETF Fitness Score (0–10)
162
+
163
+ The headline number. It measures **fitness of the vehicle for the stated exposure and portfolio**, not the attractiveness of the asset class.
164
+
165
+ | Component | Weight | 10 looks like | 0 looks like |
166
+ |-----------|--------|---------------|--------------|
167
+ | Cost & tracking | 25% | Cheapest quartile for its category; tracking difference β‰ˆ βˆ’ER with no gap | Expensive for the category *and* a tracking gap > 0.25%/yr |
168
+ | Liquidity & viability | 15% | AUM > $1B, spread ≀ 0.05%, tight to NAV | AUM < $100M or spread > 0.25% or persistent discount |
169
+ | What you own vs. what you wanted | 20% | Index methodology matches the stated exposure; tilts disclosed and acceptable | The fund is a different bet than the user thinks (hidden factor/country/currency tilt, top-10 > 50%) |
170
+ | Overlap with existing holdings | 15% | < 25% overlap, or overlap is intentional | > 60% overlap β€” a duplicate position |
171
+ | Distribution & tax efficiency | 10% | No capital-gains distributions; income mostly qualified; 1099 | Regular gains distributions; K-1; non-qualified income in a taxable account |
172
+ | Structure | 15% | Plain physical replication | Leveraged/inverse, ETN, or single-stock held as a long-term position |
173
+
174
+ **Hard caps**: a leveraged/inverse/single-stock fund evaluated for a horizon longer than a few weeks caps at **3.0**; an ETN caps at **5.0**; > 60% overlap caps at **5.0**. State any cap that fired.
175
+
176
+ **When overlap is not assessed** (no holdings supplied): drop the component and **renormalize the remaining five weights to 100%** (Cost & tracking 29.4% Β· Liquidity 17.6% Β· What you own 23.5% Β· Distribution 11.8% Β· Structure 17.6%), print `Overlap: not assessed β€” supply holdings for the full score` under the score, and cap Confidence at MEDIUM. Never score an unassessed component as 10 or as 0.
177
+
178
+ ---
179
+
180
+ ## 3. Output Format
181
+
182
+ ```
183
+ Data & Sources Β· as of Β· issuer factsheet Β· fund prospectus Β· retrieval Β· confidence
184
+
185
+ 1. Fund card ticker Β· issuer Β· index tracked Β· inception Β· AUM Β· expense ratio Β· structure Β· domicile
186
+ 2. Cost & tracking expense ratio vs. category median Β· 1/3/5-yr tracking difference Β· tracking gap flag Β· spread Β· ADV
187
+ 3. What you own #holdings Β· top-10 weight Β· sector / factor / country / currency tilt Β· concentration flag
188
+ 4. Overlap % overlap by weight with the user's holdings Β· duplicated names Β· verdict (redundant / partial / complementary)
189
+ 5. Distributions trailing yield Β· composition (qualified / ordinary / ROC / gains) Β· capital-gains distributions (last 5 yrs) Β· tax form
190
+ 6. Structure risks leveraged / inverse / synthetic / ETN / single-stock / commodity / hedged / covered-call β†’ warning box
191
+ 7. Alternatives 2–3 peers in one table Β· "vs. top-5 holdings directly" table
192
+ 8. ETF Fitness Score 0–10 with the six sub-scores and any cap that fired β†’ Thesis Invalidation β†’ signal block
193
+ ```
194
+
195
+ When several tickers are given, produce sections 1–6 per fund compactly, then one comparison table, then one score per fund.
196
+
197
+ ---
198
+
199
+ ## Example
200
+
201
+ ```
202
+ User: Is VOO or SPYM the better core holding? I already hold VTI at 40% of my portfolio.
203
+
204
+ The assistant builds the fund card for both (same index family β€” S&P 500 β€” so the
205
+ comparison collapses to cost, tracking, liquidity and share price), pulls the issuer
206
+ performance tables to compare 1/3/5-yr tracking difference against each fund's expense
207
+ ratio, notes that both are physical, distributing, 1099 funds with no capital-gains
208
+ distributions in the record supplied, and that either is liquid enough for any retail
209
+ order with a limit. Then it runs the overlap check against VTI: an S&P 500 fund is
210
+ roughly four-fifths of a total-US-market fund by weight, so the overlap is high and the
211
+ verdict is "redundant β€” you already own this exposure through VTI; adding either fund
212
+ raises large-cap concentration without adding a new bet." Both funds score well on
213
+ fitness in isolation; the report's headline is the overlap finding, and the suggested
214
+ next step is `portfolio-review` to decide whether the user actually wants *more* US
215
+ large cap, or `etf-analysis` on an international or small-cap fund instead.
216
+ ```
217
+
218
+ ---
219
+
220
+ ## Notes
221
+
222
+ - **This is vehicle due diligence, not a market view.** Do not score the asset class. A perfectly built fund on an exposure the user should not own still gets a high Fitness Score β€” pair with `sector-analysis` or `economics-analysis` for whether to own it, and `portfolio-review` for how much.
223
+ - **Never invent fund statistics.** Expense ratios, AUM, tracking figures, and holdings change; if the issuer page or factsheet was not retrieved or pasted, say "not verified" rather than recalling a number.
224
+ - **Read the index methodology.** Two funds with similar names can track very different indexes (screened vs. unscreened, capped vs. uncapped, quarterly vs. annual rebalancing). The methodology document, not the fund name, is the strategy.
225
+ - **Non-US investors** (including readers using the Traditional Chinese site): a US-domiciled ETF exposes a non-resident holder to 30% (or treaty-rate) withholding on distributions and to US estate-tax exposure above a low exemption; an Irish-domiciled UCITS equivalent typically suffers 15% withholding at the fund level and no US estate-tax exposure, at a somewhat higher expense ratio and, for accumulating share classes, no distributions at all. Name the UCITS equivalent when one exists and hand the arithmetic to `tax-lens --non-us`.
226
+ - **Overlap arithmetic depends on the data supplied.** Top-10-only overlap is a lower bound; label it. Full holdings files are downloadable from every major issuer.
227
+ - **Bond, commodity, and alternative ETFs** need the extra questions this skill only flags (duration, credit quality, roll yield, collateral). Say when the fund is outside the equity-index case this framework is built for.
228
+ - Pairs with: `portfolio-review` (allocation fit), `risk-stress-test` (drawdown behaviour), `tax-lens` (after-tax cost), `sector-analysis` / `stock-screener` (whether the exposure is worth owning at all).
229
+
230
+ ## Thesis Invalidation
231
+
232
+ After delivering the analysis signal, specify what would reverse it:
233
+
234
+ **If signal is BULLISH (the fund is a fit vehicle) β€” the verdict breaks if:**
235
+ - The tracking difference widens beyond βˆ’(expense ratio + 0.10%) in the next annual performance table β€” the fund has started leaking
236
+ - The issuer changes the index, raises the fee, lets a waiver expire, or announces a merger or liquidation (AUM falling below ~$50M is the early warning)
237
+ - The fund's concentration crosses the thresholds above (top-10 > 40%, single name > 10%) so that "broad" is no longer true
238
+ - The user's other holdings change such that the overlap verdict moves from complementary to redundant
239
+
240
+ **If signal is BEARISH (the fund is not a fit vehicle) β€” the verdict breaks if:**
241
+ - A fee cut or a fixed tracking gap removes the cost objection (re-run against the peers)
242
+ - The user's stated exposure changes so that the tilt this fund carries is now the intended bet
243
+ - The overlap objection disappears because the duplicated position is sold
244
+ - For a structure warning: the user's horizon and purpose genuinely match the product (a multi-day hedge with an inverse fund, for example) β€” the warning still prints, the cap may be lifted
245
+
246
+ **Re-run this analysis when:**
247
+ - [ ] The issuer publishes its annual performance / tracking table
248
+ - [ ] Any change to expense ratio, index, or fund structure is announced
249
+ - [ ] The user adds or removes a position large enough to change the overlap verdict
250
+ - [ ] AUM falls below $100M or the spread widens persistently
251
+ - [ ] 12 months have elapsed
252
+
253
+ ## Standard Signal Output
254
+
255
+ This skill measures **vehicle fitness, not market direction**, so state the mapping: `Signal: BULLISH` means the fund is a fit way to hold the stated exposure for this portfolio; `NEUTRAL` means it is acceptable but a cheaper, better-tracking, or less overlapping alternative exists (name it); `BEARISH` means do not use this wrapper (structure cap fired, redundant overlap, or a tracking gap that peers do not have). `Action: BUY` here means "this fund is fit for the purpose" β€” it is not a view on the asset class. Read *whether* to own the exposure from `sector-analysis` or `portfolio-review`, not from this block.
256
+
257
+ All analysis concludes with this standardized block:
258
+
259
+ ```
260
+ ╔══════════════════════════════════════════════╗
261
+ β•‘ INVESTMENT SIGNAL β•‘
262
+ ╠══════════════════════════════════════════════╣
263
+ β•‘ Signal: BULLISH / NEUTRAL / BEARISH β•‘
264
+ β•‘ Confidence: HIGH / MEDIUM / LOW β•‘
265
+ β•‘ Horizon: SHORT / MEDIUM / LONG-TERM β•‘
266
+ β•‘ Score: X.X / 10 β•‘
267
+ ╠══════════════════════════════════════════════╣
268
+ β•‘ Action: BUY / HOLD / SELL β•‘
269
+ β•‘ Conviction: STRONG / MODERATE / WEAK β•‘
270
+ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
271
+ ```
272
+
273
+ Score Guide: 8.0–10.0 Strongly Bullish | 6.0–7.9 Moderately Bullish | 4.0–5.9 Neutral | 2.0–3.9 Moderately Bearish | 0.0–1.9 Strongly Bearish
274
+ Confidence: HIGH (strong data, clear signals) | MEDIUM (mixed signals) | LOW (limited data, conflicting signals)
275
+ Horizon: SHORT-TERM (1 week–3 months) | MEDIUM-TERM (3 months–1 year) | LONG-TERM (1+ years)
276
+
277
+ **Note:** The Score above is the ETF Fitness Score, mapped onto the standard scale for cross-skill comparability. It rates *how fit this fund is as a vehicle for the stated exposure and portfolio* β€” not how attractive the exposure is. Confidence is LOW whenever the issuer factsheet was not retrieved or the overlap was computed from the top 10 only.
278
+
279
+ **Disclaimer:** Educational analysis only. Not financial advice. Fund facts change; verify every figure against the issuer's current factsheet and prospectus before acting.
@@ -0,0 +1,288 @@
1
+ ---
2
+ name: fact-check
3
+ description: Claim-level verification of any report or data set β€” extract every figure and factual claim, check each against a primary source (SEC filing, company IR, FRED, exchange data, or the user's own document), recompute derived numbers, mark βœ… verified / ⚠️ mismatch / ❓ unverifiable, and re-issue the report with inline citations and a References section; Verification Score 0–10
4
+ ---
5
+
6
+ # Fact Check β€” Verify the Numbers, Cite the Sources
7
+
8
+ ## ⚠️ Data Verification β€” Do This Before Any Analysis
9
+
10
+ Before verifying anything, establish what data each claim actually needs:
11
+
12
+ 1. **Fetch current price only where a claim needs it** β€” market claims (price, market cap, yield, multiples "today") are checked against a live quote for the report's as-of date and today's, obtained through the host's own data path (delegate it in a role-split host). Reported figures, historical comparisons, and `--recompute` runs need **no** live quote β€” do not request one, and do not let its absence block them. Never assume a price from training data.
13
+ 2. **Confirm key figures** β€” for this skill the "key figures" are the *sources themselves*: the filing (10-K / 10-Q / 8-K / proxy / Form 4 / 13F), the IR release, the FRED series, the exchange or issuer data, or the document the user pasted. Retrieve or request them before judging a single claim. A claim checked against memory is not checked.
14
+ 3. **State your data source** β€” fill in the `Data & Sources` header (next section) so the origin, as-of date, retrieval path, and confidence of every figure are explicit at the top of the output.
15
+ 4. **Flag stale data explicitly** β€” if a live quote is needed for a market claim and unavailable, display this warning before proceeding, and mark those claims `❓` or `πŸ•’` rather than guessing:
16
+
17
+ > ⚠️ **Data unavailable.** <list the figures this analysis could not retrieve>. Those fields are reported as missing and are not estimated β€” retrieval is a precondition, not a nicety.
18
+
19
+ The warning describes the *inputs actually used*: when every claim was checked against user-supplied documents, say so instead of implying estimates were involved. Never substitute a remembered value for a retrieved one β€” a figure the host's data path could not produce stays `❓` and is named as missing.
20
+
21
+ ---
22
+
23
+ ## πŸ“‹ Data & Sources Header β€” Open Every Output With It
24
+
25
+ The first thing in the output is this provenance block, filled in β€” never left as placeholders. It is the standard documented on the [Data & Accuracy](https://yennanliu.github.io/InvestSkill/data-and-accuracy.html) page and the first thing `result-validator` looks for:
26
+
27
+ ```
28
+ Data & Sources
29
+ As of: <date the figures represent, e.g. 2026-06-30>
30
+ Source: <primary docs β€” SEC EDGAR 10-K/10-Q, company IR, FRED, exchange data …>
31
+ Retrieval: <delegated retrieval | web/tool retrieval | pasted by user>
32
+ Confidence: <HIGH | MEDIUM | LOW>
33
+ ```
34
+
35
+ - Memory is not a retrieval path. A figure that was neither retrieved nor supplied by the user is reported as missing, never estimated β€” and never written into this block as if it had been retrieved.
36
+ - Mixed sources: list each with its own as-of date rather than blending them.
37
+ - Data the user pasted is reported as `pasted by user`; do not upgrade its confidence beyond what the user's own source supports.
38
+
39
+ For this skill the header describes the **sources used to verify**, not the report being verified β€” the report's own header is quoted and judged in Phase 5.
40
+
41
+ ---
42
+
43
+ ## Overview
44
+
45
+ Every InvestSkill analysis opens with a `Data & Sources` header, and `result-validator` scores whether sources are "cited or identifiable". Neither answers the question a careful reader actually has: **is this specific number true, and where exactly does it come from?** A report can carry an honest header, a tidy methodology, and a consistent signal β€” and still be built on a revenue figure from the wrong fiscal year, a margin computed on non-GAAP earnings, or a share count that was stale when the model wrote it.
46
+
47
+ This skill closes that gap at the level of the individual claim. It takes any report β€” an InvestSkill output, a broker note, a spreadsheet, a paragraph from a forum post β€” pulls out **every figure and factual assertion**, checks each one against a **primary source**, **recomputes** every derived number from verified inputs, and hands back three things: a claim ledger with a verdict per claim (βœ… verified Β· ⚠️ mismatch Β· ❓ unverifiable Β· πŸ” recomputed Β· πŸ•’ stale), a **corrected copy of the report with inline citations and a References section**, and a **Verification Score 0–10** that `result-validator` can consume as the evidence behind its Data Quality dimension.
48
+
49
+ **Division of labour.** `result-validator` asks *is this analysis well built?* (methodology, consistency, risk coverage, transparency). `fact-check` asks *are the inputs true?* Run this one first when the stakes are real; the validator's score means little if the numbers underneath it are wrong. `learning-coach` then explains the result to a beginner.
50
+
51
+ **What it is not.** It does not re-run the analysis, form its own view on the stock, or change the report's signal. It never invents a source to make a claim look verified: an unverifiable claim stays `❓`, and a claim that cannot be traced is more honestly left uncited than given a plausible-looking reference. Fabricating a citation is the one failure mode that makes this skill worse than useless β€” it is a hard-cap-to-zero offence in the score.
52
+
53
+ ---
54
+
55
+ ## 1. Modes
56
+
57
+ | Mode | Invocation | What it does |
58
+ |------|------------|--------------|
59
+ | **Verify** (default) | paste the report (+ sources, or permission to retrieve them) | Full ledger, recomputation, consistency check, corrected report with citations, Verification Score |
60
+ | **Cite** | `--cite-only` + the report + its sources | Attach inline citations and a References section to figures the sources confirm; no recomputation, no score beyond coverage β€” for a report you already trust but need to make traceable |
61
+ | **Recompute** | `--recompute` + the report | Only the arithmetic: rebuild every derived figure from the reported inputs and flag disagreements β€” fast, needs no external source |
62
+ | **Diff** | `--diff` + two versions of a report or two data sets | Which figures changed, by how much, and whether the change is a restatement, a period roll, or an error |
63
+
64
+ If a source cannot be retrieved in the environment, the skill says which claims that blocks and leaves them `❓`; asking the user for the document is only for a host with no retrieval path. It never fills the gap from memory.
65
+
66
+ ## 2. Inputs
67
+
68
+ | Input | Required | Default if unstated |
69
+ |-------|----------|---------------------|
70
+ | The report or data to check (pasted, or a file) | βœ… | β€” |
71
+ | Sources: pasted filing text / IR release / data table, URLs, or permission to retrieve | βœ… for Verify and Cite | ask; without sources every claim is `❓` and the score is capped |
72
+ | Ticker and fiscal calendar (FY end month) | recommended | infer from the report; state it β€” half of all "mismatches" are fiscal-year confusions |
73
+ | Tolerance for market data (price, market cap) | optional | Β±1% and same trading day |
74
+ | Which claims are **signal-driving** (the 3–5 numbers the report's conclusion rests on) | optional | infer from the report's own signal box and thesis; state the choice |
75
+ | Output form: corrected copy vs. annotated diff | optional | corrected copy with strike-through of originals |
76
+
77
+ ---
78
+
79
+ ## 3. Framework
80
+
81
+ ### Phase 1 β€” Extract every claim into a ledger
82
+
83
+ Read the report once and list **every** checkable statement β€” not just the headline numbers. One row per claim:
84
+
85
+ | # | Claim (as written) | Value Β· unit Β· period | Type | Signal-driving? | Where in report |
86
+ |---|--------------------|-----------------------|------|-----------------|-----------------|
87
+ | 1 | "Revenue grew 20% to $6.12B in FY2026" | $6,120M Β· FY2026 Β· +20% YoY | reported (filing) | βœ… | Β§2 Financial Health |
88
+ | 2 | "FCF of $930M" | $930M Β· FY2026 | derived (OCF βˆ’ capex) | βœ… | Β§2 |
89
+ | 3 | "trades at 24Γ— forward earnings" | 24.2Γ— Β· as of ? | market Γ— estimate | βœ… | Β§3 Valuation |
90
+ | 4 | "CFO bought $1.2M of stock in May" | $1.2M Β· 2026-05 | fact (Form 4) | β€” | Β§5 Insider |
91
+ | 5 | "top customer is 18% of revenue" | 18% Β· FY2026 | reported (10-K risk factors) | β€” | Β§1 |
92
+
93
+ **Claim types** decide which source can verify them: *reported* (a figure stated in a filing or release), *derived* (computed from reported figures β€” must be recomputed, not just matched), *market* (price, market cap, yield β€” needs an as-of date), *estimate* (consensus, guidance β€” needs the source and date of the estimate), *macro* (rates, CPI β€” FRED / BLS series and vintage), *fact* (an event: a filing, a transaction, an appointment), *qualitative* (a characterization β€” "dominant", "improving" β€” checked for whether the cited evidence supports it, never marked verified on its own).
94
+
95
+ Mark the **signal-driving** claims. They carry more weight in the score and a mismatch on one of them changes the report's standing.
96
+
97
+ ### Phase 2 β€” Source hierarchy
98
+
99
+ Only a source the reader could open verifies a claim. Rank what you use, and record the tier in the ledger:
100
+
101
+ | Tier | Sources | Verifies |
102
+ |------|---------|----------|
103
+ | **1 β€” Primary** | SEC EDGAR filings (10-K, 10-Q, 8-K, DEF 14A, Form 4, 13F, S-1), the company's own IR release or presentation, FRED / BLS / BEA series, the exchange's or ETF issuer's published data, IRS publications, the fund prospectus / factsheet | reported figures, facts, macro, fund data |
104
+ | **1 β€” User-supplied** | The document the user pasted (a filing excerpt, a broker statement, a data export) | its own figures β€” labelled `user-supplied` so the reader knows verification stops at the user's document |
105
+ | **2 β€” Secondary** | Reputable financial data vendors and press explicitly quoting a primary document, consensus aggregators for estimates | market data and estimates, with the vendor and date recorded; a reported figure verified only at Tier 2 is marked `βœ… (secondary)` |
106
+ | **3 β€” Not a source** | Model memory, forum posts, uncited summaries, a second AI output | nothing β€” a claim matched only against these stays `❓` |
107
+
108
+ Prefer the most specific location: Item and Note number, statement line, table, page. "The 10-K" is a document, not a citation.
109
+
110
+ **Retrieving a Tier-1 source without an API key.** Once retrieval is approved, go straight to SEC EDGAR rather than a summary site β€” in a role-split host, hand the URL and the fields needed to the agent that owns retrieval rather than fetching here: resolve the CIK from `https://www.sec.gov/files/company_tickers.json` (zero-pad `cik_str` to 10 digits); list filings from `https://data.sec.gov/submissions/CIK##########.json`, where `filings.recent.form` / `filingDate` / `reportDate` / `accessionNumber` / `primaryDocument` line up by index (`10-K`, `10-Q`, `8-K`, `DEF 14A`, `4` for insider transactions β€” Form 4s are filed under the issuer's CIK as well as the insider's β€” and `20-F` / `6-K` for foreign issuers); open the document at `https://www.sec.gov/Archives/edgar/data/<CIK without leading zeros>/<accession without dashes>/<primaryDocument>`; and cross-check statement figures against the tagged facts at `https://data.sec.gov/api/xbrl/companyfacts/CIK##########.json`. Send an identifying `User-Agent` and stay under 10 requests per second. Record `Retrieval: web/tool retrieval`, the accession number and the filing date. **Institutional holdings are the exception to the issuer-CIK route:** Form `13F-HR` is filed by the investment *manager*, so it never appears under the target company's CIK. Resolve the manager (from the claim: "Vanguard holds 8.9%") to *its* CIK, list its `13F-HR` filings, and verify the position in the information table by the target's CUSIP β€” or use EDGAR full-text search (`https://www.sec.gov/edgar/search/#/q=%22<company or CUSIP>%22&forms=13F-HR`) to find which managers report the security. A 13F verifies one manager's position at one quarter-end; an aggregate "institutional ownership %" is a secondary-source figure and is marked `βœ… (secondary)` at best. Only where the host has no retrieval path at all, ask the user to paste the document and mark `Retrieval: pasted by user` β€” the repository's helper scripts are not part of this plugin and are never run from here. A source that could not be retrieved leaves its claims `❓`; it is never filled from memory.
111
+
112
+ ### Phase 3 β€” Verify each claim
113
+
114
+ For each ledger row, locate the figure in the source, compare, and assign one verdict:
115
+
116
+ | Verdict | Meaning | Rule |
117
+ |---------|---------|------|
118
+ | βœ… **VERIFIED** | The source states the figure | Reported figures: exact, or rounding within 0.5%. Market data: same trading day and within the stated tolerance. Percentages: within 0.1 pp. Record source Β· location Β· as-of |
119
+ | ⚠️ **MISMATCH** | The source states a different figure | Record the source value, the delta (absolute and %), and the **likely cause** β€” the usual suspects: wrong fiscal year or quarter; TTM vs. fiscal year; GAAP vs. adjusted; basic vs. diluted shares; a restated prior period; a currency or unit slip (thousands vs. millions); a stale price |
120
+ | ❓ **UNVERIFIABLE** | No Tier 1–2 source available | Say what source would settle it. This is *not* "false" β€” never let the corrected report read as if the claim were disproven |
121
+ | πŸ” **RECOMPUTED** | A derived figure rebuilt from verified inputs | Show the arithmetic (Phase 4); mark `agrees` or `disagrees (report X, recomputed Y)` |
122
+ | πŸ•’ **STALE** | Verified, but the as-of date is older than the report implies or than 90 days | Verified figure, wrong vintage β€” give the current value alongside |
123
+
124
+ A qualitative claim is judged only on whether the evidence the report cites for it holds; it is never `βœ…` on its own.
125
+
126
+ ### Phase 4 β€” Recompute every derived figure
127
+
128
+ Never accept a derived number by matching it to a secondary source that may have made the same mistake. Rebuild it from verified inputs and show the work:
129
+
130
+ ```
131
+ Free cash flow = OCF βˆ’ capex 1,240 βˆ’ 310 = 930 βœ“ report 930
132
+ Gross margin = gross profit Γ· revenue 3,550 Γ· 6,120 = 58.0% βœ“ report 58%
133
+ Revenue growth = rev / prior rev βˆ’ 1 6,120 Γ· 5,100 βˆ’ 1 = 20.0% βœ“
134
+ Net debt = total debt βˆ’ cash 800 βˆ’ 1,650 = βˆ’850 (net cash) βœ“
135
+ Market cap = price Γ— shares outstanding 48.20 Γ— 412 = 19,858 (shares outstanding at the price date β€” not the diluted count used for EPS)
136
+ Enterprise value = market cap + debt βˆ’ cash 19,858 + 800 βˆ’ 1,650 = 19,008
137
+ P/E (trailing) = price Γ· diluted EPS 48.20 Γ· 1.99 = 24.2Γ— βœ“ report "24Γ— forward" βœ— β€” trailing, not forward
138
+ FCF yield = FCF Γ· market cap 930 Γ· 19,858 = 4.7%
139
+ Payout (FCF basis) = dividends paid Γ· FCF 165 Γ· 930 = 17.7%
140
+ ```
141
+
142
+ Standard checks: FCF, margins, growth rates, per-share figures (which share count?), P/E Β· P/S Β· EV/EBITDA Β· P/FCF (trailing vs. forward, and whose estimate), net debt and EV, payout and yield, ROE / ROIC (state the denominator), any score or weighted composite in the report (do the weights sum to 100%? does the weighted sum match?). Where the report's definition is ambiguous, say so rather than picking one silently.
143
+
144
+ ### Phase 5 β€” Consistency and honesty of the report itself
145
+
146
+ - **Numbers vs. narrative** β€” does the text say what the tables say? ("margins expanding" next to a table where they fell)
147
+ - **Internal contradictions** β€” the same figure quoted two ways in two sections.
148
+ - **Signal vs. score** β€” the signal box's Score must sit in the band its Signal implies (β‰₯ 6.0 BULLISH Β· 4.0–5.9 NEUTRAL Β· < 4.0 BEARISH); a mismatch is a red flag, not a rounding issue.
149
+ - **The report's `Data & Sources` header vs. what was verifiable** β€” a header claiming `Retrieval: web/tool retrieval Β· Confidence: HIGH` over a report whose figures cannot be traced is itself a finding. Quote the header and state whether the verification supports it.
150
+ - **Fabricated or unopenable citations** in the report β€” a reference that does not exist, or a page/Item that does not contain the figure, is the most serious finding this skill can make. Say so plainly.
151
+
152
+ ### Phase 6 β€” Re-issue the report with citations
153
+
154
+ Produce the corrected copy (or the diff, if asked):
155
+
156
+ - Every `βœ…` figure gets an inline citation `[n]`; every `πŸ” agrees` figure gets the citation of its inputs plus `(recomputed)`.
157
+ - Every `⚠️` figure is corrected **in place**, with the original struck through: ~~$5.9B~~ **$6.12B** [1] β€” and a one-line note on the cause. Never silently change a number.
158
+ - Every `❓` figure is marked `[?]` and left as written. Every `πŸ•’` figure keeps its citation and gains `(as of <date>; current: <value> [m])`.
159
+ - Qualitative claims whose evidence failed are marked `[unsupported]`.
160
+ - A **References** section closes the report:
161
+
162
+ ```
163
+ ## References
164
+ [1] Zephyr Robotics Inc., Form 10-K for FY ended 2026-03-31 β€” Item 8, Consolidated Statements of Operations, p. 54 (SEC EDGAR, accession 0000000000-26-000000; retrieved 2026-06-30)
165
+ [2] Same filing β€” Item 8, Consolidated Statements of Cash Flows, p. 58
166
+ [3] Zephyr Robotics Q4 FY2026 earnings release, 2026-05-14 β€” segment table (company IR)
167
+ [4] Form 4, filed 2026-05-19 β€” CFO open-market purchase (SEC EDGAR)
168
+ [5] User-supplied: price and shares outstanding as of 2026-06-30 close (pasted by user; not independently verified)
169
+ ```
170
+
171
+ Each reference names the document, the exact location, the as-of or filing date, and how it was retrieved. If the environment cannot produce a URL or accession number, say so rather than inventing one.
172
+
173
+ ### Phase 7 β€” Verification Score (0–10)
174
+
175
+ The headline number measures **how much of the report is demonstrably true**, not whether the report's conclusion is right.
176
+
177
+ | Component | Weight | 10 looks like | 0 looks like |
178
+ |-----------|--------|---------------|--------------|
179
+ | Coverage | 30% | β‰₯ 95% of claims `βœ…` or `πŸ” agrees` | < 40% |
180
+ | Signal-driving accuracy | 30% | Every signal-driving claim verified within tolerance | A signal-driving claim off by > 5% or from the wrong period |
181
+ | Recomputation | 15% | Every derived figure agrees | Derived figures disagree or cannot be rebuilt from the report's own inputs |
182
+ | Source quality | 15% | All Tier 1, specific locations | Mostly secondary or user-supplied only |
183
+ | Freshness | 10% | Every as-of date matches the report's claim and is < 90 days old for market data | Stale figures presented as current |
184
+
185
+ **Hard caps** (state any that fires): a signal-driving `⚠️` **or `πŸ” disagrees`** with delta > 5% β†’ **max 4.0** Β· more than half the claims `❓` β†’ **max 5.0** Β· the report's own `Data & Sources` header overstates its retrieval or confidence β†’ **max 6.0** Β· **any fabricated or unopenable citation found in the report β†’ 0.0**. Always print a `Caps fired:` line under the score (`none`, or the list) so a capped 4.0 is never mistaken for an earned 4.0 β€” **a report whose score was capped by a signal-driving mismatch is a failed verification regardless of the number.**
186
+
187
+ Map onto the standard bands: **β‰₯ 6.0** the report's inputs are sound (BULLISH on the *report*) Β· **4.0–5.9** usable with the listed corrections (NEUTRAL) Β· **< 4.0** do not rely on it β€” re-run the analysis with verified inputs (BEARISH). Hand the score and the ledger to `result-validator`, whose Data Quality dimension should not exceed what this score supports.
188
+
189
+ ---
190
+
191
+ ## 4. Output Format
192
+
193
+ 1. `Data & Sources` header β€” the sources *used to verify*, with retrieval path
194
+ 2. **Verification summary** β€” one line: `N claims Β· V verified Β· R recomputed (r agree) Β· M mismatch Β· U unverifiable Β· S stale Β· Verification Score X.X Β· Caps fired: none | <list>`
195
+ 3. **Signal-driving claims first** β€” the 3–5 that matter, each with verdict, source, and delta
196
+ 4. **Claim ledger** β€” the full table from Phase 1 with verdict, source tier, location, as-of
197
+ 5. **Mismatches in detail** β€” original Β· source value Β· delta Β· likely cause Β· what the corrected figure does to the report's conclusion
198
+ 6. **Recomputation table** β€” Phase 4, arithmetic shown
199
+ 7. **Report consistency findings** β€” Phase 5, including the judgment on the report's own header
200
+ 8. **Corrected report with citations** (or `--diff` output) and the **References** section
201
+ 9. **Thesis Invalidation** β€” what would change these verdicts (below)
202
+ 10. **Investment Signal block** β€” mirrors the report's signal with the verification verdict attached (below)
203
+
204
+ ---
205
+
206
+ ## Example
207
+
208
+ ```
209
+ User: [pastes a stock-eval output on ZEPH that concludes BULLISH 7.4 / 10] Verify every number
210
+ and add sources. Here is the FY2026 10-K excerpt and the Q4 release. [pasted]
211
+
212
+ The assistant lists 23 claims, flags 5 as signal-driving (revenue growth, gross margin, FCF,
213
+ net cash, forward P/E). Verifies 17 against the 10-K and the release with Item/statement/page
214
+ locations; recomputes 6 derived figures β€” all agree except one: the report's "24Γ— forward P/E"
215
+ is 48.20 Γ· 1.99, i.e. the *trailing* multiple on FY2026 diluted EPS; no forward estimate is
216
+ cited, so the claim becomes ⚠️ MISMATCH (label) with the corrected wording "24.2Γ— trailing";
217
+ consensus forward EPS would be needed for the forward figure β†’ ❓ until supplied. Two claims
218
+ are πŸ•’ STALE: the price and market cap are from a date 40 days before the report. One
219
+ qualitative claim ("dominant share of warehouse robotics") cites no evidence β†’ [unsupported].
220
+ The report's own header said "Retrieval: web/tool retrieval Β· Confidence: HIGH"; 17/23 verified
221
+ supports MEDIUM, so that is noted. No fabricated citations. Verification Score 6.8 β€” the report's
222
+ inputs are sound; the signal stands with the valuation sentence corrected. Emits the corrected
223
+ report with [1]–[9] inline and a References section, and hands the ledger to result-validator.
224
+ ```
225
+
226
+ ---
227
+
228
+ ## Notes
229
+
230
+ - **Run it before `result-validator`, not instead of it.** This skill checks the inputs; the validator checks the reasoning built on them. The validator's Data Quality score should never exceed what the Verification Score supports.
231
+ - **Every InvestSkill report is a candidate**, but so is anything else the user brings β€” a broker note, a newsletter, a spreadsheet, a screenshot transcribed to text. The ledger discipline is the same.
232
+ - **Unverifiable is not false.** The corrected copy must never read as if a `❓` claim were refuted. The honest output for a claim without a source is the claim, unchanged, with `[?]`.
233
+ - **Fiscal calendars cause most false mismatches.** Establish the fiscal year end and the period each table covers before comparing anything.
234
+ - **Do not fabricate a reference to fill a gap.** No accession number, page, or URL that was not actually seen. If the environment cannot retrieve, report the claim as blocked β€” do not fall back to memory.
235
+ - **Pairs with**: `result-validator` (consumes the score), `learning-coach` (explains the ledger to a beginner), `10k-digest` and `financial-report-analyst` (produce well-cited inputs in the first place), `full-report` (run this on the composite before shipping it), `thesis-tracker` (verify the KPI values before recording them at a check).
236
+
237
+ ## Thesis Invalidation
238
+
239
+ After delivering the analysis signal, specify what would reverse it:
240
+
241
+ **If signal is BULLISH (the report's inputs verified) β€” the verdicts break if:**
242
+ - A new filing restates a figure the report relied on (an 8-K or an amended 10-K/A) β€” every `βœ…` on that figure becomes `πŸ•’` until re-checked
243
+ - A signal-driving figure that was verified at Tier 2 (secondary) is later contradicted by the primary document
244
+ - The market-data as-of dates pass 90 days β€” verified prices become stale prices, and the valuation claims built on them lose their `βœ…`
245
+
246
+ **If signal is BEARISH (the report's inputs did not verify) β€” the verdicts break if:**
247
+ - The user supplies the source that turns the `❓` claims into `βœ…` β€” the ledger is re-run, not amended by hand
248
+ - A mismatch is traced to a period or definition difference the report actually disclosed elsewhere (then it is a labelling issue, not a wrong number β€” downgrade to a note)
249
+ - The report is re-issued by its author with the corrected figures, in which case fact-check the new version, not the old
250
+
251
+ **Re-run this analysis when:**
252
+ - [ ] The company files its next 10-Q / 10-K, or any 8-K restating prior figures
253
+ - [ ] The report is edited or re-generated
254
+ - [ ] 90 days pass on any market-data claim
255
+ - [ ] Before the report is shared, published, or used to size a position
256
+ - [ ] `result-validator` scores Data Quality above what the ledger supports
257
+
258
+ ## Standard Signal Output
259
+
260
+ This skill does **not** form a view on the stock. `Score` is always the **Verification Score**, and `Confidence` is capped at the tier it supports (β‰₯ 8.0 HIGH Β· 6.0–7.9 MEDIUM Β· < 6.0 LOW). The other fields depend on the outcome:
261
+
262
+ - **Verification passed** (Score β‰₯ 4.0 **and no signal-driving cap fired** β€” `Caps fired: none`, or only the coverage / header caps): Signal, Horizon, Action, and Conviction **mirror the verified report's own**, and a line under the box states `Mirrors the report's signal β€” quoted, not re-derived`. If a signal-driving claim mismatched by more than 5%, add `Signal not supported at stated confidence β€” re-run the analysis with verified inputs`.
263
+ - **Verification failed** (Score < 4.0, **or** the signal-driving mismatch cap fired β€” even if the capped score reads exactly 4.0 β€” or a fabricated citation β†’ 0): the box does **not** carry the report's Signal or Action forward β€” an unsupported BUY must not survive into the verification result. Fill `Signal: NEUTRAL Β· Action: HOLD Β· Conviction: WEAK Β· Confidence: LOW`, and under the box write `Verification failed β€” the report's own signal (BULLISH / BUY, quoted) is not supported by its inputs; do not act on it`.
264
+ - For a report with no signal block, fill Signal / Action / Conviction with `n/a`.
265
+
266
+ All analysis concludes with this standardized block:
267
+
268
+ ```
269
+ ╔══════════════════════════════════════════════╗
270
+ β•‘ INVESTMENT SIGNAL β•‘
271
+ ╠══════════════════════════════════════════════╣
272
+ β•‘ Signal: BULLISH / NEUTRAL / BEARISH β•‘
273
+ β•‘ Confidence: HIGH / MEDIUM / LOW β•‘
274
+ β•‘ Horizon: SHORT / MEDIUM / LONG-TERM β•‘
275
+ β•‘ Score: X.X / 10 β•‘
276
+ ╠══════════════════════════════════════════════╣
277
+ β•‘ Action: BUY / HOLD / SELL β•‘
278
+ β•‘ Conviction: STRONG / MODERATE / WEAK β•‘
279
+ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
280
+ ```
281
+
282
+ Score Guide: 8.0–10.0 Strongly Bullish | 6.0–7.9 Moderately Bullish | 4.0–5.9 Neutral | 2.0–3.9 Moderately Bearish | 0.0–1.9 Strongly Bearish
283
+ Confidence: HIGH (strong data, clear signals) | MEDIUM (mixed signals) | LOW (limited data, conflicting signals)
284
+ Horizon: SHORT-TERM (1 week–3 months) | MEDIUM-TERM (3 months–1 year) | LONG-TERM (1+ years)
285
+
286
+ **Note:** The Score above is the Verification Score β€” *how much of the report is demonstrably true* β€” mapped onto the standard scale for cross-skill comparability. When verification passes, Signal, Horizon, Action, and Conviction are the verified report's own, quoted unchanged; when it fails, they are replaced by NEUTRAL / HOLD / WEAK so that no unsupported call is carried forward.
287
+
288
+ **Disclaimer:** Educational analysis only. Not financial advice. Verification is limited to the sources available at run time; an unverifiable claim is neither confirmed nor refuted.