Files
Nikolay MiroshnichenkoandClaude Opus 5 481bab0e0c analyze: subdpt_suspect stops flagging flags, timestamps and legitimate DPTs of the same quantity
Found on a real 1312-GA house, confirmed across all seven corpus projects.

- A quantity word in the name of a 1-bit, date/time or text GA names what the flag,
  threshold trigger or timestamp is about ("on by motion detector by illuminance",
  "CO2 threshold 1", "meter value recorded, date"), not the value. 12 of 12 hits on
  1-bit GAs in the corpus were false positives; mains 1, 10, 11, 16, 19 are skipped.
- Legitimate alternatives are accepted, checked against xknx 3.20: power 9.024 kW and
  14.080 VA; energy 13.010 to 13.016 and 14.031 J, plus power DPTs under Russian
  "электроэнергия" names that are routinely used for power readings.
- Power factor gets its own rule (14.057) ahead of power, so "Фактор мощности" is no
  longer expected to be 14.056.

Real findings still fire: a bare DPT 9 named "lux threshold", a 5.x named "temperature
control", a 5.001 named "power", 9.002 named "temperature". New test file
test_real_house_fixes.py, wired into CI.

Corpus: subdpt_suspect 17 -> 2 on the house, 7 -> 2 and 1 -> 0 on two others; no other
metric moved. Baseline re-recorded in this commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 18:30:13 +02:00

122 lines
3.8 KiB
YAML

name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
# The workflow only reads the tree; nothing here needs a writable token.
permissions:
contents: read
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: "3.12"
cache: pip
- name: Install package and tools
run: |
python -m pip install --upgrade pip
pip install -e . ruff mypy
- name: Lint (ruff — errors only, no style rules)
run: ruff check nickol_knx_mcp tests tools
- name: Types (mypy)
run: mypy
smoke-test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- uses: actions/checkout@v7
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python-version }}
cache: pip
- name: Install package
run: |
python -m pip install --upgrade pip
pip install -e .
- name: End-to-end smoke test (synthetic 16-GA project)
run: python tests/test_pipeline.py
- name: Device catalog wiring (catalog-exact + recipe fallback)
run: python tests/test_device_catalog.py
- name: App-program parser (synthetic .knxprod round-trip)
run: python tests/test_appprog_parser.py
- name: v0.8 fixes (positional pairing, ref-merge, range names)
run: python tests/test_v08_fixes.py
- name: Cover step/stop pairing stays within the ETS Function (issue #11)
run: python tests/test_cover_pairing.py
- name: RM/Rückmeldung shutter feedback classifies as status, not light (issue #12)
run: python tests/test_rm_status.py
- name: Policy profile — inferred taxonomy, declared profile, project-seeded example (issue #13)
run: python tests/test_policy.py
- name: Structure-first entity suggestions (HA SuggestionProvider prototype)
run: python tests/test_suggest.py
- name: Stable ordering + cursor paging for large tool results
run: python tests/test_paging.py
- name: GA-export intake, entity naming, climate setpoint shift
run: python tests/test_ga_export.py
- name: Regressions from a real 1312-GA house (subDPT false positives, HA lights, self-reporting status)
run: python tests/test_real_house_fixes.py
- name: Repair proposals and council-review fixes
run: python tests/test_council_fixes.py
- name: Domain classifier (name + DPT + range context)
run: python tests/test_domain_classifier.py
- name: explain_ga provenance
run: python tests/test_explain.py
- name: Aggregates carry their evidence
run: python tests/test_explainable_aggregates.py
- name: Device parameter checks
run: python tests/test_param_check.py
- name: Value-status completeness (brightness / position)
run: python tests/test_role_completeness.py
- name: Room template library
run: python tests/test_room_library.py
- name: Root-cause regressions
run: python tests/test_root_cause.py
- name: Hardened archive and XML parsing
run: python tests/test_safexml.py
- name: Theben reference projects
run: python tests/test_theben_corrections.py
- name: Topology limits
run: python tests/test_topology.py
- name: Console script is installed
run: |
python -c "import importlib.metadata as m; print('entry points:', [e.name for e in m.entry_points(group='console_scripts') if e.name == 'nickol-knx-mcp'])"
command -v nickol-knx-mcp