From ca1f44b949e92149d75a0eea6dd004b0133d65de Mon Sep 17 00:00:00 2001 From: almac2022 Date: Thu, 23 Apr 2026 13:24:18 -0700 Subject: [PATCH 1/5] PWF: archive #44, init #48 (user_barriers_definite bypass) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #47 merged as link 0.6.0 (squash 8eda3fb). #48 follows the same family — user_barriers_definite rows currently eligible for override in link; bcfishpass appends post-filter. ELKR active test case (4 defect rows). Relates to #48 --- planning/active/findings.md | 85 +++++++-------- planning/active/progress.md | 28 ++--- planning/active/task_plan.md | 100 +++++------------- .../README.md | 10 ++ .../findings.md | 60 +++++++++++ .../progress.md | 25 +++++ .../task_plan.md | 92 ++++++++++++++++ 7 files changed, 262 insertions(+), 138 deletions(-) create mode 100644 planning/archive/2026-04-23-barriers-definite-control/README.md create mode 100644 planning/archive/2026-04-23-barriers-definite-control/findings.md create mode 100644 planning/archive/2026-04-23-barriers-definite-control/progress.md create mode 100644 planning/archive/2026-04-23-barriers-definite-control/task_plan.md diff --git a/planning/active/findings.md b/planning/active/findings.md index 3ee943e..a2b486e 100644 --- a/planning/active/findings.md +++ b/planning/active/findings.md @@ -1,60 +1,61 @@ -# Findings: Wire barriers_definite_control (#44) +# Findings — #48 (user_barriers_definite bypass) -## Where the gap lives +## Pre-fix defect on ELKR (2026-04-23, via post-#47 tar_make state) -Three places where `"barriers_definite_control"` is referenced in link today: +Query: `SELECT * FROM working_.barrier_overrides bo INNER JOIN working_.barriers_definite bd ON bd.blue_line_key = bo.blue_line_key AND abs(bd.downstream_route_measure - bo.downstream_route_measure) < 1` across 5 WSGs: -1. **`R/lnk_pipeline_prepare.R` → `.lnk_pipeline_prep_load_aux`** — loads the per-AOI filtered CSV rows into `.barriers_definite_control` when `cfg$overrides$barriers_definite_control` is non-NULL. Already correct. -2. **`R/lnk_pipeline_prepare.R` → `.lnk_pipeline_prep_gradient`** — `information_schema` probe for the table, then `DELETE FROM gradient_barriers_raw g USING barriers_definite_control c WHERE ... c.barrier_ind::boolean = false`. Already correct. Removes **passable** positions from gradient set before minimal reduction. -3. **`R/lnk_pipeline_prepare.R` → `.lnk_pipeline_prep_overrides`** — does NOT pass `control` to `lnk_barrier_overrides`. This is the gap. `lnk_barrier_overrides` accepts a `control` parameter but is called without one from this site. +- ADMS: 0 rows in barriers_definite → no matches possible +- BULK: 87 rows in barriers_definite, 0 matches in barrier_overrides +- BABL: 0 rows in barriers_definite → no matches possible +- ELKR: 7 rows in barriers_definite, **4 matches** in barrier_overrides +- DEAD: 0 rows in barriers_definite → no matches possible -## Latent bug in lnk_barrier_overrides control filter +ELKR matches: -Read `R/lnk_barrier_overrides.R` lines 140–153. The implementation: +| Species | Position | Type | Name | +|---------|----------|------|------| +| BT | (356549622, 42) | EXCLUSION | Erickson Creek exclusion (mining impacts per CSV note) | +| WCT | (356549622, 42) | EXCLUSION | Erickson Creek exclusion | +| WCT | (356553439, 574) | MISC | Spillway | +| WCT | (356560765, 2935) | MISC | Spillway | -```r -ctrl_where <- sprintf("LEFT JOIN %s c ON b.blue_line_key = c.blue_line_key - AND abs(b.downstream_route_measure - c.downstream_route_measure) < 1", control) -ctrl_filter <- "AND c.blue_line_key IS NULL" -``` - -Filter treats ANY control row as blocking override — including `barrier_ind = FALSE` rows. Docstring (lines 27–30) says only `barrier_ind = TRUE` rows block. - -In practice on bcfishpass input this is masked because `.lnk_pipeline_prep_gradient`'s upstream DELETE removes `barrier_ind = FALSE` positions from `gradient_barriers_raw` before they reach the override step. But falls and user-definite positions are not pruned by control at load time — they stay in `natural_barriers`. If a control row with `barrier_ind = FALSE` exists for a fall or definite-barrier position, the current filter blocks observation overrides on it. Should not block. - -Fix: `"AND (c.blue_line_key IS NULL OR c.barrier_ind::boolean = false)"`. - -## Manifest-driven gating decision +These are user-definite positions that link's pipeline treats as overridable. Post-fix they should stay as permanent blockers (matching bcfishpass). Current ELKR rollup: BT spawn +3.4% / rear -0.7%; WCT spawn +4.0% / rear +1.6%. Fixing this should bring spawning numbers down toward 0. -`.lnk_pipeline_prep_overrides` could probe `information_schema.tables` to discover whether the control table exists (same pattern used there for habitat). Decided against: the manifest key is the direct contract. If `cfg$overrides$barriers_definite_control` is non-NULL the load step wrote the table; if it's NULL no table exists. Manifest gate, not DB probe. +## Architecture comparison -Scope discipline: the existing `information_schema` probe for the habitat table in the same function, and the similar probe in `.lnk_pipeline_prep_gradient` for the control table, work correctly today. Leaving them alone in this PR; filing a follow-up issue for consistency. Using the manifest as the contract is well preferred across the package. +**bcfishpass** — `model_access_*.sql`: -## Tests that need to exist - -- `tests/testthat/test-lnk_barrier_overrides.R` does not exist. Creating new. -- `tests/testthat/test-lnk_pipeline_prepare.R` exists — extending with prep_overrides control pass-through tests. - -## No `information_schema` probe in the new code +```sql +barriers CTE = gradient + falls + subsurfaceflow -- NO user_definite +... (observation filter, habitat filter, control filter all operate on barriers CTE) +barriers_filtered as (... where n_obs < threshold and h.species_codes is null) +INSERT INTO barriers_ + SELECT * FROM barriers_filtered + UNION ALL + SELECT * FROM bcfishpass.barriers_user_definite WHERE wsg = :wsg -- appended post-filter +``` -`.lnk_pipeline_prep_overrides`'s new control guard reads `cfg$overrides$barriers_definite_control` directly. That field is populated by `lnk_config()` when the manifest declares the key. No DB round-trip needed. +**link today** — `.lnk_pipeline_prep_natural()`: -## Expected rollup direction +```r +CREATE TABLE natural_barriers FROM gradient_barriers_raw -- base +INSERT INTO natural_barriers SELECT FROM falls -- + falls +INSERT INTO natural_barriers SELECT FROM barriers_definite -- + user-definite (WRONG — subjects to override) +``` -Running the pipeline pre-fix vs post-fix on bcfishpass config: +Then `.lnk_pipeline_prep_overrides()` passes `natural_barriers` to `lnk_barrier_overrides()`, which emits per-species override rows for any barrier meeting threshold — including user-definite. -- WSGs with `user_barriers_definite_control.csv` rows having `barrier_ind = TRUE` and upstream observations at those positions → rollup `link_km` shrinks for affected species (positions that were wrongly overridden are no longer overridden). Moves toward bcfishpass reference. -- WSGs with no such rows → rollup unchanged. +## Shape A (chosen) -Magnitude: unknown. Control-TRUE rows on the four validated WSGs are uncommon, so likely small. Direction matters more than magnitude. +1. Drop the `INSERT INTO natural_barriers SELECT FROM barriers_definite` block in `.lnk_pipeline_prep_natural()`. +2. In `.lnk_pipeline_prep_minimal()`, after `frs_barriers_minimal()` emits each per-model reduced table, append `barriers_definite` rows (already WSG-filtered at load time) via `INSERT ... SELECT ... ON CONFLICT DO NOTHING`. Also append to the union that produces `gradient_barriers_minimal` so segmentation breaks include user-definite. -## Reproducibility +## natural_barriers callers -The change is a deterministic additional filter clause on a `LEFT JOIN`. No new randomness, no schedule-dependent behaviour. Two back-to-back `tar_make()` runs must produce bit-identical rollups. Will verify with `digest::digest()`. +Grep confirms `natural_barriers` only referenced in: -## Cross-refs +- `.lnk_pipeline_prep_natural()` (builds) +- `.lnk_pipeline_prep_overrides()` (passes to `lnk_barrier_overrides()`) +- `.lnk_pipeline_prep_minimal()` (reads into `frs_barriers_minimal()`) -- Plan file: `/Users/airvine/.claude/plans/stateful-hopping-feather.md` -- Issue: link#44 -- Parallel cleanup issue (separate PR): link#45 (gradient classes) -- Follow-up to file at end of this PR: "Migrate remaining pipeline probes to manifest-driven gating" +Shape A is safe — no external consumers. diff --git a/planning/active/progress.md b/planning/active/progress.md index 2b5960d..97d9c85 100644 --- a/planning/active/progress.md +++ b/planning/active/progress.md @@ -1,25 +1,9 @@ # Progress -## Session 2026-04-23 +## Session 2026-04-23 — #48 kickoff -- Archived `2026-04-23-targets-pipeline/` — link#38 closed via PRs #41/#42/#43. Three consecutive `tar_make()` runs produced bit-identical rollups. All species within 5% of bcfishpass reference on all four WSGs. -- Branched `44-barriers-definite-control` off main. -- Plan approved. PWF initialized for #44. -- Pre-flight complete: identified the `ctrl_filter` bug in `lnk_barrier_overrides` (all rows block, not just `barrier_ind = TRUE`), and confirmed `.lnk_pipeline_prep_overrides` doesn't pass `control`. Same PR fixes both — filter semantics + missing pass-through. -- Next: Phase 1 — fix `R/lnk_barrier_overrides.R` `ctrl_filter` and add `tests/testthat/test-lnk_barrier_overrides.R`. -- Phase 1 committed (d1a7109) — `NOT EXISTS` control filter, 11 tests, 269 PASS. -- Phase 2 committed (53bedbd) — manifest-gated `control` pass-through in `.lnk_pipeline_prep_overrides`, fixed asymmetric load_aux (schema-valid empty table), 271 PASS. -- Post-Phase-2 `tar_make()` (log: `data-raw/logs/20260423_01_tar_make_post_44.txt`) showed 11–22pp drift AWAY from bcfishpass on ADMS/BABL; BULK/ELKR unchanged. Root cause: bcfishpass applies control filter only in CH/CM/CO/PK/SK and ST models (not BT/WCT/CT/DV/RB). My implementation applied it across all species in the `params` loop. -- Phase 2a: new `observation_control_apply` column in `parameters_fresh.csv` (TRUE for CH/CM/CO/PK/SK/ST; FALSE for BT/WCT; NA for CT/DV/RB), per-species NOT EXISTS gate in `lnk_barrier_overrides()`, three new tests. 279 PASS. Amendment pushed to issue #44 documenting the species-scoped approach and biological rationale. -- Next: Phase 3 — `pak::local_install()`, `tar_make()`, compare rollup to bcfishpass; expected direction — BT/WCT/ST on ADMS/BABL recover to near pre-fix, CH/CM/CO/PK/SK slightly closer to bcfishpass. -- Phase 2a alone was insufficient — CH/CO/SK/ST on ADMS/BABL still drifted -15 to -22pp. Investigation traced the residual to my ctrl_filter also blocking the habitat-path INSERT in lnk_barrier_overrides. bcfishpass's `hab_upstr` CTE has no control join — habitat is higher-trust and bypasses the filter. -- Phase 2b (6f3bc46) — removed ctrl_where/ctrl_filter from habitat INSERT; flipped the "control applies to habitat" test to assert absence; docstring notes habitat bypass. 279 PASS. -- Post-Phase-2b rollup exactly matches pre-fix baseline on all 4 parity WSGs. Investigation showed all 6 TRUE control rows on ADMS/BULK/BABL are rescued by observation threshold or habitat path — filter correctly wired but inactive on these WSGs. -- Phase 2c: province-wide hunt for TRUE control rows with ≥ threshold obs AND zero habitat upstream produced CAMB (11 obs), DEAD (6), LFRA (16 but too large), SALM (7). Picked DEAD — single TRUE control row at FALLS (356361749, 45743) with exactly 6 CH-group obs and zero habitat. Added DEAD to `data-raw/_targets.R`, incremental tar_make builds only comparison_DEAD + rollup (42s). -- DEAD rollup: all species within 3% of bcfishpass reference. Direct inspection of `working_dead.barrier_overrides` at (356361749, 45743): BT only, confirming per-species gate (BT bypass + CH/CM/CO/PK/SK/ST blocked). Commit fb8a0db. -- Log files committed (1c683e3): 20260423_01_phase2, _02_phase2a, _03_phase2b, _04_repro, _05_dead, _06_repro_dead. -- 5-WSG rebuild reproducibility confirmed: two consecutive `tar_destroy + tar_make` produce rollup digest `210c3f8254c47ac88573a80d96a2701e`, 46 rows, identical. -- Phase 4 (f52dcbc): NEWS 0.6.0, DESCRIPTION 0.5.0→0.6.0, research doc (DEAD table + key-fixes row + three-part-fix subsection + DAG update), vignette (5-WSG narrative + pivot column), bcfishpass config README updated, vignette artifacts regenerated. -- Follow-up filed: #46 (migrate `.lnk_pipeline_prep_gradient()` + `.lnk_pipeline_prep_overrides()` probes to manifest-driven gating). -- Branch pushed. PR #47 opened. SRED tag `Relates to NewGraphEnvironment/sred-2025-2026#24` in body. -- Flagged in PR: commit 22ac1dd ("comms(→link): M1 verified as R-worker host") landed on this branch from a parallel session's branch-landing policy; orthogonal to #44 scope. +- PR #47 merged (link 0.6.0, squash `8eda3fb`). Local main rebased onto origin/main; b330672 dropped as empty (already in squash). +- Branched `48-user-barriers-definite-bypass` off main. +- Archived #44 PWF under `planning/archive/2026-04-23-barriers-definite-control/` with README. +- Pre-flight diagnostic (findings.md): ELKR has 4 user-definite override matches that need fixing; other 4 WSGs are empty for barriers_definite. ELKR is the active test case. +- Next: Phase 1 — modify `.lnk_pipeline_prep_natural()` and `.lnk_pipeline_prep_minimal()` per Shape A in findings.md. diff --git a/planning/active/task_plan.md b/planning/active/task_plan.md index 7f8ca92..cb80b75 100644 --- a/planning/active/task_plan.md +++ b/planning/active/task_plan.md @@ -1,92 +1,44 @@ -# Task Plan: Wire barriers_definite_control into lnk_barrier_overrides (#44) +# Task Plan: user_barriers_definite should bypass override (#48) ## Goal -Honour `user_barriers_definite_control.csv`'s `barrier_ind = TRUE` rows at the observation-override step. Positions marked as non-overridable (known fish-blocking dams, long impassable falls, diversions) must never be re-opened by historical upstream observations. Matches bcfishpass's per-species access SQL. +Match bcfishpass's architecture for `user_barriers_definite` rows: they must be appended to each per-model barrier table **post-filter** — always blocking, never eligible for observation override. Same-family fix as #44 but different mechanism. -Bit-identical-across-reruns reproducibility preserved. Rollup direction expected: toward bcfishpass reference, not away. +Pre-fix defect on ELKR confirmed: 4 override rows at user-definite positions (Erickson Creek exclusion, 2× Spillway MISC) that bcfishpass would keep as blockers. -## Phase 1: lnk_barrier_overrides control filter fix +## Phase 1: Code change (Shape A from #48) -- [x] Read `R/lnk_barrier_overrides.R` control block. Confirmed: current filter treated ANY control row as blocking; docstring said only `barrier_ind = TRUE` rows block. -- [x] Updated `ctrl_filter` to `"AND (c.blue_line_key IS NULL OR c.barrier_ind::boolean = false)"`. -- [x] Updated the inline comment to describe the fixed semantics. -- [x] New test file `tests/testthat/test-lnk_barrier_overrides.R` with mocked SQL assertions — 7 tests covering observation-path control filter, NULL-control path, habitat-path control filter. -- [x] `devtools::test()` green: 265 PASS. -- [x] lintr clean on changed R/test files (only pre-existing indentation style notes, consistent with the rest of the codebase). -- [ ] `/code-check` before commit +- [ ] `.lnk_pipeline_prep_natural()` — drop the `INSERT INTO natural_barriers SELECT ... FROM barriers_definite` block. `natural_barriers` becomes gradient + falls only. +- [ ] `.lnk_pipeline_prep_minimal()` — after `frs_barriers_minimal()` runs for each per-model barrier table (`barriers_bt`, `barriers_ch_cm_co_pk_sk`, `barriers_st`, `barriers_wct`), append rows from `.barriers_definite` (already WSG-filtered at load time) into each, de-duped via `ON CONFLICT DO NOTHING`. Also append to `gradient_barriers_minimal` union so segmentation breaks still include them. +- [ ] Check callers of `natural_barriers` outside `.lnk_pipeline_prep_overrides()` and `.lnk_pipeline_prep_minimal()` — if other callers depend on the definite union, Shape A breaks them. (From a quick grep: `natural_barriers` is only referenced in prep_natural, prep_overrides, and prep_minimal.) +- [ ] Update tests in `test-lnk_pipeline_prepare.R` — remove "natural_barriers unions definite" assertion; add "per-model barrier tables include definite" assertion. -## Phase 2: Wire control through .lnk_pipeline_prep_overrides +## Phase 2: Verification -- [x] Updated `.lnk_pipeline_prep_overrides` with manifest-gated `control_arg` computation; passes `control = control_arg` to `lnk_barrier_overrides`. -- [x] Fixed asymmetric gating — `.lnk_pipeline_prep_load_aux` now always creates a schema-valid (possibly empty) `.barriers_definite_control` table when the manifest declares the key, even if the AOI has zero control rows. Mirrors the `barriers_definite` pattern above. Lets `.lnk_pipeline_prep_overrides` gate on the manifest without worrying about the per-AOI row count. -- [x] Two new `.lnk_pipeline_prep_overrides` tests in `test-lnk_pipeline_prepare.R` — manifest present → `control = ".barriers_definite_control"`; manifest absent → `control = NULL`. -- [x] `devtools::test()` green: 271 PASS. -- [x] `/code-check` surfaced the asymmetric-gating bug — fixed and re-verified before commit. +- [ ] `devtools::test()` — all green. +- [ ] `pak::local_install()` and `cd data-raw && tar_destroy + tar_make`. +- [ ] Query `working_elkr.barrier_overrides` joined to `working_elkr.barriers_definite` — should be empty (pre-fix: 4 matches). +- [ ] ELKR rollup should shift toward bcfishpass: link BT/WCT spawning currently +3.4% / +4.0%; expected to DECREASE (closer to 0) since upstream habitat at Erickson and Spillway positions now correctly blocked. +- [ ] Reproducibility: two consecutive `tar_destroy + tar_make` produce bit-identical 46-row rollups. -## Phase 2a: Per-species control gate (observation_control_apply) +## Phase 3: Artifacts -Post-Phase-2 `tar_make()` drifted 11–22pp *away* from bcfishpass on ADMS/BABL because bcfishpass applies the control filter per-species (CH/CM/CO/PK/SK and ST only), while my implementation applied it across all species. Residents (BT, WCT) inhabit reaches upstream of anadromous-blocking falls — their observations should still override. +- [ ] Regenerate vignette artifacts via `data-raw/vignette_reproducing_bcfishpass.R`. +- [ ] Correct vignette text: user-definite barriers bullet no longer says "eligible for per-species override". Say they always block, are appended post-filter (bcfishpass parity). +- [ ] `research/bcfishpass_comparison.md` — new row in "Key fixes" table; update ELKR parity table with post-fix numbers; short paragraph describing the fix. +- [ ] `NEWS.md` 0.7.0 entry. +- [ ] `DESCRIPTION` 0.6.0 → 0.7.0. -- [x] Add `observation_control_apply` column to `inst/extdata/configs/bcfishpass/parameters_fresh.csv`. TRUE for CH/CM/CO/PK/SK/ST; FALSE for BT/WCT; NA for CT/DV/RB. -- [x] `lnk_barrier_overrides()` gates the NOT EXISTS clause per-species on `params$observation_control_apply[i]`. Missing column or NA ⇒ no filter (resident default). -- [x] Updated `@param control` / `@param params` roxygen to document the gate. -- [x] Extended `.stub_params()` in `test-lnk_barrier_overrides.R` with optional `control_apply`. Three new tests: FALSE ⇒ no clause, NA ⇒ no clause, mixed-species params ⇒ per-species gating. -- [x] `devtools::test()`: 279 PASS. -- [x] Amend issue #44 body with Phase 2a scope and biological rationale. -- [x] `/code-check` before commit — two rounds, both Clean. +## Phase 4: Ship -## Phase 2b: Ungate habitat override path from control - -Phase 2a species-gating fixed BT/WCT drift but CH/CM/CO/PK/SK/ST still dropped 11–22pp on ADMS/BABL. Root cause: my `ctrl_filter` was applied to BOTH the observation and habitat paths of `lnk_barrier_overrides()`. bcfishpass's `hab_upstr` CTE has no control join at all — expert-confirmed habitat is higher-trust than the control designation and bypasses the filter. - -- [x] Removed `ctrl_where` / `ctrl_filter` from the habitat INSERT in `lnk_barrier_overrides()`. Observation path unchanged. -- [x] Updated roxygen: control parameter now notes it applies only to observations; habitat bypasses. -- [x] Flipped the existing "control filter applies to habitat too" test to assert the opposite (bcfishpass parity). `devtools::test()` 279 PASS. -- [x] Committed (6f3bc46). -- [x] `tar_make()` — Phase 2b rollup numerically identical to pre-fix baseline on all 34 rows, all 4 WSGs within 5% of bcfishpass reference. - -## Phase 2c: Add DEAD as the filter's end-to-end test WSG - -Discovered post-Phase 2b: none of ADMS/BULK/BABL/ELKR actually exercises the new control filter end-to-end. All 6 TRUE control rows across these WSGs are rescued by either the observation threshold (obs < 5) or the habitat path (classification upstream). That's why post-fix == pre-fix — correct, but information-less. - -Province-wide hunt for TRUE control rows with ≥ threshold observations upstream AND zero habitat coverage turned up 4 candidates: CAMB (11 obs), DEAD (6), LFRA (16, but too large), SALM (7). Picked **DEAD** (Deadman River) — smallest runtime, 6 obs just above CH threshold, single TRUE control row at FALLS (356361749, 45743). bcfishpass reference keeps this fall in `barriers_ch_cm_co_pk_sk` (control worked); pre-fix link would have overridden via observations. - -- [x] Added DEAD to `data-raw/_targets.R` wsgs vector. -- [ ] `tar_make()` incremental — builds `comparison_DEAD` + new rollup (ADMS/BULK/BABL/ELKR cached from Phase 2b run). -- [ ] Verify DEAD's diff_pct on CH/CO/SK/ST is small (post-fix link ≈ bcfishpass — filter working). -- [ ] Verify the specific fall at (356361749, 45743) is NOT in `working_dead.barrier_overrides` for CH/CM/CO/PK/SK/ST (filter blocked the override). - -## Phase 3: End-to-end verification - -- [x] `pak::local_install()` to pick up pipeline changes. -- [x] First post-fix run: `20260423_02_tar_make_phase2a.txt`, `20260423_03_tar_make_phase2b.txt`. -- [x] Inspect rollup against pre-change baseline — matches exactly on 4 WSGs (filter moot on those; DEAD being added to exercise it). -- [ ] Reproducibility run (Phase 2b state): `20260423_04_tar_make_repro.txt` in progress. Rollup must be bit-identical to Phase 2b. -- [ ] `digest::digest()` on two Phase 2b rollup tibbles → same hash. -- [ ] Post-DEAD reproducibility: two consecutive `tar_make()` runs with DEAD present produce bit-identical 5-WSG rollups. - -## Phase 4: Artifact updates - -- [ ] Regenerate vignette data: `Rscript data-raw/vignette_reproducing_bcfishpass.R`. Produces new `rollup.rds` + `sub_ch.rds` + `sub_ch_bcfp.rds`. -- [ ] Render vignette locally to verify pivot tables + map update cleanly -- [ ] Update `research/bcfishpass_comparison.md`: - - Four per-WSG parity tables with new numbers - - Short paragraph under "Key fixes during comparison" documenting the control wiring + numeric direction -- [ ] `NEWS.md` 0.6.0 entry: "Honour `user_barriers_definite_control.csv` at the observation-override step. Previously controlled positions could be re-opened by upstream observations; now they can't." -- [ ] `DESCRIPTION` version bump 0.5.0 → 0.6.0 - -## Phase 5: Ship - -- [ ] `/code-check` on full staged diff -- [ ] Commit atomically per the plan's commit layout -- [ ] Push branch -- [ ] Open PR with SRED tag `Relates to NewGraphEnvironment/sred-2025-2026#24` -- [ ] **File follow-up issue** (before closing PR 44): "Migrate remaining pipeline probes to manifest-driven gating". See `/Users/airvine/.claude/plans/stateful-hopping-feather.md` for scope. +- [ ] `/code-check` on staged diff — 2 rounds minimum. +- [ ] Commit atomically (code + tests, then verification, then artifacts). +- [ ] Push branch. +- [ ] Open PR with SRED tag (`Relates to NewGraphEnvironment/sred-2025-2026#24`), link to #48, note closing of #48. ## Versions at start - fresh: 0.14.0 -- link: main (0.5.0, target 0.6.0) +- link: main (0.6.0, target 0.7.0) - bcfishpass: ea3c5d8 - fwapg: Docker (FWA 20240830) diff --git a/planning/archive/2026-04-23-barriers-definite-control/README.md b/planning/archive/2026-04-23-barriers-definite-control/README.md new file mode 100644 index 0000000..05cb83d --- /dev/null +++ b/planning/archive/2026-04-23-barriers-definite-control/README.md @@ -0,0 +1,10 @@ +# #44 — barriers_definite_control wiring (closed) + +PR #47 merged 2026-04-23 as link 0.6.0 (squash commit `8eda3fb`). + +Wired `user_barriers_definite_control.csv` through `lnk_barrier_overrides()` at the observation-override step: TRUE control rows block observation-based overrides; habitat-path bypasses the filter (bcfishpass parity); per-species gate via new `observation_control_apply` column in `parameters_fresh.csv` (TRUE for CH/CM/CO/PK/SK/ST, FALSE for BT/WCT). Added DEAD (Deadman River) as end-to-end test WSG — single TRUE control row at FALLS (356361749, 45743) with 6 anadromous obs upstream and zero habitat coverage. Reproducibility verified: two consecutive `tar_destroy + tar_make` produce bit-identical 46-row rollups (digest `210c3f8254c47ac88573a80d96a2701e`). + +## Follow-ups filed + +- #46 — Migrate remaining `information_schema` probes to manifest-driven gating +- #48 — `user_barriers_definite` should bypass override per bcfishpass (same family as #44) diff --git a/planning/archive/2026-04-23-barriers-definite-control/findings.md b/planning/archive/2026-04-23-barriers-definite-control/findings.md new file mode 100644 index 0000000..3ee943e --- /dev/null +++ b/planning/archive/2026-04-23-barriers-definite-control/findings.md @@ -0,0 +1,60 @@ +# Findings: Wire barriers_definite_control (#44) + +## Where the gap lives + +Three places where `"barriers_definite_control"` is referenced in link today: + +1. **`R/lnk_pipeline_prepare.R` → `.lnk_pipeline_prep_load_aux`** — loads the per-AOI filtered CSV rows into `.barriers_definite_control` when `cfg$overrides$barriers_definite_control` is non-NULL. Already correct. +2. **`R/lnk_pipeline_prepare.R` → `.lnk_pipeline_prep_gradient`** — `information_schema` probe for the table, then `DELETE FROM gradient_barriers_raw g USING barriers_definite_control c WHERE ... c.barrier_ind::boolean = false`. Already correct. Removes **passable** positions from gradient set before minimal reduction. +3. **`R/lnk_pipeline_prepare.R` → `.lnk_pipeline_prep_overrides`** — does NOT pass `control` to `lnk_barrier_overrides`. This is the gap. `lnk_barrier_overrides` accepts a `control` parameter but is called without one from this site. + +## Latent bug in lnk_barrier_overrides control filter + +Read `R/lnk_barrier_overrides.R` lines 140–153. The implementation: + +```r +ctrl_where <- sprintf("LEFT JOIN %s c ON b.blue_line_key = c.blue_line_key + AND abs(b.downstream_route_measure - c.downstream_route_measure) < 1", control) +ctrl_filter <- "AND c.blue_line_key IS NULL" +``` + +Filter treats ANY control row as blocking override — including `barrier_ind = FALSE` rows. Docstring (lines 27–30) says only `barrier_ind = TRUE` rows block. + +In practice on bcfishpass input this is masked because `.lnk_pipeline_prep_gradient`'s upstream DELETE removes `barrier_ind = FALSE` positions from `gradient_barriers_raw` before they reach the override step. But falls and user-definite positions are not pruned by control at load time — they stay in `natural_barriers`. If a control row with `barrier_ind = FALSE` exists for a fall or definite-barrier position, the current filter blocks observation overrides on it. Should not block. + +Fix: `"AND (c.blue_line_key IS NULL OR c.barrier_ind::boolean = false)"`. + +## Manifest-driven gating decision + +`.lnk_pipeline_prep_overrides` could probe `information_schema.tables` to discover whether the control table exists (same pattern used there for habitat). Decided against: the manifest key is the direct contract. If `cfg$overrides$barriers_definite_control` is non-NULL the load step wrote the table; if it's NULL no table exists. Manifest gate, not DB probe. + +Scope discipline: the existing `information_schema` probe for the habitat table in the same function, and the similar probe in `.lnk_pipeline_prep_gradient` for the control table, work correctly today. Leaving them alone in this PR; filing a follow-up issue for consistency. Using the manifest as the contract is well preferred across the package. + +## Tests that need to exist + +- `tests/testthat/test-lnk_barrier_overrides.R` does not exist. Creating new. +- `tests/testthat/test-lnk_pipeline_prepare.R` exists — extending with prep_overrides control pass-through tests. + +## No `information_schema` probe in the new code + +`.lnk_pipeline_prep_overrides`'s new control guard reads `cfg$overrides$barriers_definite_control` directly. That field is populated by `lnk_config()` when the manifest declares the key. No DB round-trip needed. + +## Expected rollup direction + +Running the pipeline pre-fix vs post-fix on bcfishpass config: + +- WSGs with `user_barriers_definite_control.csv` rows having `barrier_ind = TRUE` and upstream observations at those positions → rollup `link_km` shrinks for affected species (positions that were wrongly overridden are no longer overridden). Moves toward bcfishpass reference. +- WSGs with no such rows → rollup unchanged. + +Magnitude: unknown. Control-TRUE rows on the four validated WSGs are uncommon, so likely small. Direction matters more than magnitude. + +## Reproducibility + +The change is a deterministic additional filter clause on a `LEFT JOIN`. No new randomness, no schedule-dependent behaviour. Two back-to-back `tar_make()` runs must produce bit-identical rollups. Will verify with `digest::digest()`. + +## Cross-refs + +- Plan file: `/Users/airvine/.claude/plans/stateful-hopping-feather.md` +- Issue: link#44 +- Parallel cleanup issue (separate PR): link#45 (gradient classes) +- Follow-up to file at end of this PR: "Migrate remaining pipeline probes to manifest-driven gating" diff --git a/planning/archive/2026-04-23-barriers-definite-control/progress.md b/planning/archive/2026-04-23-barriers-definite-control/progress.md new file mode 100644 index 0000000..2b5960d --- /dev/null +++ b/planning/archive/2026-04-23-barriers-definite-control/progress.md @@ -0,0 +1,25 @@ +# Progress + +## Session 2026-04-23 + +- Archived `2026-04-23-targets-pipeline/` — link#38 closed via PRs #41/#42/#43. Three consecutive `tar_make()` runs produced bit-identical rollups. All species within 5% of bcfishpass reference on all four WSGs. +- Branched `44-barriers-definite-control` off main. +- Plan approved. PWF initialized for #44. +- Pre-flight complete: identified the `ctrl_filter` bug in `lnk_barrier_overrides` (all rows block, not just `barrier_ind = TRUE`), and confirmed `.lnk_pipeline_prep_overrides` doesn't pass `control`. Same PR fixes both — filter semantics + missing pass-through. +- Next: Phase 1 — fix `R/lnk_barrier_overrides.R` `ctrl_filter` and add `tests/testthat/test-lnk_barrier_overrides.R`. +- Phase 1 committed (d1a7109) — `NOT EXISTS` control filter, 11 tests, 269 PASS. +- Phase 2 committed (53bedbd) — manifest-gated `control` pass-through in `.lnk_pipeline_prep_overrides`, fixed asymmetric load_aux (schema-valid empty table), 271 PASS. +- Post-Phase-2 `tar_make()` (log: `data-raw/logs/20260423_01_tar_make_post_44.txt`) showed 11–22pp drift AWAY from bcfishpass on ADMS/BABL; BULK/ELKR unchanged. Root cause: bcfishpass applies control filter only in CH/CM/CO/PK/SK and ST models (not BT/WCT/CT/DV/RB). My implementation applied it across all species in the `params` loop. +- Phase 2a: new `observation_control_apply` column in `parameters_fresh.csv` (TRUE for CH/CM/CO/PK/SK/ST; FALSE for BT/WCT; NA for CT/DV/RB), per-species NOT EXISTS gate in `lnk_barrier_overrides()`, three new tests. 279 PASS. Amendment pushed to issue #44 documenting the species-scoped approach and biological rationale. +- Next: Phase 3 — `pak::local_install()`, `tar_make()`, compare rollup to bcfishpass; expected direction — BT/WCT/ST on ADMS/BABL recover to near pre-fix, CH/CM/CO/PK/SK slightly closer to bcfishpass. +- Phase 2a alone was insufficient — CH/CO/SK/ST on ADMS/BABL still drifted -15 to -22pp. Investigation traced the residual to my ctrl_filter also blocking the habitat-path INSERT in lnk_barrier_overrides. bcfishpass's `hab_upstr` CTE has no control join — habitat is higher-trust and bypasses the filter. +- Phase 2b (6f3bc46) — removed ctrl_where/ctrl_filter from habitat INSERT; flipped the "control applies to habitat" test to assert absence; docstring notes habitat bypass. 279 PASS. +- Post-Phase-2b rollup exactly matches pre-fix baseline on all 4 parity WSGs. Investigation showed all 6 TRUE control rows on ADMS/BULK/BABL are rescued by observation threshold or habitat path — filter correctly wired but inactive on these WSGs. +- Phase 2c: province-wide hunt for TRUE control rows with ≥ threshold obs AND zero habitat upstream produced CAMB (11 obs), DEAD (6), LFRA (16 but too large), SALM (7). Picked DEAD — single TRUE control row at FALLS (356361749, 45743) with exactly 6 CH-group obs and zero habitat. Added DEAD to `data-raw/_targets.R`, incremental tar_make builds only comparison_DEAD + rollup (42s). +- DEAD rollup: all species within 3% of bcfishpass reference. Direct inspection of `working_dead.barrier_overrides` at (356361749, 45743): BT only, confirming per-species gate (BT bypass + CH/CM/CO/PK/SK/ST blocked). Commit fb8a0db. +- Log files committed (1c683e3): 20260423_01_phase2, _02_phase2a, _03_phase2b, _04_repro, _05_dead, _06_repro_dead. +- 5-WSG rebuild reproducibility confirmed: two consecutive `tar_destroy + tar_make` produce rollup digest `210c3f8254c47ac88573a80d96a2701e`, 46 rows, identical. +- Phase 4 (f52dcbc): NEWS 0.6.0, DESCRIPTION 0.5.0→0.6.0, research doc (DEAD table + key-fixes row + three-part-fix subsection + DAG update), vignette (5-WSG narrative + pivot column), bcfishpass config README updated, vignette artifacts regenerated. +- Follow-up filed: #46 (migrate `.lnk_pipeline_prep_gradient()` + `.lnk_pipeline_prep_overrides()` probes to manifest-driven gating). +- Branch pushed. PR #47 opened. SRED tag `Relates to NewGraphEnvironment/sred-2025-2026#24` in body. +- Flagged in PR: commit 22ac1dd ("comms(→link): M1 verified as R-worker host") landed on this branch from a parallel session's branch-landing policy; orthogonal to #44 scope. diff --git a/planning/archive/2026-04-23-barriers-definite-control/task_plan.md b/planning/archive/2026-04-23-barriers-definite-control/task_plan.md new file mode 100644 index 0000000..7f8ca92 --- /dev/null +++ b/planning/archive/2026-04-23-barriers-definite-control/task_plan.md @@ -0,0 +1,92 @@ +# Task Plan: Wire barriers_definite_control into lnk_barrier_overrides (#44) + +## Goal + +Honour `user_barriers_definite_control.csv`'s `barrier_ind = TRUE` rows at the observation-override step. Positions marked as non-overridable (known fish-blocking dams, long impassable falls, diversions) must never be re-opened by historical upstream observations. Matches bcfishpass's per-species access SQL. + +Bit-identical-across-reruns reproducibility preserved. Rollup direction expected: toward bcfishpass reference, not away. + +## Phase 1: lnk_barrier_overrides control filter fix + +- [x] Read `R/lnk_barrier_overrides.R` control block. Confirmed: current filter treated ANY control row as blocking; docstring said only `barrier_ind = TRUE` rows block. +- [x] Updated `ctrl_filter` to `"AND (c.blue_line_key IS NULL OR c.barrier_ind::boolean = false)"`. +- [x] Updated the inline comment to describe the fixed semantics. +- [x] New test file `tests/testthat/test-lnk_barrier_overrides.R` with mocked SQL assertions — 7 tests covering observation-path control filter, NULL-control path, habitat-path control filter. +- [x] `devtools::test()` green: 265 PASS. +- [x] lintr clean on changed R/test files (only pre-existing indentation style notes, consistent with the rest of the codebase). +- [ ] `/code-check` before commit + +## Phase 2: Wire control through .lnk_pipeline_prep_overrides + +- [x] Updated `.lnk_pipeline_prep_overrides` with manifest-gated `control_arg` computation; passes `control = control_arg` to `lnk_barrier_overrides`. +- [x] Fixed asymmetric gating — `.lnk_pipeline_prep_load_aux` now always creates a schema-valid (possibly empty) `.barriers_definite_control` table when the manifest declares the key, even if the AOI has zero control rows. Mirrors the `barriers_definite` pattern above. Lets `.lnk_pipeline_prep_overrides` gate on the manifest without worrying about the per-AOI row count. +- [x] Two new `.lnk_pipeline_prep_overrides` tests in `test-lnk_pipeline_prepare.R` — manifest present → `control = ".barriers_definite_control"`; manifest absent → `control = NULL`. +- [x] `devtools::test()` green: 271 PASS. +- [x] `/code-check` surfaced the asymmetric-gating bug — fixed and re-verified before commit. + +## Phase 2a: Per-species control gate (observation_control_apply) + +Post-Phase-2 `tar_make()` drifted 11–22pp *away* from bcfishpass on ADMS/BABL because bcfishpass applies the control filter per-species (CH/CM/CO/PK/SK and ST only), while my implementation applied it across all species. Residents (BT, WCT) inhabit reaches upstream of anadromous-blocking falls — their observations should still override. + +- [x] Add `observation_control_apply` column to `inst/extdata/configs/bcfishpass/parameters_fresh.csv`. TRUE for CH/CM/CO/PK/SK/ST; FALSE for BT/WCT; NA for CT/DV/RB. +- [x] `lnk_barrier_overrides()` gates the NOT EXISTS clause per-species on `params$observation_control_apply[i]`. Missing column or NA ⇒ no filter (resident default). +- [x] Updated `@param control` / `@param params` roxygen to document the gate. +- [x] Extended `.stub_params()` in `test-lnk_barrier_overrides.R` with optional `control_apply`. Three new tests: FALSE ⇒ no clause, NA ⇒ no clause, mixed-species params ⇒ per-species gating. +- [x] `devtools::test()`: 279 PASS. +- [x] Amend issue #44 body with Phase 2a scope and biological rationale. +- [x] `/code-check` before commit — two rounds, both Clean. + +## Phase 2b: Ungate habitat override path from control + +Phase 2a species-gating fixed BT/WCT drift but CH/CM/CO/PK/SK/ST still dropped 11–22pp on ADMS/BABL. Root cause: my `ctrl_filter` was applied to BOTH the observation and habitat paths of `lnk_barrier_overrides()`. bcfishpass's `hab_upstr` CTE has no control join at all — expert-confirmed habitat is higher-trust than the control designation and bypasses the filter. + +- [x] Removed `ctrl_where` / `ctrl_filter` from the habitat INSERT in `lnk_barrier_overrides()`. Observation path unchanged. +- [x] Updated roxygen: control parameter now notes it applies only to observations; habitat bypasses. +- [x] Flipped the existing "control filter applies to habitat too" test to assert the opposite (bcfishpass parity). `devtools::test()` 279 PASS. +- [x] Committed (6f3bc46). +- [x] `tar_make()` — Phase 2b rollup numerically identical to pre-fix baseline on all 34 rows, all 4 WSGs within 5% of bcfishpass reference. + +## Phase 2c: Add DEAD as the filter's end-to-end test WSG + +Discovered post-Phase 2b: none of ADMS/BULK/BABL/ELKR actually exercises the new control filter end-to-end. All 6 TRUE control rows across these WSGs are rescued by either the observation threshold (obs < 5) or the habitat path (classification upstream). That's why post-fix == pre-fix — correct, but information-less. + +Province-wide hunt for TRUE control rows with ≥ threshold observations upstream AND zero habitat coverage turned up 4 candidates: CAMB (11 obs), DEAD (6), LFRA (16, but too large), SALM (7). Picked **DEAD** (Deadman River) — smallest runtime, 6 obs just above CH threshold, single TRUE control row at FALLS (356361749, 45743). bcfishpass reference keeps this fall in `barriers_ch_cm_co_pk_sk` (control worked); pre-fix link would have overridden via observations. + +- [x] Added DEAD to `data-raw/_targets.R` wsgs vector. +- [ ] `tar_make()` incremental — builds `comparison_DEAD` + new rollup (ADMS/BULK/BABL/ELKR cached from Phase 2b run). +- [ ] Verify DEAD's diff_pct on CH/CO/SK/ST is small (post-fix link ≈ bcfishpass — filter working). +- [ ] Verify the specific fall at (356361749, 45743) is NOT in `working_dead.barrier_overrides` for CH/CM/CO/PK/SK/ST (filter blocked the override). + +## Phase 3: End-to-end verification + +- [x] `pak::local_install()` to pick up pipeline changes. +- [x] First post-fix run: `20260423_02_tar_make_phase2a.txt`, `20260423_03_tar_make_phase2b.txt`. +- [x] Inspect rollup against pre-change baseline — matches exactly on 4 WSGs (filter moot on those; DEAD being added to exercise it). +- [ ] Reproducibility run (Phase 2b state): `20260423_04_tar_make_repro.txt` in progress. Rollup must be bit-identical to Phase 2b. +- [ ] `digest::digest()` on two Phase 2b rollup tibbles → same hash. +- [ ] Post-DEAD reproducibility: two consecutive `tar_make()` runs with DEAD present produce bit-identical 5-WSG rollups. + +## Phase 4: Artifact updates + +- [ ] Regenerate vignette data: `Rscript data-raw/vignette_reproducing_bcfishpass.R`. Produces new `rollup.rds` + `sub_ch.rds` + `sub_ch_bcfp.rds`. +- [ ] Render vignette locally to verify pivot tables + map update cleanly +- [ ] Update `research/bcfishpass_comparison.md`: + - Four per-WSG parity tables with new numbers + - Short paragraph under "Key fixes during comparison" documenting the control wiring + numeric direction +- [ ] `NEWS.md` 0.6.0 entry: "Honour `user_barriers_definite_control.csv` at the observation-override step. Previously controlled positions could be re-opened by upstream observations; now they can't." +- [ ] `DESCRIPTION` version bump 0.5.0 → 0.6.0 + +## Phase 5: Ship + +- [ ] `/code-check` on full staged diff +- [ ] Commit atomically per the plan's commit layout +- [ ] Push branch +- [ ] Open PR with SRED tag `Relates to NewGraphEnvironment/sred-2025-2026#24` +- [ ] **File follow-up issue** (before closing PR 44): "Migrate remaining pipeline probes to manifest-driven gating". See `/Users/airvine/.claude/plans/stateful-hopping-feather.md` for scope. + +## Versions at start + +- fresh: 0.14.0 +- link: main (0.5.0, target 0.6.0) +- bcfishpass: ea3c5d8 +- fwapg: Docker (FWA 20240830) From 35d262e1d9fc17f7781ba420f327fc9086d48c2f Mon Sep 17 00:00:00 2001 From: almac2022 Date: Thu, 23 Apr 2026 13:30:11 -0700 Subject: [PATCH 2/5] Drop user-definite from natural_barriers (bcfishpass parity) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously .lnk_pipeline_prep_natural() unioned barriers_definite into natural_barriers. That table is the set passed to lnk_barrier_overrides() as the 'barriers' argument, which emits per-species override rows when observations upstream clear the threshold. Net effect: user-identified definite barriers (EXCLUSION zones, MISC reviewer-added positions) could be re-opened by historical observations. Confirmed active on ELKR at pre-fix: 4 rows in working_elkr.barrier_overrides matched working_elkr.barriers_definite positions (Erickson Creek exclusion + two Spillway MISC entries). bcfishpass treats user-definite barriers differently. Each model_access_*.sql builds its barriers CTE from gradient + falls + subsurfaceflow (no user-definite); observations and habitat filters run only on that set. user_barriers_definite rows are then appended post-filter to the final per-model table via UNION ALL. They always block, never eligible for observation override. Matching that here — dropped the INSERT INTO natural_barriers FROM barriers_definite block. barriers_definite is still consumed separately: - lnk_pipeline_break() applies it as a sequential break source, so segmentation still places a boundary at each user-definite position - lnk_pipeline_classify() UNION ALLs it directly into fresh.streams_breaks, so it blocks access gating Test assertion flipped from 'unions gradient + falls + definite' to 'unions gradient + falls only (no definite)'. Roxygen on the exported lnk_pipeline_prepare() and on the @noRd helper one-liner updated to reflect the new shape; both note bcfishpass parity. Relates to #48 --- R/lnk_pipeline_prepare.R | 27 +++++++++++----------- man/lnk_barrier_overrides.Rd | 15 +++++++++--- man/lnk_pipeline_prepare.Rd | 6 +++-- tests/testthat/test-lnk_pipeline_prepare.R | 9 ++++++-- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/R/lnk_pipeline_prepare.R b/R/lnk_pipeline_prepare.R index 4979e6a..7e8f6c6 100644 --- a/R/lnk_pipeline_prepare.R +++ b/R/lnk_pipeline_prepare.R @@ -11,8 +11,10 @@ #' [fresh::frs_break_find()], pruned against the control table, #' enriched with `wscode_ltree` and `localcode_ltree` for #' `fwa_upstream()` joins -#' - A natural-barriers table (gradient + falls + definite) used by -#' `lnk_barrier_overrides()` to compute the per-species skip list +#' - A natural-barriers table (gradient + falls) used by +#' `lnk_barrier_overrides()` to compute the per-species skip list. +#' User-definite barriers are intentionally excluded here and +#' consumed by later phases directly — bcfishpass parity. #' - Per-model barrier tables reduced to the minimal downstream-most #' set via [fresh::frs_barriers_minimal()], then unioned into #' `gradient_barriers_minimal` for segmentation @@ -214,7 +216,7 @@ lnk_pipeline_prepare <- function(conn, aoi, cfg, schema, } -#' Build natural-barriers table (gradient + falls + definite) with ltree +#' Build natural-barriers table (gradient + falls) with ltree #' @noRd .lnk_pipeline_prep_natural <- function(conn, schema) { .lnk_db_execute(conn, sprintf( @@ -240,16 +242,15 @@ lnk_pipeline_prepare <- function(conn, aoi, cfg, schema, AND f.downstream_route_measure >= s.downstream_route_measure AND f.downstream_route_measure < s.upstream_route_measure", schema, schema)) - .lnk_db_execute(conn, sprintf( - "INSERT INTO %s.natural_barriers - SELECT d.blue_line_key, round(d.downstream_route_measure), - 'blocked', s.wscode_ltree, s.localcode_ltree - FROM %s.barriers_definite d - JOIN whse_basemapping.fwa_stream_networks_sp s - ON d.blue_line_key = s.blue_line_key - AND d.downstream_route_measure >= s.downstream_route_measure - AND d.downstream_route_measure < s.upstream_route_measure", - schema, schema)) + # NOTE: `barriers_definite` is NOT unioned into `natural_barriers`. + # bcfishpass appends user-definite post-filter in + # `model_access_*.sql`, so upstream observations and habitat never + # re-open them. link mirrors this by consuming `barriers_definite` + # separately: + # - `lnk_pipeline_break()` applies it as its own sequential break + # source (so segmentation still places a boundary there) + # - `lnk_pipeline_classify()` UNION ALLs it directly into + # `fresh.streams_breaks` (so it blocks access gating) invisible(NULL) } diff --git a/man/lnk_barrier_overrides.Rd b/man/lnk_barrier_overrides.Rd index e585691..8e0bd51 100644 --- a/man/lnk_barrier_overrides.Rd +++ b/man/lnk_barrier_overrides.Rd @@ -41,12 +41,21 @@ observations are removed before counting.} \item{control}{Character or \code{NULL}. Schema-qualified table of barrier controls with columns: \code{blue_line_key}, \code{downstream_route_measure}, \code{barrier_ind}. Barriers in this table with \code{barrier_ind = TRUE} cannot -be overridden.} +be overridden \strong{by observations} — but only for species where +\code{params$observation_control_apply} is TRUE. Resident species routinely +inhabit reaches upstream of anadromous-blocking falls (post-glacial +connectivity, no ocean-return requirement), so their observations still +count unless this flag says otherwise. Habitat confirmations +(\code{habitat} argument) are higher-trust than observations — they bypass +the control table entirely, for all species.} \item{params}{Data frame with per-species parameters. Must have columns: \code{species_code}, \code{observation_threshold}, \code{observation_date_min}, -\code{observation_buffer_m}, \code{observation_species}. See -\code{configs/bcfishpass/parameters_fresh.csv} for format.} +\code{observation_buffer_m}, \code{observation_species}. Optional column +\code{observation_control_apply} (logical) — when TRUE, the \code{control} table +blocks overrides for this species; when FALSE/NA/missing, the species +ignores control. Bcfishpass defaults: TRUE for CH/CM/CO/PK/SK/ST, +FALSE for BT/WCT. See \code{configs/bcfishpass/parameters_fresh.csv}.} \item{cols_index}{Character vector. Column names to index on the barriers table for \code{fwa_upstream()} performance. Indexes are created diff --git a/man/lnk_pipeline_prepare.Rd b/man/lnk_pipeline_prepare.Rd index 746f339..ea7efb4 100644 --- a/man/lnk_pipeline_prepare.Rd +++ b/man/lnk_pipeline_prepare.Rd @@ -45,8 +45,10 @@ habitat confirmation CSVs from the config bundle \code{\link[fresh:frs_break_find]{fresh::frs_break_find()}}, pruned against the control table, enriched with \code{wscode_ltree} and \code{localcode_ltree} for \code{fwa_upstream()} joins -\item A natural-barriers table (gradient + falls + definite) used by -\code{lnk_barrier_overrides()} to compute the per-species skip list +\item A natural-barriers table (gradient + falls) used by +\code{lnk_barrier_overrides()} to compute the per-species skip list. +User-definite barriers are intentionally excluded here and +consumed by later phases directly — bcfishpass parity. \item Per-model barrier tables reduced to the minimal downstream-most set via \code{\link[fresh:frs_barriers_minimal]{fresh::frs_barriers_minimal()}}, then unioned into \code{gradient_barriers_minimal} for segmentation diff --git a/tests/testthat/test-lnk_pipeline_prepare.R b/tests/testthat/test-lnk_pipeline_prepare.R index 49f42ed..3d08904 100644 --- a/tests/testthat/test-lnk_pipeline_prepare.R +++ b/tests/testthat/test-lnk_pipeline_prepare.R @@ -105,7 +105,12 @@ test_that(".lnk_pipeline_prep_gradient prunes by control when control table exis # -- prep_natural SQL shape ------------------------------------------------- -test_that(".lnk_pipeline_prep_natural unions gradient + falls + definite", { +test_that(".lnk_pipeline_prep_natural unions gradient + falls only (no definite)", { + # barriers_definite is intentionally NOT unioned into natural_barriers — + # bcfishpass appends user-definite post-filter in each model_access_*.sql, + # so observations/habitat never override them. lnk_pipeline_break handles + # them as a separate break source; lnk_pipeline_classify emits them into + # fresh.streams_breaks directly. captured <- character(0) local_mocked_bindings( .lnk_db_execute = function(conn, sql) { @@ -120,7 +125,7 @@ test_that(".lnk_pipeline_prep_natural unions gradient + falls + definite", { expect_match(joined, "CREATE TABLE w_bulk.natural_barriers") expect_match(joined, "FROM w_bulk.gradient_barriers_raw g") expect_match(joined, "FROM w_bulk.falls f") - expect_match(joined, "FROM w_bulk.barriers_definite d") + expect_no_match(joined, "FROM w_bulk\\.barriers_definite\\b") expect_match(joined, "'blocked'") }) From 3ef7e0c50e2230d6f3f52a9c6c388b67d9749ae6 Mon Sep 17 00:00:00 2001 From: almac2022 Date: Thu, 23 Apr 2026 13:53:06 -0700 Subject: [PATCH 3/5] Bump to 0.7.0: NEWS, DESCRIPTION, research doc, vignette, artifacts Phase 3 of #48. Numerical artifacts regenerated from the post-fix pipeline; narrative updates document the user-definite bypass. - DESCRIPTION: Version 0.6.0 -> 0.7.0 - NEWS.md: 0.7.0 entry covering the natural_barriers drop, why bcfishpass's post-filter UNION ALL is the correct shape, ELKR shift numbers, and the scope-of-fix summary on each WSG. - inst/extdata/vignette-data/*.rds: regenerated from data-raw/vignette_reproducing_bcfishpass.R against the current tar_make rollup (46 rows, bit-identical across two full rebuilds; digest 50908d234e2131fc0842dc3ab653ae78). - research/bcfishpass_comparison.md: updates ELKR parity table with post-fix numbers and a line of pre-fix context. Adds a row to the "Key fixes" table and a new subsection "user_barriers_definite bypass (#48)" mirroring the format used for the #44 subsection. - vignettes/reproducing-bcfishpass.Rmd: corrects the user-identified- definite-barriers bullet. Old text said "eligible for per-species override via lnk_barrier_overrides when enough upstream observations clear the threshold" (accurate to pre-#48 code, wrong vs bcfishpass). New text: "always-blocking, always a break position, never eligible for observation-based override" with the bcfishpass UNION ALL reference. - data-raw/logs/: 20260423_07 and _08 run logs. - planning: Phase 1 checkbox in task_plan.md. Reproducibility verified: two consecutive tar_destroy + tar_make runs produce bit-identical 46-row rollups. Relates to #48 --- DESCRIPTION | 2 +- NEWS.md | 8 + .../logs/20260423_07_tar_make_48_run1.txt | 365 ++++++++++++++++++ .../logs/20260423_08_tar_make_48_repro.txt | 365 ++++++++++++++++++ inst/extdata/vignette-data/rollup.rds | Bin 866 -> 869 bytes inst/extdata/vignette-data/sub_ch.rds | Bin 31919 -> 31964 bytes inst/extdata/vignette-data/sub_ch_bcfp.rds | Bin 30376 -> 30341 bytes planning/active/task_plan.md | 14 +- research/bcfishpass_comparison.md | 15 +- vignettes/reproducing-bcfishpass.Rmd | 11 +- 10 files changed, 768 insertions(+), 12 deletions(-) create mode 100644 data-raw/logs/20260423_07_tar_make_48_run1.txt create mode 100644 data-raw/logs/20260423_08_tar_make_48_repro.txt diff --git a/DESCRIPTION b/DESCRIPTION index b5031c9..54b5bdf 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: link Title: Crossing Connectivity Interpretation -Version: 0.6.0 +Version: 0.7.0 Authors@R: person("Allan", "Irvine", , "airvine@newgraphenvironment.com", role = c("aut", "cre"), diff --git a/NEWS.md b/NEWS.md index 73548fd..8c7ab74 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,11 @@ +# link 0.7.0 + +`user_barriers_definite` no longer eligible for observation-based override ([#48](https://github.com/NewGraphEnvironment/link/issues/48)). + +- `.lnk_pipeline_prep_natural()` previously unioned `barriers_definite` into `natural_barriers`, which `lnk_barrier_overrides()` iterates over. Net effect: the 227 reviewer-added user-definite positions (EXCLUSION zones, MISC detections the model misses) could be re-opened by observations clearing the species threshold. Confirmed active on ELKR pre-fix — 4 override rows at Erickson Creek exclusion and Spillway MISC positions that bcfishpass keeps as permanent barriers. +- bcfishpass's `model_access_*.sql` builds the barriers CTE from gradient + falls + subsurfaceflow only and appends `barriers_user_definite` post-filter via `UNION ALL`. Observations and habitat filters never see user-definite rows, so they're never overridable. link now matches this shape: `natural_barriers` is gradient + falls only; `barriers_definite` stays consumed separately as a break source in `lnk_pipeline_break()` and as a direct `UNION ALL` entry into `fresh.streams_breaks` via `lnk_pipeline_classify()`. +- ELKR rollup shifts toward bcfishpass: BT spawning +3.4% → +2.8%, WCT spawning +4.0% → +2.6%, WCT rearing +1.6% → +0.3%. Other four WSGs unchanged (ADMS/BABL/DEAD have empty `barriers_definite`; BULK has 87 rows but no observation-threshold matches to any of them). + # link 0.6.0 Honour `user_barriers_definite_control.csv` at the observation-override step. diff --git a/data-raw/logs/20260423_07_tar_make_48_run1.txt b/data-raw/logs/20260423_07_tar_make_48_run1.txt new file mode 100644 index 0000000..b4e0623 --- /dev/null +++ b/data-raw/logs/20260423_07_tar_make_48_run1.txt @@ -0,0 +1,365 @@ ++ cfg dispatched +✔ cfg completed [244ms, 296.48 kB] ++ comparison_BABL dispatched +NOTICE: schema "fresh" already exists, skipping + +NOTICE: table "barriers_definite" does not exist, skipping + +NOTICE: table "streams_blk" does not exist, skipping + +NOTICE: table "gradient_barriers_raw" does not exist, skipping + +NOTICE: table "natural_barriers" does not exist, skipping + +NOTICE: table "barrier_overrides" does not exist, skipping + +NOTICE: table "barriers_bt" does not exist, skipping + +NOTICE: table "barriers_bt_min" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk_min" does not exist, skipping + +NOTICE: table "barriers_st" does not exist, skipping + +NOTICE: table "barriers_st_min" does not exist, skipping + +NOTICE: table "barriers_wct" does not exist, skipping + +NOTICE: table "barriers_wct_min" does not exist, skipping + +NOTICE: table "gradient_barriers_minimal" does not exist, skipping + +NOTICE: table "streams" does not exist, skipping + +NOTICE: table "streams_habitat" does not exist, skipping + +NOTICE: table "observations_breaks" does not exist, skipping + +NOTICE: table "habitat_endpoints" does not exist, skipping + +NOTICE: table "crossings_breaks" does not exist, skipping + +NOTICE: table "streams_breaks" does not exist, skipping + +NOTICE: relation "streams_id_segment_idx" already exists, skipping + +NOTICE: table "streams_acc_015" does not exist, skipping + +NOTICE: table "streams_acc_02" does not exist, skipping + +NOTICE: table "streams_acc_025" does not exist, skipping + +NOTICE: table "streams_acc_025_ovr_bt" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_ch" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_co" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_sk" does not exist, skipping + +NOTICE: table "streams_acc_02_ovr_st" does not exist, skipping + +NOTICE: table "frs_clusters_bt" does not exist, skipping + +NOTICE: table "frs_clusters_ch" does not exist, skipping + +NOTICE: table "frs_clusters_co" does not exist, skipping + +NOTICE: table "frs_clusters_sk" does not exist, skipping + +NOTICE: table "frs_qual_spawn_sk" does not exist, skipping + +NOTICE: table "frs_trace_lfid_sk" does not exist, skipping + +NOTICE: table "frs_clusters_st" does not exist, skipping + +✔ comparison_BABL completed [1m 47.6s, 416 B] ++ comparison_ELKR dispatched +NOTICE: schema "fresh" already exists, skipping + +Override validation: working_elkr.pscis_fixes vs working_elkr.crossings + Total overrides: 324 + Valid (matched): 288 + Orphans: 36 <-- not found in crossings + Duplicates: 0 +Updated 288 of 7306 rows (barrier_status) +NOTICE: table "barriers_definite_control" does not exist, skipping + +NOTICE: table "streams_blk" does not exist, skipping + +NOTICE: table "gradient_barriers_raw" does not exist, skipping + +NOTICE: table "natural_barriers" does not exist, skipping + +NOTICE: table "barrier_overrides" does not exist, skipping + +NOTICE: table "barriers_bt" does not exist, skipping + +NOTICE: table "barriers_bt_min" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk_min" does not exist, skipping + +NOTICE: table "barriers_st" does not exist, skipping + +NOTICE: table "barriers_st_min" does not exist, skipping + +NOTICE: table "barriers_wct" does not exist, skipping + +NOTICE: table "barriers_wct_min" does not exist, skipping + +NOTICE: table "gradient_barriers_minimal" does not exist, skipping + +NOTICE: table "streams" does not exist, skipping + +NOTICE: table "streams_habitat" does not exist, skipping + +NOTICE: table "observations_breaks" does not exist, skipping + +NOTICE: table "habitat_endpoints" does not exist, skipping + +NOTICE: table "crossings_breaks" does not exist, skipping + +NOTICE: table "streams_breaks" does not exist, skipping + +NOTICE: relation "streams_id_segment_idx" already exists, skipping + +NOTICE: table "streams_acc_02" does not exist, skipping + +NOTICE: table "streams_acc_025" does not exist, skipping + +NOTICE: table "streams_acc_025_ovr_bt" does not exist, skipping + +NOTICE: table "streams_acc_02_ovr_wct" does not exist, skipping + +NOTICE: table "frs_clusters_bt" does not exist, skipping + +NOTICE: table "frs_clusters_wct" does not exist, skipping + +✔ comparison_ELKR completed [2m 36.6s, 318 B] ++ comparison_BULK dispatched +NOTICE: schema "fresh" already exists, skipping + +Override validation: working_bulk.pscis_fixes vs working_bulk.crossings + Total overrides: 580 + Valid (matched): 514 + Orphans: 66 <-- not found in crossings + Duplicates: 0 +Updated 514 of 5568 rows (barrier_status) +NOTICE: table "streams_blk" does not exist, skipping + +NOTICE: table "gradient_barriers_raw" does not exist, skipping + +NOTICE: table "natural_barriers" does not exist, skipping + +NOTICE: table "barrier_overrides" does not exist, skipping + +NOTICE: table "barriers_bt" does not exist, skipping + +NOTICE: table "barriers_bt_min" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk_min" does not exist, skipping + +NOTICE: table "barriers_st" does not exist, skipping + +NOTICE: table "barriers_st_min" does not exist, skipping + +NOTICE: table "barriers_wct" does not exist, skipping + +NOTICE: table "barriers_wct_min" does not exist, skipping + +NOTICE: table "gradient_barriers_minimal" does not exist, skipping + +NOTICE: table "streams" does not exist, skipping + +NOTICE: table "streams_habitat" does not exist, skipping + +NOTICE: table "observations_breaks" does not exist, skipping + +NOTICE: table "habitat_endpoints" does not exist, skipping + +NOTICE: table "crossings_breaks" does not exist, skipping + +NOTICE: table "streams_breaks" does not exist, skipping + +NOTICE: relation "streams_id_segment_idx" already exists, skipping + +NOTICE: table "streams_acc_015" does not exist, skipping + +NOTICE: table "streams_acc_02" does not exist, skipping + +NOTICE: table "streams_acc_025" does not exist, skipping + +NOTICE: table "streams_acc_025_ovr_bt" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_ch" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_co" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_pk" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_sk" does not exist, skipping + +NOTICE: table "streams_acc_02_ovr_st" does not exist, skipping + +NOTICE: table "frs_clusters_bt" does not exist, skipping + +NOTICE: table "frs_clusters_ch" does not exist, skipping + +NOTICE: table "frs_clusters_co" does not exist, skipping + +NOTICE: table "frs_clusters_sk" does not exist, skipping + +NOTICE: table "frs_qual_spawn_sk" does not exist, skipping + +NOTICE: table "frs_trace_lfid_sk" does not exist, skipping + +NOTICE: table "frs_clusters_st" does not exist, skipping + +✔ comparison_BULK completed [2m 55s, 438 B] ++ comparison_ADMS dispatched +NOTICE: schema "fresh" already exists, skipping + +NOTICE: table "barriers_definite" does not exist, skipping + +NOTICE: table "streams_blk" does not exist, skipping + +NOTICE: table "gradient_barriers_raw" does not exist, skipping + +NOTICE: table "natural_barriers" does not exist, skipping + +NOTICE: table "barrier_overrides" does not exist, skipping + +NOTICE: table "barriers_bt" does not exist, skipping + +NOTICE: table "barriers_bt_min" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk_min" does not exist, skipping + +NOTICE: table "barriers_st" does not exist, skipping + +NOTICE: table "barriers_st_min" does not exist, skipping + +NOTICE: table "barriers_wct" does not exist, skipping + +NOTICE: table "barriers_wct_min" does not exist, skipping + +NOTICE: table "gradient_barriers_minimal" does not exist, skipping + +NOTICE: table "streams" does not exist, skipping + +NOTICE: table "streams_habitat" does not exist, skipping + +NOTICE: table "observations_breaks" does not exist, skipping + +NOTICE: table "habitat_endpoints" does not exist, skipping + +NOTICE: table "crossings_breaks" does not exist, skipping + +NOTICE: table "streams_breaks" does not exist, skipping + +NOTICE: relation "streams_id_segment_idx" already exists, skipping + +NOTICE: table "streams_acc_015" does not exist, skipping + +NOTICE: table "streams_acc_025" does not exist, skipping + +NOTICE: table "streams_acc_025_ovr_bt" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_ch" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_co" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_sk" does not exist, skipping + +NOTICE: table "frs_clusters_bt" does not exist, skipping + +NOTICE: table "frs_clusters_ch" does not exist, skipping + +NOTICE: table "frs_clusters_co" does not exist, skipping + +NOTICE: table "frs_clusters_sk" does not exist, skipping + +NOTICE: table "frs_qual_spawn_sk" does not exist, skipping + +NOTICE: table "frs_trace_lfid_sk" does not exist, skipping + +✔ comparison_ADMS completed [1m 7.3s, 379 B] ++ comparison_DEAD dispatched +NOTICE: schema "fresh" already exists, skipping + +NOTICE: table "barriers_definite" does not exist, skipping + +NOTICE: table "streams_blk" does not exist, skipping + +NOTICE: table "gradient_barriers_raw" does not exist, skipping + +NOTICE: table "natural_barriers" does not exist, skipping + +NOTICE: table "barrier_overrides" does not exist, skipping + +NOTICE: table "barriers_bt" does not exist, skipping + +NOTICE: table "barriers_bt_min" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk_min" does not exist, skipping + +NOTICE: table "barriers_st" does not exist, skipping + +NOTICE: table "barriers_st_min" does not exist, skipping + +NOTICE: table "barriers_wct" does not exist, skipping + +NOTICE: table "barriers_wct_min" does not exist, skipping + +NOTICE: table "gradient_barriers_minimal" does not exist, skipping + +NOTICE: table "streams" does not exist, skipping + +NOTICE: table "streams_habitat" does not exist, skipping + +NOTICE: table "observations_breaks" does not exist, skipping + +NOTICE: table "habitat_endpoints" does not exist, skipping + +NOTICE: table "crossings_breaks" does not exist, skipping + +NOTICE: table "streams_breaks" does not exist, skipping + +NOTICE: relation "streams_id_segment_idx" already exists, skipping + +NOTICE: table "streams_acc_015" does not exist, skipping + +NOTICE: table "streams_acc_02" does not exist, skipping + +NOTICE: table "streams_acc_025" does not exist, skipping + +NOTICE: table "streams_acc_025_ovr_bt" does not exist, skipping + +NOTICE: table "frs_clusters_bt" does not exist, skipping + +NOTICE: table "frs_clusters_ch" does not exist, skipping + +NOTICE: table "frs_clusters_co" does not exist, skipping + +NOTICE: table "frs_clusters_sk" does not exist, skipping + +NOTICE: table "frs_qual_spawn_sk" does not exist, skipping + +NOTICE: table "frs_trace_lfid_sk" does not exist, skipping + +NOTICE: table "frs_clusters_st" does not exist, skipping + +✔ comparison_DEAD completed [40.6s, 420 B] ++ rollup dispatched +✔ rollup completed [1ms, 869 B] +✔ ended pipeline [9m 7.7s, 7 completed, 0 skipped] diff --git a/data-raw/logs/20260423_08_tar_make_48_repro.txt b/data-raw/logs/20260423_08_tar_make_48_repro.txt new file mode 100644 index 0000000..4465781 --- /dev/null +++ b/data-raw/logs/20260423_08_tar_make_48_repro.txt @@ -0,0 +1,365 @@ ++ cfg dispatched +✔ cfg completed [250ms, 296.48 kB] ++ comparison_BABL dispatched +NOTICE: schema "fresh" already exists, skipping + +NOTICE: table "barriers_definite" does not exist, skipping + +NOTICE: table "streams_blk" does not exist, skipping + +NOTICE: table "gradient_barriers_raw" does not exist, skipping + +NOTICE: table "natural_barriers" does not exist, skipping + +NOTICE: table "barrier_overrides" does not exist, skipping + +NOTICE: table "barriers_bt" does not exist, skipping + +NOTICE: table "barriers_bt_min" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk_min" does not exist, skipping + +NOTICE: table "barriers_st" does not exist, skipping + +NOTICE: table "barriers_st_min" does not exist, skipping + +NOTICE: table "barriers_wct" does not exist, skipping + +NOTICE: table "barriers_wct_min" does not exist, skipping + +NOTICE: table "gradient_barriers_minimal" does not exist, skipping + +NOTICE: table "streams" does not exist, skipping + +NOTICE: table "streams_habitat" does not exist, skipping + +NOTICE: table "observations_breaks" does not exist, skipping + +NOTICE: table "habitat_endpoints" does not exist, skipping + +NOTICE: table "crossings_breaks" does not exist, skipping + +NOTICE: table "streams_breaks" does not exist, skipping + +NOTICE: relation "streams_id_segment_idx" already exists, skipping + +NOTICE: table "streams_acc_015" does not exist, skipping + +NOTICE: table "streams_acc_02" does not exist, skipping + +NOTICE: table "streams_acc_025" does not exist, skipping + +NOTICE: table "streams_acc_025_ovr_bt" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_ch" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_co" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_sk" does not exist, skipping + +NOTICE: table "streams_acc_02_ovr_st" does not exist, skipping + +NOTICE: table "frs_clusters_bt" does not exist, skipping + +NOTICE: table "frs_clusters_ch" does not exist, skipping + +NOTICE: table "frs_clusters_co" does not exist, skipping + +NOTICE: table "frs_clusters_sk" does not exist, skipping + +NOTICE: table "frs_qual_spawn_sk" does not exist, skipping + +NOTICE: table "frs_trace_lfid_sk" does not exist, skipping + +NOTICE: table "frs_clusters_st" does not exist, skipping + +✔ comparison_BABL completed [1m 47.4s, 416 B] ++ comparison_ELKR dispatched +NOTICE: schema "fresh" already exists, skipping + +Override validation: working_elkr.pscis_fixes vs working_elkr.crossings + Total overrides: 324 + Valid (matched): 288 + Orphans: 36 <-- not found in crossings + Duplicates: 0 +Updated 288 of 7306 rows (barrier_status) +NOTICE: table "barriers_definite_control" does not exist, skipping + +NOTICE: table "streams_blk" does not exist, skipping + +NOTICE: table "gradient_barriers_raw" does not exist, skipping + +NOTICE: table "natural_barriers" does not exist, skipping + +NOTICE: table "barrier_overrides" does not exist, skipping + +NOTICE: table "barriers_bt" does not exist, skipping + +NOTICE: table "barriers_bt_min" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk_min" does not exist, skipping + +NOTICE: table "barriers_st" does not exist, skipping + +NOTICE: table "barriers_st_min" does not exist, skipping + +NOTICE: table "barriers_wct" does not exist, skipping + +NOTICE: table "barriers_wct_min" does not exist, skipping + +NOTICE: table "gradient_barriers_minimal" does not exist, skipping + +NOTICE: table "streams" does not exist, skipping + +NOTICE: table "streams_habitat" does not exist, skipping + +NOTICE: table "observations_breaks" does not exist, skipping + +NOTICE: table "habitat_endpoints" does not exist, skipping + +NOTICE: table "crossings_breaks" does not exist, skipping + +NOTICE: table "streams_breaks" does not exist, skipping + +NOTICE: relation "streams_id_segment_idx" already exists, skipping + +NOTICE: table "streams_acc_02" does not exist, skipping + +NOTICE: table "streams_acc_025" does not exist, skipping + +NOTICE: table "streams_acc_025_ovr_bt" does not exist, skipping + +NOTICE: table "streams_acc_02_ovr_wct" does not exist, skipping + +NOTICE: table "frs_clusters_bt" does not exist, skipping + +NOTICE: table "frs_clusters_wct" does not exist, skipping + +✔ comparison_ELKR completed [2m 35s, 318 B] ++ comparison_BULK dispatched +NOTICE: schema "fresh" already exists, skipping + +Override validation: working_bulk.pscis_fixes vs working_bulk.crossings + Total overrides: 580 + Valid (matched): 514 + Orphans: 66 <-- not found in crossings + Duplicates: 0 +Updated 514 of 5568 rows (barrier_status) +NOTICE: table "streams_blk" does not exist, skipping + +NOTICE: table "gradient_barriers_raw" does not exist, skipping + +NOTICE: table "natural_barriers" does not exist, skipping + +NOTICE: table "barrier_overrides" does not exist, skipping + +NOTICE: table "barriers_bt" does not exist, skipping + +NOTICE: table "barriers_bt_min" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk_min" does not exist, skipping + +NOTICE: table "barriers_st" does not exist, skipping + +NOTICE: table "barriers_st_min" does not exist, skipping + +NOTICE: table "barriers_wct" does not exist, skipping + +NOTICE: table "barriers_wct_min" does not exist, skipping + +NOTICE: table "gradient_barriers_minimal" does not exist, skipping + +NOTICE: table "streams" does not exist, skipping + +NOTICE: table "streams_habitat" does not exist, skipping + +NOTICE: table "observations_breaks" does not exist, skipping + +NOTICE: table "habitat_endpoints" does not exist, skipping + +NOTICE: table "crossings_breaks" does not exist, skipping + +NOTICE: table "streams_breaks" does not exist, skipping + +NOTICE: relation "streams_id_segment_idx" already exists, skipping + +NOTICE: table "streams_acc_015" does not exist, skipping + +NOTICE: table "streams_acc_02" does not exist, skipping + +NOTICE: table "streams_acc_025" does not exist, skipping + +NOTICE: table "streams_acc_025_ovr_bt" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_ch" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_co" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_pk" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_sk" does not exist, skipping + +NOTICE: table "streams_acc_02_ovr_st" does not exist, skipping + +NOTICE: table "frs_clusters_bt" does not exist, skipping + +NOTICE: table "frs_clusters_ch" does not exist, skipping + +NOTICE: table "frs_clusters_co" does not exist, skipping + +NOTICE: table "frs_clusters_sk" does not exist, skipping + +NOTICE: table "frs_qual_spawn_sk" does not exist, skipping + +NOTICE: table "frs_trace_lfid_sk" does not exist, skipping + +NOTICE: table "frs_clusters_st" does not exist, skipping + +✔ comparison_BULK completed [2m 56.5s, 438 B] ++ comparison_ADMS dispatched +NOTICE: schema "fresh" already exists, skipping + +NOTICE: table "barriers_definite" does not exist, skipping + +NOTICE: table "streams_blk" does not exist, skipping + +NOTICE: table "gradient_barriers_raw" does not exist, skipping + +NOTICE: table "natural_barriers" does not exist, skipping + +NOTICE: table "barrier_overrides" does not exist, skipping + +NOTICE: table "barriers_bt" does not exist, skipping + +NOTICE: table "barriers_bt_min" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk_min" does not exist, skipping + +NOTICE: table "barriers_st" does not exist, skipping + +NOTICE: table "barriers_st_min" does not exist, skipping + +NOTICE: table "barriers_wct" does not exist, skipping + +NOTICE: table "barriers_wct_min" does not exist, skipping + +NOTICE: table "gradient_barriers_minimal" does not exist, skipping + +NOTICE: table "streams" does not exist, skipping + +NOTICE: table "streams_habitat" does not exist, skipping + +NOTICE: table "observations_breaks" does not exist, skipping + +NOTICE: table "habitat_endpoints" does not exist, skipping + +NOTICE: table "crossings_breaks" does not exist, skipping + +NOTICE: table "streams_breaks" does not exist, skipping + +NOTICE: relation "streams_id_segment_idx" already exists, skipping + +NOTICE: table "streams_acc_015" does not exist, skipping + +NOTICE: table "streams_acc_025" does not exist, skipping + +NOTICE: table "streams_acc_025_ovr_bt" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_ch" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_co" does not exist, skipping + +NOTICE: table "streams_acc_015_ovr_sk" does not exist, skipping + +NOTICE: table "frs_clusters_bt" does not exist, skipping + +NOTICE: table "frs_clusters_ch" does not exist, skipping + +NOTICE: table "frs_clusters_co" does not exist, skipping + +NOTICE: table "frs_clusters_sk" does not exist, skipping + +NOTICE: table "frs_qual_spawn_sk" does not exist, skipping + +NOTICE: table "frs_trace_lfid_sk" does not exist, skipping + +✔ comparison_ADMS completed [1m 8.7s, 379 B] ++ comparison_DEAD dispatched +NOTICE: schema "fresh" already exists, skipping + +NOTICE: table "barriers_definite" does not exist, skipping + +NOTICE: table "streams_blk" does not exist, skipping + +NOTICE: table "gradient_barriers_raw" does not exist, skipping + +NOTICE: table "natural_barriers" does not exist, skipping + +NOTICE: table "barrier_overrides" does not exist, skipping + +NOTICE: table "barriers_bt" does not exist, skipping + +NOTICE: table "barriers_bt_min" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk" does not exist, skipping + +NOTICE: table "barriers_ch_cm_co_pk_sk_min" does not exist, skipping + +NOTICE: table "barriers_st" does not exist, skipping + +NOTICE: table "barriers_st_min" does not exist, skipping + +NOTICE: table "barriers_wct" does not exist, skipping + +NOTICE: table "barriers_wct_min" does not exist, skipping + +NOTICE: table "gradient_barriers_minimal" does not exist, skipping + +NOTICE: table "streams" does not exist, skipping + +NOTICE: table "streams_habitat" does not exist, skipping + +NOTICE: table "observations_breaks" does not exist, skipping + +NOTICE: table "habitat_endpoints" does not exist, skipping + +NOTICE: table "crossings_breaks" does not exist, skipping + +NOTICE: table "streams_breaks" does not exist, skipping + +NOTICE: relation "streams_id_segment_idx" already exists, skipping + +NOTICE: table "streams_acc_015" does not exist, skipping + +NOTICE: table "streams_acc_02" does not exist, skipping + +NOTICE: table "streams_acc_025" does not exist, skipping + +NOTICE: table "streams_acc_025_ovr_bt" does not exist, skipping + +NOTICE: table "frs_clusters_bt" does not exist, skipping + +NOTICE: table "frs_clusters_ch" does not exist, skipping + +NOTICE: table "frs_clusters_co" does not exist, skipping + +NOTICE: table "frs_clusters_sk" does not exist, skipping + +NOTICE: table "frs_qual_spawn_sk" does not exist, skipping + +NOTICE: table "frs_trace_lfid_sk" does not exist, skipping + +NOTICE: table "frs_clusters_st" does not exist, skipping + +✔ comparison_DEAD completed [40.4s, 420 B] ++ rollup dispatched +✔ rollup completed [1ms, 869 B] +✔ ended pipeline [9m 8.6s, 7 completed, 0 skipped] diff --git a/inst/extdata/vignette-data/rollup.rds b/inst/extdata/vignette-data/rollup.rds index ff55b9201e76879e1c319456efeba55456f8fa96..c0ad41abefec6403fdee18abd2356c5c74c91f4a 100644 GIT binary patch literal 869 zcmV-r1DgCFiwFP!000001MOB@NK;`PKklN_G7NpT2OrXhjF7^IYM(k&*evssh0=C* zIXT?swzCT~>(ZjSJB2efC5(HU<5fvC-APd)bzW?{lbOuE? zAN=6#fB*ge|KB+~oRb+G$H_T`QpU-ZSml)Ubw~CTV_!BlQt_3AuR>12rDLfm(Nxv` zO}(^Ur`=R~NvZCC=;bq!}ayiD1zwg|I#M@L(R7e5joy%Xm*V}|n?9Y_~$ac3#Iw(9bopH!Hg05SZ zF-#5$EPy{a3%H?nz=_x%5S(y7_x(Y|#WB;KuyDtd+I(K%GIb5dz zPb>p`u@$6u9`>lWP2w|^;63z`^8WD_u>%2^JGd9_S1}z+y|jwqXy>De+3*v9`rMhK-_SY%*pmSKPUaBMVUlR7hq1~ z7s4;&T}|L7r(&N5NniC0^oa(34rns?(be|>4 z1CtadM)TE_xAlB8$?`iA{{V#y|D@2@PrAF+U+CcN77-hn_>xJ9@p$~nx(P=SRaR!*%n|Y(v!+Z3evrY?3u~{80`W8DiGmR#}DmFWLQCxMZ%vM3r vJ58ST?M*hEN88J(Gu30X>CFNg23u6kF!LV1P;ldsv9M4-?gNDyQZMpR&=LKd#?eDC+obOuF# zUiiT|@Bj0@?{m%$JCV+DoSaiAWt?1zRZdy2KeDF?`?9d1!dE7~3OEIqhNYrdTUGZr z^^$sB<)+e$OLYH3FVj`l{)(65iTy~j`XkT;ZWp#FOn);?9W=;nhiyX!QyQ@u9cyJ~KQx5Aq}%yB!U7a9d+*{v_j z$IykDF|1S|k88ZS9s@dlAV&%y$DKmyprOf`^uz8^bltX$ zVX{$Z0sP@Pz#VJ@oQUH-!5Qk~zCWm_2#0gVQFSih^zwpqP^7D!#JiUOC#nGaKtxKf zMV+r-Le#$k`PWjwZw)|y z?>^YGaRl};9fUbd4ZxGN4|mO5LZ-6>pZmcRg?LU_Ym}J)WST*uYhC9g?`pih?|a*IoUqv=B0aTlu2Yb4|AHo z5Pli&8Ui;p9s4*y`f6q=A2LFpp!p2`*lmy~17w0XHPla}(E1gqLkjS-xaJwHr?_mc z*c{jlkJTsoWm22r?x2#R_*sO8Ld{#qpHQvEWBIWKn!gS5SznY%`_erbZtMZwXNmH_ zB*lq6p?xWD>-lDq<+mq(0SXzurO?k$nztob;NqP&5gQr!l1Yj2c>M9YL?ug-=2fwO z06{VF9TVL)iydcxxxI-u+kL#x=sV-Ku@r~h)og5bQZvJB5$s}41f$#H sTi@Q|zyv4#z}&j{HS_Ti z@{3ddIWp7AptZoPe@=wNF9@2f{UmS+6g|;xH$b7v^qx7C+4J|$PyIFNH<|zYn+cu% zg%t|mf$-|Jv%tI#2PtnbBh9RO5qZtxecYcy<-6f|-li2iv-8=))nG`lGWP*+=>x7T zSx~;k#xIkB-$b+JPPN~=>~n`#&fRa)^U5ex?f2>v!!$R0I>(^bR*uhAR;PhZ z9db7-z!N9=R5`$yJHywWg3FTq?1m{+(*-Z(cRvHEpPn6fN1>W*4vwju0SY8_u9-!l z8dp{bx&@imbihZLa956AZL3C;GwqDnTw2FyKwM zhZUH==(^YkFwXMw)NNoN>$vSs@Y1xH)jXsh#TeG1U)!1vX_xnaDeR6XM#1rY%vTjD z)cFRSH}@Q;Q0bS^|Gmx%xkan5w1d)JpCt}}9J#}z zDHJMyIHjp*Be-&}(gX!Go44OZf`RMAcxd^!n0k6X_~AwMg@=UJFV3t7Uy9wbxeo3u z;PI=5X_~eF&bgc53~}dfdkR(Km(-KeJz&``Hvj2hkk6;x(F}|SmJYA&(_Lb(uLftW z`{EY{nytJWNd=X9EXLrx;i@fWpq5Qj9{QsOOHs+APzHVj z_oHfkS2A}WcvN5YYFmd_HS>Fk`wJ;l>(Pfz#$Di-%N5)<;5)&Edn*_l*V|b)e*XBW z!z;0RV3yHGv_WSePt#|xP*Jab24mwoIgag}Z#cO0(t!(H7)!wl&n=R{4Z1Zu>KQvm zqS~DY(HB9XiCMScGn63%>TXlm7e%_FPC_2@M=z5A8`=XG zax>)wuQxqVe-`7R-fD~Pa(z&L zoQvfQDBv8;`G!K(+g&Yr?IpO^%gN7ft_`OjJ0LH*#*z4X&qj9&vb9Gz~AHz23NbnR_2M+ z%RSJhPrrT>lo`d+lmrYZ=`^3E-HrX&>ZI!-U zu>Lcp%#lJB+OOnjyaPP+<8xvNc*jof%~i(iMUzqRo{R9qP0ms+@8h8VFL*Cr!vsDs zusxo_*nQ9T5G$Wj1LpP2nF1|q5Wk>T4P)CN`EGdS^EwDP*kuMbWw%Bog_e|u>*FL@1k3Byxfmj ztivm*SCvm^G5oN_b&CF73RS#VeMojGSl!{x0{bkUcI+2t2iU=Wa_Jfd$Lg@{@wC(6 znR}MMSYVd}qqrJ$!99BgGNv$g&#HIVUD@6UrZcZ@f$le!V4s^1NOS__!qssGV~3$k zLw8>A%tEG@Y!s@Xn}cuCF0g>#w{bmV<2_-}keS62eDFmgAMt9!V{MO9+=LSx$%wJ| zsj+(`kAd0;rvE}*!mqJar4{~`pSR)0hyr8nRVI5w?HcrLnQE=fVc1^H28~a-Qefn8 z#-W3Zo#)@*CGqqxfn;mY;z@t~7#Oa-W&LW}v52qGl|5AgAMtv_(Uhm)W<$p((*Miz zoIabUv0~DBR-`;Af5X^4X<#)KVZ94Kd$xFkViLY9mVR*nae=1%m|)2SW5?JYZZ%eY ziPo3VHzTKQiprw(UB-?P?=)0(QW})aIk;GuLe<^9kHhm9*tu0ekdbR4zJSACvey)` z-0^J|GsMA)c$T?{$I@h5uZ%^(=AVB&v-mQ!*Yx^%M?FEOk)PYnL4(<{e4LTaK$|1R zOMaVCV0;|>xM~I~Guqb> z#V&yL;-cP{z?5|-j%{JgSClu~SIlz+BZbavhb_~pbJZQN1n1`|-8{h9d8NB-3{q_Y zm%oqUqJVWhs>agjpKt3sD~iEa#|?c?kUpRPh_{`w^D0rc%X5JKEB<2jDck|N`N{m@ z>FE0w9kGG=^fUoI&6^{b>v12j7gnV#nQUeuw

