R1: Migration 0010 now writes revision 0 into every ground_dinner job payload that has none. Jobs queued before the upgrade carry only dinner_id, so the boot cleanup, which matches a pending dinner to its job by revision, failed those dinners as interrupted while their jobs were still queued. The migration runs before the job runner starts. A new test migrates a database to 0009, adds a pending Regular with a legacy queued job, upgrades and boots, and checks the dinner stays pending and is then grounded. R2: Archiving a dinner, or renaming a pending one, now cancels the grounding of any ground_dinner job running for it at an older revision, so no further search, page fetch, photo download or model call is made. The job is registered before it reads the dinner, so an archive or rename committed after that read always finds it. A stopped job succeeds and reports the dinner's current grounding status. The archive and rename tests now check that the job ends while its search is still held, with no page fetched and no model call for the stale name. R3: gen_folds.py writes web/src/dinners/letterFolds.json from the same table as folds_table.go, and names.ts folds through it instead of a hand-copied subset. names.ts also lowercases letter by letter, as Go's strings.ToLower does, rather than by context. TestLetterFoldsMatchPWA fails when the two tables differ. The shared cases add "Ƈhili", "Ꞔarbanzo Stew" and "ΜΟΥΣΑΚΑΣ" (final sigma). Maestro task 5037ff86-181d-448e-927b-c2fd2258a25d. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
137 lines
2.4 KiB
JSON
137 lines
2.4 KiB
JSON
{
|
||
"normalize": [
|
||
{
|
||
"name": "Easy Chicken Tikka-Masala!",
|
||
"want": "chicken tikka masala"
|
||
},
|
||
{
|
||
"name": " Homemade Chili ",
|
||
"want": "chili"
|
||
},
|
||
{
|
||
"name": "Grandma's Stew",
|
||
"want": "grandmas stew"
|
||
},
|
||
{
|
||
"name": "Grandma’s Stew",
|
||
"want": "grandmas stew"
|
||
},
|
||
{
|
||
"name": "İskender Kebab",
|
||
"want": "iskender kebab"
|
||
},
|
||
{
|
||
"name": "Paella à la Valenciana",
|
||
"want": "paella la valenciana"
|
||
},
|
||
{
|
||
"name": "Crème Brûlée",
|
||
"want": "creme brulee"
|
||
},
|
||
{
|
||
"name": "Crème Brûlée",
|
||
"want": "creme brulee"
|
||
},
|
||
{
|
||
"name": "Smørrebrød",
|
||
"want": "smorrebrod"
|
||
},
|
||
{
|
||
"name": "Pierogi z Łososiem",
|
||
"want": "pierogi z lososiem"
|
||
},
|
||
{
|
||
"name": "Straße Würstchen",
|
||
"want": "strasse wurstchen"
|
||
},
|
||
{
|
||
"name": "Œufs en Cocotte",
|
||
"want": "oeufs en cocotte"
|
||
},
|
||
{
|
||
"name": "Æbleskiver",
|
||
"want": "aebleskiver"
|
||
},
|
||
{
|
||
"name": "Phở Bò",
|
||
"want": "pho bo"
|
||
},
|
||
{
|
||
"name": "The Best Quick Recipe",
|
||
"want": ""
|
||
},
|
||
{
|
||
"name": "Chicken stir-fry",
|
||
"want": "chicken stir fry"
|
||
},
|
||
{
|
||
"name": "7-layer dip",
|
||
"want": "7 layer dip"
|
||
},
|
||
{
|
||
"name": "Ƈhili",
|
||
"want": "chili"
|
||
},
|
||
{
|
||
"name": "Ꞔarbanzo Stew",
|
||
"want": "carbanzo stew"
|
||
},
|
||
{
|
||
"name": "ΜΟΥΣΑΚΑΣ",
|
||
"want": "μουσακασ"
|
||
}
|
||
],
|
||
"similar": [
|
||
{
|
||
"a": "Homemade chili",
|
||
"b": "Chili",
|
||
"want": true
|
||
},
|
||
{
|
||
"a": "Easy Spaghetti Bolognese",
|
||
"b": "spaghetti bolognese",
|
||
"want": true
|
||
},
|
||
{
|
||
"a": "Chicken stir fry",
|
||
"b": "Chicken stir-fry",
|
||
"want": true
|
||
},
|
||
{
|
||
"a": "Crème brûlée",
|
||
"b": "Creme brulee",
|
||
"want": true
|
||
},
|
||
{
|
||
"a": "Smørrebrød",
|
||
"b": "smorrebrod",
|
||
"want": true
|
||
},
|
||
{
|
||
"a": "Beef tacos",
|
||
"b": "Fish tacos",
|
||
"want": false
|
||
},
|
||
{
|
||
"a": "Chili",
|
||
"b": "White chicken chili",
|
||
"want": false
|
||
},
|
||
{
|
||
"a": "Pot roast",
|
||
"b": "Roast",
|
||
"want": false
|
||
},
|
||
{
|
||
"a": "The best",
|
||
"b": "Easy recipe",
|
||
"want": false
|
||
},
|
||
{
|
||
"a": "Ƈhili",
|
||
"b": "Chili",
|
||
"want": true
|
||
}
|
||
]
|
||
}
|