Skip to content

Commit 7423156

Browse files
committed
feat: The Michelin Chicken Dynamics (v3)
Includes the new CLI dashboard, thermodynamic documentation (docs/21), the michelin v3 runner script, and the visual evidence from the 2026-05-27 retrospective.
1 parent f019530 commit 7423156

184 files changed

Lines changed: 24631 additions & 9517 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,46 @@
11
---
22
name: Bug report
3-
about: Something broke. Help us reproduce and fix it.
3+
about: Something cooked wrong or the runner misbehaved
44
title: '[BUG] '
55
labels: bug
66
assignees: ''
77
---
88

99
## What happened
1010

11-
(A clear, concise description. Specific is better than vague.)
11+
A clear description of what went wrong. Include the recipe you ran and the protein.
1212

13-
## What I expected
13+
## Expected vs actual
1414

15-
## Reproduction steps
15+
- **Expected**: ...
16+
- **Actual**: ...
1617

17-
1.
18-
2.
19-
3.
18+
## Reproduction
2019

21-
## Environment
22-
23-
- CLIronChef version (`cliron-chef --version`):
24-
- OS (macOS / Linux / Windows):
25-
- Python version (`python3 --version`):
26-
- Dome 2 firmware version (visible via `cliron-chef status` under `appVersion`):
27-
- Probe firmware version (if known):
28-
29-
## CLI output
20+
1. `bash setup.sh`
21+
2. Edit recipe ... (or use stock recipe)
22+
3. Run `python scripts/claude_cook_runner.py ...`
23+
4. ...
3024

31-
```
32-
(paste verbose output: cliron-chef <command> -v)
33-
```
25+
## Telemetry attached
3426

35-
## Telemetry log (if relevant)
27+
If you can, paste the relevant section of `runs/<file>.summary.json` and the awk-filtered
28+
runner output. **Scrub `cookUuid` and `deviceId`** before pasting.
3629

3730
```
38-
(paste recent lines from runs/<timestamp>.jsonl)
31+
[INIT] ...
32+
[ARM] ...
33+
...
3934
```
4035

41-
## Does this reproduce in the Typhur app?
36+
## Environment
4237