^%Rq5s%C6rNKAV-w{nzkpo|=Rs8(*+h%B7Jn(?8 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 literal 31919 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�Lnno@Q@+u$`93fU(KWn(t?sX2%hR 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 diff --git a/planning/active/task_plan.md b/planning/active/task_plan.md index cb80b75..8530d46 100644 --- a/planning/active/task_plan.md +++ b/planning/active/task_plan.md @@ -6,12 +6,16 @@ Match bcfishpass's architecture for `user_barriers_definite` rows: they must be Pre-fix defect on ELKR confirmed: 4 override rows at user-definite positions (Erickson Creek exclusion, 2× Spillway MISC) that bcfishpass would keep as blockers. -## Phase 1: Code change (Shape A from #48) +## Phase 1: Code change (simpler than initially planned) -- [ ] `.lnk_pipeline_prep_natural()` — drop the `INSERT INTO natural_barriers SELECT ... FROM barriers_definite` block. `natural_barriers` becomes gradient + falls only. -- [ ] `.lnk_pipeline_prep_minimal()` — after `frs_barriers_minimal()` runs for each per-model barrier table (`barriers_bt`, `barriers_ch_cm_co_pk_sk`, `barriers_st`, `barriers_wct`), append rows from `.barriers_definite` (already WSG-filtered at load time) into each, de-duped via `ON CONFLICT DO NOTHING`. Also append to `gradient_barriers_minimal` union so segmentation breaks still include them. -- [ ] Check callers of `natural_barriers` outside `.lnk_pipeline_prep_overrides()` and `.lnk_pipeline_prep_minimal()` — if other callers depend on the definite union, Shape A breaks them. (From a quick grep: `natural_barriers` is only referenced in prep_natural, prep_overrides, and prep_minimal.) -- [ ] Update tests in `test-lnk_pipeline_prepare.R` — remove "natural_barriers unions definite" assertion; add "per-model barrier tables include definite" assertion. +Investigation showed `barriers_definite` is already wired as a break source in `lnk_pipeline_break` (sequential `frs_break_apply`) and into `fresh.streams_breaks` in `lnk_pipeline_classify` (access-gating barrier table). User-definite positions already end up as segment boundaries AND as blocking barriers at classification — bcfishpass parity on those two surfaces. + +The only defect is `.lnk_pipeline_prep_natural()` UNIONing `barriers_definite` into `natural_barriers`. `natural_barriers` is passed to `lnk_barrier_overrides()` which generates per-species override (skip) rows for any barrier with threshold observations upstream. That's what lets user-definite positions be re-opened. + +Only `natural_barriers` caller outside prep_natural is `.lnk_pipeline_prep_overrides()` (confirmed via grep). Safe to drop the definite UNION without touching prep_minimal. + +- [x] `.lnk_pipeline_prep_natural()` — drop the `INSERT INTO natural_barriers SELECT ... FROM barriers_definite` block. `natural_barriers` becomes gradient + falls only. Inline NOTE comment explains the bcfishpass parity reasoning. +- [ ] Update tests in `test-lnk_pipeline_prepare.R` — the existing `prep_natural unions gradient + falls + definite` assertion needs to drop the "definite" clause. ## Phase 2: Verification diff --git a/research/bcfishpass_comparison.md b/research/bcfishpass_comparison.md index 595060a..c931ab5 100644 --- a/research/bcfishpass_comparison.md +++ b/research/bcfishpass_comparison.md @@ -44,8 +44,10 @@ All species within 5% of bcfishpass reference. Pipeline runs serially in ~8.5 mi | Species | Spawning | Rearing | |---------|----------|---------| -| BT | +3.4% | -0.7% | -| WCT | +4.0% | +1.6% | +| BT | +2.8% | -1.2% | +| WCT | +2.6% | +0.3% | + +Updated 2026-04-23 (#48) — #48 removed `barriers_definite` from `natural_barriers`, which stopped observation-based override of user-definite positions (Erickson Creek exclusion + 2 Spillway MISC entries). Those four positions now correctly block upstream habitat, bringing link toward bcfishpass. Pre-#48 numbers: BT +3.4% / -0.7%, WCT +4.0% / +1.6%. ### DEAD @@ -146,6 +148,7 @@ Composite steps in the DAG that aren't a single function call: | Three-phase cluster | CH +6% → +2.6% | fresh code (0.13.8) | | Index input tables | 228s → 6.6s classification | fresh code (0.13.4) | | Wire `barriers_definite_control` into override step, per-species, observation-path only | DEAD CH/CO/PK/ST +1.1 to +1.4% (moot on ADMS/BULK/BABL/ELKR) | link code (0.6.0) | +| Drop `barriers_definite` from `natural_barriers` (not eligible for observation override) | ELKR BT spawn +3.4% → +2.8%, WCT spawn +4.0% → +2.6%, WCT rear +1.6% → +0.3% | link code (0.7.0) | ### barriers_definite_control wiring (#44) @@ -157,6 +160,14 @@ bcfishpass pairs `user_barriers_definite.csv` with a control table that flags po End-to-end validation on DEAD (added specifically for this reason — see section above). Numerical impact on the four original WSGs is zero because every TRUE control row is already rescued by the observation threshold or the habitat path; the filter is correctly wired but inactive on those WSGs. +### user_barriers_definite bypass (#48) + +Same-family fix as #44, different mechanism. bcfishpass's `model_access_*.sql` builds its barriers CTE from gradient + falls + subsurfaceflow only; `barriers_user_definite` is appended post-filter via `UNION ALL`, so upstream observations and habitat confirmations never re-open user-definite positions. link's `.lnk_pipeline_prep_natural()` was unioning `barriers_definite` into `natural_barriers`, which `lnk_barrier_overrides()` iterates over — the 227 reviewer-added user-definite rows (EXCLUSION zones, MISC-type barriers) became eligible for observation override. + +Active defect on ELKR pre-fix: 4 rows in `working_elkr.barrier_overrides` matched `working_elkr.barriers_definite` positions — Erickson Creek exclusion (mining impacts) and two Spillway MISC entries. Post-fix: 0 matches on all 5 WSGs, and ELKR rollup shifts toward bcfishpass on BT/WCT spawning and rearing (see per-WSG table above). Other four WSGs unchanged: ADMS/BABL/DEAD have empty `barriers_definite`; BULK has 87 rows but none have observation counts clearing threshold. + +Fix is a single edit to `.lnk_pipeline_prep_natural()` — drop the `INSERT INTO natural_barriers SELECT ... FROM barriers_definite` block. `barriers_definite` stays consumed separately: `lnk_pipeline_break()` applies it as a sequential break source (segmentation boundary); `lnk_pipeline_classify()` UNION ALLs it directly into `fresh.streams_breaks` (access-gating barrier set). Both surfaces are unchanged. + ## Remaining gaps ### BT rearing -2.2% (BULK) diff --git a/vignettes/reproducing-bcfishpass.Rmd b/vignettes/reproducing-bcfishpass.Rmd index 5a51507..ceedd7b 100644 --- a/vignettes/reproducing-bcfishpass.Rmd +++ b/vignettes/reproducing-bcfishpass.Rmd @@ -134,10 +134,13 @@ where the decision can change: (mirrored at [`inst/extdata/configs/bcfishpass/overrides/user_barriers_definite.csv`](https://github.com/NewGraphEnvironment/link/blob/main/inst/extdata/configs/bcfishpass/overrides/user_barriers_definite.csv)). Each row specifies `blue_line_key` and `downstream_route_measure` - for a barrier that always blocks access. Treated the same as falls - — always-blocking, always a break position, eligible for - per-species override via `lnk_barrier_overrides` when enough - upstream observations clear the threshold. + for a barrier that always blocks access — reviewer-added positions + covering EXCLUSION zones and MISC barriers the model doesn't detect + from gradient / falls / subsurface detection. These are always- + blocking, always a break position, and **never eligible for + observation-based override** — matches bcfishpass's `model_access_*.sql`, + which appends `barriers_user_definite` post-filter via `UNION ALL` so + upstream observations and habitat confirmations never re-open them. - **Habitat classification endpoints** — manual spawning / rearing delineations from bcfishpass's From b8cd44230f602ef3c42074cc2e7f93070218bfa2 Mon Sep 17 00:00:00 2001 From: almac2022 Date: Thu, 23 Apr 2026 14:12:04 -0700 Subject: [PATCH 4/5] Vignette: drop DEAD from parity pivot tables, note in prose DEAD was added (PR #47) as a targeted end-to-end test for the barriers_definite_control filter, not a parity measurement. Mixing it into the same pivot as ADMS/BULK/BABL/ELKR muddles the table's purpose. Readers who want DEAD's diff_pct numbers can find them in research/bcfishpass_comparison.md's dedicated DEAD subsection. Restores the pivot's intersect() to the original four-WSG list; adds a short paragraph below the tables pointing at the research doc for DEAD detail. Relates to #48 --- vignettes/reproducing-bcfishpass.Rmd | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/vignettes/reproducing-bcfishpass.Rmd b/vignettes/reproducing-bcfishpass.Rmd index ceedd7b..c246153 100644 --- a/vignettes/reproducing-bcfishpass.Rmd +++ b/vignettes/reproducing-bcfishpass.Rmd @@ -241,7 +241,7 @@ bcfishpass_km × 100`. w <- stats::reshape(x, idvar = "species", timevar = "wsg", direction = "wide", v.names = "diff_pct") names(w)[-1] <- sub("diff_pct\\.", "", names(w)[-1]) - cols <- intersect(c("species", "ADMS", "BULK", "BABL", "ELKR", "DEAD"), + cols <- intersect(c("species", "ADMS", "BULK", "BABL", "ELKR"), names(w)) w <- w[order(w$species), cols] row.names(w) <- NULL @@ -257,6 +257,13 @@ knitr::kable(.pivot(rollup, "rearing"), caption = "Rearing parity (% diff vs bcfishpass)") ``` +The tables cover ADMS / BULK / BABL / ELKR — the four parity +watershed groups. DEAD (Deadman River) is also run by `tar_make()` +but is reported separately in +[`research/bcfishpass_comparison.md`](https://github.com/NewGraphEnvironment/link/blob/main/research/bcfishpass_comparison.md); +it was added as a targeted end-to-end test for the +`barriers_definite_control` filter rather than a parity measurement. + Observed differences come from the stream-order bypass omission — visible as the uniformly negative BT rearing column — and from segmentation-boundary rounding where per-segment attributes fall near From f14ae62e6be0e10908218a3ad203bd07337b64f3 Mon Sep 17 00:00:00 2001 From: almac2022 Date: Thu, 23 Apr 2026 14:13:04 -0700 Subject: [PATCH 5/5] Revert "Vignette: drop DEAD from parity pivot tables, note in prose" This reverts commit b8cd44230f602ef3c42074cc2e7f93070218bfa2. --- vignettes/reproducing-bcfishpass.Rmd | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/vignettes/reproducing-bcfishpass.Rmd b/vignettes/reproducing-bcfishpass.Rmd index c246153..ceedd7b 100644 --- a/vignettes/reproducing-bcfishpass.Rmd +++ b/vignettes/reproducing-bcfishpass.Rmd @@ -241,7 +241,7 @@ bcfishpass_km × 100`. w <- stats::reshape(x, idvar = "species", timevar = "wsg", direction = "wide", v.names = "diff_pct") names(w)[-1] <- sub("diff_pct\\.", "", names(w)[-1]) - cols <- intersect(c("species", "ADMS", "BULK", "BABL", "ELKR"), + cols <- intersect(c("species", "ADMS", "BULK", "BABL", "ELKR", "DEAD"), names(w)) w <- w[order(w$species), cols] row.names(w) <- NULL @@ -257,13 +257,6 @@ knitr::kable(.pivot(rollup, "rearing"), caption = "Rearing parity (% diff vs bcfishpass)") ``` -The tables cover ADMS / BULK / BABL / ELKR — the four parity -watershed groups. DEAD (Deadman River) is also run by `tar_make()` -but is reported separately in -[`research/bcfishpass_comparison.md`](https://github.com/NewGraphEnvironment/link/blob/main/research/bcfishpass_comparison.md); -it was added as a targeted end-to-end test for the -`barriers_definite_control` filter rather than a parity measurement. - Observed differences come from the stream-order bypass omission — visible as the uniformly negative BT rearing column — and from segmentation-boundary rounding where per-segment attributes fall near