Commit graph

53 commits

Author SHA1 Message Date
kianiadee
3bd9ee07cd Top-bar vehicle finder: search -> match filters, fly, open trips
Some checks failed
build / lint-test (push) Has been cancelled
build / build-push (push) Has been cancelled
Adds a searchable single-select vehicle/plate pulldown. Picking a vehicle
sets the cost-centre & assigned-city filters to match, frames its day's
route on the map, and opens its trip dock. Backed by a persistent session
registry so every vehicle stays findable after a filter narrows the view.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 18:00:39 +03:00
kianiadee
4632990143 Geocoder circuit breaker + invalid-input regression tests
Geocoder trips open after N consecutive Nominatim failures and skips ticks
for a cooldown, instead of grinding the whole batch 1 req/sec on every tick.
Adds tests for _coerce_payload (malformed JSON degrades to {_raw}) and
parse_raw tolerating a malformed payload.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 18:00:39 +03:00
kianiadee
7d250e120d Fix map starburst: filter LBS/WIFI + primary IMEI in track builders
serve.fn_vehicle_trips now restricts to the vehicle's primary tracker IMEI
(was: all devices, interleaving multi-tracker/camera streams) and excludes
low-accuracy LBS/WIFI fixes; serve.fn_vehicle_day_track excludes the same.
Both produced straight-line spikes ('starburst') from parked vehicles.
NULL pos_type (push/crossfeed GPS) is kept. Applied to prod 2026-05-29.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 18:00:39 +03:00
kianiadee
34afe60927 Guard day_track call with function-existence check (order-independent deploy)
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 10:32:59 +03:00
kianiadee
e89d8ed821 Continuous day-track line under per-trip segments
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Trip days split on reporting gaps rendered as disconnected coloured segments. Add serve.fn_vehicle_day_track (one primary-device LineString for the EAT day), merge it into the trips API as day_track, and draw it as a faint base line beneath the per-trip colours so the route reads as one continuous drive.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 10:31:52 +03:00
kianiadee
0724dd017f Fix map breakage: zoom expr can't be nested in a case (circle-stroke-width)
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
The low_accuracy ring nested a zoom interpolate inside a case, which MapLibre rejects at addLayer — the vehicles-circle/arrow/label layers never loaded, so no markers and no trip clicks. Move interpolate to top level with case in the output stops.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 10:07:42 +03:00
kianiadee
84e9421b4d Self-host MapLibre; de-dupe position_history
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
- Vendor maplibre-gl 4.7.1 (js+css) and serve from /vendor instead of the unpkg CDN — no external dependency/SRI gap for the core map.

- Projector skips duplicate (imei, occurred_at) history rows via NOT EXISTS (parked devices re-report the same gpsTime each poll); migration 23 dedupes existing rows and adds a unique index.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 03:41:34 +03:00
kianiadee
558f095392 Trip dock: default date to vehicle's last-active day; UI review fixes
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
- Plain click defaults the trip date to the vehicle's most recent fix day (no more empty 'today' at night); manual date picks are respected.

- Animated trip path/marker now use the trip's palette colour (matched the card).

- Filter dropdown skips no-op rebuilds on the 15s refresh and won't rebuild under an open popover.

