3 Methods

if (params$project_region == "peace") {
  fish_col_permit_num <- "PG25-983916"
} else if (params$project_region == "skeena") {
  fish_col_permit_num <- "SM25-984576"
} else if (params$project_region == "fraser") {
  fish_col_permit_num <- "PG25-983997 and WL25-993485"
}

3.1 Climate Departure

Climate departure measures how far recent climate has shifted from a historical baseline — in this case, how much warmer, drier, or snowpack-altered the FWCP Peace Region has become relative to the pre-warming period (1951–1980). Where traditional fish-passage assessments focus on the physical structures in and around streams, climate departure adds the atmospheric and hydrologic context those structures sit inside: warming air temperatures that drive warmer water, shifting snowpack that reshapes the freshet, and atmospheric drying that reduces late-summer flows. Understanding these departures at the watershed scale lets us ask whether the habitat above a barrier is gaining or losing value as climate changes — and weight barrier prioritisation accordingly.

We examined 15 climate variables spanning temperature (annual mean, daytime maximum, overnight minimum), moisture (precipitation, vapour pressure deficit, soil moisture, relative humidity), and snowpack (snow water equivalent, snowfall, snowmelt, snow cover, snowfall fraction, peak snow water equivalent, snowmelt timing, and peak melt rate). Each variable was assessed at annual and seasonal scales, across the full region and within each of five ecoregions.

Climate departures were computed with the cd R package, which reads ERA5-Land hourly reanalysis (1950–present, ~9 km native grid) aggregated to monthly, seasonal, and annual periods on a single grid covering British Columbia, served as Cloud-Optimised GeoTIFFs from a public S3 catalog. For each variable the package crops the published rasters to the area of interest, takes a yearly spatial mean, and computes anomalies against the 1951–1980 pre-warming reference period — the same base period Hansen et al. (2012) used for global temperature emergence. Long-term trends are tested with Mann-Kendall significance and quantified with Theil-Sen slopes; the recent-decade (2015–2025) versus pre-warming window comparison uses a Welch two-sample t-test on the annual values. The same pipeline runs at any polygon scale — region, ecoregion, or watershed group. The regional and ecoregion-level analyses are summarised in this section; the watershed-group breakdown feeds into the per-watershed barrier prioritisation that follows. Appendix - Climate Departure carries the full set of plots and tables.

3.2 Planning — Habitat, Connectivity and Floodplain Modelling

3.2.1 Habitat Modelling

Habitat modelling used to help guide planning for field assessments is generated by bcfishpass (Norris [2020] 2024) which has been designed to prioritize potential fish passage barriers for assessment or remediation by generating a simple model of aquatic habitat connectivity. We utilize the bcfishpass access model, linear spawning/rearing habitat model and lateral habitat connectivity for planning purposes. These models provide a valuable starting point, but their results are not definitive and should always be considered with professional judgment. Detailed information regarding model methodology, select parameters and known model limitations are detailed in Norris ([2020] 2024) with key documentation linked below:

3.2.1.1 Contributions to Provincial Connectivity Models

bcfishpass operates on a province-wide modelled-crossing inventory — stream-line / road-network intersections that may or may not correspond to a real structure on the ground. To reduce field follow-up at sites that are non-issues, we contribute desktop and field corrections to two open tables in the canonical bcfishpass repository. The same tables also feed the fresh and link framework — one source of truth across provincial and project-specific connectivity models.

  • user_modelled_crossing_fixes.csv — most commonly used to flag modelled crossings that are not field issues. Using Google satellite, Bing aerial, and Esri satellite imagery we identify records where no structure exists (the road or crossing is absent) or where the structure is an open-bottom crossing — bridge, arch — that does not warrant a fish-passage assessment. These corrections remove false-positive sites from field-followup lists before assessors are deployed.
  • pscis_modelledcrossings_streams_xref.csv — ties field-assessed PSCIS crossings to the correct modelled-crossing record when the spatial alignment is off. The modelled inventory catches most assessed crossings directly; this xref captures the remainder.

Each entry is signed by the reviewer and dated; corrections flow back into the next bcfishpass build and into the fresh and link workflows. Because the inventory is provincial, the work is available for any subsequent analysis across BC. Since April 1, 2025, the project has contributed 282 records to user_modelled_crossing_fixes and 11 to pscis_modelledcrossings_streams_xref across the FWCP Peace Region — concentrated in the Nation, Peace, Parsnip Arm, and Parsnip watershed groups.

Table 3.1 documents the custom species-specific thresholds for stream gradient and channel width applied to the linear spawning and rearing habitat model for this year’s project planning.

# `bcfishpass` and associated tools have been designed to be flexible in analysis, accepting user defined gradient, channel width and stream discharge categories [@moeStreamInventorySample].  Although currently in draft form, and subject to development revisions, gradient and channel width thresholds for habitat with the highest intrinsic value for a number of fish species in the Parsnip River watershed group have been specified and applied to model habitat upstream of stream crossing locations with the highest potential intrinsic value (Table \@ref(tab:tab-fish-spawning-rearing)). Definitions of modelling outputs for bull trout are presented in Table \@ref(tab:tab-bcfp-def).  Modelling of habitat for Arctic grayling in the Peace region are planned for 2024-2025 with the work leveraging multiple other initiatives underway by SERNbc and others throughout British Columbia including work related to Arctic grayling habitat use and preference conducted by the University of Northern British Columbia (UNBC) and others [@hagen_stamford2023ParsnipArctic; @bottoms_etal2023Criticalhabitats].


