← The evidence ledger
Evidence row 228038
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint 4b566e29-65cc-4977-b194-bf77f627311b
- Recorded
- Previous row
- None: the first of its kind about this subject
- Body SHA-256
- ea4c9b4945396feb979e02d54f6a983e3c091b0becd5734db383ba5250e98467
- Leaf
- 0xf56288e3b9d6f02556935ccc082ea3f33118dbdb07555a72961e0a160efdd914
What was observed
{
"count": 11,
"tools": [
{
"description": "Calculate six balance contribution totals and meters for unique published ingredient IDs. Not nutrition or ingredient weights. No persistence.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"ingredientIds": {
"items": {
"maxLength": 36,
"minLength": 1,
"pattern": "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$",
"type": "string"
},
"maxItems": 40,
"type": "array",
"uniqueItems": true
}
},
"required": [
"ingredientIds"
],
"type": "object"
},
"name": "calculate_balance"
},
{
"description": "Calculate a dough formula from explicit gram sizing, percentages and published or custom flours. Returns quantities, warnings, source information and a Dough continuation link. No persistence.",
"inputSchema": {
"additionalProperties": false,
"description": "Percentages refer to total flour, except bigaHydration and starterHydrationPct. Flour rows are ratios, including empty/zero blends. Unique row IDs required. Named starter source must be a supplied row. Preferment leavening requires positive pff. No temperature inputs; preparation fixes DDT at 72 F and friction at 15 F. Buffer defaults off and non-off buffer requires balls sizing. Flour mode has no ball target: prepared ballCount/ballWeight are zero, ballsTotal is zero, bufferG is the whole batch and pizzaSize is unavailable. The 100000 g flour bound applies to direct flour inputs, not the balls solver result. Custom ingredients count by weight only and never in hydration.",
"properties": {
"ascorbicAcid": {
"default": 0,
"maximum": 1,
"minimum": 0,
"type": "number"
},
"bigaHydration": {
"default": 50,
"description": "Preferment water as a percentage of preferment flour.",
"maximum": 200,
"minimum": 0,
"type": "number"
},
"buffer": {
"default": {
"mode": "off"
},
"oneOf": [
{
"additionalProperties": false,
"properties": {
"mode": {
"enum": [
"off",
"recommended"
]
}
},
"required": [
"mode"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"grams": {
"maximum": 10000,
"minimum": 0,
"type": "number"
},
"mode": {
"const": "custom"
}
},
"required": [
"mode",
"grams"
],
"type": "object"
}
]
},
"customAdjustments": {
"description": "Optional baker-named final-mix ingredients, up to 8, each a percentage of total flour. They count by weight only: they add to batch weight and ball sizing, never to hydration or flour absorption. Row IDs are c followed by five lowercase letters or digits, unique within the formula. Names are sent trimmed, 1 to 40 characters, unique ignoring case, and may not repeat one of Dough's own ingredient names such as Water, Salt, Oil or Sugar, or contain control, hidden or bidirectional characters or a web address. Any refused row fails the whole request.",
"items": {
"additionalProperties": false,
"properties": {
"id": {
"maxLength": 6,
"minLength": 1,
"pattern": "^c[0-9a-z]{5}$",
"type": "string"
},
"name": {
"maxLength": 40,
"minLength": 1,
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"type": "string"
},
"pct": {
"maximum": 100,
"minimum": 0,
"type": "number"
}
},
"required": [
"id",
"name",
"pct"
],
"type": "object"
},
"maxItems": 8,
"type": "array"
},
"dmp": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"finalIdy": {
"default": 0,
"description": "Final-mix instant dry yeast mass as a percentage of total flour. No stage-basis conversion is required.",
"maximum": 20,
"minimum": 0,
"type": "number"
},
"finalIsd": {
"default": 0,
"description": "Final-mix instant sourdough mass as a percentage of total flour. No stage-basis conversion is required.",
"maximum": 20,
"minimum": 0,
"type": "number"
},
"flours": {
"items": {
"additionalProperties": false,
"properties": {
"bigaPct": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"id": {
"maxLength": 64,
"minLength": 1,
"pattern": "^(?!blend$|__proto__$|constructor$|prototype$)[A-Za-z0-9][A-Za-z0-9_-]*$",
"type": "string"
},
"pct": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"source": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"ref": {
"maxLength": 100,
"minLength": 1,
"pattern": "^(?:[a-z0-9]+(?:-[a-z0-9]+)*|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$",
"type": "string"
},
"type": {
"const": "catalog"
}
},
"required": [
"type",
"ref"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"name": {
"maxLength": 100,
"minLength": 1,
"pattern": "\\S",
"type": "string"
},
"type": {
"const": "custom"
}
},
"required": [
"type",
"name"
],
"type": "object"
}
]
}
},
"required": [
"id",
"pct",
"bigaPct",
"source"
],
"type": "object"
},
"maxItems": 12,
"type": "array"
},
"honey": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"hydration": {
"maximum": 200,
"minimum": 0,
"type": "number"
},
"ndmp": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"nonfatDryMilk": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"oil": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"pff": {
"default": 0,
"maximum": 100,
"minimum": 0,
"type": "number"
},
"prefIdy": {
"default": 0,
"description": "Instant dry yeast mass as a percentage of total flour, not preferment flour. Convert a Dough preferment-page percentage with pagePercent * effectiveBigaFlour / totalFlour, using actual allocated preferment flour from results. Only without an allocation shortfall is pagePercent * pff / 100 equivalent. A zero actual preferment-flour weight makes its stage percentage unavailable. Example with full allocation: 1.60 * 15 / 100 = 0.24, giving 4.8 g at 2000 g total flour.",
"maximum": 20,
"minimum": 0,
"type": "number"
},
"prefIsd": {
"default": 0,
"description": "Instant sourdough mass as a percentage of total flour, not preferment flour. Convert a Dough preferment-page percentage with pagePercent * effectiveBigaFlour / totalFlour, using actual allocated preferment flour from results. Only without an allocation shortfall is pagePercent * pff / 100 equivalent. A zero actual preferment-flour weight makes its stage percentage unavailable. Example with full allocation: 1.60 * 15 / 100 = 0.24, giving 4.8 g at 2000 g total flour.",
"maximum": 20,
"minimum": 0,
"type": "number"
},
"reserveWaterPct": {
"default": 5,
"maximum": 100,
"minimum": 0,
"type": "number"
},
"salt": {
"default": 0,
"maximum": 10,
"minimum": 0,
"type": "number"
},
"sizing": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"flourGrams": {
"maximum": 100000,
"minimum": 1,
"type": "number"
},
"mode": {
"const": "flour"
}
},
"required": [
"mode",
"flourGrams"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"ballCount": {
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"ballGrams": {
"maximum": 2000,
"minimum": 50,
"type": "number"
},
"mode": {
"const": "balls"
}
},
"required": [
"mode",
"ballCount",
"ballGrams"
],
"type": "object"
}
]
},
"starterFinalPct": {
"default": 0,
"description": "Final-mix sourdough starter mass (including its flour and water) as a percentage of total flour. No stage-basis conversion is required.",
"maximum": 200,
"minimum": 0,
"type": "number"
},
"starterFlourSource": {
"default": "blend",
"description": "blend or a supplied flour row ID. Inactive starter normalizes to blend and 100% hydration.",
"maxLength": 64,
"minLength": 1,
"type": "string"
},
"starterHydrationPct": {
"default": 100,
"description": "Starter water as a percentage of starter flour, not total flour or starter mass.",
"maximum": 200,
"minimum": 40,
"type": "number"
},
"starterPrefPct": {
"default": 0,
"description": "Preferment sourdough starter mass (including its flour and water) as a percentage of total flour, not preferment flour. Convert a Dough preferment-page percentage with pagePercent * effectiveBigaFlour / totalFlour, using actual allocated preferment flour from results. Only without an allocation shortfall is pagePercent * pff / 100 equivalent. A zero actual preferment-flour weight makes its stage percentage unavailable. Example with full allocation: 1.60 * 15 / 100 = 0.24, giving 4.8 g at 2000 g total flour.",
"maximum": 200,
"minimum": 0,
"type": "number"
},
"sugar": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"units": {
"const": "g",
"type": "string"
}
},
"required": [
"units",
"sizing",
"hydration",
"flours"
],
"type": "object"
},
"name": "calculate_dough"
},
{
"description": "Read a published flour by UUID or slug. Returns public catalog data with source links and credits.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"id": {
"description": "Canonical UUID or lowercase slug. UUIDs are case-insensitive; UUID-shaped identifiers resolve only as canonical IDs and cannot be slugs.",
"maxLength": 100,
"minLength": 1,
"pattern": "^(?:[a-z0-9]+(?:-[a-z0-9]+)*|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "get_flour"
},
{
"description": "Read a published ingredient by UUID. Returns public catalog data with source links and credits.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"id": {
"description": "Canonical ingredient UUID only, case-insensitive. Ingredient slugs are not globally unique.",
"pattern": "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "get_ingredient"
},
{
"description": "Read a published house pizza by UUID or slug. Returns public catalog data with source links and credits.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"id": {
"description": "Canonical UUID or lowercase slug. UUIDs are case-insensitive; UUID-shaped identifiers resolve only as canonical IDs and cannot be slugs.",
"maxLength": 100,
"minLength": 1,
"pattern": "^(?:[a-z0-9]+(?:-[a-z0-9]+)*|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "get_pizza"
},
{
"description": "Caller-provided sequential, contiguous stages ending when the first pizza enters the oven. Offset-bearing whole-minute instants must match the IANA zone. No fermentation prediction. Unique stage IDs, positive total duration, minimum <= maximum, available horizon and summed maxima <= 30 days. Windows are marginal, not independently selectable. No persistence.",
"inputSchema": {
"additionalProperties": false,
"description": "Caller-provided sequential, contiguous stages ending when the first pizza enters the oven. Offset-bearing whole-minute instants must match the IANA zone. No fermentation prediction. Unique stage IDs, positive total duration, minimum <= maximum, available horizon and summed maxima <= 30 days. Windows are marginal, not independently selectable.",
"properties": {
"availableFrom": {
"maxLength": 25,
"minLength": 1,
"pattern": "^[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(?::00)?(?:Z|[+-][0-9]{2}:[0-9]{2})$",
"type": "string"
},
"bakeStartAt": {
"maxLength": 25,
"minLength": 1,
"pattern": "^[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(?::00)?(?:Z|[+-][0-9]{2}:[0-9]{2})$",
"type": "string"
},
"method": {
"maxLength": 100,
"minLength": 1,
"pattern": "\\S",
"type": "string"
},
"stages": {
"items": {
"additionalProperties": false,
"properties": {
"id": {
"maxLength": 64,
"minLength": 1,
"pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$",
"type": "string"
},
"label": {
"maxLength": 100,
"minLength": 1,
"pattern": "\\S",
"type": "string"
},
"maxMinutes": {
"maximum": 43200,
"minimum": 0,
"type": "integer"
},
"minMinutes": {
"maximum": 43200,
"minimum": 0,
"type": "integer"
}
},
"required": [
"id",
"label",
"minMinutes",
"maxMinutes"
],
"type": "object"
},
"maxItems": 16,
"minItems": 1,
"type": "array"
},
"timeZone": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z_]+(?:/[A-Za-z0-9_+.-]+)*$",
"type": "string"
}
},
"required": [
"timeZone",
"availableFrom",
"bakeStartAt",
"method",
"stages"
],
"type": "object"
},
"name": "plan_bake"
},
{
"description": "Read published menu sections and their pizza IDs. Returns public catalog data with source links and credits.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "read_menu"
},
{
"description": "Search published flour facts. Returns public catalog data with source links and credits.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"default": 20,
"description": "Decimal integer page size. Leading zeros, signs and fractions are rejected.",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"description": "Decimal integer result offset. Leading zeros, signs and fractions are rejected.",
"maximum": 500,
"minimum": 0,
"type": "integer"
},
"q": {
"default": "",
"description": "Literal, case-insensitive name or brand substring. Surrounding whitespace is trimmed.",
"maxLength": 120,
"type": "string"
}
},
"type": "object"
},
"name": "search_flours"
},
{
"description": "Search published ingredient facts. Returns public catalog data with source links and credits.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"course": {
"description": "One exact normalized course. No legacy-station fallback.",
"enum": [
"Sauce",
"Cheese",
"Toppings",
"Finishes"
],
"type": "string"
},
"limit": {
"default": 20,
"description": "Decimal integer page size. Leading zeros, signs and fractions are rejected.",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"description": "Decimal integer ingredient result offset. Leading zeros, signs and fractions are rejected.",
"maximum": 2000,
"minimum": 0,
"type": "integer"
},
"q": {
"default": "",
"description": "Literal, case-insensitive name substring. Surrounding whitespace is trimmed.",
"maxLength": 120,
"type": "string"
}
},
"type": "object"
},
"name": "search_ingredients"
},
{
"description": "Search published house pizzas. Returns public catalog data with source links and credits.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"default": 20,
"description": "Decimal integer page size. Leading zeros, signs and fractions are rejected.",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"description": "Decimal integer result offset. Leading zeros, signs and fractions are rejected.",
"maximum": 500,
"minimum": 0,
"type": "integer"
},
"q": {
"default": "",
"description": "Literal, case-insensitive substring of published names, descriptions or resolved ingredient names. Surrounding whitespace is trimmed.",
"maxLength": 120,
"type": "string"
}
},
"type": "object"
},
"name": "search_pizzas"
},
{
"description": "One to eight uniquely identified, already-sized Dough requests. Optional unique published house pizza references and counts annotate topping needs only; they do not multiply dough. Custom flours and custom ingredients retain batch/row identity and are never merged across batches; a custom ingredient item's id is custom:<batchId>:<rowId>. Ready starter is separate from fresh ingredients. Topping quantities are unknown. No persistence.",
"inputSchema": {
"additionalProperties": false,
"description": "One to eight uniquely identified, already-sized Dough requests. Optional unique published house pizza references and counts annotate topping needs only; they do not multiply dough. Custom flours and custom ingredients retain batch/row identity and are never merged across batches; a custom ingredient item's id is custom:<batchId>:<rowId>. Ready starter is separate from fresh ingredients. Topping quantities are unknown.",
"properties": {
"batches": {
"items": {
"additionalProperties": false,
"properties": {
"dough": {
"additionalProperties": false,
"description": "Percentages refer to total flour, except bigaHydration and starterHydrationPct. Flour rows are ratios, including empty/zero blends. Unique row IDs required. Named starter source must be a supplied row. Preferment leavening requires positive pff. No temperature inputs; preparation fixes DDT at 72 F and friction at 15 F. Buffer defaults off and non-off buffer requires balls sizing. Flour mode has no ball target: prepared ballCount/ballWeight are zero, ballsTotal is zero, bufferG is the whole batch and pizzaSize is unavailable. The 100000 g flour bound applies to direct flour inputs, not the balls solver result. Custom ingredients count by weight only and never in hydration.",
"properties": {
"ascorbicAcid": {
"default": 0,
"maximum": 1,
"minimum": 0,
"type": "number"
},
"bigaHydration": {
"default": 50,
"description": "Preferment water as a percentage of preferment flour.",
"maximum": 200,
"minimum": 0,
"type": "number"
},
"buffer": {
"default": {
"mode": "off"
},
"oneOf": [
{
"additionalProperties": false,
"properties": {
"mode": {
"enum": [
"off",
"recommended"
]
}
},
"required": [
"mode"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"grams": {
"maximum": 10000,
"minimum": 0,
"type": "number"
},
"mode": {
"const": "custom"
}
},
"required": [
"mode",
"grams"
],
"type": "object"
}
]
},
"customAdjustments": {
"description": "Optional baker-named final-mix ingredients, up to 8, each a percentage of total flour. They count by weight only: they add to batch weight and ball sizing, never to hydration or flour absorption. Row IDs are c followed by five lowercase letters or digits, unique within the formula. Names are sent trimmed, 1 to 40 characters, unique ignoring case, and may not repeat one of Dough's own ingredient names such as Water, Salt, Oil or Sugar, or contain control, hidden or bidirectional characters or a web address. Any refused row fails the whole request.",
"items": {
"additionalProperties": false,
"properties": {
"id": {
"maxLength": 6,
"minLength": 1,
"pattern": "^c[0-9a-z]{5}$",
"type": "string"
},
"name": {
"maxLength": 40,
"minLength": 1,
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"type": "string"
},
"pct": {
"maximum": 100,
"minimum": 0,
"type": "number"
}
},
"required": [
"id",
"name",
"pct"
],
"type": "object"
},
"maxItems": 8,
"type": "array"
},
"dmp": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"finalIdy": {
"default": 0,
"description": "Final-mix instant dry yeast mass as a percentage of total flour. No stage-basis conversion is required.",
"maximum": 20,
"minimum": 0,
"type": "number"
},
"finalIsd": {
"default": 0,
"description": "Final-mix instant sourdough mass as a percentage of total flour. No stage-basis conversion is required.",
"maximum": 20,
"minimum": 0,
"type": "number"
},
"flours": {
"items": {
"additionalProperties": false,
"properties": {
"bigaPct": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"id": {
"maxLength": 64,
"minLength": 1,
"pattern": "^(?!blend$|__proto__$|constructor$|prototype$)[A-Za-z0-9][A-Za-z0-9_-]*$",
"type": "string"
},
"pct": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"source": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"ref": {
"maxLength": 100,
"minLength": 1,
"pattern": "^(?:[a-z0-9]+(?:-[a-z0-9]+)*|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$",
"type": "string"
},
"type": {
"const": "catalog"
}
},
"required": [
"type",
"ref"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"name": {
"maxLength": 100,
"minLength": 1,
"pattern": "\\S",
"type": "string"
},
"type": {
"const": "custom"
}
},
"required": [
"type",
"name"
],
"type": "object"
}
]
}
},
"required": [
"id",
"pct",
"bigaPct",
"source"
],
"type": "object"
},
"maxItems": 12,
"type": "array"
},
"honey": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"hydration": {
"maximum": 200,
"minimum": 0,
"type": "number"
},
"ndmp": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"nonfatDryMilk": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"oil": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"pff": {
"default": 0,
"maximum": 100,
"minimum": 0,
"type": "number"
},
"prefIdy": {
"default": 0,
"description": "Instant dry yeast mass as a percentage of total flour, not preferment flour. Convert a Dough preferment-page percentage with pagePercent * effectiveBigaFlour / totalFlour, using actual allocated preferment flour from results. Only without an allocation shortfall is pagePercent * pff / 100 equivalent. A zero actual preferment-flour weight makes its stage percentage unavailable. Example with full allocation: 1.60 * 15 / 100 = 0.24, giving 4.8 g at 2000 g total flour.",
"maximum": 20,
"minimum": 0,
"type": "number"
},
"prefIsd": {
"default": 0,
"description": "Instant sourdough mass as a percentage of total flour, not preferment flour. Convert a Dough preferment-page percentage with pagePercent * effectiveBigaFlour / totalFlour, using actual allocated preferment flour from results. Only without an allocation shortfall is pagePercent * pff / 100 equivalent. A zero actual preferment-flour weight makes its stage percentage unavailable. Example with full allocation: 1.60 * 15 / 100 = 0.24, giving 4.8 g at 2000 g total flour.",
"maximum": 20,
"minimum": 0,
"type": "number"
},
"reserveWaterPct": {
"default": 5,
"maximum": 100,
"minimum": 0,
"type": "number"
},
"salt": {
"default": 0,
"maximum": 10,
"minimum": 0,
"type": "number"
},
"sizing": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"flourGrams": {
"maximum": 100000,
"minimum": 1,
"type": "number"
},
"mode": {
"const": "flour"
}
},
"required": [
"mode",
"flourGrams"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"ballCount": {
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"ballGrams": {
"maximum": 2000,
"minimum": 50,
"type": "number"
},
"mode": {
"const": "balls"
}
},
"required": [
"mode",
"ballCount",
"ballGrams"
],
"type": "object"
}
]
},
"starterFinalPct": {
"default": 0,
"description": "Final-mix sourdough starter mass (including its flour and water) as a percentage of total flour. No stage-basis conversion is required.",
"maximum": 200,
"minimum": 0,
"type": "number"
},
"starterFlourSource": {
"default": "blend",
"description": "blend or a supplied flour row ID. Inactive starter normalizes to blend and 100% hydration.",
"maxLength": 64,
"minLength": 1,
"type": "string"
},
"starterHydrationPct": {
"default": 100,
"description": "Starter water as a percentage of starter flour, not total flour or starter mass.",
"maximum": 200,
"minimum": 40,
"type": "number"
},
"starterPrefPct": {
"default": 0,
"description": "Preferment sourdough starter mass (including its flour and water) as a percentage of total flour, not preferment flour. Convert a Dough preferment-page percentage with pagePercent * effectiveBigaFlour / totalFlour, using actual allocated preferment flour from results. Only without an allocation shortfall is pagePercent * pff / 100 equivalent. A zero actual preferment-flour weight makes its stage percentage unavailable. Example with full allocation: 1.60 * 15 / 100 = 0.24, giving 4.8 g at 2000 g total flour.",
"maximum": 200,
"minimum": 0,
"type": "number"
},
"sugar": {
"default": 0,
"maximum": 30,
"minimum": 0,
"type": "number"
},
"units": {
"const": "g",
"type": "string"
}
},
"required": [
"units",
"sizing",
"hydration",
"flours"
],
"type": "object"
},
"id": {
"maxLength": 64,
"minLength": 1,
"pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$",
"type": "string"
}
},
"required": [
"id",
"dough"
],
"type": "object"
},
"maxItems": 8,
"minItems": 1,
"type": "array"
},
"pizzas": {
"items": {
"additionalProperties": false,
"properties": {
"count": {
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"ref": {
"maxLength": 100,
"minLength": 1,
"pattern": "^(?:[a-z0-9]+(?:-[a-z0-9]+)*|[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12})$",
"type": "string"
}
},
"required": [
"ref",
"count"
],
"type": "object"
},
"maxItems": 20,
"type": "array"
}
},
"required": [
"batches"
],
"type": "object"
},
"name": "shopping_list"
}
]
}What the leaf hashes
{"body":"ea4c9b4945396feb979e02d54f6a983e3c091b0becd5734db383ba5250e98467","id":228038,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793028663399635,"prev":null,"subject":"4b566e29-65cc-4977-b194-bf77f627311b","subject_kind":"endpoint"}Proof
Its day has not closed yet. A day closes ten minutes after midnight UTC; the proof appears here then.