- applyClientFilter: drop redundant length>0 guard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 03:36:33 +03:00
kianiadee
d410216a4d Revert to Coolify source-build (drop registry-image pull)
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
The registry-image route needed a working CI runner + owner-namespaced registry push; not worth it for a cosmetic image_sha. Coolify builds from the connected repo as before.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 02:57:57 +03:00
kianiadee
6dc63e0720 Merge branch 'chore/registry-image-deploy'
Some checks are pending
build / build-push (push) Blocked by required conditions
build / lint-test (push) Successful in 38s
2026-05-29 02:46:56 +03:00
kianiadee
478300611f CI: install node+git in slim container so actions/checkout can run
Some checks failed
build / lint-test (push) Successful in 1m10s
build / build-push (push) Has been cancelled
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 01:25:37 +03:00
kianiadee
cf747d3efe Fix CI lint failures so build-push can run and push an image
Some checks failed
build / build-push (push) Blocked by required conditions
build / lint-test (push) Failing after 6s
ruff: drop stale SLF001 noqa, wrap json.load in a context manager (SIM115), remove unused imports + placeholder-less f-strings; ignore PLR0912/PLR0915 for one-off scripts.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 01:11:19 +03:00
kianiadee
aefebc565b Deploy by pulling CI-built registry image (so /health reports real SHA)
NOT deployable until CI build-push actually pushes an image to the registry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 01:08:26 +03:00
kianiadee
1fc83dcac9 Revert "Bake git SHA into image so /health reports it under Coolify source builds"
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
This reverts commit 5c07499e99.
2026-05-29 00:58:56 +03:00
kianiadee
6c80bbfc8c Add low_accuracy flag to live view + amber ring/popup for LBS/WIFI fixes
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 00:42:00 +03:00
kianiadee
5c07499e99 Bake git SHA into image so /health reports it under Coolify source builds
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 00:39:07 +03:00
kianiadee
9c7b69e395 P1-b: don't let LBS/WIFI fixes overwrite a fresh GPS fix in live view
Some checks are pending
build / build-push (push) Blocked by required conditions
build / lint-test (push) Waiting to run
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 00:13:55 +03:00
kianiadee
6eb6b4716c Fix camera/tracker dedup (device_type at provision + backfill) and finish refresh-token flow
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 00:08:56 +03:00
kianiadee
cbf40bd32a Add web/status.html — full project status / docs page
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Single self-contained HTML doc covering:
  - Headline metrics + timeline
  - All capabilities live today (map, filters, trip dock, auth)
  - Architecture (3 roles, data flow ASCII diagram)
  - Coolify deployment notes + the migration apply gotcha
  - Data model (events/state/domain/serve/slo/ops/auth schemas)
  - API endpoints
  - All 20 migrations
  - Trip detection algorithm + calibration table
  - Known issues
  - P1-P4 roadmap
  - Push receiver cut-over plan (P3 scope, what's built, what's needed)
  - Decisions log

Served at /status.html alongside the dashboard.
2026-05-28 02:45:00 +03:00
kianiadee
281a5ec634 Per-trip colour coding in single-vehicle mode
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
When viewing one driver's day, each trip is drawn in its own colour
from a 12-colour palette (cycling past 12). The matching colour shows
as the left edge of the trip card so card ↔ polyline pair up at a
glance.

Trip selection moves from border-swap to an outline, so the
trip-colour swatch stays visible when a card is selected.

Multi-mode (>1 vehicle) still uses per-vehicle SELECTION_PALETTE so a
fleet comparison reads as one colour per driver.
2026-05-27 23:31:57 +03:00
kianiadee
c7369caf71 Trip panel: multi-vehicle overlay + aggregate KPIs (⌘-click to compare)
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Plain-click on a vehicle marker: single-vehicle mode, full trip-card
list, click a card → animated playback (unchanged behaviour).

⌘/Ctrl/Shift-click: add/remove the vehicle from the selection. Each
selected vehicle's day routes are drawn on the map as a polyline in a
distinct colour from an 8-colour selection palette. Trip dock switches
to a compact per-vehicle row layout with ✕ remove buttons; the header
shows aggregate trip count + distance + drive / idle / stop minutes
summed across the selection.

Date change re-fetches every selected vehicle; CSV button downloads one
file per selected vehicle. Map auto-fits to the union of bounds.

Click a vehicle row in multi-mode → map flies to just that vehicle's
trips. Removing the last vehicle empties the dock; the X button closes
it entirely.

Internals: replaced singular `_tripState` with a `_selection` Map keyed
by vehicle_id. Single-trip animation layers still exist for the
single-mode trip-card playback; multi-mode uses per-vehicle line-only
layers (vroute-line-{id}) with no marker animation.
2026-05-27 23:24:12 +03:00
kianiadee
f47d3dc118 Coolify compose: attach gateway to coolify external network
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Traefik runs on the `coolify` shared network. Without the gateway also
being on it, Traefik logs "Could not find network 'coolify' for
container, defaulting to first available" and picks an IP on the
project-local network it can't reach → intermittent 504 Gateway Timeout
(30s) in the browser.

