Skip to content

Iteration 10

Choose a tag to compare

@Niravanaa Niravanaa released this 24 Feb 04:31
· 257 commits to main since this release
2cf1308

Release Date: February 23, 2026

🎯 Overall Summary

Iteration 10 focused on traffic congestion system completion, frontend task management enhancements, simulation architecture improvements, and security hardening. This iteration delivered the full Montreal Traffic CSV pipeline with realistic congestion data, three congestion-level templates (low/medium/high), mass task assignment via both click-modifiers and station drag-and-drop, a major simulation-React architecture refactor decoupling client logic from the render cycle, driver state visualization in the resource bar, and hardened CI/CD security. Key achievements include the end-to-end traffic configuration system, the first automated API dispatcher demo, and significantly improved logging observability via queryable Loki labels.

🏎️ Velocity

image

💵 Contractor Estimate

Artifact Type Level of Effort Estimated Price (CAD)
Traffic & Congestion System High (27h) $594
Frontend Enhancements & Task Mgmt Medium (13h) $286
Backend, Logging & API Medium (10h) $220
Simulation Features & Metrics Medium (7h) $154
Infrastructure & CI/Security Medium (5h) $110
Code Architecture & Refactoring Low (3h) $66
Total 65h $1,430

Notes:

  • Hourly rate assumed: $22/hr (average co-op software engineering rate from Concordia, source).
  • The hours listed above represent the time specifically spent on developing the individual software artifacts. They do not reflect the total time our team has committed to Iteration 10.

🔄 Retrospective

What went well?

  • Got a lot done (+1)
  • A lot of PRs merged!
  • Good communication and feedback loop with stakeholder (+3)
  • Quick fixes
  • Usability test with domain expert! (+1)
  • Big client side refactor (thank you thomas!)

What went wrong?

  • Left some stuff to last minute (+1)

What can be improved on?

  • Team bonding activity (+1)
  • Addressing grading feedback as much as possible
  • Another scheduled time for a sync up meeting (if availabilities)
  • Steady flow of PRs across the iteration instead of end-of-sprint clustering (probably trickier this iteration given midterms) (+3)

🤝 Individual Contributions

@Ambrose821 - Ambrose McLaughlin [ID: 40239754]

  • Sim: Refactor Scheduled Tasks in #715

    • Refactored DefaultTPUStrategy to manage scheduled tasks via station_scheduled_tasks dict with O(1) lookup and a _scheduled_tasks_set for O(1) removal
    • Updated the abstract TaskPopupStrategy interface and all usages to return a list of BatterySwapTask instead of a boolean
    • Removed spawn delay and scheduled state logic from Task and BatterySwapTask constructors, centralizing responsibility in the popup strategy
  • Sim: Fix scheduled tasks omitted before sim start time in #742

    • Added check in json_parser_strategy.py to instantiate and assign scheduled tasks to their stations when they are scheduled before the simulation start time
    • Prevents pre-start-time tasks from being silently dropped from the scenario

@briantkatch - Brian Tkatch [ID: 40191139]

  • Backend: Add demo of API usage in #693

    • Added apidemo/ directory with a Python-based automated task dispatcher demonstrating VeloSim REST API usage
    • Implements greedy nearest-neighbor algorithm for continuous task-driver assignment with OAuth2 authentication and duplicate-assignment prevention
    • Includes generated OpenAPI client, setup.sh script, and committed openapi.json fallback for offline client generation
  • CI: Fix key management for 3rd-party repos in #718

    • Migrated from deprecated apt_key module to get_url + gpg --dearmor for modern APT key storage in /usr/share/keyrings/
    • Repository entries now include signed-by= parameter binding repos to their specific key, preventing any key from signing any repo
    • Applied to both Docker and PostgreSQL Ansible roles
  • Frontend: Add driver name above the driver in #716

    • Passes driver name in GeoJSON properties and adds a text field to the Mapbox symbol layer
    • Driver names now display at all zoom levels above vehicle icons on the simulation map
  • CI: Harden traffic template access and deployment in #760

    • Added path-traversal defence against inputs like ../../whatever.csv escaping the templates directory
    • Added traffic dataset download to the backend Dockerfile so templates deploy to production
    • Added traffic CSV caching and generation commands to the backend CI workflow

