NPFMC SAFE catalog audit

Show R code
source("npfmcSAFE.R")
library(dplyr)
library(gt)
library(scales)

1 Purpose

This document builds a combined catalog from:

  • the NPFMC SAFE reports page
  • the NOAA Fisheries North Pacific groundfish historical archive page (1998–2012)
  • the NOAA Fisheries North Pacific groundfish assessment index
  • the linked NOAA annual groundfish pages

It is designed to audit naming consistency, link structure, and year anomalies, with special attention to the unusual 2025 groundfish page.

1.1 Notes

  • The 2025 NPFMC groundfish page explicitly says the GOA and BSAI groundfish SAFE reports were not compiled that year and that catch reports were prepared instead.
  • The same page also includes 2026 GOA Pacific cod material inside the 2025 directory structure, which is why the anomaly checks treat visible link text as authoritative in that case.
  • NOAA’s historical archive page (1998–2012) is treated as the second entry point, while the groundfish index links yearly pages for 2013–2024; REFM year pages are crawled directly for 2006–2012 and the REFM historic archive extends coverage farther back.
  • NOAA resource/data wrappers are dereferenced so the catalog keeps the underlying downloadable assessment files when those links are exposed on the wrapper page.

1.2 Build catalog

Show R code
catalog_path <- file.path("outputs", "safe_catalog.csv")

if (file.exists(catalog_path)) {
  safe_catalog <- readr::read_csv(catalog_path, show_col_types = FALSE)
} else {
  safe_catalog <- build_safe_catalog(crawl_noaa = TRUE, quietly = TRUE)
  write_safe_outputs(safe_catalog, out_dir = "outputs")
}

safe_summaries <- summarise_safe_catalog(safe_catalog)

2 Headline counts

These summary counts show the current size of the catalog, how many links were flagged as unusual, and how much temporal and stock coverage the combined crawl currently reaches.

Show R code
headline <- tibble::tibble(
  metric = c(
    "Total unique linked documents",
    "Anomalous links flagged",
    "Distinct stocks inferred",
    "Distinct effective years inferred"
  ),
  value = c(
    nrow(safe_catalog),
    sum(safe_catalog$is_anomalous, na.rm = TRUE),
    dplyr::n_distinct(stats::na.omit(safe_catalog$stock)),
    dplyr::n_distinct(stats::na.omit(safe_catalog$true_year))
  )
)

headline |>
  gt() |>
  fmt_number(columns = value, decimals = 0)
metric value
Total unique linked documents 1,326
Anomalous links flagged 3
Distinct stocks inferred 41
Distinct effective years inferred 32

3 Documents by year

This plot gives the fastest read on whether the crawl is reaching the expected historical range and whether any NOAA entry-point changes created visible gaps in year coverage.

Show R code
plot_safe_docs_by_year(safe_catalog)

4 Stock coverage

These views group stocks by FMP first, then by the most relevant sub-area within that FMP. GOA entries are separated into GOA versus Both where needed, while BSAI entries are separated into EBS, AI, or Both.

Show R code
plot_stock_coverage(safe_catalog, n = Inf, fmp_filter = "BSAI")

Show R code
plot_stock_coverage(safe_catalog, n = Inf, fmp_filter = "GOA")

6 Anomalies

The anomaly table focuses on links where the visible year, directory year, or reused filename pattern does not line up cleanly with the inferred effective year.

Show R code
safe_summaries$anomalies |>
  select(source, section, label, filename, source_year_dir, true_year, anomaly_flags, url) |>
  gt() |>
  fmt_missing(everything(), missing_text = "") |>
  tab_header(title = "Flagged anomalies")
Flagged anomalies
source section label filename source_year_dir true_year anomaly_flags url
NPFMC 2025 Groundfish SAFEs 2026 GOA Pacific cod GOApcod.pdf 2025 2026 dir_year_differs_from_true_year; goapcod_filename_reused https://files.npfmc.org/SAFE/2025/GOApcod.pdf
NPFMC 2025 Groundfish SAFEs 2026 GOA Pacific cod ESP GOApcodESP.pdf 2025 2026 dir_year_differs_from_true_year https://files.npfmc.org/SAFE/2025/GOApcodESP.pdf
NPFMC 2025 Groundfish SAFEs 2026 GOA Pacific cod ESP Report Card GOApcodESP_Report_Card.pdf 2025 2026 dir_year_differs_from_true_year https://files.npfmc.org/SAFE/2025/GOApcodESP_Report_Card.pdf

7 Filename collisions across effective years

Repeated filenames across multiple effective years are worth tracking because they can hide silent document replacement or directory reuse.

For this audit, the effective year is based on the assessment folder or page context, not on any file timestamp. For example, 2003/EBSpollock.pdf is treated as the 2003 assessment because of the folder name, regardless of the file’s later modification date.

The summary table below is meant to be read one filename at a time. Each row says that the same basename appears in multiple assessment years, shows the total number of distinct years, and lists those years explicitly. For example, if AIpcod.pdf has 8 years listed, that means the same filename was reused in eight separate assessment-year contexts.

Show R code
filename_collision_summary <- safe_summaries$filename_collisions |>
  group_by(source, filename, n_true_years) |>
  summarise(
    first_year = min(true_year, na.rm = TRUE),
    last_year = max(true_year, na.rm = TRUE),
    years = paste(sort(unique(true_year)), collapse = ", "),
    .groups = "drop"
  ) |>
  arrange(source, filename)

