Skip to content

release: Fleet-Ops v0.6.67 - #326

Merged
roncodes merged 4 commits into
mainfrom
release/v0.6.67
Sep 17, 2026
Merged

roncodes merged 4 commits into
mainfrom
release/v0.6.67

Conversation

@roncodes

Copy link
Copy Markdown
Member

Summary

  • open the Fleet-Ops v0.6.67 release branch
  • synchronize the extension, frontend package, and API package versions
  • telematics reliability for Safee / DSCO and AFAQY, plus opt-in dedicated telematics queue workers

Release work

  • Safee / DSCO polling moves to cached inventory plus batched last-state requests (up to 1,000 vehicles each) through the shared durable ingestion pipeline, replacing three sequential enrichment requests per vehicle
  • Safee OAuth tokens are cached encrypted and refreshed, with a shared 50-requests-per-second budget and Retry-After handling
  • poll attempts stay within the 90-second Redis reservation; previously queued SyncTelematicDevicesJob runs hand off to bounded polling
  • scheduled poll retries back off at most 60 seconds, and paused batch providers no longer queue failing legacy syncs
  • polled units without a valid fix are counted in invalid_count without quarantining deliveries or marking runs partial
  • partial messages no longer overwrite an existing device internal_id
  • AFAQY cached-token recovery, shared request deadlines and a device_events UUID lookup index
  • TELEMATICS_BROADCAST_QUEUE, and SyncTelematicDevicesJob / TestTelematicConnectionJob following TELEMATICS_POLL_QUEUE; setup in docs/TELEMATICS_QUEUES.md
  • telemetry status layout on connection details and a Radar widget route fix

Commits

  • d9a9a5c: AFAQY reliability, provider-neutral polling and ingestion, Safee batch sync, UI (Codex)
  • 5528e05: Safee recovery fixes, no-fix accounting, dedicated telematics queues and docs (Claude)
  • ea05b2a: version bump and release notes

Validation

  • Before the commits were split, all 460 backend test files were run one file at a time; all passed except one AFAQY source-text assertion, which is updated in 5528e05. The suite was not re-run on the final commits, so rely on CI.
  • Local stack, single default worker: 5 scheduled Safee sweeps of a 93-vehicle fleet used 7 API requests (1 token, 1 list-info, 5 last-state), and each run completed with 91 applied and 2 vehicles without a fix.
  • Not yet validated in production or with multiple telematics workers.

Deployment notes

  • Run migrations (adds the device_events UUID lookup index).
  • Restart queue workers (php artisan queue:restart) and reload Octane.
  • Dedicated telematics workers are opt-in; follow docs/TELEMATICS_QUEUES.md and start the workers before setting the queue variables.

…c work

AFAQY reliability and incident corrections:
- Recover unreadable disposable cached tokens under the account lock and
  authenticate again without resetting stored credentials or unrelated secrets.
- Share an aggregate request deadline across authentication, refresh, and
  Units List retrieval; expose bounded request and ingestion batch settings.
- Add an idempotent device_events UUID lookup index to avoid full-table scans
  during model refresh and activity logging.
- Persist discovery phases and progress counters while ingestion is running,
  and isolate inventory records without valid positions from valid neighbors.
- Shorten telemetry scheduler overlap leases and keep dispatch recoverable
  after broker failures and interrupted scheduler processes.

Provider-neutral polling and ingestion:
- Let opted-in providers use the shared durable telemetry path for manual
  synchronization, including previously queued discovery jobs.
- Bound polling attempts below the baseline Redis reservation interval, retain
  a fixed retry deadline, and distinguish ingestion waits from failed attempts.
- Associate manual progress and completion with the matching ingestion run so
  an older run cannot finalize a newer synchronization request.
- Checkpoint encrypted delivery tails and accumulated item outcomes, yielding
  long batches for continuation through the existing inbox drain/default queue.
- Keep transiently failing enabled integrations eligible for scheduled recovery.

Safee / DSCO implementation in progress:
- Replace routine per-vehicle last-info, positions, and events enrichment with
  cached inventory and live last-state batches of at most 1,000 vehicle IDs.
