إنتقل إلى المحتوى الرئيسي

سجل التغييرات

تاريخ موجز للتحديثات الموثقة.

[غير منشور]

Company-controlled reservation review and fail-closed fulfillment — 2026-08-25

  • Added a versioned per-Company AUTO_CONFIRM/MANUAL_CONFIRM policy with a bounded review window and explicit traveler channels. Existing and newly provisioned Companies keep the backward-compatible automatic default until an Owner or Admin opts into review.
  • Separated a submitted reservation from travel fulfillment. Manual bookings reserve inventory and create Passenger × Journey Leg Ticket records, but the records contain no QR payload, HMAC signature, boarding timestamp, or downloadable confirmation until every required operator approves.
  • Centralized boarding eligibility in one fail-closed database predicate. A Journey is boardable only when its aggregate is confirmed and the exact expected Ticket set is present, signed, and in a boardable state; Journey Orders require every child Journey to pass the same predicate.
  • Added tenant-scoped, role-checked and idempotent approval/rejection commands, deadline expiry, inventory reconciliation, immutable audit evidence, traveler and operator notification events, Customer Web/mobile pending states, Driver manifest separation, and Company settings/workspace controls.
  • Made mixed-version rollout safe. If an older backend omits confirmation state, the Dashboard renders an explicit unavailable state and disables ticket/PDF issuance instead of crashing or assuming approval. Confirmed connected Journeys cannot fall through to the legacy single-row cancellation RPC; operators are directed to the Trip operations workflow so aggregate Tickets, inventory, Orders, and documents cannot diverge.
  • Closed the direct-Booking compatibility seam with an ordered canonical projection. Legacy office/reseller/admin writes now enter the same manual review lifecycle, cannot retain a premature Ticket credential, and do not emit a stale segment-level confirmed notification. Internal no-policy helpers are service-only.
  • Kept rejected or expired never-issued Tickets credential-free. A new forward migration prevents terminal-state changes from minting a signature, while a validated constraint requires every genuinely boardable Ticket to have a signed payload and authorization timestamp. Previously issued cancellations retain their signed terminal-state audit record.
  • Local release evidence currently includes all 49 PostgreSQL contracts, the green runtime schema/security audit through migration 00307, Customer Web 3,284 tests, Dashboard 3,691 tests, Customer mobile 1,472 tests, Driver mobile 610 tests, both Flutter analyzers, workspace type checking, and formatting. Real local Chromium flows prove Company policy persistence/restoration and the Customer pending-to-confirmed QR/tracking gate. Production-configured, self-contained Flutter Web artifacts for Customer and Driver both render a real phone-width first frame with no browser failures. The separate Supabase function lint still reports 11 documented pre-existing legacy procedure defects.
  • Deployed migrations 0030500307 and application commit 7e346bf3 to the production server. A rollback-only production lifecycle contract and the complete runtime schema/security audit passed, all four changed containers became healthy through the zero-downtime rollout, and the seven-surface production Chromium suite passed without responsive, console, page, or HTTP failures. Protected credentialed browser mutation remains intentionally separate from this evidence; production QA secrets were not exported from the server.

Capability-scoped Driver Web security headers — 2026-08-25

  • Closed a production verification finding where location-level Nginx cache headers caused the Driver Flutter surface to omit its inherited security headers. Every Driver shell, asset, CanvasKit, service-worker, and health response now includes the explicit hardened header snippet.
  • Added a Driver-specific CSP that supports self-hosted CanvasKit and Maps while excluding traveler-only Google authentication origins. Permissions Policy is least-privilege: camera and geolocation are available to the same origin for QR scanning and operations, while microphone access remains disabled.
  • Added production infrastructure contracts for header installation, non-root file access, bounded WebAssembly execution, forbidden unrestricted eval, and the exact Driver capability boundary.
  • Production Chromium then exposed a pre-runtime font seam: the Driver bootstrap gate used Flutter's default Roboto theme before the configured app was ready, which caused Arabic glyph fallback to request Noto Sans Arabic from fonts.gstatic.com. The gate now starts with the bundled Cairo theme, and the browser contract fails on any Google font or hosted CanvasKit request from either Flutter surface.

Deterministic shared date-control hydration — 2026-08-25

  • Made the shared React Aria date picker emit a deterministic, accessible server shell and activate its locale- and operating-day-dependent segments only after hydration. This prevents server/container time and browser time from producing different initial text while keeping the interactive calendar, RTL behavior, validation, presets, and non-native date-input contract unchanged.
  • Added a regression that crosses the Damascus operating-day boundary between server render and browser hydration, plus authenticated route coverage for the Company office-booking wizard. The focused test is also executed against an optimized Next.js build, not only the development renderer.
  • Made warned-Company deadline rendering explicitly use the Damascus operating timezone. The authenticated shell can now hydrate identically when the Next.js container renders in UTC and the operator's browser is already on the next Damascus calendar day; a dedicated warned-account hydration regression proves the exact boundary that production verification exposed.

Immutable PDF sharing and assigned-Driver delivery — 2026-08-25

  • Replaced customer-mobile text/URL sharing with native sharing of the actual immutable Booking confirmation or cancellation PDF. The client validates the MIME type, PDF signature, and bounded filename before handing bytes to the operating system, so every downstream channel receives the canonical server document instead of divergent passenger text.
  • Added assigned-Driver delivery of Booking confirmations from the manifest and settled cash receipts from the payment result. Server authorization derives the Driver and Trip assignment from the authenticated subject; Drivers cannot share invoices, documents for unassigned Trips, or receipts before collection is durably synchronized.
  • Implemented the secondary nearby-transfer flow as a one-document, one-use, five-minute grant. Its raw secret stays in the URL fragment, acceptance creates a path-scoped HttpOnly SameSite Strict session, the recipient sees a minimal preview before accepting, and the issuer can revoke the grant.
  • Kept transfer and boarding credentials separate. The transfer QR cannot be scanned for boarding or manage a Booking; the immutable confirmation PDF may contain the canonical signed Passenger × Journey Leg boarding QR and therefore carries an explicit sensitive-ticket warning.
  • Made delivery evidence two-phase: the service authorizes, renders and validates the immutable PDF, then rechecks expiry/revocation and records a checksum, byte count, renderer trace, and VIEW/DOWNLOAD event before returning bytes. Renderer failures therefore cannot produce false delivery records.
  • Added seven forward-only migrations and PostgreSQL contracts for storage, lifecycle, issuer isolation, role completion, revocation, and the two-phase delivery boundary. Grant and recipient-session deadlines are now computed by PostgreSQL from bounded TTL values, so container clock drift cannot extend or prematurely reject a transfer. Disposable demo teardown removes the exact share capability graph without weakening immutable audit events for real Companies. Issuer resolution now carries the canonical role as well: Company invoices and receipts require OWNER/ADMIN, operational staff stay within Booking documents, and platform SUPPORT cannot enter the issuance channel. A real Chromium flow now proves creation, anonymous preview, explicit acceptance, renderer-backed PDF download, and replay denial; it also guards the React Strict Mode fragment-handling race.
  • Final local evidence: all 48 PostgreSQL contracts and the runtime schema audit pass; customer web passes 3,273 tests, Dashboard 3,674, Admin 2,358, and the shared service layer 858; customer mobile passes 1,468 and Driver mobile 607. Monorepo type checking, Flutter analysis, linting, formatting, documentation quality, product standards, and brand audits pass together with the renderer-backed Chromium transfer.

Deterministic ecosystem inventory and enterprise edge-case baseline — 2026-08-25

  • Added a deterministic source inventory covering Next.js pages and API methods, resolved Flutter routes and screens, shared modules, migration declarations, background jobs, Compose services, Edge Functions, and explicit test roots. Documentation quality now fails when this generated evidence drifts.
  • Closed the route-manifest discovery gap for all currently resolved web and Flutter routes, including connected Journey checkout/tracking, customer legal and profile-completion flows, Driver demo/2FA routes, and the Admin Company detail page.
  • Repaired the customer-mobile station detail route so a refresh, copied URL, or native deep link resolves its city from the public directory instead of depending on ephemeral router state. Route-flow coverage now uses a real seeded city identifier, and the API contract and Flutter analyzer pass.
  • Added an official-source enterprise transport research baseline covering Trip-specific pickup changes, governed onboard sales, offline inventory, cash custody, ticket control, printer reliability, secure phone-to-phone delivery, trusted time, data lineage, and a centralized legal center.
  • Registered GS-01GS-13, E-01E-20, and PO-24 as independent acceptance items. A QR scan may grant an expiring copy of one document, but it can never silently transfer Booking ownership or expose a predictable public document URL.
  • Kept Phase 1 explicitly open: deterministic source coverage and the live database gate are complete, but per-capability dependency, runtime behavior, and user-experience verification are still required before the inventory gate can close.
  • Added a read-only runtime schema gate and used it against the local database. It found four client-granted tables with RLS disabled, 68 unpinned legacy security-definer functions, and one stale client ACL on service-only PII backfill state. Forward migrations now close those paths and reassert the non-writable public schema boundary.
  • Reconciled only the exact known release-candidate checksum pairs for migrations 0029200294, after reapplying their final Journey-session and deterministic Demo definitions. The migration runner still rejects every unknown checksum drift.
  • Verified matching local and production ledgers of 287 migrations, RLS on all 156 public tables, a healthy runtime posture, 720 valid indexes, 1,200 validated constraints, no unpinned security-definer functions, and all 46 PostgreSQL contracts in one session on each environment. Production also has one cash-only payment-policy row for each of its two Companies.
  • Made the live-schema report distinguish ShamBus application functions from extension-owned functions. Local and production now compare the same 473 application signatures even though local development installs 46 extension functions in public and production keeps extensions in their dedicated schema. The connected-operations contract now derives its temporary Driver's trusted tenant scope from the selected fixture Company, so internal/demo isolation is tested without manufacturing an invalid production identity.
  • Removed a second production-data dependency from the Journey discovery contract: the popularity API is a deliberate top-50 ranking, so an unranked temporary route is not guaranteed to appear when production has 148 eligible internal routes. The contract now verifies that every ranked result belongs to the caller's PUBLIC or INTERNAL inventory world, while exact fixture Trip visibility remains covered by the search and public-projection assertions.
  • Closed a live Company payment-policy completeness gap found by the production contract gate. Existing Companies are backfilled with one durable cash-only settings row, future Companies receive it automatically, core policy fields are non-null, and the contract creates its own Company to verify onboarding instead of relying on seed data.
  • Made the Traveler Journey cancellation contract create and confirm its own Journey, hold, Booking, Passenger, and Ticket aggregate. It no longer selects a production Booking that may already be in the immutable CANCELLED state, and it models a paid refund scenario without bypassing or weakening the Booking status-transition guard.
  • Made the Trip pickup contract create its own published PUBLIC Company, route, bus, mapped pickup point, Trip, Passenger, and Booking. Production's intended INTERNAL/DEMO-only QA inventory can no longer make a correct public-projection filter look like pickup snapshot loss, and the booked-pickup immutability assertion no longer depends on arbitrary seed data.
  • Deployed the customer Flutter Web station deep-link repair and the matching documentation through the zero-downtime production pipeline. A permanent read-only Chromium regression now opens a copied Damascus station URL with no router state, resolves live API data, verifies Cairo, rejects HTTP and console errors, and proves 390-pixel viewport fit. The complete seven-surface public browser matrix passes; physical Android and iOS deep-link behavior remains a separate device gate.

Actor-isolated seat locking and secure in-person document sharing — 2026-08-24

  • Split seat-lock throttling into a normal signature-verified Traveler budget and a broader public-IP abuse ceiling. Authenticated customers behind the same carrier-grade NAT no longer exhaust one another's seat-lock allowance, while guests, invalid credentials, and token rotation remain bounded.
  • Applied the same two-stage policy to every Booking/Journey creation boundary, including one-way, round-trip, batch, Journey Booking, and Journey Order confirmation. The normal 10/hour budget is actor-scoped after verified identity resolution, while a separate 100/hour public-IP ceiling preserves abuse protection for carrier-grade NAT, invalid credentials, and guests.
  • Strengthened the production booking contract to verify the authoritative single-owner lock invariant, discover and remove the complete Journey Ticket aggregate after each run, and isolate private production-QA inventory behind server-controlled account metadata.
  • Recorded a separate Document Share Grant for phone-to-phone delivery of an issued Ticket, reservation confirmation, Receipt, or Invoice. Its revocable, document-scoped QR is explicitly distinct from Booking access, account ownership, and the signed boarding credential.
  • Deployed commit d5dee13b through the zero-downtime production pipeline and passed the isolated Booking contract (8/8) followed by the complete guarded production suite (29/29). The live races produced one Seat Lock owner out of five sessions and one Booking out of six commands, with no incorrect capacity change; the post-run database audit found zero tagged QA Buses, Trips, or Bookings.

Journey ownership, deterministic demos, and responsive traveler inputs — 2026-08-24

  • Propagated an API-verified optional Traveler identity into one-way and round-trip atomic Journey confirmation through service-only database bridges. Invalid or expired Bearer credentials now return a stable 401 instead of being downgraded into guest checkout.
  • Added durable Journey sessions for legacy Booking aggregates, including a lifecycle trigger and safe backfill, so authenticated travelers can reopen a confirmed compatibility Booking from My Trips and receive its canonical Tickets and documents.
  • Made demo passenger launch select a future, actually bookable Stop Call pair backed by an active vehicle and open Seat inventory using the Damascus service date. Existing and newly provisioned isolated demo profiles are published for exact-tenant discovery without becoming public inventory.
  • Let active, unexpired demo Driver personas enter their isolated workspace without sharing a TOTP secret. Every operational Driver still receives the mandatory challenge and the mobile client accepts only the server's sealed demo-session response.
  • Prefilled only empty, untouched primary-traveler fields from the authenticated mobile profile and made the shared international phone control safe for that asynchronous update. User-entered values always win.
  • Compressed the traveler search form at phone widths and rebuilt the shared country selector as an LTR-safe trigger with a mobile bottom sheet, safe-area padding, accessible focus, and RTL/LTR-aware content.
  • Recorded the complete sequential enterprise implementation program, including trip-specific pickup/drop-off control, onboard walk-up sales, governed driver fares, Bluetooth printing, and one-time phone-to-phone QR ticket handoff.