#`r if(identical(gitbook_on, FALSE)){knitr::asis_output("<br><br><br>")}`

if (params$project_region == "peace") {
  species <- c("BT","GR")
} else if (params$project_region == "skeena") {
  species <- c("CH","CM","CO","PK","SK","ST")
} else if (params$project_region == "fraser") {
  species <- c("CH","CO","SK","BT")
}

text_footnote <- ""
  #"Models for RB, GR and KO are under a process of development and have not yet been released.  All models parameters are preliminary and subject to collaborative development."


bcfishpass_spawn_rear_model |> 
  dplyr::filter(species_code %in% species) |>
  mutate(Species = fishbc::fbc_common_name(species_code),
         spawn_gradient_max = round(spawn_gradient_max * 100 ,1),
         rear_gradient_max = round(rear_gradient_max * 100 ,1)) |>
  select(Species,
         `Spawning Gradient  Max (%)`= spawn_gradient_max,
         `Spawning Width Min (m)` = spawn_channel_width_min,
         `Rearing Width Min (m)` = rear_channel_width_min,
         # `Spawning Width Max (m)` = spawn_channel_width_max,
         # `Spawning MAD Min (m3/s)` = spawn_mad_min,
         # `Spawning MAD Max (m3/s)` = spawn_mad_max,
         `Rearing Gradient Max (%)` = rear_gradient_max) |>
         # `Rearing MAD Min (m3/s)` = rear_mad_min,
         # `Rearing MAD Max (m3/s)` = rear_mad_max,
         # `Rearing Wetland Multiplier` = rear_wetland_multiplier,
         # `Rearing Lake Multiplier` = rear_lake_multiplier) |>
  t() |>
  as_tibble(rownames = "row_names") |>
  janitor::row_to_names(row_number = 1) |>
  rename(Variable = Species) |>
  fpr::fpr_kable(caption_text = 'Stream gradient and channel width thresholds used to model potentially highest value fish habitat.',
                 footnote_text = text_footnote,
                 scroll = F,
                 scroll_box_height = '300px')
