Commit Graph
94 Commits
Author SHA1 Message Date
ic-builder e15b170659 fix(alerting): dead-man heartbeat never pushed — secret unavailable in runtime templates
HA runtime template contexts (shell_command {{ }} rendering) cannot read
secrets.yaml; kuma_push_url rendered undefined every fire and the Kuma
push dead-man never sent a beat. Move the full curl command into the
secret (kuma_heartbeat_cmd) and reference it with !secret, which is
substituted at config parse where secrets work.

On-box fix applied + verified under GLPI CR 21; this commit makes the
git copy match the deployed state.

Ticket: https://projects.knownelement.com/issues/811
CR: https://cmdb.knownelement.com/front/change.form.php?id=21
2026-09-06 11:38:23 -05:00
ic-builder 0ced9db10d Merge pull request 'release PR template: CR deep-link field (CR-gating ruling)' (#5) from ic-builder/cr-gate-template into dev
ci / lint (push) Successful in 36s
2026-09-06 15:26:56 +00:00
ic-builder 2b32d7b719 release PR template: CR deep-link line per CR-gating ruling
GLPI CR reference now a required field (dev-only PRs declare no-CR).
Standard: https://projects.knownelement.com/issues/820
Ticket: https://projects.knownelement.com/issues/811
2026-09-06 10:26:03 -05:00
vptechops f4d96b13f0 fix(plant): filter sensors via legacy filter platform; drop input_boolean description
ci / lint (push) Successful in 39s
Top-level 'filter:' cannot merge from packages (expected dict); the
booleans rejected 'description'. Both found live in the 12:38 deploy:
package booleans + smoothed sensors failed to materialize.

Meat: https://projects.knownelement.com/issues/344#comment
2026-09-06 07:48:06 -05:00
vptechops 27f6967e1a docs: STATUS — review gate passed, CI parked to #813, beta at 192.168.3.240 [#344 #781 #813]
ci / lint (push) Successful in 52s
2026-09-06 07:18:27 -05:00
vptechops aa8d78825a ci: park config-check job — runner-side debugging needed [#778]
ci / lint (push) Successful in 51s
Local check_config passes (validated); CI job fails in the runner env.
Three causes already fixed (alpine-musl node mount, py3.13 floor,
checkout needs node); 4s failure needs UI job logs. Full trail in the
follow-up ticket. On-box 'ha core check' remains the release gate.
2026-09-06 07:15:14 -05:00
vptechops 55ff572463 ci: config-check clones via job token — no node for actions/checkout
ci / lint (push) Successful in 1m0s
ci / config-check (push) Failing after 4s
2026-09-06 07:03:46 -05:00
vptechops efe314f34e ci: config-check py3.14 — HA 2026.8.3 requires-python >=3.14.2
ci / lint (push) Successful in 1m1s
ci / config-check (push) Failing after 24s
2026-09-06 06:57:05 -05:00
vptechops d18e467484 fix(plant): review-gate fixes — level-based UPS re-polls, test hardening [#790 #344]
ci / lint (push) Successful in 55s
ci / config-check (push) Failing after 1m5s
Adversarial review verdict FAIL -> addressed: runtime-low + shutdown
chain re-poll /5 min (edge-crossing could miss a page mid-outage);
suppression stamp set after notify; plan body names all 7 hosts
explicitly; test fixes (pipefail SIGPIPE, comment-only assertion).
Reviewer P1 'tripp_lite slug' refuted with live entity registry
evidence (entity_id derives from name; sensor exists, 8f48730 aligned).
On-box ha core check passed with the changed files.

Review thread: #3
2026-09-06 06:49:26 -05:00
vptechops b06ef7dbf0 ci: config-check base -> python:3.13 (HA py floor + glibc for runner node)
ci / lint (push) Failing after 16s
ci / config-check (push) Failing after 0s
2026-09-06 06:43:44 -05:00
vptechops 0c44be9925 ci: real HA load validation — check_config in pinned container [#778]
ci / lint (push) Successful in 50s
ci / config-check (push) Failing after 12s
Boots HA 2026.8.3 against the repo config with CI-only stub secrets;
catches bad Jinja/unknown keys/schema drift yamllint cannot see.

Meat: https://projects.knownelement.com/issues/778
2026-09-06 06:29:34 -05:00
mrcharles bcbdeb74a2 docs: STATUS refresh — release PR #2, beta VM 53110, asks in #811 [#344 #781]
ci / lint (push) Successful in 1m23s
2026-09-06 06:01:51 -05:00
mrcharles 78a9258263 docs: restore runbook (#628) + sparse STATUS.md [#628 #344]
ci / lint (push) Successful in 58s
Baseline backup 34a05d70 pulled off-box. Runbook covers 3 layers:
HA-level, PBS VM-level (dev-lane drill rule), fresh-HAOS-from-git.

Meat: https://projects.knownelement.com/issues/790#note-4970
2026-09-06 05:42:45 -05:00
mrcharles c4ebb8aae7 feat(ups): #455 shutdown chain — dry-run plan pages, dual-gate arm [#790]
ci / lint (push) Successful in 1m19s
Plan data from live qm inventory (7 hosts). Execution wiring deferred
until PVE API tokens + founder ordering review. 4 regression tests.

Meat: https://projects.knownelement.com/issues/790#note-4970
2026-09-06 05:36:15 -05:00
mrcharles 7e13612752 fix(plant): alert hygiene — watchdog gate, trend smoothing, UPS [#344]
ci / lint (push) Successful in 1m31s
Three live-fire defects: unconditional 30-min watchdog page, tsys6 flap
false-positive, Tripp Lite runtime-low gap. TDD: 4 new regression tests.
On-box ha core check passed before commit.

Meat + verification: https://projects.knownelement.com/issues/344#note-4966
2026-09-06 05:24:58 -05:00
mrcharles 83b32d5d9f feat(heartbeat): dead-man push to out-of-band Kuma every 5 min [#792]
ci / lint (push) Successful in 42s
HA curls status.knownelement.com push URL on a 5-min pattern; Kuma
pages the founder directly if heartbeats stop. Alert path independent
of HA itself.
https://projects.knownelement.com/issues/792
2026-09-04 17:07:04 -05:00
mrcharles 807dc8ba8d docs: release PR template — gate checklist + rollback [#784 #778]
ci / lint (push) Successful in 57s
2026-09-04 16:37:21 -05:00
mrcharles 239e449d45 feat(validate): post-deploy validation on every HA start [#778]
ci / lint (push) Successful in 41s
Missing/stale criticals after restart page with specifics instead of
waiting for humans; watchdog handles recovery; revert procedure
documented for repeat failures.
2026-09-04 16:23:53 -05:00
mrcharles 601c70ec5e fix(alerts): iOS data.url only — clickAction rejected by apns schema [#344 #778]
ci / lint (push) Successful in 46s
Watchdog notify crash root-caused: iOS companion schema rejects
data.clickAction; url is the iOS deep-link key. Suite updated to
assert url presence per alert.
https://projects.knownelement.com/issues/778
2026-09-04 16:11:31 -05:00
mrcharles 13b0976ad6 fix(doorman): unlock dispatch via shell_command — rest_command absent [#345 #355]
ci / lint (push) Successful in 47s
rest_command integration silently fails to register on this box
(404 services, valid config+secret; root-cause pending #741).
shell_command curl is the working mechanism; arm-switch gate unchanged.
https://projects.knownelement.com/issues/355
2026-09-04 16:01:40 -05:00
mrcharles 8f48730a40 fix(dash): tripp lite runtime entity id (tripp_lite slug) [#784]
ci / lint (push) Successful in 58s
2026-09-04 15:06:36 -05:00
mrcharles c23d256ced feat(dash): dashboard series v2 — Ops Overview, Power, Thermal [#784 #344]
ci / lint (push) Successful in 35s
Role-based rework per founder: overview + detail dashboards. UPS
parity (Tripp Lite runtime-minutes template). Phase 1 of the ground-up
rework; Capacity/Access views land with fans + lock.
https://projects.knownelement.com/issues/784
2026-09-04 14:49:14 -05:00
mrcharles 45024f80c3 feat(sdlc): regression test suite in CI + watchdog covers deploy sensor [#778 #789]
ci / lint (push) Successful in 38s
tests/test_sdlc.sh: alert-twin presence, per-alert deep-link check,
watchdog coverage, ghost-entity + secret guards. Runs as a CI step.
https://projects.knownelement.com/issues/778
2026-09-04 14:27:51 -05:00
mrcharles 403f83a187 fix(deploy): sha-watch sensor URL -> KNEL/KNELBMS post-rename [#785 #784]
ci / lint (push) Successful in 49s
2026-09-04 13:33:18 -05:00
mrcharles c8f2cbde4a fix(ci): bookworm pip via apt, valid truthy nesting, runtime-file ignores [#784]
ci / lint (push) Successful in 45s
Red/green: run 1 failed 27s (no pip in node image); run 2 blocker was
invalid truthy nesting in .yamllint. Local repro now green.
https://projects.knownelement.com/issues/784
2026-09-04 12:22:23 -05:00
mrcharles 5629bc9b4b ci: runs-on ultix — fleet runner label scoping [#784]
ci / lint (push) Failing after 27s
Runner is label-scoped to this fleet; other repos' ubuntu-latest
jobs no longer land on it.
https://projects.knownelement.com/issues/784
2026-09-04 12:13:35 -05:00
mrcharles 4f54635b33 feat(watchdog): stale-entity auto-heal — reload, notify, guarded restart [#789]
ci / lint (push) Failing after 14s
5-min staleness checks on 12 critical entities; reload_config_entry
auto-heal (no restart); notify on failure; auto-restart behind
input_boolean arm (default OFF).
https://projects.knownelement.com/issues/789
2026-09-04 10:55:00 -05:00
mrcharles 523a56bd52 feat(dash): Tripp Lite power entities — apparent VA, current, runtime [#372 #344]
ci / lint (push) Failing after 9s
4 integration-disabled entities enabled via registry (config-entry
platform, no restart). dev only.
https://projects.knownelement.com/issues/372
2026-09-04 10:50:03 -05:00
mrcharles 758fc92e36 feat(dash): Tripp Lite cards on Server Room UPS view [#372 #344]
ci / lint (push) Failing after 10s
charge + load gauges, status entities, hardware note. dev only.
https://projects.knownelement.com/issues/372
2026-09-04 10:43:48 -05:00
mrcharles 528dab5100 chore(garden): themes dir placeholder, empty-include markers, doorman contract pointer [#784]
ci / lint (push) Failing after 9s
Gardening pass: themes/ dir must exist for include_dir_merge_named;
scenes/scripts marked intentionally-empty; cross-repo contract pointer
to KNEL/doorman README. dev only.
https://projects.knownelement.com/issues/784
2026-09-04 07:46:10 -05:00
mrcharles 6266043d11 ci(gitea): workflow — yamllint + secret scan on dev/release [#784]
ci / lint (push) Waiting to run
Fleet CI standard; runner #784. Runs go green once the act_runner
registers (token pending founder).
https://projects.knownelement.com/issues/784
2026-09-04 07:25:04 -05:00
mrcharles 8931b653d5 feat(ups): Tripp Lite into on-battery/low-battery/comms alerts [#372 #344]
tsys1_triplite entities replace the never-real tsys9_ups_status
ghost references; battery-low trigger gains the triplite charge.
dev only - release push pending founder go.
https://projects.knownelement.com/issues/372
2026-09-04 07:12:28 -05:00
mrcharles 09f3276b31 feat(deploy): branch model — box tracks release, dev is WIP-integration [#779 #344]
webhook ref-guard + sha-watch sensor pinned to ?sha=release;
sensor renamed pfv_deploy_gitea_release_head; master frozen.
https://projects.knownelement.com/issues/779
2026-09-04 06:32:56 -05:00
mrcharles 41116c7feb feat(alerts): deep-link taps to UPS/Temps/Overview views [#344]
clickAction (Android) + url (iOS) on all 9 alert notifications;
explicit lovelace view paths for deterministic links.
https://projects.knownelement.com/issues/344
2026-09-04 06:04:19 -05:00
mrcharles d93f9c0264 fix(snmp): document + restart after silent tsys9 drive poller wedge [#344]
12h stale despite healthy OID; registry cycle can't revive legacy
snmp pollers - core restart required.
https://projects.knownelement.com/issues/344
2026-09-04 06:00:04 -05:00
mrcharles 0d046fa0be docs: HomeKit controller-only ruling — never bridge outward [#344]
https://projects.knownelement.com/issues/344
2026-09-03 21:27:10 -05:00
mrcharles 33505c647e fix(plant): recovery alert condition indentation [#344]
value_template must be a sibling key of condition in the action
sequence, not a continuation - reload 500 pointed at line 494.

Detail: https://projects.knownelement.com/issues/344
2026-09-03 16:16:04 -05:00
mrcharles e6f4032865 feat(plant): temperature RECOVERY alerts - tiered clear notifications [#344]
Recovery twin of the high-temperature alert: per-tier below-triggers
(fire-line minus 5F, held 10 min), from_state guard against restart
false-positives, peak-value reporting. Matches existing notify
targets; UPS on-battery already had its restored twin.

Detail: https://projects.knownelement.com/issues/344
2026-09-03 16:12:18 -05:00
mrcharles db4624a2df feat(plant): tsys3 GPU temp sensor - match nouveau hwmon too [#763]
Maxwell card runs in-tree nouveau on kernel 7.0.14 (no proprietary
branch supports both 7.0 and Maxwell); regex widened with a
non-capturing alternation, template downstream unchanged.

Detail: https://projects.knownelement.com/issues/763
2026-09-03 14:02:09 -05:00
mrcharles 6c5efbb609 docs: showpiece README — mermaid architecture, sensor/alert tables [#762]
Also absorbs PFVCluster operator tooling: tools/ha-ws-call.py and
docs/reference-packs/ (historical, NOT loaded by HA — clearly marked).
No live-config changes in this commit.

Detail: https://projects.knownelement.com/issues/762
2026-09-03 13:34:53 -05:00
mrcharles 96e70aa231 docs: AGPLv3 license + public README [#762]
Pre-publication packaging. Full-history secret/badge scans clean;
badge IDs live only in the private access-roster repo.

Detail: https://projects.knownelement.com/issues/762
2026-09-03 13:22:49 -05:00
mrcharles 2519aec5b6 feat(doorman): honor local_unlock flag from break-glass scans [#345]
Break-glass badges fire the relay locally on the reader host (no HA
dependency); the flagged scan still reaches HA for the audit trail
but skips re-dispatch. NOTE: deployed while pfv-bms is down — YAML
lint clean, ha core check to run at Friday boot before arming.

https://projects.knownelement.com/issues/345
2026-09-03 08:15:21 -05:00
mrcharles 66a5c45b7e feat(doorman): unlock dispatch — arm switch + rest_command to doorctl [#345]
Founder-approved: valid badge + armed input_boolean -> rest_command
fires the pfvsvrpi doorctl endpoint (Tailscale-bound, token+source
allowlisted, self-securing relay). Disarm = boolean off = log-only.
URL secret on-box only (doorman_unlock_url).

https://projects.knownelement.com/issues/345
2026-09-03 07:08:06 -05:00
mrcharles b7f376b6b3 fix(deploy): sha-watch deploys must restart core - reload kills webhook triggers [#345]
Found live 2026-09-03: after reload-only deploys, webhook-triggered
automations (doorman ingest, deploy fast path) silently stop firing
while the endpoint still returns HTTP 200. Proven: core restart
restores them. Sha-watch now restarts core on every new master HEAD
(same semantics as the webhook fast path for packages/** changes).

https://projects.knownelement.com/issues/345
2026-09-03 06:33:00 -05:00
mrcharles 85fdd1aa5e fix(doorman): HA Jinja has no split filter — method-call parsing [#345]
Live webhook test caught it: TemplateRuntimeError 'No filter named
split'. enabled_ids/holder rebuilt with row.split('|') method calls
in a namespace loop.

https://projects.knownelement.com/issues/345
2026-09-03 06:11:26 -05:00
mrcharles 908c14d8e4 feat(doorman): badge scan ingest + roster whitelist sensors [#345]
Roster fetched live from KNEL/access-roster via gitea API (no git
mechanics; access-roster stays the single gated source of truth).
Known/disabled/unknown decision branches + last-scan entities.
UNLOCK deliberately not wired - pending HA->Pi control path (#741).

Validated: yamllint clean, ha core check passed on staged copy.
https://projects.knownelement.com/issues/345
2026-09-03 06:02:51 -05:00
mrcharles ec974c9061 fix(alarms): CPU/SoC silicon tier at 176F - ambient 104F only for true ambient [#733]
subopi3 SoC idles at 117F and false-alarmed the 104F ambient bucket
at 23:15 CDT. Silicon (server CPUs, drac cpu, Pi/Jetson SoCs) now
alerts at 176F (80C pre-throttle).
Detail: https://projects.knownelement.com/issues/733
2026-09-02 23:17:07 -05:00
mrcharles 2eef3e49d7 test(deploy): e2e self-deploy proof [#734] 2026-09-02 22:56:51 -05:00
mrcharles 02e6df0340 fix(deploy): !secret must be the whole header value, not inline [#734]
gitea got no auth (401: only signed in user) - secrets do not
concatenate. Secret now holds the full 'Bearer <token>' header.
Detail: https://projects.knownelement.com/issues/734
2026-09-02 22:46:31 -05:00
mrcharles fbd88aa2f0 fix(deploy): drop availability mask so sensor state shows gitea response [#734]
Detail: https://projects.knownelement.com/issues/734
2026-09-02 22:38:56 -05:00