apiVersion: jenkins.io/v1 kind: PipelineActivity metadata: annotations: lighthouse.jenkins-x.io/cloneURI: https://github.com/greencapitaltrade/bifrost.git lighthouse.jenkins-x.io/job: release pipeline.jenkins-x.io/traceID: ea12320018af3e355a4f64d3156121ab creationTimestamp: "2026-08-07T17:20:55Z" generation: 8 labels: branch: main build: "193" context: release created-by-lighthouse: "true" event-GUID: 54a74bd6-9284-11f1-905f-f95d0e4e1606 lighthouse.jenkins-x.io/baseSHA: 05f68c723adb960f1d960e091504e7e22dce50f0 lighthouse.jenkins-x.io/branch: main lighthouse.jenkins-x.io/buildNum: "1786123255472" lighthouse.jenkins-x.io/context: release lighthouse.jenkins-x.io/id: apitaltrade-bifrost-main-release-vn2rw lighthouse.jenkins-x.io/job: release lighthouse.jenkins-x.io/lastCommitSHA: 05f68c723adb960f1d960e091504e7e22dce50f0 lighthouse.jenkins-x.io/refs.org: greencapitaltrade lighthouse.jenkins-x.io/refs.repo: bifrost lighthouse.jenkins-x.io/type: postsubmit owner: greencapitaltrade podName: apitaltrade-bifrost-main-release-fbfmw-from-build-pack-pod provider: github repository: bifrost tekton.dev/pipeline: apitaltrade-bifrost-main-release managedFields: - apiVersion: jenkins.io/v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:labels: f:branch: {} f:context: {} f:owner: {} f:provider: {} f:repository: {} f:spec: f:lastCommitMessage: {} f:lastCommitSHA: {} f:releaseNotesURL: {} f:version: {} manager: jx-changelog-0.10.29 operation: Update time: "2026-08-07T17:26:43Z" - apiVersion: jenkins.io/v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:annotations: .: {} f:lighthouse.jenkins-x.io/cloneURI: {} f:lighthouse.jenkins-x.io/job: {} f:pipeline.jenkins-x.io/traceID: {} f:labels: .: {} f:build: {} f:created-by-lighthouse: {} f:event-GUID: {} f:lighthouse.jenkins-x.io/baseSHA: {} f:lighthouse.jenkins-x.io/branch: {} f:lighthouse.jenkins-x.io/buildNum: {} f:lighthouse.jenkins-x.io/context: {} f:lighthouse.jenkins-x.io/id: {} f:lighthouse.jenkins-x.io/job: {} f:lighthouse.jenkins-x.io/lastCommitSHA: {} f:lighthouse.jenkins-x.io/refs.org: {} f:lighthouse.jenkins-x.io/refs.repo: {} f:lighthouse.jenkins-x.io/type: {} f:podName: {} f:tekton.dev/pipeline: {} f:spec: .: {} f:baseSHA: {} f:batchPipelineActivity: {} f:build: {} f:buildLogsUrl: {} f:completedTimestamp: {} f:context: {} f:gitBranch: {} f:gitOwner: {} f:gitRepository: {} f:gitUrl: {} f:message: {} f:pipeline: {} f:startedTimestamp: {} f:status: {} f:steps: {} manager: jx-build-controller operation: Update time: "2026-08-07T17:29:11Z" name: greencapitaltrade-bifrost-main-193 namespace: jx resourceVersion: "250760047" uid: 45ea8612-2d8a-4e7c-a7c7-635bba15d8f0 spec: baseSHA: 05f68c723adb960f1d960e091504e7e22dce50f0 batchPipelineActivity: {} build: "193" buildLogsUrl: s3://logs-gct-prod-20260425045301534100000007/jenkins-x/logs/greencapitaltrade/bifrost/main/193.log completedTimestamp: "2026-08-07T17:29:02Z" context: release gitBranch: main gitOwner: greencapitaltrade gitRepository: bifrost gitUrl: https://github.com/greencapitaltrade/bifrost.git lastCommitMessage: | feat(asset): low charge/fuel alerts and a real charge-state indicator The last two items from the asset-reporting handoff. Both had every piece in place except the one that mattered. Low-energy alerts ----------------- The `low_battery` alert type, the per-device `low_battery_threshold` and the level reading all existed; nothing ever created the alert. A cron rather than an ingestion hook. Ingestion would be more immediate, but asset.iot.alert inherits mail.thread and tracks seven fields, so a producer running at telemetry rate is the exact shape that filled the production RDS instance to zero free space on 2026-08-04. The cron is rate-limited by construction (every 30 minutes, fast enough for a level that moves over hours) and passes tracking_disable / mail_create_nolog / mail_notrack. Dedup is hysteresis rather than one-shot: fire below the threshold, and re-arm only once the level recovers past threshold + 5. A pack hovering on the line would otherwise alert, resolve and alert again on every pass. Readings older than 6 hours are ignored — a silent device is an offline problem and device_offline already covers it. One threshold serves both media. `level_percent` is a percentage of whatever the asset carries, following the #447 decision that battery and fuel are one feature: the medium lives on the asset (fuel_type / capacity_unit) and telemetry reports only a level. The message names the medium so the text reads correctly for an EV pack or a diesel tank. Charge state ------------ asset.iot.energy.charging is the charge MOSFET. It says the path is permitted, not that anything flows. Measured against production, 73.2% of rows with charging = true carry exactly zero current — a parked pack. Surfacing that flag would report "charging" on three of four idle readings. asset.charge_state instead derives charging/discharging/idle from signed current with a 2 mA deadband, sized from the observed distribution (|current| when non-zero: p10 0.66, p50 6.27, p90 49.97). "unknown" stays distinct from "idle": an asset with no energy telemetry is not the same as one reporting no flow. The sign convention was established from the data, not assumed — the CE parser passes `I` through undocumented. Across samples ten minutes apart, positive current coincides with SoC rising (1,016 up / 124 down) and negative with SoC falling (754 down / 30 up). Positive is charging. Verified against a full production restore: 26 assets with a level reading, 8 under threshold; the first pass raised exactly 8 and the next two raised 0; chatter delta 0. Charge state across the same assets: 23 idle, 3 discharging, 0 charging. 806 tests / 0 failed. Refs: #447 lastCommitSHA: fa32ee5250de0a763821db876c359da453b97b3d message: 'Tasks Completed: 1 (Failed: 0, Cancelled 0), Skipped: 0' pipeline: greencapitaltrade/bifrost/main releaseNotesURL: https://github.com/greencapitaltrade/bifrost/releases/tag/v6.91.0 startedTimestamp: "2026-08-07T17:20:55Z" status: Succeeded steps: - kind: Stage stage: completedTimestamp: "2026-08-07T17:29:02Z" name: from build pack startedTimestamp: "2026-08-07T17:20:59Z" status: Succeeded steps: - completedTimestamp: "2026-08-07T17:21:23Z" name: Git Clone startedTimestamp: "2026-08-07T17:20:59Z" status: Succeeded - completedTimestamp: "2026-08-07T17:21:30Z" name: Next Version startedTimestamp: "2026-08-07T17:21:23Z" status: Succeeded - completedTimestamp: "2026-08-07T17:21:34Z" name: Jx Variables startedTimestamp: "2026-08-07T17:21:30Z" status: Succeeded - completedTimestamp: "2026-08-07T17:21:38Z" name: Setup Pip Cache startedTimestamp: "2026-08-07T17:21:35Z" status: Succeeded - completedTimestamp: "2026-08-07T17:21:39Z" name: Process Config Templates startedTimestamp: "2026-08-07T17:21:39Z" status: Succeeded - completedTimestamp: "2026-08-07T17:21:40Z" name: Update Asset Management Version startedTimestamp: "2026-08-07T17:21:40Z" status: Succeeded - completedTimestamp: "2026-08-07T17:21:43Z" name: Check Registry startedTimestamp: "2026-08-07T17:21:40Z" status: Succeeded - completedTimestamp: "2026-08-07T17:26:33Z" name: Build Container Build startedTimestamp: "2026-08-07T17:21:43Z" status: Succeeded - completedTimestamp: "2026-08-07T17:26:43Z" name: Promote Changelog startedTimestamp: "2026-08-07T17:26:33Z" status: Succeeded - completedTimestamp: "2026-08-07T17:26:46Z" name: Promote Helm Release startedTimestamp: "2026-08-07T17:26:43Z" status: Succeeded - completedTimestamp: "2026-08-07T17:28:13Z" name: Promote Jx Promote startedTimestamp: "2026-08-07T17:26:47Z" status: Succeeded - completedTimestamp: "2026-08-07T17:29:02Z" name: Publish Org Kb startedTimestamp: "2026-08-07T17:28:13Z" status: Succeeded - kind: Promote promote: environment: staging pullRequest: pullRequestURL: https://github.com/greencapitaltrade/mcu/pull/5252 startedTimestamp: "2026-08-07T17:27:39Z" status: Succeeded startedTimestamp: "2026-08-07T17:27:39Z" status: Succeeded - kind: Promote promote: environment: production pullRequest: pullRequestURL: https://github.com/greencapitaltrade/mcu/pull/5253 startedTimestamp: "2026-08-07T17:28:10Z" status: Succeeded startedTimestamp: "2026-08-07T17:28:10Z" status: Succeeded version: 6.91.0 status: {}