apiVersion: jenkins.io/v1 kind: PipelineActivity metadata: annotations: lighthouse.jenkins-x.io/cloneURI: https://github.com/greencapitaltrade/fury.git lighthouse.jenkins-x.io/job: release pipeline.jenkins-x.io/traceID: ddb9fe955f14f227a775155afd447b45 creationTimestamp: "2026-09-06T21:44:03Z" generation: 8 labels: branch: main build: "156" context: release created-by-lighthouse: "true" event-GUID: fde132b0-aa3b-11f1-8529-23564f11c65d lighthouse.jenkins-x.io/baseSHA: 64588294597da2d368e64a30d5bf6d0d83420b9f lighthouse.jenkins-x.io/branch: main lighthouse.jenkins-x.io/buildNum: "1788731043023" lighthouse.jenkins-x.io/context: release lighthouse.jenkins-x.io/id: encapitaltrade-fury-main-release-dz8ql lighthouse.jenkins-x.io/job: release lighthouse.jenkins-x.io/lastCommitSHA: 64588294597da2d368e64a30d5bf6d0d83420b9f lighthouse.jenkins-x.io/refs.org: greencapitaltrade lighthouse.jenkins-x.io/refs.repo: fury lighthouse.jenkins-x.io/type: postsubmit owner: greencapitaltrade podName: encapitaltrade-fury-main-release-rmvmd-from-build-pack-pod provider: github repository: fury tekton.dev/pipeline: encapitaltrade-fury-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-06T21:48:27Z" - 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-06T21:52:23Z" name: greencapitaltrade-fury-main-156 namespace: jx resourceVersion: "328958618" uid: 7a209193-d532-4e6a-a892-e76e4757b903 spec: baseSHA: 64588294597da2d368e64a30d5bf6d0d83420b9f batchPipelineActivity: {} build: "156" buildLogsUrl: s3://logs-gct-prod-20260425045301534100000007/jenkins-x/logs/greencapitaltrade/fury/main/156.log completedTimestamp: "2026-09-06T21:52:16Z" context: release gitBranch: main gitOwner: greencapitaltrade gitRepository: fury gitUrl: https://github.com/greencapitaltrade/fury.git lastCommitMessage: | feat(commands): expose real command lifecycle status and per-command poll query Bifrost's asset.iot.command.log.status selection is pending, waiting_for_token, sent, acknowledged, completed, failed, timeout, error, cancelled, superseded — but Fury's CommandStatus enum only had pending, executing, completed, failed, cancelled (executing was never produced by Bifrost at all), and commands.ts passed the raw status straight through. Because status is non-null, graphql-js threw `Enum "CommandStatus" cannot represent value: "sent"` the moment a command left pending, nulling out the whole deviceCommands/executeDeviceCommand payload. Customers could only ever observe pending — immobilize/mobilize commands looked permanently stuck from the client's point of view even when Bifrost had long since delivered or failed them. Separately, deviceCommands was declared to return AssetCommand (required asset_id/command_type, neither of which the resolver supplied) and cancelDeviceCommand returned the same never-actually-matching type. Fixes: - CommandStatus now mirrors Bifrost's real lifecycle: pending | waiting_for_token | sent | delivered | completed | failed | cancelled | superseded, each documented (delivered = device acknowledged receipt, NOT proof of physical actuation). - DeviceCommand is reshaped to the full asset.iot.command.log record (device_id, device_identifier, status_detail carrying Bifrost's raw status for debugging, execution/ack/completion timestamps, error_code, error_message, retry_count) and is now returned by all four command resolvers (deviceCommands, the new deviceCommand, executeDeviceCommand, cancelDeviceCommand). Dead AssetCommand type removed. - A pure toDeviceCommand normalizer + BIFROST_STATUS_TO_GRAPHQL map centralize the Bifrost -> GraphQL status mapping in one place, tolerant of older Bifrost builds omitting device_id/device_identifier/acknowledgment_time/ error_code/retry_count. - New deviceCommand(id, companyId) query polls a single command's lifecycle (requires Bifrost feat/command-log-get-endpoint; null when not found/not visible). Tests (jest): every Bifrost status value is pinned against the enum parsed straight from schema.graphql, the normalizer's field-by-field behavior, all four resolvers, and an end-to-end test that builds the real executable schema and proves a raw "sent" status now serializes with no errors — the actual regression test for the customer-facing failure. Docs: VoltCred Postman collection's send-command example updated to the new lifecycle and a new "poll command status" request added; ASSET_MANAGEMENT.md command section brought back in sync with the code. Co-Authored-By: Claude Fable 5.1 lastCommitSHA: 98216a2ce47508c8877157f05f6a8df8e5f33186 message: 'Tasks Completed: 1 (Failed: 0, Cancelled 0), Skipped: 0' pipeline: greencapitaltrade/fury/main releaseNotesURL: https://github.com/greencapitaltrade/fury/releases/tag/v5.1.0 startedTimestamp: "2026-09-06T21:44:03Z" status: Succeeded steps: - kind: Stage stage: completedTimestamp: "2026-09-06T21:52:16Z" name: from build pack startedTimestamp: "2026-09-06T21:44:08Z" status: Succeeded steps: - completedTimestamp: "2026-09-06T21:44:15Z" name: Git Clone startedTimestamp: "2026-09-06T21:44:08Z" status: Succeeded - completedTimestamp: "2026-09-06T21:44:23Z" name: Next Version startedTimestamp: "2026-09-06T21:44:15Z" status: Succeeded - completedTimestamp: "2026-09-06T21:44:27Z" name: Jx Variables startedTimestamp: "2026-09-06T21:44:23Z" status: Succeeded - completedTimestamp: "2026-09-06T21:46:10Z" name: Build Npm Install startedTimestamp: "2026-09-06T21:44:27Z" status: Succeeded - completedTimestamp: "2026-09-06T21:46:14Z" name: Build Npm Test startedTimestamp: "2026-09-06T21:46:10Z" status: Succeeded - completedTimestamp: "2026-09-06T21:46:19Z" name: Check Registry startedTimestamp: "2026-09-06T21:46:15Z" status: Succeeded - completedTimestamp: "2026-09-06T21:48:15Z" name: Build Container Build startedTimestamp: "2026-09-06T21:46:20Z" status: Succeeded - completedTimestamp: "2026-09-06T21:48:27Z" name: Promote Changelog startedTimestamp: "2026-09-06T21:48:16Z" status: Succeeded - completedTimestamp: "2026-09-06T21:48:31Z" name: Promote Helm Release startedTimestamp: "2026-09-06T21:48:27Z" status: Succeeded - completedTimestamp: "2026-09-06T21:50:04Z" name: Promote Jx Promote startedTimestamp: "2026-09-06T21:48:32Z" status: Succeeded - completedTimestamp: "2026-09-06T21:52:16Z" name: Publish Org Kb startedTimestamp: "2026-09-06T21:50:04Z" status: Succeeded - kind: Promote promote: environment: staging pullRequest: pullRequestURL: https://github.com/greencapitaltrade/mcu/pull/5696 startedTimestamp: "2026-09-06T21:49:28Z" status: Succeeded startedTimestamp: "2026-09-06T21:49:28Z" status: Succeeded - kind: Promote promote: environment: production pullRequest: pullRequestURL: https://github.com/greencapitaltrade/mcu/pull/5697 startedTimestamp: "2026-09-06T21:50:01Z" status: Succeeded startedTimestamp: "2026-09-06T21:50:01Z" status: Succeeded version: 5.1.0 status: {}