Hot-patched the running container via `docker network connect coolify`;
this commit makes the fix permanent so the next Coolify redeploy doesn't
reintroduce the regression.

Worker and cron don't need it — they don't serve external HTTP.
2026-05-27 22:56:31 +03:00
kianiadee
4100002b4e Lighter basemap (Positron) + Fireside HQ POI marker
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
- Basemap switched from dark-matter to Positron — light grey, minimal,
  higher contrast for the cost-centre coloured markers.
- HQ POI: red dot + soft halo + 'Fireside Group HQ' label at
  -1.24089, 36.72880. Layered above vehicles so it stays visible when
  vehicles park there.
- Flipped vehicle plate-label colours to dark text + white halo for
  readability on the light map (was light-on-dark).
2026-05-27 22:26:52 +03:00
kianiadee
cba1a3b044 Strip SLO from frontend: remove _renderSlos, sloRoot param, slo-* CSS,
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
and the 'Stale' tile (which was derived from the SLO freshness count).
Backend still computes slo_status for future use; UI just ignores it.
2026-05-27 22:14:24 +03:00
kianiadee
de34103f18 UI tweaks + city case fix
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
- Migration 20: collapse `Nairobi`/`nairobi` in domain.vehicles → 'nairobi'
- Remove the SLO panel from the top band (filter + tile rows stay)
- Offline vehicles render as solid grey instead of dim-cost-centre tint;
  opacity now only differentiates moving (1.0) vs parked (0.75) vs
  offline (0.55) so colour carries identity + state cleanly
2026-05-27 22:07:03 +03:00
kianiadee
20958c0293 UI: top-band layout + bottom trip dock + multi-select filters + always-on tint
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Restructure:
  - FLEET NOW tiles + SLOs + Filters in a horizontal top band; full-width map
  - Trip panel moved to a bottom dock that slides up; trips render as a
    horizontally-scrollable card strip instead of a vertical right-panel list

Multi-select filter widgets:
  - cost_centre + assigned_city are now dropdowns with an "All …" toggle
    and per-option checkboxes
  - cost_centre options carry a colour swatch matching the marker tint —
    the filter doubles as a live colour legend
  - Server-side filter still applies when exactly one option is picked;
    multi-selection within a widget is narrowed client-side via setFilter
    so the existing serve.fn_live_view contract is unchanged

Cost-centre tint always visible:
  - circle-color now uses cost_centre_color unconditionally
  - operational_state is shown via opacity (moving=1.0 / parked=0.7 /
    offline=0.35), keeping colour as a stable identity cue

applyClientFilter() is a new exported helper called by the page after
each refresh to narrow markers by multi-selection state.
2026-05-27 21:56:53 +03:00
kianiadee
66e1d94b81 Coolify compose: attach to DB's project network (bo3nov...) so the
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
`timescale_db` alias resolves. Without this the new app's PG pool
times out — DB only has the alias on its own project network, not on
`coolify` shared.
2026-05-27 20:56:04 +03:00
kianiadee
0a47d738c4 Add docker-compose.coolify.yml for Coolify-managed deployment
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Three services (gateway/worker/cron) from one build, env-driven, no
explicit Traefik labels (Coolify generates them from the Domain
setting). Replaces the manual `docker run` containers that have been
running since the first VPS deploy.
2026-05-27 15:00:25 +03:00
kianiadee
0265477f46 fix: fn_vehicle_trips takes bigint (domain.vehicles.vehicle_id is bigserial)
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
PG function overloading is type-strict: integer→bigint isn't implicit. The
prior signature (integer, date) didn't match callers passing vehicle_id
directly. Also prepends a DROP for the integer-signature in case the
previous migration ran and left a now-orphan function around.
2026-05-27 14:36:45 +03:00
kianiadee
9393491869 Trip panel UI: click vehicle → side panel, trip list, animated playback
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Click any vehicle on the map to open a 360px slide-in panel showing:
  - reporting time (first ACC_ON of the day)
  - day totals: trip count, distance, drive/idle/stop minutes
  - per-trip rows with start/end/duration/distance/idling, click to
    select; selected trip renders its polyline + animates a marker
    along it over 10 seconds
  - end-reason badge per trip (work stop, reporting silence, long gap,
    day end) with colour-coded accent
  - date picker (defaults to today EAT)
  - CSV download button → /trips.csv?date=...

