Skip to content

Release v3.14.0-beta.3

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 May 19:57

Added

  • verify_diagnostics catalog tool. Pure function plus thin CLI
    in cable_modem_monitor_catalog_tools that takes an HA diagnostics
    JSON and a release tag and produces a properly-shaped
    verified.json fixture (HA wrapper unwrapped, integration extras
    stripped, verified_at/version prepended, channel arrays
    rendered compact, multi-variant paths resolved). Replaces the
    hand-rolled python heredoc previously used at confirmation time
    with a deterministic, tested transform. Imports
    SYSTEM_INFO_FIELDS and canonicalize_channel_keys from the
    core registry to keep the field-list and channel-key-order
    truth in one place. Maintainer-facing; no end-user impact. See
    MODEM_INTAKE_WORKFLOW.md § Confirmation Phase.
  • json_transposed parser format. New format for modems that
    expose channel data as transposed JSON tables (rows are fields,
    columns are channels). Lives in core/parsers/formats/ alongside
    the existing html_table, xml, and json_table formats and
    registers through the centralized format registry so new formats
    compose in additively. Surfaces to contributors via modem.yaml
    format: selection.

Fixed

  • Auth failure logs now surface response detail across all
    strategies.
    _log_auth_failure_detail (collector.py) reads
    auth_result.response to emit sanitized request line + response
    status/Content-Type + body snippet on auth failure. Six strategies
    (form_pbkdf2, form_sjcl, form_cbn, form_nonce, hnap,
    url_token) plus the shared parse_json_dict helper now populate
    response= on failure paths where a requests.Response is in
    scope; previously only form did, so contributors triaging auth
    failures on any other strategy saw the no-response one-line
    fallback. Related to #120 (CGA6444VF — first real-world test of
    form_pbkdf2).
  • Stale HNAP sessions now recover within the same poll. When a
    cached HNAP session is rejected by the server (LOAD_AUTH on
    HTTP 401/404), the orchestrator clears the cached session and
    retries collection once in the same poll instead of surfacing a
    transient auth_failed state. Affects modems whose firmware
    expires sessions faster than the configured poll interval (e.g.,
    Arris S33 with sub-10-minute auth timeout). Related to #140.
  • Adaptive session reuse disable for chronically short-TTL
    firmware.
    After 2 consecutive recovered same-poll LOAD_AUTH
    events, the orchestrator stops attempting cached-session reuse for
    the rest of the runtime and starts each poll with a fresh login.
    An intervening normal successful poll resets the recovery streak.
    Runtime-only — reset_auth() or process restart re-enables reuse.
    Surfaces in diagnostics as stale_session_recovery_streak and
    session_reuse_disabled. Strategy is intentionally not exposed
    as a per-modem yaml field (per the "no per-modem recovery tuning"
    principle).

Changed

  • load_post_processor moved out of core.test_harness.runner to
    its own module, solentlabs.cable_modem_monitor_core.post_processor.
    The function is a runtime extension-point loader (peer of
    load_parser_config), used by HA's setup path to import per-modem
    parser.py files. It was placed in test_harness/ only because the
    test runner was the first caller; HA picked up the same import path
    when it needed the function later. Internal-only change — no behavior
    change for end users.
  • Orchestrator diagnostic field renamed: last_poll_timestamp
    last_poll_at.
    The old field stored time.monotonic() under
    a name that strongly implied wall-clock time but is actually
    process-uptime seconds — useless for "when did the user test"
    inspection of archived diagnostics. New field stores
    datetime.now(UTC).isoformat() and means what its name implies.
    Visible in core_diagnostics of HA diagnostics downloads. Zero
    consumers of the old field existed, so this is a clean rename.
    Existing committed verified.json fixtures retain the old name
    by the point-in-time-snapshot rule; new confirmations get
    last_poll_at.
  • Logging contract: quiet on success. Parse-complete and other
    success-path orchestration logs fire at INFO on the first poll
    (fresh install, reconfigure, HA restart, reauth) and drop to DEBUG
    in steady-state. Operator-relevant transitions (status changes,
    adaptive-reuse state changes, counter resets) stay at INFO
    regardless of poll count. The integration's startup INFO line tells
    users where to enable DEBUG logging for per-poll detail. Liveness
    can be confirmed without DEBUG via the Diagnostics download
    (includes last_poll_at, streak counters, reuse state) or the
    integration page activity log. Multi-modem setups previously
    produced 144 INFO lines/day per modem; now produce one verbose
    startup block plus transitions.
  • Catalog chipset metadata filled for Hitron CODA56 (Broadcom
    BCM3390) and Compal CH7465MT (Intel Puma DHCE2652, MTAT ISP).
    Affects badge rendering in the catalog README.

Confirmed

  • Hitron CODA56 — BCM3390, form auth, Comcast/Xfinity. Closes #89.
  • Netgear CM1200 (basic-auth variant). The form-auth variant
    remains awaiting verification (different contributor, different
    conditions).

What's Changed

  • fix: recover stale HNAP sessions and disable repeated reuse failures by @ccpk1 in #142

Full Changelog: v3.14.0-beta.2...v3.14.0-beta.3