Admin mutation integrity and self-contained Flutter web — 2026-08-24

  • Routed every protected Admin browser mutation through the shared CSRF client, including company moderation, feature flags, administrators, tickets, incidents, waitlist, push registration, settings, and seat locks. Added a source-level regression contract so a future raw mutation cannot silently omit the application-specific CSRF header.
  • Added the missing connected Admin company record at /companies/[id] with legal, contact, oversight, team, and operational-count context. The backing endpoint loads counts in parallel and preserves partial company data if one metric is temporarily unavailable.
  • Hardened Admin TOTP entry at both enrollment and login boundaries by normalizing Arabic-Indic and Eastern Arabic-Indic digits before fixed-width, timing-safe verification. Production audit evidence showed the reported 401 was followed by a successful challenge, while the input-boundary defect was repaired and regression-tested independently.
  • Made both Flutter Web releases self-contained: CanvasKit is emitted into the release image, the CSP permits only WebAssembly compilation rather than unrestricted JavaScript evaluation, and the bundled Cairo variable font is registered as the local Roboto fallback expected by the Flutter engine. Release-artifact checks confirm local renderer files and both font families.
  • Corrected the passenger web startup boundary found by the live Chromium gate: a missing Google OAuth client now disables only the optional Google action instead of throwing before runApp(). Signed Android and iOS releases still fail closed when their promised Google configuration is absent.
  • Removed the remaining Flutter Web runtime CDN dependency discovered by the production browser gate. Both mobile apps use Sentry's Dart transport to the self-hosted GlitchTip endpoint on web and retain the native crash SDK only on Android and iOS, so the strict CSP does not need to trust Sentry's JavaScript CDN.
  • Repaired the production Journey search-to-quote identity handoff that caused valid mobile selections to return 422 INVALID_LEG. Search results now expose the physical Stop and Trip-specific Stop Call separately, current clients use the explicit call identity, and the legacy id alias keeps already-cached clients compatible. A database regression now executes discovery and quote creation as one contract.
  • Reproduced the remaining production 422 against the exact Trip and Stop Calls in a rollback-only transaction. The records and inventory were valid; the quote function incorrectly rejected deterministic version-0 UUIDs used by the early QA seed. Quote validation now accepts every canonical PostgreSQL UUID bit pattern, and the atomic inventory contract uses that production ID shape permanently.
  • Added mutually exclusive marketplace scopes for real production, internal QA, and private demo inventory. Public users cannot discover or book internal/demo Trips; internal identities see the QA world; and each active demo identity is limited to its exact tenant. The boundary now covers authenticated search, restrictive RLS, Journey quote, and legacy seat/booking commands, with expiry and cross-tenant negative database tests. Traveler discovery additionally requires an active, published, non-suspended operator on every legacy, marketing, SEO, detail, seat, and quote surface, while trusted service-role operations retain their explicit back-office path.
  • Kept internal-account promotion on a trusted boundary: a legacy user_metadata marker is only a migration hint and must also match an active platform-admin, internal-company member/driver, or internal booking relationship before the service writes authoritative app_metadata.
  • Backfilled the pre-marker production QA company from its explicit internal signature and classified its Company users, Drivers, and booked Travelers through authoritative relationships. Its historical/future Trips can no longer appear as public marketplace inventory.
  • Limited demo capabilities to persona bootstrap. Reading demo Trip inventory now also requires the passenger persona's signature-verified JWT, and its demo_company_id must equal the capability tenant; capability-only and cross-demo sessions fail closed.
  • Closed the legacy /trips compatibility path with signature-verified Supabase app_metadata, active-company filtering, and fail-closed private sessions. Trip details and seats now preserve bearer/HttpOnly-cookie identity, so search, quote, detail, seat selection, and booking cannot switch inventory worlds.
  • Closed the indirect popular-route aggregation boundary as well. Its database ranking now applies the exact caller inventory scope before counting activity; private results are no-store, public caching varies on identity-bearing headers, and an invalid private credential fails before the aggregate query.
  • Unified inventory-scope resolution with every supported server auth source: Bearer, the ShamBus HttpOnly access cookie, and chunked Supabase SSR session cookies now all produce the same verified scope before cache policy is chosen.
  • Closed the derivative public-discovery surfaces: landing routes are always anonymous/public-only, the sitemap cannot publish private route pairs, the public Company profile function excludes internal/demo tenants inside its SECURITY DEFINER boundary, and guessed private Company ids return no public reviews. The legacy customer search now preserves bearer/cookie identity and fails closed instead of silently switching an internal or demo account into public inventory.

Non-root Flutter web runtime hardening — 2026-08-24

  • Made the customer mobile-web image normalize the Nginx snippets directory and security-header file modes inside the image. This prevents restrictive build-context directory permissions from blocking the non-root Nginx worker.
  • Added a production-infrastructure contract that keeps the runtime permission guarantee in place for future image changes.

Company-defined exact Trip pickup locations — 2026-08-24

  • Added company-owned/public pickup points with bilingual names, addresses, directions, mapped coordinates, tenant validation, recurring-schedule support, immutable per-Trip snapshots, and safe backfill for every existing Trip.
  • Rebuilt single and recurring Trip planning to require an origin-city pickup, create mapped company points, preview them, and prevent silent pickup changes after a Booking exists.
  • Propagated the same pickup truth through customer Trip APIs, web Trip and checkout pages, Booking details, Flutter direct and multi-leg flows, company dispatch, stop calls, notifications, and professional Booking/Ticket PDFs.
  • Added mobile offline persistence, bilingual/RTL presentation, touch-friendly external map actions, and a 15-minute arrival reminder.
  • Restored the notification pgcrypto search path and secure confirmation-copy contract found during regression testing. Rebuilt the older public_trips view in migration 00286 so its stored projection includes the pickup snapshot added after the view was originally created.
  • Completed an authenticated Chromium workflow across customer Trip detail, checkout, mobile width, company login, dispatch, Trip editing, and payment settings with no browser/API diagnostics. Regenerated ten professional PDF samples, visually checked their Arabic/English layout, kept the compact Booking confirmation on one A4 page, and verified the enterprise documents' pickup, cash/contact copy, and QR boarding-code pages. Production deployment and native-device verification remain open.

Cash-only launch boundary and development payment adapters — 2026-08-24

  • Made CASH the only customer and driver payment method across web, mobile, company settings, and administrator APIs; online and bank methods now fail with stable unavailable/development-only responses before financial writes.
  • Added a provider-neutral local simulation adapter for future ShamCash and card work. It creates unmistakable DEV- references, performs no network request, accepts no provider credential, and cannot verify a guessed webhook contract.
  • Made local Compose and the local environment template default explicitly to ONLINE_PAYMENTS_MODE=development; traveler checkout still exposes CASH only.
  • Hard-disabled online payment mode whenever NODE_ENV=production, added a production preflight gate for both full and zero-downtime app deployments, and removed the obsolete assumed ShamCash endpoint, webhook secret, and signature behavior.
  • Backfilled company settings to cash-only and added PostgreSQL constraints and authenticated-write triggers for customer, saved-method, and driver payment records through migration 00278.
  • Kept historical provider values available in immutable records and ledger filters for reconciliation without representing them as active checkout methods.
  • Limited optional professional billing details to future card flows; cash confirmations and documents do not request or display empty business fields.
  • Verified focused service, customer, dashboard, driver-sync, Flutter, database, production-infrastructure, and TypeScript contracts locally. Provider sandbox, certification, and production launch remain intentionally out of scope.

Loopback-safe local Next.js development — 2026-08-24

  • Allowed 127.0.0.1 as an explicit development origin in customer, dashboard, and admin. Next.js had accepted the HTML document but rejected its own /_next chunks and HMR requests with HTTP 403 when browser automation used the loopback IP instead of localhost, leaving pages unhydrated.
  • Added configuration regression tests for all three applications and reproduced the original browser Origin request before verifying every sampled chunk returns HTTP 200 after the fix. Production origin policy is unchanged.

Account-synced favorite routes — 2026-08-24

  • Replaced divergent web and Flutter favorite-route shapes with one strict, bilingual contract keyed by immutable origin and destination city IDs.
  • Made the customer API account-scoped, private/no-store, CSRF-protected for mutations, idempotent for duplicates, and explicit about authentication, validation, foreign-key, lookup, save, and removal failures.
  • Rebuilt the customer saved-routes page and search-result action with truthful loading, empty, cached, error, retry, and guest sign-in states, accessible controls, RTL-safe direction, and exact search-context preservation.
  • Added an offline-capable Flutter service that keeps guest routes locally, migrates them once after sign-in, isolates caches per account on shared devices, and never replaces valid cached state with a false empty success.
  • Added API, parser, service, production-widget, page, and deterministic browser contracts; all six desktop/mobile-width Chromium scenarios pass locally. Production deployment and native-device verification remain open.

Cold-start-safe Flutter brand mark — 2026-08-24

  • Replaced the shared Flutter mark's separately fetched PNG with the exact canonical Signature S-Road SVG geometry embedded in the shared widget. A cold or slow first visit can no longer leave an empty green logo square.
  • Removed the obsolete runtime PNG and taught the brand generator plus pnpm lint:brand to synchronize and verify the inline Flutter vector against the canonical SVG source.
  • Added widget and production-browser regressions that reject a packaged logo request. The deployed pre-fix driver fails the new gate; production-shaped local customer and driver releases pass, and the driver pixel check confirms the mark remains visible while the legacy asset route is blocked.

Secure booking retrieval and attached confirmations — 2026-08-24

  • Replaced URL-only booking access with two explicit authorization modes: traveler account ownership, or a rate-limited booking-code plus family-name check that creates a booking-scoped HttpOnly session with 15-minute idle and 30-minute absolute server expiry.
  • Added structured traveler family names and immutable booking-time family-name snapshots, including a conservative backfill for legacy bookings.
  • Removed the guest page's invalid booking-code-derived QR. Guests now download the immutable confirmation containing the canonical signed QR used by the driver scanner; guest sessions cannot access live tickets or other bookings.
  • Attached the same audited immutable confirmation PDF to booking-confirmation emails. Email, SMS, and WhatsApp use the safe booking finder, while authenticated push/in-app deep links still enforce account ownership.
  • Centralized issuance, QR rendering, PDF generation, and render evidence behind one shared booking-document module used by dashboard, customer, and delivery worker.
  • Added an idempotent canonical projection for legacy customer and office Booking commands. Confirmed compatibility bookings now create signed Journey Tickets, so their immutable confirmation revisions contain the same boarding QR as native Journey checkout; cancellation, attendance, and no-show states stay synchronized.
  • Preserved expired compatibility holds during later record updates and closed their stale canonical seat projections using durable expired-session evidence. The browser/PDF gate now decodes the rendered QR and matches its Ticket ID, credential version, and 64-character signature to the database record.
  • Added an explicit source boundary so the compatibility projection never runs inside native Journey confirmation; native one-way and multi-leg checkout contracts pass alongside the legacy booking lifecycle contract.
  • Moved identity-aware Journey and round-trip confirmation behind the trusted customer API service boundary. Anonymous travelers can still complete checkout, but anon and authenticated database roles can no longer invoke the security-definer confirmation commands directly.

Boarding QR confirmations and channel-aware ticket access — 2026-08-24

  • Added the canonical signed Journey Ticket QR for every active traveler to newly issued immutable booking confirmations, while preserving historical revisions and keeping boarding signatures out of ordinary workspace reads, invoices, and cancellation documents.
  • Extended legacy customer confirmations with their still-valid boarding code without reissuing consumed or expired credentials.
  • Updated transactional channel behavior so external messages lead to secure booking lookup and authenticated app surfaces preserve their protected deep link.
  • Kept signed credential payloads out of communication bodies and provider metadata, and added database, template, route, rendering, and QR-contract regression coverage.

Browser-verified booking documents — 2026-08-24

  • Connected Next.js development sessions to the local Compose Gotenberg renderer by default, while keeping test and production environments fail-closed unless GOTENBERG_URL is explicitly configured.
  • Added environment-contract tests so an explicit renderer always wins and a missing production renderer cannot silently fall back to localhost.
  • Kept contact emails on a readable full-width document row and isolated each Arabic/Latin vehicle-identifier segment so bilingual PDFs preserve the intended order instead of relying on ambient bidirectional text behavior.

Reproducible Google OAuth and mobile-release configuration — 2026-08-24

  • Added an idempotent operator wizard for Google Auth Platform branding, separate production/development Web clients, release/Play Android signing identities, the iOS bundle client and URL scheme, GitHub variables, local development configuration, and a backed-up production-server update.
  • Hardened the GitHub mobile pipeline so production artifacts receive their API, notification, TLS pinning, monitoring, Maps, and traveler Google OAuth configuration instead of compiling with localhost/default values.
  • Corrected the customer Play package and AAB upload path to the actual sy.shambus.app / app-prod-release.aab artifacts, and made Driver Android releases fail closed when the real signing keystore is absent.
  • Made iOS CI validate each app's provisioning profile against its Team ID and bundle identifier, then generate per-build export options instead of relying on one shared profile or a placeholder team identifier.

Traveler Google authentication and mobile language access — 2026-08-23

  • Added maintained native Google account selection on Android and iOS for travelers only, with cancellation, account switching, checkout return-path preservation, deferred verified-phone completion, and fail-closed session cleanup. Staff, driver, and admin identities remain excluded.
  • Added a server-side Google ID-token exchange that validates signature, issuer, audience, expiration, subject, and verified email, then links exactly one canonical Traveler and issues a normal Supabase session without changing an existing password. Phone-first accounts are upgraded in place and identity races or staff conflicts fail closed.
  • Replaced the non-functional traveler Web redirect path with Google's official Identity Services button and a flow-specific, nonce-bound, same-origin exchange. Web and mobile now resolve the same Traveler identity, preserve the same booking return path, and keep session tokens out of browser JSON.
  • Added the official GIS-rendered button to Flutter Web/PWA with a narrowly origin-scoped, nonce-bound exchange for app.shambus.com, encrypted local session persistence, fail-closed cleanup, CSP hardening, and a forced clean browser state after logout. Native custom surfaces now use Google's official current G asset instead of a hand-drawn approximation.
  • Added atomic, ownership-checked Google linking from Traveler security settings plus backward-compatible disconnect behavior for older Supabase-provider identities.
  • Corrected Android release automation to require the prod flavor and complete OAuth defines, added the iOS client and callback configuration, and removed duplicate Fastlane compilation from the deployment handoff to reduce release minutes without reusing an unverified artifact.
  • Removed Android's silent debug-signing fallback: Gradle now rejects every release task until the production keystore is configured, while prodDebug remains available solely for local compilation checks.
  • Applied Cairo explicitly to customer-mobile navigation labels and added a persistent, accessible Arabic/English language control in the header and desktop rail. A compiled Flutter Web release was browser-verified in both directions, including a real menu click and live locale switch.
  • Local release evidence includes clean Flutter analysis, focused native-auth and account-linking tests, successful Android prod APK and unsigned iOS release compilation. Real OAuth client registrations, Android release signing fingerprints, and physical Android/iOS sign-in remain required before an honest production-ready claim.

Guest search, restored-session CSRF, and canonical seat capacity — 2026-08-23

  • Restored guest Journey search for Customer Web and Flutter Web by documenting its structured POST as a rate-limited, validated, read-only operation rather than requiring a cookie-based CSRF token it cannot possess cross-origin.
  • Made Dashboard and Admin issue a missing CSRF cookie for an already-valid restored session, while preserving an existing token across navigation.
  • Fixed canonical seat reconciliation so the short-lived lock converted into a Booking is not counted as a second occupied seat. The migration also safely reconciles existing Trip seat ledgers.
  • Added focused route, proxy, CSRF-coverage, and transactional database regressions, plus production cleanup that removes the generated Booking-to-Journey graph even when an assertion fails after a commit.

Production-safe booking, demo, and settlement hashing — 2026-08-23

  • Fixed the legacy Booking-to-Journey trigger on self-hosted Supabase, where pgcrypto lives in the trusted extensions schema. This restores real customer booking creation and custom demo provisioning after a seat lock.
  • Audited every public PostgreSQL function that calls digest(...) and fixed the same latent search-path defect in company quality snapshots, partner settlement generation, and settlement rollups.
  • Strengthened the database contract to discover every current and future business function that hashes data but omits the trusted extension schema. Migration validation passes for all 255 files and all 43 transactional database contracts pass together locally.

Reproducible shared-package mobile containers — 2026-08-23

  • Corrected customer and driver Flutter container builds to use the repository root as their build context, so the shared mobile_core and mobile_ui packages referenced by both applications are available in development and production images.
  • Preserved dependency-layer caching by copying app and shared-package manifests before flutter pub get, then copying source only for the compilation layer.
  • Added infrastructure contracts for both apps and both Dockerfile variants, and verified the merged production Compose configuration. This prevents a release from reaching service replacement with an incomplete Flutter build context.

Reliable company office booking — 2026-08-23

  • Aligned Trip identifier validation with PostgreSQL's canonical UUID contract, so deterministic operational identifiers are accepted without weakening the required hexadecimal 8-4-4-4-12 shape.
  • Removed already-departed Trips from the office-booking picker, matching the atomic database command that correctly rejects late booking attempts.
  • Preserved the cash-reconciliation boundary: marking money as collected still requires an open company cash shift and is not bypassed by the office flow.
  • Local evidence: focused service/API regressions pass, the complete Dashboard suite passes 3690/3690 tests across 275/275 files, lint and type-check pass, and all 9/9 office-booking Chromium tests pass. The end-to-end test creates a real future booking through the UI and cancels it during cleanup.

Local browser reliability and full registered-route gate — 2026-08-23

  • Self-hosted the Cairo variable font in Customer, Dashboard, and Admin through next/font/local, removed the runtime Google Fonts requests and their CSP allowlist, and hardened the support-ticket form against pre-hydration input and native-submit races.
  • Centralized the customer API CORS contract so proxy and route handlers allow the same Flutter-web headers, including X-ShamBus-Client and Idempotency-Key; added preflight regressions instead of relying on a warmed browser session.
  • Hardened customer mobile routing: private Trip chat now requires authentication, a direct legacy /trips refresh without its required search state returns to Home, and the messages API returns 401 before touching the database rather than exposing an RLS rejection as 500.
  • Made Flutter route tests wait for a real first frame, not the static bootstrap, and moved the local browser readiness target to profile mode to avoid debug DDC loader false negatives.
  • Corrected customer booking QR ownership to use the canonical linked traveler identity and hardened Realtime startup/recovery: Kong waits for a healthy Realtime service, while booking details preserve valid data and use a quiet API refresh during a transient subscription outage.
  • Local evidence: the strict Chromium suite passes 180/180 registered routes across customer web, company dashboard, admin, customer Flutter-web (28/28), and driver Flutter-web (14/14). Customer and driver Flutter suites pass 1461/1461 and 598/598; both analyzers are clean; a 1,000-connection local Realtime handshake probe had no failures. This is local evidence only; production deployment, real provider checks, native iOS/Android devices, and exhaustive mutation coverage remain open.