Map clicks query rendered features across circle/arrow/label layers and
take the topmost — single click handler, no per-layer duplicates. The
existing hover popup remains untouched.

Wraps #map in #map-container so the panel can absolute-position over
the right side without disturbing the existing left-aside grid layout.
authClient gets a getToken() helper so the CSV download path can attach
the Authorization header for a plain fetch (apiFetch returns JSON only).
2026-05-27 14:14:06 +03:00
kianiadee
7d63c03191 Trip detection: add nofix_stop rule (5-min reporting silence ends trip)
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Calibrated against a full-day legacy report for vehicle KDE 638J:
without this rule we collapsed 15 dispatcher-visible trips into 3
(the algorithm waited for explicit ACC_OFF + stationary fixes that never
came in the polled data — the device just stops reporting between trips).

New rule: if mid-trip and the next fix arrives >=5 min after the previous
one (but <=30 min, which is still long_gap), close the trip at the prior
fix with end_reason='nofix_stop'.

Validation:
  638J full day: legacy 15 trips, mine 15 trips, perfect alignment
  728K half day: legacy 33 noisy trips, mine 9 clean trips
                 (stop-and-go traffic still consolidates because fixes
                  keep coming, just slow/stationary — not silence)

Also commits scripts/simulate_trips_from_legacy.py which runs the same
state machine in Python against REPORTS/*.json dumps for offline tuning.
2026-05-27 12:57:01 +03:00
kianiadee
419c030761 Trip detection backend: serve.fn_vehicle_trips + JSON/CSV endpoints
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Migration 19: serve.fn_vehicle_trips(vehicle_id, date) — PL/pgSQL state
machine that walks state.position_history for one vehicle on one EAT day
and emits the trip breakdown. Rules:

  - reporting_time = first ACC_ON of the day
  - trip starts at ACC_ON (or first fix if already ACC_ON / moving)
  - trip ends:
      * ACC_OFF + stationary (<5 km/h) for >=5 min  → end_reason 'work_stop'
      * fix gap >30 min                              → end_reason 'long_gap'
      * end of day's data                            → end_reason 'day_end'
  - within a trip, ACC_ON + stationary >=5 min is logged as an idling
    segment (no trip split — engine still on)
  - distance only accumulates when speed >= 5 km/h (excludes GPS jitter)
  - falls back to movement-only segmentation when acc_state is null
    across the day (has_acc_data=false in the response)

Returns one jsonb document: vehicle, date, reporting_time, day totals
(distance, driving/idling/stopped/unknown minutes), data_quality flags,
trips[] with start/end/duration/distance/idling/end_reason/stops/path
where path is a GeoJSON LineString ready for the map.

New endpoints (read:fleet, rate-limited):
  GET /api/views/vehicle/{id}/trips?date=YYYY-MM-DD       JSON
  GET /api/views/vehicle/{id}/trips.csv?date=YYYY-MM-DD   one row per trip

Defaults date to today in EAT (UTC+3) regardless of host TZ.
2026-05-27 12:24:00 +03:00
kianiadee
26ce35e8eb UX: zoom-scaled vehicle markers + hide labels at city overview
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
At z=10 (Nairobi overview) the constant 13px circles + always-on plate
labels overlapped into an unreadable blob. Markers now interpolate
across zoom:

  circle:  2px @ z5 → 7px @ z12 → 13px @ z15 → 20px @ z18
  arrow:   0.2 @ z5 → 0.45 @ z12 → 0.7 @ z15 → 1.0 @ z18
  label:   minzoom 11; text 8px @ z11 → 14px @ z17

text-offset is in ems so it scales with text-size automatically.
2026-05-27 12:07:50 +03:00
kianiadee
0f91668256 Contract checker (#13, PRD F1.10) + contract_drift_days SLO
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
Migration 18: ops.contract_check_log table — append-only log of probes
against the Tracksolid Pro endpoints we depend on.

New worker app/workers/contract_check.py — per run:
  - jimi.oauth.token.get   (token refresh succeeds)
  - jimi.user.device.location.list per configured target (parse first item
    with JimiPollFix)
  - jimi.device.location.get with a sample IMEI from the list (parse first
    item with JimiPollFix)
Each probe logs success or {error_class, error_detail, sample}; failures
are recorded, not raised.

slo_metrics now also computes contract_drift_days = days since the most-
recent successful probe of the laggard endpoint. With threshold 1d (from
mig 5), a single failed daily run flips the badge red within 24h.

cron entrypoint registers the check daily at 02:00 UTC plus once on
startup, gated on TRACKSOLID_APP_KEY + a configured target.
2026-05-27 11:58:29 +03:00
kianiadee
495bb2bd71 Rollback CSV roster import (mig 17): re-split vehicles, drop CSV columns
Some checks failed
build / lint-test (push) Has been cancelled
build / build-push (push) Has been cancelled
The CSV-based roster import (mig 15+16 and scripts/import_csv_roster.py)
merged vehicle rows that differed only by _Track / _CAM suffix, dropping
the active fleet count from 144 to 124. Reverting the whole thing.

Mig 17 in one transaction:
  - Re-splits devices by parsed plate from device_name (same regex as
    mig 14, preserving _Track as separate vehicle)
  - Restores serve.fn_live_view to its v3 body (no d.driver_name/phone
    refs that would break once the columns are gone)
  - Drops the six CSV-only columns from domain.devices
  - Deletes schema_migrations rows for the deleted 15/16
  - Logs final counts via RAISE NOTICE

Apply on VPS: psql -f db/migrations/20260601000017_rollback_csv_import.sql
2026-05-25 00:41:32 +03:00
kianiadee
4cc0ef0535 Roster import: COALESCE-fill API-managed fields (device_type/lifecycle/activation_at/model) on existing rows; CSV is authoritative only for driver/phone/iccid/expiration/device_group
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-24 03:59:32 +03:00
kianiadee
6fd0d84560 Plate consolidation migration + projector links new devices to existing plates; SLO measurement worker (task #12)
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 23:42:45 +03:00
kianiadee
8323f94a19 _driver_name: also exclude garage/workshop/service placeholders
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 23:16:17 +03:00
kianiadee
9852eff985 Popup: pre-emptive driver-name extraction from device_name (until P3 roster lands)
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 23:13:46 +03:00
kianiadee
2b428e8058 Migration: serve._label_short() extracts plate-tail (handles 'Driver - KDW 573B_cam' patterns)
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 23:11:20 +03:00
kianiadee
45974b3810 Geocoder: cron job + state.geocoded_positions; label uses device_name last 4 (fallback plate); popup address row
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 23:06:25 +03:00
kianiadee
6c5ba3b22b UI: arrow + plate-short label + cost-centre marker palette + hover popup; richer state.live_positions + serve.fn_live_view v2; multi-target poll plumbing
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 09:29:04 +03:00
kianiadee
13a4c17d80 Parser: tolerate real Tracksolid wire shape (imei/speed names, null gpsTime for offline devices) + per-item resilience
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 09:05:17 +03:00
kianiadee
4924552c7f Add Tracksolid polling worker + auto-provisioning projector + result-key parser support
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 08:59:27 +03:00
kianiadee
6dcfaffb7c Gateway: serve web/ at root via StaticFiles; redirect / to /index-live.html
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 01:35:13 +03:00
kianiadee
0fb24a8ade listener: use psycopg notifies(timeout=) instead of wait_for(anext()) to fix spurious StopAsyncIteration
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 01:20:43 +03:00
kianiadee
1dcfe9b773 Dockerfile: copy app/ + README before pip install for hatchling metadata
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 01:16:10 +03:00
kianiadee
a40c6838d9 README: note CI live
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 01:12:36 +03:00
kianiadee
c3c884f4eb Add workflow_dispatch trigger
Some checks failed
build / lint-test (push) Failing after 4s
build / build-push (push) Has been skipped
2026-05-23 01:06:18 +03:00
kianiadee
20cd8b3488 Trigger CI with working runner
Some checks are pending
build / lint-test (push) Waiting to run
build / build-push (push) Blocked by required conditions
2026-05-23 01:04:37 +03:00