A privacy-first, open-source home assistant
This report summarizes scanner evidence for GladysAssistant/Gladys, a JavaScript project with 3,266 GitHub stars. SynthScan examined 631,874 lines of code across 3998 source files, recording 400 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 0.9 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 369 finding(s).
Are imports declared and package/API names verified? 27 finding(s).
Are wrappers, guards, and repeated structures necessary? 227 finding(s).
Which changes need focused human review? 400 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 400 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server/utils/normalizeSupportedOptions.js | 68 | function normalizeSupportedOptions(options, { allowStringValues = false } = {}) { | CODE |
| LOW | server/utils/energyPeriod.js | 47 | function parseEnergyPeriodStartDay(value) { | CODE |
| LOW | server/utils/energyPeriod.js | 73 | function getEnergyPeriodStartInCalendarUnit(date, period, startDay = DEFAULT_ENERGY_PERIOD_START_DAY) { | CODE |
| LOW | server/utils/energyPeriod.js | 144 | function getPreviousEnergyPeriodStart(periodStart, period, startDay = DEFAULT_ENERGY_PERIOD_START_DAY) { | CODE |
| LOW | server/utils/deviceQueryIncludes.js | 42 | function getStandardDeviceIncludes(featuresOptions = {}) { | CODE |
| LOW | server/utils/colors.js | 168 | function getReversedGammaCorrectedValue(value) { | CODE |
| LOW | server/utils/coordinates.js | 23 | function calculateDistanceBetweenTwoPoints(lat1, lon1, lat2, lon2) { | CODE |
| LOW | server/utils/addSelector.js | 37 | function addSelectorBeforeValidateHook(item) { | CODE |
| LOW | server/cli/install_service_dependencies.js | 19 | async function installServiceDependencies() { | CODE |
| LOW | server/lib/calendar/calendar.reservedExternalId.js | 19 | function assertNotReservedExternalId(externalId) { | CODE |
| LOW | …ver/lib/calendar/calendar.findCurrentlyRunningEvent.js | 13 | async function findCurrentlyRunningEvent(calendars, calendarEventNameComparator, calendarEventName) { | CODE |
| LOW | …location/location.handleNewGatewayOwntracksLocation.js | 11 | async function handleNewGatewayOwntracksLocation(data) { | CODE |
| LOW | server/lib/energy-contract/calendar.declare.js | 39 | function validateCalendarDefinition(definition, defaultTimezone) { | CODE |
| LOW | server/lib/energy-contract/calendar.publish.js | 210 | async function requestCalendarRecalculation(key, from) { | CODE |
| LOW | …-contract/contract.getDefaultElectricMeterFeatureId.js | 14 | async function getDefaultElectricMeterFeatureId() { | CODE |
| LOW | server/lib/energy-contract/recalculation.schedule.js | 35 | async function scheduleBoundedRecalculation(states, key, from, run) { | CODE |
| LOW | server/lib/energy-contract/meter.intervals.js | 36 | function getMeterConsumptionFeature(electricMeterDeviceId) { | CODE |
| LOW | server/lib/energy-contract/tariff.tier.js | 102 | function getAccumulationPeriodDays(scope, dateString, contract) { | CODE |
| LOW | …/energy-contract/contract.requestMeterRecalculation.js | 22 | async function requestMeterRecalculation(meterDeviceId, from) { | CODE |
| LOW | server/lib/energy-contract/legacy/convertPriceRows.js | 134 | function buildConsumptionComponent(rows, contractType) { | CODE |
| LOW | …ver/lib/message/message.getPreviousQuestionsForUser.js | 37 | function isUnverifiedActionConfirmation(text) { | CODE |
| LOW | …ver/lib/message/message.getPreviousQuestionsForUser.js | 53 | function resolveAnswerForAiContext(answer, hadToolCall) { | CODE |
| LOW | …ver/lib/message/message.getPreviousQuestionsForUser.js | 75 | function buildExchangesFromMessages(messages) { | CODE |
| LOW | …ver/lib/message/message.getPreviousQuestionsForUser.js | 144 | async function getPreviousQuestionsForUser(userId) { | CODE |
| LOW | server/lib/message/message.reply.js | 18 | function shouldForwardToolCallToExternalChannel(source, messageType, sourceService) { | CODE |
| LOW | server/lib/message/message.reply.js | 32 | function formatMessageForExternalChannel(message) { | CODE |
| LOW | server/lib/system/system.detectHostPowerManagement.js | 60 | async function probeHostPowerCapabilities(system, mechanism) { | CODE |
| LOW | server/lib/system/system.detectHostPowerManagement.js | 152 | async function detectHostPowerManagement() { | CODE |
| LOW | server/lib/system/system.detectHostPowerManagement.js | 181 | async function redetectHostPowerManagement() { | CODE |
| LOW | server/lib/system/system.getGladysContainerId.js | 13 | async function getContainerIdFromCidFile() { | CODE |
| LOW | server/lib/system/system.getGladysContainerId.js | 72 | async function getContainerIdFromMountInfo() { | CODE |
| LOW | server/lib/system/system.getGladysContainerId.js | 105 | async function getValidatedContainerIdFromCidFile() { | CODE |
| LOW | server/lib/device/device.migrate.js | 356 | async function assertNoEnergyContractOverlap(sourceDeviceId, destinationDeviceId) { | CODE |
| LOW | server/lib/device/device.getDeviceFeaturesAggregates.js | 96 | async function getDeviceFeaturesAggregates( | CODE |
| LOW | server/lib/device/device.replaceHistoricalStatesFrom.js | 26 | async function replaceHistoricalStatesFrom(deviceFeatureId, from, states) { | CODE |
| LOW | …rver/lib/device/device.saveMultipleHistoricalStates.js | 26 | async function saveMultipleHistoricalStates(deviceFeatureId, states) { | CODE |
| LOW | server/lib/device/device.syncFeatureSupportedOptions.js | 33 | async function syncFeatureSupportedOptions(deviceFeature, supportedOptions, transaction) { | CODE |
| LOW | …/lib/device/device.getOldestStateFromDeviceFeatures.js | 11 | async function getOldestStateFromDeviceFeatures(featureIds) { | CODE |
| LOW | server/lib/device/device.purgeOrphanedDuckDbStates.js | 21 | async function purgeOrphanedDuckDbStates(jobId) { | CODE |
| LOW | server/lib/device/device.migrateFromSQLiteToDuckDb.js | 32 | async function migrateFromSQLiteToDuckDb(jobId, duckDbMigrationPageLimit = 40000) { | CODE |
| LOW | …/lib/device/device.getDeviceFeaturesAggregatesMulti.js | 13 | async function getDeviceFeaturesAggregatesMulti( | CODE |
| LOW | …rgy-sensor/energy-sensor.getRootElectricMeterDevice.js | 12 | function getRootElectricMeterDevice(deviceFeature) { | CODE |
| LOW | …tion/externalIntegration.createIntegrationContainer.js | 15 | async function createIntegrationContainer(service) { | CODE |
| LOW | …rnal-integration/externalIntegration.energyCalendar.js | 12 | function getDeclaredEnergyCalendars(service) { | CODE |
| LOW | …rnal-integration/externalIntegration.energyCalendar.js | 126 | async function handleEnergyCalendarRefresh(service) { | CODE |
| LOW | …-integration/externalIntegration.getCalendarAccount.js | 63 | async function getCalendarAccountForUser(selector, userId) { | CODE |
| LOW | …gration/externalIntegration.validateEnergyContracts.js | 268 | function validateEnergyContractsField(value, errors, validateMultiLanguageText) { | CODE |
| LOW | …ation/externalIntegration.notifyWebhookAvailability.js | 14 | async function notifyWebhookAvailability() { | CODE |
| LOW | …ion/externalIntegration.scheduleSubContainerRestart.js | 18 | async function scheduleSubContainerRestart(service, entry) { | CODE |
| LOW | …al-integration/externalIntegration.validateManifest.js | 230 | function isValidDockerImageReference(reference) { | CODE |
| LOW | …al-integration/externalIntegration.validateManifest.js | 255 | function validateMultiLanguageText(value, path, errors, minLength = 1, maxLength = Infinity) { | CODE |
| LOW | …al-integration/externalIntegration.validateManifest.js | 284 | function validateConfigFieldDefault(field, path, errors) { | CODE |
| LOW | …al-integration/externalIntegration.validateManifest.js | 362 | function validateSectionPortPlaceholders(value, path, declaredPortNames, errors) { | CODE |
| LOW | …al-integration/externalIntegration.validateManifest.js | 383 | function rejectPerUserSchemaPortPlaceholders(value, path, errors, schemaLabel) { | CODE |
| LOW | …al-integration/externalIntegration.validateManifest.js | 607 | function rejectWidgetSettingsPortPlaceholders(value, path, errors) { | CODE |
| LOW | …al-integration/externalIntegration.validateManifest.js | 623 | function rejectScenePortPlaceholders(value, path, errors) { | CODE |
| LOW | …al-integration/externalIntegration.validateManifest.js | 873 | function validateNetworkDiscoveryEntry(entry, index, errors) { | CODE |
| LOW | …n/externalIntegration.upsertFeatureSupportedOptions.js | 35 | async function upsertFeatureSupportedOptions(createdDevice, publishedFeatures) { | CODE |
| LOW | …l-integration/externalIntegration.energyConsumption.js | 185 | async function recalculateConsumptionCosts(service, feature, changedFrom) { | CODE |
| LOW | …ation/externalIntegration.ensureSubContainerVolumes.js | 25 | async function ensureSubContainerVolumes(service, entry) { | CODE |
| 163 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | server/test/services/homekit/lib/buildService.test.js | 2830 | expect(homekitHandler.gladys.event.emit.args.map(([, action]) => action.device_feature)).to.eql([ | CODE |
| CRITICAL | server/test/services/homekit/lib/buildService.test.js | 2838 | expect(homekitHandler.gladys.event.emit.args.map(([, action]) => action.device_feature)).to.eql(['pac-power']); | CODE |
| CRITICAL | …/services/homekit/lib/buildHeaterCoolerService.test.js | 293 | expect(homekitHandler.gladys.event.emit.args.map(([, action]) => [action.device_feature, action.value])).to.eql([ | CODE |
| CRITICAL | …/services/homekit/lib/buildHeaterCoolerService.test.js | 328 | expect(homekitHandler.gladys.event.emit.args.map(([, action]) => [action.device_feature, action.value])).to.eql([ | CODE |
| CRITICAL | …/services/homekit/lib/buildHeaterCoolerService.test.js | 675 | expect(homekitHandler.gladys.event.emit.args.map(([, action]) => [action.device_feature, action.value])).to.eql([ | CODE |
| CRITICAL | …ver/test/services/nuki/lib/mqtt/nuki.mqtt.scan.test.js | 42 | nukiHandler.mqttService.device.unsubscribe.firstCall.calledWith('homeassistant/#'); | CODE |
| CRITICAL | …ver/test/services/nuki/lib/mqtt/nuki.mqtt.scan.test.js | 44 | nukiHandler.mqttService.device.subscribe.firstCall.calledWith( | CODE |
| CRITICAL | …s/nuki/lib/mqtt/nuki.mqtt.subscribeDeviceTopic.test.js | 37 | nukiHandler.mqttService.device.subscribe.firstCall.calledWith( | CODE |
| CRITICAL⚡ | …st/services/nuki/lib/mqtt/nuki.mqtt.disconnect.test.js | 38 | nukiHandler.mqttService.device.unsubscribe.firstCall.calledWith('homeassistant/#'); | CODE |
| CRITICAL⚡ | …st/services/nuki/lib/mqtt/nuki.mqtt.disconnect.test.js | 39 | // nukiHandler.mqttService.device.unsubscribe.secondCall.calledWith('nuki/4242/#'); | COMMENT |
| CRITICAL⚡ | …st/services/nuki/lib/mqtt/nuki.mqtt.disconnect.test.js | 40 | // nukiHandler.mqttService.device.unsubscribe.thirdCall.calledWith('nuki/4343/#'); | COMMENT |
| CRITICAL | …test/services/nuki/lib/mqtt/nuki.mqtt.setValue.test.js | 40 | nukiHandler.mqttService.device.publish.firstCall.calledWith(`nuki/${topic}/${command}`, `true`); | CODE |
| CRITICAL | server/test/services/mcp/lib/buildSchemas.test.js | 621 | expect(mcpHandler.gladys.device.camera.getImagesInRoom.calledWith('room-1')).to.eq(true); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server/test/hooks.js | 61 | // and no test depends on the actual port (supertest wraps the app object). | COMMENT |
| LOW | server/test/helpers/sharedMockSandboxes.js | 1 | // Shared mock modules (files under test/ that export fakes consumed by several | COMMENT |
| LOW | server/test/helpers/db.test.js | 41 | let cleanMarkers = null; | COMMENT |
| LOW | …rver/test/services/node-red/expectedNodeRedContent.txt | 101 | COMMENT | |
| LOW | …rver/test/services/node-red/expectedNodeRedContent.txt | 361 | * This covers: | COMMENT |
| LOW | …rver/test/services/node-red/expectedNodeRedContent.txt | 581 | // webSocketNodeVerifyClient: function(info) { | COMMENT |
| LOW | …test/services/node-red/expectedOtherNodeRedContent.txt | 101 | COMMENT | |
| LOW | …test/services/node-red/expectedOtherNodeRedContent.txt | 361 | * This covers: | COMMENT |
| LOW | …test/services/node-red/expectedOtherNodeRedContent.txt | 581 | // webSocketNodeVerifyClient: function(info) { | COMMENT |
| LOW | …rver/test/services/node-red/expectedDefaultContent.txt | 101 | COMMENT | |
| LOW | …rver/test/services/node-red/expectedDefaultContent.txt | 361 | * This covers: | COMMENT |
| LOW | …rver/test/services/node-red/expectedDefaultContent.txt | 581 | // webSocketNodeVerifyClient: function(info) { | COMMENT |
| LOW | server/test/services/xiaomi/DgramMock.test.js | 21 | // file's own sandbox, so the consumers' sinon.reset() cannot clear the call | COMMENT |
| LOW | server/test/services/tuya/lib/tuya.setValue.test.js | 561 | // Guards the proxyquire configuration at the top of this file. In | COMMENT |
| LOW | server/test/services/bluetooth/BluetoothMock.test.js | 21 | COMMENT | |
| LOW | server/utils/constants.js | 421 | // availability can map onto it. | COMMENT |
| LOW | server/utils/constants.js | 441 | // reference site - verified against implementation source instead): | COMMENT |
| LOW | server/utils/constants.js | 1341 | // every grid data provider (Electricity Maps, the UK Carbon Intensity API, RTE eCO2mix...) - | COMMENT |
| LOW | server/utils/constants.js | 1361 | // measuring device: a plug-in battery's grid port, an EM clamp or a | COMMENT |
| LOW | server/utils/constants.js | 1541 | }, | COMMENT |
| LOW | server/utils/thermostatRanges.js | 121 | (a, b) => a.day_of_week - b.day_of_week || timeToMinutes(a.time) - timeToMinutes(b.time), | COMMENT |
| LOW | server/utils/thermostatConstants.js | 61 | const DEFAULT_TEMP_UNIT = 'C'; | COMMENT |
| LOW | server/utils/thermostatConstants.js | 81 | // The preset names, as they are stored in a schedule transition and used to key | COMMENT |
| LOW | server/utils/thermostatConstants.js | 101 | // only sends it the order each preset is set to (C.1.1). It drives no real | COMMENT |
| LOW | server/lib/index.js | 261 | // Polling is only started once the services are started: polling a | COMMENT |
| LOW | server/lib/index.js | 281 | } | COMMENT |
| LOW | server/lib/tts/constants.js | 1 | // Reserved id of the built-in Gladys Plus provider (dispatch to | COMMENT |
| LOW | server/lib/device/device.migrate.js | 321 | await Promise.delay(Math.min(pauseInMs, this.DUCKDB_STATES_MIGRATE_MAX_PAUSE_IN_MS)); | COMMENT |
| LOW | server/lib/device/index.js | 81 | // A CSV export has no size limit, but it is read and written chunk by chunk: | COMMENT |
| LOW | server/lib/external-integration/constants.js | 1 | // Docker label used to find back integration containers (reconciliation | COMMENT |
| LOW | server/lib/external-integration/constants.js | 21 | // Docker label carrying the sub-container `name` (the main container has | COMMENT |
| LOW | server/lib/external-integration/constants.js | 101 | // (manifest actions override it with their declared timeout_seconds). | COMMENT |
| LOW | server/lib/external-integration/constants.js | 121 | // the network, which reaches ~1000 entries on a large home/small business | COMMENT |
| LOW | server/lib/external-integration/constants.js | 141 | // action returns to it (outputs): scalars only, never an image or a file | COMMENT |
| LOW | server/lib/external-integration/constants.js | 201 | // small payload, one scan per 10 seconds per integration. | COMMENT |
| LOW | server/lib/external-integration/constants.js | 221 | // camera image. | COMMENT |
| LOW | server/lib/external-integration/constants.js | 281 | // Provider images (B.18 point 6): declared as metadata in the pivot | COMMENT |
| LOW | server/lib/external-integration/constants.js | 361 | // different informations — e.g. local detected but sessions refused, | COMMENT |
| LOW | server/lib/external-integration/constants.js | 381 | // Dynamic options of a select/multi_select field (`source`): a reserved enum | COMMENT |
| LOW | server/lib/external-integration/constants.js | 401 | const MAX_MANIFEST_COUNTRIES = 20; | COMMENT |
| LOW | server/lib/external-integration/constants.js | 501 | // POST /energy/consumption: dated consumption intervals published after the fact, the same | COMMENT |
| LOW | server/lib/external-integration/constants.js | 521 | // integration (further misses queue), and this many cache-miss commands per | COMMENT |
| LOW | server/lib/external-integration/constants.js | 541 | const WIDGET_ACTION_KEY_REGEX = /^[a-z0-9_]{2,32}$/; | COMMENT |
| LOW | …ntegration/externalIntegration.setIntegrationConfig.js | 41 | // a select/multi_select can take its options from a core-defined source | COMMENT |
| LOW | server/lib/external-integration/index.js | 241 | this.musicCommandsInFlight = new Map(); | COMMENT |
| LOW | …ntegration/externalIntegration.registerProxyService.js | 41 | * @param {object} service - The external integration service (plain object). | COMMENT |
| LOW | …rver/lib/external-integration/store/store.constants.js | 1 | // Static files rebuilt hourly by the public indexer | COMMENT |
| LOW | server/lib/scene/scene.addScene.js | 101 | // When the boundary fired: `condition.in-time-range` only trusts the side it carries | COMMENT |
| LOW | server/lib/scene/scene.triggers.js | 81 | [EVENTS.DEVICE.NEW_STATE]: (self, sceneSelector, event, trigger) => { | COMMENT |
| LOW | server/lib/scene/scene.triggers.js | 181 | // (`scope.triggerEvent`, written by scene.checkTrigger). | COMMENT |
| LOW | server/api/routes.js | 621 | }, | COMMENT |
| LOW | server/api/middlewares/jsonBodyMiddleware.js | 1 | const express = require('express'); | COMMENT |
| LOW | server/services/homekit/lib/sanitizeName.js | 1 | // Apple's naming rules, as hap-nodejs enforces them: a name has to start and end with a letter or a | COMMENT |
| LOW | server/services/homekit/lib/deviceMappings.js | 561 | [THERMOSTAT_OPERATING_STATE.IDLE]: HOMEKIT_HEATING_COOLING_STATE.OFF, | COMMENT |
| LOW | …ver/services/zwavejs-ui/utils/convertToGladysDevice.js | 21 | * @returns {Array} The cleaned up features. | COMMENT |
| LOW | …ver/services/matter/utils/booleanStateMatterMapping.js | 1 | const { DEVICE_FEATURE_CATEGORIES, DEVICE_FEATURE_TYPES } = require('../../../utils/constants'); | COMMENT |
| LOW | server/services/mcp/lib/formatWeather.js | 1 | const dayjs = require('dayjs'); | COMMENT |
| LOW | server/services/node-red/docker/settings.txt | 101 | COMMENT | |
| LOW | server/services/node-red/docker/settings.txt | 361 | * This covers: | COMMENT |
| LOW | server/services/node-red/docker/settings.txt | 581 | // webSocketNodeVerifyClient: function(info) { | COMMENT |
| 77 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/test/services/tuya/lib/tuya.saveConfiguration.test.js | 33 | appUsername: 'user@example.com', | CODE |
| LOW | …/test/services/tuya/lib/tuya.saveConfiguration.test.js | 45 | assert.calledWith(gladys.variable.setValue, GLADYS_VARIABLES.APP_USERNAME, 'user@example.com', serviceId); | CODE |
| LOW | …r/test/services/tuya/lib/tuya.getConfiguration.test.js | 38 | .returns('user@example.com'); | CODE |
| LOW | …r/test/services/tuya/lib/tuya.getConfiguration.test.js | 46 | appUsername: 'user@example.com', | CODE |
| LOW | …al-integration/externalIntegration.validateManifest.js | 194 | 'placeholder', | CODE |
| LOW | server/lib/external-integration/manifest.schema.json | 465 | "placeholder": { | CODE |
| LOW | server/lib/external-integration/manifest.schema.json | 639 | "required": ["placeholder"] | CODE |
| LOW | …xternal-integrations/capabilities/dashboard-widgets.md | 46 | { "key": "region", "type": "string", "label": { "en": "Country code", "fr": "Code pays" }, "placeholder": { "en": | CODE |
| LOW | …ntegrations/capabilities/scene-triggers-and-actions.md | 53 | "placeholder": { "en": "driveway" } } | CODE |
| LOW | docs/specs/external-integrations/contracts/manifest.md | 164 | { "key": "ip", "type": "string", "label": { "en": "Manual IP (optional)", "fr": "IP manuelle (optionnel)" }, "plac | CODE |
| LOW | front/src/config/i18n/de.json | 3972 | "placeholder": "3" | CODE |
| LOW | front/src/config/i18n/en.json | 3972 | "placeholder": "3" | CODE |
| LOW | front/src/config/i18n/fr.json | 3972 | "placeholder": "3" | CODE |
| LOW | front/src/config/i18n/es.json | 3972 | "placeholder": "3" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ration/all/thermostat/schedule-page/ScheduleEditor.jsx | 156 | // ── Adding a point ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ration/all/thermostat/schedule-page/ScheduleEditor.jsx | 259 | // ── Editing a point ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ration/all/thermostat/schedule-page/ScheduleEditor.jsx | 328 | // ── Copying a day ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ration/all/thermostat/schedule-page/ScheduleEditor.jsx | 426 | // ── Render helpers ──────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | server/lib/external-integration/constants.js | 198 | // unicast replies). Emission guardrails — the core sends a packet forged | COMMENT |
| MEDIUM | .github/CLAUDE_AUTOFIX.md | 279 | ## Decommissioning the event-driven mode (merge prerequisite) | COMMENT |
| MEDIUM | .github/workflows/claude-scheduled-autofix.yml | 6 | # cloud session per PR to address it. This replaces the event-driven Claude | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | .github/workflows/claude-scheduled-autofix.yml | 278 | # the auto-generated CodeRabbit chatter. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | front/cypress/e2e/routes/scene/Scene.cy.js | 54 | // I don't know why, but I'm unable to get this button with | COMMENT |
| LOW | front/src/config/i18n/en.json | 1664 | "descriptionAdditionalInformationWeatherApi": "You must select the \"Weather\" API at the bottom of the page to | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | server/lib/system/system.hasCpuCfsSupport.js | 23 | // robust across daemon variants | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/docker-release-build.yml | 253 | # Creating a release on the existing tag does not touch the tag itself, so | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | server/services/homekit/lib/characteristicHandlers.js | 11 | function handleRequest(handler, callbackIndex = 0) { | CODE |