# Ocean Baseline Pack - Sidney / Tsehum Harbour / Swartz Bay, BC

**Pack ID:** `sidney-swartz-bay-20260930-sample`  
**Packed:** 2026-09-30 17:36 (UTC)  
**Satellite epoch:** Sentinel-2 median composite of 8 scenes, 2024-08-17 to 2024-09-24  
**Area:** 48.6550N to 48.6920N, 123.4250W to 123.3650W (18.06 km^2)  
**Produced by:** Nimpact Environmental Ltd (nimpact.ca) from BeachBook + beachcomp

> Sample pack. Covers the Swartz Bay ferry terminal, Tsehum Harbour marinas and the Sidney waterfront - shorelines where terminal, marina and waterfront works are recurring.

## What this is
A dated "before" record of this shoreline: every shoreline cell in the box scored from one satellite composite, plus every human beach survey BeachBook holds inside the box, with photos. It is meant to be archived *before* works begin, so a later "after" survey has something to be compared against. The satellite part can be re-run later against newer imagery with the same code; the human surveys cannot be re-collected once the shore changes.

## Honesty rules - read before using any number
| Field | Grade | Meaning |
|---|---|---|
| `sand` | MODEL | calibrated regressor, 0-5 BeachBook scale, CV R^2 ~0.20 on 318 surveyed beaches; reliable for ranking candidates, not for absolute sand % |
| `sand_score` | MODEL-derived ranking score | 0.6 x calibrated sand + 0.4 x sandiness prior |
| `rock_prob` | SCREENING-GRADE | classifier, CV-AUC ~0.69; indicates, does not measure |
| `sandiness` | SCREENING-GRADE | 1 - rock_prob |
| `oyster_prob` | SCREENING-GRADE | tidal presence/absence classifier, CV-AUC ~0.73 on 179 beaches; habitat likelihood only - NOT a harvest-safety or DFO closure statement |

- **Only `sand` is a calibrated model.** Even it is weak (R^2 ~0.20): use it to rank cells and pick where to look, not as a measured sand fraction.
- **`rock_prob`, `sandiness` and `oyster_prob` are SCREENING-GRADE.** They point at where to send a person. They are not findings, and must not be cited as habitat or substrate measurements.
- **Oyster likelihood is not harvest guidance.** It says nothing about DFO shellfish closures, biotoxins or contamination. Check DFO before harvesting anything.
- Built structures (ferry ramps, marinas, breakwaters, concrete) are **not masked**; bright hard surfaces can score as "sandy". A high-ranked cell on a dock is a model artefact, visible on the map.
- Sentinel-2 pixels are 10-20 m. Cells are ~180 m squares straddling the waterline. Nothing here resolves individual boulders, shells or logs.
- Shoreline cells were found from a single NDWI water mask at the tide state of the imagery; a different tide moves the line.

## Contents
| Path | What |
|---|---|
| `cells/cells_ranked.csv` | 108 shoreline cells, ranked by sand_score (rank, cell_id, lat/lng, scores) |
| `cells/cells.geojson` | same cells as ~180 m polygons for GIS |
| `cells/scan_raw.json` | untouched scanner output |
| `surveys/surveys.csv` | 12 BeachBook surveys, one row per survey, every question as a `q_` column |
| `surveys/surveys.json` | 12 beach records with aggregates, satellite clarity and full survey answers |
| `surveys/surveys.geojson` | survey sites as points |
| `surveys/photos/` | 22 survey photos, original files, named `<beach_id>_<file>` |
| `maps/*.png` | cells over Esri World Imagery (sand_score, and oyster_prob if tidal) |
| `provenance.json` | the exact Sentinel-2 scene IDs, search window, models used |
| `MANIFEST.sha256` | SHA-256 of every file; the pack hash at the bottom fixes the whole pack |