Company-owned loyalty, traveler attendance, and focused access surfaces — 2026-08-23

  • Replaced the platform-wide loyalty authority with one disabled-by-default program per transport company. Company owners/admins now control policy, tiers, rewards, members, and audited balance adjustments; Admin mutation endpoints fail closed with 410 LOYALTY_COMPANY_OWNED.
  • Added separate traveler balances, ledgers, rewards, redemption, and referrals per company. Cross-company rewards fail, legacy platform rows remain historical, and referral creation plus welcome points is one atomic, idempotent operation.
  • Upgraded company boarding to the canonical Journey Ticket identity. Staff can mark exactly one traveler as NO_SHOW, retain a reason and actor, and reverse that decision without deleting history; party-booking companions remain unchanged.
  • Simplified Dashboard and Admin login pages while retaining validation, rate-limit feedback, portal routing, sessions, mandatory 2FA enrollment, challenges, backup codes, and development-only credential help.
  • Added selectable demo seed presets and richer approval review drawers covering legal identity, contacts, team, operating inventory, readiness, and history.
  • Fixed the public Journey location directory's 42501/503 failure by moving connected-transport authorization joins behind narrow RLS predicates. The same remediation covers public route patterns and Trip inventory plus authenticated quotes, bus resources, holds, and extras without granting identity-table access.
  • Updated checkout verification to create and redeem rewards inside the Trip operator's loyalty program, and made the notification worker contract isolate its queue fixtures from durable local work.
  • Reasserted runtime function grants after the connected-product migrations: client roles can no longer execute trigger-only functions directly, and the RLS verifier now uses an exact-signature allowlist for intentional anonymous SECURITY DEFINER predicates and session-bound Journey commands. Database restarts also preserve migration-owned service_role ACLs, and a corrective migration permanently retires the former platform-wide loyalty mutation RPCs in existing environments.
  • Made Booking Trip corrections preserve the complete canonical Journey graph. Reassignment now moves the Journey Leg, seats, Tickets, Extras, reminders, inventory, aggregate totals, and accepted quote together, and rejects unsafe cross-operator, endpoint, timing, attendance, hold, and capacity changes.
  • Removed stale service_role access to the retired direct-send reminder RPCs while preserving an exact durable notification-worker allowlist.
  • Local evidence: all 254 migration files pass structural validation; all 43 PostgreSQL behavior contracts pass together and roll back; customer, dashboard, and admin type-checks pass; the product-standards scan passes across 1,160 source files; affected API/UI suites pass; and a clean Chrome audit verified Dashboard and Admin login, company loyalty on desktop/mobile, customer OTP, and traveler loyalty with no console/page/HTTP 5xx errors. Production migration, deployment, and live-role verification remain open.

Enterprise reservation workspace and immutable booking PDFs — 2026-08-23

  • Replaced the company reservation detail page's incompatible flat Booking shape with one validated aggregate covering journey segments, travelers, per-ticket seats/check-ins/no-shows, extras, payments, documents, communications, and related Trip/Route/Bus navigation.
  • Added immutable, numbered, revisioned booking confirmations, invoices, and cancellation confirmations. Historical downloads render the exact stored snapshot selected by documentId; they never silently rebuild an old revision from current data. Every PDF render is checksum-audited before download.
  • Added Arabic/English professional templates with operator legal information, traveler/ticket tables, itinerary, invoice lines, payments, refunds, and Latin digits in RTL. Embedded the approved ShamBus mark in the self-contained HTML, added the document number to every footer, and fixed reversed no-show events so they are not printed as active no-shows.
  • Local evidence: the migration and its PostgreSQL behavior contract pass; shared types, services, customer, and dashboard type-checks pass; the focused API/UI slice passes 46/46; document templates pass 11/11; and all 12 pages across Arabic/English confirmation, invoice, and cancellation PDFs were rendered with the self-hosted Gotenberg service and visually inspected. This is local evidence; production migration, deployment, and live-role verification remain open.

Approved Signature S-Road identity across every application — 2026-08-23

  • Promoted the stakeholder-approved coach, S-route, and location-pin symbol to the canonical shared brand source. The standalone Variant 6 export is the exact silhouette reference; Variant 1 defines monochrome use and Variants 4/5 define the horizontal lockup proportions. Generated lettering was replaced with real, accessible ShamBus / شام باص text.
  • Converted the approved symbol to deterministic four-contour SVG geometry, updated the shared React and Flutter brand components, and increased launcher optical scale while preserving platform mask safety.
  • Regenerated matching web, PWA, launch-page, documentation, Android, iOS, macOS, Windows, and Flutter-web derivatives from one source. The 512px derivatives are byte-identical across customer, dashboard, admin, and both mobile web applications. The generator now renders each size once and copies the canonical binary, reducing repeat work and making same-size files byte-identical.
  • Visually inspected the transparent mark and 16px, 32px, 180px, and 512px icon outputs locally. Shared UI lint/type-check, all three web application type-checks and production builds, the documentation build, both Flutter analyzers and release web builds, the shared Flutter suite (13/13), customer brand/auth/search tests (74/74), and Driver auth tests (19/19) pass. Production deployment and physical-device/live-browser review remain open.

Indexed and shareable company Trip operations — 2026-08-22

  • Made the dashboard Trip date, status, search, archive, and page state shareable through validated URL parameters while preserving exact server-rendered data on first load and return navigation.
  • Added the shared advanced Filter Bar and personal/company saved views to Trip operations, with a real input debounce, reset behavior, and the existing custom accessible date system.
  • Reworked get_dashboard_trips_page to calculate indexed UTC bounds for a Damascus operating day, aggregate and paginate Trips before relationship joins, and use Company/departure and Company/status/departure indexes. A representative local PostgreSQL query fell from about 13.17 ms to 0.485 ms (~27x); this is local diagnostic evidence, not a production latency claim.
  • Dashboard lint and type-check pass, and the complete dashboard suite passes 3,705/3,705 tests across 273/273 files. Production deployment and live-browser verification remain open.

Canonical traveler boarding and connected demo lifecycle — 2026-08-22

  • Replaced Booking-wide QR assumptions with one PII-free, versioned, HMAC-signed credential per Passenger and Journey Leg across customer web, customer mobile, Driver manifest, scanner, offline validation, and synchronization.
  • Added atomic assigned-Driver check-in with wrong-Trip, signature, lifecycle, offline-time, coordinate, and replay guards. A party Booking no longer collapses every Passenger into one attendance event.
  • Rebuilt customized-demo reset/reaping around one private, dependency-ordered teardown boundary that understands Journeys, Tickets, finance, settlements, quality, notifications, and operations. Cross-tenant graphs fail closed, and immutable-history bypass remains limited to a verified demo Company inside the teardown transaction.
  • Fixed four nondeterministic or outdated PostgreSQL fixtures exposed by the complete run: dispatch availability now anchors after the seeded Bus schedule, Journey discovery uses a stable daytime departure, quality disruption timestamps preserve chronology, and demo reset verifies removal/recreation of 100 connected Journeys.
  • Local database evidence: all 38/38 transactional contracts pass together against PostgreSQL 15 through migration 00250. Production migration and live role/device verification remain open.

Context-aware traveler Home — 2026-08-22

  • Added the same context-aware Home behavior to customer web without turning the public landing page into a private server render: guests make no history request, while signed-in travelers receive a canonical active/upcoming card. The card follows the correct child Booking and Trip for round trips and connections, links active journeys to live tracking, uses Latin digits, and preserves RTL/LTR arrow direction with icons.
  • Added a signed-in mobile Home card that prioritizes an active Journey and otherwise selects the nearest upcoming departure without blocking guest search or degrading search when personalized history is unavailable.
  • Added operational child/leg selection for round trips and connections, so route context and live tracking follow the active return or transfer leg instead of assuming the first leg is current.
  • Added model and widget regression coverage for active-return tracking, nearest-departure ordering, guest privacy, and direct Journey navigation.
  • Extracted one strict web history response validator and operational selector shared by Home and My Bookings. Fixed a real wire-contract mismatch where the standard API envelope strips the RPC-only success flag but My Bookings had required that flag. Focused web history/helper/card tests now exercise the real envelope and pass 14/14; the existing landing suite passes 6/6, customer type-check and changed-file lint pass. Live browser and production verification remain open.

Connected Journey comparison on mobile — 2026-08-22

  • Expanded connecting Journey details to disclose every leg's exact stops, departure/arrival time, duration, operating company, verification state, service number, vehicle, remaining seats, amenities, transfer station, and transfer wait instead of showing only the first operator.
  • Corrected English and Arabic transfer-count grammar while retaining Latin digits in both directions.
  • Added connection regression coverage with two operating companies and a timed transfer. The focused Journey results suite passes 4/4; customer mobile analysis remains clean. Live-device and production evidence is open.
  • Added a database regression scenario for the free booking-correction window and rejected future-dated confirmation timestamps. Migration structure validation passes for all 236 files; the transactional PostgreSQL rerun is still pending because the local Docker engine did not respond.

Operational offline ticket wallet — 2026-08-22

  • Upgraded the encrypted offline fallback from a QR-only sheet to a complete station-ready ticket: Passenger, seat, order direction, exact stops, departure, service number, operator, ticket reference, and signed boarding QR are available without a network connection.
  • Retained safe behavior for cancelled, used, or expired credentials by hiding their boarding QR while keeping the record visible.
  • Added a real network-failure widget contract. The history/offline/ confirmation slice passes 11/11, and customer mobile analysis is clean; process-death and physical-device evidence remain open.

Hierarchical traveler location discovery — 2026-08-22

  • Added one public City → station/stop/airport directory and exact location identity for landing, customer web search/results, and customer mobile search/results. Depot records remain private, and two indexed reads avoid an N+1 query.
  • Replaced the landing page's separate city picker with the shared accessible grouped Combobox. Fixed the shared selected-value filter so opening an existing selection still shows alternative stations and cities.
  • Added explicit fromType/toType links and mutually exclusive city/stop API fields. Legacy links remain city-scoped, and rolling mobile deployments fall back to city-only discovery without misrepresenting a stop.
  • Preserved exact stations in web and mobile Recent Search, including safe migration of older city-only browser and Hive records, and removed the obsolete mobile /city-selection screen.
  • Local evidence: the focused web hierarchy slice passes 54/54, landing/shared Combobox tests pass 9/9, focused mobile location/API/router tests pass 30/30, mobile search/history tests pass 55/55, and customer mobile analysis is clean. Live browser/device, deployment, and production verification remain open.

Driver authentication and customized-demo hardening — 2026-08-22

  • Replaced fixture-only driver login, OTP, splash, and router tests with tests that mount the production screens and exercise the production route policy.
  • Added one typed DriverAuthenticationGateway for password challenges, TOTP verification and enrollment, recovery codes, safe UTF-8 errors, request timeouts, and customized-demo capability exchange.
  • Rebuilt the driver second-factor and first-login enrollment screens with the canonical green pin-and-coach mark, direction-aware back navigation, Latin digit normalization, a recovery path after setup failures, and one-time backup-code acknowledgement.
  • Rebuilt the splash and customized-demo handoff with the canonical vector mark, no arbitrary startup delay, reduced-motion behavior, no generic bus glyph, and no capability persistence or rendering.
  • Hardened navigation so direct second-factor URLs without a live challenge return to login and public-route matching respects path-segment boundaries.
  • Local evidence: the combined driver authentication/router slice passes 36/36, the shared security-code component passes 3/3, and flutter analyze is clean. Physical-device, live-browser, deployment, and production verification remain open.

Shared brand infrastructure and traveler sign-in direction — 2026-08-22

  • Consolidated product usage around the established green location-pin-and-coach identity. A later connected-route exploration was rejected and removed from React, Flutter, SVG, favicon, PWA, Android, iOS, documentation, and launch-page sources.
  • Added package-owned SVG sources and accessible React/Flutter mark and lockup components. The production geometry is deterministic SVG; future concept exploration must remain outside product surfaces until explicit visual approval.
  • Added a reproducible asset generator for customer, dashboard, admin, docs, coming-soon, Android, iOS, Flutter web, favicons, and PWA sizes. Restored and locally inspected the established transparent mark at full and launcher sizes; live browser and physical-device visual checks remain open.
  • Began the shared authentication-shell rollout on traveler web with the canonical identity, a Syria-specific generated terminal visual, simple product copy, RTL-safe controls, and preserved Google/phone/Telegram behavior. Shared UI and customer type checks pass, and the focused traveler-login suite passes 31/31; the remaining authentication surfaces and live browser/device matrix are still open.
  • Added the server-verified native Google finalization boundary and the mobile phone-completion path. A verified Google session can now link to the canonical Traveler, defer phone collection, verify an E.164 number, safely restore an older Passenger ID, update encrypted local auth, and return to the complete Journey URL.
  • Replaced the customer app's six independent OTP boxes and duplicate login-only OTP method model with shared controls. Arabic/Persian pasted digits normalize to Latin, OTP submission is guarded against duplicate requests, and the SMS/Telegram selector now follows the active light/dark color scheme using the Sham Bus green state.
  • Local evidence for this mobile slice: flutter analyze is clean; shared OTP tests pass 2/2; customer OTP tests pass 57/57; phone API/coordinator/route tests pass 8/8; and login/selector/completion rendering tests pass 38/38. Native Google SDK installation, Google credentials, browser visual QA, physical-device QA, deployment, and production verification remain explicitly open.

Journey order and operations hardening — 2026-08-22

  • Completed the locally verified database path from Journey discovery through one-way/round-trip Order confirmation, explicit hold release, Passenger/Ticket creation, and rollback-safe seat/Extra inventory. Fixed the cash-provider NULL guard, Booking reference trigger order, and a PL/pgSQL output-column ambiguity found by real PostgreSQL execution.
  • Replaced permissive live-operations reads with role- and relationship-bound RLS predicates for Trip events, Stop Calls, GPS, alerts, disruptions, and cash reconciliation. Driver telemetry remains command-only, and payment-provider callbacks remain service-role-only.
  • Changed the operations snapshot to rank active critical alerts, disruption, delay, and unhealthy GPS ahead of low-risk future assignment gaps, while distinguishing total in-window Trips from the bounded result set.
  • Made the gated QA seed bounded and preservation-safe, provisioned valid Bus layouts, and verified distinct Platform, Company, Dispatcher, Driver, and Traveler roles. A repeat seed preserved 474 Bookings and 80 Reviews rather than multiplying demo records.
  • Passed eight transactional PostgreSQL behavior contracts through migration 00242. This proves the local backend slice only; application/device matrices, legacy ACL normalization, deployment, and production verification remain open.

Atomic multi-leg Journey Booking and inventory — 2026-08-22

  • Added the canonical journey_bookings aggregate while retaining bookings as an explicit one-leg compatibility segment, with non-null database-enforced linkage and ADR-007 documenting the migration boundary.
  • Added Booking Passengers, per-leg Seat Assignments, HMAC-signed per-Passenger Tickets, opaque checkout sessions, and idempotent all-or-nothing resource-hold batches.
  • Added server-authoritative quote validation for up to four connected legs, safe same-stop/same-city transfer windows, exact seat labels and prices, baggage/bicycle/accessibility resource capacity, normalized contact data, and guest checkout ownership without silently verifying an identity.
  • Added atomic confirmation that creates every segment, passenger, seat assignment, extra, and Ticket or rolls the entire Journey back. Added minute-level abandoned-hold expiry and explicit release.
  • Verified migration 00227 against PostgreSQL 15 with a 74,762-row legacy backfill and a rollback-only behavior contract covering quote/hold/confirm idempotency, cross-checkout seat conflict rollback, non-seat capacity, invalid-passenger rollback, signed credential verification, compatibility counters, and release cleanup. Application surfaces and production rollout remain pending.

