Skip to content

feat(data): add everyday-2026-10 recipe slice — 24 originals + 161 RS v1 rewrites - #163

Draft
obvious-autobuild[bot] wants to merge 2 commits into
obv/burst5-fridgeluck-spec-recipesfrom
obv/burst5-fridgeluck-rcp-originals-everyday
Draft

obvious-autobuild[bot] wants to merge 2 commits into
obv/burst5-fridgeluck-spec-recipesfrom
obv/burst5-fridgeluck-rcp-originals-everyday

Conversation

@obvious-autobuild

@obvious-autobuild obvious-autobuild Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Review fixes (16c1352) — changes-needed verdict addressed

The independent review (comment 6199621078) ranked five findings; all five are accepted and fixed — none were disputed. Recipe data itself was not changed.

# Finding Fix Test that failed before the fix
1 [high] evidence/rights.json pinned authoring-machine absolute paths; checker failed on any fresh checkout (FAIL evidence: pinned recipes files absent) gen_rights.py writes bare filenames; rights_errors() resolves them against --dir (absolute paths still pass through) test_committed_evidence_uses_bare_filenames — FAIL pre-fix (committed evidence has /home/user/... paths)
2 [medium] --legacy144 crashed with AttributeError: 'list' object has no attribute 'keys' on PR #144's shipped data.json dedupe_errors() normalizes both shapes: title-keyed map and the [id, title, minutes, servings, ingredients, tags, instructions, ...] row array (title = row[1], instructions = row[6]) test_row_array_title_match_is_planted + test_row_array_clean_passes — AttributeError pre-fix
3 [medium] README Reproduce block didn't run (missing --dir, wrong catalog path data/evidence/usda*.sqlite); omitted external inputs skipped checks silently contradicting the fail-closed docstring; promised report.md absent; overrides/BRIEF.md baked in a dev-only /tmp path README rewritten with runnable commands and the real catalog path (apps/ios/Resources/usda_ingredient_catalog.sqlite); checker now prints a SKIPPED line per missing external input and counts them in the summary (slice-local checker: 0 error(s) is unambiguous); report.md added; BRIEF path made checkout-relative test_all_missing_lists_three / test_present_inputs_list_none — external_skips didn't exist pre-fix (AttributeError)
4 [low, latent] fix_safety matched fish proteins by substring — "fish sauce" in a future ingredient list would reclassify an undercooked poultry endpoint to flesh_fish Word-boundary regex \b(salmon|fish|tuna|shrimp)\b with fish sauce stripped before matching; word-boundary matching also correctly excludes e.g. "fisherman's" test_fish_sauce_does_not_reclassify_poultry — FAIL pre-fix (meat_poultry 150 °F became flesh_fish); control test_real_fish_ingredient_reclassifies stays green
5 [low, body] Body claimed "the checker prints which inputs it needs when run" — it didn't True now: the finding-3 SKIPPED lines name each input; body wording updated —

No findings were disputed. No recipe data changed: after the fix-4 assembler change, python3 tools/build_slice.py reproduces converted-144.jsonl byte-identical (sha256sum -c OK), and the regenerated evidence/rights.json differs from the previously committed file in exactly the two recipes_file lines — the recipes_sha256 pins are unchanged.

Commands run on a fresh detached checkout of this branch (arbitrary path)

python3 tools/test_check_everyday.py
#   Ran 32 tests in 0.009s   OK   (23 original + 9 new regression tests)
#   pre-fix, the new tests fail: 6 ERROR + 2 FAIL (list above)

python3 tools/check_everyday.py --dir . \
  --catalog ../../../apps/ios/Resources/usda_ingredient_catalog.sqlite \
  --bundled ../../../apps/ios/Resources/data.json \
  --corpus113 <#113 checkout>/data/recipes/corpus.jsonl \
  --legacy144 legacy-144.json \
  --validate-suite <suite checkout at 26c7004> \
  --corpus-tools <#113 checkout>/data/recipes/tools
