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: e99c55dcda57d95568ded76bda3e2cd7 creationTimestamp: "2026-09-08T12:30:12Z" generation: 8 labels: branch: main build: "236" context: release created-by-lighthouse: "true" event-GUID: efbc6f9c-ab80-11f1-8898-a9b2d1bce53c lighthouse.jenkins-x.io/baseSHA: 5b224a328d5bacb38aed632891c65e349c41c678 lighthouse.jenkins-x.io/branch: main lighthouse.jenkins-x.io/buildNum: "1788870612361" lighthouse.jenkins-x.io/context: release lighthouse.jenkins-x.io/id: apitaltrade-bifrost-main-release-8wftd lighthouse.jenkins-x.io/job: release lighthouse.jenkins-x.io/lastCommitSHA: 5b224a328d5bacb38aed632891c65e349c41c678 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-cwbfh-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-09-08T12:37:39Z" - 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-09-08T12:41:08Z" name: greencapitaltrade-bifrost-main-236 namespace: jx resourceVersion: "333145907" uid: 6f7360f8-a563-406d-8ead-fd124777a92d spec: baseSHA: 5b224a328d5bacb38aed632891c65e349c41c678 batchPipelineActivity: {} build: "236" buildLogsUrl: s3://logs-gct-prod-20260425045301534100000007/jenkins-x/logs/greencapitaltrade/bifrost/main/236.log completedTimestamp: "2026-09-08T12:41:01Z" context: release gitBranch: main gitOwner: greencapitaltrade gitRepository: bifrost gitUrl: https://github.com/greencapitaltrade/bifrost.git lastCommitMessage: | feat(asset): derive command status per actuation category `remote_control` declared three state keys -- command_type, command_status, execution_time -- that nothing ever wrote. In production they were present on 0 of 377 devices: get_state_payload() only reads values out of device_state, and no ingestion path merges a command result back in. A contract with nothing behind it. They are replaced by keys derived from asset.iot.command.log at read time, grouped by actuation category. Category, not command code, because a category is one physical actuator: engine_cutoff and engine_restore drive the same relay and already supersede each other, so the newest of the pair is the engine's command state. Keyed by code, a stale cutoff would sit in the payload beside the restore that reversed it -- which is exactly how a vehicle read as "cut off" while a restore was in flight. Derived, never stored. The log is the source of truth; a copy in device_state would drift the moment an ACK or supersession landed, which is how the old key became useless in the first place. A category with no commands for the device's type is omitted entirely rather than emitted as a permanent null, honouring the existing contract that an absent key means the device cannot report it. Also links remote_control to gt06. gt06 owns every command defined in production, yet was the one type without the feature that reports their status -- while clean_electric, which has zero commands, had it. All keys are direction=in, writable=false. A command log says what we asked for, not what the device confirmed; `observed` stays false so a client cannot render an unacknowledged cutoff as a settled fact. Tests: 1041 pass, 0 failures (full post_install suite). The 10 new tests initially caught the raw SQL reading past the ORM cache -- a freshly created log has no command_code yet, and a just-ACKed row still read pending -- fixed with a targeted flush_model. Depends on the actuation_category rename in the -ize spelling change. Co-Authored-By: Claude Opus 5 (1M context) lastCommitSHA: 3fca1ae303c36e4bef72d2cec5f10c5c201e2c46 message: 'Tasks Completed: 1 (Failed: 0, Cancelled 0), Skipped: 0' pipeline: greencapitaltrade/bifrost/main releaseNotesURL: https://github.com/greencapitaltrade/bifrost/releases/tag/v7.8.0 startedTimestamp: "2026-09-08T12:30:12Z" status: Succeeded steps: - kind: Stage stage: completedTimestamp: "2026-09-08T12:41:01Z" name: from build pack startedTimestamp: "2026-09-08T12:30:17Z" status: Succeeded steps: - completedTimestamp: "2026-09-08T12:30:48Z" name: Git Clone startedTimestamp: "2026-09-08T12:30:17Z" status: Succeeded - completedTimestamp: "2026-09-08T12:30:57Z" name: Next Version startedTimestamp: "2026-09-08T12:30:48Z" status: Succeeded - completedTimestamp: "2026-09-08T12:31:03Z" name: Jx Variables startedTimestamp: "2026-09-08T12:30:58Z" status: Succeeded - completedTimestamp: "2026-09-08T12:31:08Z" name: Setup Pip Cache startedTimestamp: "2026-09-08T12:31:03Z" status: Succeeded - completedTimestamp: "2026-09-08T12:31:09Z" name: Process Config Templates startedTimestamp: "2026-09-08T12:31:08Z" status: Succeeded - completedTimestamp: "2026-09-08T12:31:09Z" name: Update Asset Management Version startedTimestamp: "2026-09-08T12:31:09Z" status: Succeeded - completedTimestamp: "2026-09-08T12:31:12Z" name: Check Registry startedTimestamp: "2026-09-08T12:31:10Z" status: Succeeded - completedTimestamp: "2026-09-08T12:37:25Z" name: Build Container Build startedTimestamp: "2026-09-08T12:31:13Z" status: Succeeded - completedTimestamp: "2026-09-08T12:37:39Z" name: Promote Changelog startedTimestamp: "2026-09-08T12:37:26Z" status: Succeeded - completedTimestamp: "2026-09-08T12:37:44Z" name: Promote Helm Release startedTimestamp: "2026-09-08T12:37:40Z" status: Succeeded - completedTimestamp: "2026-09-08T12:39:50Z" name: Promote Jx Promote startedTimestamp: "2026-09-08T12:37:44Z" status: Succeeded - completedTimestamp: "2026-09-08T12:41:01Z" name: Publish Org Kb startedTimestamp: "2026-09-08T12:39:51Z" status: Succeeded - kind: Promote promote: environment: staging pullRequest: pullRequestURL: https://github.com/greencapitaltrade/mcu/pull/5720 startedTimestamp: "2026-09-08T12:39:02Z" status: Succeeded startedTimestamp: "2026-09-08T12:39:02Z" status: Succeeded - kind: Promote promote: environment: production pullRequest: pullRequestURL: https://github.com/greencapitaltrade/mcu/pull/5721 startedTimestamp: "2026-09-08T12:39:47Z" status: Succeeded startedTimestamp: "2026-09-08T12:39:47Z" status: Succeeded version: 7.8.0 status: {}