filename_collision_summary |>
  gt() |>
  cols_label(
    n_true_years = "distinct_years",
    first_year = "first_year",
    last_year = "last_year",
    years = "year_list"
  ) |>
  fmt_missing(everything(), missing_text = "")
source filename distinct_years first_year last_year year_list
NOAA AIpcod.pdf 8 2016 2024 2016, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA AIpollock.pdf 21 2013 2024 2013, 2014, 2015, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BOGpollock.pdf 20 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAI.zip 2 2017 2018 2017, 2018
NOAA BSAIatf.pdf 23 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIatka.pdf 22 2013 2024 2013, 2014, 2015, 2016, 2017, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIflathead.pdf 21 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIforage.pdf 2 2021 2023 2021, 2023
NOAA BSAIgrenadier.pdf 7 2013 2014 2013, 2014
NOAA BSAIintro.pdf 20 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIkamchatka.pdf 16 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAInork.pdf 12 2014 2024 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAInorthern.pdf 8 2013 2013 2013
NOAA BSAIocto.pdf 20 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIoflat.pdf 21 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIorock.pdf 22 2013 2024 2013, 2014, 2015, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIplaice.pdf 21 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIpop.pdf 23 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIrocksole.pdf 19 2014 2024 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIrougheye.pdf 17 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIsablefish.pdf 13 2013 2018 2013, 2014, 2015, 2016, 2017, 2018
NOAA BSAIshark.pdf 18 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIshortraker.pdf 18 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIskate.pdf 19 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIturbot.pdf 19 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA BSAIyfin.pdf 20 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA EBSPollock.pdf 5 2019 2023 2019, 2020, 2021, 2022, 2023
NOAA EBSmultispp.pdf 8 2016 2024 2016, 2017, 2019, 2020, 2021, 2022, 2023, 2024
NOAA EBSpcod.pdf 12 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA EBSpollock.pdf 15 2013 2024 2013, 2014, 2015, 2017, 2024
NOAA GOAatf.pdf 25 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAatka.pdf 25 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAdeepflat.pdf 18 2014 2024 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAdsr.pdf 20 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAdusky.pdf 16 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAflathead.pdf 20 2013 2024 2013, 2014, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAforage.pdf 10 2018 2022 2018, 2020, 2021, 2022
NOAA GOAintro.pdf 21 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAnork.pdf 11 2014 2024 2014, 2015, 2016, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAnorthern.pdf 7 2013 2013 2013
NOAA GOAnsrocksole.pdf 13 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAocto.pdf 20 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAorock.pdf 14 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2022, 2023, 2024
NOAA GOApcod.pdf 23 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOApollock.pdf 23 2015 2024 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOApop.pdf 20 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOArex.pdf 22 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOArougheye.pdf 19 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAsablefish.pdf 10 2016 2018 2016, 2017, 2018
NOAA GOAshallowflat.pdf 19 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAshark.pdf 18 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAshortraker.pdf 18 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2022, 2023, 2024
NOAA GOAskate.pdf 20 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA GOAthorny.pdf 20 2013 2024 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024
NOAA aipcod.pdf 4 2013 2017 2013, 2014, 2015, 2017
NOAA north-pacific-groundfish-stock-assessments-and-fishery-evaluation 2 2024 2024 2024
NOAA sablefish.pdf 10 2019 2023 2019, 2020, 2021, 2022, 2023
NOAA_REFM AIpollock.pdf 21 2003 2012 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BOGpollock.pdf 20 2005 2012 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIGturbot.pdf 2 2005 2006 2005, 2006
NOAA_REFM BSAIPcod.pdf 2 2005 2006 2005, 2006
NOAA_REFM BSAISafe.pdf 5 2007 2011 2007, 2008, 2009, 2010, 2011
NOAA_REFM BSAI_Intro.pdf 2 2004 2005 2004, 2005
NOAA_REFM BSAIalaskaplaice.pdf 2 2003 2004 2003, 2004
NOAA_REFM BSAIatf.pdf 23 2003 2012 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIatka.pdf 22 2003 2012 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIfhs.pdf 2 2003 2004 2003, 2004
NOAA_REFM BSAIflathead.pdf 21 2005 2012 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIgrenadier.pdf 7 2008 2012 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIgturbot.pdf 2 2003 2004 2003, 2004
NOAA_REFM BSAIintro.pdf 20 2003 2012 2003, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIkamchatka.pdf 16 2010 2012 2010, 2011, 2012
NOAA_REFM BSAInorthern.pdf 8 2003 2012 2003, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAInortherns.pdf 2 2004 2005 2004, 2005
NOAA_REFM BSAIocto.pdf 20 2006 2012 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIoflat.pdf 21 2005 2012 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIoflats.pdf 2 2003 2004 2003, 2004
NOAA_REFM BSAIorock.pdf 22 2003 2012 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIpcod.pdf 9 2003 2012 2003, 2004, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIplaice.pdf 21 2005 2012 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIpop.pdf 23 2003 2012 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIrocksole.pdf 19 2006 2012 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIrougheye.pdf 17 2008 2012 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIsablefish.pdf 13 2004 2012 2004, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIsculpin.pdf 7 2006 2012 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIshark.pdf 18 2007 2012 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIsharks.pdf 3 2004 2005 2004, 2005
NOAA_REFM BSAIshortraker.pdf 18 2008 2012 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIskate.pdf 19 2007 2012 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIsquid.pdf 6 2007 2012 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIsrre.pdf 5 2003 2007 2003, 2004, 2005, 2006, 2007
NOAA_REFM BSAIturbot.pdf 19 2007 2012 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSAIyfin.pdf 20 2006 2012 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM BSatf.pdf 2 2001 2002 2001, 2002
NOAA_REFM BSatka.pdf 2 2001 2002 2001, 2002
NOAA_REFM BSfhs.pdf 2 2001 2002 2001, 2002
NOAA_REFM BSgturb.pdf 2 2001 2002 2001, 2002
NOAA_REFM BSoflats.pdf 2 2001 2002 2001, 2002
NOAA_REFM BSorock.pdf 2 2001 2002 2001, 2002
NOAA_REFM BSpcod.pdf 2 2001 2002 2001, 2002
NOAA_REFM BSpollock.pdf 2 2001 2002 2001, 2002
NOAA_REFM BSpop.pdf 2 2001 2002 2001, 2002
NOAA_REFM EBSpollock.pdf 15 2003 2012 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM EcoChpt.pdf 2 2005 2006 2005, 2006
NOAA_REFM GOAPOP.pdf 3 2003 2005 2003, 2004, 2005
NOAA_REFM GOAPcod.pdf 2 2005 2006 2005, 2006
NOAA_REFM GOASafe.pdf 5 2007 2011 2007, 2008, 2009, 2010, 2011
NOAA_REFM GOAatf.pdf 25 2001 2012 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAatka.pdf 25 2001 2012 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAdeepflat.pdf 18 2007 2012 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAdemersalRF.pdf 2 2003 2004 2003, 2004
NOAA_REFM GOAdsr.pdf 20 2006 2012 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAdusky.pdf 16 2003 2012 2003, 2011, 2012
NOAA_REFM GOAfhs.pdf 2 2003 2004 2003, 2004
NOAA_REFM GOAflathead.pdf 20 2005 2012 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAforage.pdf 10 2007 2012 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAgrenadier.pdf 5 2008 2012 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAintro.pdf 21 2003 2012 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAnorthern.pdf 7 2007 2012 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAnorthernrf.pdf 2 2003 2004 2003, 2004
NOAA_REFM GOAnsrocksole.pdf 13 2012 2012 2012
NOAA_REFM GOAocto.pdf 20 2006 2012 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAorock.pdf 14 2011 2012 2011, 2012
NOAA_REFM GOApcod.pdf 23 2001 2012 2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOApelshelf.pdf 5 2006 2010 2006, 2007, 2008, 2009, 2010
NOAA_REFM GOApollock.pdf 23 2001 2012 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOApollocksurvey.pdf 2 2001 2002 2001, 2002
NOAA_REFM GOApop.pdf 20 2006 2012 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOArex.pdf 22 2004 2012 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOArougheye.pdf 19 2006 2012 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAsablefish.pdf 10 2003 2012 2003, 2004, 2009, 2010, 2011, 2012
NOAA_REFM GOAsculpin.pdf 7 2006 2012 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAshallowflat.pdf 19 2007 2012 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAshark.pdf 18 2007 2012 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAsharks.pdf 2 2006 2006 2006
NOAA_REFM GOAshortraker.pdf 18 2007 2012 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAskate.pdf 20 2003 2012 2003, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAskates.pdf 3 2004 2006 2004, 2005, 2006
NOAA_REFM GOAsquid.pdf 7 2006 2012 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAthorny.pdf 20 2006 2012 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM GOAthornyheads.pdf 3 2002 2004 2002, 2003, 2004
NOAA_REFM IPHC.pdf 2 2008 2009 2008, 2009
NOAA_REFM ecochap.pdf 2 2002 2003 2002, 2003
NOAA_REFM economic.pdf 11 2002 2012 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
NOAA_REFM ecosystem.pdf 5 2007 2012 2007, 2008, 2009, 2011, 2012
NOAA_REFM sablefish.pdf 10 2001 2007 2001, 2002, 2003, 2006, 2007
NOAA_REFM sablefishgoa.pdf 2 2007 2008 2007, 2008
NPFMC BSAIatf.pdf 23 2025 2025 2025
NPFMC BSAIatka.pdf 22 2025 2025 2025
NPFMC BSAIflathead.pdf 21 2025 2025 2025
NPFMC BSAIkamchatka.pdf 16 2025 2025 2025
NPFMC BSAInork.pdf 12 2025 2025 2025
NPFMC BSAIocto.pdf 20 2025 2025 2025
NPFMC BSAIoflat.pdf 21 2025 2025 2025
NPFMC BSAIorock.pdf 22 2025 2025 2025
NPFMC BSAIpcod.pdf 9 2025 2025 2025
NPFMC BSAIplaice.pdf 21 2025 2025 2025
NPFMC BSAIpop.pdf 23 2025 2025 2025
NPFMC BSAIrocksole.pdf 19 2025 2025 2025
NPFMC BSAIsablefish.pdf 13 2025 2025 2025
NPFMC BSAIsharks.pdf 3 2025 2025 2025
NPFMC BSAIshortraker.pdf 18 2025 2025 2025
NPFMC BSAIskate.pdf 19 2025 2025 2025
NPFMC BSAIturbot.pdf 19 2025 2025 2025
NPFMC BSAIyfin.pdf 20 2025 2025 2025
NPFMC CookInletSalmon.pdf 3 2024 2026 2024, 2025, 2026
NPFMC GOAatf.pdf 25 2025 2025 2025
NPFMC GOAatka.pdf 25 2025 2025 2025
NPFMC GOAdeepflat.pdf 18 2025 2025 2025
NPFMC GOAdsr.pdf 20 2025 2025 2025
NPFMC GOAdusky.pdf 16 2025 2025 2025
NPFMC GOAflathead.pdf 20 2025 2025 2025
NPFMC GOAnork.pdf 11 2025 2025 2025
NPFMC GOAocto.pdf 20 2025 2025 2025
NPFMC GOAorock.pdf 14 2025 2025 2025
NPFMC GOApcod.pdf 23 2026 2026 2026
NPFMC GOApollock.pdf 23 2025 2025 2025
NPFMC GOApop.pdf 20 2025 2025 2025
NPFMC GOArex.pdf 22 2025 2025 2025
NPFMC GOAsablefish.pdf 10 2025 2025 2025
NPFMC GOAshallowflat.pdf 19 2025 2025 2025
NPFMC GOAsharks.pdf 2 2025 2025 2025
NPFMC GOAshortraker.pdf 18 2025 2025 2025
NPFMC GOAskate.pdf 20 2025 2025 2025
NPFMC GOAthorny.pdf 20 2025 2025 2025
NPFMC north-pacific-groundfish-stock-assessments-and-fishery-evaluation 2 1998 1998 1998

