中文文档:README.zh-CN.md
A public-evidence company research toolkit with two complementary agent skills:
| Skill | Question it answers | Main deliverable |
|---|---|---|
company-talent-economics |
How much do people earn, how many cross a pay threshold, and which roles are economically critical? | Auditable compensation and career report |
estimate-layoff-risk |
What is an employee, intern, contractor, or role group's 3/6/12-month involuntary job-loss risk? | Evidence-backed risk intervals and scenario report |
Both skills start from business economics and profit pools rather than titles, sentiment, or salary-site anecdotes. They separate public facts, user-provided facts, assumptions, derived metrics, and inference.
The toolkit runs in Claude Code, Codex, and compatible skill hosts. The talent-economics skill supports multilingual typesetting; the layoff-risk skill uses an adaptive candidate interview plus current public research.
A directory of auditable artifacts, with report.pdf as the deliverable:
| File | What it is |
|---|---|
report.pdf |
The typeset report: 12 sections, cover, localized tables, evidence status on every number |
report.json |
The structured model the PDF is rendered from |
analysis_notes.md |
The nine written-out reasoning chains with intermediate numbers |
evidence.jsonl |
Claim-level ledger: every number, its source, its tier, its claim type |
source_manifest.csv |
Every source searched — including the ones that turned up nothing |
model.json / population.json |
Bucket model and the Monte Carlo population estimate |
The method runs one causal chain, in this order:
business model → profit pools → critical processes → critical roles
→ org/level structure → market replacement cost → compensation distribution → promotion paths
A title is not a salary. Two people at the same nominal level are worth different amounts if they control different profit pools, customer relationships or technical bottlenecks — so the analysis starts from where the money is made, not from a salary survey.
Pick one. The first is the shortest; the second is the most portable.
/plugin marketplace add kelvinfkr/company_skill
/plugin install company-talent-economics@company-skill
git clone https://github.com/kelvinfkr/company_skill.git
cd company_skill
bash install.shThe current installer symlinks company-talent-economics into ~/.claude/skills/ and
~/.codex/skills/, then checks its dependencies. Because it is a symlink, git pull updates
both hosts at once.
Install estimate-layoff-risk separately:
ln -s "$(pwd)/skills/estimate-layoff-risk" ~/.codex/skills/estimate-layoff-risk
# or: cp -R skills/estimate-layoff-risk ~/.codex/skills/For Claude Code, use ~/.claude/skills/estimate-layoff-risk as the destination instead.
bash install.sh --claude # Claude Code only
bash install.sh --codex # Codex only
bash install.sh --project # also into ./.claude/skills of the current repo
bash install.sh --copy # copy instead of symlink
bash install.sh --check # verify dependencies, install nothing
bash install.sh --zip # build dist/company-talent-economics.zip
bash install.sh --uninstall # remove the linksOne-liner, no clone needed (it fetches the repo into ~/.cache first):
curl -fsSL https://raw.githubusercontent.com/kelvinfkr/company_skill/main/install.sh | bashbash install.sh --zipThen upload dist/company-talent-economics.zip at Settings → Capabilities → Skills → Upload skill.
Copy or symlink skills/company-talent-economics/ into any of:
| Host | Path |
|---|---|
| Claude Code, global | ~/.claude/skills/company-talent-economics/ |
| Claude Code, one project | <repo>/.claude/skills/company-talent-economics/ |
| Codex | ~/.codex/skills/company-talent-economics/ |
| Needed for | Install | |
|---|---|---|
| Python 3.9+ | everything | already on most systems |
python-docx |
rendering the report | pip install -r skills/company-talent-economics/requirements.txt |
| LibreOffice | DOCX → PDF | apt install libreoffice-writer / brew install --cask libreoffice |
| Noto fonts | non-Latin scripts | apt install fonts-noto-cjk fonts-noto-core |
Everything except the renderer is standard library only. Without LibreOffice,
render_report.py --docx-only still produces the DOCX. bash install.sh --check tells you exactly
what is missing and what it affects.
Ask for compensation and talent economics:
小米集团的员工薪酬分布是怎样的?年薪超过 100 万的有多少人?
How many people at Siemens earn above €150k, and which roles justify it?
ソニーで年収2000万円を超える社員は何人くらいいますか?
Ask for involuntary job-loss risk:
Use estimate-layoff-risk to assess a Dreame product intern's 3/6/12-month risk.
Interview me first, then research current public evidence and produce scenario ranges.
Or invoke a skill directly:
| Host | Talent economics | Layoff risk |
|---|---|---|
| Claude Code | /company-talent-economics <company> |
/estimate-layoff-risk <company and role> |
| Codex | $company-talent-economics <company> |
$estimate-layoff-risk <company and role> |
See the layoff skill's README for its full interview prompt, profit-pool framework, privacy boundaries, CLI pipeline, and fictional worked example.
S=~/.claude/skills/company-talent-economics
python $S/scripts/init_run.py "小米集团" --out ./talent-economics/xiaomi --year 2025
python $S/scripts/check_phase.py ./talent-economics/xiaomi --next # prints the next phase's steps
# ...do them...
python $S/scripts/check_phase.py ./talent-economics/xiaomi # gate check; repeat to phase 10init_run.py infers language, jurisdiction, currency and threshold from the company name and prints
what it chose. Override any of them:
python $S/scripts/init_run.py "Nestlé S.A." --out ./tmp/nestle --year 2024 \
--jurisdiction ch --language fr --currency CHF --threshold 250000check_phase.py is the spine. Each gate mechanically refuses to advance until the work is real:
sources are logged, every figure carries an evidence id, the modelled payroll reconciles with the
disclosed payroll within ±10%, no TODO survives into report.json. The gate output is the
to-do list.
| Phase | Gate |
|---|---|
| 0 | Entity, language, jurisdiction resolved |
| 1 | Six search passes logged; core facts sourced |
| 2 | Payroll envelope and profit pools written out |
| 3 | Level ladder mapped |
| 4 | Compensation evidence per band |
| 5 | Population model runs and reconciles |
| 6 | Three-band pay diagnosis for critical roles |
| 7 | ≥8 career transitions |
| 8 | Charter, equity, and every prose section filled |
| 9 | Cross-checks and sensitivity |
| 10 | PDF rendered, inspected, checklist ticked |
The report follows the language of the company name. If you write your request in a different language from the company name, your language wins — you are the reader.
Resolution order: --language → $CTE_LANG → the script and legal form of the company name.
python $S/scripts/i18n.py detect "台積電股份有限公司"
# {"language": "zh-TW", "confidence": "high", "jurisdiction_hint": "tw", ...}Two different things get called "language" here:
- prose language — the language the analysis is written in. Any language.
- chrome locale — section titles, table headers, claim-type labels, number grouping, fonts and
text direction. Twelve shipped packs:
en zh-CN zh-TW ja ko es fr de pt it ru ar
A language with no pack still produces a full report in that language; the structural labels fall
back (zh-HK → zh-TW → en) and the renderer says so. Numbers are scaled the way each language
actually says them — 1.2 亿, 120M, 1,2 Mrd., 2 億 — and Arabic and Hebrew render right-to-left,
with mirrored tables and footer.
Add a language — one JSON file, no code:
python $S/scripts/check_locales.py --new nl # scaffolds locales/nl.json from English
# translate the strings; keep the keys and every {placeholder}
python $S/scripts/check_locales.py # verifies itassets/jurisdictions.json carries, per country: filing venues to scope site: searches to, the
local names of the documents worth fetching, the company registry, currency, a high-pay threshold
prior, an employer social-contribution rate, and a note on what that regime is unusually good at —
or unusually misleading about.
python $S/scripts/i18n.py jurisdictions # list all
python $S/scripts/i18n.py jurisdictions japan # one entry; aliases resolveAliases work, so us, usa, america, sec and nasdaq all reach the same entry. Add a country
by appending an entry — again, no code change.
Search runs in two languages at once: filings are indexed under their local names
(有価証券報告書, Vergütungsbericht, 사업보고서, Formulário de Referência), cross-border analyst
coverage under English ones. Searching one side loses half the evidence.
Two registry fields are priors, not facts, and every override is recorded in the notes:
threshold_default— the round local number that reads as "high earner" there (CNY 1,000,000, JPY 20,000,000, USD 250,000, INR 1 crore). Not a statistical cut-off; not comparable across countries at market FX. Your threshold always wins.employer_social_rate— roughly 1% in Denmark, roughly 32% in Spain. The wrong one silently breaks the payroll envelope, so a disclosed figure always replaces it.
These are enforced by the harness, not by good intentions:
- No private individual's pay is ever inferred. Public profiles support aggregate role taxonomy and career transitions, nothing more.
- Public sources only. No login walls, CAPTCHAs, robots restrictions or access controls, ever.
- A search snippet is never a source. The primary document gets fetched and read, or the number does not get used.
- Forum and crowdsourced salary data is Tier E — calibration only, never alone behind a headline number.
- No invented numbers. A figure that genuinely is not public gets declared:
NOT AVAILABLE: <fact> - <what was searched>. For an unlisted company the run then continues marked provisional, the cover says so, and nothing in it may be presented as measured. It is a label for honest uncertainty, not a workaround. - No false precision. Counts and shares come out as Monte Carlo intervals. Observed public-profile transition shares are never called promotion probabilities, because the true denominator is unknown.
.claude-plugin/ plugin + marketplace manifests
install.sh installer, dependency check, zip builder
skills/
company-talent-economics/
SKILL.md compensation and career research workflow
scripts/ ten-gate harness
locales/ 12 chrome locale packs
assets/ jurisdiction registry, search terms, priors, templates
references/ economics, evidence, localization, career methods
schemas/ report / model / evidence JSON schemas
examples/ worked runs and runnable fixtures
estimate-layoff-risk/
README.md interaction guide and local run instructions
SKILL.md layoff-risk workflow and safety boundaries
scripts/ case setup, interview, search, estimation, rendering, validation
references/ profit pools, roles, leadership regimes, evidence, calibration
schemas/ case / evidence / model / report JSON schemas
examples/ fictional robotics product-intern case
| Script | Does |
|---|---|
init_run.py |
Create a run; resolve language, jurisdiction, currency, threshold |
check_phase.py |
The ten gates, with the next steps printed on every pass and failure |
search_plan.py |
Six-pass query ladder, venue-scoped and bilingual |
build_model.py |
levels.json → model.json, payroll-envelope check with a TC/revenue fallback |
estimate_population.py |
Monte Carlo estimate of employees above the threshold |
pay_band_diagnostic.py |
Market / economic / internal band overlap |
career_graph.py |
Aggregate observed career transitions |
compile_report.py |
Fill report.json's numeric sections in the run's language |
validate_bundle.py |
Bundle completeness, vocabulary, terminology, affordability |
render_report.py |
JSON → DOCX → PDF, localized chrome, per-script fonts, RTL |
i18n.py |
Language detection, locale packs, jurisdiction registry, formatting |
check_locales.py |
Validate packs and registry; scaffold a new language |
selftest.py |
Drive a synthetic run through all ten gates and every locale |
python skills/company-talent-economics/scripts/check_locales.py # packs + registry
python skills/company-talent-economics/scripts/selftest.py # gates 0-10, DOCX only
python skills/company-talent-economics/scripts/selftest.py --pdf # also convert to PDFselftest.py runs three scenarios end to end — a fully disclosed listed company, an unlisted company
that has to take the provisional path, and the literal-[ ]-in-prose case — then renders every locale.
CI runs exactly these on every push.
MIT. See LICENSE.