Axlogis Project Control

Last updated: 2026-06-01 (Phase 1 COMPLETE · all 6 gate criteria passed · develop: acde7f1 · OQ-013 resolved · Phase 2 discovery doc created)
Current Phase: ✅ Phase 1 COMPLETE — Phase 2 Planning
Stack: .NET 10 LTS · Vue 3 · EF Core 10
KB: 60 SPs · 25 Forms · 21 Mockups
OQ-013: Resolved ✓ (data migration confirmed)
Open Questions: 8 general · OQ-013+015 resolved
CI: Green ✓ (33/33 tests)
Scope — Phase 1 ✅ Complete · Phase 2 🔜 Active

✅ Phase 1 — Complete & Live

  • Common / Job Entry — lifecycle, containers, master jobs, clone (NVOCC)
  • Freight — FCL/LCL, ConsignmentNote, CargoReceipt, ContainerRequest, Documents (MinIO)
  • Haulage — HCC, movements, staging, gate dates, movement dispatch
  • 4 portals: Ops, Customer, Driver (offline PWA), Partner
  • Master data: Partners, Users, Fleet, Employees (live APIs + Vue pages)
  • Infrastructure: K8s, Loki, Prometheus, Outbox, Audit, Feature flags

🔜 Phase 2 — In Planning (next)

  • Billing & Costing — cost sheets, AR/AP invoices, driver incentives, fuel, accruals
  • LHDN e-invoice — MyInvois API, UBL XML, QR code (legal deadline)
  • Accounting integrations — AutoCount, SQL Accounting, SAP, Sovy, QnE
  • Transport & Milkrun — command center, milkrun scheduling, load planning
  • Warehouse (WMS) — tally in/out, picking, stock balance, work orders
  • Rate management UI · Analytics dashboards · Financial reports