@cmezzac - Christopher Mezzacappa [ID: 40249451]

  • Sim: Report average response time in #714
    • Tracks task service duration upon completion by computing env.now - spawn_delay
    • Added get_average_service_time_for_tasks() and add_task_count_for_shift() to SimulationReport
    • Added defensive handling when spawn_delay is None and comprehensive unit test coverage

@Jpuntul - Jutipong Puntuleng [ID: 40080233]

  • Frontend: Add logging to scenario entity dialog components in #735

    • Added structured WARNING logs on form validation failure and INFO logs on successful entity submission
    • Updated add-driver-dialog.tsx, add-station-dialog.tsx, and add-vehicle-dialog.tsx with log and LogLevel imports
    • Extracted submitted data into a local variable before calling onSubmit for cleaner logging context
  • Frontend: Mass assign tasks by dragging from a station in #730

    • Implemented setupStationDragHandlers with full mousedown → drag → mouseup lifecycle and a 5-pixel distance threshold to avoid interfering with normal clicks
    • DOM-based drag ghost follows cursor above all overlays including the resource bar; drop targets include both driver icons on the map and driver cards in the resource bar
    • Added useStationDragHandlers hook with toast notifications for edge cases (station not found, no open tasks)
  • Docs: Wiki contributions in Repo Wiki

    • Updated Infrastructure and Tools documentation.
    • List of Revisions: 1

@mahutt - Thomas Mahut [ID: 40249811]

  • Chore: Resolve frontend dependency vulnerabilities in #712

  • Frontend: Decouple client sim and React code in #749

    • Introduced SimulationEngine class and ReactiveStateManager to fully separate client-side simulation logic from the React render cycle
    • Eliminated stale-closure refs, duplicate useState/useRef pairs, and dead code (e.g. unused requestReassignment)
    • Consolidated assignTask, batchAssignTasks, and reassignTask into a single assignTasks method now that the batch endpoint supports reassignment
  • Frontend: Disable user actions on replay in #766

    • Disables all TaskItems when in scrubbing or local (replay) frame-source mode to prevent invalid assignments during playback
    • Removes the now-unnecessary taskDragAndDrop feature flag
  • Docs: Wiki contributions in Repo Wiki

    • Updated Usability Tests documentation.
    • List of Revisions: 1

@MeSumo - Sumer Abd Alla [ID: 40247712]

  • Sim: Introduces Montreal Traffic CSV in #732

    • Implemented traffic_to_csv script parsing Montreal public datasets into a VeloSim-compatible traffic CSV using pandas with resumable Google Drive downloads
    • Applies temporal folding for a typical workday profile with 5-minute intervals; uses 85th-percentile flow speed for accurate free-flow baselines
    • Added sim_start_time/sim_end_time to TrafficConfig and updated TrafficParser to resolve time-relative tick positions across multi-day scenarios
  • Sim: Congestion Templates and Traffic Configurations in #751

    • Added create_templates.py and retrieve_templates.py scripts for generating and downloading three congestion-level CSV templates (low/medium/high) from Google Drive
    • Replaced traffic_path with traffic_level in TrafficConfig; json_parser_strategy validates levels and defaults to "default" as requested by stakeholder
    • Supported traffic_level options: "default", "no_traffic", "low_congestion", "medium_congestion", "high_congestion"
  • CI: Harden traffic template access and deployment in #760

    • Added path-traversal defence against inputs like ../../whatever.csv escaping the templates directory
    • Added traffic dataset download to the backend Dockerfile so templates deploy to production
    • Added traffic CSV caching and generation commands to the backend CI workflow
  • Docs: Wiki contributions in Repo Wiki

    • Updated Meeting Minutes – General documentation with iteration meeting notes.
    • List of Revisions: 1 | 2

