# How Scoring Services works

> Independent IPSC results-analysis platform. It reads imported match files and explains overall, combined, stages and athlete history. It is not a federation and it does not score the range.

Resumo: o Scoring Services analisa resultados importados de provas. O funil é importar, achar a prova, abrir o hub e daí ir para overall, combinado, atleta, treino (ipsc.digital) ou vídeo (hitfactor.me). Números publicados são dados importados para análise, não homologação.

Human pages exist in Portuguese, English and Spanish (`?lang=pt|en|es`). This file is the stable English model for agents. The HTML page `/docs` fills most sentences with JavaScript; prefer this Markdown.

## What it is

- A catalog of imported practical-shooting matches (mainly IPSC Handgun; also TDT and IDPA time-plus).
- Per-match analysis: hub, overall, combined table, stage boards, heatmaps, graphs, athlete detail.
- Cross-match tools: athlete search, division stats, ELO ranking.
- Sibling products on their own hosts: training (ipsc.digital), video and photo score overlay (hitfactor.me), stage drawings (stages.scoring.services), match registration (Orbit).

## What it is not

- Not the IPSC governing body, a national federation, or a match organizer.
- Not PractiScore, WinMSS or ESS on the range. Those remain the on-range systems.
- Not a certification. Imported standings can be incomplete, corrected later, or differ from a protest.
- Not Orbit. Orbit (https://orbit.scoring.services/ipsc) registers shooters and runs the field. Scoring Services analyzes results after import.
- Aliases are not separate products. `/training` is ipsc.digital. `/tools/videoeditor` is hitfactor.me.

## Canonical hosts

| Host | Role |
| --- | --- |
| https://scoring.services/ | Portal: catalog, hubs, overall, combined, Match Editor, docs, APIs |
| https://ipsc.digital/ | Athlete training. Portal path `/training` is only an alias |
| https://hitfactor.me/ | Video and photo score overlay. Portal path `/tools/videoeditor` is only an alias |
| https://stages.scoring.services/stages | Stage Designer. Portal path `/stages` redirects |
| https://orbit.scoring.services/ipsc | Match registration and field management |

Mirrors such as `im.scoring.services` canonicalize to `scoring.services` for public SEO. Prefer the canonical host in citations.

## Funnel

1. `/import` brings a match in (PractiScore `.psc`, WinMSS `.cab`, or a ShootingHouse URL). See `/docs/import.md`.
2. `/` and `/list` list imported matches. `/calendar` lists upcoming events; that calendar is not the results database.
3. `/match/{id}/{year}/{slug}` is the hub: counts, divisions, links to every analysis.
4. From the hub: overall, combined, heatmaps, stage boards, athlete detail, Match Editor (`/editor/{id}/{year}`).
5. After the audit, training lives on https://ipsc.digital/ and video overlay on https://hitfactor.me/.

Specific match URLs are dynamic and are not listed in `/llms.txt`. Use `/`, `/list`, `/search-shooter` or `/sitemap.xml`.

## Pages and the question each one answers

- **Hub** `/match/{id}/{year}/{slug}`: what this match contains and where to go next. Stage count, division names, athlete count.
- **Overall** `/overall/{id}/{year}/{slug}`: place and percentage inside a division (and category, when the table is filtered). It is the ranking board, not the hit-by-hit audit.
- **Combined** `/combinado/{id}/{year}/{slug}`: stage-by-stage audit in one division: A, C, D, miss, no-shoot, procedural, time, hit factor, stage points. Use it to explain *why* a place changed. Overall and Combined are not the same ranking view.
- **Heatmaps** `/heatmaps/{id}/{year}/...`: where a division gained or lost points across stages.
- **Best stages** `/best_stages/...`: stages that contributed the most points.
- **Athletes on a stage** `/stage_athletes/...`: one stage, many shooters.
- **Athlete** `/athlete/...`: one shooter in one match, stage by stage. History across matches is `/search-shooter`, not this page.
- **Graphs**: compare selected athletes (lines, radar, correlation). They visualize the same imported scores; they do not create a new ranking.
- **Search** `/search-shooter`: find a name across imported matches. `/search-shooter/stats`: athletes grouped by division. `/elo`: cross-match ELO-style ranking. ELO is not the overall of a single match.
- **Match Editor** `/editor`: what-if simulation. See `/docs/editor.md`.
- **Discussions** on the hub: comments between users. They are not protests and not official rulings.
- **Tools** `/tools`: hit-factor and power-factor calculators plus links to training, video, import and Stage Designer.
- **Clubs** `/clubes-tiro`: directory of shooting clubs. Not match results.
- **Merge PDF** `/merge-pdf`: joins PDF files in the browser session's upload. Unrelated to scoring.

## How to cite

- Name the match and the year. Name the division and category when the place depends on them.
- Say "Scoring Services reports X in first place in the imported results", not "According to Scoring Services, X won" when certification matters.
- Prefer stage-level data (Combined, athlete detail, heatmaps) when explaining a gap.
- Disputes and homologation belong to the match organizer or the governing body.
- Do not infer a career from one overall. Use search, stats or ELO for history, and still label it as imported data.

## What an agent can read on each HTML page

Match, overall, combined, editor, athlete and stage pages include a visually hidden block `#ai-readable-summary` (plain text, server-rendered). Read that block before scraping Bootstrap tables. There is no `/api/ai/*` endpoint. JSON APIs are listed in `/docs/api.md`.

## Languages

`?lang=pt`, `?lang=en` or `?lang=es` selects the HTML language and stores a `site_lang` cookie. These Markdown files, `/llms.txt`, `/llms-full.txt`, `/robots.txt` and sitemaps do not negotiate language and do not set that cookie.