8 Stock inventory

This inventory is a compact reference for what the crawler currently infers about stock, area, and section coverage across the combined catalog.

Show R code
safe_summaries$stock_inventory |>
  arrange(section, stock, area) |>
  gt() |>
  fmt_number(columns = n, decimals = 0)
section stock_group stock area n
2025 Groundfish SAFEs groundfish Alaska plaice BSAI 1
2025 Groundfish SAFEs groundfish Arrowtooth flounder BSAI 1
2025 Groundfish SAFEs groundfish Arrowtooth flounder GOA 1
2025 Groundfish SAFEs groundfish Atka mackerel BSAI 1
2025 Groundfish SAFEs groundfish Atka mackerel GOA 1
2025 Groundfish SAFEs groundfish Deep-water flatfish GOA 1
2025 Groundfish SAFEs groundfish Demersal shelf rockfish GOA 1
2025 Groundfish SAFEs groundfish Dusky rockfish GOA 1
2025 Groundfish SAFEs groundfish Flathead sole BSAI 1
2025 Groundfish SAFEs groundfish Flathead sole GOA 1
2025 Groundfish SAFEs groundfish Greenland turbot BSAI 1
2025 Groundfish SAFEs other Halibut discard mortality rates NA 1
2025 Groundfish SAFEs groundfish Kamchatka flounder BSAI 1
2025 Groundfish SAFEs groundfish Northern rock sole BSAI 1
2025 Groundfish SAFEs groundfish Northern rockfish BSAI 1
2025 Groundfish SAFEs groundfish Northern rockfish GOA 1
2025 Groundfish SAFEs groundfish Octopus BSAI 1
2025 Groundfish SAFEs groundfish Octopus GOA 1
2025 Groundfish SAFEs groundfish Other flatfish BSAI 1
2025 Groundfish SAFEs groundfish Other rockfish BSAI 1
2025 Groundfish SAFEs groundfish Other rockfish GOA 1
2025 Groundfish SAFEs groundfish Pacific cod BSAI 1
2025 Groundfish SAFEs groundfish Pacific cod GOA 4
2025 Groundfish SAFEs groundfish Pacific ocean perch BSAI 1
2025 Groundfish SAFEs groundfish Pacific ocean perch GOA 1
2025 Groundfish SAFEs groundfish Pollock BSAI 1
2025 Groundfish SAFEs groundfish Pollock GOA 1
2025 Groundfish SAFEs groundfish Rex sole GOA 1
2025 Groundfish SAFEs groundfish Rougheye/blackspotted complex BSAI 1
2025 Groundfish SAFEs groundfish Rougheye/blackspotted complex GOA 1
2025 Groundfish SAFEs groundfish Sablefish BSAI 1
2025 Groundfish SAFEs groundfish Sablefish GOA 1
2025 Groundfish SAFEs groundfish Shallow-water flatfish GOA 1
2025 Groundfish SAFEs groundfish Sharks BSAI 1
2025 Groundfish SAFEs groundfish Sharks GOA 1
2025 Groundfish SAFEs groundfish Shortraker rockfish BSAI 1
2025 Groundfish SAFEs groundfish Shortraker rockfish GOA 1
2025 Groundfish SAFEs groundfish Skates BSAI 1
2025 Groundfish SAFEs groundfish Skates GOA 1
2025 Groundfish SAFEs groundfish Thornyheads GOA 1
2025 Groundfish SAFEs groundfish Yellowfin sole BSAI 1
Cook Inlet Salmon SAFEs salmon Cook Inlet salmon Cook Inlet 3
Crab SAFEs crab Aleutian Islands golden king crab BSAI 1
Crab SAFEs crab Aleutian Islands golden king crab NA 5
Crab SAFEs crab Bristol Bay red king crab NA 12
Crab SAFEs crab Eastern Bering Sea snow crab NA 2
Crab SAFEs crab Norton Sound red king crab NA 5
Crab SAFEs crab Pribilof Islands blue king crab NA 6
Crab SAFEs crab Pribilof Islands golden king crab NA 2
Crab SAFEs crab Pribilof Islands red king crab NA 4
Crab SAFEs crab Saint Matthew Island blue king crab NA 3
Crab SAFEs crab Tanner crab NA 1
Crab SAFEs crab West Aleutian Islands red king crab BSAI 1
Crab SAFEs crab West Aleutian Islands red king crab NA 1
Groundfish SAFEs groundfish Alaska plaice BSAI 3
Groundfish SAFEs groundfish Alaska plaice BSAI/GOA 19
Groundfish SAFEs groundfish Arrowtooth flounder BSAI 5
Groundfish SAFEs groundfish Arrowtooth flounder BSAI/GOA 11
Groundfish SAFEs groundfish Arrowtooth flounder GOA 5
Groundfish SAFEs groundfish Arrowtooth flounder NA 27
Groundfish SAFEs groundfish Atka mackerel BSAI 5
Groundfish SAFEs groundfish Atka mackerel BSAI/GOA 11
Groundfish SAFEs groundfish Atka mackerel GOA 5
Groundfish SAFEs groundfish Atka mackerel NA 26
Groundfish SAFEs groundfish Deep-water flatfish BSAI/GOA 11
Groundfish SAFEs groundfish Deep-water flatfish NA 7
Groundfish SAFEs groundfish Demersal shelf rockfish BSAI/GOA 1
Groundfish SAFEs groundfish Demersal shelf rockfish GOA 3
Groundfish SAFEs groundfish Demersal shelf rockfish NA 18
Groundfish SAFEs groundfish Dusky rockfish BSAI/GOA 11
Groundfish SAFEs groundfish Dusky rockfish GOA 1
Groundfish SAFEs groundfish Dusky rockfish NA 3
Groundfish SAFEs groundfish Flathead sole BSAI 5
Groundfish SAFEs groundfish Flathead sole BSAI/GOA 11
Groundfish SAFEs groundfish Flathead sole GOA 3
Groundfish SAFEs groundfish Flathead sole NA 27
Groundfish SAFEs groundfish Forage fish BSAI/GOA 4
Groundfish SAFEs groundfish Forage fish GOA 1
Groundfish SAFEs groundfish Forage fish NA 8
Groundfish SAFEs groundfish Greenland turbot BSAI 7
Groundfish SAFEs groundfish Greenland turbot NA 19
Groundfish SAFEs groundfish Grenadier BSAI/GOA 3
Groundfish SAFEs groundfish Grenadier NA 12
Groundfish SAFEs other Halibut discard mortality rates GOA 1
Groundfish SAFEs other Halibut discard mortality rates NA 5
Groundfish SAFEs groundfish Kamchatka flounder NA 15
Groundfish SAFEs groundfish Northern rock sole BSAI/GOA 8
Groundfish SAFEs groundfish Northern rock sole NA 24
Groundfish SAFEs groundfish Northern rockfish BSAI 3
Groundfish SAFEs groundfish Northern rockfish BSAI/GOA 11
Groundfish SAFEs groundfish Northern rockfish GOA 4
Groundfish SAFEs groundfish Northern rockfish NA 27
Groundfish SAFEs groundfish Octopus BSAI/GOA 11
Groundfish SAFEs groundfish Octopus NA 27
Groundfish SAFEs groundfish Other flatfish BSAI 5
Groundfish SAFEs groundfish Other flatfish NA 19
Groundfish SAFEs groundfish Other rockfish BSAI 6
Groundfish SAFEs groundfish Other rockfish BSAI/GOA 10
Groundfish SAFEs groundfish Other rockfish NA 21
Groundfish SAFEs groundfish Pacific cod BSAI 19
Groundfish SAFEs groundfish Pacific cod BSAI/GOA 11
Groundfish SAFEs groundfish Pacific cod GOA 8
Groundfish SAFEs groundfish Pacific cod NA 27
Groundfish SAFEs groundfish Pacific ocean perch BSAI 6
Groundfish SAFEs groundfish Pacific ocean perch BSAI/GOA 11
Groundfish SAFEs groundfish Pacific ocean perch GOA 3
Groundfish SAFEs groundfish Pacific ocean perch NA 27
Groundfish SAFEs groundfish Pollock BSAI 24
Groundfish SAFEs groundfish Pollock BSAI/GOA 10
Groundfish SAFEs groundfish Pollock GOA 12
Groundfish SAFEs groundfish Pollock NA 61
Groundfish SAFEs groundfish Rex sole BSAI/GOA 11
Groundfish SAFEs groundfish Rex sole GOA 2
Groundfish SAFEs groundfish Rex sole NA 8
Groundfish SAFEs groundfish Rougheye/blackspotted complex BSAI/GOA 11
Groundfish SAFEs groundfish Rougheye/blackspotted complex NA 23
Groundfish SAFEs groundfish Sablefish BSAI/GOA 18
Groundfish SAFEs groundfish Sablefish NA 24
Groundfish SAFEs groundfish Shallow-water flatfish BSAI/GOA 11
Groundfish SAFEs groundfish Shallow-water flatfish NA 7
Groundfish SAFEs groundfish Sharks BSAI 2
Groundfish SAFEs groundfish Sharks BSAI/GOA 11
Groundfish SAFEs groundfish Sharks NA 27
Groundfish SAFEs groundfish Shortraker rockfish BSAI 3
Groundfish SAFEs groundfish Shortraker rockfish BSAI/GOA 10
Groundfish SAFEs groundfish Shortraker rockfish GOA 3
Groundfish SAFEs groundfish Shortraker rockfish NA 27
Groundfish SAFEs groundfish Skates BSAI/GOA 10
Groundfish SAFEs groundfish Skates GOA 3
Groundfish SAFEs groundfish Skates NA 28
Groundfish SAFEs groundfish Thornyheads BSAI/GOA 11
Groundfish SAFEs groundfish Thornyheads GOA 7
Groundfish SAFEs groundfish Thornyheads NA 8
Groundfish SAFEs groundfish Yellowfin sole NA 19
Scallop SAFEs scallop Scallop NA 21

