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 creationTimestamp: "2026-08-01T09:04:27Z" generation: 6 labels: branch: main build: "175" buildID: "1785575023606" context: release created-by-lighthouse: "true" event-GUID: e1acbb58-8d87-11f1-987f-e498f61fa631 lighthouse.jenkins-x.io/baseSHA: cb52024e9f275870a8ac771eca66235ac31727df lighthouse.jenkins-x.io/branch: main lighthouse.jenkins-x.io/buildNum: "1785575023606" lighthouse.jenkins-x.io/context: release lighthouse.jenkins-x.io/id: apitaltrade-bifrost-main-release-dh7zq lighthouse.jenkins-x.io/job: release lighthouse.jenkins-x.io/lastCommitSHA: cb52024e9f275870a8ac771eca66235ac31727df 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-92rt8-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:build: {} f:buildID: {} f:owner: {} f:repository: {} f:spec: .: {} f:batchPipelineActivity: {} f:build: {} f:gitBranch: {} f:gitOwner: {} f:gitRepository: {} f:pipeline: {} manager: jx-gitops-1.3.15 operation: Update time: "2026-08-01T09:04:27Z" - apiVersion: jenkins.io/v1 fieldsType: FieldsV1 fieldsV1: f:spec: f:lastCommitMessage: {} f:lastCommitSHA: {} f:releaseNotesURL: {} f:version: {} manager: jx-changelog-0.10.29 operation: Update time: "2026-08-01T09:09:03Z" - apiVersion: jenkins.io/v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:labels: f:context: {} f:provider: {} f:spec: f:completedTimestamp: {} f:startedTimestamp: {} manager: jx-promote-0.6.45 operation: Update time: "2026-08-01T09:10:22Z" - apiVersion: jenkins.io/v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:annotations: .: {} f:lighthouse.jenkins-x.io/cloneURI: {} f:lighthouse.jenkins-x.io/job: {} f:labels: 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:context: {} f:gitUrl: {} f:message: {} f:status: {} f:steps: {} manager: jx-build-controller operation: Update time: "2026-08-01T09:17:53Z" name: greencapitaltrade-bifrost-main-175 namespace: jx resourceVersion: "233965917" uid: 347a5880-01ff-44b8-a3c8-2c7d3bfac198 spec: baseSHA: cb52024e9f275870a8ac771eca66235ac31727df batchPipelineActivity: {} build: "175" completedTimestamp: "2026-08-01T09:09:53Z" context: release gitBranch: main gitOwner: greencapitaltrade gitRepository: bifrost gitUrl: https://github.com/greencapitaltrade/bifrost.git lastCommitMessage: | fix(asset_management): retry commands on error_code, space attempts, cover sent Three defects in the command retry sweep, each independently losing commands. 1. Retry eligibility was matched on error_message TEXT The filter looked for '%not connected%'. Deadpool's TCP server reports "no active connection for device on this TCP server instance" — no such substring — so that entire class of failure was silently never retried. Only the consumer path ("Device X not connected to any TCP server instance") happened to match, by coincidence of wording. Eligibility now comes from a structured `error_code` field. Message text can no longer decide whether a command is retried, in either direction: a retryable-sounding message with a non-retryable code is left alone. `update_status` accepts `error_code` from Deadpool. Producers on an older build send none, so a message-shape fallback maps the known wordings for now; it is marked for deletion once every producer sends a code. 2. Attempts were burned on every cron tick The cron runs every minute and the sweep never recorded when it last retried, so any command past the 5 minute window was re-published on EVERY tick — all five attempts spent in five minutes, then given up on. `last_retry_at` now enforces the spacing independently of tick rate. Five attempts at five minutes apart span 25 minutes, which is exactly the freshness floor, so the two bounds are finally consistent. 3. `sent` commands were never recovered at all A command written into a socket whose peer had silently gone away succeeds locally, is marked `sent`, and is never acknowledged. The sweep only looked at `pending` and `failed`, so those sat forever — this is the "27 sent / 0 acked" symptom from #181. `sent` is now recovered, but on its own timing: it waits out `_ACK_TIMEOUT_MINUTES` rather than the plain interval, because unlike `pending` it WAS written to a device socket and may genuinely have actuated with only its acknowledgement lost. Superseded commands are excluded explicitly so a newer command on the same device and actuation category can never be undone by a resurrected older one. Note `validate_execution` rejects anything not `pending` — and this sweep sets `pending` itself, so the idempotency check does NOT bound a double actuation here. The freshness floor, attempt cap, ack timeout and supersession guard are what actually do. Also wires up three test files that existed on disk but were never imported in tests/__init__.py, so they had never run — not locally, not in CI. test_command_log_retry was one of them, which is how the coverage gap above went unnoticed. All three now run and pass. Full module suite: 694 tests, 0 failed, 0 errors. Co-Authored-By: Claude Opus 5 (1M context) lastCommitSHA: b3a6e51c4cfe83e3c2288384bda87f69629442b1 message: 'Tasks Completed: 1 (Failed: 0, Cancelled 0), Skipped: 0' pipeline: greencapitaltrade/bifrost/main releaseNotesURL: https://github.com/greencapitaltrade/bifrost/releases/tag/v6.90.3 startedTimestamp: "2026-08-01T09:08:53Z" status: Running steps: - kind: Stage stage: completedTimestamp: "2026-08-01T09:09:53Z" name: Release startedTimestamp: "2026-08-01T09:08:53Z" status: Succeeded - kind: Stage stage: completedTimestamp: "2026-08-01T09:11:44Z" name: from build pack startedTimestamp: "2026-08-01T09:03:49Z" status: Succeeded steps: - completedTimestamp: "2026-08-01T09:04:15Z" name: Git Clone startedTimestamp: "2026-08-01T09:03:49Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:22Z" name: Next Version startedTimestamp: "2026-08-01T09:04:16Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:29Z" name: Jx Variables startedTimestamp: "2026-08-01T09:04:23Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:29Z" name: Setup Npm Nexus startedTimestamp: "2026-08-01T09:04:29Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:36Z" name: Setup Pip Cache startedTimestamp: "2026-08-01T09:04:30Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:37Z" name: Process Config Templates startedTimestamp: "2026-08-01T09:04:36Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:37Z" name: Update Asset Management Version startedTimestamp: "2026-08-01T09:04:37Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:43Z" name: Check Registry startedTimestamp: "2026-08-01T09:04:38Z" status: Succeeded - completedTimestamp: "2026-08-01T09:08:51Z" name: Build Container Build startedTimestamp: "2026-08-01T09:04:43Z" status: Succeeded - completedTimestamp: "2026-08-01T09:09:03Z" name: Promote Changelog startedTimestamp: "2026-08-01T09:08:52Z" status: Succeeded - completedTimestamp: "2026-08-01T09:09:08Z" name: Promote Helm Release startedTimestamp: "2026-08-01T09:09:04Z" status: Succeeded - completedTimestamp: "2026-08-01T09:10:25Z" name: Promote Jx Promote startedTimestamp: "2026-08-01T09:09:08Z" status: Succeeded - completedTimestamp: "2026-08-01T09:11:44Z" name: Publish Org Kb startedTimestamp: "2026-08-01T09:10:26Z" status: Succeeded - kind: Stage stage: name: from build pack startedTimestamp: "2026-08-01T09:03:49Z" status: Running steps: - completedTimestamp: "2026-08-01T09:04:15Z" name: Git Clone startedTimestamp: "2026-08-01T09:03:49Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:22Z" name: Next Version startedTimestamp: "2026-08-01T09:04:16Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:29Z" name: Jx Variables startedTimestamp: "2026-08-01T09:04:23Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:29Z" name: Setup Npm Nexus startedTimestamp: "2026-08-01T09:04:29Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:36Z" name: Setup Pip Cache startedTimestamp: "2026-08-01T09:04:30Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:37Z" name: Process Config Templates startedTimestamp: "2026-08-01T09:04:36Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:37Z" name: Update Asset Management Version startedTimestamp: "2026-08-01T09:04:37Z" status: Succeeded - completedTimestamp: "2026-08-01T09:04:43Z" name: Check Registry startedTimestamp: "2026-08-01T09:04:38Z" status: Succeeded - completedTimestamp: "2026-08-01T09:08:51Z" name: Build Container Build startedTimestamp: "2026-08-01T09:04:43Z" status: Succeeded - completedTimestamp: "2026-08-01T09:09:03Z" name: Promote Changelog startedTimestamp: "2026-08-01T09:08:52Z" status: Succeeded - completedTimestamp: "2026-08-01T09:09:08Z" name: Promote Helm Release startedTimestamp: "2026-08-01T09:09:04Z" status: Succeeded - name: Promote Jx Promote startedTimestamp: "2026-08-01T09:04:40Z" status: Running - name: Publish Org Kb status: Pending - kind: Promote promote: environment: production pullRequest: pullRequestURL: https://github.com/greencapitaltrade/mcu/pull/5099 startedTimestamp: "2026-08-01T09:10:22Z" status: Succeeded startedTimestamp: "2026-08-01T09:10:22Z" status: Succeeded version: 6.90.3 status: {}