43-
(YES / NO / NOT TESTED — if yes, this is likely a Typhur issue, not CLIronChef)
38+
- OS: (macOS / Linux distro + version)
39+
- Python: `python3 --version`
40+
- Project SHA: `git log -1 --oneline`
41+
- Typhur app version: (check Settings in the Typhur app)
42+
- Dome 2 firmware: (visible in the Typhur app's device info)
4443

45-
## Additional context
44+
## What you tried
4645

47-
(Recipe used, food being cooked, anything else you noticed.)
46+
Anything you tried to mitigate or debug before opening the issue.
Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
---
22
name: Feature request
3-
about: Suggest a new capability for CLIronChef
3+
about: Suggest a new feature or improvement
44
title: '[FEATURE] '
55
labels: enhancement
66
assignees: ''
77
---
88

9-
## What problem does this solve?
9+
## What you'd like
1010

11-
(What are you trying to accomplish that CLIronChef can't currently help with?)
11+
A clear description of the feature.
1212

13-
## What you'd like to see
13+
## Why
1414

15-
(Concrete description of the feature — CLI command, behavior, output, etc.)
15+
What use case it unlocks. Bonus points if you describe a cook you tried that motivated it.
1616

17-
## Alternatives considered
17+
## How you'd shape it (optional)
1818

19-
(How else could this problem be solved? Did you try anything that didn't work?)
19+
If you have an idea for how it should work — recipe schema field, runner flag, etc.
20+
Don't worry about implementation details; the maintainers can help shape it.
2021

21-
## Additional context
22+
## Alternatives considered
2223

23-
(Screenshots, mockups, links to similar features in other tools.)
24+
Anything that already exists in the project that's close-but-not-quite.
2425

25-
## Are you willing to implement this?
26+
## Related
2627

27-
(Self-contributions are very welcome. If yes, briefly outline your approach. We can
28-
discuss design in this issue before you write code.)
28+
Links to related issues, docs, or external references (cooking science articles, etc.).
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
---
2+
name: New recipe contribution
3+
about: You cooked something great and want to share the recipe
4+
title: '[RECIPE] '
5+
labels: recipe
6+
assignees: ''
7+
---
8+
9+
## Protein / dish
10+
11+
What did you cook? Cut, weight, thickness, anything special (wild vs farmed, marinated, etc.).
12+
13+
## Recipe JSON
14+
15+
Paste the recipe JSON below (or attach as a file). Use the v3 schema from
16+
`docs/20-recipe-schema.md`.
17+
18+
```json
19+
{
20+
"name": "...",
21+
...
22+
}
23+
```
24+
25+
## How it turned out
26+
27+
- Final core temp: ...
28+
- Texture: (rare / medium-rare / medium / medium-well / well-done) — be honest
29+
- Comments from people who ate it: ...
30+
31+
## What you'd tune
32+
33+
If you'd cook it again, what would you change? (e.g. "pull at 116°F instead of 118°F")
34+
35+
## Telemetry (optional but very useful)
36+
37+
If you've got a `runs/<file>.summary.json` from this cook, attach or paste the
38+
relevant fields. **Scrub `cookUuid` and `deviceId`.**
39+
40+
Helpful: paste the output of:
41+
```bash
42+
PYTHONPATH=src python3 scripts/analyze_run.py runs/<your_file>.jsonl
43+
```
44+
45+
## Checklist
46+
47+
- [ ] Used the v3 schema (warm-hold via Dehydrate where appropriate)
48+
- [ ] `dome2_id` / `probe_id` = `null` (device-agnostic)
49+
- [ ] Phases ordered by `trigger_temp_f` ascending
50+
- [ ] Mode IDs and temps within firmware-valid ranges
51+
- [ ] You've actually cooked it at least once

.github/ISSUE_TEMPLATE/recipe_proposal.md

Lines changed: 0 additions & 48 deletions
This file was deleted.

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,34 @@
11
## What this PR does
22

3-
(Brief summary)
3+
One- to two-sentence description.
44

55
## Why
66

7-
(Motivation, link to related issue if any)
7+
What problem this solves / what use case it enables.
88

9-
## Checklist
9+
## How to test
10+
11+
```bash
12+
# Reproduce the change:
13+
pip install -e .
14+
pytest tests/ # smoke tests should still pass
15+
ruff check . # lint should still pass
1016

11-
- [ ] `ruff check .` passes
12-
- [ ] `pytest` passes
13-
- [ ] New code has docstrings + type hints (where reasonable)
14-
- [ ] If adding a new recipe: I have actually cooked it and it worked
15-
- [ ] If changing behavior: README / docs / CHANGELOG updated
16-
- [ ] No `~/.cliron-chef/`, `*.p12`, `*.key`, `runs/`, or other gitignored artifacts staged
17-
- [ ] Commit messages follow Conventional Commits style (`feat(...)`, `fix(...)`, `docs(...)`)
17+
# If runner behavior changed:
18+
PYTHONPATH=src python3 scripts/claude_cook_runner.py recipes/your_recipe.json --dry-run --start-timeout-sec 5
19+
```
1820

19-
## Test plan
21+
## Checklist
2022

21-
(How to verify this change works as expected)
23+
- [ ] Smoke tests pass (`pytest tests/`)
24+
- [ ] Lint passes (`ruff check .`)
25+
- [ ] If runner behavior changed: tested with at least one real cook
26+
- [ ] If new feature: docs updated (`docs/`, `SETUP.md`, `CONTRIBUTING.md`, or `README.md`)
27+
- [ ] If new recipe: validated against `docs/20-recipe-schema.md`
28+
- [ ] If notification channel added: opt-in by default (not enabled in default `channels`)
29+
- [ ] `CHANGELOG.md` updated under `[Unreleased]`
2230

23-
## AI-assistance disclosure
31+
## Telemetry (optional)
2432

25-
(If parts of this PR were AI-generated, briefly mention. We're not against AI-assisted
26-
work — we just like knowing for context. Example: "Initial draft generated by Claude
27-
Code, manually reviewed + cooked with on my Dome 2.")
33+
If your change affected a real cook, attach the `runs/<file>.summary.json` (scrubbed
34+
of `cookUuid` and `deviceId`).

.github/workflows/ci.yml

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,56 +10,54 @@ jobs:
1010
test:
1111
runs-on: ubuntu-latest
1212
strategy:
13-
fail-fast: false
1413
matrix:
15-
python-version: ["3.9", "3.10", "3.11", "3.12"]
14+
python-version: ["3.10", "3.11", "3.12"]
15+
fail-fast: false
16+
1617
steps:
1718
- uses: actions/checkout@v4
19+
1820
- name: Set up Python ${{ matrix.python-version }}
1921
uses: actions/setup-python@v5
2022
with:
2123
python-version: ${{ matrix.python-version }}
22-
- name: Install
24+
25+
- name: Install package + dev extras
2326
run: |
2427
python -m pip install --upgrade pip
2528
pip install -e ".[dev]"
26-
- name: Lint
29+
30+
- name: Lint with ruff
2731
run: ruff check .
28-
- name: Compile-check
29-
run: python -m py_compile src/cliron_chef/*.py scripts/*.py examples/*.py
30-
- name: Test
31-
run: pytest -v
32-
- name: Smoke (CLI --help)
33-
run: python -m cliron_chef --help
3432

35-
validate-recipes:
36-
runs-on: ubuntu-latest
37-
steps:
38-
- uses: actions/checkout@v4
39-
- uses: actions/setup-python@v5
40-
with:
41-
python-version: "3.11"
42-
- run: pip install -e .
43-
- name: Parse all recipes
33+
- name: Validate recipe JSON files
4434
run: |
45-
set -e
46-
for f in recipes/*.json; do
47-
[ "$(basename $f)" = "schema.json" ] && continue
48-
echo "Validating: $f"
49-
python3 -c "import json; json.load(open('$f'))"
50-
done
51-
echo "All recipes are valid JSON ✓"
52-
- name: Validate every recipe via CLI
35+
python -c "
36+
import json, sys
37+
from pathlib import Path
38+
errs = []
39+
for p in sorted(Path('recipes').glob('*.json')):
40+
try:
41+
json.load(p.open())
42+
print(f'OK {p}')
43+
except json.JSONDecodeError as e:
44+
errs.append(f'{p}: {e}')
45+
print(f'FAIL {p}: {e}')
46+
sys.exit(1 if errs else 0)
47+
"
48+
49+
- name: Smoke tests
50+
run: pytest tests/ -v
51+
52+
- name: Runner --help (sanity)
5353
run: |
54-
set -e
55-
for f in recipes/*.json; do
56-
[ "$(basename $f)" = "schema.json" ] && continue
57-
python -m cliron_chef recipes validate "$f"
58-
done
54+
PYTHONPATH=src python scripts/claude_cook_runner.py --help > /dev/null
55+
PYTHONPATH=src python scripts/analyze_run.py --help > /dev/null
5956
60-
leak-scan:
61-
runs-on: ubuntu-latest
62-
steps:
63-
- uses: actions/checkout@v4
64-
- name: Scan for personal info, secrets, and stale identifiers
65-
run: bash scripts/leak_scan.sh
57+
- name: Recipe dry-run (no devices required if device IDs are null and devices.json missing — should error cleanly)
58+
run: |
59+
# Without devices.json, the runner should exit cleanly with a helpful message
60+
for recipe in recipes/claude_*_v3.json; do
61+
echo "--- testing: $recipe"
62+
PYTHONPATH=src python scripts/claude_cook_runner.py "$recipe" --dry-run --start-timeout-sec 1 2>&1 | head -5 || true
63+
done

0 commit comments

Comments
 (0)