Connected operations, quality, and automated partner billing — 2026-08-22

  • Added the canonical Stop → Route Stop → Trip Stop Call and Journey → Journey Leg model, Trip-specific seat/resource inventory, accepted quote snapshots, and collision-safe public Route/Trip references.
  • Added caller-bound, idempotent driver telemetry, Stop Call execution, automatic ETA/delay propagation, GPS health reconciliation, structured disruptions, dispatcher alerts, bilingual passenger announcements, and privacy-safe booking-reference tracking.
  • Replaced the legacy check-in mutation with an atomic assigned-driver command. Boarding now uses the correct CONFIRMED → CHECKED_IN transition, rejects driver impersonation, updates the manifest once, and records an immutable operational event.
  • Added versioned partner commercial terms, explainable Company quality snapshots, SLA breaches, per-Trip settlement reconciliation, incentives, penalties, withholding tax, immutable document metadata, approval gates, payments, and tenant-safe finance reads.
  • Added daily PostgreSQL scheduling for prior-month partner settlements, idempotent per-Company queues, bounded exponential retries, dead-letter state, and recent-2FA administrative retry.
  • Verified migrations 0022400226 with PostgreSQL 15 rollback-only parsing and transactional contracts covering authorization, idempotency, lifecycle state, fanout, quality formulas, exact settlement arithmetic, documents, payments, scheduling, and cross-Company isolation. This is local evidence, not production-release evidence.

حقل الهاتف الدولي الموحّد - 2026-08-22

  • إضافة packages/mobile_ui كحزمة Flutter مشتركة لحقل هاتف دولي قابل للبحث، يبدأ بسوريا +963، يبقى LTR داخل الواجهة العربية، ويُخرج E.164 فقط بعد تحقق parser خاص بكل بلد.

  • استبدال intl_phone_field القديم بإصدار phone_form_field 10.0.18، وهو أحدث إصدار متوافق مع Flutter 3.38.5 المستخدم في المستودع. تستخدم الأعلام ملفات SVG ولا تستخدم رموز emoji.

  • ترحيل تسجيل الدخول وإنشاء الحساب وحجز المسافر نفسه والحجز لشخص آخر ورقم WhatsApp المنفصل، وحذف الحقل الخام والمطبّع المحلي المكررين.

  • إصلاح لصق رقم E.164 كامل: أُلغي formatter الطرف الثالث الذي كان يحذف + من الرقم الطويل ثم يكرر رمز سوريا (+963963…). يبقى تحقق الطول والنوع مع parser ولا يعاد تفسير رمز الدولة كرقم وطني.

  • إضافة حارس مصدر يمنع عودة TextInputType.phone داخل التطبيقات أو استدعاء widget الطرف الثالث خارج الحزمة المشتركة. نجحت 6 اختبارات widget للحقل، كما نجح كامل تطبيق العميل في 1,461/1,461 اختباراً محلياً. هذه أدلة محلية وليست تحقق أجهزة أو إنتاج بعد.

  • كشف فحص الصحة أثناء النشر تعارض أسماء المقاطع الديناميكية بين مسار الدفعة ومسار الإيصال الجديد في Next.js. نُقل تنزيل الإيصال إلى المسار الثابت /api/payments/receipts/{source}/{id}، وأعيد بناء dashboard واختبار المسار قبل إعادة النشر بدلاً من اعتبار الإطلاق ناجحاً جزئياً.

  • فصل فحص صحة OTP بين عطل مزود فعلي وحالة disabled المقصودة في وضع coming-soon: يعرض الأول degraded بينما تبقى الثانية healthy مع إظهارها صراحة كـdisabled، ولا ينطبق الاستثناء عند إطلاق الموقع بوضع live.

  • تمرير PUBLIC_SITE_MODE صراحة إلى حاوية customer في Compose؛ كشف smoke الإنتاج أن غياب المتغير داخل الحاوية يجعل الاستثناء السابق يفشل مغلقاً كما ينبغي، فأضيف عقد بنية يمنع تكرار نقص الربط بين إعداد النشر والتطبيق.

  • جعل تهيئة بيئة العرض الإنتاجية قابلة للتكرار: يهيئ السكربت وضع OTP المعطل الآمن وحسابات العرض المحجوزة عند غياب مزود معتمد، يختار قنوات الإشعار وفق اكتمال بيانات الاعتماد، ويحمي ملف البيئة ونسخته الاحتياطية بصلاحية 0600 من دون طباعة أي قيمة سرية.

تقفيل بناء الإصدار وحواف الهاتف - 2026-08-21

  • استبدال react-dom/server في route مستند الحجز بمولد SVG QR خادم مستقل، مع error correction عالٍ وحد 1024 byte للـpayload. كشف next build التركيب غير المدعوم ولم يُتجاوز الفحص.
  • جعل زر Flutter المشترك يلائم النص العربي الموطّن على العرض الضيق، وتحديث اختبارات الدخول لتثبت SMS الافتراضي وغياب WhatsApp عن الهوية، بدل الاحتفاظ بتوقعات الواجهة القديمة.
  • نجحت أدلة ما قبل النشر: customer web في 3,077/3,077، dashboard في 3,710/3,710، admin في 2,455/2,455، customer Flutter في 1,396/1,396، driver Flutter في 671/671، وعقود PostgreSQL في 26/26. نجحت أيضاً type-check وlint وبناءات customer/dashboard/admin/docs وFlutter web للتطبيقين.
  • فحص تبعيات الإنتاج: 0 critical، وحالتا high مقبولتان بضيق في parser صور Docusaurus المستخدم وقت البناء فقط؛ يرفض فحص الوثائق صيغ ICNS/JXL/HEIF المتأثرة. هذه أدلة محلية قبل النشر ولا تدعي التحقق من الإرسال الحي لمزود SMS لم تضف credentials بعد.
  • إضافة وضع OTP_PROVIDER=disabled مقيد بـcoming-soon: يبقي عروض +963900... قابلة للاختبار برمز مخزن كـHMAC ويفشل بـ503 لكل رقم حقيقي. يرفض preflight إطلاق الموقع كـlive قبل ربط Twilio SMS أو البوابة المعتمدة.

مستندات مالية وتقارير PDF موحدة - 2026-08-21

  • إضافة renderer موحد للتذكرة وتأكيد الحجز وإيصال الدفع وإشعار الاسترداد والتقرير التشغيلي بالعربية والإنجليزية، بهوية شام باص الخضراء وCairo ودعم RTL/LTR من دون أسهم اتجاه قابلة للانعكاس.
  • إضافة سجل financial_documents ثابتاً ومرقماً وidempotent لمصادر تحصيل البوابة والسائق والمكتب والحجز، مع snapshot SHA-256 ومنع UPDATE/DELETE، وسجل document_render_events لكل ملف مولد. لا يعيد API مستنداً مالياً بلا audit.
  • استبدال PDF العميل المحلي في التقارير بتصيير خادمي، وإضافة تنزيل تذكرة/تأكيد وإيصال للعميل وإيصال دفتر التحصيل للشركة، مع تحقق الملكية والtenant والأدوار وحالة الدفع وQR وprivate, no-store.
  • تشغيل Gotenberg 8.34.0 ذاتي الاستضافة بصورة مثبتة digest وخط Cairo داخل شبكة Compose فقط، مع time/size limits وفحص content type وPDF magic وhealth وتحويل فعلي أثناء النشر.
  • كشف الفحص البصري الحقيقي أن post-processing الخاص بـPDF/A عبر LibreOffice يقلب الأرقام والتواريخ العربية. أزيل من مسارات المنتج الافتراضية وأضيف منع صريح لـPDF/A على RTL؛ تستخدم الملفات tagged PDF من Chromium بدلاً من ادعاء امتثال أرشيفي يفسد الحقيقة المالية.
  • نجحت اختبارات القوالب والadapter والsnapshot ومسارات التذكرة والإيصال والتقرير، ونجح contract PostgreSQL داخل ROLLBACK. ولد QA أربع عينات فعلية وفحص كل صفحة: التذكرة والتأكيد والإيصال صفحة A4 واحدة، التقرير طويل الصفوف متعدد الصفحات مع رأس متكرر، وجميع الملفات Tagged: yes. هذه أدلة محلية ولم تنشر بعد إلى الإنتاج في وقت كتابة السجل.

صندوق إرسال دائم وقوالب معاملات موحدة - 2026-08-21

  • إضافة outbox دائم متعدد القنوات مع idempotency وSKIP LOCKED وlock tokens وretry/dead-letter ومحاولات غير قابلة للطمس وcallbacks مزودين idempotent وحالة إجمالية مشتقة من كل delivery.
  • توحيد النص العربي والإنجليزي والبريد HTML والنص البسيط من renderer واحد، مع نسخ قوالب واعتماد وcriticality، وإبقاء التركية preference جاهزة تسقط إلى الإنجليزية حتى تعتمد ترجمتها.
  • نقل reminders وfan-out الرحلات إلى worker محدود الدفعات والتزامن، ومحاكاة كل delivery لشركات العرض داخل demo_outbox من دون إرسال خارجي.
  • إضافة adapters بريد SMTP/Resend وSMS Twilio/بوابة خارجية وpush وWhatsApp اختياري مستقل عن OTP، مع تحقق نشر يفشل مغلقاً عند تمكين قناة بلا credentials أو webhook verification.

فصل OTP عن Meta وإضافة عقد مزود SMS معتمد - 2026-08-21

  • جعل SMS القناة الافتراضية للتحقق في ويب العميل وتطبيقه المحمول، مع إبقاء تيليجرام مساراً منفصلاً يختاره المستخدم صراحة. أزيل خيار WhatsApp ورابط wa.me من تدفقات الهوية الجديدة.
  • إضافة واجهة مزود مستقلة تدعم Twilio Verify أو بوابة خارجية معتمدة عبر HTTPS، مع idempotency، معرف طلب المزود، تصنيف الأخطاء القابلة لإعادة المحاولة، ورفض أي استجابة نجاح لا تثبت قبول الطلب. عُطّل Nabda/Meta لرموز الهوية.
  • الحفاظ على توافق إصدارات الجوال القديمة بتحويل method=whatsapp إلى SMS وإرجاع actualChannel=sms بوضوح، بدون إجراء اتصال بواجهات Meta.
  • تقوية تحديات التطوير والحسابات التجريبية: HMAC بدلاً من حفظ الرمز الصريح، صلاحية خمس دقائق، حد خمس محاولات، واستهلاك لمرة واحدة.
  • إضافة تحقق نشر يرفض مزوداً مجهولاً أو إعداداً ناقصاً أو رابط بوابة خارجية بلا HTTPS، وتوثيق عقد البوابة وقائمة قبول المورد.
  • الأدلة المنفذة لهذا التغيير: 63/63 اختبار خدمة بريد/WhatsApp/OTP، و111/111 اختبار Auth/API في ويب العميل، و45/45 اختبار Flutter مستهدف، مع type-check نظيف للحزم وتطبيق العميل وflutter analyze بلا مشاكل. هذه الأدلة تخص مسارات الإشعارات والتحقق المعدلة ولا تدعي اختبار بقية المنظومة.

مدرج يوم التشغيل وتصحيح حقيقة تقييمات الشركات - 2026-08-21

  • إعادة بناء الصفحة الرئيسية للوحة الشركة حول «مدرج يوم التشغيل»: عنوان موحد بتوقيت دمشق، أربع إشارات تشغيلية، خط 24 ساعة، مغادرات مرتبة زمنياً، قائمة قرارات قابلة للتنفيذ، وروابط مباشرة إلى غرفة التشغيل والحجوزات والتتبع.
  • جعل أرقام التدخل مرتبطة برحلات يوم التشغيل بدلاً من عدّ كل حجز معلق تاريخي؛ أصبحت حالات التأخير وتجاوز وقت الوصول ونقص الباص أو السائق ظاهرة من الصفحة الأولى، مع إبقاء مؤشرات الإيراد والإشغال في مستوى ثانوي.
  • توحيد التصميم على أخضر شام باص والأبيض والرمادي المحايد، مع حالات كهرمانية وحمراء للمعنى التشغيلي فقط، وتحسين ترتيب الإجراءات والإشارات لعرض الهاتف 390px ودعم تقليل الحركة.
  • تصحيح مصدر تقييمات لوحة الشركة وواجهة تقييمات الشركة العامة لاستخدام عمود trip_reviews.overall_rating الحقيقي. أزيل طلب عمود rating غير الموجود وفلتر trips.company_id غير الموجود؛ أصبح العزل عبر trip_reviews.company_id، مع إرجاع خطأ صريح إذا فشل استعلام الإحصاءات.
  • تحقق المتصفح محلياً بحساب شركة حقيقي من تحميل مركز التشغيل ببيانات قاعدة البيانات بلا خطأ JavaScript أو استجابة API فاشلة، وراجع سطح المكتب وعرض 390px. نجح تطبيق لوحة الشركة في 3,707/3,707 اختباراً وتطبيق العميل في 3,065/3,065، مع type-check وlint نظيفين وبناء إنتاج ناجح للتطبيقين والوثائق وفحص جودة التوثيق. استخدم بناء العميل USE_DEV_OTP=false لأن حارس الإنتاج رفض إعداد OTP التطويري المحلي كما هو مطلوب. لا تعني هذه الأدلة أن بقية أسطح المنظومة اختُبرت في هذا التغيير.

صيانة تحافظ على حقيقة تشغيل الرحلة - 2026-08-21

  • إيقاف مهمة كانت تحول كل رحلة SCHEDULED تجاوز وقتها مباشرةً إلى DEPARTED خارج غرفة التشغيل؛ هذا المسار كان يتجاوز فحوص الجاهزية والصعود وتكليف السائق وسجل أحداث الحالة.
  • استبدال التغيير التلقائي بتدقيق قرائي يحصي الرحلات المجدولة المتأخرة والرحلات النشطة التي مر على موعد وصولها 24 ساعة بلا وصول فعلي. يُحفظ عدد الحالات التي تحتاج مراجعة في تفاصيل تشغيل الصيانة وملخصه، ولا تتغير أي رحلة.
  • كشف التحقق القرائي 9,194 رحلة نشطة قديمة بلا وصول فعلي ضمن شركة إنتاج واحدة. لم تُغلق أو تُحذف تلقائياً؛ تحتاج هذه البيانات إلى تسوية محكومة بسياسة مستقلة.

تصحيح دخول الإدارة ومصفوفة تحقق الإنتاج - 2026-08-21

  • تصحيح هوية rate limit في Kong لمسارات Auth والجلسات وREST العامة: كانت القيمة الافتراضية تجمع جميع الطلبات التي تحمل مفتاح Supabase العام تحت consumer anon واحد، فكان حد Auth البالغ 5 طلبات/ثانية سقفاً مشتركاً للمنصة. أصبحت الحدود العامة حسب عنوان المصدر الذي يحله Kong من سلسلة Traefik الموثوقة، مع إبقاء ميزانية REST الخادمية الموثوقة وحدها حسب consumer service_role.
  • منع غلاف الإدارة من طلب /api/auth/me في المتصفح المجهول الجديد، كي لا يسجل تسجيل الدخول خطأ 401 متوقعاً في console. فحص getSession() هنا مجرد كشف محلي لوجود جلسة؛ تبقى هوية المشرف وblocklist وإثبات TOTP والصلاحيات تحت حارس الخادم قبل تركيب أي صفحة محمية.
  • تحديث عقد الحجز المكتبي في مجموعة الإنتاج المحمية ليفتح صندوق QA خاصاً به، ويرفض لمس أي صندوق تشغيلي مفتوح مسبقاً، ويربط التحصيل النقدي بالصندوق ثم يوازنه ويغلقه داخل finally ويحذف سجلاته الاختبارية بعد حذف الحجوزات التابعة.
  • جعل مرجع اختبار الأسطول مستقلاً ودقيقاً وفق عقد التشغيل: الصعود ضمن 12 ساعة قبل/بعد الوقت الحالي، والرحلة المنطلقة ذات الوصول غير المسجل خلال آخر 24 ساعة. لا تعود رحلات DEPARTED القديمة تجعل الباص مشغولاً إلى الأبد، مع إبقاء السجلات القديمة غير المكتملة مشكلة بيانات تشغيلية ظاهرة تحتاج معالجة منفصلة.
  • ضمان حذف أي تكليف سائق ينشئه اختبار أسطح الجوال في كل مسار فشل وفي afterAll، بدلاً من ترك تكليف QA داخل الإنتاج.
  • نجحت المصفوفة الكاملة بعد نشر تصحيح Kong: 27/27 خلال 1.3 دقيقة، وتشمل عقود الحجز والصندوق والقفل المتزامن، والمسارات والأسطول والأداء، ودورة العرض الخاص، وسطحي Flutter، وتدقيق ستة أسطح عامة على 390px، وأدوار الشركة والمنصة المرتبطة بـTOTP. سجل بحث الرحلات المتزامن p95 قدره 254ms، وAPI الرحلات 216ms، وتهيئة جلسة اللوحة 119ms، والتنقل إلى صفوف الرحلات 986ms بلا طلب عميل مكرر. اجتازت الإدارة أيضاً 2,445 اختباراً في 231 ملفاً، مع type-check وlint وبناء إنتاج نظيف. لا تمثل هذه الأرقام مسارات خارج المصفوفة المعلنة.