#   slice: 24 originals + 161 converted = 185 recipes
#   slice-local checker: 0 error(s)
#   VALIDATION GREEN: rights-clear corpus lints clean, claims verified,
#     ids unique and in-scheme, no quarantined recipe in corpus.jsonl
#   measured: recipes=185 resolved_pct=100.0 bands=14/14

python3 tools/check_everyday.py --dir . --catalog ../../../apps/ios/Resources/usda_ingredient_catalog.sqlite
#   SKIPPED R-E #113-corpus dedupe + 12-word overlap (pass --corpus113)
#   SKIPPED R-E #144-legacy dedupe + 9-word overlap (pass --legacy144)
#   SKIPPED bundled-catalog legacy names + overlap (pass --bundled)
#   slice-local checker: 196 error(s) (3 external check(s) skipped)

--legacy144 legacy-144.json is now the natural input (PR #144's shipped shape); the jq conversion the reviewer had to hand-build is no longer needed. Not re-verified here: hosted macOS CI on 16c1352 (the PR touches no Swift; the previous head's CI was green). Still a draft.

What changed and why

Adds the everyday-2026-10 recipe slice under data/recipe-sources/everyday-2026-10/, in the same RS v1 record shape as the PR #113 corpus:

  • 24 originals (originals.jsonl, fl-everyday-0001…0024) — FridgeLuck-original recipes covering the eight everyday categories (breakfasts, packed lunches, 20-minute dinners, budget/student pantry, high-protein, vegetarian/vegan mains, batch/leftovers, sides/salads), all six cuisines, all three meal slots, and every cook-time band.
  • 161 RS v1 rewrites of PR feat(data): expand bundled recipes to 327 and add bundled-data validator #144's legacy rows 167–327 (converted-144.jsonl, fl-everyday-0101…0261), assembled from legacy ingredients (grams preserved) + authored title/step fragments via tools/build_slice.py, with legacy ingredient-label canonicalization and FSIS safety-class normalization.
  • Rights — rights_manifest.json + evidence/rights.json cover all 185 recipes (LicenseRef-FL-Original, one authoring record each); evidence/ also pins the allergen-alias and conversion tables from the suite revision.
  • Checks — tools/check_everyday.py (slice-local gates) + an adapter that runs the pinned suite-C validator (revision 26c7004) against a temporary checkout with slice-specific affirmative-evidence forms, extended in-process; tools/build_slice.py (assembler), tools/gen_rights.py (evidence), tools/test_check_everyday.py (23 planted-failure tests).

The slice closes out the two pending source batches noted for PR #158: originals-world already has a slice; this is the everyday one.

How I checked it

All commands run in the Linux sandbox (no Xcode; this PR is data + Python tooling only):

Check Command Result
Slice gates python3 tools/check_everyday.py --dir . --catalog ../../../apps/ios/Resources/usda_ingredient_catalog.sqlite --bundled ../../../apps/ios/Resources/data.json --corpus113 /tmp/corpus/data/recipes/corpus.jsonl --legacy144 /tmp/legacy144-dedupe.json 0 errors — 100% ingredient resolution, household grams, category/diet balance, step integrity, dedupe vs the #113 corpus and legacy #144 rows, no 12-gram wording overlap
Pinned validator same + --validate-suite /tmp/suite26 --corpus-tools /tmp/corpus/data/recipes/tools VALIDATION GREEN — 185 recipes, ids unique and in-scheme, claims verified, rights-clear, bands 14/14
Unit tests python3 tools/test_check_everyday.py 23 tests OK

The checker's dedupe/overlap inputs come from PR #113's corpus (/tmp/corpus/...) and PR #144's legacy records (/tmp/legacy144-dedupe.json), both fetched from the repo during development; the checker prints which inputs it needs when run.

What I could not check

  • Hosted macOS CI — this PR touches no Swift; the portable Python checks above are the whole verification surface, but CI has not run on this branch yet.
  • iOS-side rendering of these recipes (no Xcode in the sandbox) — nothing in this PR changes app code; consumption happens through the bundle pipeline (PR feat(data): resolve ingredient identity and compile validated bundle-v2 #158).

Assumptions

  • Categories: the spec on the base branch did not define everyday-slice categories, so the prompt's eight default categories govern; the mapping is committed in overrides/categories.json for review.
  • Rewrite latitude: legacy rows' titles/steps were rewritten to RS v1 wording with ingredient grams and identities preserved; doneness temperatures were kept unless they violated FSIS minimums (a meat_poultry endpoint below 165 °F is reclassified to the recipe's actual protein class, e.g. eggs at 160 °F or ground beef at 160 °F).
  • One recipe change of substance: legacy 180 was a cold smoked-salmon toast; "smoked salmon" doesn't resolve in the ingredient catalog and carries no FSIS endpoint, so the recipe became a seared salmon toast with a 145 °F thermometer check (fl-everyday-0114).
  • The pinned validator's rights forms are tied to the older fl-original authoring pipeline; the checker adapter extends them locally (never modifies the validator) so each slice recipe is verified against its own pinned authoring record.

🚢 Draft pending review.

Co-authored-by: obvious-autobuild[bot] <262744130+obvious-autobuild[bot]@users.noreply.github.com>

… v1 rewrites

24 FridgeLuck-original recipes (fl-everyday-0001-0024) and 161 RS v1
rewrites of PR #144's legacy rows 167-327 (fl-everyday-0101-0261),
assembled by tools/build_slice.py with ingredient-label canonicalization
and FSIS safety-class normalization.

Checks (all run in the sandbox):
- tools/check_everyday.py: 0 errors (ingredient resolution 100%,
  household grams, category/diet balance, step integrity, dedupe vs
  the #113 corpus and legacy #144 rows, step-text 12-gram overlap)
- pinned suite-C validator (revision 26c7004) via the in-process
  adapter: VALIDATION GREEN, 185 recipes, bands 14/14
- tools/test_check_everyday.py: 23 tests OK

Rights: rights_manifest.json + evidence/rights.json regenerated for all
185 recipes (LicenseRef-FL-Original); evidence/ carries the pinned
allergen/conversion tables from the suite revision.

Co-authored-by: obvious-autobuild[bot] <262744130+obvious-autobuild[bot]@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 2ba127d0-4b89-407e-9c01-3f1ad3e725a9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@SamGu-NRX
SamGu-NRX changed the base branch from main to obv/burst5-fridgeluck-spec-recipes October 15, 2026 12:55
@SamGu-NRX

Copy link
Copy Markdown
Owner

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Review skipped.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@obvious-autobuild

Copy link
Copy Markdown
Author

Independent review (Obvious, Autobuild + Max)

Verdict: changes needed — the recipe data itself is sound and every substantive claim in the body reproduces (I re-ran the full claimed suite green), but the committed evidence file pins authoring-machine absolute paths, so the headline "slice gates: 0 errors" check fails on any fresh checkout of this branch. The fixes are small and mechanical; no recipe data changes are required.

Findings (ranked by severity)

  1. [high] evidence/rights.json embeds absolute dev-sandbox paths — the checker cannot pass on a fresh clone. tools/gen_rights.py:81 writes "recipes_file": str(path.resolve()), so the committed evidence carries /home/user/work/burst5-fridgeluck-rcp-originals-everyday/data/recipe-sources/everyday-2026-10/originals.jsonl — a path that exists only on the authoring sandbox. tools/check_everyday.py:359 and :398 stat those paths and fail closed, so the body's own check command on a fresh checkout exits 1 with FAIL evidence: pinned recipes files absent, cannot verify: ['everyday-originals', 'everyday-144'] (verified at head 68c164d; I had to reconstruct the dev worktree path to get past it). That breaks the README's one-command reproduction promise and means the body's "0 errors" is not reproducible from the committed tree alone. Smallest fix (verified locally): write the bare filename ("recipes_file": fname) and resolve it relative to the slice directory in the two rights_errors spots; regenerate evidence. I applied exactly that — the regenerated files differ from the committed ones in only those two path lines, the checker then reports 0 error(s), and the pinned validator still returns VALIDATION GREEN, so the sha256 values themselves already match the shipped files and nothing else moves.

  2. [medium] --legacy144 crashes on PR feat(data): expand bundled recipes to 327 and add bundled-data validator #144's shipped data.json. tools/check_everyday.py:454 calls .keys()/.values() on legacy["recipes"], which requires a hand-made shape {"recipes": {title: {"instructions": ...}}}. PR feat(data): expand bundled recipes to 327 and add bundled-data validator #144's actual apps/ios/Resources/data.json carries recipes as an array of 8-column rows, so passing the natural input dies with AttributeError: 'list' object has no attribute 'keys' (verified). The body's "fetched from the repo during development" implies the raw file works; it needs an undocumented jq conversion. Smallest fix: normalize the array shape inside dedupe_errors (title = row[1], instructions = row[6]) or document the required conversion in the checker's --help/README.

  3. [medium] README "Reproduce" block doesn't run, and the external dedupe inputs fail open. python3 tools/check_everyday.py as the README gives it errors out with the following arguments are required: --dir (verified). Even with --dir, omitting --corpus113/--legacy144/--bundled silently skips the R-E external dedupe and 12/9-word overlap checks while the module docstring claims "Everything here fails closed" — a green 0 error(s) then means different things depending on flags. The README also points the catalog at data/evidence/usda*.sqlite, which does not exist on this branch (the checker needs apps/ios/Resources/usda_ingredient_catalog.sqlite), and promises a report.md that is not in this PR (git ls-tree HEAD has no such file under the slice; overrides/BRIEF.md likewise bakes in the dev-only /tmp/corpus/... path). Smallest fix: correct the README commands and catalog path, add report.md or drop the line, and make missing dedupe inputs an explicit error or a loud SKIPPED R-E (no input) line so green stays unambiguous.

  4. [low, latent] fix_safety protein matching is substring-based. tools/build_slice.py:80 ("fish" in joined) would reclassify a poultry endpoint below 165 °F to flesh_fish in any future rebuild whose ingredient list contains "fish sauce" — masking an undercooked-poultry step as a fish endpoint. No shipped recipe hits this (scanned all 185: every poultry endpoint is 165 °F, fish endpoints 145 °F, and the one reclassified recipe, fl-everyday-0114, genuinely contains salmon). Smallest fix: word-boundary matching that excludes "fish sauce", or assert the reclassified class resolves to an actual fish/ground/egg ingredient line.

  5. [low, body accuracy] "the checker prints which inputs it needs when run" — it doesn't. With only --dir/--catalog the checker prints unrelated R-A resolution failures and no input guidance (verified). With the right inputs everything passes, so this is wording, not data.

What I verified (commands and results)

All at head 68c164d in a detached worktree, Linux sandbox, no Xcode. The PR touches no Swift — all 19 files sit under data/recipe-sources/everyday-2026-10/.

  • Pinned suite-C validator (revision 26c7004, suite evaluation/suites/recipes) via the checker's in-process adapter, against a composite worktree (PR Rights-approved recipe corpus: 401 originals behind FSIS safety, rights and claim gates #113's data/recipes @ 7fc68d48 + base-branch docs/spec/recipes @ b4a19d7 + the repo's bundle/catalog): VALIDATION GREEN — 185 recipes, 945/945 ingredient lines resolved (100.0%), bands 14/14, ids unique and in-scheme, claims verified — matches the body's table.
  • Slice gates with real dedupe inputs (--corpus113 from PR Rights-approved recipe corpus: 401 originals behind FSIS safety, rights and claim gates #113 head, --legacy144 converted from PR feat(data): expand bundled recipes to 327 and add bundled-data validator #144 head 446f928a, bundled data.json + USDA catalog from the repo): 0 error(s) after the finding-1 path fix; as committed, the only failure is the finding-1 paths. Dedupe vs the Rights-approved recipe corpus: 401 originals behind FSIS safety, rights and claim gates #113 corpus, feat(data): expand bundled recipes to 327 and add bundled-data validator #144 titles, and the bundled catalog: clean, no 12/9-word overlap hits.
  • Unit tests: python3 tools/test_check_everyday.py → Ran 23 tests, OK, matching the body. Mutation check: neutering quantity_errors makes 2 tests fail, so the tests bind to the real checker, not a copy.
  • Legacy snapshot fidelity: legacy-144.json rows 167–327 are byte-equal to PR feat(data): expand bundled recipes to 327 and add bundled-data validator #144's apps/ios/Resources/data.json rows (per-row JSON equality, 161/161).
  • Evidence pinning: evidence/conversions-pinned.json (129 rows) and evidence/allergen-classes.json (128 aliases) are identical to the suite files at 26c7004.
  • Balance claims: 18/24 originals compute vegetarian (body says 18; 3 vegan), 8 categories × 3 recipes, all six cuisines, all five time bands, all three slots — recomputed with the checker's own classifier.
  • FSIS scan of all 185 recipes: class/temp pairs = egg 160 °F (39), meat_poultry 165 °F (23), flesh_fish 145 °F (10), meat_ground 160 °F (11), leftovers 165 °F (17) — none below FSIS minimums; no poultry endpoint below 165 °F anywhere.
  • Rights: 185 manifest records, all LicenseRef-FL-Original, evidence groups 24 + 161; source_ref ↔ manifest records line up; ids contiguous in-scheme (fl-everyday-0001–0024, 0101–0261).
  • CI on this head: iOS CI build-and-test and dead-code-advisory both SUCCESS (run 38728499120).
  • The disclosed legacy-180 change is accurate: legacy "Smoked-Style Salmon and Cucumber Toast" → fl-everyday-0114 "Seared Salmon Toast with Lemon Cucumbers", with a real salmon ingredient line and a flesh_fish 145 °F thermometer step — exactly the "one recipe change of substance" the body declares.

What I couldn't verify

  • iOS-side rendering/consumption of these recipes — no Xcode here, and CI ran the standard Swift suite rather than anything slice-specific; nothing in this PR touches app code.
  • The dev sandbox's exact /tmp inputs (/tmp/corpus/..., /tmp/legacy144-dedupe.json); I reconstructed equivalents from the referenced PR heads and the base branch, which is also where the finding-2/3 friction comes from.
  • End-to-end consumption by the base branch's bundle pipeline (PR feat(data): resolve ingredient identity and compile validated bundle-v2 #158) — out of scope for this diff.

Nothing above questions the recipe data: with the finding-1 fix (3 small edits + regenerate), the full claimed suite reproduces green from the committed tree.

Independent review of PR #163 (comment 6199621078) ranked five findings;
all five are addressed.

1. [high] evidence/rights.json pinned authoring-machine absolute paths, so
   the checker failed on any fresh checkout. gen_rights.py now writes bare
   filenames and rights_errors() resolves them against the slice directory.
   Regenerated evidence differs from the committed file in exactly the two
   recipes_file lines; the sha256 pins are unchanged.
2. [medium] --legacy144 crashed with AttributeError on PR #144's shipped
   data.json (recipes is an array of rows). dedupe_errors() now normalizes
   both shapes (title-keyed map and [id, title, minutes, servings,
   ingredients, tags, instructions, ...] rows), so the natural input works.
3. [medium] README Reproduce block did not run (missing --dir, wrong catalog
   path), omitted external inputs skipped checks silently, and the promised
   report.md was absent. README commands are corrected and documented, the
   checker now prints every skipped external check and counts it in the
   summary line, and report.md records this validation run.
4. [low] build_slice.py matched fish proteins by substring, so an ingredient
   list containing 'fish sauce' could reclassify an undercooked poultry
   endpoint. Matching is now word-boundary based and excludes fish sauce.
   Rebuilding with the fix reproduces converted-144.jsonl byte-identical.
5. [low] the body claimed the checker prints which inputs it needs; with the
   finding-3 SKIPPED lines it now does.

Tests: 9 regression tests added, one per fix (plus portability controls);
all 8 new failure-mode tests fail on the pre-fix code and all 32 tests pass
after. Checker 0 error(s) and pinned suite-C validator (26c7004) VALIDATION
GREEN (185 recipes, 100% resolution, bands 14/14) re-verified on a fresh
detached checkout. See data/recipe-sources/everyday-2026-10/report.md.

Co-authored-by: obvious-autobuild[bot] <262744130+obvious-autobuild[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant