English Italiano Français

v0.1 draft · open standard · a personal project by antferr

Agio Fit
the fit profile you carry with you

In tailoring, agio is the ease designed between body and garment. Here it is an open standard: three JSON documents, a reference algorithm and one rule — the profile stays yours; shops only ever get a size.

the garmentil capole vêtement the agio (ease)l'agiol'agio — aisance the bodyil corpole corps
The logo is the concept: the space between body and garment is the agio.

01 · The vocabulary

Three documents, one contract

The whole standard fits in three JSON schemas. You own the first, the seller publishes the second, and the third is the only thing that travels between the two. Open the examples to see the actual shape of the data.

Fit Profile

fit-profile.schema.json

e observed_at obbligatori, tolerance fortemente raccomandata), preferenze di vestibilità e — il segnale più forte — lo storico di come i capi passati ti sono andati davvero. Your profile: body measurements (each with mandatory source and observed_at, tolerance strongly recommended), fit preferences and — the strongest signal — the history of how past garments actually fitted you. et observed_at obligatoires, tolerance fortement recommandée), préférences de coupe et — le signal le plus fort — l’historique de la façon dont les vêtements passés vous sont réellement allés.

{ "body_measurements": { "chest_circumference": { "value": 100, "unit": "cm", "source": "tape_measured", "observed_at": "2026-06-01", "tolerance": 1.0 }, "arm_length": { "value": 63, "unit": "cm", "source": "self_reported", // weighs less "observed_at": "2026-01-10", "tolerance": 2.0 } }, "history": [{ "brand": "Sartoria Esempio", "size_label": "41", "outcome": "kept", "kept_despite": ["waist"] // accepted trade-off }] }

, garment_ref e source.Simplified excerpt: a full history entry also requires occurred_at, garment_ref and source., garment_ref et source.

Cut Profile

cut-profile.schema.json

), elasticità. Il campo measurement_method è obbligatorio e senza default. How the garment is cut, not what the brand calls the size: per-size measurements, intended ease (intended_ease), stretch. The measurement_method field is mandatory, with no default.), élasticité. Le champ measurement_method est obligatoire, sans valeur par défaut.

{ "brand": "Sartoria Esempio", "category": "shirts", "measurement_method": "flat_laid", // widths = ½ circumference "critical_zones": ["shoulders", "neck"], "sizes": [{ "size_label": "41", "finished_measurements": { "chest_width": { "value": 58, "unit": "cm" }, "shoulder_width": { "value": 46.5, "unit": "cm" }, "neck_circumference": { "value": 42, "unit": "cm" } } }], "intended_ease": { "chest": { "min": 12, "max": 20, "unit": "cm" } } }

Match Report

match-report.schema.json

The answer. Its shape is the normative part of the standard: exposed confidence, a per-zone explanation, explicit caveats. How much detail it carries is decided by the disclosure level.

{ "recommended_size": "41", "confidence": 0.76, "disclosure_level": "explained", "explanation": [{ "zone": "shoulders", "assessment": "as_cut" // no numbers at this level: // stripped at serialisation }], "caveats": [ "arm_length is self-reported" ] }

02 · Try it

The matching, live

), ricostruita qui in JavaScript: scegli un profilo e un livello di disclosure, e guarda cosa esce — e soprattutto cosa non esce. Il capo e i profili sono gli esempi reali del repo: la Classic Oxford di Sartoria Esempio (marchio fittizio), taglie 39–42. The same logic as the reference implementation (python -m agiofit.cli), rebuilt here in JavaScript: pick a profile and a disclosure level, and watch what comes out — and above all what doesn't. Garment and profiles are the repo's real examples: Sartoria Esempio's Classic Oxford (a fictional brand), sizes 39–42.), reconstruite ici en JavaScript : choisissez un profil et un niveau de divulgation, et regardez ce qui sort — et surtout ce qui ne sort pas. Le vêtement et les profils sont les exemples réels du dépôt : la Classic Oxford de Sartoria Esempio (marque fictive), tailles 39–42.

The simulator requires JavaScript.

03 · Privacy as design

Four levels, one subtraction to prevent

The caller doesn't decide how much it sees: the disclosure level does, and the numbers are stripped at serialisation, not by anyone's goodwill. There is a test that verifies it.

result_only

Size and confidence. All a shop needs to sell you a shirt.

explained

Adds the per-zone assessment (good, watch…) but no centimetres.

scoped

Adds numeric ease on the requested zones. For services you trust more.

full

The complete profile. Meant for your vault, not for third parties.

Why "explained" hides the numbers: the arithmetic leak

The garment's measurements are public (they live in the Cut Profile). If the recommendation also published the ease in centimetres, anyone could do:

body = garment − ease  →  116 cm − 16 cm = a 100 cm chest

a explained. One subtraction reconstructs the body measurement. That's why at the lower levels the ease exists in the computation but does not survive serialisation — try it in the simulator by switching from scoped to explained. à explained.

04 · On your machine

Using it from the terminal

: The reference implementation is pure Python, zero dependencies. After cloning github.com/agiofit/agiofit: :

# install and verify (13 tests, all must pass)
$ cd agiofit/reference
$ pip install -e ".[dev]"
$ pytest
13 passed

# mature profile, default level (explained)
$ python -m agiofit.cli ../examples/profile-mature.json ../examples/cut-shirt.json
{ "recommended_size": "41", "confidence": 0.76, ... }

# cold start, result only
$ python -m agiofit.cli ../examples/profile-cold-start.json ../examples/cut-shirt.json result_only
{ "recommended_size": "41", "confidence": 0.25, ... }

05 · Worth defending in public

The decisions that are not a size chart

kept_despite

The only field that records an accepted trade-off. Without it, the system learns you reject tight shoulders; with it, it learns you accept a loose waist to get the shoulders right.

measurement_method mandatory, no default

Flat-laid measurements are half circumferences. It's the industry's most common mistake, and it produces recommendations wrong by a factor of two, silently. Here, if you don't declare it, the document doesn't validate.

Per-zone offset_scale

A brand that "runs small" runs small in the torso. Applying the same centimetre shift to the collar — where 1 cm is a whole size — turns a useful correction into a wrong answer. History applies per zone: 1.0 on the chest, 0.2 on the collar.

Cold start with declared confidence

Zero body measurements, a single kept garment from the same brand: the system still answers, with confidence capped at 0.40, refuses cross-brand inference and tells you what to add to improve. History is worth more than centimetres.