Apache-2.0
The harness, the specification
The method is published. The data stays ours. Here is the line between the two, and why it is there.
What is open
The @rikaido/harness-spec package publishes, under Apache-2.0:
recipe.schema.json— the shape of a recipe the harness reads. JSON Schema 2020-12.verdict.schema.json— the shape of what it answers.issue-codes.json— the twenty codes, their check, their severity, and a sentence in both languages.- The eight checks, in the order they run.
That is enough to implement the harness yourself, read a verdict, or hold us to what it promises. A test in the repository keeps the package equal to the kernel: a code added to the validator without its line in the spec fails the build.
What stays private
- The food graph — what an ingredient is made of, what it contains, what replaces it. It is what knows that “peanut butter” breaks “peanut”, and that “coconut milk” does not break “milk”.
- The technique lexicon — 72 techniques, each with its temperature band, its cues and its detection forms.
- The cooking bands — salt, leavening, hydration, baker’s ratios, oven window, per dish category.
- The verified recipe base.
The hosted harness runs both halves. The spec alone gives you the method; the API gives you the method and the data.
The eight checks
In the validator’s order, because a cook learns one roster:
- Safety — allergies, diets, exclusions, through the graph. A constraint the harness cannot check is named, never silent.
- Dish — classified by title, then by the ingredients’ roles. Unclassified, no band runs, and the answer says so.
- Structure — enough steps, enough main ingredients.
- Quantities — measured; “to taste” reserved for salt and pepper; zero refused.
- Salt — present, and within the dish’s band.
- Dough — leavening, yeast, hydration and ratios, on baked dishes only.
- Temperatures — plausible for a home kitchen, within the dish’s window, and within the band of the technique the step names.
- Techniques — a slug the lexicon does not hold is named, then dropped before serving.
The seal and the refusal
At Rikaido, serve() is the only door a recipe reaches a cook through. It is a pure function: it classifies, checks, and either seals the recipe — a nominal type that cannot be built by hand — or refuses it. safe: false is never sealed. ok: false is, with its notes.
The seal is a compile-time fact, not a field on the wire: a new screen cannot show a recipe that skipped the harness, because the type will not let it.
The API gives you the verdict; the door is yours to hold. The rule we propose is ours: what cannot be corrected is not served.