Imported from dadachundan/financial_agent (
.claude/skills/company-research/SKILL.md). Install upstream withnpx skills add dadachundan/financial_agent --skill company-research. Copyright stays with the author.
Company Research
Deep research deliverable: a 6,000–10,000 word markdown report covering business, management, products, customers, industry, competitive landscape, TAM, and risks. Input is just a company name or ticker.
Methodology: website-first. This skill prioritizes the company's official sources (website, investor relations, press releases, filings) over third-party research. The company's own website is the starting point and ground truth for what it actually sells; regulatory filings provide audited financials and legal risk details; analyst research comes third. This approach yields reports grounded in primary sources rather than analyst consensus or journalistic interpretation.
Core principle: accuracy over completeness — never hallucinate
This is the single most important rule and overrides every other instruction in this skill. The report is read by investors making real decisions; a single fabricated number, executive name, customer name, page reference, market-share figure, or URL destroys the credibility of the entire document.
Hard rules:
- Never invent specific facts. Revenue figures, growth rates, customer names, competitor market shares, executive backgrounds, board members, founding dates, product launch dates, TAM numbers, page numbers in filings, URLs — every one of these must come from a source you actually verified. If you didn't read it, don't write it.
- If the data is not available, say so. Write
disclosure not found/not disclosed in 10-K/cninfo filing does not break this out/private — not disclosed. Omitting a section or stating an absence is always preferable to inventing a plausible-looking number. - No "this is probably around X." No back-of-envelope estimates dressed as facts. If you need to estimate, mark it explicitly (
est., based on [reasoning]) and show the math. - Cross-check every quantitative claim against its citation. Before pasting "revenue grew 34% YoY" with a 10-K link, confirm the 10-K actually shows 34%. The citation must support the claim — not vaguely cover the topic.
- Page numbers and dates must be exact. If you cite
2024 年度报告, 第 28 页, page 28 must be where the figure actually lives. If unsure, drop the page reference and cite the document only. - No fabricated URLs (this echoes the citation rule). For SEC filings, always look up the real filename via the EDGAR submissions JSON API (
https://data.sec.gov/submissions/CIK<10-digit-padded>.json— seereference/citations.md); never invent synthetic filename patterns like2025_10K_<accession>.htm— those are 404s. - Direct quotations must be verbatim. If you can't quote exactly, paraphrase and drop the quote marks. When writing about official company website data or regulatory filings, default to quoting the original text rather than paraphrasing. This ensures readers can verify every claim against the source.
- Distinguish primary (filings, transcripts) from secondary (news, third-party) sources. When two sources disagree, prefer the primary and note the discrepancy briefly.
Guardrails (at-a-glance — the rules with the worst failure modes)
Compact index of the load-bearing don't-dos enforced throughout this skill. Each links to the detailed section that owns it; none of these are new rules — they are the project-history failure modes worth seeing on one page.
- Do not invent numbers, executives, customers, product names, page references, or URLs. Write
disclosure not foundinstead. See Core principle above andreferences/quality_checklist.md. - Do not attach a 10-K citation to a sell-side opinion. "Lam is the global #1 in etch" is an analyst view, not 10-K language; label
*Analyst view:*and either cite a real third-party source (Yole / Gartner / IDC at a specific report URL) or leave uncited. See § "Specific failure mode: do NOT misattribute sell-side opinions to filings". - Do not invent SEC URLs. Resolve every filename via the EDGAR submissions JSON (
https://data.sec.gov/submissions/CIK<padded>.json); never construct2025_10K_<accession>.htm-style patterns — those are 404s. See Step 10.2. - Do not write a customer-share number without its denominator. "X% of revenue" is wrong when more than one denominator could apply — always "X% of consolidated revenue" or "X% of segment revenue". A segment-level customer (e.g. NVIDIA in DS Memory) is never silently presented as a consolidated top-5 customer. See Step 3.
- Do not paraphrase 10-K / 年度报告 / Yuho product descriptions. Block-quote verbatim with the citation directly above. Paraphrase is where fabrication enters. See § "The Products & Services chapter is the most important section…".
- Do not present analyst-constructed verdicts as
Buffett would buy,巴菲特会买, orDamodaran's fair value is. Investor-lens scorecards (Section 10) use the lens as a rubric, not as an endorsement. Seereferences/investor_lenses.md. - Do not skip the Step 10 verification pass. Every URL HTTP-checked, every SEC filename resolved, ≥5 10-K-cited numbers spot-checked, executive names confirmed against 8-K / DEF 14A. The verification log is the deliverable's contract with the reader. See Step 10.
- Do not write "(Source: our model)" / "(estimate, our analysis)" / "(本模型)" anywhere in the report. Cite the external inputs the model is built on, not the model. See the project-wide Numerical Accuracy rule in
CLAUDE.md. - Do not attribute the GF Score (Section 1B) to GuruFocus, and do not attach a filing citation to any GF sub-score. The GF Score (GuruFocus-style) is the analyst's own rubric — label it
*Analyst view:*, cite each underlying metric (margins / leverage / CAGR / multiples / returns) inline, and only carry a GuruFocus citation if you actually pulled their published number fromgurufocus.com/term/gf-score/<TICKER>(shown separately). Seereference/gf_score.md. - Do not skip the Data Used manifest (see
references/report_structure.md→ "Data Used" block). A report that lists ≥40 inline citations but no data manifest is harder for the reader to triage — the manifest is one block, not duplication. - Do not run destructive SQL against
db/*.db. Read-only —SELECT,.schema,PRAGMA. Test-writes go viaFINAGENT_DB_DIR=/tmp/.... SeeCLAUDE.md§ "Database Safety".
Source hierarchy: official company data first
Prioritize the company's own official sources over third-party research. The company's website, SEC filings, investor materials, and press releases are the ground truth; analyst reports, news articles, and third-party research are supporting evidence.
Source priority (highest to lowest):
- Company official website — product pages (specifications, use cases, pricing if disclosed), About / Company pages, leadership bios, customer case studies, blog/newsroom (last 12 months for launches and announcements). When citing website content, quote or closely paraphrase the exact text so readers can verify against the live source.
- Regulatory filings — 10-K / 10-Q / 8-K (US), 年度报告 / 季度报告 (China), Yuho / Shihanki (Japan), etc. These are legally binding and audited (filings, not soft estimates). Quote verbatim from the filing whenever possible, especially for product definitions, customer names, risk factors, and segment breakdowns. Block-quote long passages with the citation directly above.
- Investor relations materials — earnings call transcripts, earnings decks, investor-day presentations, annual integrated reports, capital-markets-day decks. These are prepared by the company's own IR team and often contain the most direct business context. Quote management's own words from transcripts and decks rather than summarizing or interpreting what they said.
- Press releases and announcements — official channel for product launches, customer wins, partnerships, guidance changes. Quote press releases verbatim for specific announcements and dates.
- Conference presentations — when the company's own executives present at industry conferences (JPM, SEMICON, etc.), these are quasi-official sources. Quote or screenshot the actual slides rather than paraphrasing the executive's point.
- Sell-side / institute research (Morgan Stanley, Goldman Sachs, J.P. Morgan, Bernstein, UBS, Citi, Deutsche Bank, HSBC, Nomura, plus market-sizing firms Yole, Gartner, IDC, TechInsights, TrendForce, etc.) — used for market-sizing, competitive positioning, consensus estimates / price targets, and industry trends when the company's filings don't provide the detail. Can paraphrase with citation, but prefer direct quotes when a number or claim is novel or contested. There is a large local library of this material in
db/zsxq.db(6,900+ broker PDFs) — search it FIRST, before web-searching for analyst notes. See § "Local institute-research library" below for the search-and-cite workflow. - News and web sources — news articles, blog posts, third-party analysis. Use only for recent developments and confirmation, not as a primary claim source.
When the company's website lacks detail, fall back to regulatory filings (which are more complete and audited); only then reach for third-party research. A product feature list from the company's website beats an analyst's product description; a management quote from an earnings transcript beats a paraphrased interpretation from a news article.
Default: quote the original text. When writing from official sources (website product pages, 10-K product descriptions, earnings transcripts, press releases), the default move is to quote or closely preserve the original language, not to synthesize or paraphrase. This is what distinguishes primary-source research from derivative commentary.
Specific failure mode: do NOT misattribute sell-side opinions to filings
A 10-K / 年度报告 / Yuho is a legal disclosure document. It almost never contains:
- Specific competitor product names (e.g. AMAT's "NOKOTA", "Producer", "Endura")
- Share-leadership claims about itself ("Lam is the leader", "dominant in X", "near-monopoly share")
- Revenue percentages by sub-product category (e.g. "Etch is 45% of Systems revenue")
- Co-leader / #1 / #2 rankings
These are sell-side analyst assessments. Do not attach a 10-K citation to a sentence that makes one of these claims unless the 10-K verbatim says it. Instead, prefix the sentence with *Analyst view:* (English) or *分析师观点:* (Chinese) and either leave it uncited or cite a real industry-research source (Yole, Gartner, IDC) at a specific URL.
What the 10-K Competition section typically does contain — and what you CAN cite to it — is a high-level list of named competitors (e.g. "Our primary competitors in the etch market are Applied Materials, Hitachi Ltd., and Tokyo Electron"). Quote that verbatim with a 10-K citation; do not embellish.
When in doubt, omit. A shorter, fully-sourced report is far more valuable than a padded one with invented detail. Length targets in references/report_structure.md are guides, not licenses to fabricate.
The Products & Services chapter is the most important section of the report
After the "accuracy over completeness" rule, this is the next-highest-priority instruction. Section 4 (Products & Services) is the single most consequential chapter in the entire report, and a report that under-invests in Section 4 cannot be recovered by polishing the other sections.
Why Section 4 carries this weight:
-
It is the analytical foundation for everything else. A reader cannot evaluate Section 5 (Customers — why do customers buy this?), Section 6 (Industry — what market is the company in?), Section 7 (Competitive Landscape — who competes on what?), Section 8 (TAM — what slice of the market does the company actually serve?), or Section 9 (Risks — which products are most at risk?) without first understanding what the company actually makes and how it sits in its customer's workflow. Bury or generalize Section 4, and every downstream section becomes hand-waving.
-
It is the chapter most often fabricated by the generating model. Section 4 is exactly the kind of content where the model is tempted to invent plausible-sounding specifics: product feature lists that sound right, competitor product names that exist somewhere but not in the cited filing, revenue-by-product percentages that are never disclosed, "Lam is the leader in X" claims with a 10-K citation that doesn't say that. The Step 10 verification pass exists primarily because of how often Section 4 fails.
-
It is the chapter that distinguishes a serious research report from a Wikipedia summary. Sections 1, 2, 3, 6, 8 can be written by anyone with a Bloomberg terminal and a wiki crawler. Section 4, done well, requires reading the issuer's 10-K product table line by line, quoting it verbatim, and explaining what each product physically does in the customer's manufacturing / clinical / software flow. The reader's ability to say "now I understand why this company matters to its customers" is built or lost here.
The two requirements for Section 4 — be precise, and be explanatory.
Precise
- Anchor to the issuer's own product matrix. Most 10-Ks / 年度报告 / Yuho contain a Product matrix or Product Family table in Item 1 Business. Reproduce it verbatim as a markdown table (MANDATORY), quoting the issuer's own row / column labels; optionally also embed the rendered original as a PNG via the helper at
.claude/skills/company-research/scripts/render_10k_section.pywhen visual proof adds value. The markdown reproduction is the searchable, citable anchor and is required regardless; the PNG never substitutes for it. If the issuer does not publish such a table, build one from the company website (cited) and label it as analyst-constructed. - Quote the issuer's own product descriptions verbatim for each row of the matrix. Use
>markdown block-quote syntax with the inline 10-K citation directly above the quote. Verbatim text from the issuer is by definition non-fabricated, and it gives the reader Lam's / 三星's / Pfizer's own explanation of what the product does in their words. Do not paraphrase the 10-K — quote it. Paraphrase is where fabrication enters. - Every product name spelled exactly as the issuer spells it, including trademark symbols (®, ™), capitalization conventions, and platform-name prefixes (e.g.
ALTUS®, notAltus;Sense.i®, notSense-i). - Every technical specification (e.g. "etches channels >10µm deep at <0.1% CD deviation and 2.5× faster", "delivers 50%+ reduction in word-line resistance", "100× faster plasma response") comes verbatim from the issuer's press release or 10-K, with a citation. Numbers without a source are deleted.
- Competitor product names are cited to the competitor's own filing or website, never to the subject company's 10-K. The subject's 10-K Competition section lists competitor companies, not products.
- Analyst opinions are clearly labeled as
*Analyst view:*(or*分析师观点:*) and either cite a real industry-research source (Yole, Gartner, IDC, TrendForce — at a specific report URL) or stand uncited. They are never wrapped in a fake 10-K citation.
Explanatory
- Walk every product family with three pedagogical beats. For each row in the issuer's matrix, write a paragraph that covers:
- What it physically does in the customer's value-chain flow. Concrete physical role — not marketing prose. ("Electroplates copper to form the interconnect lines that carry signals between transistors", not "delivers advanced metallization solutions".)
- How it differentiates from sibling products in the same matrix. The reader should leave able to explain why a fab needs SABRE and ALTUS and VECTOR — not just "Lam sells deposition tools". Cross-reference to the other rows: "Unlike SABRE (which plates copper for interconnect), ALTUS deposits tungsten or molybdenum for the deeper contacts and word-lines…"
- Strategic significance: what technology inflection, customer build-out, or end-market wave is currently driving demand (HBM ramp, GAA logic transition, 400-layer NAND, advanced-packaging build-out, GLP-1 prescription growth, etc.). Cite the press release / 10-K Products text / earnings-call language for the inflection.
- For technical concepts, give both Chinese AND English side by side, in
Chinese / EnglishorEnglish / ChineseorChinese (English)form. Examples:dielectric / 介质,wordline / 字线,gate-all-around (GAA, 栅极环绕),high aspect ratio (HAR, 高纵横比),wafer-level packaging (WLP, 晶圆级封装). Code-switching freely within a sentence is encouraged — each language carries the term it expresses most compactly. The bilingual gloss is introduced with**中文释义 / Plain-language gloss:**so the reader knows it's the analyst's gloss, not 10-K text. (For US-domestic-only audiences with no Chinese exposure, you may drop the Chinese; but for any cross-border-investing context, bilingual is the preferred form.) - End the section with a synthesis paragraph that shows how the product categories interact. For semicap: the Deposition → Etch → Clean → Deposition manufacturing cycle. For pharma: discovery → preclinical → clinical → marketed. For industrial automation: cell → line → plant. Optionally a small Mermaid graph showing the loop. This is the "now you understand why each product matters" payoff.
- Use analogies where they accelerate understanding. "TSVs are the vertical 'elevator shafts' between stacked DRAM die"; "bevel cleaning is like trimming the wafer's edge before particles flake back onto the device area"; "Striker ALD is the atomic-precision insulator tool used where SiO₂ gapfill has zero tolerance for voids." Analogies are uncited (they're the analyst's pedagogical device) — but they must be physically accurate, not loose metaphors.
Length and depth target for Section 4: 700–1,500 words — meaningfully longer than every other section except possibly Industry Overview. If your draft has Section 4 at 500 words and Section 6 at 1,200 words, the priority is wrong; cut Section 6 and expand Section 4.
Specific failure modes that disqualify Section 4 — fix before declaring done:
- A flat list of product names with no explanation of what each does → not a research report, it's a product catalog.
- Competitive-position language ("dominant", "leader", "co-leader", "near-monopoly share") attached to a 10-K citation → misattribution; relabel as analyst view.
- Revenue percentages by sub-product category attributed to the 10-K → fabrication unless the company actually publishes the split; label as analyst estimate.
- Specific competitor product names (e.g. "AMAT's NOKOTA") attached to the subject's 10-K → wrong citation chain; cite competitor's own filing.
- Marketing language from the company's homepage substituted for 10-K verbatim quotes ("delivers cutting-edge solutions for advanced manufacturing") → not what 10-K says; replace with verbatim quote.
- A "synthesis" paragraph that just repeats the section structure rather than showing how products interact → re-write to show the actual customer workflow / cycle.
- No verbatim markdown reproduction of the issuer's own product matrix → the section reads like analyst opinion without primary anchor; reproduce the table verbatim to fix (the optional PNG embed via
render_10k_section.pydoes not substitute for it).
See references/report_structure.md § Section 4 for the per-row template, and references/quality_checklist.md for the pre-submit checklist.
延伸观看 / Further viewing — explainer videos (optional, but default to including)
When this report covers something a reader would struggle to picture from prose alone — a mechanical assembly (a humanoid robot's actuators / harmonic (strain-wave) reducers / ball-screws / force sensors), a semiconductor etch–deposition flow, HBM die-stacking, a surgical-robot wrist, a manufacturing or scientific process, a complex product architecture, an unfamiliar business model, or a market-structure concept — attach 1–3 short explainer videos (YouTube and/or Bilibili) so the reader can see it, not just read about it. Default to including them on any topic; omit only when the report is purely numeric with nothing worth visualizing. Section 4 is the natural home — it is where the report explains hard-to-visualize product mechanics.
Videos are a teaching aid, NOT a citation — they live in their own slot, never enter the citation chain, and never carry a number.
- Where: a
**延伸观看 / Further viewing**bullet list at the end of the section the concept lives in, or a single📺note beside the hard concept. English-only reports use**Further viewing**. - Durable sources only: the company's own product / IR / engineering channel, an OEM or reputable teardown / cutaway channel, or a well-known explainer channel — not a low-view re-upload that will be deleted or is clearly pirated.
- Validate before committing —
200 OKonly. YouTube / Bilibili return 403 to bareurllib, so HTTP-check each URL with a real-browser User-Agent; drop dead / private / region-gated links (a 404 link is worse than none). Flag Bilibili that may need login/VPN outside CN:(B站,部分地区或需登录). - Label honestly:
[<what it shows> — <why it helps>](URL). No statistic, price target, share figure, or growth rate is ever attributed to a video (a video can't be string-matched against its source).
Full spec:
reference/citations.md§ "Further viewing — explainer videos".
Investor presentations are first-class primary sources — use exhaustively when available
After 10-Ks / 年度报告 / Yuho, investor-relations materials are the next-most-load-bearing source category — often more informative than the formal filings for what research readers care most about: segment-mix economics, the TAM/SAM views the company itself endorses, customer-cohort disclosures, capital-allocation roadmaps, capacity build-out plans, and management's own framing of the moat. Whenever IR materials exist, treat collecting them as a non-optional Step 1 task and cite them aggressively throughout the report — quarterly earnings deck + transcript, the latest investor-day / capital-markets-day deck, conference presentations, the annual integrated report / ESG report / Mid-term Plan (especially for JP/KR/EU issuers), the shareholder letter, and the IPO prospectus / S-1 / 招股说明书 if within ~5–10 years.
Density bar: ≥8–12 distinct IR-material citations across the body when the company has a public IR program; ≥1 in each of Sections 1/4/6/8; the latest 2 quarterly decks AND the latest investor-day deck each cited at least once. Cite at the slide level ([… Investor Day 2024 deck, Slide 23 — TAM build](url)), chain-cite the underlying research when the deck credits Yole/Gartner/IDC, and keep transcript (CEO/CFO words) vs. deck (chart/number) as separate sources. If the company has effectively no IR program, say so in the verification log and lean on filings + third-party research.
Full spec — what to collect, where to find it per domicile (US / China-HK / Taiwan / Japan / Korea / private), the per-section "what IR slides unlock" table, and the slide-level citation discipline:
references/ir_materials.md.
Local institute-research library (db/zsxq.db) — search it FIRST for any sell-side view
The project carries a large local library of institute / sell-side research PDFs in db/zsxq.db (table pdf_files, ~6,900 rows and growing) — single-name notes, sector reports, supply-chain channel checks, and conference takeaways from Morgan Stanley, Goldman Sachs, J.P. Morgan, Bernstein, UBS, Citi, Deutsche Bank, HSBC, Nomura, and others. Before you web-search for any analyst opinion, consensus estimate, price target, or industry datapoint, search this local library first — it is faster, the source travels with the project (the user can click straight to the PDF in their viewer), and it is exactly the material that answers "what does the Street think" for Sections 2 / 6 / 7 / 8 / 9. Treat searching it as a non-optional data-collection task (it is Step 0.7 of the workflow).
This material is SELL-SIDE — the strictest citation discipline in this skill applies. Everything pulled from db/zsxq.db is an analyst opinion, not a primary fact. It must be labeled *Analyst view:* / *分析师观点:* and must never be attached to a filing citation (see § "Specific failure mode: do NOT misattribute sell-side opinions to filings"). A Morgan Stanley target-price or a "85% AI-GPU share" estimate is an MS view; cite it to the MS note, not to the 10-K.
How to search the library (by every alias, not just the ticker)
The lookup helper is find_pdf.py from the zsxq-analyze skill. Run a separate --query for each alias — ticker, English name, AND native-language name — because broker filenames and the curated summaries use a mix:
cd /Users/x/projects/financial_agent
# US ticker, English name, and Chinese name are DIFFERENT result sets — run all three.
/opt/anaconda3/bin/python3 .claude/skills/zsxq-analyze/scripts/find_pdf.py --query "NVDA" --limit 60
/opt/anaconda3/bin/python3 .claude/skills/zsxq-analyze/scripts/find_pdf.py --query "NVIDIA" --limit 60
/opt/anaconda3/bin/python3 .claude/skills/zsxq-analyze/scripts/find_pdf.py --query "英伟达" --limit 60
# Also sweep supply-chain / competitor / theme terms — sector notes that don't name the
# subject in the title often carry the most useful channel-check data in the summary:
/opt/anaconda3/bin/python3 .claude/skills/zsxq-analyze/scripts/find_pdf.py --query "Blackwell" --limit 40
/opt/anaconda3/bin/python3 .claude/skills/zsxq-analyze/scripts/find_pdf.py --query "AI server" --limit 40
--query does a case-insensitive LIKE across name / topic_title / summary / tags / comment, sorted create_time DESC. Rows come back as JSON with file_id, name, topic_title, summary, page_count, create_time, bank, local_path, local_exists. Apply the 12-month freshness rule (§ Citations): keep recent notes; ignore stale ones except for founding/structural facts. For a US name like NVDA this typically returns dozens of MS / GS / JPM / Bernstein notes — keep the 5–15 most relevant and most recent.
Interpreter & DB-lock fallback. Always invoke these scripts with /opt/anaconda3/bin/python3 — the bare python3 on PATH lacks project deps (browser_cookie3, PyPDF2 / ocrmac) and fails read-only mode=ro DB opens (this exact failure derailed a real run mid-report; see project memory feedback_anaconda_python_db_scripts.md). If find_pdf.py still errors because the user's live :5001 Flask holds db/zsxq.db, fall back to a SELECT-only immutable read for triage — sqlite3.connect('file:db/zsxq.db?mode=ro&immutable=1', uri=True) — which stays read-only and consistent with the project DB-safety tiers, and record the fallback in the Step 10 verification log.
The library has two layers — triage on the summary, then READ THE PDF
topic_title+summary(the curated 翻译精华) is for TRIAGE, not for citing. For most rows the summary is a clean Chinese digest that already states the broker, rating, price target, valuation basis, and 2–4 thesis points — enough to decide which notes matter and to grab a headline PT/rating fast. Example row (file_id 812488522252442): 维持 Overweight / 首选推荐,目标价 $288 … 基准情形基于 2027E EPS $13.08 × 22 倍 PE … AI GPU 市占率稳居 ~85% — broker (MS), rating, PT, valuation math, share estimate, without opening the PDF. But the 翻译精华 is a curated secondary translation — for anything you put in the report, quote the original extracted text, not the digest (same guardrail astheme-research/zsxq-ideas).- Open and READ the PDF for any note that matters — image-only is NOT a blocker. Many broker PDFs are scanned (every page returns empty text from
fitz), but the content is fully recoverable; never skip a note because "the text is empty." Use the three-tier flow from the project CLAUDE.md /zsxq-analyzeskill (ocrmac → Marker → vision-LM; never Tesseract):
(Tier 2, Marker, is for scrambled multi-column reading order or tables-as-markdown — reach for it when ocrmac garbles a dense financial table.) String-match every number you quote against the OCR'd / extracted / vision-read original text — no number enters the report that you have not seen as a literal string in the source PDF. The summary alone is never sufficient sourcing for a hard number.# Tier 1 — OCR image-only pages (Apple Vision / ocrmac, ~1s/page, cached to pdf_files.ocr_text; free on re-run) /opt/anaconda3/bin/python3 .claude/skills/zsxq-analyze/scripts/ocr_pdf.py --file-id <id> # Then extract — auto-merges the OCR cache for empty pages /opt/anaconda3/bin/python3 .claude/skills/zsxq-analyze/scripts/extract_pdf.py --file-id <id> --header # Tier 3 — for charts / dense tables where meaning is visual: render the page, then READ the PNG yourself (you, Claude, are the extractor — no external API) /opt/anaconda3/bin/python3 .claude/skills/zsxq-analyze/scripts/render_pdf_pages.py --file-id <id> --pages 4-6
What the library unlocks, by report section
| Section | What a broker note in db/zsxq.db typically supplies (label all as Analyst view:) |
|---|---|
| 2. Valuation & PT | Consensus / target price, the bull-base-bear PT scenarios, the valuation basis (forward EPS × multiple), the consensus estimate to benchmark your forward model against (the UBS/Nomura "+16% vs Street" move), where the analyst sits vs the Street. Pair with the actual multiples + forward model from Step 2. |
| 6. Industry | Channel checks, unit/ASP/capex forecasts, end-market build-out timing, supply-chain reads (memory, substrate, CoWoS, lead-times) that filings never disclose. |
| 7. Competitive | Side-by-side share estimates, who's winning which socket, ASIC-vs-GPU framing, second-source dynamics. (Share numbers are estimates — never cite them to the subject's 10-K.) |
| 8. TAM | Sell-side TAM/SAM build-ups with their assumptions; chain-cite the underlying research firm when the note credits Yole/Gartner/TrendForce. |
| 9. Risks / 9.5 Debates | The bear case in the analyst's own words — what the skeptics worry about (memory price cuts, China demand, ASIC encroachment), with the specific trigger — feeds both the Section 9 risk inventory and the Section 9.5 key-debates rebuttals. |
| Channel checks | Proprietary channel-check data as a first-class evidence class — shipment trackers (NE Times monthly SoC shipments), Frost & Sullivan / Yole rankings, credit-card spend panels, App-download / Google-Trends momentum. Cite as Analyst view: via the broker note and flag it as channel-check-derived so the reader knows the provenance. Every sell-side analog leans on these. |
| Bull/Bear & lenses | The note's own scenario tree feeds the optional Section 10 lenses and any bull-bear framing directly. |
Citation format for db/zsxq.db sources
Cite the local viewer URL so the user can click straight to the PDF they own, and put broker + date + page in the link text:
*Analyst view:* 摩根士丹利维持 NVDA 增持(Overweight)评级、目标价 $288,估值基于 2027E EPS $13.08 × 22× PE([Morgan Stanley — NVIDIA Computex keynote & analyst Q&A, 2026-06-03, p.1](http://xs-macbook-air.local:5001/zsxq/pdf/812488522252442/Morgan%20Stanley-NVIDIA%20Corp.%EF%BC%88NVDA.US%EF%BC%89Computex%20NVDA%20keynote%20%26%20financial%20analyst%20Q%26A-260603.pdf))。
- Canonical route (verified 200, direct download):
http://xs-macbook-air.local:5001/zsxq/pdf/<file_id>/<filename>— the<filename>ispdf_files.nameURL-encoded. Paste thepdf_urlfield thatfind_pdf.pynow emits verbatim — don't hand-build it. This route serves rawapplication/pdf, so tapping it on iPad opens/downloads the PDF natively. Do NOT use/zsxq/pdf-viewer/<file_id>(the PDF.js viewer page — it returnstext/htmland does not download on iPad), and do NOT use the oldest/zsxq-pdf/<file_id>form (dead 404). Put the page number in the link text (p.N); appending#page=Nto the URL is harmless and is honored by native PDF viewers. - Always include the broker and the note date in the link title —
[Morgan Stanley — <title>, YYYY-MM-DD, p.N](…)— never the bare title or a naked URL. - Pair every borrowed broker PT with the stock's price on the note's date (mandatory). A
目标价 $288lifted from a 2026-06-03 MS note is uninterpretable without the price NVDA traded at on 2026-06-03 — that report-date price is what fixes the upside MS actually called, and it is NOT the same as the report header's current spot. Write it as目标价 $288(较 2026-06-03 收盘 $232 上行 +24%). The report-date close + upside are already stored instock_price_target_db(report_date_price/upside_pct, looked up byscripts/persist_pts.py) and shown at/pt— read them back, or look up the yfinance close on the note's date. If the report-date price is unavailable, writereport-date price n/arather than substituting today's spot. (The report's own 12-month PT in the header keeps showing today's current price, as already specified — this rule is specifically for borrowed sell-side PTs.) - Quote the original-language source text alongside the number. The summary digests are Chinese; the underlying PDFs may be English — preserve whichever language the source uses.
- These local URLs are user-machine-only (they will 404 for anyone else), so a finished report should still anchor its hard facts to public primary sources (filings, IR decks). Use zsxq citations specifically for the analyst-opinion/estimate/channel-check layer they uniquely provide.
If the local library is thin, fetch more — then re-search
If find_pdf.py returns few or stale rows for the subject (common for small / non-US / newly-covered names), top up the library from the web, then re-run the searches above:
cd /Users/x/projects/financial_agent
# Targeted: pull recent broker notes that mention the subject by ticker / name
/opt/anaconda3/bin/python3 download/zsxq_downloader.py --count 100 --query NVDA
# General top-up of the recent feed (the user's standing command):
/opt/anaconda3/bin/python3 download/zsxq_downloader.py --count 100 --query lite
The downloader is idempotent (records query_term, dedups on file_id), saves PDFs locally, and indexes them into db/zsxq.db so the next find_pdf.py sees them. Note in the verification log how many zsxq notes you found vs fetched.
The "density bar" for institute-research citations
- At least 3–6 distinct
db/zsxq.dbcitations in the body when the subject has any meaningful local coverage (a US large-cap like NVDA will have dozens of candidate notes — there is no excuse for zero). - At least one in Section 2 (the PT/consensus line) and one in Section 9 (the bear case) whenever the notes support it.
- Every one labeled
*Analyst view:*/*分析师观点:*and cited to the/zsxq/pdf/<file_id>/<filename>direct-download route — never blended into a filing citation. - If the library genuinely has nothing on the subject even after a
--querytop-up, say so in the verification log; don't pad with web-searched analyst blogs in its place.
卖方观点演变 (Sell-side view evolution) — mandatory when ≥2 zsxq notes cover the subject
Whenever the report draws on ≥2 db/zsxq.db broker notes for the same company, it MUST carry a 卖方观点演变 (Sell-side view evolution) subsection — place it in Section 2 beside the consensus / PT benchmark line (or in Section 9.5 when the debate framing fits better). Four requirements:
- Mechanical pre-pass FIRST — read
db/stock_price_target.dbbefore re-reading any PDF. STRICTLY READ-ONLY:/opt/anaconda3/bin/python3withsqlite3.connect('file:db/stock_price_target.db?mode=ro', uri=True); SELECT all rows for the ticker (columns:research_institute, rating, price_target, target_currency, report_date, report_file_id, upside_pct). This mechanically surfaces same-institute revisions and the PT dispersion (min / median / max, spread %) before any PDF work. Writes to this DB remain exclusively viascripts/persist_pts.py(Tier-2 helper). - Per-institute view timeline (按机构的观点时间线). Order each institute's notes by report date — the filename's
-YYMMDDsuffix is the authoritative publication date (sanity-check againstcreate_time). Per entry: institute, date, rating, PT, key estimates, one-line thesis. Explicitly call out self-revisions — upgrade / downgrade, PT raised / cut from X to Y, thesis pivot — and the stated trigger (earnings print, policy change, channel checks, order data). A 2026-03 PT and a 2026-06 PT from the same institute are two different views, not duplicates. - Cross-institute disagreement (机构间分歧) — never blend contradictory views into a fake consensus. When institutes disagree (opposite ratings, PTs >20% apart, conflicting reads of the same datapoint), render a disagreement table:
机构 | 日期 | 评级 / 目标价 | 核心论点 | 什么证据能证明其正确(Institute | Date | Rating / PT | Core argument | What evidence would prove them right). - Every view dated and cited. Each institute view carries (institute, report date,
/zsxq/pdf/<file_id>/<filename>direct-download link) per the citation format above, and the report-date-price pairing rule applies to every PT quoted in the timeline.
Investor-lens scorecards (optional Section 10 of the report)
After Sections 1–9 establish the facts, named scoring rubrics give the reader a structured second opinion on the same evidence. Four core lenses (default) — Buffett (quality at a sensible price, 0–100), Munger (weighted quality + inversion, 0–10), Damodaran (story-plus-numbers DCF margin of safety, ±%), and Howard Marks cycle (market regime offense↔defense, 0–100). Five optional lenses (add by company fit or on request) — Lynch GARP (10.5, PEG + category), Fisher scuttlebutt (10.6, qualitative 15-point growth), Burry forensic deep value (10.7, hated-sector + downside-first), Druckenmiller liquidity-regime (10.8, macro liquidity + asymmetric sizing), Cathie Wood Wright's Law (10.9, cost-curve + 5-year TAM re-pricing). All nine are analytical overlays on data already cited in earlier sections; none are persona role-play. Adapted from the LLMQuant investor-lens skill collection (MIT).
When to include: any initiation-style report where the audience is a buy/sell decision-maker. Skip only when the user explicitly says "no lens scorecards" / "skip Section 10". The section is short (600–1,000 words total) and worth the small cost.
Placement: new Section 10 between Section 9 Risk Assessment and the References block, in both the English and Chinese reports. Verdicts are labelled *Lens view:* / *视角观点:* per the existing analyst-view discipline — never Buffett would buy, 巴菲特会买, or Damodaran's fair value is.
Key inputs already in your tree:
- Sections 1–9 facts (re-use, do not introduce new inline citations inside Section 10).
indicators.dbsnapshot (VIX, 10Y Treasury via^TNX, HY OAS via FRED BAMLH0A0HYM2, IG OAS) for the cycle posture and Damodaran's risk-free rate. State the as-of date inline.- Canonical citation form for the cycle snapshot (MANDATORY — it is local data, not a web source). Cite as plain text:
(来源:indicators.db 本地快照(FRED BAMLH0A0HYM2 / ^TNX + yfinance),as of YYYY-MM-DD)(English reports:(Source: indicators.db local snapshot (FRED BAMLH0A0HYM2 / ^TNX + yfinance), as of YYYY-MM-DD)). Optionally link each series name to its specific FRED series page (e.g.https://fred.stlouisfed.org/series/BAMLH0A0HYM2). NEVER attach anindicators.dbsnapshot label to a filing URL — a 200-OK 10-K that doesn't contain the quoted yield is worse than a 404 — and NEVER link tolocalhost(user-facing local URLs usexs-macbook-air.local, and the snapshot needs no local link at all).
See references/investor_lenses.md for the nine rubrics in detail — scoring components, verdict bands, required-assumption blocks, failure modes, the routing rules for picking optional lenses by company type, and the guardrails that apply to all nine.
GF Score (GuruFocus-style) fundamental scorecard — Section 1B
A five-axis fundamental scorecard modelled on GuruFocus's GF Score™, placed as Section 1B (right after 1A Valuation & Price Target) so the decision layer — rating/PT → valuation → fundamental health — reads together near the top, mirroring the GuruFocus summary widget. Include in every initiation-style report unless the user says "skip the GF Score". The five axes, each ranked 0–10, are Financial Strength · Profitability · Growth · GF Value (valuation, higher = cheaper) · Momentum; a transparent weighting maps them to a 0–100 composite and GuruFocus's outperformance bands (91–100 highest … 0–50 worst). The signature visual is a radar/pentagon rendered as inline SVG by scripts/gf_score.py (stdlib-only, no matplotlib — safe for the memory budget; bakes the required source annotation into the image).
It is an analytical overlay, like the Section-10 lenses — not a new data source and not an endorsement. The honesty discipline is load-bearing: the five sub-scores and the composite are the analyst's own rubric output, labeled *Analyst view:* / *分析师观点:* and never carrying a filing citation; every underlying metric (ROE, leverage, CAGR, multiples, price returns) carries its own inline citation; and the computed number is never attributed to GuruFocus unless you actually pulled their published figure from gurufocus.com/term/gf-score/<TICKER> (shown separately as a cross-check). Each axis gets a one-paragraph rationale stating WHY that score — the "reasons" are the part the reader most wants. Its inputs are already in your tree (financials from Step 1–2, Growth from the 1A model, GF Value from the 1A multiples/intrinsic range, Momentum from the header relative-performance line), so it adds little marginal work.
See reference/gf_score.md for the full spec — the 0–10 anchors per axis, the metric set behind each, the composite weights and band labels, the radar-helper usage, the multi-company overlay variant, and the honesty/citation guardrails. Read it before writing Section 1B. Computed in Step 2c.
Financial-statement visuals (Sankey / donut / DuPont) — scripts/financial_charts.py
The stockanalysis.com-style financials charts a reader expects: an income-statement Sankey (revenue → COGS / gross profit → opex / operating income → tax / net income, with revenue sources on the left), balance-sheet and cash-flow Sankeys, a revenue donut (by segment / geography), historical stacked revenue bars, and a 5-step DuPont ROE tree. Like the GF Score radar, these are rendered as stdlib-only inline SVG by scripts/financial_charts.py (imports just math / argparse, ~0 MB resident — safe on the memory budget, never matplotlib) and the viewer injects the raw <svg> verbatim. Paste the emitted <svg> un-fenced.
The defining discipline: every number you pass must come from the company's OWN statements that you read and cite — the 10-K / 10-Q / 20-F / 年度报告 / IR-deck income statement, balance sheet, cash-flow statement, and segment note (ASC 280 / IFRS 8) for the segment / geography splits. The helper fetches nothing (no API, no XBRL auto-pull) — it only lays out the numbers you give it, so the project's "every figure traces to a source you read" rule holds. The required --source is baked into the image; the surrounding paragraph still carries the page-level citation. If a line item isn't disclosed, omit it — never invent it.
Generate the full suite by default (income / balance / cash-flow Sankeys + segment donut + geography donut + revbars + DuPont) — not just the income Sankey and one donut; omit a chart only when the underlying statement/disclosure truly doesn't exist, and note the omission in the Step 10 log.
See references/financial_charts.md for the full spec — the six financial-statement subcommands, the per-subcommand CLI with worked ISRG examples, the embedding form, the per-section placement bar, and the sourcing guardrails. Read it before generating these in Step 8. (The seventh subcommand, moneyflow, has its own spec in references/money_flow.md — see the next section.) Generated in Step 8.
Money-flow (supply-chain) diagram — scripts/financial_charts.py moneyflow — REQUIRED, one per report
Beyond the financial-statement charts, every report also gets a 3-stage "follow the dollars" money-flow map in the dark gold-ribbon style — who pays → what they buy → where the money pools. It is the one diagram that shows where the company's COGS / capex actually lands (its suppliers, and their suppliers — the chokepoints), which a statement Sankey can't. It is the visual the user singled out as "very intuitive." Same stdlib-only inline-SVG engine (moneyflow subcommand, JSON-spec-driven, ~0 MB, never matplotlib); the SVG is self-contained and dark-themed, so it embeds cleanly in the otherwise-light report. It also renders the reference's "Follow the money" card grid (4–6 thesis cards summarizing the flow, gold-emphasized numbers) inside the same SVG. Paste it un-fenced.
It is NOT a flow-conserving Sankey — ribbon thickness is rough relative scale (the baked-in legend says so). Pick the orientation that illuminates the company (upstream/spend view for buyers & integrators; demand/revenue view for suppliers & component makers), use solid ribbons for money paid directly and dashed for money embedded in a finished part bought from someone else. Every node must be a real, sourced counterpart (named supplier/customer from filings, IR, teardown/channel reports, or the zsxq library — never an invented one); any $ figure in a ribbon label must string-match a cited source; --source is baked into the footer; the surrounding paragraph carries the inline citations and a short sourced "follow the money" note.
See references/money_flow.md for the full JSON spec, the kind palette, the two orientations, the worked Tesla/SpaceX example, placement, and the sourcing guardrails. Read it before generating the diagram in Step 8. Place it in Section 4 (Products & Services) as the supply-chain anchor, or Section 6 (Industry) as the value-chain visual — wherever the supply chain is actually discussed. Generated in Step 8.
Learning from sell-side institutional research
A methodology study of 22 initiation / deep-dive notes from Goldman Sachs, Morgan Stanley, UBS, J.P. Morgan, Bernstein, Nomura, Citi, BofA, Deutsche Bank, and HSBC found one structural gap: every institutional single-name note is a decision note built around a rating and a price target, while this skill produces a descriptive profile that stops at a TTM-multiple snapshot. The lessons below close that gap. They are additive — every existing rule (no fabricated numbers, paragraph-level citations, *Analyst view:* labeling, language defaults, file-naming) holds unchanged. The defining discipline that makes this safe: the rating, the price target, every projected estimate, and the scenario PTs are all the analyst's own forward view — they MUST be labeled *Analyst view:* / *分析师观点:* and NEVER attached to a filing citation. A 10-K does not contain a price target; attaching one to a 10-K is the same misattribution failure the skill already forbids.
- Open every report with a standardized header block — mirror the Deutsche Bank / GS / Citi cover page. Before the TOC (after the optional guidance banner): Rating (Buy / Hold / Sell, or OW / Neutral / UW — pick one scale and state it), 12-month Price Target, current price, implied upside / downside %, one-line valuation method, market cap, 52-week range, ticker / exchange, then the 2–4 thesis pillars one sentence each. The whole block is labeled
*Analyst view:*— it is a house view, not filing data. Seereferences/report_structure.md§ "Investment summary header". - Lead Section 1 with the thesis, not the description — BLUF house style (every analog does this). The first paragraph states the call, the why-now, and the 2–4 pillars before any "what the company does" prose. Deutsche Bank's Huayan note opens "Buy, TP HK$28.2" with three bolded sub-heads; J.P. Morgan's Yingliu note opens with the scarcity-positioning thesis. Keep all 9 descriptive sections — they feed the thesis — but add the synthesis layer on top.
- Build a forward financial model — a multi-year estimates table is non-negotiable. Project revenue / gross margin / operating-or-net margin / EPS 3 years forward (the analogs run 3–5: Yingliu RMB2.9bn→11.3bn 2025–2030E ~30% CAGR; Horizon licensing-65%→hardware-47% mix shift by 2027). Each projected cell is
*Analyst view:*; each driver's external basis is cited inline (filing segment data + management guidance + an industry forecast) per the existing "the analyst's own model is NOT a source" rule. Model the segment mix shift (each line gets its own revenue path + margin trajectory, then summed — Tesla's 6-way SOTP), not just a blended top-line. - Derive the price target and SHOW the arithmetic — mirror J.P. Morgan's Yingliu (
2028E EPS × 40x PE = RMB95). State the method: forward-EPS × target multiple, or DCF (WACC built fromindicators.db10Y + a stated ERP, terminal growth ≤ risk-free), or SOTP, or rNPV for biotech. Justify the multiple against 3–5 named comps — JPM defended Yingliu's 40x against Howmet's 37x on a 55%-vs-23% EPS-CAGR gap. The justification of the multiple is as load-bearing as the number itself. - Give three price targets — bull / base / bear — each tied to its swing assumption (Morgan Stanley Hesai $53 / $30 / $11.5; Citi Yunnan-Energy 3-scenario table). Base = central estimates; bull = faster attach / penetration or a higher multiple; bear = price war / margin compression. Report upside / downside % on each so the reader sees risk-reward symmetry at a glance. All three labeled
*Analyst view:*. - Position the forward estimates against consensus — the UBS / Nomura "+16% vs Street" move. When the local zsxq library or other sourced material carries Street estimates or a consensus PT, state where the report's own numbers sit (above / below, by how much). UBS framed Alphabet 2027E revenue "+16% vs Street"; Nomura framed peak sales "57% above market". Source the consensus number to the zsxq note (
*Analyst view:*) or a dated public source — never invent a consensus figure (this reinforces, not loosens, the numerical-accuracy rule). - Add a "Key debates & catalysts" block — distinct from the risk inventory (Morgan Stanley's 市场核心分歧 / Hesai three-debate pattern). List the 2–4 arguments the bears make and rebut each; then a dated forward-catalyst list for the next 12 months (GS Hemab: Phase-3 start H2-26, FVIID data late-26) with a pointer to the catalyst-calendar skill for ongoing tracking. Keep the risk taxonomy itself in Section 9 — debates defend the thesis; risks inventory the downside.
- Name the 1–2 swing variables the call hinges on (MS Hesai: lidar-GM floor + auto attach rate; UBS Alphabet: TPU rev-rec timing + Vertex mix). The reader should know which assumption to pressure-test. Tie every margin-trajectory claim to its driver (mix shift / operating leverage / pricing power) — never just "margins improve".
- Treat proprietary channel checks as a named, citeable evidence class. When the local zsxq notes carry channel-check data (NE Times monthly shipment trackers, Frost & Sullivan rankings, credit-card spend panels, App-download / Google-Trends momentum), cite it as
*Analyst view:*via the broker note and flag it as channel-check-derived so the reader knows its provenance. Every analog leans on channel checks; the skill has the zsxq plumbing but hadn't named this evidence type. - Pair every number with a comparison anchor and conviction label. Sell-side numbers rarely appear bare:
+33% YoY,vs consensus +16%,47% upside,GM 36%→43%. Conviction language is calibrated and explicitly labeled (preferred pick/top idea/under-appreciated/fully priced) — and under this skill's rules it stays an*Analyst view:*, never attributed to a filing.
Cover-page & exhibit discipline (the Bernstein ISRG 4Q25 study). A close read of one institutional single-name note — Bernstein's "Intuitive Surgical 4Q25: Squeaky clean quarter; top pick (PT $750)" — surfaced five concrete habits worth importing wholesale; each is now specified in references/report_structure.md (header block + Section 1A):
- A forward valuation matrix, not one multiple. The cover carries P/E, PEG, EV/EBITDA, EV/FCF, EV/Sales across last-actual / FY1E / FY2E so the reader sees the multiple compress as estimates grow (ISRG Adj P/E 58.9× → 52.0× → 44.9×). Add ROIC and a CAGR column to the forward model, and run it quarterly + annual, by revenue segment — annual-only endpoints hide the inflection.
- A margin bridge with bps. Decompose every GM / operating-margin move into named drivers with magnitudes (
GM −110bps = tariffs −95bps · richer dV5/Ion mix −40bps · facility depreciation −30bps · cost reductions +55bps). "Margins improve" is not analysis. - A Guide-vs-Consensus-vs-Own table. When the company guides, lay company-guide / Street-consensus / this-report side by side (Bernstein Exhibit 1), each column sourced per its provenance.
- Revision transparency. On a refresh, show prior beside new (
PT $750 (was $740),FY27E EPS $11.72 (was $11.61)) and attribute the PT move to estimate-change vs multiple-change (Bernstein's was 100% estimate — multiple held at 64×). - Management quotes are the spine, and every exhibit caption states the conclusion. The note anchors each thematic claim (cardiac TAM, XiR/ASC opportunity, China pricing) to a multi-sentence verbatim earnings-call Q&A block, and every chart caption states the takeaway ("ISRG guided to 67–68% GM, above consensus 67.2%"), not just the source. Quote management densely from transcripts; write exhibit captions as findings, not labels.
Report language
Default behavior: produce ONLY a Simplified Chinese (zh-CN) report. Never Traditional Chinese, Japanese, or Korean for the prose. An English-language report is produced only when the user explicitly opts in.
Explicit user override (highest priority). Honor any of these phrasings without asking:
| User says | Output |
|---|---|
| No override | Simplified Chinese only (default — one file: <Slug>_公司研究.md) |
"... in Chinese only", "用中文即可", "只要中文", "--lang zh", "--zh-only" |
Same as default — Simplified Chinese only |
"... in English", "English report", "English only", "just English", "--lang en", "--en-only" |
English only (skip Chinese; one file: <Slug>_Research_Document.md) |
"... in English and Chinese", "both languages", "bilingual", "also in English", "也出一份英文", "加一份英文" |
Both languages — two separate files in the same folder |
Examples:
research SZSE:002050→ one file: Chinese only (default)research NVDA→ one file: Chinese only (default)research Tesla in English only→ English report onlyresearch 比亚迪 用中文即可→ Chinese report only (= default)research NVDA bilingual/research NVDA also in English→ two files: Chinese + Englishresearch NVDA in English and Chinese→ two files: Chinese + English
Single-language mode (default) produces one complete report file, written natively in Chinese and independently meeting the 6,000–10,000 word target (counted in characters). Filename (no date suffix — see the "Filenames" section below; English / pinyin component is mandatory):
reports/company/Tesla_NASDAQ_TSLA/Tesla_NASDAQ_TSLA_公司研究.md(Chinese, default)
Bilingual mode (only when the user opts in) produces two complete, separate files in the same output folder — not one interleaved document. Each meets the 6,000–10,000 word target independently. The pair:
reports/company/Tesla_NASDAQ_TSLA/Tesla_NASDAQ_TSLA_公司研究.md(Chinese)reports/company/Tesla_NASDAQ_TSLA/Tesla_NASDAQ_TSLA_Research_Document.md(English)
Both files share the same underlying research — citations, charts, data — but write the prose natively in each language; do not literal-translate one from the other.
Write natural Simplified Chinese — never word-for-word calques of English headers/terms (MANDATORY). The Chinese prose must read as if written by a native Chinese equity analyst, NOT machine-translated. The failure mode to avoid: literally rendering an English label into a Chinese compound that no Chinese analyst would write. Concrete past offenders and their fixes — do not reproduce the left column:
- "house view" → ❌
房观点(房 = building!) → ✅本方观点/本报告观点- "Guidance banner" → ❌
业绩更新横幅(横幅 = a UI banner) → ✅业绩更新/业绩快报- "per-axis rationale / why these scores" → ❌
逐轴理由→ ✅各维度评分理由- "swing variables" → ❌
枢纽变量→ ✅最该盯紧的变量/关键变量- "multiple justification" → ❌
倍数的辩护(辩护 = legal defense) → ✅为什么用这个倍数/估值倍数依据- "vs consensus" → ❌
对照市场一致(incomplete) → ✅与市场一致预期的对比Rule of thumb: an English technical term keeps its English form + a Chinese gloss (per the list below); but an English section heading or rhetorical label must be re-expressed in idiomatic Chinese, not transliterated morpheme-by-morpheme. When unsure whether a Chinese rendering sounds natural, prefer the plainer, more conversational phrasing a Chinese sell-side note would use. This applies to all report-producing skills.
Technical terms in Chinese reports — keep the English term alongside the Chinese gloss (MANDATORY). Since most technical / industry / financial / regulatory terms originate in English (or have established English equivalents), the Chinese report uses both languages: English term first with the Chinese gloss in parentheses on first mention, then either form is fine thereafter. For specific named entities (products, ratings, indices, regulations), keep the English form throughout. Categories where this rule applies:
- Financial metrics:
gross margin (毛利率),operating margin (经营利润率),free cash flow / FCF (自由现金流),EBITDA,ROIC (投资回报率),ROE,EV/EBITDA,P/E,P/S,P/B,working capital (营运资本),CapEx (资本开支),R&D (研发费用),SG&A. - Industry / technical concepts:
semiconductor (半导体),advanced packaging (先进封装),gate-all-around / GAA (栅极环绕),high-bandwidth memory / HBM (高带宽内存),wafer (晶圆),foundry (晶圆代工),data-center GPU (数据中心 GPU),EV (电动车),LFP / NMC battery (磷酸铁锂 / 三元电池),BMS (电池管理系统),Tier-1 supplier (一级供应商). - Pharma / biotech:
GLP-1 agonist (GLP-1 激动剂),IND filing (新药临床试验申请), `Phase III tr
*Truncated - read the full file at https://github.com/dadachundan/financial_agent/blob/e38112fa49dd368b650012b7f28627e3826183ee/.claude/skills/company-research/SKILL.md.