hottop-validation — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited hottop-validation (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Use this skill for Hottop-facing work and release-readiness review.
HottopRoasterDriver boundary.RoasterDriver boundarywhile preserving the one-session store semantics and fail-closed behavior.
coffee-roaster-mcp hottop-validate.paths, use docs/install-and-hardware-setup.md.
Complete these gates in order before any Hottop hardware session.
docs/state/epics/coffee-roaster-mcp-v0.1.md.tests/test_drivers.py and tests/test_hottop_validation.py.src/coffee_roaster_mcp/drivers.py.roaster.driver: hottop_kn8828b_2k_plus.--include-drop is irreversible for loaded beans.--include-drop only when the roaster is ready for an actual drop check.--include-emergency-stop only when the operator is ready to verify the safety action.Confirm these source artifacts before running hardware:
src/coffee_roaster_mcp/drivers.py: HottopRoasterDriver, command-loop lifecycle, command state, packet build/parse, status read, temperature normalization, and emergency stop.src/coffee_roaster_mcp/hottop_validation.py: guarded hottop-validate runner, JSON evidence shape, skipped-step behavior, and release-label decision.src/coffee_roaster_mcp/cli.py: hottop-validate CLI options and acknowledgement flag.docs/state/epics/coffee-roaster-mcp-v0.1.md: E3-S4 through E3-S9 status and validation notes.Stop the validation session immediately if any of these occur:
Abort procedure:
Use a local config file with an explicit Hottop driver and serial port:
roaster:
driver: hottop_kn8828b_2k_plus
port: /dev/cu.usbserial-XXXX
baudrate: 115200
temperature_unit: auto
command_interval_seconds: 0.3Run the non-destructive portion first:
coffee-roaster-mcp hottop-validate \
--config coffee-roaster-mcp.yaml \
--output docs/validation/hottop-e3-s9-non-destructive.json \
--i-understand-this-controls-hardwareRun the full validation only when the roaster is supervised and ready for drop and emergency-stop checks:
coffee-roaster-mcp hottop-validate \
--config coffee-roaster-mcp.yaml \
--output docs/validation/hottop-e3-s9-full.json \
--i-understand-this-controls-hardware \
--include-drop \
--include-emergency-stopDo not commit generated validation JSON unless the file is sanitized to remove sensitive data and formatted for long-term storage. Never commit raw serial captures.
Use this table with the JSON evidence from hottop-validate plus direct operator observation.
| Area | Pass | Needs Review Or Skipped | Fail |
|---|---|---|---|
| Connection and cleanup | connect is passed, raw.command_loop_running is true while connected, command writes increase, and disconnect exits cleanly. | Not applicable. | Serial open fails, writes do not occur after connection, command-loop errors increase, or disconnect reports the loop did not stop. |
| Startup safe state | First connected state shows heat 0, fan 0 unless cooling is commanded, cooling false, solenoid false, and drum false before heat is requested. | Not applicable. | Heat, cooling, drop/solenoid, or unexpected fan behavior starts without an explicit validation step. |
| Packet parsing and telemetry | stable_telemetry is passed, raw.status_packet_count is greater than zero, bean_temp_c and env_temp_c are plausible, and raw.status_read_error_count is zero. | stable_telemetry is needs_review, startup zero readings are ignored, or temperatures are missing while the command loop otherwise runs. | Packet counts never increase, checksum/read errors repeat, command echoes are parsed as telemetry, or normalized temperatures are physically impossible. |
| Temperature units | Configured temperature_unit matches the run plan, raw.resolved_temperature_unit is stable after plausible telemetry, and Celsius-normalized values are plausible. | auto changes resolved unit during warmup or after ignored packets. | Fahrenheit readings are exposed as Celsius, Celsius readings are double-converted, or unit resolution remains absent after stable telemetry. |
| Heat | Heat step sets heat_level_percent to the requested conservative value, drum is on when heat is nonzero, then heat_off returns heat to 0. | Not applicable. | Heat remains on after heat_off, heat changes without command, or drum behavior contradicts the heat command. |
| Fan | Fan step sets fan_level_percent to the requested value and the Hottop main fan responds consistently. | Not applicable. | Fan value is outside the requested range, fan does not respond, or fan remains high after cooling stop except as part of emergency stop. |
| Drop | In a full run, drop is passed, heat is 0, drum is off, solenoid/drop path is active, cooling is on, and fan is high. | drop is skipped in a non-destructive run. This blocks hardware-ready release approval. | Drop is triggered unintentionally, fails to trigger when requested, or does not force heat off and cooling/fan on. |
| Cooling stop | cooling_start turns cooling on with high fan, and cooling_stop clears cooling, solenoid/drop path, and fan. | Not applicable. | Cooling does not start, does not stop, or leaves drop/solenoid state active. |
| Emergency stop | In a full run, emergency stop sets heat 0, drum off, solenoid closed, cooling on, fan high, and evidence preserves diagnostic state. | Emergency stop is skipped in a non-destructive run. This blocks hardware-ready release approval. | Emergency stop does not force heat off, does not leave cooling/fan in a safe state, or loses diagnostic evidence. |
ls /dev/cu.* before and after plugging in the USB adapter.roaster.port.raw.command_loop_running, raw.command_loop_iterations, raw.command_send_attempts, raw.command_write_count, raw.command_loop_error_count, and raw.last_command_write_size.HottopRoasterDriver._send_command_frame and disconnect/write review notes in the active epic before changing code.raw.status_packet_count, raw.ignored_temperature_packet_count, raw.status_read_error_count, raw.raw_bean_temperature, raw.raw_env_temperature, and raw.resolved_temperature_unit.temperature_unit.Use this structure in issue comments, PR descriptions, or durable validation notes:
## Hottop Validation Report
- Date/time:
- Operator:
- Roaster model:
- Firmware/context if known:
- Serial port:
- Baudrate:
- Configured temperature unit:
- Command interval seconds:
- Command:
- Evidence file:
- Non-destructive run or full run:
## Source State
- Branch/commit:
- E3-S4 through E3-S8 marked complete in epic state: yes/no
- Required tests before hardware run:
- pytest:
- ruff check:
- ruff format --check:
- pyright:
## Results
- Connection and cleanup: pass/fail/needs review
- Startup safe state: pass/fail/needs review
- Packet parsing and telemetry: pass/fail/needs review
- Temperature units: pass/fail/needs review
- Heat: pass/fail/needs review
- Fan: pass/fail/needs review
- Drop: pass/fail/skipped
- Cooling stop: pass/fail/needs review
- Emergency stop: pass/fail/skipped
## Observations
- Observed temperatures:
- Observed command counters:
- Physical roaster behavior:
- Deviations:
- Abort conditions encountered:
## Decision
- Hardware-ready release label allowed: yes/no
- Follow-up fixes required:
- Final driver decision:For every manual validation run, record:
coffee-first-crack-detection.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.