CtrlK
BlogDocsLog inGet started
Tessl Logo

jbaruch/hubitat-dev

Context for developing and debugging Hubitat Elevation apps, drivers, and hub environment — sandbox constraints, lifecycle idioms, capability contracts, plus grounded deploy/log-tail/lint mechanisms.

81

Quality

94%

Does it follow best practices?

Impact

27%

Average score across 2 eval scenarios

SecuritybySnyk

Advisory

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-1/

{
  "context": "Grades ONLY the two facts that discriminate plugin knowledge from baseline competence — the exact FanControl speed enum and the supportedFanSpeeds attribute. The universal-competence checks (declaring FanControl, implementing setSpeed/cycleSpeed) are deliberately NOT scored: a baseline floor model already gets those ~100%, so including them inflates the baseline and masks lift (measured directly — declares_fancontrol and setSpeed both scored 100% baseline). The plugin's capabilities.json/driver-lifecycle rule prescribe the speed enum [\"low\",\"medium-low\",\"medium\",\"medium-high\",\"high\",\"on\",\"off\",\"auto\"] and the supportedFanSpeeds JSON attribute; baseline agents typically drop the medium-low/medium-high steps (measured: 75% on the enum) and omit supportedFanSpeeds entirely (measured: 20%). The task never names FanControl, the speed values, or supportedFanSpeeds, so these measure plugin-contributed knowledge, not reading.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "includes_medium_low_and_medium_high",
      "description": "The speed values the driver accepts/reports include BOTH \"medium-low\" AND \"medium-high\" (the non-obvious intermediate steps of the standard FanControl enum), not just low/medium/high and not invented names like slow/fast or 1/2/3. Award 55 only if both intermediate steps are present; ~28 if exactly one is present; 0 if neither appears.",
      "max_score": 55
    },
    {
      "name": "emits_supported_fan_speeds",
      "description": "The driver declares a supportedFanSpeeds attribute and actually populates it (e.g. sendEvent(name: \"supportedFanSpeeds\", value: JsonOutput.toJson([...]))) so apps can read the available speeds. Award 45 if declared AND populated; ~20 if the attribute name appears but is never set with a value; 0 if supportedFanSpeeds is absent entirely.",
      "max_score": 45
    }
  ]
}

.mcp.json

README.md

tile.json