mirror of
https://github.com/kuhyx/diet-guard.git
synced 2026-11-10 19:07:15 +01:00
Meal-slot checkpoints move from whole hours to minute-of-day ints
(0..1439) in the pure model and slot arithmetic of both languages:
MealSchedule(first_minute, last_minute, count) / (firstMinute:,
lastMinute:, count:), interior slots snapped to the 15-minute grid,
endpoints exact, integer-only. New: nearest_slot, satisfied_slots,
slot_fields / entry_slot_minute (additive "slot_min" wire field) and
schedule_to_wire / schedule_from_wire ("fm"/"lm" only when off the hour,
so whole-hour data stays byte-identical), parse_hhmm.
tests/fixtures/meal_schedule_vectors.json (scripts/
build_meal_schedule_fixture.py) is read by both suites; kuchnia_day.json
slot values regenerated as minutes.
Consumers (CLI, gate, storage, sync, app screens, kuchnia, notifications)
are intentionally broken until phase 2. patch-targets skipped: it fails
only because diet_guard._gatelock no longer imports.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015npsYVB2PdtWkG7MPAi4tn
655 lines
16 KiB
JSON
655 lines
16 KiB
JSON
{
|
|
"_comment": "Shared parity fixture for the Kuchnia Wikinga catering import. Read by BOTH diet_guard/tests/test_kuchnia_parity.py and app/test/kuchnia_parity_test.dart -- same input, same expected result. Regenerate with scripts/build_kuchnia_fixture.py.",
|
|
"expected": {
|
|
"bank_keys": [
|
|
"marchewkowe pancakes, twarożek cynamonowy, sos truskawkowy",
|
|
"hummus paprykowy, mini wafle kukurydziane, warzywa",
|
|
"makaron farfalle z indykiem w sosie z batatów z suszonymi pomidorami, ser włoski",
|
|
"fit ciasto, jak twix white",
|
|
"kaszotto grzybowe z pieczonym kurczakiem i serem włoskim",
|
|
"no priority, kept",
|
|
"twin dish",
|
|
"twin dish"
|
|
],
|
|
"bank_records": [
|
|
{
|
|
"carbs_g": 54.64,
|
|
"count": 0,
|
|
"desc": "Marchewkowe pancakes, twarożek cynamonowy, sos truskawkowy",
|
|
"fat_g": 12.01,
|
|
"grams": 270.0,
|
|
"kcal": 435.0,
|
|
"protein_g": 25.86
|
|
},
|
|
{
|
|
"carbs_g": 41.67,
|
|
"count": 0,
|
|
"desc": "Hummus paprykowy, mini wafle kukurydziane, warzywa",
|
|
"fat_g": 17.26,
|
|
"grams": 205.0,
|
|
"kcal": 367.0,
|
|
"protein_g": 10.86
|
|
},
|
|
{
|
|
"carbs_g": 53.23,
|
|
"count": 0,
|
|
"desc": "Makaron farfalle z indykiem w sosie z batatów z suszonymi pomidorami, ser włoski",
|
|
"fat_g": 23.21,
|
|
"grams": 465.0,
|
|
"kcal": 594.0,
|
|
"protein_g": 42.47
|
|
},
|
|
{
|
|
"carbs_g": 25.18,
|
|
"count": 0,
|
|
"desc": "Fit ciasto, jak twix white",
|
|
"fat_g": 17.36,
|
|
"grams": 90.0,
|
|
"kcal": 268.0,
|
|
"protein_g": 5.85
|
|
},
|
|
{
|
|
"carbs_g": 35.56,
|
|
"count": 0,
|
|
"desc": "Kaszotto grzybowe z pieczonym kurczakiem i serem włoskim",
|
|
"fat_g": 13.02,
|
|
"grams": 318.0,
|
|
"kcal": 391.0,
|
|
"protein_g": 32.51
|
|
},
|
|
{
|
|
"carbs_g": 40.0,
|
|
"count": 0,
|
|
"desc": "No priority, kept",
|
|
"fat_g": 8.0,
|
|
"grams": 120.0,
|
|
"kcal": 300.0,
|
|
"protein_g": 10.0
|
|
},
|
|
{
|
|
"carbs_g": 45.0,
|
|
"count": 0,
|
|
"desc": "Twin dish",
|
|
"fat_g": 12.0,
|
|
"grams": 300.0,
|
|
"kcal": 400.0,
|
|
"protein_g": 25.0
|
|
},
|
|
{
|
|
"carbs_g": 45.0,
|
|
"count": 0,
|
|
"desc": "Twin dish",
|
|
"fat_g": 12.0,
|
|
"grams": 300.0,
|
|
"kcal": 400.0,
|
|
"protein_g": 25.0
|
|
}
|
|
],
|
|
"dishes": [
|
|
{
|
|
"carbs_g": 54.64,
|
|
"fat_g": 12.01,
|
|
"grams": 270.0,
|
|
"kcal": 435.0,
|
|
"name": "Marchewkowe pancakes, twarożek cynamonowy, sos truskawkowy",
|
|
"priority": 1,
|
|
"protein_g": 25.86,
|
|
"slot_label": "Śniadanie"
|
|
},
|
|
{
|
|
"carbs_g": 41.67,
|
|
"fat_g": 17.26,
|
|
"grams": 205.0,
|
|
"kcal": 367.0,
|
|
"name": "Hummus paprykowy, mini wafle kukurydziane, warzywa",
|
|
"priority": 2,
|
|
"protein_g": 10.86,
|
|
"slot_label": "II śniadanie"
|
|
},
|
|
{
|
|
"carbs_g": 53.23,
|
|
"fat_g": 23.21,
|
|
"grams": 465.0,
|
|
"kcal": 594.0,
|
|
"name": "Makaron farfalle z indykiem w sosie z batatów z suszonymi pomidorami, ser włoski",
|
|
"priority": 3,
|
|
"protein_g": 42.47,
|
|
"slot_label": "Obiad"
|
|
},
|
|
{
|
|
"carbs_g": 25.18,
|
|
"fat_g": 17.36,
|
|
"grams": 90.0,
|
|
"kcal": 268.0,
|
|
"name": "Fit ciasto, jak twix white",
|
|
"priority": 4,
|
|
"protein_g": 5.85,
|
|
"slot_label": "Podwieczorek"
|
|
},
|
|
{
|
|
"carbs_g": 35.56,
|
|
"fat_g": 13.02,
|
|
"grams": 318.0,
|
|
"kcal": 391.0,
|
|
"name": "Kaszotto grzybowe z pieczonym kurczakiem i serem włoskim",
|
|
"priority": 5,
|
|
"protein_g": 32.51,
|
|
"slot_label": "Kolacja"
|
|
},
|
|
{
|
|
"carbs_g": 40.0,
|
|
"fat_g": 8.0,
|
|
"grams": 120.0,
|
|
"kcal": 300.0,
|
|
"name": "No priority, kept",
|
|
"priority": 8,
|
|
"protein_g": 10.0,
|
|
"slot_label": "Przekąska"
|
|
},
|
|
{
|
|
"carbs_g": 45.0,
|
|
"fat_g": 12.0,
|
|
"grams": 300.0,
|
|
"kcal": 400.0,
|
|
"name": "Twin dish",
|
|
"priority": 5,
|
|
"protein_g": 25.0,
|
|
"slot_label": "Obiad"
|
|
},
|
|
{
|
|
"carbs_g": 45.0,
|
|
"fat_g": 12.0,
|
|
"grams": 300.0,
|
|
"kcal": 400.0,
|
|
"name": "Twin dish",
|
|
"priority": 5,
|
|
"protein_g": 25.0,
|
|
"slot_label": "Obiad"
|
|
}
|
|
],
|
|
"dropped_count": 5,
|
|
"fill": {
|
|
"fill_plan": {
|
|
"empty_day": {
|
|
"expected": [
|
|
[
|
|
"Marchewkowe pancakes, twarożek cynamonowy, sos truskawkowy",
|
|
480
|
|
],
|
|
[
|
|
"Hummus paprykowy, mini wafle kukurydziane, warzywa",
|
|
480
|
|
],
|
|
[
|
|
"Makaron farfalle z indykiem w sosie z batatów z suszonymi pomidorami, ser włoski",
|
|
720
|
|
],
|
|
[
|
|
"Fit ciasto, jak twix white",
|
|
720
|
|
],
|
|
[
|
|
"Kaszotto grzybowe z pieczonym kurczakiem i serem włoskim",
|
|
960
|
|
],
|
|
[
|
|
"Twin dish",
|
|
960
|
|
],
|
|
[
|
|
"Twin dish",
|
|
1200
|
|
],
|
|
[
|
|
"No priority, kept",
|
|
1200
|
|
]
|
|
],
|
|
"occupied": [],
|
|
"take": [
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7
|
|
]
|
|
},
|
|
"five_on_four": {
|
|
"expected": [
|
|
[
|
|
"Marchewkowe pancakes, twarożek cynamonowy, sos truskawkowy",
|
|
480
|
|
],
|
|
[
|
|
"Hummus paprykowy, mini wafle kukurydziane, warzywa",
|
|
480
|
|
],
|
|
[
|
|
"Makaron farfalle z indykiem w sosie z batatów z suszonymi pomidorami, ser włoski",
|
|
720
|
|
],
|
|
[
|
|
"Kaszotto grzybowe z pieczonym kurczakiem i serem włoskim",
|
|
1200
|
|
]
|
|
],
|
|
"occupied": [
|
|
960
|
|
],
|
|
"take": [
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4
|
|
]
|
|
},
|
|
"full_day": {
|
|
"expected": [],
|
|
"occupied": [
|
|
480,
|
|
720,
|
|
960,
|
|
1200
|
|
],
|
|
"take": [
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7
|
|
]
|
|
},
|
|
"occupied_12": {
|
|
"expected": [
|
|
[
|
|
"Marchewkowe pancakes, twarożek cynamonowy, sos truskawkowy",
|
|
480
|
|
],
|
|
[
|
|
"Hummus paprykowy, mini wafle kukurydziane, warzywa",
|
|
480
|
|
],
|
|
[
|
|
"Kaszotto grzybowe z pieczonym kurczakiem i serem włoskim",
|
|
960
|
|
],
|
|
[
|
|
"Twin dish",
|
|
960
|
|
],
|
|
[
|
|
"Twin dish",
|
|
1200
|
|
],
|
|
[
|
|
"No priority, kept",
|
|
1200
|
|
]
|
|
],
|
|
"occupied": [
|
|
720
|
|
],
|
|
"take": [
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7
|
|
]
|
|
}
|
|
},
|
|
"log_dishes": {
|
|
"empty_day": {
|
|
"expected": [
|
|
[
|
|
"Marchewkowe pancakes, twarożek cynamonowy, sos truskawkowy",
|
|
480
|
|
],
|
|
[
|
|
"Hummus paprykowy, mini wafle kukurydziane, warzywa",
|
|
480
|
|
],
|
|
[
|
|
"Makaron farfalle z indykiem w sosie z batatów z suszonymi pomidorami, ser włoski",
|
|
720
|
|
],
|
|
[
|
|
"Fit ciasto, jak twix white",
|
|
720
|
|
],
|
|
[
|
|
"Kaszotto grzybowe z pieczonym kurczakiem i serem włoskim",
|
|
960
|
|
],
|
|
[
|
|
"Twin dish",
|
|
960
|
|
],
|
|
[
|
|
"Twin dish",
|
|
1200
|
|
],
|
|
[
|
|
"No priority, kept",
|
|
1200
|
|
]
|
|
],
|
|
"take": [
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7
|
|
],
|
|
"today": []
|
|
},
|
|
"twin_logged": {
|
|
"expected": [
|
|
[
|
|
"Hummus paprykowy, mini wafle kukurydziane, warzywa",
|
|
480
|
|
],
|
|
[
|
|
"Makaron farfalle z indykiem w sosie z batatów z suszonymi pomidorami, ser włoski",
|
|
480
|
|
],
|
|
[
|
|
"Fit ciasto, jak twix white",
|
|
720
|
|
],
|
|
[
|
|
"Kaszotto grzybowe z pieczonym kurczakiem i serem włoskim",
|
|
720
|
|
],
|
|
[
|
|
"No priority, kept",
|
|
1200
|
|
]
|
|
],
|
|
"take": [
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7
|
|
],
|
|
"today": [
|
|
{
|
|
"desc": " twin DISH ",
|
|
"slot": 960
|
|
},
|
|
{
|
|
"desc": "No priority, kept",
|
|
"slot": 480
|
|
}
|
|
]
|
|
},
|
|
"twins_share_16": {
|
|
"expected": [
|
|
[
|
|
"Hummus paprykowy, mini wafle kukurydziane, warzywa",
|
|
480
|
|
],
|
|
[
|
|
"Makaron farfalle z indykiem w sosie z batatów z suszonymi pomidorami, ser włoski",
|
|
480
|
|
],
|
|
[
|
|
"Fit ciasto, jak twix white",
|
|
720
|
|
],
|
|
[
|
|
"Kaszotto grzybowe z pieczonym kurczakiem i serem włoskim",
|
|
720
|
|
],
|
|
[
|
|
"Twin dish",
|
|
960
|
|
],
|
|
[
|
|
"No priority, kept",
|
|
1200
|
|
]
|
|
],
|
|
"take": [
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7
|
|
],
|
|
"today": []
|
|
}
|
|
},
|
|
"slots": [
|
|
480,
|
|
720,
|
|
960,
|
|
1200
|
|
]
|
|
},
|
|
"slot_order": [
|
|
"Marchewkowe pancakes, twarożek cynamonowy, sos truskawkowy",
|
|
"Hummus paprykowy, mini wafle kukurydziane, warzywa",
|
|
"Makaron farfalle z indykiem w sosie z batatów z suszonymi pomidorami, ser włoski",
|
|
"Fit ciasto, jak twix white",
|
|
"Kaszotto grzybowe z pieczonym kurczakiem i serem włoskim",
|
|
"Twin dish",
|
|
"Twin dish",
|
|
"No priority, kept"
|
|
],
|
|
"slots": {
|
|
"480,720,960,1200": [
|
|
480,
|
|
480,
|
|
720,
|
|
720,
|
|
960,
|
|
960,
|
|
1200,
|
|
1200
|
|
],
|
|
"480,720,960,1200,1320": [
|
|
480,
|
|
480,
|
|
720,
|
|
720,
|
|
960,
|
|
1200,
|
|
1200,
|
|
1320
|
|
],
|
|
"first_three_480,720,960,1200": [
|
|
480,
|
|
720,
|
|
960
|
|
]
|
|
}
|
|
},
|
|
"payload": {
|
|
"deliveryMenuMeal": [
|
|
{
|
|
"deliveryMealId": 1001,
|
|
"mealName": "Śniadanie",
|
|
"mealPriority": 1,
|
|
"menuMealName": "Marchewkowe pancakes, twarożek cynamonowy, sos truskawkowy",
|
|
"nutrition": {
|
|
"calories": 435.0,
|
|
"carbohydrate": 54.64,
|
|
"dietaryFiber": 2.03,
|
|
"fat": 12.01,
|
|
"protein": 25.86,
|
|
"salt": 0.52,
|
|
"saturatedFattyAcids": 1.92,
|
|
"sugar": 22.4,
|
|
"weight": 270.0
|
|
}
|
|
},
|
|
{
|
|
"deliveryMealId": 1002,
|
|
"mealName": "II śniadanie",
|
|
"mealPriority": 2,
|
|
"menuMealName": "Hummus paprykowy, mini wafle kukurydziane, warzywa",
|
|
"nutrition": {
|
|
"calories": 367.0,
|
|
"carbohydrate": 41.67,
|
|
"dietaryFiber": 9.18,
|
|
"fat": 17.26,
|
|
"protein": 10.86,
|
|
"salt": 1.27,
|
|
"saturatedFattyAcids": 1.59,
|
|
"sugar": 3.77,
|
|
"weight": 205.0
|
|
}
|
|
},
|
|
{
|
|
"deliveryMealId": 1003,
|
|
"mealName": "Obiad",
|
|
"mealPriority": 3,
|
|
"menuMealName": "Makaron farfalle z indykiem w sosie z batatów z suszonymi pomidorami, ser włoski",
|
|
"nutrition": {
|
|
"calories": 594.0,
|
|
"carbohydrate": 53.23,
|
|
"dietaryFiber": 3.83,
|
|
"fat": 23.21,
|
|
"protein": 42.47,
|
|
"salt": 1.08,
|
|
"saturatedFattyAcids": 7.03,
|
|
"sugar": 4.88,
|
|
"weight": 465.0
|
|
}
|
|
},
|
|
{
|
|
"deliveryMealId": 1004,
|
|
"mealName": "Podwieczorek",
|
|
"mealPriority": 4,
|
|
"menuMealName": "Fit ciasto, jak twix white",
|
|
"nutrition": {
|
|
"calories": 268.0,
|
|
"carbohydrate": 25.18,
|
|
"dietaryFiber": 0.36,
|
|
"fat": 17.36,
|
|
"protein": 5.85,
|
|
"salt": 0.15,
|
|
"saturatedFattyAcids": 10.76,
|
|
"sugar": 8.3,
|
|
"weight": 90.0
|
|
}
|
|
},
|
|
{
|
|
"deliveryMealId": 1005,
|
|
"mealName": "Kolacja",
|
|
"mealPriority": 5,
|
|
"menuMealName": "Kaszotto grzybowe z pieczonym kurczakiem i serem włoskim",
|
|
"nutrition": {
|
|
"calories": 391.0,
|
|
"carbohydrate": 35.56,
|
|
"dietaryFiber": 3.69,
|
|
"fat": 13.02,
|
|
"protein": 32.51,
|
|
"salt": 1.3,
|
|
"saturatedFattyAcids": 6.53,
|
|
"sugar": 1.99,
|
|
"weight": 318.0
|
|
}
|
|
},
|
|
{
|
|
"mealName": "Obiad",
|
|
"mealPriority": 6,
|
|
"menuMealName": "Per-100g mix-up, dropped",
|
|
"nutrition": {
|
|
"calories": 900.0,
|
|
"carbohydrate": 6.0,
|
|
"fat": 2.0,
|
|
"protein": 5.0,
|
|
"weight": 400.0
|
|
}
|
|
},
|
|
{
|
|
"mealName": "Kolacja",
|
|
"mealPriority": 7,
|
|
"menuMealName": "Absurd portion, dropped",
|
|
"nutrition": {
|
|
"calories": 500.0,
|
|
"carbohydrate": 60.0,
|
|
"fat": 15.0,
|
|
"protein": 30.0,
|
|
"weight": 9000.0
|
|
}
|
|
},
|
|
{
|
|
"mealName": "Przekąska",
|
|
"menuMealName": "No priority, kept",
|
|
"nutrition": {
|
|
"calories": 300.0,
|
|
"carbohydrate": 40.0,
|
|
"fat": 8.0,
|
|
"protein": 10.0,
|
|
"weight": 120.0
|
|
}
|
|
},
|
|
{
|
|
"mealName": "Obiad",
|
|
"mealPriority": 8,
|
|
"menuMealName": "Stringly typed, dropped",
|
|
"nutrition": {
|
|
"calories": "435",
|
|
"carbohydrate": 50.0,
|
|
"fat": 12.0,
|
|
"protein": 25.0,
|
|
"weight": 200.0
|
|
}
|
|
},
|
|
"not-a-meal",
|
|
{
|
|
"mealName": "Obiad",
|
|
"mealPriority": 9,
|
|
"menuMealName": "No nutrition, dropped"
|
|
},
|
|
{
|
|
"mealName": "Obiad",
|
|
"mealPriority": 5,
|
|
"menuMealName": "Twin dish",
|
|
"nutrition": {
|
|
"calories": 400.0,
|
|
"carbohydrate": 45.0,
|
|
"fat": 12.0,
|
|
"protein": 25.0,
|
|
"weight": 300.0
|
|
}
|
|
},
|
|
{
|
|
"mealName": "Obiad",
|
|
"mealPriority": 5,
|
|
"menuMealName": "Twin dish",
|
|
"nutrition": {
|
|
"calories": 400.0,
|
|
"carbohydrate": 45.0,
|
|
"fat": 12.0,
|
|
"protein": 25.0,
|
|
"weight": 300.0
|
|
}
|
|
}
|
|
],
|
|
"menuVisible": true,
|
|
"showNutrition": true
|
|
}
|
|
}
|