10 Example: BSAI pollock access history

Pollock is a useful regression test because the file naming has changed over time and the same stock can appear through multiple NOAA and NPFMC entry points.

Show R code
pollock_example <- safe_catalog |>
  filter(
    grepl("Pollock", stock %||% "") | grepl("pollock", label, ignore.case = TRUE),
    grepl("BSAI|Bering", area %||% "", ignore.case = TRUE) |
      grepl("BSAI", label, ignore.case = TRUE)
  ) |>
  mutate(
    access_note = case_when(
      filename == "BSAIpollock.pdf" ~ "Current naming uses BSAIpollock.pdf rather than EBSpollock.pdf",
      filename == "EBSpollock.pdf" ~ "Alternate or older filename found",
      TRUE ~ ""
    )
  ) |>
  select(source, true_year, label, filename, access_note, url) |>
  arrange(desc(true_year), source, label)

pollock_example |>
  gt() |>
  fmt_missing(everything(), missing_text = "")
source true_year label filename access_note url
NPFMC 2025 BSAI Pollock BSAIpollock.pdf Current naming uses BSAIpollock.pdf rather than EBSpollock.pdf https://files.npfmc.org/SAFE/2025/BSAIpollock.pdf
NOAA 2024 Pollock - Aleutian Islands AIpollock.pdf https://www.npfmc.org/wp-content/PDFdocuments/SAFE/2024/AIpollock.pdf
NOAA 2023 Pollock - Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/Plan_Team/2023/AIpollock.pdf
NOAA 2023 Pollock - Walleye GOApollock.pdf https://apps-afsc.fisheries.noaa.gov/Plan_Team/2023/GOApollock.pdf
NOAA 2022 Pollock - Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/Plan_Team/2022/AIpollock.pdf
NOAA 2022 Pollock - Walleye GOApollock.pdf https://apps-afsc.fisheries.noaa.gov/Plan_Team/2022/GOApollock.pdf
NOAA 2021 Pollock - Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2021/AIpollock.pdf
NOAA 2021 Pollock - Walleye GOApollock.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2021/GOApollock.pdf
NOAA 2020 Pollock - Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2020/AIpollock.pdf
NOAA 2020 Pollock - Walleye GOApollock.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2020/GOApollock.pdf
NOAA 2019 Pollock - Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2019/AIpollock.pdf
NOAA 2019 Pollock - Walleye GOApollock.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2019/GOApollock.pdf
NOAA 2018 Pollock - Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2018/BSAI/AIpollock.pdf
NOAA 2018 Pollock - Walleye GOApollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2018/GOA/GOApollock.pdf
NOAA 2017 Pollock GOApollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2017/GOApollock.pdf
NOAA 2017 Pollock - Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2017/AIpollock.pdf
NOAA 2017 Pollock - Eastern Bering Sea EBSpollock.pdf Alternate or older filename found https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2017/EBSpollock.pdf
NOAA 2016 Pollock GOApollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2016/GOApollock.pdf
NOAA 2015 Pollock - Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2015/AIpollock.pdf
NOAA 2015 Pollock - Walleye GOApollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2015/GOApollock.pdf
NOAA 2014 Pollock - Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2014/AIpollock.pdf
NOAA 2013 Pollock - Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2013/AIpollock.pdf
NOAA_REFM 2012 Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2012/AIpollock.pdf
NOAA_REFM 2011 Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/docs/2011/AIpollock.pdf
NOAA_REFM 2010 Aleutian Islands AIpollock.pdf http://apps-afsc.fisheries.noaa.gov/REFM/docs/2010/AIpollock.pdf
NOAA_REFM 2009 Aleutian Islands AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/REFM/docs/2009/AIpollock.pdf
NOAA_REFM 2005 Aleutian Islands Pollock AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2005/AIpollock.pdf
NOAA_REFM 2004 Aleutian Islands Pollock AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2004/AIpollock.pdf
NOAA_REFM 2003 Aleutian Islands Pollock AIpollock.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2003/AIpollock.pdf
NOAA_REFM 2002 BSAI Pollock BSpollock.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2002/BSpollock.pdf
NOAA_REFM 2001 BSAI Pollock BSpollock.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2001/BSpollock.pdf
NOAA_REFM 2001 BSAI Pollock Appendix BSpollockapp.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2001/BSpollockapp.pdf
NOAA_REFM 2000 BSAI Pollock bsaipollock2000.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2000/bsaipollock2000.pdf
NOAA_REFM 1999 BSAI Pollock bsaiwp99.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/Historic_Assess/bsaiwp99.pdf
NOAA_REFM 1998 BSAI Pollock bsaiwp98.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/Historic_Assess/bsaiwp98.pdf