Phase 2 reference: Full domain analysis at ai/docs/phase-2-discovery/index.html (PDF + PPTX export available). Sprint plan: P2-A to P2-J, ~22 weeks.
Needs Your Input — Phase 2 decisions
✅ Phase 1 complete — all 6 gate criteria passed (2026-06-01). OQ-013 (data migration) confirmed by Calvin. Load test p95=6.21ms vs 2000ms gate. 33/33 API tests green. Phase 2 discovery document created at ai/docs/phase-2-discovery/index.html.
① Before Phase 2-C starts
LHDN MyInvois credentials
Phase 2-C (LHDN e-invoice sprint) needs MyInvois sandbox client credentials (Client ID + Client Secret) from the LHDN portal. Register at mytaxinvois.hasil.gov.my if not done. EInvStatus/EInvId fields already exist on AccArInv.
My recommendation Register now — sandbox approval can take 3–5 business days. Sprint P2-C is estimated 2 weeks in.
② Before Phase 2-E starts
Accounting system integration priority
7 accounting systems were integrated in v7 (AutoCount, SQL, SAP, Sovy, QnE, Otololo, Unity). Which 1–2 should Phase 2 implement first? API credentials needed from each customer.
My recommendation AutoCount first (most common in Malaysian SME logistics), then SQL Accounting. Others as customer demand arises.
③ Before Phase 2 data migration
AppCharge migration scope
AppCharge (51+ columns, enterprise-specific charge codes) needs review before migration. Active codes to migrate? Any cleanup of obsolete codes first?
My recommendation Migrate all where IsActive=1. Mark IsActive=0 for any codes not used in last 12 months. No deletion — soft archive only.
④ Phase 2 — OQ-004 (deferred from Phase 1)
Partner integration contracts (ROT, GUSS, GPS)
WMS and Transport phases need partner API specs — ROT submission format, GUSS eROT/eRFC payload, GPS hardware API. These were deferred in Phase 1.
My recommendation Stub all integration points in Phase 2-G/H. Provide API specs before Phase 2-H (WMS) sprint starts.
Current Blockers
✅ Phase 1 — No blockers
All 6 gate criteria passed. 33/33 tests. Load test p95=6.21ms. OQ-013 resolved. Phase 1 cleared for go-live (commit acde7f1).
Phase 2-C — LHDN credentials not yet confirmed
Impact: Sprint P2-C (e-invoice) cannot start until MyInvois sandbox credentials are obtained. Register at mytaxinvois.hasil.gov.my.
ETA: 3–5 business days after registration.
Phase 2-E — Accounting API credentials
Impact: AutoCount/SQL Accounting connector implementation needs customer API keys. NoOpConnector ships first — real integration added per customer onboarding.
Business Input Queue — all 13 resolved · 2026-05-31 · Calvin approved
✓ Phase 2 unblocked. All 13 questions resolved via 3-strategy approach: 3 self-answered from DB/code analysis (no UAT needed) · 2 deferred to later sprints (stubbed with NotImplementedException) · 8 workarounds implemented with [Q-tag] comments, confirm in UAT. Find all sites: grep -rn "\[Q-" axlogisv9/apps/api/ axlogisv9/apps/web/ · Full detail: ai/state/biz-rule-workarounds.md
QID Question Resolution UAT / Follow-up Action Status
Q-MD-002 IsStaging child movement codes Resolved from DB. AppProcess.StageIn / StageOut columns contain the exact child codes per process row — variable by process, not a fixed pair. Confirmed in runtime-config.md. None — implementation is authoritative from DB data. Resolved ✓
Q-AU-003 AppOption scoping level Resolved from SP patterns. Every SP reads WHERE Enterprise = @Enterprise AND Entity = @Entity. Entity-level scope confirmed. TenantOption PK: (Enterprise, Entity, OptionKey). None — PK design locked and shipped. Resolved ✓
Q-CS-001 ExRate uses @Entity not @Enterprise in spImportJobCargo Confirmed copy-paste bug. @Entity is an entity code (e.g. 'KL') — using it in WHERE Enterprise = @Entity matches zero rows. New system corrects to @Enterprise. If Calvin says @Entity was intentional: swap one parameter in ImportCargoCostService. Bug Fixed ✓
Q-JO-019 Commission 6-level priority sort order Deferred — Billing sprint. CommissionService throws NotImplementedException("[Q-JO-019]"). Out of Phase 2 Freight/Haulage scope. Provide 6 priority levels before billing sprint begins. Calvin to answer during Billing sprint planning. Deferred
Q-CP-008 Odometer reset arithmetic Deferred — Driver sprint. OdometerService throws NotImplementedException("[Q-CP-008]"). Out of Phase 2 Freight/Haulage scope. Confirm reset arithmetic before driver reporting sprint. What does "odometer replaced" mean operationally? Deferred
Q-AU-002 AppOption default values (26 keys) W-001 — TenantOptionSeeder shipped. 19 keys seeded using SP fallback values. Key finding: Planning.AutoAssignTransporter = 1 (not 0 — SP default is 1). Default.BillingType = PREPAID. UAT: verify each seeded value is correct. Fix = UPDATE TenantOption SET Value='...' per key. No code changes. UAT Confirm
Q-CP-001 ActCollectionDate uses StartTime vs EndTime W-002 — StartTime replicated. ContainerTrackingService uses process.StartTime matching current SP behavior post-QMS 47587. [Q-CP-001] tagged. UAT: verify collection dates on job detail. Fix = change one property: StartTime → EndTime. UAT Confirm
Q-EV-005 TransactionNo suppression in event timeline W-003 — Always show TrxNo. JobEventService returns TransactionNo for all events. [Q-EV-005] tagged. Ops seeing extra context is never wrong; portal visibility is RBAC-controlled. UAT: confirm no internal refs should be hidden from ops/customer/partner views. Fix = add ShouldSuppress(evt) predicate (additive). UAT Confirm
Q-CP-009 Empty-head area-code vs place-code matching W-004 — Area-code matching per QMS 16427. EmptyHeadService uses a.AreaCode == container.DeliveryAreaCode. [Q-CP-009] tagged. Assumes QMS fix stands. UAT: test empty-container pickup assignment. Fix = change one WHERE predicate: AreaCode → PlaceCode. UAT Confirm
Q-MD-003 RequirePlanning gate scope W-005 — HCC dispatch only. HaulageCommandCenterService uses RequirePlanning as HCC filter only. [Q-MD-003] tagged. No other analyzed SP gates on this field. UAT: confirm RequirePlanning does not also gate job confirmation or billing. Fix = add guards at additional workflow points (additive). UAT Confirm
Q-JO-012 Auto-cancel on agent change: silent vs warn W-006 — Calvin decision A+B. A (now): accepted entry → hard error; pending entry → silent cancel. Matches SP two-branch logic exactly. B (later): pre-cancel confirm modal for pending path. [Q-JO-012-A/B] tagged. UAT: verify accepted-entry hard error and pending-entry silent cancel match ops expectations. B (modal) tracked as follow-up issue — not blocking. UAT Confirm
Q-RP-005 HCC B2B: container handover or truck transfer? W-007 — Stubbed behind feature flag. ValidateB2BTransferAsync throws FeatureNotConfiguredException when MsmB2BHandover flag is on. MSM-only path — all other tenants unaffected. Must answer before MSM goes live. If MSM is not first tenant, no UAT impact. Fix = implement 6-step validation once B2B definition is confirmed. UAT (MSM)
Q-CP-014 DehireDate: first-gate-wins or re-gate overwrites? W-008 — First-gate-wins replicated. ContainerGateDateService guards WHERE DehireDate IS NULL matching SP behavior. [Q-CP-014] tagged. UAT: run a re-gate test and verify demurrage uses correct date. Fix = remove && c.DehireDate == null (one line). UAT Confirm
Phase Progress
1–5
Legacy analysis, schema extraction, knowledge base
2026-05-20
Done
6
Design system extraction
2026-05-22
Done
7
New system architecture (9 docs)
2026-05-23
Done
8
MVP mockups (20 HTML files — 2 added 2026-05-31: S19 ConsignmentNote Detail + S20 Partner Job Detail)
2026-05-31
Done
9
Critical SP + view DB verification (12 SPs + 3 views)
2026-05-26
Done
9+
Full MVP recovery (48 SPs, 5 forms, runtime config, KB-02, KB-03)
2026-05-27
Done
0
Foundation scaffold — monorepo, Vue 3, .NET 8, Docker Compose, CI, login gate ✓
2026-05-28
Done
0+
Architecture hardening — MediatR, RowVersion, soft delete, RFC 7807, httpOnly auth, CSP, CI green
2026-05-29
Done
1
Common / Job Entry module — CreateJob/GetJob/ListJobs API + OpsJobList + OpsJobDetail + nav stubs. E2E verified. Design system audit + Vue sync complete. Arch + memory review done (3 decisions, 2 templates, WARP updated).
2026-05-30
Done
2F
Phase 2 Freight sprint — .NET 10 upgrade ✓ · Foundation entities (D1+D2) ✓ · ConsignmentNote CRUD ✓ · JobCloneService (NVOCC) ✓ · Steps 11-14: JobEntry, JobContainer, JobProcess, JobEvent, JobCargo + 4 services ✓
2026-05-31
Done
2H
Phase 2 Haulage sprint — Step 15: HaulageCommandCenterService (full) ✓ · Step 16: EmptyHeadService (shell, deferred pending AppEmployee/AppAddress) ✓ · Step 17: ContainerGateDateService (full) ✓ · Step 18: MovementService (shell, deferred pending AppServiceProcess) ✓ · All 18 steps done
2026-05-31
Done
2+
Post-sprint wiring + Sprint A/B — [TODO-CLONE-PIPELINE] b+f+g+k+l wired ✓ · AppServiceProcess ✓ · MovementService.GenerateAsync ✓ · Sprint A: 6 reference entities ✓ · Sprint B: EmptyHeadService, MovementService.UpdateLocationsAsync, HCC fields, [Q-JO-017] ✓
2026-05-31
Done
2C
Sprint C — Job lifecycle — UpdateJob (PUT /jobs/{id}) ✓ · ConfirmJob (Pending→Planned) ✓ · StartJob (Planned→InProgress) ✓ · CompleteJob (InProgress→Completed) ✓ · CancelJob ✓ · GET /jobs/{id}/history ✓ · 8 new integration tests · 13/13 pass
2026-05-31
Done
2D
Sprint D — Freight entity completion — CargoReceipt + CargoReceiptItem · JobDoc · MinIO IDocumentService + pre-signed URLs · ContainerRequest + ContainerRequestItem · OQ-03/OQ-04 resolved — all unblocked
2026-06-01
Done
2E
Sprint E — Cross-cutting architecture: Hangfire+OutboxProcessor ✓ · OutboxInterceptor+AuditInterceptor ✓ · AuditLog migration ✓ · GET /api/v1/identity/config ✓ · Vue tenant.ts fetchConfig ✓ · CI dual-DB lint ✓
2026-06-01
Done
F
Sprint F — Ops frontend portals: OpsDashboard (live KPIs) ✓ · OpsMovementBoard ✓ · OpsFreightList ✓ · OpsHaulageCommandCenter (tenant-config v-if columns) ✓ · 5 master data stubs · useFormErrors composable ✓
2026-06-01
Done
G
Sprint G — Customer + Partner portals: ExternalShell (top-nav) ✓ · CustomerShipments list ✓ · CustomerShipmentDetail (timeline + doc download) ✓ · PartnerJobList ✓ · PartnerJobDetail (tabs: Overview/Docs/Timeline) ✓ · lib/docs.ts (MinIO download) ✓
2026-06-01
Done
H
Sprint H — Driver portal + offline PWA: DriverShell (bottom nav) ✓ · DriverMovements (offline-first, Dexie) ✓ · DriverMovementDetail (status bottom sheet) ✓ · DriverPod (camera+canvas sig) ✓ · UpdateMovementStatus API ✓ · SubmitPod API ✓ · useOnline composable ✓
2026-06-01
Done
I
Sprint I — Infrastructure: CorrelationIdMiddleware ✓ · Serilog Loki sink ✓ · Prometheus /metrics (UseHttpMetrics+tenant label) ✓ · appsettings.Production.json (env-var refs) ✓ · docker-compose+Loki/Grafana/Prometheus ✓ · 9 K8s manifests ✓ · backup-mssql.sh ✓ · deploy.sh (one-command) ✓
2026-06-01
Done
J
Sprint J — Phase 1 Gate Verification: 33/33 API tests ✓ · F-4 master data API (AppPartner/Employee/Equipment) ✓ · 6 ConsignmentNote tests ✓ · dual-DB lint PASS ✓ · Vue build+lint 0 errors ✓ · load test p95=6.21ms (gate 2000ms) ✓ · OQ-013 resolved by Calvin ✓
2026-06-01
Done ✓
PHASE 1 COMPLETE — Go-live cleared: All 10 sprints (A–J) done. All 6 Phase 1 gate criteria passed. OQ-013 data migration tiering confirmed. Tier 1 SQL migration scripts to run before go-live.
2026-06-01
Phase 1 ✓
P2
Phase 2 — Planning & Discovery: ASolute v7 reverse-engineering complete. Discovery document created: ai/docs/phase-2-discovery/index.html. 49 billing forms, 22 Acc* tables, 90+ billing SPs, 20 Wms* tables, 40+ WMS SPs, 7 accounting system integrations, LHDN e-invoice fields confirmed. 10 sprints planned (P2-A to P2-J, ~22 weeks).
2026-06-01
Active
P2-A
Phase 2A — Billing Foundation: AccArInv/AccApInv entities, Cost Sheet API, AppCharge entity, Currency + Tax codes
Queued
P2-C
Phase 2C — LHDN E-Invoice: MyInvois API client, UBL XML builder, Hangfire polling, QR code. Blocker: MyInvois sandbox credentials
Queued
P2-G
Phase 2G — Transport & Milkrun: Command Center API, Milkrun scheduling, Load Planning, Vue pages
Queued
P2-H
Phase 2H — Warehouse (WMS): WmsCargo, Tally-In/Out, Stock Balance, Picking, Work Orders, WMS Vue pages
Queued
Open Question Summary — from open-question-register.md
0
Biz Inputs — all resolved ✓
7
General OQs — open
18
Resolved — archived
Biz inputs — all resolved via biz-rule-workarounds.md (Calvin approved 2026-05-31)0 pending
OQ-013 (data migration) — RESOLVED 2026-06-01 · Calvin confirmed recommended defaultResolved ✓
OQ-015 (Loki logging) — RESOLVED · Serilog Loki sink shipped in Sprint IResolved ✓
General OQs still open — OQ-002, OQ-004, OQ-005, OQ-014, OQ-018, OQ-019, OQ-0207 open
SP register P0 — open-question-register.md (Phase 2 SP analysis ongoing)~4 P0
Tenant branches → KnownFeatureFlags (design locked, seeder needed)15 tenants
Archived resolved (incl. OQ-03/04/013/015 + G-series)18 done
Biz inputs: ai/state/pending-business-inputs.md · General: ai/state/open-questions.yaml · SP register: ai/knowledge/asolute-recovery/open-question-register.md
Knowledge Base Coverage — ai/knowledge/asolute-recovery/
File What it covers Items Status
critical-sp-view-analysis.mdCancel cascade, ROT, DnD, rates, billing, movements, vessel schedule12 SPs + 3 viewsDB Verified
sp-analysis-process-movement.mdspJobNotification → spJobTruckTrailerPlanned15 SPsDB Verified
sp-analysis-freight-support.mdspJobWhsTransfer → spVendorRateFreeDays9 SPsDB Verified
sp-analysis-job-container.mdspAccFuelDistance → spGPSRefuel14 SPsDB Verified
sp-analysis-haulage-cargo.mdspHaulageCommand → spJobEventView (7 tenant exceptions documented)10 SPsDB Verified
ui-form-wiring-mvp.mdfrmJobEntry (24 rules, 20-step save), frmContainerRequest, frmHlgMovement, frmCommandCenterHaulage, frmFreightConsole5 formsUI Verified
ui-form-wiring-freight.mdfrmDocumentation (BL/DO/manifest, dual mode, ImportFromBooking, TREQ/K6), frmCustomsForm, frmCargoReceipt (approve→auto-sub-job, credit hold), frmCompleteProcess (3rd-party completion, batch), frmTransportRequest (breakbulk ROT), frmTransportRequestMaster, frmContainerMonitor (spContainerMonitoring, 5 tabs), frmTransportMonitor (spTransportMonitoring, 3 tabs), frmFreightConsoleUpload (XML import pipeline)9 formsUI Verified
ui-form-wiring-haulage.mdfrmStaging (3-mode, 18-step save, gate pass, B2B), frmDiversion (2-mode, cost sheet), frmShunting (Shunting+Support, spJobProcessShunting), frmHaulageMonitoring (floating SP-fed window), frmCollectionAdvice (6-tab RFC board, CommMapping), frmCollectionAdviceUpdate (single/batch, auto-acknowledge, PCS), frmHlgMovementMultiple (bulk plan, expiry+blacklist), frmChangeTrailer, frmFutileTrip (mobile push notify), frmTruckBreakdown (breakdown movement insertion, B2B+MSM), frmPendingContainer (3-tab driver planning board)11 formsUI Verified
runtime-config.mdAppProcess (98 codes), AppServiceType (173 codes), AppOption architectureConfig tablesDB Verified
kb-structure.mdKB-02 — 8-domain taxonomy, dossier templates, status ladderStructureComplete
sp-analysis-exp-to-imp.mdspJobSaveExpToImp: NVOCC clone (FreightAgent→ImportCustomer) + East Malaysia sub-job sync. C# target: JobCloneService.CloneExportToImportAsync. Q-DB-001 resolved.1 SPDB Verified
open-question-register.mdKB-03 — original 57 open questions; ~4 P0 remain active; many resolved or deferred~4 P0 activePartial
ASolute-top-class-dossiers.mdclsOrder, clsJobSheetsGenerate, clsJobContainers, clsPartner, clsChargeCode, clsServiceType6 classesRecovered
ASolute-refactoring-assessment-report.mdClass-to-DB crosswalk, risk register, 286 Admin types, 132 Link typesAssessmentRecovered
ASolute-database-object-registry.md341 tables, 175 views, 1,500 SPs, 37 functions, 4 triggersRegistryRecovered
ASLib.* frameworkTransaction, tenant context, AppOption cache, audit, deadlock retry — all replaced by .NET 8 / EF Core native primitives. Decision locked 2026-05-27. No DLL analysis needed.Resolved
Tenant branches15 tenants (BERNAS, EXILIAN, MSM, CTE, etc.) — design locked: TenantFeatureFlag entity + KnownFeatureFlags. Seeder needed, source search deferred.15 tenantsDesign locked
How to Interact — session commands
I'm back
Triggers /resume-axlogis — delivers structured handoff (phase, last stop, blockers, next action) from saved state. Start every session with this.
implement [feature]
I write the code. I flag any P0 questions blocking the feature before starting, and stop to ask if anything touches deferred scope.
what needs my input?
I surface only the decisions genuinely blocked on you — never more than 3 at a time, always with a recommended default.
review the scope
I check all recent work against the MVP scope contract and flag any drift I find.
analyse [SP / class / form]
I read the source, document business rules exhaustively, and add to the knowledge base.
resolve Q-XX-NNN
I update open-question-register.md with the answer you provide and update any affected dossiers.
/resume-axlogis
Explicit skill invocation — use if the auto-trigger misses your resume cue.
Session end: I update this dashboard and ai/state/resume-context.yaml automatically after every meaningful milestone.
Recent Progress
2026-06-01
Phase 2 Discovery document created — ai/docs/phase-2-discovery/index.html — Comprehensive 84 KB HTML document covering all Phase 2 domains. Billing & Costing (49 forms, 22 Acc* tables, 90+ SPs, full cost-sheet→approval→submission→posting workflow). LHDN e-invoice: EInvStatus/EInvId/EInvLongId confirmed in AccArInv, spAccEInvPosting verified. 7 accounting system integrations (AutoCount/SQL/SAP/Sovy/QnE/Otololo/Unity via spSvc* SPs). Transport & Milkrun (22 forms, 19 SPs). WMS (20 Wms* tables, 40+ SPs). Rate management (AppCharge 51 cols, 5-level rate hierarchy). Analytics (37 inquiry forms). 10-sprint P2 plan (~22 weeks). PDF export (window.print()) + PowerPoint export (PptxGenJS CDN, 3 deck options). S21 HCC mockup created (ops-haulage-command-center.html — first time HCC has a design reference). mockup-state.yaml updated with 21 screens + 8 Phase 2 pending stubs.
2026-06-01
OQ-013 resolved (Calvin confirmed) + Phase 1 COMPLETE — Data migration tiering confirmed as recommended default: Tier 1 (migrate before go-live): AppEnterprise, AppSBU, AppPartner, AppUser, AppUserRight, AppApiToken, AppEquipment, AppEmployee, AppTypeSize, AppPort, AppCommodity, AppCargoType, AppCountry, AppState, AppReason, AppServiceType. Tier 2 (read-only archive): JobEntry, JobContainer, JobDoc, HlgMovement, HlgMilestone. Tier 3 (defer Phase 2): Acc*, Tpt* tables. Phase 1 gate 6/6 passed. Phase 1 cleared for go-live.
2026-06-01
Load test PASSED + k6 script fixed (commit acde7f1) — Load test run locally: 504 jobs, 10 VUs, k6 v2.0.0. p95=6.21ms (gate 2000ms, 320× headroom). 0% HTTP failures. 15.9 req/s throughput. Response wrapper fixed in script (API returns data.items not top-level items). All Phase 1 gate criteria now 6/6 passed.
2026-06-01
Sprint J started (commit 9bad5ba) — Phase 1 gate verification — Build fixes: Serilog.Enrichers.Environment package added; missing using Axlogis.Core.Middleware in 2 Haulage handlers; ICurrentUserService added Enterprise/Entity/IsAuthenticated members (StubUser updated); SeedProcess sets Enterprise+Entity; SubmitPodHandler stamps Enterprise+Entity on JobDoc (production bug fix — docs were tenant-orphaned). F-4 master data: AppPartner entity (legacy table, ExcludeFromMigrations) + EF config + AppPartners DbSet. ListPartners/ListEmployees/ListEquipment handlers + MasterDataEndpoint wired in CommonModule. lib/master.ts + 3 Vue pages (live searchable paginated tables, ESLint auto-fixed). 6 new ConsignmentNote tests in SprintJFreightTests. 33/33 pass. Dual-DB lint PASS. Vue build+lint 0 errors.
2026-06-01
Sprint I complete (commit 895f2ca) — Infrastructure hardening — CorrelationIdMiddleware (X-Correlation-Id per request, pushed to Serilog LogContext). Tenant log enrichment (inline middleware after MultiTenancyMiddleware — Enterprise/Entity into LogContext+HttpContext.Items). Serilog: enhanced console template (CorrelationId+Tenant visible), Serilog.Sinks.Grafana.Loki added (prod Loki push), Hangfire overridden to Warning. Prometheus: prometheus-net.AspNetCore, UseHttpMetrics (tenant label), /metrics endpoint. appsettings.Production.json (all secrets via ${ENV_VAR} refs — safe to track). docker-compose: Loki 3.0+Grafana 11+Prometheus with auto-provisioned datasources. K8s manifests: namespace, secrets, configmap, api-deployment+service, web-deployment+service, mssql-statefulset+20Gi PVC, minio-statefulset+50Gi PVC, observability (Loki/Grafana/Prometheus+PVCs), ingress (app/api/monitoring subdomains), HPA (api 2-8 60%CPU, web 2-6 70%CPU), backup CronJob (02:00 UTC daily). backup-mssql.sh (sqlcmd+mc+30d prune). deploy.sh (one-command K8s staging deploy, --context/--tag/--dry-run).
2026-06-01
Sprint H complete (commit 9dfd3c3) — Driver portal + offline PWA shipped — Backend: UpdateMovementStatus (PATCH /haulage/movements/{id}/status — INTRANSIT/ARRIVED/COMPLETED/ISSUE; updates JobProcess.ProcessStatus + StartTime/EndTime; logs JobEvent). SubmitPod (POST /haulage/movements/{id}/pod — creates JobDoc POD+POD-SIG records, marks movement Completed). 4 new tests (27 total). Frontend: DriverShell (mobile bottom nav — Movements/POD/Profile, orange active). DriverMovements rebuilt (offline-first: online→API, offline→Dexie; grouped Active/Upcoming/Completed sections; auto-flush pendingActions on reconnect; amber offline banner). MovementCard component. DriverMovementDetail (progress track + status hero + Update Status bottom sheet with 3 options). DriverPod (camera photo input max 5, HTML5 canvas signature pad touch+mouse, recipient name, delivery checklist, submit disabled until all 3 complete). lib/driver.ts (prefetchMovements at driver login, flushPendingActions). useOnline composable. Router: DriverShell, /driver/movements home, 4 new routes. 27/27 API tests, 0 lint errors, build clean.
2026-06-01
Sprint G complete (commit e057e7d) — Customer + Partner portals shipped — ExternalShell.vue (top-nav layout, no sidebar) shared by customer+partner roles; View-Only amber badge for partners. CustomerShipments: KPI tiles, status tabs, search, consignment-note table. CustomerShipmentDetail: 5-step timeline driven by noteStatus, document download via MinIO pre-signed URL (lib/docs.ts getDocumentDownloadUrl). PartnerJobList: allocated jobs KPI tiles, status tabs, job table. PartnerJobDetail: 3-tab detail (Overview/Documents/Timeline) with read-only job fields and real document Download buttons. Router updated: customer+partner now use ExternalShell; 3 new routes; roleHomeMap redirects to /customer/shipments and /partner/jobs. Build clean, 0 lint errors.
2026-06-01
Sprint F complete (commit 306dea3) — Ops frontend portals shipped — OpsDashboard rebuilt (live job KPIs+status chart). OpsMovementBoard (HCC endpoint, filterable). OpsFreightList (ConsignmentNotes paginated). OpsConsignmentNoteDetail (cancel action). OpsHaulageCommandCenter (v-if columns via TenantConfig: isExilian/hasCargoMove). 5 master data stubs. lib/freight.ts+movements.ts+useFormErrors composable. 9 new routes. AppSidebar: HCC+Fleet nav. Build clean, 0 lint errors, 23/23 tests.
2026-06-01
Sprint E complete (commit 37a7a79) — Cross-cutting architecture done — IDomainEvent interface + domain events on AuditableEntity (AddDomainEvent/ClearDomainEvents). OutboxInterceptor (domain events→OutboxMessage in same tx). AuditInterceptor (full JSON diff on all AuditableEntities — G-01=A). AuditLog table + migration. OutboxProcessor Hangfire recurring job (Minutely, batch 20, 3 retries). Hangfire 1.8.23 (Core+SqlServer+AspNetCore). GET /api/v1/identity/config TenantConfigDto (4 HCC flags: hasDnDCharges/hasCargoMove/isExilian/hasCteDropSeq). Vue tenant.ts fetchConfig()+resetConfig(). CI dual-DB lint step. G-01/G-08/G-05 decisions in sprint-e-architecture-notes.html. 23/23 tests.
2026-05-31
OQ-03 + OQ-04 resolved · Sprint D unblocked · Architecture notes page created — Calvin confirmed: TmpJobContainer = session-scoped (#) → C# uses in-memory List<ContainerUploadRow> per request. ContainerRequest numbers = JobSequences pattern (ROT{YYMM}{seq:D4}). MinIO: one shared axlogis-docs bucket, paths {Enterprise}/{Entity}/{JobNo}/, 15 min doc URLs, 60 min POD URLs. Full rationale: ai/docs/sprint-d-architecture-notes.html.
2026-05-31
Sprint C complete (commit e3d8206) — Job lifecycle fully implemented · 13/13 tests — UpdateJob (PUT /jobs/{id}; editable while Pending/Planned; 422 JOB_NOT_EDITABLE after start). ConfirmJob (Pending→Planned, Job.Confirm event). StartJob (Planned→InProgress, Job.Start event). CompleteJob (InProgress→Completed, Job.Complete event). CancelJob (from any active status; 422 JOB_INVALID_TRANSITION if already Completed/Cancelled). GET /jobs/{id}/history via IJobEventService. KnownRights + JobStart + JobComplete. 8 integration tests: full lifecycle happy path + all invalid-transition 422 cases. Phase 1 gate criterion "Ops can create job from scratch to completion" now fully covered via API.
2026-05-31
Full gap audit + Sprint A-J prioritization plan recorded — Read-only audit across all layers. Found: 8 arch gaps (G-01–G-08), 8 missing entity mappings (E-01–E-08), 10 missing API endpoints, 10 service TODOs, 15+ missing Vue pages, 6 infra gaps. Phase 1 gate: 0/6 criteria fully met. 10 open questions to Calvin identified. Sprint A-J plan (~8–10 weeks to Phase 1 gate) saved to ai/state/prioritization-plan.md. Full audit in ai/state/gap-audit-2026-05-31.md.
2026-05-31
AppServiceProcess entity + MovementService.GenerateAsync (commit 4223946)AppServiceProcess mapped (288 rows, ExcludeFromMigrations). MovementService.GenerateAsync fully implemented: loads service-type process sequence, skips containers already having movements (idempotent), generates JobProcess at spacing ×10. [Q-MD-002] staging child movements: StageIn (seq-1) + main (seq) + StageOut (seq+1) when AppProcess.IsStaging=1. IMovementService moved Axlogis.Haulage→Axlogis.Common; Freight can now inject it. JobCloneService step b wired.
2026-05-31
Wire [TODO-CLONE-PIPELINE] steps f+g+k+l (commit 236fc18)JobCloneService now injects IJobEntryService, IJobEventService, ICurrentUserService. f: InsertOwnJobEntryAsync(autoAccept=true). g: ClearAcceptanceAsync if jobStatus==0. k: LogAsync "Job.Ack" on import job. l: LogAsync "Job.Imp" on export job with remark. Pipeline: b+f+g+k+l wired; a/c/d/e/h/i/j remain stubbed.
2026-05-31
Haulage sprint steps 16-18 complete (commit 28bb9a3) — HAULAGE SPRINT DONE · ALL 18 STEPSEmptyHeadService shell [W-004/Q-CP-009]: 6-scenario state machine (A–F) documented inline; area-code matching [Q-CP-009] tagged at exact branch; deferred pending AppEmployee/AppAddress. ContainerGateDateService [W-008/Q-CP-014]: full — reads JobEvent gate-pass events, computes PortGateDate/DepotGateDate, first-gate-wins DehireDate. MovementService shell [Q-MD-002]: Q-MD-002 staging child movement pattern documented; deferred pending AppServiceProcess. HaulageModule registers all 4 services. 4/4 tests.
2026-05-31
HaulageCommandCenterService step 15 (commit 5f59c9b)GetMovementsAsync: filters JobProcess + AppProcess join by ServiceId=H, FreightMode=C, ProcessType≠H, RequirePlanning=1 [W-005/Q-MD-003]. CompletedJobLifeSpan from TenantOption; clock-skew +5min; SortKey order (InProgress→Planned→Done); left-joins JobContainer for ContainerNo/TypeSize. Truck/driver/address/vessel fields tagged [TODO-HCC-*]. ValidateB2BTransferAsync [W-007/Q-RP-005] stubbed behind MsmB2BHandover flag. Endpoint GET /api/v1/haulage/command-center/movements.
2026-05-31
CI lint fix (commit 688a85d) — 74 ESLint warnings across AppTopbar.vue (2), LoginPage.vue (60), OpsJobDetail.vue (12) resolved by eslint --fix. Rules: vue/max-attributes-per-line, vue/html-self-closing (<input/> → <input>), vue/singleline-html-element-content-newline, vue/multiline-html-element-content-newline. Build + type-check clean. CI unblocked.
2026-05-31
Freight sprint steps 13–14 complete (commit 53fe41a) — FREIGHT SPRINT DONEJobEvent entity (Guid PK; retraction via CancelTime; TransactionNo [Q-EV-005]). IJobEventService: LogAsync + GetByOrderAsync (retraction-filtered; always returns TransactionNo [W-003]). JobCargo entity (composite PK Enterprise+CargoId; ExchangeRate field). IImportCargoCostService.UpdateExchangeRateAsync [Q-CS-001 bug fix]: uses @Enterprise not @Entity. Migrations applied. 9 domain entities total in axlogis_dev. 4/4 tests. Pushed to develop.
2026-05-31
Freight sprint step 12 — JobContainer + JobProcess + ContainerTrackingService (commit 26eb81b)JobContainer (composite PK Enterprise+ContainerId; SenderContRef preserves export ContainerId for ADD_SUBJOB cross-ref; actual date fields). JobProcess (Guid PK; ProcessCode→AppProcess join key; master-job link fields MasterJobNo/MasterContainerId/MasterJobLinkId for [Q-JO-017]). IContainerTrackingService.RefreshActualDatesAsync [W-002/Q-CP-001]: loads process+AppProcess join in-memory, computes 4 date values (ActDeliveryDate/ActCollectionDate [Q-CP-001 StartTime]/EndDateTime/ActStartDate), writes via ExecuteUpdateAsync. Migration applied. 4/4 tests.
2026-05-31
Freight sprint step 11 — JobEntry entity + JobEntryService (commit b755564)JobEntry entity (Guid PK; one row per Order+ServiceId+ActionParty; unique index; deterministic LinkId = JobEntry_{Ent}_{Ent}_{OrderNo}; AckTime null=pending/set=accepted lifecycle). IJobEntryService: InsertOwnJobEntryAsync (idempotent; 'A' ServiceId; auto-accept option), ClearAcceptanceAsync (Pending-mode post-clone), CancelStaleAgentEntryAsync [W-006/Q-JO-012-A] (accepted→BusinessRuleException; pending→silent cancel). EF Core 10 PendingModelChangesWarning suppressed in test base. 4/4 tests.
2026-05-31
JobCloneService — NVOCC export-to-import clone (commit 3635b2b)CloneExportToImportAsync in Axlogis.Freight. Idempotency via SenderRef lookup (IgnoreQueryFilters for cross-entity check). Import service type resolution: 5-key TenantOption matrix (Import/ImpConsoleSea/ImpConsoleAir/ImpSubJobSea/ImpSubJobAir) read from dest entity. FreightAgent→import customer [QMS 37014]. Job number in dest entity. Header clone with all status zeroed, SenderRef/SenderId set. Post-create pipeline stubbed [TODO-CLONE-PIPELINE]; sub-job link stubbed [Q-JO-017]. 5 ServiceType.Import* keys added to TenantOptionSeeder. Axlogis.Freight now references Axlogis.Common.
2026-05-31
.NET 8 → .NET 10 LTS upgrade (commit 8243544) — All 8 csproj files: net8.0→net10.0. EF Core/JwtBearer/Mvc.Testing/Extensions→10.0.0. Swashbuckle.AspNetCore removed; replaced with Microsoft.AspNetCore.OpenApi 10.0.0 (OpenAPI.NET 2.0 API — BearerSecuritySchemeTransformer using document.Security + OpenApiSecuritySchemeReference). Docker base images + CI dotnet-version: 10.x. Directory.Build.props pins System.Security.Cryptography.Xml 10.0.8 (fixes 2 high CVEs from IdentityModel transitive dep). 0 errors, 4/4 tests.
2026-05-31
Mockup audit + 2 new screens — 20 total (S19 + S20) — S05 updated to Consignment Notes. S19 ops-consignment-note-detail.html + S20 partner-job-detail.html created. showcase.html + mockup-state.yaml synced.
2026-05-31
ConsignmentNote CRUD — first Freight vertical slice (commit 7f5b1f2) — Entity (AuditableEntity, 25 fields, ConsignmentNotes table). NoteStatus (New/Pending/Booked/Cancelled/Completed). FreightNoteNumberService (format F{YYMM}{seq:D4}, reuses JobSequences). Async validator checks ServiceType against AppServiceType. 4 handlers (Create/Get/List/Cancel) + 4 endpoints. ValidationBehavior upgraded to ValidateAsync (fixes all future async FV rules). E2E: create → get → list → cancel → invalid ServiceType rejected. 4/4 tests.
2026-05-31
Phase 2 Day 2 — AppServiceType + AppProcess ref data (commit 18eb986)AppServiceType (34 cols, 173 rows) + AppProcess (24 cols, 98 rows) mapped as EF entities with ExcludeFromMigrations(). Tables pre-exist in legacy DB. Both DbSet<> registered. Migration applied (empty — no DDL). Build 0 errors, 4/4 tests. AppProcess.StageIn/StageOut now queryable for Q-MD-002 staging logic.
2026-05-31
Phase 2 Day 1 — Foundation entities + workaround decisions (commit d2058c0) — Calvin approved workaround strategy for all 13 biz rule questions (3 self-answered, 2 deferred, 8 [Q-tag] workarounds). Shipped: KnownFeatureFlags (14 flags incl. SETIA), TenantFeatureFlag, TenantOption, OutboxMessage, ITenantFeatureService, ITenantOptionService, TenantOptionSeeder (19 keys), BusinessRuleException, FeatureNotConfiguredException. Migration Phase2Day1_TenantConfig applied.
2026-05-30
Architecture + memory + workflow review — 3 decisions locked: Phase 2 transaction wrapper (CreateExecutionStrategy), Transactional Outbox pattern, TenantFeatureFlag + ITenantFeatureService. 2 templates created: transaction-wrapper-pattern.md, 10-feature-flags.md. WARP.md updated: session-end checklist, Phase 2 module loading guide. open-questions.yaml trimmed (11 resolved → archive). progress-log.md trimmed (pre-05-28 → archive). Tech stack version audit added. Stale memory files corrected.
2026-05-30
Haulage forms KB — 11 forms UI Verifiedui-form-wiring-haulage.md created. Covers: frmStaging (3 modes, 18-step save, gate pass, B2B, charge generation), frmDiversion (new/change-location, cost sheet integration), frmShunting (Shunting+Support, spJobProcessShunting), frmHaulageMonitoring (floating SP-fed window), frmCollectionAdvice (6-tab RFC board, acknowledge/cancel, CommMapping), frmCollectionAdviceUpdate (single/batch RFC, auto-acknowledge, PCS sync), frmHlgMovementMultiple (bulk truck/driver assignment, expiry+blacklist), frmChangeTrailer, frmFutileTrip (FutileTrip/FailToPick, mobile push notify), frmTruckBreakdown (breakdown movement insertion, B2B+MSM cascade), frmPendingContainer (3-tab driver planning board).
2026-05-30
Freight forms KB — 9 forms UI Verified + MVP scope confirmedui-form-wiring-freight.md created. Covers: frmDocumentation (dual Documentation/Customs mode, ImportFromBooking, TREQ/K6 special codes, cross-job consolidation), frmCustomsForm, frmCargoReceipt (approve→auto-export-sub-job, credit hold, partner block check), frmCompleteProcess (3rd-party completion, event grid, batch, auto-close), frmTransportRequest (breakbulk ROT, CommMapping), frmContainerMonitor (spContainerMonitoring, 5 tabs), frmTransportMonitor (spTransportMonitoring, 3 tabs), frmFreightConsoleUpload (XML import pipeline). Scope confirmed: frmCustomsDeclaration, frmTravelJobEntry/frmExpressJobEntry, frmEmployeeAttendance, frmVAS/frmNCR all deferred. KB form count: 5 → 25.
2026-05-31
Phase 2 foundation + Freight sprint complete — TenantFeatureFlag/Option/Outbox (Day 1) + AppServiceType/AppProcess (Day 2) + Calvin workaround approvals + ConsignmentNote CRUD E2E + JobCloneService NVOCC + all 5 Freight domain entities + 8 services. Commits d2058c0→53fe41a.
Locked Architecture Decisions — do not re-litigate these
Greenfield build — not a VB.NET patch
ASolute source is read-only reference. New system is a clean Vue 3 + .NET 10 LTS build (upgraded 2026-05-31).
Zero SP calls from the API
All 1,500 stored procedures are rewritten as C# domain services module by module.
Dual-DB provider via EF Core abstraction
MSSQL now → PostgreSQL later. Zero provider-specific SQL in codebase. Swap = config change only.
Vertical Slice Architecture (.NET 8 API)
Feature folders, not layers. Each feature = Command/Query + Handler + Validator + DTO.
Composite (Enterprise, Entity) multi-tenancy
All major tables carry both keys. Tenant context injected via middleware from JWT claims.
Schema: ≤10% additive enhancements
Existing 341 tables are the baseline. Only additive changes allowed — no column renames or drops in Phase 0/1.
Tenant branches → feature flags (never hardcoded)
15 tenant enterprise checks in legacy code must become configurable flags, not if Enterprise == 'X' checks.
Monorepo until split signals appear
New code lives in one repo. Split when team size, release cycles, or CI time justify it.
New system in a separate repository
Not inside this legacy workspace. Legacy workspace stays as the read-only reference and AI knowledge base.
4 portal roles
Ops staff, Customers, Drivers (offline PWA with GPS), Partners. Auth via JWT from API.
Phase 2+ transaction boundary: CreateExecutionStrategy wrapper
All multi-step writes wrap in CreateExecutionStrategy().ExecuteAsync(). Bare BeginTransactionAsync() outside the wrapper is prohibited. Template: entity-templates/transaction-wrapper-pattern.md.
Phase 2+ cross-module events: Transactional Outbox
Domain events written to OutboxMessage rows in same DB transaction. Hangfire OutboxProcessor delivers via MediatR. No in-process mediator.Publish() from handlers. Template: transaction-wrapper-pattern.md §2.
Tenant feature flags: TenantFeatureFlag + ITenantFeatureService
All hardcoded enterprise string checks (EXILIAN, BERNAS, MSM, etc.) replaced by named flags in DB. KnownFeatureFlags constants in Axlogis.Core. 5-min TTL cache. Config endpoint exposes flags to Vue. Design: 10-feature-flags.md.