## Top 10 cells (by sand_score)
| # | cell | lat | lng | sand (MODEL) | rock_prob (screening) | oyster_prob (screening) |
|---|---|---|---|---|---|---|
| 1 | R20C07 | 48.68824 | -123.40658 | 5.0 | 0.225 | 0.267 |
| 2 | R16C09 | 48.68176 | -123.40167 | 5.0 | 0.278 | 0.373 |
| 3 | R17C09 | 48.68338 | -123.40167 | 5.0 | 0.28 | 0.371 |
| 4 | R13C04 | 48.67689 | -123.41395 | 4.66 | 0.209 | 0.213 |
| 5 | R04C09 | 48.66230 | -123.40167 | 5.0 | 0.324 | 0.344 |
| 6 | R18C10 | 48.68500 | -123.39922 | 4.99 | 0.385 | 0.491 |
| 7 | R21C05 | 48.68986 | -123.41149 | 5.0 | 0.389 | 0.448 |
| 8 | R16C14 | 48.68176 | -123.38939 | 5.0 | 0.397 | 0.458 |
| 9 | R17C10 | 48.68338 | -123.39922 | 5.0 | 0.398 | 0.509 |
| 10 | R09C08 | 48.67041 | -123.40413 | 5.0 | 0.406 | 0.422 |

## Human surveys in the box
| Beach | lat | lng | surveys | photos | record date | photo date hint |
|---|---|---|---|---|---|---|
| David Beach | 48.68333 | -123.39242 | 1 | 1 | 2025-09-08 | 2017-04-26 |
| East Point | 48.67027 | -123.37126 | 1 | 2 | 2025-09-24 | 2017-04-26 |
| Johnson Islet | 48.68106 | -123.39458 | 1 | 2 | 2025-09-23 | 2017-04-26 |
| Lindsay Beach | 48.67909 | -123.39523 | 1 | 2 | 2025-09-25 | 2017-04-26 |
| Midden Point | 48.68213 | -123.39210 | 1 | 2 | 2025-09-25 | 2017-04-26 |
| North Beach | 48.67071 | -123.37290 | 1 | 2 | 2025-09-25 | 2017-04-26 |
| Resthaven Beach | 48.66663 | -123.40957 | 1 | 2 | 2025-09-25 | 2017-04-24 |
| Resthaven Dinghy | 48.66971 | -123.40953 | 1 | 2 | 2025-09-25 | 2017-04-24 |
| Resthaven North | 48.66820 | -123.41235 | 1 | 2 | 2025-09-25 | 2017-04-24 |
| Roberts Bay | 48.66264 | -123.40306 | 1 | 2 | 2025-09-25 | 2017-04-24 |
| Snsyc Beach | 48.67523 | -123.41542 | 1 | 1 | 2025-09-24 | 2017-04-24 |
| Southwest Point | 48.67942 | -123.38343 | 1 | 2 | 2025-09-24 | 2017-04-26 |

**About survey dates:** 12 of 12 surveys are legacy records carried over when BeachBook migrated databases in Sept 2025; their `record_timestamp` is the migration date, not the day someone stood on the beach. Where a photo filename carries a camera date (e.g. `IMG_20170620_...`) it is given as `earliest_photo_date_hint` - that is the best available evidence of when the shore looked like that, and it is only a hint.

**Photos in this copy are downscaled to 1600 px** for download size. `surveys/surveys.json` keeps the SHA-256 of each original file (`original_sha256`), so the full-resolution originals can be proven to be the same pictures.

Survey contributors are anonymised: user IDs and emails are removed. Survey photos are BeachBook community uploads.

## Reproduce / re-survey
```
scan.py 48.655 -123.425 48.692 -123.365 --tidal --cell 180.0
```
Re-running against later imagery (change START/END in scan.py) with the same cell grid gives directly comparable cell_ids.

## Proving the date
`MANIFEST.sha256` lists every file hash and a final pack hash. Keep the pack hash somewhere independent (an email to yourself, a registered letter, or an OpenTimestamps/blockchain anchor) on the day you receive it; any later edit to any file changes the hash.

Imagery credits: Contains modified Copernicus Sentinel data (ESA). Basemap: Esri World Imagery (Esri, Maxar, Earthstar Geographics).