11 Example: GOA Pacific cod access history

GOA Pacific cod is a second targeted check because the current NPFMC page mixes ordinary 2025 material with visible 2026 update files under the 2025 directory.

Show R code
pcod_example <- safe_catalog |>
  filter(
    grepl("Pacific cod", stock %||% "", ignore.case = TRUE) |
      grepl("pcod", filename %||% "", ignore.case = TRUE) |
      grepl("Pacific cod", label, ignore.case = TRUE),
    grepl("GOA", area %||% "", ignore.case = TRUE) |
      grepl("GOA", label, ignore.case = TRUE)
  ) |>
  mutate(
    access_note = case_when(
      filename == "GOApcod.pdf" & grepl("\\b2026\\b", label) ~
        "2026 GOA Pacific cod stored under /SAFE/2025/GOApcod.pdf",
      filename == "GOApcod25.pdf" ~
        "Explicit 2025 GOA Pacific cod filename",
      TRUE ~ ""
    )
  ) |>
  select(source, true_year, source_year_dir, label, filename, access_note, url) |>
  arrange(desc(true_year), source, label)

pcod_example |>
  gt() |>
  fmt_missing(everything(), missing_text = "")
source true_year source_year_dir label filename access_note url
NPFMC 2026 2025 2026 GOA Pacific cod GOApcod.pdf 2026 GOA Pacific cod stored under /SAFE/2025/GOApcod.pdf https://files.npfmc.org/SAFE/2025/GOApcod.pdf
NPFMC 2026 2025 2026 GOA Pacific cod ESP GOApcodESP.pdf https://files.npfmc.org/SAFE/2025/GOApcodESP.pdf
NPFMC 2026 2025 2026 GOA Pacific cod ESP Report Card GOApcodESP_Report_Card.pdf https://files.npfmc.org/SAFE/2025/GOApcodESP_Report_Card.pdf
NPFMC 2025 2025 2025 GOA Pacific Cod GOApcod25.pdf Explicit 2025 GOA Pacific cod filename https://files.npfmc.org/SAFE/2025/GOApcod25.pdf
NOAA 2023 2023 Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/Plan_Team/2023/GOApcod.pdf
NOAA 2022 2022 Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/Plan_Team/2022/GOApcod.pdf
NOAA 2021 2021 Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2021/GOApcod.pdf
NOAA 2020 2020 Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2020/GOApcod.pdf
NOAA 2019 2019 Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2019/GOApcod.pdf
NOAA 2018 2018 Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2018/GOA/GOApcod.pdf
NOAA 2017 2017 Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2017/GOApcod.pdf
NOAA 2016 2016 Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2016/GOApcod.pdf
NOAA 2015 2015 Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2015/GOApcod.pdf
NOAA 2014 2014 Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2014/GOApcod.pdf
NOAA 2013 2013 Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/REFM/Docs/2013/GOApcod.pdf
NOAA_REFM 2005 2005 GOA Pacific Cod GOAPcod.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2005/GOAPcod.pdf
NOAA_REFM 2004 2004 GOA Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2004/GOApcod.pdf
NOAA_REFM 2003 2003 GOA Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2003/GOApcod.pdf
NOAA_REFM 2002 2002 GOA Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2002/GOApcod.pdf
NOAA_REFM 2001 2001 GOA Pacific Cod GOApcod.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2001/GOApcod.pdf
NOAA_REFM 2000 2000 GOA Pacific Cod goapcod2000.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/2000/goapcod2000.pdf
NOAA_REFM 1999
GOA Pacific Cod GOA1999Pcod.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/historic_assess/GOA1999Pcod.pdf
NOAA_REFM 1998
GOA Pacific Cod goapcod98.pdf https://apps-afsc.fisheries.noaa.gov/refm/docs/historic_assess/goapcod98.pdf