Table 3.1: Stream gradient and channel width thresholds used to model potentially highest value fish habitat.
Variable Bull Trout Arctic Grayling
Spawning Gradient Max (%) 5.5 2.5
Spawning Width Min (m) 2 4
Rearing Width Min (m) 1.5 1.5
Rearing Gradient Max (%) 10.5 3.5
*
cat("### Bull Trout and Arctic Grayling Critical Habitat

We collaborated with Eduardo Martins (Associate Professor at the University of Northern British Columbia, UNBC) to incorporate Arctic grayling into our collaborative
GIS project so it could be used to inform field work activities and potential remediation site prioritization. Similarly, 
critical bull trout habitat data was added to the GIS project after being obtained from Luc Turcotte (WLRS - Regional Aquatic Specialist)
and stored securely.  Bull trout data acquisition required prior completion of the Access to Secure Species and Ecosystem 
Data and Information (SEDIS) training conducted through WLRS.")

3.2.2 Bull Trout and Arctic Grayling Critical Habitat

We collaborated with Eduardo Martins (Associate Professor at the University of Northern British Columbia, UNBC) to incorporate Arctic grayling into our collaborative GIS project so it could be used to inform field work activities and potential remediation site prioritization. Similarly, critical bull trout habitat data was added to the GIS project after being obtained from Luc Turcotte (WLRS - Regional Aquatic Specialist) and stored securely. Bull trout data acquisition required prior completion of the Access to Secure Species and Ecosystem Data and Information (SEDIS) training conducted through WLRS.


# bcfishpass_spawn_rear_model_references <- readr::read_csv(file = 'data/width_modelling/model_spawning_rearing_habitat.csv')
bcfishpass_spawn_rear_model_references <- readr::read_csv(file = 'data/inputs_raw/bcfishpass_spawn_rear_model_ref.csv')
  # select(species_code, contains('ref'), -contains(c('multiplier','mad')))

bcfishpass_spawn_rear_model_references |>
  mutate(Species = fishbc::fbc_common_name(species_code)) |>
  select(Species,
         `Spawning Gradient  Max (%)`= spawn_gradient_max,
         `Spawning Width Min (m)` = spawn_channel_width_min,
         # `Spawning Width Max (m)` = spawn_channel_width_max_ref,
         # `Spawning MAD Min (m3/s)` = spawn_mad_min,
         # `Spawning MAD Max (m3/s)` = spawn_mad_max,
         `Rearing Gradient Max (%)` = rear_gradient_max) |>
         # `Rearing Wetland Multiplier` = rear_wetland_multiplier,
         # `Rearing Lake Multiplier` = rear_lake_multiplier) |>
         # `Rearing MAD Min (m3/s)` = rear_mad_min,
         # `Rearing MAD Max (m3/s)` = rear_mad_max) |>
  t() |>
  as_tibble(rownames = "row_names") |>
  janitor::row_to_names(row_number = 1) |>
  rename(Variable = Species) |>
  fpr::fpr_kable(caption_text = 'References considered for stream gradient and channel width thresholds used to model potentially highest value fish habitat. Preliminary and subject to revisions.',
                 # footnote_text = 'The maximum gradient for steelhead rearing has been adjusted to 8.5% based on professional judgment, although references indicate 7.49%',
                 scroll = F)
xref_bcfishpass_names |>
  dplyr::filter(id_side == 1) |>
  arrange(id_join) |>
  select(Attribute = report, Definition = column_comment) |>
  fpr::fpr_kable(caption_text = 'bcfishpass outputs and associated definitions',
                 footnote_text = paste0(model_species_name, " uses a maximum gradient threshold of ", bt_network_gradient, "% to determine whether access is likely possible"),
                 scroll = F)

3.2.3 Floodplain Delineation

To complement the linear barrier inventory, we mapped functional floodplain extent at watershed scale for the Parsnip River Watershed Group. Overlaying floodplain footprint on the crossing inventory lets us ask not just whether fish can pass a structure, but how much off-channel habitat sits within the affected corridor and whether infrastructure has compromised the lateral connectivity that sustains it.

We used the flooded R package (Nagel et al. 2014), which models the area a river actively inundates during regular high-flow events — the functional floodplain. This is distinct from the narrow active channel (the wetted perimeter at low flow) and the broader geologic valley bottom (which includes terraces untouched by water for centuries). The functional floodplain is the scale where off-channel habitat is created and maintained: where side channels form, seasonal flooding sustains wetlands, and riparian forests recruit. Bankfull depth is estimated from the regional regression of Hall et al. (2007), calibrated against field-mapped floodplain sites in Pacific Northwest streams. Inputs were the MRDEM-30 30 m DEM, the bull trout accessible stream network (stream order ≥ 3) from bcfishpass, and BC Freshwater Atlas lakes and wetlands on that network. Full methodology and watershed-scale mapping are in Appendix - Floodplain Delineation.

#to quantify upstream habitat potentially available for salmonids and facilitate stream line symbology based on stream morphology.

# while high gradient sections typically  present  upstream  migration  barriers  and  less  available  habitat.  Additionally, the size of the stream (indicated by channel width) is an important determinant for habitat suitability for different species as well as specific life stages of those species. 

# `bcfishpass` was used to categorize and sum potentially accessible stream segments in the study area watersheds within gradient and width categories for each stream segment. 
# (0 - 3%, 3 - 5%, 5 - 8%, 8 - 15%, 15 - 20%) with these outputs further amalgamated to summarize and symbolize potential upstream habitat in three categories: riffle/cascade (0 - 5%), step-pool (5 - 15%) and step-pool very steep (15-20%) (Table \@ref(tab:tablethreshaverage)).  


#threshold and average gradient table
table_thresh_average <- tibble::tibble(`Gradient` = c('0 - 5%', '5 - 15%', '15 - 20%', '>20%'),
                                       `Channel Type` = c('Riffle and cascade pool', 'Step pool', 'Step pool - very steep', 'Non fish habitat'))

table_thresh_average |> 
    fpr::fpr_kable(caption_text = 'Stream gradient categories (threshold and average) and associated channel type.', scroll = F)

3.3 Statistical Support for Habitat Modelling

This project — together with prior SERNbc fish-passage work across the Peace, Skeena, and Fraser regions — has provided the field data, multi-year partnerships, and statistical-modelling support relationships that drive ongoing refinement of bcfishpass habitat parameters and the Bayesian Spatial Stream Network analyses described below. The work underpins our intrinsic-habitat-potential and connectivity-prioritization outputs. It extends — rather than supersedes — the canonical BC freshwater modelling stack (fwapg for the Freshwater Atlas in PostgreSQL, bcfishpass for habitat and barrier modelling, and bcfishobs for fish-observation records). Our role is two-sided: contributor — providing the funding context, field data, and project-specific motivation that shapes which questions get asked — and downstream user — taking the model outputs into project-specific parameterization of habitat thresholds, integration of water-temperature and water-quality covariates, and calibration against observed fish-presence evidence.


3.3.1 Channel Width

Channel width is a primary determinant of habitat suitability in bcfishpass. In early 2021, Bayesian statistical methods were developed to predict channel width across BC Freshwater Atlas stream segments where field measurements were unavailable. The original model related channel width to upstream watershed area and watershed-area-weighted mean annual precipitation (Thorley and Irvine 2021). In December 2021 the methodology was updated using the power-law form derived by Finnegan et al. (2005), relating stream discharge to watershed area and precipitation; the updated model (Thorley et al. 2021) is the channel-width estimator used in bcfishpass at the time of reporting. Detailed documentation of the data-collection and statistical-analysis methodology is given in Irvine ([2021] 2022) and Thorley et al. (2021).


3.3.2 Stream Temperature and Growing-Season Degree Days

Water temperature drives productivity for cold-water salmonids — too cold and growth stalls; too warm and thermal stress reduces survival. We work with Poisson Consulting on Bayesian Spatial Stream Network (SSN) models that predict stream temperature at fine spatial resolution across the FWA network.

The 2024 Nechako modelling effort (Hill et al. 2024) mapped stream discharge and temperature causal-effects pathways across the Nechako Watershed with the intent of focusing aquatic restoration actions in areas of highest potential for positive impacts on fisheries values — including elimination of stream reaches from intrinsic-habitat models where water temperatures are likely too cold to support fish production. The project began with a custom mechanistic model of discharge and temperature interactions (visually represented here), but the model struggled to converge. The project then pivoted to the air2stream framework (Toffolon and Piccolroaz 2015), a hybrid formulation that bridges fully mechanistic models (data-intensive, hard to parameterize) and purely statistical approaches (no physical justification, extrapolate poorly). After several adaptations, expected stream temperatures were best modelled using the four-parameter version of air2stream with site-level random effects on each of the four parameters. Inputs spanned years 2019–2021 and combined Nechako water-temperature observations, ERA5-Land hourly air temperature (Muñoz Sabater 2019), and PCIC-gridded discharge from the ACCESS1-0 RCP8.5 scenario.

The 2025 Skeena modelling effort (Hill et al. 2025) extended this approach to a larger spatial network and added Growing-Season Degree Days (GSDD) — accumulated thermal units during the season when stream temperature remains at or above 5 °C — as the productivity-relevant metric for age-0 salmonid growth. The Skeena work also moved to water-temp-bc as the canonical water-temperature data source (described below), replacing per-project Zenodo and ECCC downloads.

Stream-temperature and discharge observations are now organized centrally in water-temp-bc — a monthly-automated ingestion pipeline that publishes Environment Canada hydrometric and water-quality records as a partitioned-parquet layer on Amazon S3. Stations metadata, observations by parameter (water temperature, discharge, water level), and per-snapshot dedupe (canonical value retained at the latest harvested_at timestamp) are queryable via the package’s query_canonical() helper without database setup. This replaces the per-project Zenodo and ECCC downloads used in earlier modelling work — one accessible source for any subsequent SSN or temperature-suitability analysis in BC.


3.3.3 Habitat-Modelling Framework — Trajectory

We are building a parameterizable habitat-suitability and connectivity framework using fresh and link — open-source R packages that operationalize FWA network operations for project-specific habitat queries. The framework is currently wired up to the same input classes that bcfishpass uses today: channel width, gradient thresholds, and provincial / federal obstacle and barrier inventories. An initial Arctic grayling intrinsic-habitat model for the FWCP Peace region — based on stream size and gradient only — has been produced on that basis and is in development at the time of this report. Because the framework is designed to be agnostic of input variables, additional covariates can be wired in as data, methods, and validation mature: statistical stream-temperature and GSDD predictions from the Poisson Consulting work described above, water-temperature and water-quality observations from water-temp-bc, jurisdictional overlays, and calibration of model predictions against fish-presence observations from bcfishobs together with research activities (some commissioned for FWCP Peace) that identify areas of known high-value spawning and rearing habitat. Water-temperature integration and the calibration loop are further down the pipeline; the framework is built to accept them when ready. Outputs will be published in subsequent versions of this report and as standalone GIS layers shared via the project’s collaborative GIS environment. This work complements and extends — rather than supersedes — the canonical bcfishpass outputs from Hillcrest Geographics. The latest results are served at the report URL referenced in the executive summary; each report version is tagged so reviewers can navigate between the submitted snapshot and current state.


3.4 Fish Passage Assessments

3.4.1 Natural Barriers to Fish Passage

Our assessments may include natural features such as waterfalls that could limit fish passage. This informs whether upstream culvert upgrades would restore access for anadromous species (e.g., salmon) or primarily benefit resident fish already upstream. We document these features by measuring height, gradient, and pool depth, recording field observations, capturing site photographs, and reviewing background sources for context.

3.4.2 Road Stream Crossings

In the field, crossings prioritized for follow-up were first assessed for fish passage following the procedures outlined in “Field Assessment for Determining Fish Passage Status of Closed Bottomed Structures” (MoE 2011). The reader is referred to (MoE 2011) for detailed methodology. Crossings surveyed included closed bottom structures (CBS), open bottom structures (OBS) and crossings considered “other” (i.e. fords). Photos were taken at surveyed crossings and when possible included images of the road, crossing inlet, crossing outlet, crossing barrel, channel downstream and channel upstream of the crossing and any other relevant features. The following information was recorded for all surveyed crossings: date of inspection, crossing reference, crew member initials, Universal Transverse Mercator (UTM) coordinates, stream name, road name and kilometer, road tenure information, crossing type, crossing subtype, culvert diameter or span for OBS, culvert length or width for OBS. A more detailed “full assessment” was completed for all closed bottom structures and included the following parameters: presence/absence of continuous culvert embedment (yes/no), average depth of embedment, whether or not the culvert bed resembled the native stream bed, presence of and percentage backwatering, road fill depth, outlet drop, outlet pool depth, inlet drop, culvert slope, average downstream channel width, stream slope, presence/absence of beaver activity, presence/absence of fish at time of survey, type of valley fill, and a habitat value rating. Habitat value ratings were based on channel morphology, flow characteristics (perennial, intermittent, ephemeral), fish migration patterns, the presence/absence of deep pools, un-embedded boulders, substrate, woody debris, undercut banks, aquatic vegetation and overhanging riparian vegetation (Table 3.2).


fpr_table_habvalue |>
  knitr::kable(caption = 'Habitat value criteria (Fish Passage Technical Working Group, 2011).', booktabs = T, label = NA) |>
    kableExtra::column_spec(column = 1, width_min = '1.5in') |>
    kableExtra::kable_styling(c("condensed"), full_width = T, font_size = font_set)
Table 3.2: Habitat value criteria (Fish Passage Technical Working Group, 2011).
Habitat Value Fish Habitat Criteria
High The presence of high value spawning or rearing habitat (e.g., locations with abundance of suitably sized gravels, deep pools, undercut banks, or stable debris) which are critical to the fish population.
Medium Important migration corridor. Presence of suitable spawning habitat. Habitat with moderate rearing potential for the fish species present.
Low No suitable spawning habitat, and habitat with low rearing potential (e.g., locations without deep pools, undercut banks, or stable debris, and with little or no suitably sized spawning gravels for the fish species present).


Fish passage potential was determined for each stream crossing identified as a closed bottom structure as per MoE (2011). The combined scores from five criteria: depth and degree to which the structure is embedded, outlet drop, stream width ratio, culvert slope, and culvert length were used to screen whether each culvert was a likely barrier to some fish species and life stages (Table 3.3, Table 3.4). These criteria were developed based on data obtained from various studies and reflect an estimation for the passage of a juvenile salmon or small resident rainbow trout (Clarkin et al. 2005; Bell 1991; Thompson 2013). For crossings determined to be potential barriers or barriers based on the data, a culvert fix and recommended diameter/span was proposed.


tab <- as_tibble(t(fpr_table_barrier_scoring)) |>
  mutate(V4 = names(fpr_table_barrier_scoring)) |>
  select(V4, everything()) |>
  janitor::row_to_names(1) |>  ##turn the table sideways
  mutate(Risk = case_when(Risk == 'Value' ~ '  Value',
                          T ~ Risk))

tab |>
  fpr::fpr_kable(caption_text = 'Fish Barrier Risk Assessment (MoE 2011).', scroll = F)
Table 3.3: Fish Barrier Risk Assessment (MoE 2011).
Risk LOW MOD HIGH
Embedded >30cm or >20% of diameter and continuous <30cm or 20% of diameter but continuous No embedment or discontinuous
Value 0 5 10
Outlet Drop (cm) <15 15-30 >30
Value 0 5 10
SWR <1.0 1.0-1.3 >1.3
Value 0 3 6
Slope (%) <1 1-3 >3
Value 0 5 10
Length (m) <15 15-30 >30
Value 0 3 6


fpr_table_barrier_result |>
  fpr::fpr_kable(caption_text = 'Fish Barrier Scoring Results (MoE 2011).', scroll = F)
Table 3.4: Fish Barrier Scoring Results (MoE 2011).
Cumlative Score Result
0-14 passable
15-19 potential barrier
>20 barrier


The habitat gain index is the quantity of modelled habitat upstream of the subject crossing and represents an estimate of habitat gained with remediation of fish passage at the crossing. For this project, a gradient threshold between accessible and non-accessible habitat was set at 25% (for a minimimum length of 100m) intended to represent the maximum gradient of which the strongest swimmers of anadromous species (bull trout) are likely to be able to migrate upstream.


For reporting of Phase 1 - fish passage assessments within the body of this report (Table 3.3), a “total” value of habitat <20% output from bcfishpass was used to estimate the amount of habitat upstream of each crossing less than 25% gradient before a falls of height >5m - as recorded in MoE (2024b) or documented in other bcfishpass online documentation. For Phase 2 - habitat confirmation sites, conservative estimates of the linear quantity of habitat to be potentially gained by fish passage restoration, bull trout rearing maximum gradient threshold (10.5%) was used. To generate estimates for area of habitat upstream (m2), the estimated linear length was multiplied by half the downstream channel width measured (overall triangular channel shape) as part of the fish passage assessment protocol. Although these estimates are not generally conservative, have low accuracy and do not account for upstream stream crossing structures they allow a rough idea of the best candidates for follow up.


Potential options to remediate fish passage were selected from MoE (2011) and included:

  • Removal (RM) - Complete removal of the structure and deactivation of the road.
  • Open Bottom Structure (OBS) - Replacement of the culvert with a bridge or other open bottom structure. Based on consultation with FLNR road crossing engineering experts, for this project we considered bridges as the only viable option for OBS type .
  • Streambed Simulation (SS) - Replacement of the structure with a streambed simulation design culvert. Often achieved by embedding the culvert by 40% or more. Based on consultation with FLNR engineering experts, we considered crossings on streams with a channel width of <2m and a stream gradient of <8% as candidates for replacement with streambed simulations.
  • Additional Substrate Material (EM) - Add additional substrate to the culvert and/or downstream weir to embed culvert and reduce overall velocity/turbulence. This option was considered only when outlet drop = 0, culvert slope <1.0% and stream width ratio < 1.0.
  • Backwater (BW) - Backwatering of the structure to reduce velocity and turbulence. This option was considered only when outlet drop < 0.3m, culvert slope <2.0%, stream width ratio < 1.2 and stream profiling indicates it would be effective..

3.4.3 Cost Estimates

Cost estimates for structure replacement with bridges and embedded culverts were generated based on the channel width, slope of the culvert, depth of fill, road class and road surface type. Road details were sourced from FLNRORD (2020b) and FLNRORD (2020a) through bcfishpass. Interviews with Phil MacDonald, Engineering Specialist FLNR - Kootenay, Steve Page, Area Engineer - FLNR - Northern Engineering Group and Matt Hawkins - MoTi - Design Supervisor for Highway Design and Survey - Nelson were utilized to help refine estimates which have since been adjusted for inflation in 2020 and based on past experience.


Base costs for installation of bridges on forest service roads and permit roads with surfaces specified in provincial GIS road layers as rough and loose was estimated at $30000/linear m and assumed that the road could be closed during construction and a minimum bridge span of 15m. For streams with channel widths <2m, embedded culverts were reported as an effective solution with total installation costs estimated at $100k/crossing (pers. comm. Phil MacDonald, Steve Page then adjusted for inflation in 2020). For larger streams (>6m), estimated span width increased proportionally to the size of the stream. For crossings with large amounts of fill (>3m), the replacement bridge span was increased by an additional 3m for each 1m of fill >3m to account for cutslopes to the stream at a 1.5:1 ratio. To account for road type, a multiplier table was generated to estimate incremental cost increases with costs estimated for structure replacement on paved surfaces, railways and arterial/highways costing up to 15 times more than forest service roads due to expenses associate with design/engineering requirements, traffic control and paving. The cost multiplier table (Table 3.5) should be considered very approximate with refinement recommended for future projects.


sfpr_xref_road_cost() |>
  mutate(cost_m_1000s_bridge = formatC(cost_m_1000s_bridge * 15000, format="d", big.mark=",")) |>
  mutate(cost_embed_cv = formatC(cost_embed_cv * 1000, format="d", big.mark=",")) |>
  rename(
    Class = my_road_class,
    Surface = my_road_surface,
    `Class Multiplier` = road_class_mult,
    `Surface Multiplier` = road_surface_mult,
    `Bridge $/15m` = cost_m_1000s_bridge,
    `Streambed Simulation $` = cost_embed_cv
  ) |>
  dplyr::filter(!is.na(Class)) |>
  mutate(Class =case_when(
    Class == 'fsr' ~ str_to_upper(Class),
    TRUE ~ stringr::str_to_title(Class)),
    Surface = stringr::str_to_title(Surface)
  ) |> 
  # dplyr::filter(Class != 'FSR' & Surface != 'Paved') |>
  fpr::fpr_kable(caption_text = 'Cost multiplier table based on road class and surface type.', scroll = F)
Table 3.5: Cost multiplier table based on road class and surface type.
Class Surface Class Multiplier Surface Multiplier Bridge $/15m Streambed Simulation $
FSR Rough 1 1 450,000 100,000
FSR Loose 1 1 450,000 100,000
Resource Loose 1 1 450,000 100,000
Collector Loose 1 1 450,000 100,000
Recreation Loose 1 1 450,000 100,000
Resource Rough 1 1 450,000 100,000
Permit Unknown 1 1 450,000 100,000
Permit Loose 1 1 450,000 100,000
Permit Rough 1 1 450,000 100,000
Unclassified Loose 1 1 450,000 100,000
Unclassified Rough 1 1 450,000 100,000
Unclassified Paved 1 2 750,000 150,000
Unclassified Unknown 1 2 750,000 150,000
Local Loose 4 1 1,500,000 200,000
Local Paved 4 2 3,000,000 400,000
Collector Paved 4 2 3,000,000 400,000
Arterial Paved 15 2 11,250,000 1,500,000
Highway Paved 15 2 11,250,000 1,500,000
Rail Rail 15 2 11,250,000 1,500,000

3.4.4 Climate Change Risk Assessment

In collaboration with the Ministry of Transportation and Infrastructure (MoTi), a new climate change replacement program aims to prioritize vulnerable culverts for replacement (pers. comm Sean Wong, 2022) based on data collected and ranked related to three categories - culvert condition, vulnerability and priority. Within the “condition” risk category - data was collected and crossings were ranked based on erosion, embankment and blockage issues. The “climate” risk category included ranked assessments of the likelihood of both a flood event affecting the culvert as well as the consequence of a flood event affecting the culvert. Within the “priority” category the following factors were ranked - traffic volume, community access, cost, constructability, fish bearing status and environmental impacts (Table 3.6). This project is still in its early stages with methodology changes going forward.


# This line can be removed once Table.R is run. Just a work around for now. 
xref_moti_climate_names <- sfpr_xref_moti_climate_names()

xref_moti_climate_names  %>%
  slice(7:nrow(.)) |>
  select(spdsht, report) |>
  rename(Parameter = spdsht, Description = report) |>
  fpr::fpr_kable(caption_text = 'Climate change data collected at MoTi culvert sites', scroll = gitbook_on)
Table 3.6: Climate change data collected at MoTi culvert sites
Parameter Description
erosion_issues Erosion (scale 1 low - 5 high)
embankment_fill_issues Embankment fill issues 1 (low) 2 (medium) 3 (high)
blockage_issues Blockage Issues 1 (0-30%) 2 (>30-75%) 3 (>75%)
condition_rank Condition Rank = embankment + blockage + erosion
condition_notes Describe details and rational for condition rankings
likelihood_flood_event_affecting_culvert Likelihood Flood Event Affecting Culvert (scale 1 low - 5 high)
consequence_flood_event_affecting_culvert Consequence Flood Event Affecting Culvert (scale 1 low - 5 high)
climate_change_flood_risk Climate Change Flood Risk (likelihood x consequence) 1-6 (low) 6-12 (medium) 10-25 (high)
vulnerability_rank Vulnerability Rank = Condition Rank + Climate Rank
climate_notes Describe details and rational for climate risk rankings
traffic_volume Traffic Volume 1 (low) 5 (medium) 10 (high)
community_access Community Access - Scale - 1 (high - multiple road access) 5 (medium - some road access) 10 (low - one road access)
cost Cost (scale: 1 high - 10 low)
constructability Constructibility (scale: 1 difficult -10 easy)
fish_bearing Fish Bearing 10 (Yes) 0 (No) - see maps for fish points
environmental_impacts Environmental Impacts (scale: 1 high -10 low)
priority_rank Priority Rank = traffic volume + community access + cost + constructability + fish bearing + environmental impacts
overall_rank Overall Rank = Vulnerability Rank + Priority Rank
priority_notes Describe details and rational for priority rankings

3.5 Habitat Confirmation Assessments

Following fish passage assessments, habitat confirmations were completed in accordance with procedures outlined in the document “A Checklist for Fish Habitat Confirmation Prior to the Rehabilitation of a Stream Crossing” (Fish Passage Technical Working Group 2011). The main objective of the field surveys was to document upstream habitat quantity and quality and to determine if any other obstructions exist above or below the crossing. Habitat value was assessed based on channel morphology, flow characteristics (perennial, intermittent, ephemeral), the presence/absence of deep pools, un-embedded boulders, substrate, woody debris, undercut banks, aquatic vegetation and overhanging riparian vegetation. Criteria used to rank habitat value was based on guidelines in Fish Passage Technical Working Group (2011) (Table 3.2).


During habitat confirmations, to standardize data collected and facilitate submission of the data to provincial databases, information was collected on digital field forms adapted from provincial “Site Cards”. Habitat characteristics recorded included channel widths, wetted widths, residual pool depths, gradients, bankfull depths, stage, temperature, conductivity, pH, cover by type, substrate and channel morphology (among others). When possible, the crew surveyed downstream of the crossing to a minimum distance 300m and upstream to a minimum distance of 500 - 600m. Any potential obstacles to fish passage were inventoried with photos, physical descriptions and locations recorded on site cards. Surveyed routes were recorded with time-signatures on handheld GPS units.

3.5.1 Fish Sampling

3.5.1.1 Electrofishing

Fish sampling was conducted on a subset of sites when biological data was considered to add significant value to the physical habitat assessment information. Electrofishing was utilized for fish sampling according to stream inventory standards and procedures found in the Reconnaissance (1:20 000) Fish and Fish Habitat Inventory Manual (Resource Inventory Standards Committee 2001). A Haltech 2000 backpack electrofisher was used within discrete site units both upstream and downstream of the subject crossing with electrofisher settings and seconds, water quality parameters (i.e. conductivity, temperature and ph), start and end locations, length of site and wetted widths (average of a minimum of three) recorded.

3.5.1.2 Fish Handling and Processing

Captured fish were held in buckets with sufficient water to minimize stress until processing, and multiple buckets were used when catch numbers were high. For each fish captured, fork length, weight and species was recorded with results documented in the fish data submission spreadsheet.

3.5.1.3 Pit Tagging

Fish with a fork length greater than 60 mm and belonging to species approved under the scientific fish collection permit PG25-983916 were tagged with Passive Integrated Transponders (PIT tags) using the Abdominal Cavity method outlined by Biomark. To anesthetize fish prior to pit tagging, we used a solution of approximately 0.1 mL of clove oil per 1 L of water (1:10,000). This concentration was selected for its efficiency in providing effective sedation with minimal residual effects, making it ideal for studies in which fish are released back into their natural habitats (Fernandes et al. 2017). The clove oil solution was prepared in advance by dissolving pure clove oil in ethyl alcohol in a 1:9 ratio (clove oil: ethyl alcohol) to enhance solubility, then mixed into the water bucket (Fernandes et al. 2017). Fish were immersed in this solution until they reached an appropriate level of anesthesia for handling and then were tagged. To maintain needle sharpness and minimize injury risk, needles were replaced approximately every 10 fish. Each tagged fish was scanned with the PIT reader, and both the PIT tag ID and row ID were recorded. Once tagged, fish were placed into a bucket of fresh water and allowed to recover before being released back into the stream. Fish information and habitat data will be submitted to the province under scientific fish collection permit PG25-983916.

3.5.2 Environmental DNA (eDNA) Sampling

3.5.2.1 Sample Collection and Filtration

Samples were collected using two approaches informed by Hobbs et al. (2025): in-stream filtration with a Haltech EMOS sampler and grab-and-go bottle collection. For both methods, all water collected at a site (typically 1–3L) was filtered onto a single filter, yielding one replicate per site. Mixed cellulose ester (MCE) filters with 1µm pore size were used most commonly, with 0.45µm and 1.5µm filters of other materials used occasionally. Samples were typically collected upstream and downstream of each road–stream crossing, though in some cases only downstream samples were obtained.

For in-stream filtration, Haltech reusable aluminum housings were pre-loaded with filters. In high-turbidity conditions, a Haltech pre-filter with a 100µm nitex screen was installed upstream to remove coarse material. For grab-and-go sampling, stream water was collected in sanitized 1L HDPE Nalgene bottles and filtered at the end of each day.

After filtration, filters were removed from housings in a clean environment, placed in coin envelopes with silica desiccant inside labelled ziplock bags, and frozen until shipment. Aluminum housings and Nalgene bottles were sanitized with bleach solution between uses.

3.5.2.2 Quality Assurance

Approximately 10% of samples were collected for quality assurance. Field blanks using distilled water were collected daily. Office blanks were processed at field accommodations by filtering clean water when processing grab-and-go samples. Positive controls were obtained at select sites where electrofishing confirmed species presence prior to eDNA sampling.

3.5.2.3 Laboratory Analysis

Samples were shipped frozen to UNBC for extraction and analysis. DNA was extracted and analyzed using quantitative polymerase chain reaction (qPCR) with species-specific assays following protocols developed by Murray and Booth (2023). Assays targeted mitochondrial genes (COI, CytB) using fluorescent dyes (FAM, VIC, HEX), allowing multiple species to be tested per sample through multiplexing. Target species included Chinook, Coho, Sockeye, Rainbow Trout, Bull Trout, Arctic Grayling, and Kokanee, with additional assays for Coastal Cutthroat and White Sturgeon at select sites.

Due to close evolutionary relationships and hybridization, some species pairs cannot be distinguished using mtDNA-based assays. The Bull Trout assay also detects Dolly Varden, requiring geographic context to interpret results in areas where ranges overlap. Similarly, Rainbow Trout and Coastal Cutthroat assays may cross-react where these species co-occur or hybridize.

To optimize laboratory efficiency, we collaborated with UNBC to develop a sample run plan that grouped samples by compatible dye types, minimizing the number of qPCR runs required. An assay mapping table cross-referencing species codes to assay identifiers and dye types was developed, along with processing scripts to generate sample groupings and a run order configuration specifying species order within each group.

3.5.2.4 eDNA Extraction

eDNA was extracted in the dedicated eDNA lab at UNBC and analysed with the protocols developed by Murray and Booth (2023).

3.5.3 Open Source Reporting Framework

This report is produced using open-source tools (R, bookdown) with full version control via git, enabling iterative updates. All code, data, and revision history are publicly accessible in the project repository, with ongoing tasks tracked via GitHub issues and version history maintained in the project changelog.

3.5.4 Aerial Imagery

Scripted processing and serving of UAV imagery collected during the project is available at https://github.com/NewGraphEnvironment/stac_uav_bc/ (Irvine [2025] 2025). OpenDroneMap was utilized to produce orthomosaics, digital surface models (DSMs), and digital terrain models (DTMs) (OpenDroneMap Authors [2014] 2025). To support efficient web-based access - imagery products were converted to cloud-optimized GeoTIFFs (COGs) using rio-cogeo, then collated accordiong to the SpatioTemporal Asset Catalog (STAC) specification with pystac and uploaded to S3 storage Amazon Web Services (2025). A titiler tile server was set up to facilitate interactive viewing of the orthoimagery and an Application Program Interface (API) leveraging stac-fastapi-pgstac is served at https://images.a11s.one to enable linking of collection images through QGIS as well as remote spatial and temporal querying using open source software such as rstac (Development Seed [2019] 2025; stac-utils 2025; Simoes et al. 2021).

3.6 Engineering Design

Engineering designs were signed and sealed by professional engineers. When possible - completed designs are loaded to the PSCIS data portal.

3.7 Remediations

Structure replacement was conducted by project specific contractors. If not already completed, as-built drawings will be loaded to the PSCIS data portal.

3.8 Monitoring

Monitoring of fish passage restoration sites — both proposed and completed - is essential to ensure restoration investments lead to meaningful ecological outcomes. Monitoring enables evaluation of whether remediation actions improve connectivity for fish and provides critical feedback to refine future prioritization and restoration strategies.


Baseline data collection, including fish sampling and aerial surveys via drone, are core components of this monitoring. While detailed methods for these activities are included in the previous habitat confirmation section, they are also fundamental to effectiveness monitoring, as they provide context to not only facilitate prioritization and communications but also for detecting change following restoration.

3.9 Collaborative GIS Environment

A collaborative GIS environment (sern_peace_fwcp_2023) was established using QGIS and Mergin Maps to enable project team members to view, edit, and analyze shared spatial data on desktop computers and on mobile devices in the field. The environment integrates background layers from the BC Data Catalogue and other sources with project-specific field data, providing a central platform for planning, standardized data collection, and progress tracking. A summary of layers loaded to the project is provided in Appendix - Collaborative GIS Layers.

To support consistent and targeted assessment, a custom field form was developed for routine effectiveness monitoring based loosely on Forest Investment Account (2003) but tailored specifically for fish passage projects. Table 3.7) outlines the monitoring metrics used.