@Michael-Mezzacappa - Michael Mezzacappa [ID: 40263789]

  • Bugfix: Descriptive message added to log in #763

    • Fixed [object Event] appearing in WebSocket error logs by wrapping the onerror event in a proper new Error('WebSocket connection failed') before logging
    • Hardened logSimulationError to handle Error, string, and all other types separately, falling back to 'An unknown error occurred' instead of stringifying DOM objects
    • Added readyState as a human-readable string (e.g. "CLOSED", "CONNECTING") to logged context for improved diagnostics
  • Frontend: Added queryable labels to logs in #764

    • Added entity_type and error_type as Loki stream labels so frontend errors can be filtered and investigated by type directly in Grafana
    • Frontend log service now forwards these fields from the incoming log payload to the logger via extra={}
    • Added and updated tests to cover the new label extraction behaviour

@Niravanaa - Nirav Patel [ID: 40248940]

  • Frontend: Add DriverStateBadge component and integrate it into ResourceItem in #729

    • Added state: DriverState field to ResourceItemElement and implemented a two-row layout in ResourceItem (name/ID row + state badge/battery row)
    • Updated updateResourceBarElement() in simulation-provider.tsx to propagate driver state from resource data
    • Modified driverResourceHasUpdated() in simulation-helpers.ts to detect state changes independently of task count changes
  • Fix: Add rounded corners to HQWidget button in #743

    • Changed HQ widget button to use rounded-lg directly instead of relying on parent overflow-hidden, fixing clipping of the widget when pushed down by a full resource bar
    • Added max-height constraint to ResourceBar to prevent the HQ widget from being pushed off-screen
  • CI: Add traffic CSV and templates steps to main CI backend job in #765

    • Added "Cache Traffic Assets" step using actions/cache@v4 targeting sim/traffic/traffic_datasets
    • Added fetch step for default traffic CSV and retrieve step for congestion templates on cache miss, mirroring the backend CI workflow
  • Backend: Update scenario validation to handle bare content in #762

    • Removed .get("content", json_to_validate) fallback from JsonParseStrategy.validate() and parse(), enforcing strict bare-content contract
    • Updated all sim test fixtures and backend API tests to pass and store bare scenario content, matching the actual DB contract

@Verdone - Giuliano Verdone [ID: 40252190]

  • Backend/Sim: Add GraphHopper routing adapter with traffic-aware support in #752
    • Implemented GraphHopperConnection, GraphHopperAdapter, GraphHopperResult, and GraphHopperSegmentMapper to integrate GraphHopper as an alternative routing engine (sim/osm/)
    • Updated MapController to support GraphHopper alongside OSRM with environment-driven routing provider initialization
    • Created scripts/benchmark_routing_graphhopper.py to benchmark routing performance across baseline, heavy traffic, concurrent, and concurrent+traffic scenarios
  • Docs: Wiki contributions in Repo Wiki
    • Updated Usability Tests with Round 2 usability testing information.
    • Updated Meeting Minutes – General documentation with iteration meeting notes.
    • List of Revisions: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8

@vinishamanek - Vinisha Manek [ID: 40229456]

  • Frontend: Add mass task selection via clicks for batch assignment in #701

    • Added useTaskMassSelect hook supporting single click, Cmd/Ctrl+click (non-contiguous toggle), and Shift+click (contiguous range) task selection
    • Refactored task assignment to use taskIds[] array; single-task operations still work via a one-element array
    • Updated drag interactions to carry all selected tasks with a custom drag preview showing the selection count
  • Frontend: Confirmation for task assignment exceeding driver's battery count in #739

    • Added remainingBatteryCount prop to TaskAssignmentBanner with a warning when assignments would exceed the driver's battery capacity
    • Replaced resourceId/prevResourceId props with driverName/prevDriverName for more readable assignment banners
  • Frontend: Refine resource items in #767

    • Removed search bar from ResourceBar as it provided little utility
    • Added shortened prop to DriverStateBadge for compact default display with hover-expand to the full label
    • Removed driver # from ResourceItem and fixed selection border styling
  • Docs: Wiki contributions in Repo Wiki

    • Updated Usability Tests documentation.
    • List of Revisions: 1 | 2 | 3 | 4

@CarciDev - David Carciente [ID: 40247907]

  • Docs: Wiki contributions in Repo Wiki
    • Updated Missing Knowledge and Independent Learning and Overall Architecture and Class Diagrams documentation.
    • List of Revisions: 1 | 2

📋 What's Changed

Full Changelog: Iteration9...Iteration10