استعادة جلسة الإدارة الآمنة - 2026-08-21

  • إصلاح حالة إنتاج كان فيها Supabase ما يزال يعرّف المشرف بعد انتهاء إثبات العامل الثاني؛ كان غلاف الإدارة يظهر ثم تفشل الصلاحيات وبيانات الصفحة بـ403. أصبح الغلاف يتحقق من endpoint الخادم نفسه قبل تركيب أي صفحة، ويعيد الجلسة المنتهية إلى تسجيل الدخول مع رسالة عربية واضحة وإعادة TOTP.
  • توحيد الخروج مع مسار الخادم الذي يسحب إثبات 2FA ويضيف التوكن إلى blocklist، وإضافة فحص blocklist أيضاً إلى محقق هوية الإدارة الذي يغذي الغلاف.
  • حصر حمولة /api/auth/me في الملف العام للمشرف والصلاحيات. أضيف اختبار يمنع تسلسل سر TOTP أو hashes رموز الاسترداد إلى المتصفح حتى لو احتوى صف الحارس الداخلي هذه الحقول.
  • اجتاز الإصلاح 2,444 اختباراً في 231 ملفاً للإدارة و176 اختباراً لحزمة المصادقة، مع type-check وlint وبناءي الإنتاج للإدارة والتوثيق وفحص جودة التوثيق.

غرفة تشغيل الرحلة ويوم التشغيل - 2026-08-21

  • تحويل قائمة الرحلات إلى يوم تشغيل افتراضي بتوقيت دمشق مع اليوم والغد وتاريخ محدد وسجل كامل حديث أولاً، وعدادات مرتبطة بالعرض وسياق الباص والسائق والتأخير والإشغال ورابط مباشر إلى غرفة التشغيل.
  • إضافة غرفة تشغيل متجاوبة تعرض الجاهزية ودورة الحالة وكشف الركاب والحضور وعدم الحضور والتراجع والتجهيز وآخر 25 حدثاً. تمنع الجاهزية بدء الصعود عند نقص الباص أو المخطط أو السائق أو الرخصة أو وجود صيانة، وتمنع الانطلاق حتى حسم كل حجز مؤكد.
  • توحيد كل مسارات تغيير الحالة الفردية والجماعية على معاملة PostgreSQL واحدة تقفل الرحلة وتزامن أوقات التشغيل وتكليف السائق وسجل التدقيق. الإلغاء يتطلب سبباً ويلغي الحجوزات النشطة ويضيف إشعار مراجعة استرداد، مع إبقاء حقيقة الدفع حتى ينفذ قرار الاسترداد المالي صراحةً.
  • إغلاق مسار قديم كان يسمح بتغيير حضور الحجز أو إكماله مباشرة من قائمة الحجوزات. أصبح التأكيد مقيداً بدالة تقفل الحجز والرحلة، وأصبحت حالات الحضور وعدم الحضور والإكمال ملكاً حصرياً لغرفة التشغيل ومعاملة إغلاق الرحلة.
  • إبقاء إعادة ضبط وحصاد العروض التجريبية متوافقين مع حماية سجل الرحلة: لا يمكن تجاوز منع حذف الرحلات التاريخية إلا داخل معاملة هدم صريحة تحمل صلاحية service_role، ولا يملك مستخدم الشركة أو العميل هذا المسار.
  • إصلاح عقد هوية السائق بين لوحة الشركة وتطبيق السائق: تستخدم الرحلة معرف company_users وتحوّله قاعدة البيانات تلقائياً إلى ملف drivers وتكليف واحد متزامن. رُبطت الملفات القديمة القابلة للحل، وتمنع الجاهزية والتشغيل أي ملف أو تكليف غير متطابق بدلاً من إخفاء رحلة السائق بعد إنشائها.
  • سحب تعديل تكليف الرحلة المباشر من السائق. تمر حالتا «في الطريق إلى الباص» ودورة BOARDING → DEPARTED → ARRIVED → COMPLETED عبر عقود أمامية فقط تتحقق من الهوية والتكليف وتكتب الأوقات وسجل التشغيل ذرياً، ولا تسمح للسائق بإلغاء الرحلة أو إرجاعها إلى الماضي.
  • تحقق عقد PostgreSQL سلوكي داخل ROLLBACK من دورة كاملة، ورفض الانطلاق قبل حسم الكشف، والحضور، وعدم الحضور والتراجع، والإلغاء الذري والإشعارات وحفظ الدفع. كما تحقق المتصفح المسجل من فلاتر اليوم والغد والسجل وغرفة التشغيل، ونجح عرض 390px من دون overflow أو أخطاء console أو استجابات منتج فاشلة.

دفتر التحصيل وتخطيط الرحلات المتكررة - 2026-08-21

  • توحيد تحصيل الشركة في دفتر واحد يجمع عمليات الدفع وتحصيل السائق وحجوزات المكتب وحقيقة دفع الحجز، مع pagination وفلاتر وإحصاءات مصدرها PostgreSQL ومنع العد المكرر. أصبحت قرارات التأكيد والرفض والاسترداد تسجل مستخدم الشركة المنفذ وتزامن حالة الحجز ذرياً.
  • إغلاق الكتابة المباشرة من جلسات المتصفح على جدولي الحجوزات وعمليات الدفع. أصبح إلغاء العملية والتحقق والاسترداد الكامل وتعديل الملاحظات عقوداً ذرية مقيدة بالشركة، مع ملاحظات نهائية غير قابلة للتغيير وربط التحصيل النقدي بصندوق مفتوح. كان الإصدار وقتها يتضمن عقد webhook أولياً؛ ألغاه قرار 2026-08-24 لأنه لم يستند إلى مواصفات تاجر رسمية، وأصبح المسار غير فعال ولا يقرأ payload.
  • معالجة اختلاف checksum تاريخي معروف في ترحيل حماية مراجعات العملاء بدلاً من تجاوزه. يعيد 00216 تثبيت ملكية الحجز واكتمال الرحلة وثبات هوية المراجعة أولاً، ثم يطبع checksum لمسودة 00203 المحددة فقط؛ ويبقى أي اختلاف آخر فشلاً مغلقاً في مشغل الترحيلات.
  • إضافة دورة تسوية لصندوق المكتب: رصيد افتتاح، صندوق مفتوح واحد لكل شركة، تحصيل نقدي محسوب من وقت الفتح، حركات موقعة، عد فعلي عند الإغلاق، وفرق محفوظ مع ملاحظة إلزامية عند الزيادة أو العجز. يبقى تحصيل السائق منفصلاً إلى أن تثبت البيانات تسليمه للمكتب.
  • استبدال نموذج إضافة الرحلة القديم بمخطط موحد لرحلة واحدة أو سلسلة متكررة. يعرض المخطط معاينة كل موعد ويفحص تداخل الباص والسائق والصيانة وصلاحية الرخصة، ثم يعيد الفحص تحت أقفال المعاملة قبل الإنشاء. يدعم تجاوز المواعيد المتعارضة بقرار صريح ولا يحفظ سلسلة فارغة.
  • توحيد تحويل مدخلات التواريخ والأوقات التشغيلية بين توقيت دمشق وUTC في الرحلات والحجوزات المكتبية والتقارير والتحليلات، وتصحيح أسهم pagination المشتركة لتتبع اتجاه RTL.
  • تحقق التشغيل المحلي من دخول حساب الشركة الحقيقي ومن معاينة سلسلة على بيانات seed؛ اكتشف العقد 29 تداخلاً للباص ومنع الإنشاء، بلا خطأ API أو JavaScript، مع مراجعة مرئية لسطح المكتب وعرض 390px. اجتاز dashboard كاملًا 272 ملف اختبار و3,704 اختبارات. كما نجحت عقود PostgreSQL السلوكية الـ24، وفحص الأنواع والـlint على مستوى المستودع، وبناء الإنتاج لتطبيقات الويب الثلاثة والوثائق، وفحص جودة التوثيق. اجتاز تطبيق العميل 1,417 اختبار Flutter وتطبيق السائق 671 اختباراً، مع فحص تحليل ساكن نظيف لكليهما.
  • صححت وثائق المنتج حد النسخة الحالية صراحةً: الرحلات المنشأة تُدار فردياً ولا يوجد بعد تعديل أو إلغاء جماعي لكل السلسلة.

اكتمال تجربة العميل واللغات والولاء - 2026-08-11

  • نقل بوابة العملاء إلى كتالوجات next-intl عربية وإنجليزية متطابقة البنية، مع حفظ اللغة وضبط lang وdir وبيانات SEO ورسائل الأخطاء والتواريخ والأرقام بحسب اللغة. صححت أسهم الرجوع والتقدم ومسارات الرحلة لتنعكس بين RTL وLTR.
  • نقل تطبيق Flutter للعميل إلى gen-l10n بكتالوجي ARB كاملين، وإضافة اختيار لغة محفوظ في الإعدادات وتوطين بيانات الرحلات والحجوزات والمشاركة والدعم والولاء. أصبحت البنية جاهزة لإضافة التركية ككتالوج جديد بدلاً من شروط نصية موزعة في الشاشات.
  • إكمال دورة الولاء من الاستبدال الذري للنقاط إلى معاينة القسيمة وتطبيقها مرة واحدة داخل حجز اتجاه واحد أو ذهاب وعودة. يحفظ الحجز السعر قبل الخصم وقيمة الخصم، وتبقى القسيمة غير مستخدمة إذا فشل حجز المقاعد.
  • تحصين مراجعات الرحلات: لا ينشئ العميل مراجعة إلا لحجز يخصه ورحلة مكتملة، ولا يستطيع تغيير معرفات الملكية أو حالة الإشراف بعد الإنشاء.
  • جعل مركز العرض المخصص ثنائي اللغة باسم ووصف مطابقين للغة، ورسائل فشل مبنية على errorCode ثابت، وألوان وروابط وحالات صندوق رسائل دفاعية. تبقى جلسات الشخصيات داخل cookies من نوع HttpOnly ولا تصل الرموز إلى JavaScript.
  • إزالة رابط APK الافتراضي المكسور. لا يظهر زر التنزيل إلا عند ضبط رابط HTTPS صريح، وتعرض الصفحة نسخة الويب كبديل.
  • التحقق من بوابة العميل كاملة: نجح 3,063 اختباراً في 176 ملفاً بلا فشل، مع type-check نظيف. نجحت أيضاً اختبارات الإدارة المتأثرة وtype-check، واختبارات قاعدة بيانات فعلية داخل ROLLBACK للاستبدال المتزامن وتطبيق الخصم. هذه أدلة على النطاق المذكور، وليست ادعاءً باجتياز بوابات المستودع أو الإنتاج قبل تشغيلها.
  • اكتشاف اختلاف checksum تاريخي وحيد في 00166 بدلاً من تجاهله. أضيف ترحيل 00206 غير قابل للتغيير ليعيد تثبيت مالك واحد لتحديث سعة المقاعد ويصالح القيم، وأصبح runner يقرأ سجل الترحيلات مرة واحدة ويفشل عند أي اختلاف غير معروف. أضيف أيضاً أمر واحد يشغّل جميع عقود PostgreSQL في جلسة واحدة لتقليل وقت Docker.
  • رفض فك ترميز أسرار TOTP بصيغة Base64URL غير قانونية أو غير معيارية، حتى لا تستطيع قيمة معدّلة ذات tail bits مهملة أن تنتج البايتات نفسها وتفلت من فحص العبث في الغلاف المشفر.
  • حجب دالة trigger الخاصة بتعبئة تفاصيل سعر الحجز عن أدوار العميل؛ كشف فحص RLS المتكامل أن PostgreSQL منح الدالة الجديدة صلاحية EXECUTE العامة افتراضياً.
  • إصلاح بقاء غلاف لوحة الشركة الموثق حول صفحة الدخول بعد تسجيل الخروج؛ أصبحت الصفحة العامة مشتقة من المسار الحي لأن Root Layout يبقى بين تنقلات العميل، ويستبدل الخروج المسار ويعيد تحميل جلسة الخادم. يعاد موضع التمرير إلى البداية عند الانتقال بين المسارات العامة والمحمية.
  • تثبيت تنسيق أرقام الأسعار على ar-SY-u-nu-latn في كل واجهات لوحة الشركة؛ أزال ذلك اختلاف hydration الذي كان يعرض 15,000 من الخادم و15.000 من المتصفح في /trips. تحقق فحص متصفح بعرض 390px من الدخول والرحلات وخريطة المقاعد والخروج من دون overflow أو خطأ JavaScript.
  • إصلاح توقف إعادة تشغيل الإنتاج عندما كانت صلاحية ملفات الإعدادات المتتبعة 0600: أصبح مسار النشر يضمن قراءة PostgreSQL وLoki وبقية الحاويات غير الجذرية للإعدادات غير السرية فقط، مع إبقاء ملفات الأسرار مقيدة. أضيف الترحيلان 00208 و00209 لإعادة تثبيت عقدي QR غير المتصل وهوية سائق محادثة الرحلة وتطبيع checksum التاريخي الدقيق لـ00181 و00182 بعد نجاح الإصلاح، ولا يزال runner يرفض أي اختلاف غير معروف.
  • إيقاف Service Worker لبوابة العميل عن تخزين HTML وRSC واستجابات العرض الخاصة ذات private, no-store. النسخة shambus-static-v3 تحذف مخبأ v2 القديم، وتخزن الأصول العامة الثابتة فقط، وتجلب الصفحات من الشبكة مع صفحة offline عند الانقطاع. يمنع ذلك تشغيل markup قديم مع حزمة JavaScript جديدة واختلاف React hydration.
  • جعل أول render لمركز العرض ثابتاً بين الخادم والمتصفح، وتأخير قراءة capability حتى اكتمال hydration، وعدم حذفها من fragment إلا بعد قبولها. يمنع ذلك سباق إعادة تركيب effects الذي كان يستطيع إرسال فحص بلا رمز. أصبح /demo أيضاً صفحة مستقلة بلا غلاف تنقل العميل أو طلبات مصادقة مجهولة، وأضاف الاختبار المحمي فشلاً صريحاً عند أي pageerror أو console.error.
  • إصلاح اختلاف تاريخ شريط الأيام في /trips: كانت Node تبني منتصف الليل وفق UTC بينما يبنيه المتصفح وفق منطقته، فيظهر اليوم نفسه 11 أغسطس من الخادم و10 أغسطس في hydration. أصبحت قيم التاريخ المجردة ممثلة بظهر UTC، وضُبطت منطقة أعمال بوابة العميل صراحةً على Asia/Damascus، ولا يُشتق «اليوم» إلا بعد تركيب العميل. نجح مسار العرض إلى نتائج الرحلات في ستة سياقات متصفح جديدة متتالية داخل نسخة React غير المصغرة بلا خطأ hydration.
  • فصل تحرير قفل المقعد عن سقف محاولات حجزه. كان استهلاك سقف القفل يمنع طلب DELETE أيضاً ويترك المقعد مشغولاً حتى انتهاء مهلة الخمس دقائق. يبقى الإنشاء محدوداً، بينما يظل التحرير متاحاً مع حماية CSRF وصلاحية الرحلة ومعرّف جلسة UUID والتحقق من ملكية القفل بالرحلة والجلسة.
  • نقل ملفات Next.js instrumentation في بوابات العميل والشركات والإدارة إلى src/instrumentation.ts كي تدخل فعلياً في حزمة الإنتاج. يعيد ذلك تشغيل تسجيل OpenTelemetry وتهيئة محددات المعدل المشتركة في Redis بدلاً من عدادات ذاكرة منفصلة تزول عند إعادة التشغيل أو تختلف بين النسخ. تشارك الخدمة حالتها الآن عبر globalThis وتنتظر اتصال Redis عند أول طلب أيضاً، حتى لا تنشئ حزم Next.js نسخ singleton منفصلة بين instrumentation وroute handlers.

