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: c538c2d61cb162d21eac2cab07767f88 creationTimestamp: "2026-05-30T09:12:24Z" generation: 8 labels: branch: main build: "109" context: release created-by-lighthouse: "true" event-GUID: a7026068-5c07-11f1-9dae-e2664dbafbc2 lighthouse.jenkins-x.io/baseSHA: f817d961d6716236fb0d5c2602e26fc2929174c6 lighthouse.jenkins-x.io/branch: main lighthouse.jenkins-x.io/buildNum: "1780132344586" lighthouse.jenkins-x.io/context: release lighthouse.jenkins-x.io/id: apitaltrade-bifrost-main-release-mjpmj lighthouse.jenkins-x.io/job: release lighthouse.jenkins-x.io/lastCommitSHA: f817d961d6716236fb0d5c2602e26fc2929174c6 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-zxdg2-from-build-pack-pod provider: github repository: bifrost tekton.dev/pipeline: apitaltrade-bifrost-main-release-zxdg2 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.18 operation: Update time: "2026-05-30T09:16:07Z" - 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-05-30T09:17:07Z" name: greencapitaltrade-bifrost-main-109 namespace: jx resourceVersion: "62571283" uid: 1cd201a8-9a77-49c2-a813-c6b3103d412a spec: baseSHA: f817d961d6716236fb0d5c2602e26fc2929174c6 batchPipelineActivity: {} build: "109" buildLogsUrl: s3://logs-gct-prod-20260425045301534100000007/jenkins-x/logs/greencapitaltrade/bifrost/main/109.log completedTimestamp: "2026-05-30T09:17:01Z" context: release gitBranch: main gitOwner: greencapitaltrade gitRepository: bifrost gitUrl: https://github.com/greencapitaltrade/bifrost.git lastCommitMessage: | feat(asset_management): peripheral.vendor table — Peripheral Driver Framework (Phase 5b-a) Backs §17 of Wasp/TERRA_MQTT_PROTOCOL.md (Peripheral Driver Framework). Each row describes one (peripheral_kind × vendor) combination — which baked-in firmware sequencer handles its conversational pattern, what transport bus it lives on, which CAN IDs / UART opcodes the firmware may emit, and the byte-level extraction rules that turn raw frames into canonical v1 telemetry fields. Onboarding a new BMS / fuel sensor / OBD-II vehicle becomes a single INSERT into this table — no firmware change required as long as the conversational pattern matches one of the four baked-in sequencers (BMS_JBD, OBD2_CAN_11BIT, J1939_REQ_PGN, ISO_TP). What's in this PR: - New model `asset.peripheral.vendor` with fields per §17.7: peripheral_kind, vendor_name, vendor_model, transport, sequencer, safe_id_mask (Binary), extraction_blob (Binary), sample_period_ms, map_version, dry_run, crc32, notes. CRC-32 is a computed/stored field via @api.depends — Postgres holds it, so the firmware-side validator can compare against the column directly without re-running the hash server-side. Sequencer/transport compatibility constraint rejects obvious configuration errors at write-time: OBD2 on UART, ISO_TP as a top-level sequencer, etc. Not exhaustive — firmware is still the final arbiter — but catches the cases an admin can fix in the UI. Per-company isolation: company_id Many2one with UNIQUE constraint on (company_id, peripheral_kind, vendor_name, vendor_model). Multi-tenant by default. - Security ACL rows for group_system / group_asset_admin / read-only for base.group_user (matches the pattern used for asset.type, tag, ble.token). - View XML (list + form + search + action) staged in `views/asset_peripheral_vendor_views.xml`. NOT registered in the manifest yet — the addon's existing pattern is "views are TODO" (see manifest comment line 31). Wired up once the standalone-view infrastructure lands. - Five unit tests covering CRC-32 correctness, recompute on blob change, sequencer/transport rejects, JBD-multi-transport accepts, duplicate vendor row rejection, and forward-compat get_map_payload() key set for the Phase 5b-b serializer. Manifest bumped 18.0.2.2.0 → 18.0.2.3.0. Tests not run locally — Docker daemon was down. Syntax-checked Python + XML + CSV cleanly. CI in the preview env will exercise the test suite. Open work (Phase 5b-b, separate PR): - TPDF map-blob byte serializer (matches firmware bit_codec/terra_v1 layout in `Wasp/TERRA_MQTT_PROTOCOL.md` §17.2). - Push the map via the existing 0x30 Config packet on MQTT CONNECT. - Hook on `asset.iot.device` connect events. Co-Authored-By: Claude Opus 4.7 lastCommitSHA: 8c61f87baf83906a5a553d5e443535dd5d211c43 message: 'Tasks Completed: 1 (Failed: 0, Cancelled 0), Skipped: 0' pipeline: greencapitaltrade/bifrost/main releaseNotesURL: https://github.com/greencapitaltrade/bifrost/releases/tag/v6.72.0 startedTimestamp: "2026-05-30T09:12:24Z" status: Succeeded steps: - kind: Stage stage: completedTimestamp: "2026-05-30T09:17:01Z" name: from build pack startedTimestamp: "2026-05-30T09:12:38Z" status: Succeeded steps: - completedTimestamp: "2026-05-30T09:12:55Z" name: Git Clone startedTimestamp: "2026-05-30T09:12:38Z" status: Succeeded - completedTimestamp: "2026-05-30T09:12:58Z" name: Next Version startedTimestamp: "2026-05-30T09:12:56Z" status: Succeeded - completedTimestamp: "2026-05-30T09:13:01Z" name: Jx Variables startedTimestamp: "2026-05-30T09:12:59Z" status: Succeeded - completedTimestamp: "2026-05-30T09:13:02Z" name: Setup Npm Nexus startedTimestamp: "2026-05-30T09:13:02Z" status: Succeeded - completedTimestamp: "2026-05-30T09:13:04Z" name: Setup Pip Cache startedTimestamp: "2026-05-30T09:13:02Z" status: Succeeded - completedTimestamp: "2026-05-30T09:13:05Z" name: Process Config Templates startedTimestamp: "2026-05-30T09:13:04Z" status: Succeeded - completedTimestamp: "2026-05-30T09:13:05Z" name: Update Fleet Management Version startedTimestamp: "2026-05-30T09:13:05Z" status: Succeeded - completedTimestamp: "2026-05-30T09:13:07Z" name: Check Registry startedTimestamp: "2026-05-30T09:13:05Z" status: Succeeded - completedTimestamp: "2026-05-30T09:15:51Z" name: Build Container Build startedTimestamp: "2026-05-30T09:13:08Z" status: Succeeded - completedTimestamp: "2026-05-30T09:16:07Z" name: Promote Changelog startedTimestamp: "2026-05-30T09:15:52Z" status: Succeeded - completedTimestamp: "2026-05-30T09:16:10Z" name: Promote Helm Release startedTimestamp: "2026-05-30T09:16:08Z" status: Succeeded - completedTimestamp: "2026-05-30T09:17:01Z" name: Promote Jx Promote startedTimestamp: "2026-05-30T09:16:11Z" status: Succeeded - kind: Promote promote: environment: staging pullRequest: pullRequestURL: https://github.com/greencapitaltrade/mcu/pull/4035 startedTimestamp: "2026-05-30T09:16:39Z" status: Succeeded startedTimestamp: "2026-05-30T09:16:39Z" status: Succeeded - kind: Promote promote: environment: production pullRequest: pullRequestURL: https://github.com/greencapitaltrade/mcu/pull/4036 startedTimestamp: "2026-05-30T09:16:58Z" status: Succeeded startedTimestamp: "2026-05-30T09:16:58Z" status: Succeeded version: 6.72.0 status: {}