Iteration 10
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
💵 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
DefaultTPUStrategyto manage scheduled tasks viastation_scheduled_tasksdict with O(1) lookup and a_scheduled_tasks_setfor O(1) removal - Updated the abstract
TaskPopupStrategyinterface and all usages to return a list ofBatterySwapTaskinstead of a boolean - Removed spawn delay and scheduled state logic from
TaskandBatterySwapTaskconstructors, centralizing responsibility in the popup strategy
- Refactored
-
Sim: Fix scheduled tasks omitted before sim start time in #742
- Added check in
json_parser_strategy.pyto 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
- Added check in
@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.shscript, and committedopenapi.jsonfallback for offline client generation
- Added
-
CI: Fix key management for 3rd-party repos in #718
- Migrated from deprecated
apt_keymodule toget_url+gpg --dearmorfor 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
- Migrated from deprecated
-
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.csvescaping 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
- Added path-traversal defence against inputs like
@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()andadd_task_count_for_shift()toSimulationReport - Added defensive handling when
spawn_delayisNoneand comprehensive unit test coverage
- Tracks task service duration upon completion by computing
@Jpuntul - Jutipong Puntuleng [ID: 40080233]
-
Frontend: Add logging to scenario entity dialog components in #735
- Added structured
WARNINGlogs on form validation failure andINFOlogs on successful entity submission - Updated
add-driver-dialog.tsx,add-station-dialog.tsx, andadd-vehicle-dialog.tsxwithlogandLogLevelimports - Extracted submitted data into a local variable before calling
onSubmitfor cleaner logging context
- Added structured
-
Frontend: Mass assign tasks by dragging from a station in #730
- Implemented
setupStationDragHandlerswith fullmousedown → drag → mouseuplifecycle 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
useStationDragHandlershook with toast notifications for edge cases (station not found, no open tasks)
- Implemented
-
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
- Resolved three known CVE vulnerabilities in the frontend sub-directory: GHSA-h5cw-625j-3rxh, GHSA-2w69-qvjg-hvjx, GHSA-8v8x-cx79-35w7
-
Frontend: Decouple client sim and React code in #749
- Introduced
SimulationEngineclass andReactiveStateManagerto fully separate client-side simulation logic from the React render cycle - Eliminated stale-closure refs, duplicate
useState/useRefpairs, and dead code (e.g. unusedrequestReassignment) - Consolidated
assignTask,batchAssignTasks, andreassignTaskinto a singleassignTasksmethod now that the batch endpoint supports reassignment
- Introduced
-
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
taskDragAndDropfeature flag
- Disables all
-
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_csvscript 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_timetoTrafficConfigand updatedTrafficParserto resolve time-relative tick positions across multi-day scenarios
- Implemented
-
Sim: Congestion Templates and Traffic Configurations in #751
- Added
create_templates.pyandretrieve_templates.pyscripts for generating and downloading three congestion-level CSV templates (low/medium/high) from Google Drive - Replaced
traffic_pathwithtraffic_levelinTrafficConfig;json_parser_strategyvalidates levels and defaults to"default"as requested by stakeholder - Supported
traffic_leveloptions:"default","no_traffic","low_congestion","medium_congestion","high_congestion"
- Added
-
CI: Harden traffic template access and deployment in #760
- Added path-traversal defence against inputs like
../../whatever.csvescaping 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
- Added path-traversal defence against inputs like
-
Docs: Wiki contributions in Repo Wiki
@Michael-Mezzacappa - Michael Mezzacappa [ID: 40263789]
-
Bugfix: Descriptive message added to log in #763
- Fixed
[object Event]appearing in WebSocket error logs by wrapping theonerrorevent in a propernew Error('WebSocket connection failed')before logging - Hardened
logSimulationErrorto handleError,string, and all other types separately, falling back to'An unknown error occurred'instead of stringifying DOM objects - Added
readyStateas a human-readable string (e.g."CLOSED","CONNECTING") to logged context for improved diagnostics
- Fixed
-
Frontend: Added queryable labels to logs in #764
- Added
entity_typeanderror_typeas 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
- Added
@Niravanaa - Nirav Patel [ID: 40248940]
-
Frontend: Add DriverStateBadge component and integrate it into ResourceItem in #729
- Added
state: DriverStatefield toResourceItemElementand implemented a two-row layout inResourceItem(name/ID row + state badge/battery row) - Updated
updateResourceBarElement()insimulation-provider.tsxto propagate driver state from resource data - Modified
driverResourceHasUpdated()insimulation-helpers.tsto detect state changes independently of task count changes
- Added
-
Fix: Add rounded corners to HQWidget button in #743
- Changed HQ widget button to use
rounded-lgdirectly instead of relying on parentoverflow-hidden, fixing clipping of the widget when pushed down by a full resource bar - Added max-height constraint to
ResourceBarto prevent the HQ widget from being pushed off-screen
- Changed HQ widget button to use
-
CI: Add traffic CSV and templates steps to main CI backend job in #765
- Added "Cache Traffic Assets" step using
actions/cache@v4targetingsim/traffic/traffic_datasets - Added fetch step for default traffic CSV and retrieve step for congestion templates on cache miss, mirroring the backend CI workflow
- Added "Cache Traffic Assets" step using
-
Backend: Update scenario validation to handle bare content in #762
- Removed
.get("content", json_to_validate)fallback fromJsonParseStrategy.validate()andparse(), 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
- Removed
@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
@vinishamanek - Vinisha Manek [ID: 40229456]
-
Frontend: Add mass task selection via clicks for batch assignment in #701
- Added
useTaskMassSelecthook 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
- Added
-
Frontend: Confirmation for task assignment exceeding driver's battery count in #739
- Added
remainingBatteryCountprop toTaskAssignmentBannerwith a warning when assignments would exceed the driver's battery capacity - Replaced
resourceId/prevResourceIdprops withdriverName/prevDriverNamefor more readable assignment banners
- Added
-
Frontend: Refine resource items in #767
- Removed search bar from
ResourceBaras it provided little utility - Added
shortenedprop toDriverStateBadgefor compact default display with hover-expand to the full label - Removed driver
#fromResourceItemand fixed selection border styling
- Removed search bar from
-
Docs: Wiki contributions in Repo Wiki
@CarciDev - David Carciente [ID: 40247907]
- Docs: Wiki contributions in Repo Wiki
📋 What's Changed
- chore: resolve frontend dependency vulnerabilities #711 by @mahutt in #712
- feat: add mass task selection via clicks for batch assignment by @vinishamanek in #701
- feat: Add demo of API usage by @briantkatch in #693
- ci: Fix key management for 3rd-party repos by @briantkatch in #718
- feat: Add driver name above the driver by @briantkatch in #716
- feat: report average response time by @cmezzac in #714
- feat: refactor scheduled tasks by @Ambrose821 in #715
- feat: Add DriverStateBadge component and integrate it into ResourceItem by @Niravanaa in #729
- feat: add logging to scenario entity dialog components #734 by @Jpuntul in #735
- feat: Introduces Montreal Traffic CSV by @MeSumo in #732
- feat: confirmation for task assignment exceeding driver's battery count by @vinishamanek in #739
- Fixed scheduled tasks being omitted when scheduled before sim start time by @Ambrose821 in #742
- fix: add rounded corners to HQWidget button #651 by @Niravanaa in #743
- feat: mass assign tasks by dragging from a station by @Jpuntul in #730
- feat: Congestion Templates and Traffic Configurations by @MeSumo in #751
- ci: Harden traffic template access and deployment by @briantkatch and @MeSumo in #760
- refactor: decouple client sim and react code #748 by @mahutt in #749
- ci: add traffic csv and templates steps to main CI backend job by @Niravanaa in #765
- feat: update scenario validation to handle bare content by @Niravanaa in #762
- bugfix: Descriptive message added to log #657 by @Michael-Mezzacappa in #763
- feat: Added queryable labels to logs #647 by @Michael-Mezzacappa in #764
- feat: refine resource items by @vinishamanek in #767
- feat: disable user actions on replay #704 by @mahutt in #766
Full Changelog: Iteration9...Iteration10