readr::read_csv('data/inputs_raw/form_monitoring_desc.csv') |> 
 mutate(Parameter = stringr::str_to_title(Parameter)) |> 
  mutate(Parameter = case_when( Parameter == "Uav_flight" ~ "UAV Flight",
                                T ~ Parameter)) |> 
  fpr::fpr_kable(scroll = F,
                 caption_text = 'Description of monitoring metrics used for effectiveness monitoring.')
Table 3.7: Description of monitoring metrics used for effectiveness monitoring.
Parameter Description
Dewatering Have the remediation works led to dewatering of the channel due to substrate aggradation or other factors?
Velocity Are flow velocities similar to those within the natural channel? Are they expected to exceed swim speeds of particular fish species/life stages of interest?
Constriction Have the remediation works led to constriction of the channel. Compare channel width underneath structure and within construction footprint to average channel widths upstream and downstream?
Substrate Is the substrate within/under and adjacent to the remediated structure generally equivalent to that found upstream and downstream where natural channel conditions exist?
Riparian What is the condition of the riparian area within the construction footprint?
UAV Flight Was a flight conducted with unmmanned aerial vehicle to document conditions at time of monitoring?
Flow_depth What are the flow depths at the time of assessment within project footprint. Are depths expected to be sufficient to facilitat upstream passage for specific species/life stages of interest?
Stability Does the structure appear to be stable or is there evidence of erosion/shifting?
Revegetation How were riparian areas rehabillitated and are they improving fish habitat value?
Cover Is cover available for fish within the construction footprint in the form of overhanging vegetation, large/small woody debris, boulders, undercut banks, etc?
Maintenance If required, provide maintenance recommendations.
Recommendations General recommendations for follow up. Could include revegetation, addition of substrate, fish sampling, etc.