12 Recent HCR mentions (top 30)

The section below summarizes the 30 most recent HCR mentions from the NPFMC meetings document search output and provides direct links to both the document and its meeting page.

Show R code
hcr_path <- "npfmc_hcr_mentions_top30.csv"

if (!file.exists(hcr_path)) {
  cat(
    "The file `npfmc_hcr_mentions_top30.csv` was not found. ",
    "Run the HCR extraction step first, then re-render this report."
  )
} else {
  hcr_top30 <- readr::read_csv(hcr_path, show_col_types = FALSE) |>
    mutate(
      meeting_time = as.POSIXct(meeting_time, tz = "UTC"),
      meeting_date = as.Date(meeting_time)
    ) |>
    arrange(desc(meeting_time))

  hcr_summary <- hcr_top30 |>
    summarise(
      n_mentions = n(),
      n_meetings = dplyr::n_distinct(meeting_url),
      newest = max(meeting_date, na.rm = TRUE),
      oldest = min(meeting_date, na.rm = TRUE),
      hcr_named_docs = sum(
        grepl("\\\\bHCR\\\\b|Harvest Control Rule", document_title, ignore.case = TRUE),
        na.rm = TRUE
      )
    )

  cat(sprintf(
    paste0(
      "These %d entries span **%s** through **%s**, covering **%d** meetings. ",
      "**%d** document titles explicitly include `HCR` or `Harvest Control Rule`."
    ),
    hcr_summary$n_mentions,
    format(hcr_summary$oldest, "%B %d, %Y"),
    format(hcr_summary$newest, "%B %d, %Y"),
    hcr_summary$n_meetings,
    hcr_summary$hcr_named_docs
  ))

  hcr_display <- hcr_top30 |>
    mutate(
      meeting_link = sprintf(
        '<a href="%s" target="_blank" rel="noopener noreferrer">%s</a>',
        meeting_url,
        meeting
      ),
      document_link = sprintf(
        '<a href="%s" target="_blank" rel="noopener noreferrer">%s</a>',
        document_url,
        document_title
      )
    ) |>
    select(meeting_date, meeting_link, document_link)

  hcr_display |>
    gt() |>
    fmt_date(columns = meeting_date, date_style = 6) |>
    fmt_markdown(columns = c(meeting_link, document_link)) |>
    cols_label(
      meeting_date = "Meeting Date",
      meeting_link = "Meeting",
      document_link = "Document"
    )
}
These 30 entries span **December 01, 2025** through **February 03, 2026**, covering **6** meetings. **2** document titles explicitly include `HCR` or `Harvest Control Rule`.
Meeting Date Meeting Document
Feb 3, 2026 NPFMC Council/AP February 2026 - 278th C1 D4 Joint and GOA GFPT Report.pdf
Feb 3, 2026 NPFMC Council/AP February 2026 - 278th C1 D4 Joint and GOA GFPT Report.pdf
Feb 3, 2026 NPFMC Council/AP February 2026 - 278th D4 BSAI CPT Report.pdf
Feb 2, 2026 SSC February 2026 C1 D4 Joint and GOA GFPT Report.pdf
Feb 2, 2026 SSC February 2026 C1 D4 Joint and GOA GFPT Report.pdf
Feb 2, 2026 SSC February 2026 C1 GOA GFPT Pcod.pdf
Feb 2, 2026 SSC February 2026 C1 GOA GFPT cod SSC (1).pdf
Feb 2, 2026 SSC February 2026 D4 BSAI CPT Report.pdf
Feb 2, 2026 SSC February 2026 D4 Harvest Control Rule Development memo.pdf
Feb 2, 2026 SSC February 2026 SSC Admin Issues.pdf
Feb 2, 2026 SSC February 2026 D4 HCR SSC PRESENTATION.pdf
Feb 2, 2026 SSC February 2026 PPT D4 CPT HCR feedback.pdf
Feb 1, 2026 NPFMC Council/AP February 2026 - 278th C1 GOA Groundfish Plan Team Report presentation.pdf
Feb 1, 2026 NPFMC Council/AP February 2026 - 278th D4 Harvest Control Rule Development memo.pdf
Feb 1, 2026 NPFMC Council/AP February 2026 - 278th E Prelim June agenda.pdf
Feb 1, 2026 NPFMC Council/AP February 2026 - 278th SSC Presentation_Balance to Council.pdf
Feb 1, 2026 NPFMC Council/AP February 2026 - 278th SSC Report Feb 2026_DRAFT_to_COUNCIL.pdf
Jan 21, 2026 Joint Groundfish Plan Team 2026_01_21_HCR_JGPT.pdf
Jan 21, 2026 Joint Groundfish Plan Team GOAPcod_JanPT26.pdf
Jan 21, 2026 Joint Groundfish Plan Team HCR performance Criteria.xlsx
Jan 21, 2026 Joint Groundfish Plan Team JGFPT_January2026_Schedule DRAFT.pdf
Jan 21, 2026 Joint Groundfish Plan Team Revised CLIM HCR Whitepaper January 2026-1.pdf
Jan 20, 2026 Groundfish Harvest Control Rule Development Workshop TIME CHANGE 1PM START morning session cancelled 2026_01_20_HCR_slides.pdf
Jan 20, 2026 Groundfish Harvest Control Rule Development Workshop TIME CHANGE 1PM START morning session cancelled HCR discussion paper revised 2026.pdf
Jan 20, 2026 Groundfish Harvest Control Rule Development Workshop TIME CHANGE 1PM START morning session cancelled HCR_January2026_Schedule.pdf
Jan 15, 2026 Crab Plan Team - 01/15/2026 CPT Jan special meeting Draft Agenda_01152026.pdf
Jan 15, 2026 Crab Plan Team - 01/15/2026 HCR Overview CPT presentation.pdf
Jan 15, 2026 Crab Plan Team - 01/15/2026 HCR discussion paper revised 2026.pdf
Dec 1, 2025 NPFMC Council/AP December 2025 - 276th B1 IRA Funding Timeline Update.pdf
Dec 1, 2025 NPFMC Council/AP December 2025 - 276th C6 November 2025 CPT Report.pdf