إصلاح تعديل حجوزات العملاء - 2026-08-10

  • استبدال تعديل الحجز متعدد الاستعلامات بعقد PostgreSQL ذري ومتسلسل مع قفل المقاعد؛ لم يعد ممكناً حفظ الرحلة ثم فشل تحديث السعة أو خسارة تعارض متزامن.
  • دعم أسماء المقاعد الفعلية مثل 1D ومخططات الشركات المخصصة، مع تسعير كل مقعد على الخادم، والإبقاء الإلزامي على عدد المسافرين بدلاً من إسقاط الحجز متعدد المقاعد إلى مقعد واحد.
  • إبقاء التعديل ضمن الشركة ومدينتي المسار نفسيهما، وإحالته إلى الشركة إذا تم تحصيل الدفع النقدي أو تسجيل الصعود، وإزالة وعود الاسترداد الإلكتروني غير الصحيحة في سوق الدفع النقدي.
  • مزامنة مخزون الرحلتين وجدول المقاعد القديم وتدوير QR المتصل ورمز HMAC غير المتصل في المعاملة نفسها، وإصلاح استدعاء إنشاء QR الذي كان يرسل معاملاً غير موجود في دالة قاعدة البيانات.
  • إصلاح خريطة المقاعد المشتركة كي تعرض الباصات ذات التخطيط الثابت بدلاً من رفضها، ومنع عرض مخطط مسودة لا تقبله عقود الحجز، مع حالات عربية وإنجليزية وأسهم اتجاهية صحيحة.
  • التحقق محلياً بترحيل فعلي وتجربة تعديل بين رحلتين داخل ROLLBACK: انتقلت السعة بمقعد واحد في الاتجاهين، وتحدث الحجز، وأصبح QR يشير إلى الرحلة الجديدة.

إصلاح إدارة مقاعد الرحلات - 2026-08-10

  • توحيد عقد بيانات رحلة المقاعد بين PostgREST والواجهة: يحول API الآن origin_city وdest_city وprice_base إلى origin وdestination وprice صراحةً، بدلاً من ترك الصفحة تقرأ حقولاً غير موجودة وتنهار عند فتح خريطة المقاعد.
  • إضافة تطبيع دفاعي في الواجهة وحالة خطأ قابلة لإعادة المحاولة وأسماء بديلة آمنة عند غياب علاقة مدينة، مع اختبارات انحدار تستخدم شكل استجابة الإنتاج الفعلي وتتحقق من أسماء المسار والسعر الأساسي.
  • إسقاط وثيقة تخطيط الباص القياسية إلى شبكة إدارة المقاعد قبل إرسالها للواجهة؛ كان API يرسل صف قاعدة البيانات الخام تحت مفتاح layout فتظهر بطاقة الخريطة فارغة رغم وجود 49 مقعداً صالحاً. ترفض الواجهة الآن أي عقد تخطيط غير صالح بدلاً من عرضه بصمت.
  • توحيد حجوزات المقعد المفرد والحقول متعددة المقاعد، ودعم حالة CONFIRMED الفعلية عند تلوين المقعد وحساب الأعداد من دون تكرار أو قيم سالبة.

إصلاح تحليلات لوحة الشركات - 2026-08-10

  • استبدال أكثر من عشرة استعلامات PostgREST متسلسلة بلقطة PostgreSQL واحدة مفوضة حسب الشركة. كانت الصفحة تضع آلاف معرفات الرحلات داخل عدة روابط bookings?trip_id=in.(...)؛ سجل الإنتاج رفضاً فعلياً بحالة HTTP 414 وأعاد مؤشرات صفرية جزئية بدلاً من بيانات صحيحة.
  • أصبحت الإيرادات والأعداد والإشغال وسلاسل 30 يوماً و12 شهراً وأداء المسارات محسوبة داخل قاعدة البيانات من جميع الصفوف، لا من أول 1,000 صف، مع تقييمات المسارات الحقيقية وتوزيع تكرار السفر بدلاً من تقييم ثابت أو مدن مخمنة من أرقام الهواتف.
  • حصر API التحليلات بدوري المالك والمدير وإضافة اختبار عقد للدالة يمنع تنفيذها من anon أو من مستخدم تابع لشركة أخرى.
  • استبدال خمسة طلبات التحليلات المتقدمة التي كانت تنزّل قرابة 650 كيلوبايت من صفوف الحجوزات مرتين عند فتح التبويب بطلب مفوض واحد يعيد مجاميع محدودة. لم تعد النتائج تُبتر عند 1,000 صف، وأصبح إشغال المسار يعتمد سعة الرحلات الفريدة.
  • إصلاح خيار «أسبوعي» الذي كان يرسل قيمة يرفضها API ويترك أرقاماً قديمة على الشاشة، مع تبديل الفترات من لقطة محملة مرة واحدة وإظهار فشل التحميل وزر إعادة المحاولة للمستخدم.
  • إصلاح نظام إحداثيات مخططات الخط والمساحة وتوقع الإيراد الذي كان يمدد النص العربي أفقياً ويخرجه خارج البطاقات، وإزالة الارتفاعات العشوائية من هيكل التحميل لمنع اختلاف HTML بين الخادم والمتصفح.

إشعارات Slack وصفحة الإطلاق - 2026-08-10

  • إضافة توجيه إنتاج آمن من Alertmanager إلى Slack للأخطاء والبنية وطوارئ السائق، مع بقاء ntfy قناة مستقلة وعدم حفظ Webhooks في Git أو متغيرات Docker.
  • ربط قواعد GlitchTip بمستلم Slack-compatible قابل لإعادة التهيئة، وإضافة إشعار تلقائي عند فشل التحقق الأسبوعي من النسخة الاحتياطية.
  • إصلاح هوية مؤسسة GlitchTip في سكربت التهيئة: أصبح يعيد استخدام أقدم مؤسسة Sham Bus بدلاً من طلب slug لا يحفظه الحقل وإنشاء ستة مشاريع مكررة كل مرة، مع إزالة النسخ الفارغة التي أنشأها فحص القبول.
  • إضافة سكربت إرسال مشترك لا يضع Webhook في سطر أوامر curl، وفحص قبول يتحقق من صلاحيات الملفات وإعداد Alertmanager ومستلمي GlitchTip ثم يرسل اختباراً آمناً.
  • تصحيح أيقونة بطاقة العرض المخصص في صفحة «قريباً»: أصبحت أصغر، دائرية، بهوية Sham Bus الخضراء، ومحاذاة مباشرة مع العنوان في RTL على سطح المكتب والموبايل.

صحة الخدمات ودليل الوصول - 2026-08-10

  • إضافة فهرس تشغيل واحد بصلاحية 0600 يجمع روابط المنتج والخدمات وهويات QA ومصادر الأسرار من دون نسخ كلمات المرور أو مفاتيح API إلى Git، مع تصدير مؤقت ومحدود لبيانات الاختبار وحذف آمن بعد الاستخدام.
  • اعتماد Authentik كبوابة روابط Studio وGrafana وGlitchTip، وإخفاء مدخل لوحة Traefik القديم لأن اللوحة وAPI يبقيان داخل شبكة Docker عمداً.
  • إصلاح صلاحيات ملفات provisioning التي منعت Grafana من قراءة لوحة Sham Bus، واستبدال Promtail المنتهي دعمه بـGrafana Alloy 1.16.2 المثبت ببصمة، مع labels ثابتة وvolume دائم لمؤشرات القراءة حتى لا يعيد restart إرسال أشهر من سجلات Docker إلى Loki.
  • إضافة مخطط realtime التشغيلي إلى migration وbootstrap؛ يبقى _realtime لبيانات التحكم بينما يدير Realtime الجداول والدوال والاشتراكات في المخطط التشغيلي كما يتطلب الإصدار المنشور.
  • إضافة healthchecks وظيفية للخدمات الطويلة التي كانت تظهر running فقط: Traefik وPgBouncer وTempo وGrafana وGlitchTip worker وbackup-sync وبوت Telegram ومهمة الصيانة، مع اعتماد خروج مهام التهيئة الثلاث بالرمز 0.
  • جعل تحويلات المسارات ذات الشرطة الختامية في خادم التوثيق نسبية، حتى لا يعلن Nginx الداخلي رابط http عند إنهاء TLS في Traefik.

تحصين صلاحيات قاعدة البيانات وأسرار 2FA - 2026-08-10

  • إصلاح bootstrap كان يعيد منح EXECUTE لكل دوال public إلى anon و authenticated عند كل restart، بما يعكس قيود ترحيلات الأمان اللاحقة.
  • إزالة جميع سياسات القراءة المجهولة التاريخية على bookings وpassengers، وحصر دوال الإدارة والموافقة على الشركات والعروض والتنظيف و2FA في service_role، مع قائمة عامة صغيرة قابلة للتدقيق.
  • توسيع verify_rls_security_posture() ليفشل عند رجوع سياسة PII مجهولة أو دالة SECURITY DEFINER عامة غير مسموحة أو grant عميل على دالة مقيدة.
  • تشفير أسرار TOTP للمشرفين والسائقين بصيغة AES-256-GCM totp:v1 مرتبطة بمعرف الحساب، وإضافة backfill ذري قابل لإعادة التشغيل ضمن ترتيب النشر الذاتي.
  • تطبيق 188 ترحيلاً محلياً، ثم إعادة db-bootstrap وإعادة verifier، وتشغيل backfill مرتين لإثبات idempotency؛ نجحت مجموعة التكامل كاملة 27/27 ملفاً و269/269 اختباراً.

المراقبة وقبول الإنتاج - 2026-08-10

  • فصل تتبع الأخطاء إلى خمسة مشاريع GlitchTip للعميل ولوحة الشركة والإدارة وتطبيقي Flutter، وإضافة Sentry Flutter إلى تطبيق السائق مع التقاط أخطاء الإقلاع من دون طباعة بيانات حساسة في release.
  • إضافة provisioning idempotent لستة مشاريع وسبع مراقبات uptime وقواعد تنبيه وبريد المستلم، وفحص قبول يثبت ingest العام والحفظ ومعالجة worker وإرسال SMTP.
  • إبقاء واجهة GlitchTip خلف Authentik وفتح مسارات Sentry ingest وحدها بحد طلبات وحجم body؛ وتصحيح SMTP إلى STARTTLS/587 بعد إثبات أن 465 محجوب من الحاوية.
  • تصنيف فشل مزود المصادقة في لوحة الإدارة إلى 429 أو 503 قابل لإعادة المحاولة بدلاً من تحويله إلى 401 مضلل، مع إبقاء بيانات الدخول الخاطئة وحدها 401.
  • إضافة ضغط إنتاج محدود ومعزول: 12 عملية بحث، وخمس جلسات قفل، وستة حجوزات على مقعد واحد. نجح الفحص المركز 10/10 وحقق p95 مقداره 298ms و242ms و318ms على الترتيب، مع فائز واحد وتنظيف السعة والقفل بعد الاختبار.
  • جعل sitemap يُنشأ وقت الطلب كي لا يفقد بيانات المدن والمسارات عند بناء الصورة من دون service-role key، مع إزالة روابط المسارات المكررة والطوابع الزمنية المتغيرة كذباً، وإضافة اختبارات ووضع بناء إنتاج ناجح.
  • اجتياز بوابة اعتماديات الإنتاج بلا critical أو high غير معالج؛ بقي تحذيران high محصوران في parsers صور Docusaurus وقت البناء مع رفض الصيغ المتأثرة في فحص جودة التوثيق إلى أن يوفر upstream إصلاحاً.

واجهة الموبايل والخط والبداية - 2026-08-10

  • إعادة تصميم صفحة «قريباً» كتجربة سفر سورية تقودها الصورة بدل بطاقة SaaS: لوحة خضراء أحادية، عنوان عربي تحريري، صورة WebP محلية بثلاثة أحجام، وفصل صريح بين إطلاق الركاب القادم والعروض المخصصة المتاحة للشركات الآن.
  • إعادة كتابة الرسالة التسويقية بالعربية حول مشكلة ونتيجة ملموستين: جمع المواعيد والأسعار والمقاعد للراكب، وتوحيد تشغيل الرحلات والحجوزات والحافلات والفريق للشركة، وشرح أهمية الوصول للعمل والدراسة والعلاج والأهل بين المحافظات.
  • اعتماد توزيع صورة/نص أوسع مستلهم من أنماط السفر والإطلاق في Mobbin، مع stagger قصير ومنحنى spring قليل الارتداد مولد من Motion، ودعم كامل لتقليل الحركة.
  • تثبيت خط Cairo المتغير محلياً في تطبيقي Flutter وإزالة اعتماد google_fonts، مع اختبارات صريحة للثيمين الفاتح والداكن وتحقق من وجود الأصل في FontManifest.json الناتج من بناء الويب.
  • استضافة نسخة Cairo WOFF2 عربية/لاتينية محلياً في صفحة «قريباً» والتوثيق، وإزالة اتصال Google Fonts الخارجي وتشديد CSP وسياسة تخزين أصل الخط.
  • تحسين صفحة «قريباً» بإجراء أخضر واحد لطلب عرض مخصص، وتحسين عنوان التوثيق العربي على عرض 390px، وتوحيد زوايا وظلال تسجيل دخول الإدارة مع نظام الأسطح.
  • إزالة انتظار splash الاصطناعي لمدة ثانيتين من تطبيق السائق؛ ينتقل التطبيق بعد أول frame وقرار الجلسة بدلاً من تأخير كل تشغيل.
  • توسيع نشر التطبيقات المتدرج ليقبل صفحة coming-soon صراحةً مع رفضها في وضع live، واستبعاد Pods وGradle artifacts من سياق Docker لتطبيق السائق لتقليل نقل وبناء الملفات المولدة في النشرات التالية.
  • إضافة فحص Playwright دائم للعرض 390×844 يغطي الصفحات العامة الست: «قريباً»، تطبيق الراكب، تطبيق السائق، تسجيل الشركة، تسجيل الإدارة، والتوثيق. يفشل الفحص عند overflow أو خطأ JavaScript أو console error أو استجابة HTTP فاشلة، وينتظر حالة Flutter مفيدة بدلاً من تصوير splash.
  • التحقق المحلي شمل مجموعتي Flutter الكاملتين قبل إضافة اختبارات الخط (1,415 للعميل و666 للسائق)، واختبارات Cairo الجديدة 2/2 لكل تطبيق، وanalyzer نظيفاً وبناء Web release ناجحاً للتطبيقين. هذه أدلة على النطاق المذكور ولا تعني أن الكاميرا أو GPS أو العمل في الخلفية اختُبرت على جهاز فعلي.

عقد المقاعد والحجز المكتبي - 2026-08-09

  • إصلاح خطأ الإنتاج 500 في قفل المقاعد الناتج عن استخدام FOR UPDATE مع دالة تجميع، واستبداله بقفل ذري متسلسل يثبت ملكية جلسة القفل ويرفض التعارضات.
  • توحيد أسماء المقاعد الفعلية مثل 1D مع الأرقام الترتيبية القديمة، وإصلاح إلغاء الحجز الحرفي من دون تحويل غير آمن إلى integer أو تعديل مزدوج للسعة.
  • نقل حجزي العميل الأحادي والذهاب والعودة إلى عقود ذرية تعتمد أقفال المقاعد وأسعار الخادم؛ يفشل الذهاب والعودة كاملاً عند غياب أحد القفلين.
  • استبدال الإدخال المباشر في مساري الحجز المكتبي ولوحة الحجوزات بعقد واحد مقيد بالشركة، يحسب السعر في الخادم ويرفض المقعد المحجوب أو المقفول أو المحجوز عبر أي مسار آخر، مع إبقاء الدفع نقدياً.
  • إضافة مخزون مكتبي يعرض الأسماء والحالات والأسعار الفعلية، وتقييد القائمة والإحصاءات بالشركة، ومنع السائق من تغيير الحجز مع السماح لمسؤول التشغيل.
  • التحقق شمل 64 اختباراً مركزاً للوحة، بناء إنتاج ناجحاً، rehearsal على مخطط الإنتاج داخل معاملة أُجبرت على ROLLBACK، ثم مجموعة Playwright محمية كاملة من 18/18 رحلة على الإنتاج في 1.2 دقيقة. تغطي المجموعة العقود المحددة للقفل والحجز والإلغاء والذهاب والعودة والحجز المكتبي والأدوار والموبايل والعرض المخصص، ولا تُعد ادعاءً بأن كل ميزة في المنظومة اختُبرت.

جاهزية الإنتاج وأداء الرحلات - 2026-08-09

  • إصلاح ربط MinIO في Traefik بعد أن كان تعريف خدمتين بلا اختيار صريح يجعل كل مساري API والواجهة يعيدان 404، مع إبقاء S3 API داخل شبكة Docker وإزالة مسار لوحة Traefik العام غير المستخدم.
  • ترقية MinIO من إصدار يناير 2024 إلى الإصدار الأمني المفتوح المصدر الأخير المثبت على commit وبصمات صور ثابتة، وترقية عميل mc، وتثبيت اسم شبكة Docker وحد استجابة ForwardAuth لمنع fallback الشبكة والذاكرة غير المحدودة.
  • ترقية Authentik مرحلياً عبر تسعة حدود إصدار موثقة حتى 2026.5.6، مع dump متحقق عند كل حد، إزالة Redis بعد انتقال upstream، volume /data مشترك، إسقاط capabilities، ومنع رفع الامتيازات.
  • ترقية طبقة Supabase الذاتية على clone إنتاج معزول إلى GoTrue 2.189.0 وPostgREST 14.12 وRealtime 2.102.3 وStorage 1.60.4 وPostgres Meta 0.96.6 وStudio الحالي، مع تثبيت كل صورة ببصمة وعدم خلطها مع ترقية PostgreSQL 17.
  • ترقية Kong من 2.8.1 المنتهي إلى 3.9.3 المثبت، ونقل routing إلى expressions، وإضافة فحص config قبل الاستبدال، وإغلاق OpenAPI العام وواجهات Realtime control-plane بطبقتين.
  • فصل مفاتيح تشفير Realtime وPostgres Meta عن JWT، وتقييد PostgREST بمخطط public وحد 1,000 صف، وإضافة healthchecks فعلية لكل خدمات البيانات التي كانت تظهر running بلا readiness.
  • إضافة مقاييس حالة/زمن Kong وتنبيهات scrape و5xx وp95، مع تحديث اسم metric الذي تغير في Kong 3 ومنع إنذار اتصال زائف عندما لا يوجد مرور.
  • إضافة حد حجم 10 GB إلى احتفاظ Prometheus بجانب حد 15 يوماً، وتصحيح تنبيه التخزين ليتجاهل حد الحجم الصفري بدلاً من القسمة عليه وإطلاق إنذار دائم كاذب.
  • مقارنة Trivy للصور القديمة والجديدة وحفظ تقارير JSON كاملة وratchet مرتبط بالبصمات؛ انخفضت النتائج القابلة للإصلاح المجمعة من 42 critical و521 high إلى 8 و188، وأصبح Kong/PostgREST صفراً.
  • إضافة runbook كامل للنسخ والـ clone والترقية المرحلية والرجوع، والتحقق من بقاء 45 مستخدماً ومن انتقال migrations على النسخة فقط قبل لمس الإنتاج.
  • إصلاح قائمة الحجوزات التي كانت تقطع سجل الشركة عند أحدث 200 صف، ما جعل البحث في الحجوزات القديمة والعدادات والإيرادات غير دقيقة. أصبحت القائمة صفحة خادمية من 10 صفوف مع إجمالي وحالات وإيرادات كاملة ضمن tenant واحد.
  • إضافة بحث خادمي برقم الحجز واسم الراكب وهاتفه، فلتر تاريخ الرحلة بتوقيت دمشق، حالة لم يحضر، خطأ قابل لإعادة المحاولة، وإجراءات جماعية لا تظهر إلا عندما تكون صالحة لكل الحجوزات المحددة.
  • إخفاء الإلغاء ومؤشر قرب الرحلة عن حجوزات لم يحضر المغلقة، وتصحيح صياغة الوقت العربي المركب مثل «خلال ساعتين و30 دقيقة».
  • توحيد تصدير CSV مع فلاتر الشاشة، وحماية الخلايا من spreadsheet formula injection، وإظهار حد 5,000 صف والعدد الكامل عند الاقتطاع بدلاً من قص الملف بصمت.
  • تحويل قائمة رحلات الشركة إلى pagination حقيقية من الخادم بواقع 25 صفاً، مع البحث والفلاتر وعدادات الحالات في RPC واحدة مفوضة على مستوى tenant، بدلاً من تحميل تاريخ الشركة وإطلاق سبعة طلبات count منفصلة.
  • تقديم bootstrap الهوية والشركة من الخادم، وإرسال أول 25 رحلة مع مستند الصفحة، بحيث لا تنتظر الواجهة جلب الهوية ثم تعيد طلب /api/trips من المتصفح.
  • التحقق على شركة QA تحتوي 13,766 رحلة: أعاد API الصفحة المحدودة في 183ms، واكتمل bootstrap الهوية في 106ms، وظهرت الصفوف بعد الانتقال داخل اللوحة في 906ms بلا طلب /api/trips متكرر من المتصفح. هذه قياسات لعينة إنتاج واحدة وليست ضمان زمن ثابتاً لكل شبكة.
  • إصلاح timeout كان يمنع إنشاء رحلة صالحة: استُبدلت حلقة إنشاء المقاعد بإدراج PostgreSQL جماعي آمن، فانخفض المسار المقاس من نحو 9.88 ثوانٍ إلى 74 مللي ثانية.
  • تجميع عدادات المسارات التاريخية والقادمة داخل PostgreSQL في استدعاء tenant واحد، وتصحيح تسمية «رحلات يومية» المضللة، وإضافة إنشاء اتجاه العودة بدلاً من نسخ مستحيل بسبب قيد التفرد.
  • تصحيح فلاتر الأسطول لتفصل فعلياً بين المتاح، وفي رحلة، والصيانة المستحقة، وخارج الخدمة؛ مع منع تغيير السعة خارج محرر المقاعد ومنع إيقاف باص مرتبط برحلة متأخرة أو نشطة.
  • إصلاح حالة «في رحلة» عند الشركات ذات التاريخ الكبير: أصبحت PostgreSQL تعيد أحدث رحلة تشغيلية واحدة لكل باص بدلاً من الاستنتاج من أول 1,000 صف في PostgREST، مع فهرس جزئي وعقد tenant/role صريح واختبار إنتاج يتجاوز السقف السابق.
  • إغلاق قراءة نقاط API للمسارات والأسطول أمام دور الموظف العام بما يطابق قواعد التنقل، والتحقق الصارم من الفلاتر والأنواع والحدود قبل وصولها إلى الخدمات.
  • إعادة الهوية الخضراء الأصلية #10B981 إلى الويب وتطبيقي Flutter، وإزالة خلفيات sandstone والكوبَر الزخرفي لصالح أسطح بيضاء/slate باردة وألوان حالة ذات معنى فقط.
  • توحيد شاشة بدء تطبيق العميل على الويب مع الهوية نفسها، بحيث تظهر خلفية slate باردة ومؤشر emerald منذ أول بايت بدلاً من ومضة كريمية قبل أول إطار Flutter.
  • إزالة آخر الأسطح الكريمية المتبقية من رئيسيتي لوحة الشركة والإدارة، ووسم نوع الرحلة، وصفحة «قريباً»، وإضافة فحص CI يمنع رجوع رموز cream/sandstone/copper إلى مصدر واجهات المنتج.
  • إيقاف الجلب المسبق التلقائي في التنقل والقوائم التشغيلية الكثيفة للرحلات والمسارات والحجوزات والأسطول والسائقين والتذاكر. منع ذلك عاصفة طلبات RSC مكررة لكل عناصر الشريط الجانبي وتفاصيل الصفوف عند فتح /trips، مع بقاء الانتقال عند النقر والـ API المحدود بالصفحات كما هما.
  • تحصين سياق بناء Docker باستبعاد ملفات الأسرار .env* وملفات AppleDouble ._* ومخرجات البناء، حتى لا تدخل بيانات البيئة أو شوائب أرشيف macOS إلى صور الإنتاج.
  • إزالة اسم الحاوية الثابت من خدمة «قريباً» حتى يدعم نشرها مثيلين أثناء health check بدلاً من فشل مسار النشر عديم الانقطاع عند محاولة التوسعة.
  • دعم نشر جزئي عديم الانقطاع لخدمة تطبيق واحدة أو أكثر، مثل apps dashboard docs، لتجنب بناء صور غير متغيرة مع إبقاء فحوص الصحة والدخان نفسها.
  • منع اختيار حافلة غير نشطة أو بلا مخطط مقاعد منشور عند إنشاء الرحلة، مع إظهار عدد الحافلات غير الجاهزة ورابط مباشر لإكمال التخطيط.
  • إضافة حالة خطأ صريحة وزر إعادة المحاولة لقائمة الرحلات حتى لا يظهر فشل API كحالة بيانات فارغة مضللة.
  • تحويل إدارة أعضاء الفريق من فحوص شكلية إلى إنشاء حساب دخول فعلي بكلمة مرور مؤقتة قوية، وأدوار تشغيلية موحدة، وإلغاء تفعيل قابل للمراجعة بدلاً من حذف السجل.
  • نقل نوافذ الفريق إلى modal مشترك يدير التركيز ولوحة المفاتيح، مع أسماء حقول صحيحة وقيود بريد وكلمة مرور قابلة للتحقق من المتصفح.
  • ربط نجاح TOTP بجلسة Supabase المحددة للمشرف والسائق، وإصلاح تسجيل محاولات العامل الثاني وصلاحية عرض المشرفين لحساب الدعم.
  • فصل حد محاولات تسجيل الدخول إلى 5 محاولات لكل حساب و30 محاولة لكل IP خلال 15 دقيقة، مع بصمة بريد SHA-256 ونطاق مستقل لكل بوابة؛ يمنع ذلك حساباً واحداً من حجب بقية الموظفين خلف شبكة شركة مشتركة مع إبقاء حد إساءة عام.
  • اجتياز 3,680 اختباراً وحدياً للوحة الشركات بعد استبدال فحوص حجوزات شكلية بعقود خادمية وتصدير فعلية، إضافة إلى مسح 127 مسار إنتاج مكتمل ومصفوفة الأدوار واختبارات الأداء المحمية.

عروض الشركات الخاصة - 2026-08-08

  • إضافة حسابات تجريبية مخصصة باسم وشعار ولون ومسارات الشركة المحتملة، مع شخصيات مدير ومسافر وسائق وبيانات واقعية محدودة الحجم.
  • إضافة روابط capability عالية العشوائية تُخزن كبصمة فقط، وتستهلك من URL fragment، مع تدوير فوري للرابط وكلمات المرور وحذف refresh tokens السابقة.
  • عزل بيانات العروض عن البحث والعملاء والشركات الحقيقية عبر RLS وJWT وAPI، وإغلاق الوصول فور الانتهاء أو الإلغاء.
  • محاكاة البريد وSMS وواتساب والتنبيهات والمدفوعات داخل demo_outbox ومنع أي أثر خارجي حقيقي.
  • إضافة التمديد وإعادة الضبط والإلغاء والحصاد التلقائي كل 15 دقيقة، مع اختبارات دورة حياة كاملة تشمل العزل والانتهاء والحذف.
  • إضافة اختبار إنتاج محمي ينشئ عرضاً مخصصاً جديداً، ويتحقق من البذرة والعزل وشخصيات المدير والمسافر والسائق وعدم إعادة access token في القائمة، ثم يلغي الرابط ويحصد tenant ويحذفه دائماً في teardown.
  • فصل حدود إنشاء العرض وتبادل الشخصيات عن bucket الدخول الضيق: 10 عمليات إنشاء لكل مشرف وعنوان IP خلال 15 دقيقة، و30 عملية تبادل شخصية لكل IP خلال 15 دقيقة، مع بقاء سقف قاعدة البيانات عند 50 tenant تجريبياً فعالاً.
  • إضافة نطاقات demo وdemo-dashboard وdemo-driver ومسار API مستقل web-api إلى Traefik، مع إبقاء النطاق العام على صفحة «قريباً».
  • إصلاح تعرف بوابة العرض على اسم المضيف خلف Traefik، بحيث لا يتجاوز الطلب غير المصرح له capability gate عندما يعيد Next.js بناء URL باسم upstream الداخلي، مع رفض انتحال X-Forwarded-Host.
  • إصلاح إنشاء المسارات المخصصة مع معرّفات المدن المرجعية الثابتة في PostgreSQL، بعد أن كان تحقق RFC المتشدد يرفض مدناً إنتاجية صحيحة مثل دمشق وحلب.
  • إنشاء مخطط مقاعد ديناميكي قياسي لكل حافلة تجريبية ومطابق لسعتها، مع backfill للعروض الموجودة وإعادة إنشاء تلقائية عند إعادة الضبط دون التأثير في حافلات الشركات الحقيقية.
  • إصلاح انتقال شخصية المسافر حتى تُقرأ جلسة العرض فوراً بعد فتحها، مع إبقاء access token وrefresh token داخل cookies من نوع HttpOnly ومنعهما من دخول استجابة JSON أو JavaScript.
  • فصل ميزانية PostgREST الداخلية الموثوقة عن حدود Kong العامة، وإضافة حدود per-IP عند Traefik وبحث الرحلات، لمنع الزيارات العامة من تحويل رحلة عرض صحيحة إلى خطأ 429 مع إبقاء حدود anon المتشددة.
  • تحسين شاشة السائق لتقارن يوم الرحلة بالتوقيت المحلي وتعرض أقرب تكليف مستقبلي عند غياب رحلات اليوم، حتى تبقى تفاصيل الرحلة والكشف وQR والتحصيل قابلة للتجربة فور إنشاء العرض.
  • توحيد حل هوية السائق عبر drivers.auth_user_id مع fallback للحسابات القديمة، وإصلاح الشاشات والتنبيهات التي كانت تقارن Auth UUID خطأً مع company_user_id فتخفي كل التكليفات.
  • تفعيل مسار Supabase Realtime WebSocket المحمي في Kong بدلاً من محاولات 404 المتكررة، مع إبقاء API key أثناء الترقية وفرض ACL على المستهلكين المعروفين.
  • منع شاشة Flutter البيضاء بعد النشر عبر تضمين bootstrap غير المخزن، وإضافة رقم بناء إلى main.dart.js، وحظر التخزين immutable لملفات shell غير المرقمة في تطبيقي العميل والسائق.
  • إضافة أدلة الإدارة والبنية والأمان والنشر ودورة الحياة للعروض التجريبية.
  • إصلاح تنزيل تذاكر السائق دون اتصال بمطابقة نوع رقم المقعد مع عقد RPC، وربط دالة SECURITY DEFINER بهوية السائق المصادق لمنع تنزيل أسماء وهواتف ركاب رحلة أخرى.
  • إصلاح هوية سائق محادثة الرحلة في التطبيق وRLS، وحصر تعديل رسائل المتصفح بعلم القراءة، مع سحب TRUNCATE وكل امتيازات المجهولين من جدول المحادثة.
  • إصلاح اختصاري مسح التذاكر والخريطة في بطاقة رحلة السائق؛ أصبحا يمرران assignmentId إلى مساري GoRouter المعرفين بدلاً من مسارين غير موجودين يعرضان صفحة 404.
  • منع شاشة رمادية عند فتح تحصيل الدفع في Flutter Web بتطبيع حمولة GoRouter الديناميكية وحمولات 2FA والمحادثة والصور بنفس العقد المختبر.
  • تحويل تحصيل السائق المتصل وغير المتصل إلى معاملة PostgreSQL واحدة مفوضة وidempotent، مع منع الدفع المكرر وتحديث الحجز والإجمالي جزئياً، وسحب الكتابة المباشرة وTRUNCATE من أدوار المتصفح وإخفاء أخطاء PostgREST الخام عن الواجهة.
  • تصحيح بيانات حجوزات العروض المستقبلية لتكون غير مدفوعة باتساق عبر جميع حقول الدفع، كي يستطيع العميل المحتمل تجربة تحصيل السائق فعلياً دون أن تعرض الواجهة حالة تناقض قاعدة البيانات.
  • إضافة اثنتي عشرة صورة AI لمسارات العرض (ثلاثة مشاهد لكل ممر) تجمع هوية مدينتي البداية والنهاية في مونتاج سفر واقعي، وحزمها كـ WebP في الويب والموبايل، مع اختيار حتمي حسب الرحلة يقلل التكرار بين المواعيد، ووسم صريح بأنها توضيحية، وفصلها عن شعار شركة النقل.
  • استبدال fallback المتكرر للشركات بعلامة أحرف ولون مميزين من اسم الشركة عند غياب الشعار، من دون اختلاق شعار تجاري.
  • توحيد حركة الويب على Motion 13 عبر مكونات مشتركة، وإضافة حركة Flutter أصلية موازية، مع احترام prefers-reduced-motion وMediaQuery.disableAnimationsOf على كل منصة.
  • توسيع نظام الحركة المشترك إلى انتقال محتوى المسارات، مؤشر تنقل مشترك، تقدم حجز محسن بـscaleX، وتنبيهات تنتظر اكتمال الخروج، مع منحنى spring مولد وبديل ساكن كامل لتقليل الحركة.
  • تطبيق غلاف الحركة نفسه على بوابات العميل والشركة والإدارة، وإضافة شريط تقدم قراءة ووصول بطاقات هادئ للتوثيق، وتسلسل دخول composited لصفحة «قريباً» من دون تغيير الهوية الخضراء المقصودة.
  • تقصير انتقالات Flutter في تطبيقي العميل والسائق إلى 280ms وإزاحة 3.5% تراعي RTL، وإيقاف تتابع القوائم بعد ثمانية عناصر حتى لا تحجب البيانات أو تزيد كلفة الرسم.
  • تحويل رئيسية لوحة الشركة إلى قمرة تشغيل يومية بمغادرات مرتبة، جاهزية الباص والسائق، الإشغال، والقرارات المعلقة من بيانات فعلية، وتحويل رئيسية الإدارة إلى مركز تحكم بطابور حوادث ودعم وشركات وعروض منتهية حسب الصلاحيات.
  • توحيد الهوية العربية الخضراء عبر بوابات العميل والشركة والإدارة وتطبيقي Flutter، وإضافة تخطيط مكتبي حقيقي للموبايل، صفحات قانونية فعالة، وحالات تحميل وحركة ميسّرة مرتبطة بالسياق بدلاً من زينة SaaS عامة.
  • إزالة تأخر الصفحة البيضاء في تطبيق العميل العائد: أصبحت مفاتيح Hive في الويب دائمة عبر Web Crypto، وانتقلت الصناديق إلى namespace إصدار مع فتح متوازٍ، وأضيف سطح بدء عربي فوري يبقى حتى أول frame حقيقي من Flutter.
  • منع شاشة تتبع فارغة عند غياب Google Maps: يستمر GPS والتحديث المباشر في تطبيقي العميل والسائق، وتظهر واجهة خضراء للمسار مع فتح الخرائط الخارجية دون استهلاك credits. كما أصبح SDK الويب يُحقن فقط عند وجود مفتاح referrer-restricted، ووُصلت مفاتيح Android وiOS المقيدة إلى بناياتها الأصلية.
  • إصلاح روابط Flutter Web النظيفة في تطبيقي العميل والسائق باستخدام path URL strategy، مع التقاط رابط السائق قبل بوابة bootstrap المتأخرة؛ أصبحت روابط التتبع وخريطة التكليف تعمل عند الفتح المباشر وتحديث المتصفح بدلاً من السقوط إلى الصفحة الرئيسية أو /splash، مع اختبارات مصدر واختبار إنتاج محمي.
  • استبدال استعلامات تتبع العميل التي كانت تصطدم بـRLS بعقد get_public_trip_tracking محدود بكود الحجز؛ يعيد المسار والحالة وGPS ضمن نافذة تشغيل فقط، من دون PII أو دفع أو مقعد أو هوية سائق، ويتحدث كل 10 ثوانٍ مع الاحتفاظ بآخر موضع عند الانقطاع.
  • تحصين قراءة .env.prod في مصالحة الإنتاج بإلغاء تنفيذ الملف كـ shell، واقتباس أسماء حسابات QA ذات المسافات تلقائياً، وإضافة وضع تحقق بلا تغيير واختبار انحدار في CI.
  • إصلاح منظومة push التي كانت تكتب أعمدة قاعدة بيانات ملغاة وترد 400 على Flutter Web: توحدت عقود العميل ولوحة الشركة والإدارة على أعمدة المالك الحالية ومفاتيح VAPID الصحيحة، وأصبح ntfy يعمل على الويب والموبايل بموضوع مرتبط بالهوية، وتُدمج محاولات التسجيل المتزامنة في طلب واحد. أضيف قيد مالك واحد ورمز تسليم فريد واختبارات API ومرسل Web Push وntfy وترحيل قاعدة بيانات قابل للتحقق.

