{
  "markdown": "# RoastPilot\n\n<!-- mcp-name: io.github.syamaner/coffee-roaster-mcp -->\n\nRoastPilot is an MCP server for coffee-roaster telemetry and controlled\nactuation.\n\nThe package name is `coffee-roaster-mcp`. It is published on production PyPI\nand listed in the MCP Registry as\n`io.github.syamaner/coffee-roaster-mcp`.\n\nRoastPilot provides one local MCP runtime for roaster control, telemetry, first-crack detection integration, roast metrics, and log export.\n\n## Status\n\n✅ **v0.1 component scope complete, published on PyPI and in the MCP Registry,\nand exercised in supervised agent-controlled hardware roasts through\n2026-08-16.**\n\nThe latest integrated evidence is two completed Hottop roasts on 2026-08-16.\nTogether they exercised live telemetry and control, automatic T0, first-crack\nhandling, post-first-crack decisions, safety evaluation, advisor-triggered\ndrop, operator-controlled cooling completion, ambient sensing, log export, and\npaired-microphone capture. The agent ledger recorded 19 successful advisor\ndecisions, each linked to an `allow` safety evaluation; both advisor-proposed\ndrops were executed, with no failed command events or safety alerts in either\ncompleted run.\n\nThose roasts used the pinned `coffee-roaster-mcp` 0.1.13 runtime. Versions\n0.1.14-0.1.16 were metadata/docs releases; the selected `0.2.0` release\ncandidate carries the MCP-owned NumPy/SciPy, Torch/Torchaudio/Transformers-free\nONNX feature-extraction path and additive first-crack observability. D190 was\nMCP-only component characterisation with artificial music: zero observed\noverflow does not establish headroom for other conditions or prove the non-zero\nallowance necessary; sanitised review did not rehash private evidence, and it\nis not detector, live-roast, full-stack, or combined acceptance. D192 full-stack\n30+30 and separate supervised >=20-minute live roast remain outstanding.\nPublication remains operator-only after merge, a successful release-workflow\ndry run, and protected-environment approval. See the\n[2026-08-16 agent-roast validation report](https://github.com/syamaner/coffee-roaster-mcp/blob/main/docs/session-summaries/2026-08-16-agent-roast-validation.md)\nfor the authority-ledger, session, ambient, and capture evidence, including its\nprovenance limits.\n\nThe original published-package baseline remains the 2026-06-07 validation:\n\nThe published `coffee-roaster-mcp` 0.1.3 package, installed through the MCP\nRegistry `uvx` path into the Warp agent, ran two complete supervised roasts\non a connected Hottop KN-8828B-2K+ with zero serial, control, or telemetry\nfaults:\n\n| Validated | Result |\n| --- | --- |\n| Install path | Published PyPI 0.1.3 via `uvx` in a real MCP client (Warp) |\n| Hardware control | Live heat/fan/drop/cooling through the driver-backed MCP tools |\n| Automatic T0 | `beans_added` detected from the bean-temperature charge drop (`source: auto_t0`) |\n| First-crack detection | Audio-detected live by the released INT8 ONNX model on a real USB microphone — sliding-window confirmation, confidence 0.907 over the 0.6 threshold with 5/5 positive windows |\n| Safety actions | Same-day guarded `hottop-validate` run passed 8/8 steps, including drop and emergency stop |\n| Log export | `roast.jsonl`, `roast.csv`, and `summary.json` with full first-crack and auto-T0 metadata |\n\nEvidence:\n\n- [Roast-day validation report](docs/session-summaries/2026-06-07-roast-day-validation.md)\n  (formal pass/fail analysis, both roasts)\n- [Roast #1 test summary](docs/session-summaries/2026-06-07-live-roast-test-summary.md)\n  and [Roast #2 auto-validation summary](docs/session-summaries/2026-06-07-roast-2-auto-validation.md)\n  (timelines, metrics, screenshots)\n- [Committed artifacts](docs/validation/2026-06-07-live-roast/)\n  (roast logs, guarded-validation JSON, transcripts, screenshots, checksums)\n\nSee the [v0.1 overall plan](docs/plans/coffee-roaster-mcp-v0.1-overall-plan.md)\nand the [project state registry](docs/state/registry.md) for the plan and\nstate history.\n\n## Related Project Artifacts\n\n- Current architecture article: [The Architecture: The Agent-Spec Driven ML Development With Warp](https://dev.to/syamaner/part-1-the-architecture-the-agent-spec-driven-ml-development-with-warpoz-3al6)\n- Original prototype intro: [Training a Neural Network to Detect Coffee First Crack from Audio](https://dev.to/syamaner/part-1-training-a-neural-network-to-detect-coffee-first-crack-from-audio-an-agentic-development-1jei)\n- Original prototype MCP post: [Building MCP Servers to Control a Home Coffee Roaster](https://dev.to/syamaner/part-2-building-mcp-servers-to-control-a-home-coffee-roaster-an-agentic-development-journey-with-58ik)\n- First-crack model: [syamaner/coffee-first-crack-detection](https://huggingface.co/syamaner/coffee-first-crack-detection)\n- First-crack dataset: [syamaner/coffee-first-crack-audio](https://huggingface.co/datasets/syamaner/coffee-first-crack-audio)\n- First-crack demo: [Coffee First-Crack Detection Space](https://huggingface.co/spaces/syamaner/coffee-first-crack-detection)\n\nThe current `coffee-roaster-mcp` package is a consolidated rebuild of the\nprototype with the lessons learned folded into one deterministic local MCP\nserver, conservative hardware boundaries, and releaseable package metadata.\n\n## What RoastPilot Is\n\nRoastPilot is the human-facing product name. `coffee-roaster-mcp` is the\ninfrastructure and packaging name used for the repository, Python package, and\npublished distribution.\n\nThe v0.1 scope is one local stdio MCP server that owns:\n\n- roaster control\n- roast session timing and events\n- first-crack detection integration\n- derived roast metrics\n- roast log export\n\nAll MCP-component v0.1 epics are complete and live-validated. The package\nscaffold, config loading, local development commands, pull-request CI, stdio\nMCP entrypoint, roast-session tool surface, Hottop driver, audio first-crack runtime,\nautomatic T0 path, metrics/log export, release workflow, and MCP Registry\nmetadata are in place, and the full end-to-end path has been verified on\nconnected Hottop hardware with a real microphone through the published\npackage (E7-S6).\n\n## Install\n\nFor local development today:\n\n```bash\npython3.11 -m venv .venv\nsource .venv/bin/activate\npython -m pip install --upgrade pip\npython -m pip install -e . --group dev\n```\n\nThe user-facing install target is the published `coffee-roaster-mcp` package:\n\n```bash\npython -m pip install coffee-roaster-mcp\n```\n\nFor operator setup, including mock install, Hottop configuration, Hugging Face\nmodel configuration, offline model paths, and log output paths, see the\n[install and hardware setup guide](docs/install-and-hardware-setup.md).\n\n## Local Development\n\n### Setup\n\nUse the commands in the [Install](#install) section, then continue with the checks below.\n\n### Test\n\n```bash\npython -m pytest\n```\n\n### Coverage\n\n```bash\npython -m pytest --cov=coffee_roaster_mcp --cov-report=term-missing:skip-covered --cov-report=html:htmlcov --cov-report=json:coverage.json\npython .github/scripts/write_coverage_summary.py coverage.json\n```\n\nPull-request CI publishes a Markdown coverage summary in the `Checks` job summary and uploads `html-coverage-report` as a workflow artifact for file-by-file drill-down.\n\n### Lint\n\n```bash\npython -m ruff check .\n```\n\n### Format Check\n\n```bash\npython -m ruff format --check .\n```\n\n### Typecheck\n\n```bash\npython -m pyright\n```\n\n### CLI Smoke\n\n```bash\ncoffee-roaster-mcp --help\ncoffee-roaster-mcp --version\n```\n\n### Hardware And Audio Checks\n\nTwo explicit pre-roast checks cover the configured microphone and independent\nmulti-device recording paths without starting a roast:\n\n```bash\ncoffee-roaster-mcp mic-check --config coffee-roaster-mcp.yaml\ncoffee-roaster-mcp record-check --config coffee-roaster-mcp.yaml\n```\n\n`mic-check` reports whether the selected input contains a real signal and can\nwrite a small JSON evidence record. `record-check` captures each configured\nrecording device into a temporary or explicit output directory and reports the\nresult. The resulting audio may contain ambient conversation and must not be\ncommitted.\n\n## Local Mock Run\n\nThe default local path is intentionally mock-safe:\n\n- default roaster driver: `mock`\n- default first-crack mode: `disabled`\n- no roaster hardware required\n- no microphone required\n- no model download required\n\nRoastPilot now provides a local stdio MCP server entrypoint with a mock-safe\nroast-session tool surface. The default configuration lets an MCP client start\na roast, adjust controls, read current device and session state, record explicit\noverride events, drop beans into cooling, and export snapshot logs without\nroaster hardware, microphone input, model files, or network access.\n\n### Start The Local MCP Server\n\n```bash\ncoffee-roaster-mcp serve\n```\n\nThe current MCP tool surface includes:\n\n- `get_server_info`\n- `get_runtime_config`\n- `start_roast_session`\n- `get_roast_state`\n- `set_heat`\n- `set_fan`\n- `mark_beans_added`\n- `mark_first_crack`\n- `drop_beans`\n- `start_cooling`\n- `stop_cooling`\n- `export_roast_log`\n- `emergency_stop`\n- `set_recording_metadata`\n\n`export_roast_log` writes `roast.jsonl`, `roast.csv`, and `summary.json` files\nfor the current in-process session. Runtime events and sampled telemetry are\nalso appended to `roast.jsonl` during the roast.\n\nBefore a recorded roast, `set_recording_metadata` stores the bean-origin slug\nand roast number used for capture filenames and the session sidecar. It sends\nno hardware command and does not expose a generic file-write or tool-execution\nsurface.\n\n### Operational MCP Flow\n\nThe mock-safe Claude/operator flow is:\n\n1. Call `start_roast_session` to create the one active roast session and connect\n   the configured driver.\n2. Call `set_heat` and `set_fan` as operational decisions require. These tools\n   go through the configured `RoasterDriver` boundary; the default mock driver\n   stays local and deterministic.\n3. Call `get_roast_state` to read both the authoritative session state and the\n   current configured-device state. The response includes driver id, connected\n   status, bean/environment temperatures when available, heat/fan levels,\n   cooling state, safe raw diagnostics, T0 status, first-crack status, and\n   lifecycle timestamps for beans added, first crack, bean drop, cooling\n   started, and cooling stopped.\n4. Use `drop_beans` as the normal drop command. For the mock path and the\n   Hottop compound drop path, this records `beans_dropped`, records\n   `cooling_started` when the driver reports cooling active, turns heat off,\n   sets fan to `100%`, and enters the cooling phase.\n5. Use `stop_cooling` when cooling is complete. `start_cooling` remains\n   available as an explicit advanced/manual recovery tool, not as the normal\n   roast flow after `drop_beans`.\n\n`mark_beans_added` and `mark_first_crack` are explicit override tools. They are\nkept available for operator recovery and controlled manual runs. The primary\nautomatic runtime paths are internal: automatic T0 detection can record\n`beans_added` when `session.auto_t0_detection_enabled` is enabled, and\naudio-mode first-crack confirmation is owned by the session-owned first-crack\nruntime when `first_crack.mode: audio` is deliberately configured.\n\nAutomatic T0 is disabled by default. When enabled, `get_roast_state` reads the\nconfigured driver, tracks the max preheat bean temperature before T0, and\nrecords `beans_added` when the current bean temperature drops from that max by\n`session.auto_t0_drop_threshold_c`. `get_roast_state.t0_status` exposes the\nconfigured threshold, tracked charge temperature, current drop, and detected\nbean temperature when automatic T0 records the event.\n\nOptional ambient sensing and roast recording are also disabled by default.\nWhen enabled deliberately, `get_roast_state` exposes fail-soft Yoctopuce\nambient readings and live microphone/overflow status, while the recording\nruntime can capture one or more independent microphone streams into a\nsession-scoped directory. Recording uses the audio first-crack capture runtime;\nit therefore requires `first_crack.mode: audio`. A live roast recording also\nrequires `audio.source: microphone`, with `recording.enabled` and\n`recording.autocapture` both set to `true`. When `recording.devices` is set,\nits first entry must match `audio.input_device`: that stream is captured by the\ndetector and teed into the first WAV rather than opened independently. Any\nadditional entries are opened as independent recording streams. These paths\nhave been exercised together during the August 2026 hardware roasts described\nin the current validation report.\n\n`get_roast_state.first_crack_status.status` is one of:\n\n- `disabled`: first-crack detection is disabled and no first-crack event exists.\n- `manual`: manual first-crack mode is configured and the override tool is\n  available.\n- `pending`: audio detection is configured and waiting for a confirmed event.\n- `detected`: the authoritative session timeline has a first-crack event.\n- `faulted`: the detector runtime or session has faulted.\n- `unavailable`: configuration, artifacts, audio capture, or manual-override\n  settings make first-crack detection unavailable.\n\n### Mock-Safe Bootstrap Smoke\n\nUse this mock-safe bootstrap smoke to confirm the default local path stays hardware-free and model-free from a guaranteed-empty temporary directory:\n\n```bash\npython -c \"import os, tempfile; from coffee_roaster_mcp.config import load_config; tmp = tempfile.TemporaryDirectory(); os.chdir(tmp.name); c = load_config(environ={}); print(c.roaster.driver, c.first_crack.mode, c.first_crack.precision); tmp.cleanup()\"\n```\n\nExpected output:\n\n```text\nmock disabled int8\n```\n\nThis confirms the bootstrap defaults are still aligned with the mock vertical-slice plan.\n\n## Hottop Configuration And Validation\n\nThe concise setup path is in the\n[install and hardware setup guide](docs/install-and-hardware-setup.md); this\nsection summarizes the guarded validation workflow.\n\nHottop support lives behind the `RoasterDriver` abstraction. The driver has\nlifecycle, command-loop, packet, control-state, and temperature-unit support,\nand has passed the full guarded validation (including drop and emergency\nstop) on connected hardware — most recently on 2026-06-07 against the\npublished 0.1.3 PyPI package, followed by two complete supervised live\nroasts through the MCP tool surface. Guarded manual validation remains the\nrequired procedure before operating any new hardware setup.\n\nConfiguration lives in `coffee-roaster-mcp.yaml`. Keep local development on the mock driver unless you are intentionally validating connected Hottop hardware:\n\n```yaml\nroaster:\n  driver: mock\n  port: null\n  baudrate: 115200\n  temperature_unit: celsius\n  command_interval_seconds: 0.3\n```\n\nFor guarded hardware validation, switch `driver` to `hottop_kn8828b_2k_plus`, set the serial port explicitly, and run the validation harness with an evidence output path:\n\n```bash\ncoffee-roaster-mcp hottop-validate \\\n  --config coffee-roaster-mcp.yaml \\\n  --output docs/validation/hottop-e3-s9-non-destructive.json \\\n  --i-understand-this-controls-hardware\n```\n\nThe irreversible and safety-action checks are opt-in:\n\n```bash\ncoffee-roaster-mcp hottop-validate \\\n  --config coffee-roaster-mcp.yaml \\\n  --output docs/validation/hottop-e3-s9-full.json \\\n  --i-understand-this-controls-hardware \\\n  --include-drop \\\n  --include-emergency-stop\n```\n\nHardware safety matters here: command-loop cadence, packet handling,\ntemperature units, drop behavior, cooling behavior, emergency stop, and cleanup\nmust be validated on a supervised roaster before the Hottop path is treated as\nrelease-ready. The current MCP roast-session tools call the configured driver\nboundary, so keep normal development on the mock driver unless a guarded Hottop\nvalidation run is explicitly intended.\n\nOptional live Hottop MCP validation is gated manual work. Run it only with a\nsupervised roaster, an explicit `hottop_kn8828b_2k_plus` config, a known serial\nport, and a clear stop plan. Expected evidence for a pass is: the MCP client can\nstart one session, set heat and fan, read connected device state with plausible\ntemperatures, call `drop_beans` to trigger drop plus cooling, read\n`beans_dropped` and `cooling_started` timestamps from `get_roast_state`, stop\ncooling when the roaster reports cooling off, and preserve any failure as a\nfault event. Any serial, telemetry, command-loop, or safety uncertainty should\nbe treated as a failed validation and should not be required by normal CI.\n\n## Configuration\n\nRoastPilot loads configuration from `coffee-roaster-mcp.yaml` in the current directory by default. If the file is absent, mock-safe defaults are used so local development does not require roaster hardware, audio hardware, or model downloads.\n\nSee the [install and hardware setup guide](docs/install-and-hardware-setup.md)\nfor setup-focused examples covering\nmock install, Hottop configuration, Hugging Face model configuration, offline\nmodel paths, and log output paths.\n\n```yaml\ntransport:\n  type: stdio\n\nroaster:\n  driver: mock\n  port: null\n  baudrate: 115200\n  temperature_unit: celsius\n  command_interval_seconds: 0.3\n\nfirst_crack:\n  mode: disabled\n  repo_id: syamaner/coffee-first-crack-detection\n  revision: null\n  precision: int8\n  local_model_dir: null\n  onnx_threads: 2\n  confidence_threshold: 0.9\n  min_positive_windows: 1\n  confirmation_window_seconds: 20.0\n  allow_manual_override: true\n\naudio:\n  source: microphone\n  input_device: null\n  sample_rate: 16000\n  wav_path: null\n  replay_mode: realtime\n  window_seconds: 1.0\n  overlap: 0.0\n  hop_seconds: null\n\nambient:\n  mode: disabled\n  device: null\n  poll_interval_seconds: 30.0\n\nrecording:\n  # Recording runs through the audio first-crack capture runtime.\n  # Live capture also requires first_crack.mode: audio and audio.source: microphone.\n  enabled: false\n  autocapture: false\n  export_location: null\n  sample_rate: null\n  # When set, the first entry must match audio.input_device.\n  devices: null\n\nlogging:\n  log_dir: ./logs\n  sample_interval_seconds: 5.0\n  export_formats:\n    - jsonl\n    - csv\n    - summary\n\nsession:\n  auto_t0_detection_enabled: false\n  auto_t0_drop_threshold_c: 25.0\n  ror_window_seconds: 60\n  ror_min_sample_seconds: 10\n```\n\nSupported environment overrides:\n\n- `COFFEE_ROASTER_MCP_CONFIG`\n- `COFFEE_ROASTER_DRIVER`\n- `COFFEE_ROASTER_PORT`\n- `COFFEE_ROASTER_TEMP_UNIT`\n- `COFFEE_FIRST_CRACK_MODE`\n- `COFFEE_FIRST_CRACK_REPO_ID`\n- `COFFEE_FIRST_CRACK_REVISION`\n- `COFFEE_FIRST_CRACK_PRECISION`\n- `COFFEE_FIRST_CRACK_LOCAL_MODEL_DIR`\n- `COFFEE_FIRST_CRACK_ONNX_THREADS`\n- `COFFEE_FIRST_CRACK_CONFIDENCE_THRESHOLD`\n- `COFFEE_FIRST_CRACK_MIN_POSITIVE_WINDOWS`\n- `COFFEE_FIRST_CRACK_CONFIRMATION_WINDOW_SECONDS`\n- `COFFEE_AUDIO_SOURCE`\n- `COFFEE_AUDIO_INPUT_DEVICE`\n- `COFFEE_AUDIO_SAMPLE_RATE`\n- `COFFEE_AUDIO_WAV_PATH`\n- `COFFEE_AUDIO_REPLAY_MODE`\n- `COFFEE_AUDIO_WINDOW_SECONDS`\n- `COFFEE_AUDIO_OVERLAP`\n- `COFFEE_AUDIO_HOP_SECONDS`\n- `COFFEE_AMBIENT_MODE`\n- `COFFEE_AMBIENT_DEVICE`\n- `COFFEE_AMBIENT_POLL_INTERVAL_SECONDS`\n- `COFFEE_RECORDING_ENABLED`\n- `COFFEE_RECORDING_AUTOCAPTURE`\n- `COFFEE_RECORDING_EXPORT_LOCATION`\n- `COFFEE_RECORDING_SAMPLE_RATE`\n- `COFFEE_RECORDING_DEVICES`\n- `COFFEE_ROAST_LOG_DIR`\n- `COFFEE_AUTO_T0_DROP_THRESHOLD_C`\n- `HF_HOME`\n\n`audio.source` can be `microphone` or `wav`. Microphone capture uses a\nPortAudio-backed `sounddevice` stream and keeps the configured device identifier\nbehind the audio-input boundary for macOS, Linux, and Raspberry Pi hosts. WAV\nreplay uses PCM `.wav` files, converts channels to the same mono float sample\ncontract as microphone capture, and requires the file sample rate to match\n`audio.sample_rate`. WAV replay defaults to the background `realtime` capture\npipeline. For local labelled-fixture validation, set\n`audio.replay_mode: detector_paced` and the detector-compatible\n`audio.window_seconds` plus either `audio.overlap` or `audio.hop_seconds` so\neach complete WAV window is processed as soon as the detector/runtime is ready,\nwithout wall-clock sleeps and without normal queue drops.\n\nThe repository normally does not commit audio. The only current exception is\nthe small derived E7-S5a labelled replay fixture under `tests/fixtures/audio/`,\nwhich is trimmed, resampled, retimestamped, and documented with a manifest.\nRaw recordings, broad training/evaluation audio, model artifacts, roast logs,\nand serial captures remain excluded from git.\n\nThe released-model labelled replay validation is opt-in/local, not part of the\ndefault CI suite:\n\n```bash\n./.venv/bin/python scripts/validate_first_crack_wav_replay.py\n```\n\nThat script starts the stdio MCP server on the mock roaster with pinned INT8\nHugging Face artifacts and detector-paced WAV replay, then uses public MCP\ntools to validate first-crack detection against the fixture labels and export\n`roast.jsonl`, `roast.csv`, and `summary.json`.\n\nFor microphone capture, `audio.input_device: null` uses the system default input\ndevice. To pin a specific microphone, set `audio.input_device` to a\nPortAudio-resolvable device name or platform device identifier. On Linux and\nRaspberry Pi, use `arecord -l` and `arecord -L` to inspect ALSA devices; values\nsuch as `plughw:1,0` are often more forgiving than raw `hw:1,0` because ALSA can\nperform format conversion. On macOS, use the system sound settings or a\n`sounddevice` device listing during manual validation. Real microphone checks\nare optional and should be run only when `first_crack.mode: audio` and\n`audio.source: microphone` are deliberately configured.\n\nOptional real microphone validation is gated manual work. Before running it,\nconfigure released Hugging Face ONNX artifacts or a validated\n`first_crack.local_model_dir`, select the intended microphone, and confirm the\nMCP process can start without artifact or audio-capture errors. Expected\nevidence for a pass is: `get_roast_state.first_crack_status` moves from\n`pending` to `detected` during a supervised roast or controlled replay, the\nrecorded `first_crack_detected` event includes detector metadata, and normal\nroast controls continue to work. Missing artifacts, unavailable audio devices,\nand detector failures should surface as `unavailable` or `faulted` status and\nremain outside normal CI.\n\n`HF_HOME` is consumed by Hugging Face tooling directly rather than copied into the RoastPilot config object.\n\n## Hugging Face Model Boundary\n\nThis repository does not train, export, sync, or publish first-crack models.\n\nThe `coffee-first-crack-detection` repository remains the source of truth for:\n\n- model training\n- ONNX export\n- Hugging Face artifact publishing\n- model cards\n- dataset cards\n\nRoastPilot only consumes released artifacts from `syamaner/coffee-first-crack-detection`. The runtime boundary for this repo is inference-time configuration and model selection, not model lifecycle management.\n\nCurrent first-crack defaults are kept safe for local development:\n\n- `mode: disabled`\n- `precision: int8`\n- `repo_id: syamaner/coffee-first-crack-detection`\n\nThat default keeps local setup free from Hugging Face network access until\naudio mode is deliberately configured.\nWhen `first_crack.mode: audio` is deliberately configured, RoastPilot consumes\nthe released ONNX artifacts with ONNX Runtime and the released AST preprocessor\nconfig through the MCP-owned NumPy/SciPy `MelFrontend`; model training, export, and Hub\npublishing remain outside this repository.\n\nIn audio mode, starting a roast session prepares the configured audio capture\npipeline and released-artifact detector runtime. Detector windows are processed\nonly after T0 is recorded and the active session is in `roasting`. Confirmed\ndetector output records `first_crack_detected` once through the authoritative\nsession timeline. The runtime stops when first crack is recorded automatically\nor through the explicit manual override, and also stops on drop, cooling\ncompletion, emergency stop, and process shutdown. Missing artifacts,\nunavailable audio capture, and detector errors are surfaced through\n`get_roast_state.first_crack_status` as `unavailable` or `faulted` rather than\ncrashing normal roast controls. Disabled and manual first-crack modes do not\nstart audio capture or detector runtime.\n\n## Log Export\n\nRoastPilot currently supports snapshot export through `export_roast_log` for\nthe active in-process session.\n\nCurrent export files:\n\n- `roast.jsonl` with append-only event and sampled telemetry rows during the\n  roast\n- `roast.csv` with telemetry and event rows using the planned CSV columns for\n  timestamps, elapsed seconds, phase, temperatures, controls, event flags,\n  development percent, RoR/delta metrics, and first-crack model metadata\n- `summary.json` with session timestamps, total roast seconds, development\n  metrics, roaster driver, and first-crack model metadata\n- output under `logs/roasts/{session_id}/`\n\nCross-format log schema completeness tests are in place. The June 2026\npublished-package baseline and August 2026 integrated agent-roast report record\nthe current live-validation boundary; new hardware configurations still require\ntheir own supervised validation.\n",
  "bytes": 25089,
  "sha": "5ad3ce2e986811c591c019edcc8bf0075cf7fa61c99decf661eccd7171e632d7",
  "repo_slug": "syamaner/coffee-roaster-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_syamaner_coffee_roaster_mcp_6dfc998f/readme"
}