# Phase 10.1 — Driver Management | Field | Value | | --- | --- | | Identifier | `delivery-10.1` | | Status | Complete | | Module | delivery | | Service | `delivery-service` | | Version | `0.10.1.0` | | Database | `delivery_db` | | API Port | 8007 | | Depends On | Phase 10.0 | | ADR(s) | ADR-001, ADR-003, ADR-006, ADR-015 | | Commercial Product | Torbat Driver | | Manifest | [phase-manifest.yaml](ai-framework/phase-manifest.yaml) | ## Enterprise Phase Discovery Summary | Item | Detail | | --- | --- | | Capabilities required | Driver profiles, credential/document refs, status lifecycle, list UX (filter/sort/search/page), audit, outbox events, permissions | | Gaps closed | Driver aggregate + lifecycle policy + credentials/documents + transactional outbox + permission leaves | | Exclusions | Fleet/vehicles (10.2), availability/shifts/zones (10.3), dispatch (10.5), routing execution (10.6), tracking/POD (10.7) | | CRUD-only rejected | Yes — lifecycle machine, credentials, documents, outbox, specs, policies required | ## Goal Deliver production-ready **Driver Management** for the Delivery & Fleet Platform (Torbat Driver): profiles, credential and document references, status lifecycle with append-only history, tenant-isolated APIs, audit, and outbox events — without fleet, dispatch, routing, or tracking engines. ## Scope Delivered ### In Scope - Aggregates: `Driver`, `DriverCredential`, `DriverDocument`, `DriverLifecycleEvent`, `OutboxEvent` - Lifecycle: activate, suspend, resume, deactivate, block, unblock, archive - Soft delete + optimistic locking on drivers - List: pagination, filtering (status/org/hub), sorting, searching - Commands / queries / policies / specifications / validators - Permissions `delivery.drivers.*` leaves + catalog discovery API - Publish-only events `delivery.driver.*` via transactional outbox - Health / capabilities / metrics updated (`phase: 10.1`, `drivers: true`) - Alembic `0002_phase_101_drivers` - Tests: unit, API/integration, tenant, architecture, migration, permissions, performance indexes, docs ### Out of Scope - Fleet / vehicle types / vehicles (10.2) - Availability / shifts / working zones (10.3) - Pricing / capability bundles (10.4) - Dispatch engine (10.5) - Routing / optimization execution (10.6) - Tracking / POD (10.7) - Settlement (10.8) - Merchant connector / app UI (10.9) - Analytics / AI (10.10) ## Service Boundaries | Delivery owns | Delivery does not own | | --- | --- | | Driver profiles and lifecycle in `delivery_db` | Identity user administration | | Credential/document **metadata** + Storage file refs | File blobs (Storage) | | External user / CRM contact refs | CRM contact master | | Driver permissions `delivery.drivers.*` | Communication message delivery | | Outbox `delivery.driver.*` events | Accounting journals | ## Domain Model ### Driver statuses `pending` → `active` ↔ `suspended` → `inactive` → `archived` (terminal); `block` → `blocked` → `unblock` → `inactive`. | Action | Allowed from | To | Reason required | | --- | --- | --- | --- | | activate | pending, inactive, suspended | active | No | | suspend | active | suspended | Yes | | resume | suspended | active | No | | deactivate | active, suspended | inactive | Yes | | block | pending, active, suspended, inactive | blocked | Yes | | unblock | blocked | inactive | No | | archive | inactive, blocked | archived | Yes | ### Aggregates | Entity | Soft delete | Optimistic lock | Tenant | | --- | --- | --- | --- | | Driver | Yes | Yes | Yes | | DriverCredential | Yes | No | Yes | | DriverDocument | Yes | No | Yes | | DriverLifecycleEvent | No (append-only) | No | Yes | | OutboxEvent | N/A | N/A | Yes | ## APIs | Method | Path | Permission | | --- | --- | --- | | POST | `/api/v1/drivers` | `delivery.drivers.create` | | GET | `/api/v1/drivers` | `delivery.drivers.view` | | GET | `/api/v1/drivers/{id}` | `delivery.drivers.view` | | PATCH | `/api/v1/drivers/{id}` | `delivery.drivers.update` | | POST | `/api/v1/drivers/{id}/activate` | `delivery.drivers.activate` | | POST | `/api/v1/drivers/{id}/suspend` | `delivery.drivers.suspend` | | POST | `/api/v1/drivers/{id}/resume` | `delivery.drivers.resume` | | POST | `/api/v1/drivers/{id}/deactivate` | `delivery.drivers.deactivate` | | POST | `/api/v1/drivers/{id}/block` | `delivery.drivers.block` | | POST | `/api/v1/drivers/{id}/unblock` | `delivery.drivers.unblock` | | POST | `/api/v1/drivers/{id}/archive` | `delivery.drivers.archive` | | GET | `/api/v1/drivers/{id}/lifecycle` | `delivery.drivers.lifecycle.view` | | POST/GET | `/api/v1/drivers/{id}/credentials` | credentials.manage / view | | POST/GET | `/api/v1/drivers/{id}/documents` | documents.manage / view | | POST | `/api/v1/drivers/{id}/delete` | `delivery.drivers.delete` | | GET | `/api/v1/permissions/catalog` | `delivery.view` | | GET | `/health`, `/capabilities`, `/metrics` | Public | List query params: `page`, `page_size`, `status`, `organization_id`, `hub_id`, `q`, `sort_by`, `sort_dir`. ## Events | Event | Aggregate | | --- | --- | | `delivery.driver.created` | driver | | `delivery.driver.updated` | driver | | `delivery.driver.activated` / `suspended` / `resumed` / `deactivated` / `blocked` / `unblocked` / `archived` | driver | | `delivery.driver.status_changed` | driver | | `delivery.driver.deleted` | driver | | `delivery.driver.credential_added` | driver_credential | | `delivery.driver.document_attached` | driver_document | Persisted via transactional outbox (`outbox_events`) per ADR-006; mirrored in-memory under test. ## Permissions `delivery.drivers.view|create|update|delete|activate|suspend|resume|deactivate|block|unblock|archive|lifecycle.view|credentials.view|credentials.manage|documents.view|documents.manage|manage` ## Migration | Item | Detail | | --- | --- | | Alembic | `0002_phase_101_drivers` (down_revision `0001_initial`) | | Breaking | None — additive tables | | Backfill | None | ## Architecture Decisions 1. Driver status machine owned by Delivery validators/policies — not Identity 2. Credential/document binaries remain Storage refs only 3. Transactional outbox introduced for driver mutations (backward-compatible with foundation in-memory publisher) 4. No fleet/vehicle/dispatch tables in this phase 5. Soft delete + optimistic lock on Driver; append-only lifecycle history ## Folder Additions ``` app/models/drivers.py app/models/outbox.py app/validators/drivers.py app/policies/drivers.py app/specifications/drivers.py app/repositories/drivers.py app/services/drivers.py app/schemas/drivers.py app/commands/drivers.py app/queries/drivers.py app/api/v1/drivers.py app/api/v1/permissions.py alembic/versions/0002_phase_101_drivers.py ``` ## Tests - Unit: lifecycle transition matrix - Integration: lifecycle flow, credentials/documents, filter/sort/search, optimistic lock, soft delete, tenant isolation - Architecture / migration / permissions / performance indexes / docs / security (auth required) ## Definition of Done All Enterprise Quality Gates for Phase 10.1 satisfied. See [phase-handover/phase-10-1.md](phase-handover/phase-10-1.md). ## Related Documents - [Delivery Roadmap](delivery-roadmap.md) - [Phase 10.0](delivery-phase-10-0.md) - [Handover 10.1](phase-handover/phase-10-1.md) - [ADR-015](architecture/adr/ADR-015.md)