- Validate successful response envelopes and canonical unit identities; retain
  missing individual states as explicit invalid-position results.
- Add encrypted credential-scoped OAuth caching, expiry-aware refresh, bounded
  transport deadlines, a shared 50-request-per-second budget, and Retry-After.
- Normalize source timestamps and available telemetry through the shared
  ingestion contract; keep explicit enrichment/history APIs separate.
- Register Safee durable polling configuration and document the API contract,
  measured read-only request timings, rollout considerations, and limitations.

Interface and test support:
- Place live telemetry inside the details-page spacing and use a compact
  responsive label/value grid, smaller actions, and collapsible setup/failures.
- Resolve the radar link correctly in both host and mounted-engine contexts.
- Add Laravel encryption test support and regression fixtures for token recovery,
  migration behavior, mixed fleets, manual polling, and delivery continuation.

Validation and unfinished work:
- Latest recorded Safee contract tests: 26 tests / 118 assertions passed.
- Latest recorded Safee provider tests: 6 tests / 126 assertions passed.
- Latest recorded manual polling tests: 14 tests / 73 assertions passed.
- Safee database ingestion: 6 tests / 31 assertions, with one known failure:
  an omitted internal_id still overwrites the existing device identity.
- Final checkpoint tests, broader shared-provider regressions, and live Safee
  execution on the single default worker remain unfinished. Read-only API
  timings and fewer requests do not establish end-to-end throughput.
- This commit preserves the requested work for continuation and review; the
  unfinished Safee path must not be represented as fully validated for release.
Safee / DSCO polling
- Pausing a batch-only provider (SAFEE_POLLING_ENABLED=false) no longer
  queues legacy discovery jobs that fail every minute.
- Legacy discovery jobs redirected to batch polling exit quietly when polling
  is paused or already queued, instead of marking the connection as errored.
- Scheduled poll retries back off 15/30/60/60 seconds so a transient login or
  TLS timeout cannot suppress minute polling; manual syncs keep 15/60/180/300.
- Polled units without a valid fix are counted in invalid_count but no longer
  quarantine the delivery or mark the run partial. Pushed deliveries still do.
- Partial messages no longer replace an existing device internal_id with the
  external ID fallback.

Dedicated telematics queues (opt-in, per instance)
- TELEMATICS_BROADCAST_QUEUE routes device, vehicle and trailer location
  broadcasts created by telematics ingestion. Unset keeps the default queue.
- SyncTelematicDevicesJob and TestTelematicConnectionJob follow
  TELEMATICS_POLL_QUEUE like polling already did.
- docs/TELEMATICS_QUEUES.md covers worker setup, rollout, sizing and rollback.

Tests
- Regression tests for paused providers, redirect handling, scheduled backoff,
  no-fix accounting and queue routing; outdated Safee and AFAQY assertions
  updated to the new contracts.
- Local run on the single default worker: 5 Safee sweeps of 93 units used
  7 API requests, each run completed with 91 applied and 2 without a fix.
- Replace the Safee token-retry loop with an explicit single refresh so the
  unreachable "rejected the refreshed access token" throw is removed; a second
  401 still fails as an unsuccessful response.
- Cover Safee cursor/filter validation, data and token connection failures,
  static tokens without refresh credentials, and missing credentials.
- Cover expired scheduled polls, manual polls releasing on a held poll lock,
  superseded manual jobs, stale connections in queueTelemetrySync, and
  malformed delivery checkpoints.
@codecov

codecov Bot commented Sep 17, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (0424783) to head (ea06b4a).

Additional details and impacted files
@@             Coverage Diff              @@
##                main      #326    +/-   ##
============================================
  Coverage     100.00%   100.00%            
- Complexity     11709     11887   +178     
============================================
  Files            581       582     +1     
  Lines          44307     44715   +408     
============================================
+ Hits           44307     44715   +408     
Flag Coverage Δ
backend 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@roncodes
roncodes merged commit 14601ca into main Sep 17, 2026
11 checks passed
@roncodes
roncodes deleted the release/v0.6.67 branch September 17, 2026 08:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant