/**
 * version — is this string a version, or something that looks like one?
 *
 * Pattern: a total predicate + a refusal sentence. Pure, no dependencies.
 * Role:    recipes/ layer. Used by `defineAgentRecipe` and by the same
 *          validation `AgentBuilder.recipe()` runs on a hand-written literal.
 * Emits:   N/A.
 *
 * ## Why strict SemVer, and why a near-miss is refused rather than repaired
 *
 * The version is the half of a recipe row that makes the other half worth
 * reading: two runs of `support-desk` that behaved differently are a mystery
 * until the record says `1.2.0` and `1.3.0`. That only works if every producer
 * spells versions the same way, so the ones that would quietly break grouping
 * are refused at the declaration:
 *
 *   `'1.2'`      two runs, `'1.2'` and `'1.2.0'`, that are the same version and
 *                do not group together.
 *   `'v1.2.3'`   the same, with a decoration that sorts differently.
 *   `'1.02.3'`   leading zeros: `'1.02.3'` and `'1.2.3'` again split one arm.
 *   `'latest'`   a RANGE, not a version — it names whatever was installed, so
 *   `'^1.2.3'`   the row would describe a different composition each week and
 *   `'1.x'`      say nothing about the run it is stamped on.
 *
 * None is repaired. Padding `'1.2'` to `'1.2.0'` would put a version on the
 * record that the author never wrote, which is the one thing a manifest field
 * may not do.
 */
/** Whether `value` is a SemVer 2.0.0 version string. Total: any input, no throw. */
export declare function isSemverVersion(value: unknown): value is string;
/**
 * The sentence a bad version gets. Names the value, the grammar, and the
 * specific mistake when the shape identifies one — a refusal that only says
 * "invalid" makes the author guess which half was wrong.
 *
 * @param callSite - the API the author called, e.g. `defineAgentRecipe`.
 */
export declare function versionRefusal(callSite: string, value: unknown): string;
