competitor-benchmarking — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited competitor-benchmarking (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Put a set of companies side by side on their reported financials. The deliverable is data - a Markdown report plus a JSON sidecar - not a styled document; layout is the client's job. The entire value is trust and comparability: every number is either reported (with its provider named) or shown as n/a, every derived figure carries a footnote with its formula and exact inputs, every company is pulled in the same currency so sizes are comparable, and the peer set is chosen transparently. A reader should be able to audit any cell in the benchmark back to its origin.
This is the multi-company sibling of the company-at-a-glance skill and follows the same disciplines. The hard part of benchmarking is not arithmetic - it is making sure you are comparing like with like, so the comparability rules below carry as much weight as the calculations.
Financials come ONLY from the Economic Mind connector. Every revenue, profit, margin and growth figure must trace to a get_company_financials call. Do not pull a financial number from the web, from memory, from a market report's prose, or from a "sanity check" - even if the connector is slow, returns nothing, or seems wrong. If Economic Mind does not report a figure for a company, that cell is n/a. There is no fallback. (The market report is used only to choose the peer set - never as a source of financial figures.)
A side-by-side table invites the reader to draw conclusions from differences between companies, so those differences must be real and not artifacts. Three rules:
sensible default - typically the currency of the market report or the one shared by most of the set). Economic Mind does the conversion. State the currency and that figures are FX-converted by EM. Without this, a "bigger" company might just be a stronger-currency company.
figures, so it is unaffected by the conversion. A growth rate or CAGR computed on FX-converted figures blends business growth with currency moves. So compute revenue growth / CAGR from each company's native filing-currency revenue series, and footnote it as such. If you only have the common-currency series, you may still report CAGR but must flag it as "FX-inclusive" so the reader knows. (Margins and size are fine in the common currency.)
fiscal year per figure, compute each company's growth across its own reported endpoints (name them), and never compare a 4-year CAGR for one company against a 2-year CAGR for another without labelling it.
Context can be compressed mid-task, and a half-remembered number across a dozen companies is exactly how a benchmark goes wrong. So immediately after each tool call returns, write its raw output to a file, before the next call. Then, before assembling the benchmark, read every file back and build the report from the files, not from recall. Create one working directory at the start, e.g. em-bench/.
You compute the derived figures yourself - there is no bundled script - so the rigor comes from method:
relevant year(s) for that company. If EBIT is missing for a company-year, that EBIT margin is n/a - never infer it, and never borrow a peer's value.
EBITDA margin (Co A, FY2024) = EBITDA ÷ Revenue = 19.4 ÷ 121.6 = 15.9%. A figure a reader cannot recompute from its footnote does not belong in the benchmark.
intermediate before relying on it. When in doubt, recompute from the raw file rather than reuse an earlier result.
Margins, per company per fiscal year (currency-neutral):
Gross margin = Gross profit ÷ RevenueEBITDA margin = EBITDA ÷ RevenueEBIT margin = EBIT ÷ RevenueNet margin = Net income ÷ RevenueGrowth, per company (from the native-currency revenue series; name the endpoint years):
Revenue YoY (FYn) = (Revenue_FYn − Revenue_FYn-1) ÷ Revenue_FYn-1Revenue CAGR, full span = (Revenue_latest ÷ Revenue_earliest)^(1 ÷ (Y−1)) − 1, Y = reported revenueyears in the span.
Revenue CAGR, L3Y = (Revenue_FYn ÷ Revenue_FYn-3)^(1 ÷ 3) − 1 (needs four consecutive reported years).This skill does not compute a peer-set median or rank unless the caller asks; keep the summary to per-company figures so the reader draws their own comparison. (Sorting the table by latest revenue is fine and helpful - it is not a derived statistic.)
Economic Mind aggregates filings from underlying providers, and the provider can differ by company and even by line item (e.g. "Proff (NO)", "S&P Capital IQ"). This matters more in a benchmark than in a single profile, because comparability depends on it. Name the underlying provider per company and say it was gathered through Economic Mind - e.g. "Company filings via Proff (NO), gathered through Economic Mind". If two companies' figures come from different providers, that is worth noting.
Create the working directory once: mkdir -p em-bench. Then build the set one of two ways:
search_companies(["<name>"]) and pick the right entity(disambiguate on headquarters / summary). Record companyId and companyName.
search_markets("<market or target>"),open it with get_market(...), and take its listed players as the candidate set. Resolve each named player to an entity via search_companies. The market report is used only to pick the set.
Either way: pick the common reporting currency now (caller's choice, else the set's dominant currency). Confirm the resolved set and currency with the user before pulling everything - "I'll benchmark these N companies in <CUR>: …; good to proceed?" - because deriving a wrong or oversized set wastes a lot of calls. Keep the set manageable (roughly ≤15 unless asked); if a derived set is larger, take the top players and say so. Write em-bench/set.txt (one line per company: id, name, resolved-from).
For each company, request the five most recent years including the latest in the common currency: get_company_financials([id], years=[2021,2022,2023,2024,2025], currency=<CUR>). Immediately write the raw JSON to em-bench/<id>-financials.json before the next call.
For growth that is FX-clean (see comparability rule 2), also capture each company's native-currency revenue series - either a second get_company_financials call in the company's filing currency, or note that you will flag CAGR as FX-inclusive if you do not. Write em-bench/<id>-native.json when you pull it.
Then consolidate into em-bench/financials.csv, one row per (company, year, line_item), keeping the per-row provider so attribution survives, value blank where not reported:
company,year,line_item,value,currency,source
Co A,2024,revenue,121.6,EUR,Proff (NO)
Co A,2024,gross_profit,,EUR,not reported
Co A,2024,ebitda,19.4,EUR,Proff (NO)
Co B,2024,revenue,402.7,EUR,S&P Capital IQ
...Work from the files, not memory.
cat em-bench/set.txt, cat em-bench/financials.csv, and the native series).above, only where inputs are reported. Capture each in em-bench/calculations.csv:
company,metric,value,formula,components,currency_basis
Co A,ebitda_margin_FY2024,15.9%,EBITDA÷Revenue,"EBITDA=19.4,Revenue=121.6",EUR(common)
Co A,rev_cagr_L3Y,+0.8%,(Rev_FY2024÷Rev_FY2021)^(1/3)−1,"Rev_FY2024=118.0,Rev_FY2021=115.1",NOK(native)(not blank) in financials.csv; confirm each growth figure names real reported endpoint years and uses the native series (or is flagged FX-inclusive). Fix or mark n/a anything you cannot verify - never ship an unverifiable cell.
Build the Markdown and JSON from the files. Do not re-key a number from memory.
Markdown structure (plain data - the client styles it):
# Competitor benchmark - <market / set name> (<CUR> m)
*Generated <date>. N companies, all figures normalized to <CUR> (FX-converted by Economic Mind).
Financials reported via the providers named below, gathered through Economic Mind, and computed
deterministically. Growth computed on native-currency revenue. AI-generated - confirm against the
underlying filings before relying on it.*
## Benchmark summary
| Company | Provider | Latest FY | Revenue | EBITDA | Rev CAGR (L3Y) | Gross margin | EBITDA margin | EBIT margin |
|---------|----------|----------:|--------:|-------:|---------------:|-------------:|--------------:|------------:|
| Co B | S&P CIQ | FY2024 | 402.7 | 70.1 | +6.2% [^b1] | n/a | 17.4% [^b2] | 12.1% [^b3] |
| Co A | Proff(NO)| FY2024 | 121.6 | 19.4 | +0.8% [^a1] | n/a | 15.9% [^a2] | 15.3% [^a3] |
*Sorted by latest revenue. Blank/n/a = not reported by Economic Mind. Margins in <CUR> (currency-neutral);
CAGR on native currency.*
## Reported financials by company and year
### Co A (source: Proff (NO), gathered through Economic Mind)
| Line item | FY2021 | FY2022 | FY2023 | FY2024 | FY2025 |
|--------------|-------:|-------:|-------:|-------:|-------:|
| Revenue | 118.8 | 155.3 | 105.9 | 121.6 | n/a |
| Gross profit | n/a | n/a | n/a | n/a | n/a |
| EBITDA | 28.5 | 32.6 | 19.1 | 19.4 | n/a |
| EBIT | … | … | … | 18.6 | n/a |
| Net income | … | … | … | 14.1 | n/a |
### Co B (source: S&P Capital IQ, gathered through Economic Mind)
| … |
*Blank/n/a = not reported by Economic Mind.*
## Calculation footnotes
[^a1]: Revenue CAGR L3Y (Co A, native NOK) = (118.0 ÷ 115.1)^(1/3) − 1 = +0.8%
[^a2]: EBITDA margin (Co A, FY2024) = EBITDA ÷ Revenue = 19.4 ÷ 121.6 = 15.9%
[^a3]: EBIT margin (Co A, FY2024) = EBIT ÷ Revenue = 18.6 ÷ 121.6 = 15.3%
[^b1]: …
## Sources & method
- **Peer set** - <explicit list | derived from the Economic Mind "<market>" report>; N companies.
- **Currency** - all figures in <CUR>, FX-converted by Economic Mind; growth computed on native currency.
- **Financials per company** - Co A via Proff (NO); Co B via S&P Capital IQ; … all gathered through
Economic Mind; margins/CAGR computed from those reported figures (formulas in footnotes).
- **Not reported by Economic Mind:** Co A gross profit (all years), FY2025 (not yet filed); Co B …JSON sidecar (em-bench/benchmark.json) - machine-readable mirror:
{
"set_name": "Nordic fire protection",
"currency": "EUR",
"peer_set_basis": "derived from Economic Mind 'Nordic fire protection' market report",
"companies": [
{"company": "Co A", "provider": "Proff (NO)",
"financials": [{"year": 2024, "revenue": 121.6, "ebitda": 19.4, "ebit": 18.6,
"net_income": 14.1, "gross_profit": null}],
"figures": [{"metric": "ebitda_margin", "year": 2024, "value": 15.9,
"formula": "EBITDA÷Revenue", "inputs": {"EBITDA": 19.4, "Revenue": 121.6},
"currency_basis": "EUR (common)"},
{"metric": "rev_cagr_l3y", "value": 0.8, "currency_basis": "NOK (native)"}],
"not_reported": ["gross_profit (all years)", "FY2025"]}
]
}Hand back the Markdown and JSON. When presenting the output files (via present_files where available, e.g. Claude.ai), list the JSON sidecar (em-bench/benchmark.json) first and the Markdown report last, so the human-readable report is the final, most prominent artifact. In any prose summary, reference the figures the benchmark produced - do not re-key or re-round numbers, and do not introduce a figure that is not in the files. If you want a single-company deep profile (CEO, ownership, employees, web-sourced facts), that is the company-at-a-glance skill's job - this skill stays on comparable financials.
Every financial number is reported (provider named, per company) or n/a; nothing is sourced from the web or memory. Every company is pulled in the same currency so size is comparable, margins are currency-neutral, and growth is computed on native currency so it is not distorted by FX. Every derived figure is gated on reported inputs and footnoted with its formula and exact numbers. The peer set is chosen transparently and confirmed before pulling. And the whole benchmark is built from files written at collection time, not from compressed recall - so what you read is what was filed.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.