صيانة المنصة والأمان - 2026-08-08

  • إصلاح حلقة إعادة توجيه تسجيل دخول الإدارة not_authorized في النشر الذاتي، بمنع bootstrap من إعادة دوال auth.uid() القديمة بعد ترحيل إصلاح JWT، وإضافة اختبار انحدار لصيغة claims الحالية.
  • منع bootstrap الإنتاجي من إعادة منح SELECT الشامل على admin_users عند كل إقلاع، وإعادة حجب أسرار TOTP ورموز الاسترداد عن أدوار المتصفح مع إبقاء أعمدة الهوية الآمنة متاحة.
  • ترقية حزم الويب الأساسية إلى Next.js 16.3 وReact 19.2 وSupabase SSR/JS الحديثة، وترقية Docusaurus وNodemailer وOpenTelemetry وبقية الحزم المتوافقة ضمن نطاقاتها.
  • خفض نتائج تدقيق تبعيات الإنتاج من 109 ثغرات (منها ثغرتان حرجتان) إلى استثناءين عاليين غير مصححين في محلل صور Docusaurus وقت البناء، مع منع صيغ الصور المتأثرة ومهلات CI وقبول ضيق قابل للإلغاء تلقائياً عند توفر إصلاح.
  • إنشاء سجل التدقيق العام المفقود الذي تعتمد عليه خدمات الخادم ومزامنة تسجيل الحضور دون اتصال، وتقييده بدور الخدمة فقط.
  • تحصين دالة سجل المشرفين ضد انتحال هوية مشرف آخر، وإكمال حقول هوية المنفذ وفلاتر الاستعلام وحدود pagination.
  • منع صفحة إدارة المشرفين من جلب البيانات الحساسة قبل التحقق من صلاحية العرض، مع اختبار انحدار.
  • إصلاح أدوات فحص الأسرار والثغرات لتكمل جميع مراحل الفحص وتبلغ عن أعطال الأدوات الخارجية بوضوح.
  • تحديث محولات تخزين Supabase للتعامل الصحيح مع الحقول nullable وإضافة اختبارات انحدار.
  • ترقية تطبيقي Flutter إلى حزم Riverpod وGoRouter وSupabase والتخزين الآمن والإشعارات والموقع والاتصال الحديثة، مع ترقية Android إلى Java 17 وAGP 8.12 وGradle 8.13.
  • تثبيت صور بناء Flutter Web الإنتاجية على الأرشيف الرسمي للإصدار 3.38.5 والتحقق من بصمة SHA-256، لإزالة الاعتماد على صورة registry خارجية عائمة وتحسين قابلية إعادة البناء.
  • تنظيف جميع ملاحظات flutter analyze في التطبيقين، وإصلاح ملكية الاشتراكات والمؤقتات ووحدات التحكم وسباقات الطلبات، والتحقق من 2026 اختبار Flutter وبناء APK وWeb release لكليهما.
  • إضافة ترحيل مرحلي آمن لتخزين جلسات تطبيق العميل عند الانتقال إلى flutter_secure_storage 10، ومنع OTP التطويري افتراضياً في تطبيق السائق.
  • تحصين عقد استجابة تطبيق العميل ضد JSON غير المتوقع والاستجابات الناجحة الفارغة، ومنع تداخل تحديثات الجلسة وطلبات البحث وتتبع الموقع.
  • إصلاح رحلة البحث على الويب عند تعذر خدمة المدن بحيث تستخدم المدن الاحتياطية المعرّفات الحقيقية وتعرض الأسماء العربية، مع حفظ عدد المسافرين في الرابط والطلبات والبحث السابق.
  • التحقق من رحلة البحث مباشرة عبر Browser MCP على سطح المكتب والجوال، وإزالة تحذير انتقال التمرير في Next.js.

تجربة الإطلاق - 2026-08-04

  • إعادة تصميم صفحة «قريباً» بهوية شام باص العربية، مع نموذج تذكرة ومسار رحلة متحركين، وتجربة متجاوبة ودعم تقليل الحركة.
  • إضافة خدمة إنتاج اختيارية للصفحة خلف Traefik بأولوية أعلى على النطاق العام فقط، مع إبقاء بوابة العميل عاملة وإتاحة الرجوع الفوري بإيقاف حاوية واحدة.

إصلاحات حرجة - 2026-07-26

  • إصلاح خلل كان يخصم عدد المقاعد المتاحة مرتين (أو يعيدها ثلاث مرات عند الإلغاء) بسبب وجود مشغّلين (triggers) متكررين على جدول الحجوزات منذ الهجرة 00004 لم يُحذف أي منهما عند استبداله بنسخة أكمل في 00094. تم حذف المشغّل والدالة المكررين، وتصحيح دالة إلغاء الحجز الذرية cancel_booking_atomic لتعتمد على المشغّل الوحيد المتبقي بدل تعديل العدد يدوياً أيضاً، مع إعادة حساب available_seats لجميع الرحلات المجدولة لتصحيح أي انحراف سابق.
  • إصلاح خلل كان يمنع إلغاء أي حجز بشكل كامل عند وجود جدول seats: كانت الدالة الذرية تقارن مصفوفة أرقام مقاعد رقمية (bookings.seat_numbers) مع مصفوفة نصية مبنية من عمود العرض القديم bookings.seat_number، فيفشل الاستعلام بخطأ نوع البيانات مع كل محاولة إلغاء.

تحسينات مكتملة - 2026-04-24

  • إضافة واجهة ونقطة API لاستعادة وصول العميل عبر البريد الإلكتروني باستخدام رموز إعادة تعيين مخزنة في قاعدة البيانات.
  • توحيد مسارات تحقق البريد الإلكتروني بين تطبيق الموبايل والويب، مع إبقاء المسارات القديمة كواجهات توافقية.
  • إصلاح تخزين أرقام المقاعد في دالة الحجز الذرية حتى تحفظ القيم الرقمية في bookings.seat_numbers.
  • تحويل الخطوط الشائعة في صفحة البحث من بيانات ثابتة إلى بيانات مرتبة من API.
  • تفعيل رفع وحذف شعار الشركة في لوحة التحكم عبر Supabase Storage.
  • تفعيل مفاتيح إشعارات تطبيق العميل وحفظها محلياً وربط إشعارات الرحلات باشتراك push.
  • إضافة فحص route-handler حي لنقاط API التي أُضيفت بعد كشف API drift، مع إصلاح دفاعي يضمن وجود جدول waitlist وسياساته في البيئات القديمة.
  • تنظيف أخطاء وتحذيرات analyzer في تطبيق العميل Flutter والتحقق من flutter test و flutter build web.
  • إصلاح بذور تسجيل دخول لوحة الإدارة محلياً بضمان وجود حسابات auth.users للمشرفين وربطها مع admin_users، مع إعادة ضمان أعمدة ودوال 2FA المطلوبة.
  • توسيع اختبارات RLS الحية لتغطي أدوار الراكب والسائق والمشرف، مع إصلاح سياسات سائق التطبيق المرتبطة بـ drivers.auth_user_id وقراءة مواقع GPS الخاصة به.
  • إصلاح تسجيل دخول لوحة الشركات حتى لا يتم الخلط بين دور الشركة ADMIN ودور مشرف المنصة، مع إبقاء توجيه مشرفي المنصة إلى بوابة الإدارة.
  • إعادة عقود توافق قاعدة البيانات المطلوبة للتطبيقات والواجهات مثل cities.name, companies.name, routes.base_price, trips.price, و get_booking_by_code.
  • إضافة مسار توافق /customer-auth/login وتوسيع route-flow ليغطي 120 مساراً عبر العميل ولوحة الشركات ولوحة الإدارة وموبايل العميل وموبايل السائق.
  • إصلاح تجربة تحقق العميل بحيث تعرض أخطاء رقم الهاتف وOTP عند الضغط بدلاً من تعطيل الأزرار بدون تفسير.
  • إضافة نظام تخطيط باصات قانوني قائم على layout_document مع مصمم مرئي في لوحة الشركات، قوالب قابلة للتخصيص، حفظ ذري عبر قاعدة البيانات، إسقاط توافق إلى bus_layout_positions، وإعادة استخدام نفس التخطيط في اختيار مقاعد العميل.
  • ترقية واجهة مصمم تخطيط الباص إلى استوديو تحرير جديد مع شريط مقاييس، مساحة عمل محسّنة، شريط أدوات أيقوني، لوحة خصائص أوضح، ومعاينة عميل أكثر اتساقاً.
  • تحويل صفحة إضافة الباص /buses/new إلى مسار موجه مستوحى من مصمم القوالب السابق: معلومات أساسية، بطاقات قوالب مصغرة، ترقيم المقاعد، معاينة نهائية، مع إبقاء التحرير المتقدم متاحاً عند الحاجة.
  • إعادة التحرير المتقدم لتخطيط الباص إلى نموذج محرر الشبكة من الإصدار السابق، مع ربطه بعقد layout_document الحالية في صفحة إضافة الباص وصفحة تعديل التخطيط.
  • إضافة قوالب جاهزة للفانات والميني باص والكوستر، مع دمج القوالب المضمنة مع قوالب قاعدة البيانات حتى تظهر الخيارات الصغيرة حتى عندما تكون بذور Docker ناقصة.
  • ترقية الصفحة الرئيسية للعميل إلى صفحة هبوط إطلاقية عربية/إنجليزية تغطي البحث السريع، تجربة التذكرة والمقاعد، مزايا المسافرين، عرض شركات النقل، التغطية، الثقة، تطبيقات الجوال، والأسئلة الشائعة.
  • ترقية نموذج البحث في بطل الصفحة الرئيسية ليظهر أولاً على الجوال، يستخدم منتقي مدن قابل للبحث ومنتقي تاريخ مرئي، ويحمّل المدن النشطة من قاعدة البيانات قبل الرندر.
  • إعادة اختصار صفحة الهبوط بأسلوب صفحة منتج أكثر هدوءاً: بطل مع نموذج البحث، قصة منتج واحدة، مسار مزدوج للمسافر والشركة، قسم ثقة/تغطية/تطبيقات موحد، FAQ أقصر، وإبقاء دعوات واتساب للاستفسار وانضمام شركات النقل.
  • ترقية رأس صفحة الهبوط إلى مكوّن ثابت بزجاجية خفيفة، حالة تمرير أوضح، شعار رسمي، تنقل مكتبي مختصر، وتجربة جوال أكثر هدوءاً.
  • تحسين تجربة بحث صفحة الهبوط على الجوال بتحويل منتقي المدن والتاريخ إلى لوحات سفلية غير مقصوصة، وتقليل ارتفاع النموذج بإخفاء التفاصيل المكررة وترتيب التاريخ والركاب في صف مضغوط.

تحديثات وثائقية وتشغيلية

  • إعادة ضبط خدمة التوثيق لتكون عربية فقط حتى تتوفر ترجمة إنجليزية حقيقية
  • إزالة صفحات وبيانات اعتماد غير آمنة من الشجرة المنشورة
  • تحديث صفحات المساعدة وAPI وخارطة الطريق لتطابق الواقع الحالي
  • توحيد شعار شام باص المعتمد عبر الويب والتوثيق وصفحة قريباً وأيقونات PWA وأيقونات تطبيقات الموبايل

[مرجع تاريخي] - 2024-12-01

مضاف

  • الإطلاق الأولي للمنصة
  • نظام الحجز الكامل
  • لوحة تحكم الشركات
  • لوحة الإدارة
  • تطبيق السائق
  • نظام OTP عبر SMS/WhatsApp

البنية الأساسية

  • Supabase للـ backend
  • Next.js 15 للويب
  • Flutter للموبايل
  • Docker للتطوير

ملاحظات

  • هذا السجل موجز توثيقي، وليس بديلاً عن Git history أو pull requests.
  • عند وجود تغييرات كبيرة في السلوك أو العقود يجب إضافة ملخص موثق هنا أو في صفحة RFC/roadmap الأنسب.