RikaidoDeveloper

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:

  1. Safety — allergies, diets, exclusions, through the graph. A constraint the harness cannot check is named, never silent.
  2. Dish — classified by title, then by the ingredients’ roles. Unclassified, no band runs, and the answer says so.
  3. Structure — enough steps, enough main ingredients.
  4. Quantities — measured; “to taste” reserved for salt and pepper; zero refused.
  5. Salt — present, and within the dish’s band.
  6. Dough — leavening, yeast, hydration and ratios, on baked dishes only.
  7. Temperatures — plausible for a home kitchen, within the dish’s window, and within the band of the technique the step names.
  8. 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.