name: routing-customization description: "Route customization requests to the correct subskills. Use when: changing location, changing map, changing vehicle, changing routing profile. Do NOT use for: initial ORS deployment (use build-routing-solution), deploying demo apps, or reading ORS config only (use read-ors-configuration subskill directly). Triggers: change location, change map, change vehicle, change routing profile, change routing profiles." depends_on: - build-routing-solution metadata: author: Snowflake SIT-IS version: 1.0.0 category: configuration
Customization Router
This skill routes customization requests to the correct subskills based on what you want to customize.
Configuration
| Parameter | Default | Description |
|---|---|---|
ORS_APP_NAME |
OPENROUTESERVICE_APP |
Name of the installed ORS app |
COMPUTE_POOL |
OPENROUTESERVICE_APP_COMPUTE_POOL |
Compute pool used by ORS services |
MAP_REGION |
(current) | Target geographic region for the map data |
ROUTING_PROFILES |
(current) | Comma-separated list of profiles to enable |
Required Privileges
| Privilege | Scope | Reason |
|---|---|---|
| USAGE ON DATABASE OPENROUTESERVICE_APP | DATABASE | Reads and modifies ORS configuration |
| ALTER COMPUTE POOL | Compute Pool | Suspends/resumes compute pool for config changes |
| ALTER SERVICE | Application | Suspends/resumes ORS services and updates specs |
| INSERT/DELETE ON OPENROUTESERVICE_APP.CORE.MAP_CONFIG | Table | Updates map configuration for Function Tester |
Error Logging
Follow the Error Logging convention in AGENTS.md. Log file prefix:
routing-customization.
Workflow
All file paths in subskills (e.g.,
.cortex/skills/build-routing-solution/openrouteservice_app/...) are relative to the repository root directory.
Query Tag
Set at the start of every session:
ALTER SESSION SET query_tag = '{"origin":"sf_sit-is-fleet","name":"oss-routing-customization","version":{"major":1,"minor":0},"attributes":{"is_quickstart":1,"source":"sql"}}';
Step 1: Read Initial ORS Configuration and Gather Customization Options
Goal: Detect the initial map region and routing profiles from the ORS configuration and display to the user
Read and follow the instructions in
.cortex/skills/routing-customization/read-ors-configuration/SKILL.md
Output: ORS configuration displayed to the user:
- Initially configured Map Region:
<INITIAL_REGION_NAME> - Initially configured Vehicle profiles:
<INITIAL_PROFILES>
Step 2: Determine What to Customize
Ask the user (allow multiple selections):
"What would you like to customize? Multiple selection is allowed."
- Location/Map - Change the geographic region (e.g., San Francisco → Paris)
- Routing Profiles - Enable/disable routing profiles (driving-car, driving-hgv, cycling-electric)
IMPORTANT: Use multi-select so the user can choose one or both options. If both are selected, run the location skill first, then the routing profiles skill, before proceeding to Step 4.
Step 3: Route to Correct Skill
If user wants to change LOCATION or MAP:
This requires changing a map. Read and follow the instructions in
.cortex/skills/routing-customization/location/SKILL.md
If user wants to change ROUTING PROFILES:
This updates which routing profiles are available. Read and follow the instructions in
.cortex/skills/routing-customization/routing-profiles/SKILL.md
Step 4: Update Routing Graphs
Goal: Restart services to update routing graphs with new location
Actions:
Determine if this is a new region or an existing region re-download:
New region (no prior graphs exist): Skip the REMOVE commands and proceed directly to resuming services. The graphs stage paths won't exist yet.
Existing region re-download (map existed and user selected to re-download): Ask the user:
- "Do you want to rebuild the routing graphs for this region? This will clear existing cached graphs and elevation data, forcing a fresh rebuild."
If existing region and user confirms YES, clear existing graphs and elevation cache:
REMOVE @OPENROUTESERVICE_APP.CORE.ORS_ELEVATION_CACHE_SPCS_STAGE/<REGION_NAME>/; REMOVE @OPENROUTESERVICE_APP.CORE.ORS_GRAPHS_SPCS_STAGE/<REGION_NAME>/;NOTE: This ensures graphs are rebuilt from scratch with the new map data rather than using potentially stale cached data.
Resume the compute pool (required if it was suspended during location change):
ALTER COMPUTE POOL OPENROUTESERVICE_APP_COMPUTE_POOL RESUME;Resume all services:
CALL OPENROUTESERVICE_APP.CORE.RESUME_ALL_SERVICES();Verify ORS is healthy:
SELECT OPENROUTESERVICE_APP.CORE.CHECK_HEALTH();Monitor ORS_SERVICE logs for graph building progress:
CALL SYSTEM$GET_SERVICE_LOGS('OPENROUTESERVICE_APP.CORE.ORS_SERVICE', 0, 'ors', 100);- Look for:
"Graph built in X seconds"messages for each enabled profile
- Look for:
Note: Graph building can take 30 minutes to several hours depending on map size and number of enabled profiles.
Output: Services rebuilding with new map
Step 5: Update MAP_CONFIG Table
Goal: Store map configuration so Function Tester can dynamically load settings
Actions:
Clear any existing configuration:
DELETE FROM OPENROUTESERVICE_APP.CORE.MAP_CONFIG;Insert the new map configuration:
INSERT INTO OPENROUTESERVICE_APP.CORE.MAP_CONFIG (city_name, center_lat, center_lon, min_lat, max_lat, min_lon, max_lon, osm_file_name, updated_at) VALUES ('<CITY_NAME>', <CENTER_LAT>, <CENTER_LON>, <MIN_LAT>, <MAX_LAT>, <MIN_LON>, <MAX_LON>, '<MAP_NAME>', CURRENT_TIMESTAMP());NOTE: The
updated_atcolumn is required -- the Function Tester usesORDER BY updated_at DESC LIMIT 1to load the latest config.Example for Paris:
INSERT INTO OPENROUTESERVICE_APP.CORE.MAP_CONFIG (city_name, center_lat, center_lon, min_lat, max_lat, min_lon, max_lon, osm_file_name, updated_at) VALUES ('Paris', 48.8566, 2.3522, 48.80, 48.92, 2.22, 2.42, 'Paris.osm.pbf', CURRENT_TIMESTAMP());Example for Berlin:
INSERT INTO OPENROUTESERVICE_APP.CORE.MAP_CONFIG (city_name, center_lat, center_lon, min_lat, max_lat, min_lon, max_lon, osm_file_name, updated_at) VALUES ('Berlin', 52.5200, 13.4050, 52.35, 52.70, 13.08, 13.77, 'Berlin.osm.pbf', CURRENT_TIMESTAMP());Verify the configuration was saved:
SELECT * FROM OPENROUTESERVICE_APP.CORE.MAP_CONFIG;
Note: The Function Tester will automatically generate test addresses within these bounds when it loads. If no MAP_CONFIG entry exists, it defaults to San Francisco.
Output: MAP_CONFIG table updated with new region bounds
Step 6: Redeploy SPCS APP
Goal: Upload and redeploy the Function Tester so it picks up the new MAP_CONFIG
Note: The Function Tester automatically reads the MAP_CONFIG table (updated in Step 5) and dynamically generates region-specific sample addresses within those bounds. No manual code edits are needed for addresses — just redeploy.
NOTE: The React-based Function Tester in the ORS Control App dynamically loads installed profiles from ORS_STATUS — no hardcoded profile list to update.
Actions:
- Follow instructions from AGENT.MD to deploy new ors control app
Output: Function Tester redeployed, now showing addresses for the new region
Examples
Example 1: Change location from San Francisco to Paris
User says: "Change the map to Paris" Actions:
- Read current ORS configuration (Step 1)
- Route to location subskill (Step 3)
- Download Paris city map from BBBike, upload to stage
- Update routing graphs (Step 4), MAP_CONFIG (Step 5), redeploy Function Tester (Step 6) Result: ORS serves routes for Paris, Function Tester shows Paris addresses
Example 2: Enable additional routing profiles
User says: "Add walking and cycling-regular profiles" Actions:
- Read current ORS configuration (Step 1)
- Route to routing-profiles subskill (Step 3)
- Call WRITE_ORS_CONFIG with updated profile list
- Rebuild routing graphs (Step 4) Result: ORS serves routes for walking, cycling-regular, and previously enabled profiles
Example 3: Change both location and profiles
User says: "Switch to London with driving-car and foot-walking only" Actions:
- Read current ORS configuration (Step 1)
- User selects both Location and Routing Profiles (Step 2)
- Run location subskill first, then routing-profiles subskill (Step 3)
- Rebuild graphs, update MAP_CONFIG, redeploy Function Tester (Steps 4-6) Result: ORS serves London routes for driving-car and foot-walking
Stopping Points
- ✋ After Step 3: Confirm map download completed
- ✋ After Step 4: Verify services are rebuilding graphs
- ✋ After Step 5: Verify MAP_CONFIG table has correct bounds
- ✋ After Step 6: Verify Function Tester shows new region addresses
Cleanup
This skill modifies ORS configuration but does not create persistent objects. To revert changes:
- Re-run the location subskill to change back to the original region
- Re-run the routing-profiles subskill to restore original profile settings
- Restart services via Step 4
Tip: Use the
cleanupskill to auto-discover all tagged objects via COMMENT tracking.