diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7be4faa2..8f3a70bf 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -37,7 +37,7 @@ jobs: # toggled) showed it saves ~180s on a typical PR, since Cargo still # re-invokes rustc for much of the dependency graph even when the # restored target/ cache matches Cargo.lock exactly. See - # https://github.com/alltheplaces/osm-diffs/issues/597 for the numbers. + # https://github.com/brawer/osmdiffs/issues/597 for the numbers. env: RUSTC_WRAPPER: "sccache" SCCACHE_GHA_ENABLED: "true" diff --git a/Containerfile b/Containerfile index 6278bd0e..10ac5e6c 100644 --- a/Containerfile +++ b/Containerfile @@ -21,7 +21,7 @@ FROM rust:1.98.0-alpine3.23 AS builder ARG BUILD_TIMESTAMP -ARG IMAGE_NAME=alltheplaces/osm-diffs +ARG IMAGE_NAME=brawer/osmdiffs ARG TIPPECANOE_VERSION=2.79.0 # Commit that the "2.79.0" tag pointed to as of 2026-08-08. Pinned by # commit, not by tag/branch name: git tags are mutable references that @@ -129,7 +129,7 @@ ENTRYPOINT ["/app/osm-diffs"] LABEL \ org.opencontainers.image.authors="Sascha Brawer " \ org.opencontainers.image.created=$BUILD_TIMESTAMP \ - org.opencontainers.image.description="Data pipeline for alltheplaces/osm-diffs" \ + org.opencontainers.image.description="Data pipeline for brawer/osmdiffs" \ org.opencontainers.image.licenses="MIT" \ org.opencontainers.image.revision=$VCS_REF \ org.opencontainers.image.source=$VCS_URL \ diff --git a/README.md b/README.md index 8b009e6f..406b51ba 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # OSM Diffs -[![Coverage Status](https://coveralls.io/repos/github/alltheplaces/osm-diffs/badge.svg?branch=main)](https://coveralls.io/github/alltheplaces/osm-diffs?branch=main) -[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/alltheplaces/osm-diffs/badge)](https://scorecard.dev/viewer/?uri=github.com/alltheplaces/osm-diffs) +[![Coverage Status](https://coveralls.io/repos/github/brawer/osmdiffs/badge.svg?branch=main)](https://coveralls.io/github/brawer/osmdiffs?branch=main) +[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/brawer/osmdiffs/badge)](https://scorecard.dev/viewer/?uri=github.com/brawer/osmdiffs) [![Project Status: WIP – Initial development is in progress, but there has not yet been a stable, usable release suitable for the public.](https://www.repostatus.org/badges/latest/wip.svg)](https://www.repostatus.org/#wip) Once completed, this will be a pipeline to compute weekly diffs @@ -17,7 +17,7 @@ feed edit proposals to tools such as [MapRoulette](https://maproulette.org/), where human users can manually check each edit before applying it to OpenStreetMap — which edits go where is still being worked out, see -[#696](https://github.com/alltheplaces/osm-diffs/issues/696). +[#696](https://github.com/brawer/osmdiffs/issues/696). Just want the data this pipeline produces? See [`docs/outputs/`](docs/outputs/) for what’s in it and how to read it. diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index cfbf113c..b5d2293c 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -6,7 +6,7 @@ there’s no such thing as too small a [Pull Request (PR)](https://docs.github.com/en/pull-requests/get-started/about-pull-requests). Please be kind to each other and to maintainers; see our -[Code of Conduct](https://github.com/alltheplaces/osm-diffs/blob/main/docs/CODE_OF_CONDUCT.md). +[Code of Conduct](https://github.com/brawer/osmdiffs/blob/main/docs/CODE_OF_CONDUCT.md). ## Before opening a Pull Request @@ -26,7 +26,7 @@ cargo deny check ``` This checks the new dependency graph against -[`deny.toml`](https://github.com/alltheplaces/osm-diffs/blob/main/deny.toml) +[`deny.toml`](https://github.com/brawer/osmdiffs/blob/main/deny.toml) — disallowed licenses, banned/duplicated crates, untrusted sources, and known RUSTSEC/OSV advisories. @@ -34,10 +34,10 @@ If you changed a Python script, run `uv run pytest` from `scripts/`. After you’ve sent a Pull Request, our Continuous Integration (CI) runs a series of checks on it — the commands above are a subset of what CI runs -([`test.yml`](https://github.com/alltheplaces/osm-diffs/blob/main/.github/workflows/test.yml), -[`cargo-deny.yml`](https://github.com/alltheplaces/osm-diffs/blob/main/.github/workflows/cargo-deny.yml)). +([`test.yml`](https://github.com/brawer/osmdiffs/blob/main/.github/workflows/test.yml), +[`cargo-deny.yml`](https://github.com/brawer/osmdiffs/blob/main/.github/workflows/cargo-deny.yml)). Running them locally first saves a round-trip through CI — see -[`TESTING.md`](https://github.com/alltheplaces/osm-diffs/blob/main/docs/TESTING.md) +[`TESTING.md`](https://github.com/brawer/osmdiffs/blob/main/docs/TESTING.md) for what else CI checks. ## PR titles: Conventional Commits @@ -52,10 +52,10 @@ PRs are squash-merged, and the PR title becomes the commit message on `type` is one of `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `build`, `ci`, or `chore`. A bot -([`pr-title-lint.yml`](https://github.com/alltheplaces/osm-diffs/blob/main/.github/workflows/pr-title-lint.yml)) +([`pr-title-lint.yml`](https://github.com/brawer/osmdiffs/blob/main/.github/workflows/pr-title-lint.yml)) checks this on every PR and applies an `enhancement`/`bug`/`breaking-change` label from it, which feeds -[`.github/release.yml`](https://github.com/alltheplaces/osm-diffs/blob/main/.github/release.yml)’s +[`.github/release.yml`](https://github.com/brawer/osmdiffs/blob/main/.github/release.yml)’s categorized release notes — so getting the type right saves the maintainer a manual labeling step, it’s not just a style nit. @@ -64,7 +64,7 @@ API.” `osm-diffs` doesn’t have one client code links against — what it has is an **output schema** (`conflated.parquet`), and that’s what matters to everyone downstream. So on this project, `!` means *this PR breaks the output schema*, per the rules in -[`RELEASING.md`](https://github.com/alltheplaces/osm-diffs/blob/main/docs/RELEASING.md#choosing-the-version-number) +[`RELEASING.md`](https://github.com/brawer/osmdiffs/blob/main/docs/RELEASING.md#choosing-the-version-number) — not that some function signature changed. A `refactor!:` or `chore!:` that happens to rename a Parquet column is exactly as `!` as a `feat!:` that removes one; a `feat:` CLI flag that doesn’t touch the schema isn’t @@ -73,10 +73,10 @@ floor, but the actual version is still your call, per `RELEASING.md`. ## Where to go next -- [`docs/TESTING.md`](https://github.com/alltheplaces/osm-diffs/blob/main/docs/TESTING.md) +- [`docs/TESTING.md`](https://github.com/brawer/osmdiffs/blob/main/docs/TESTING.md) — how this project’s tests are organized, and how to try a change on real full-planet data before it lands. -- [`docs/RELEASING.md`](https://github.com/alltheplaces/osm-diffs/blob/main/docs/RELEASING.md) +- [`docs/RELEASING.md`](https://github.com/brawer/osmdiffs/blob/main/docs/RELEASING.md) — how a release actually ships, for once your change has landed on `main`. diff --git a/docs/LOGGING.md b/docs/LOGGING.md index 1b18a545..a0bb3c6c 100644 --- a/docs/LOGGING.md +++ b/docs/LOGGING.md @@ -59,12 +59,12 @@ thing. Two concrete examples of what this data enables, both written by [Claude Code](https://claude.com/claude-code) straight from a run’s logs, with no other tooling built for the purpose: -- [alltheplaces/osm-diffs#665, comment](https://github.com/alltheplaces/osm-diffs/pull/665#issuecomment-5303068423) — +- [brawer/osmdiffs#665, comment](https://github.com/brawer/osmdiffs/pull/665#issuecomment-5303068423) — a full memory/disk/timing analysis of a full-planet run on memory-constrained hardware, validating the design assumption behind `OsmFeatureIndex` (relying on the OS page cache instead of an explicit decode cache). -- [alltheplaces/osm-diffs#636](https://github.com/alltheplaces/osm-diffs/issues/636) — +- [brawer/osmdiffs#636](https://github.com/brawer/osmdiffs/issues/636) — a survey of OpenStreetMap data-quality issues, found by combing through `pipeline.log`’s `could not build geometry` warnings and cross-referencing the flagged features against the live OSM API. diff --git a/docs/PRODUCTION.md b/docs/PRODUCTION.md index d6ba0437..6aaccda4 100644 --- a/docs/PRODUCTION.md +++ b/docs/PRODUCTION.md @@ -5,8 +5,8 @@ document isn’t a description of an existing deployment; it’s the operational knowledge gathered from testing on Hetzner Cloud ([`scripts/test-on-hetzner`](../scripts/test-on-hetzner/README.md), -[#711](https://github.com/alltheplaces/osm-diffs/issues/711), -[#722](https://github.com/alltheplaces/osm-diffs/issues/722)), written +[#711](https://github.com/brawer/osmdiffs/issues/711), +[#722](https://github.com/brawer/osmdiffs/issues/722)), written down now so whoever sets up the actual deployment doesn’t have to re-establish it from scratch. @@ -47,7 +47,7 @@ generous limit. to **~143GB** once `import_osm` finishes and its temporary files are cleaned up — consistent across two independent runs on different hardware (this sweep, and the earlier -[#665](https://github.com/alltheplaces/osm-diffs/issues/665) shakedown, +[#665](https://github.com/brawer/osmdiffs/issues/665) shakedown, which saw ~174GB peak / ~148GB settled). **220–250GB** gives reasonable headroom over that peak without being wildly oversized; the 400GB default `scripts/test-on-hetzner/cloud_test.py` uses for testing is @@ -55,9 +55,9 @@ itself generous margin, not a sizing recommendation. ## Container invocation -The published image (`ghcr.io/alltheplaces/osm-diffs:vX.Y.Z` — pin an +The published image (`ghcr.io/brawer/osmdiffs:vX.Y.Z` — pin an exact tag; see -[the releases page](https://github.com/alltheplaces/osm-diffs/releases) +[the releases page](https://github.com/brawer/osmdiffs/releases) for the current version and its notes) runs as: ```sh @@ -65,7 +65,7 @@ podman run --rm --read-only \ --memory=8g --cpus=6 \ -v /path/to/workdir:/workdir \ --env-file s3.env \ - ghcr.io/alltheplaces/osm-diffs:vX.Y.Z \ + ghcr.io/brawer/osmdiffs:vX.Y.Z \ run --workdir /workdir --run_id "$RUN_ID" ``` @@ -249,7 +249,7 @@ get started: - **Step timings drifting**: `import_osm`’s own sub-steps (`import_osm.fetch`/`.open`/`.prune`/`.assemble`/`.index`, logged individually as of - [#761](https://github.com/alltheplaces/osm-diffs/pull/761)) are worth + [#761](https://github.com/brawer/osmdiffs/pull/761)) are worth watching over time as the planet grows — a slow drift is expected; a sudden jump on an otherwise-unchanged config is worth investigating the way this document’s own `--mem-limit` sweep did. diff --git a/docs/RELEASING.md b/docs/RELEASING.md index fe4a2af5..5fb382b2 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -145,7 +145,7 @@ two checks described in done for real rather than assumed. This is exactly what was done by hand to confirm v0.6.9, the first release cut with `cut-release.sh` — see the comment trail on -[alltheplaces/osm-diffs#562](https://github.com/alltheplaces/osm-diffs/pull/562) +[brawer/osmdiffs#562](https://github.com/brawer/osmdiffs/pull/562) for that walkthrough, which is what `verify-release.sh` automates. ## Rules @@ -219,8 +219,8 @@ for that walkthrough, which is what `verify-release.sh` automates. - A few low-priority, deliberately-deferred items are tracked separately and don’t block anything: automated freshness checks for vendored dependencies - ([#555](https://github.com/alltheplaces/osm-diffs/issues/555)), moving + ([#555](https://github.com/brawer/osmdiffs/issues/555)), moving `cargo-cyclonedx` off Alpine’s edge repo once it’s available in stable - ([#556](https://github.com/alltheplaces/osm-diffs/issues/556)), and + ([#556](https://github.com/brawer/osmdiffs/issues/556)), and watching for an emerging standard on index-level SBOMs for multi-arch - images ([#589](https://github.com/alltheplaces/osm-diffs/issues/589)). + images ([#589](https://github.com/brawer/osmdiffs/issues/589)). diff --git a/docs/SECURITY.md b/docs/SECURITY.md index 7bec6205..c68945ab 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -6,41 +6,41 @@ report it privately. We prefer the [GitHub mechanism for privately reporting a vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability): under the [repository’s security -tab](https://github.com/alltheplaces/osm-diffs/security), click +tab](https://github.com/brawer/osmdiffs/security), click “Report a vulnerability” to open the advisory form. For how we secure the release process itself — build provenance, SBOMs, signed attestations — see -[`SUPPLY_CHAIN_SECURITY.md`](https://github.com/alltheplaces/osm-diffs/blob/main/docs/SUPPLY_CHAIN_SECURITY.md). +[`SUPPLY_CHAIN_SECURITY.md`](https://github.com/brawer/osmdiffs/blob/main/docs/SUPPLY_CHAIN_SECURITY.md). Our container has no OS at all, so there’s no OS trust store to verify outbound TLS connections against either — see that document’s [“Certificate -trust”](https://github.com/alltheplaces/osm-diffs/blob/main/docs/SUPPLY_CHAIN_SECURITY.md#certificate-trust) +trust”](https://github.com/brawer/osmdiffs/blob/main/docs/SUPPLY_CHAIN_SECURITY.md#certificate-trust) section for what we do instead. Every change also goes through [SAST](https://en.wikipedia.org/wiki/Static_application_security_testing) via [GitHub CodeQL](https://codeql.github.com/), enforced by branch protection on `main` — see -[`TESTING.md`](https://github.com/alltheplaces/osm-diffs/blob/main/docs/TESTING.md) +[`TESTING.md`](https://github.com/brawer/osmdiffs/blob/main/docs/TESTING.md) for details. We publish an [OSSF -Scorecard](https://scorecard.dev/viewer/?uri=github.com/alltheplaces/osm-diffs) +Scorecard](https://scorecard.dev/viewer/?uri=github.com/brawer/osmdiffs) analysis on every push to `main` (badge in the -[README](https://github.com/alltheplaces/osm-diffs#readme)); its +[README](https://github.com/brawer/osmdiffs#readme)); its “Vulnerabilities” check reports known, already-public advisories in our dependencies (RUSTSEC/OSV) — the same ones -[Dependabot](https://github.com/alltheplaces/osm-diffs/network/updates) +[Dependabot](https://github.com/brawer/osmdiffs/network/updates) already opens PRs for. A nonzero score there isn’t a new finding and doesn’t need private disclosure; check [open pull -requests](https://github.com/alltheplaces/osm-diffs/pulls) for the fix +requests](https://github.com/brawer/osmdiffs/pulls) for the fix already in progress. On top of that, -[`cargo-deny.yml`](https://github.com/alltheplaces/osm-diffs/blob/main/.github/workflows/cargo-deny.yml) +[`cargo-deny.yml`](https://github.com/brawer/osmdiffs/blob/main/.github/workflows/cargo-deny.yml) gates PRs and runs weekly, via [`cargo-deny`](https://github.com/EmbarkStudios/cargo-deny) against the rules in -[`deny.toml`](https://github.com/alltheplaces/osm-diffs/blob/main/deny.toml) — +[`deny.toml`](https://github.com/brawer/osmdiffs/blob/main/deny.toml) — dependency licenses, banned/duplicated crates, untrusted sources, and known advisories alike. An advisory that’s already known, already tracked, and not fixable from this repo (e.g. pinned deep in a diff --git a/docs/SUPPLY_CHAIN_SECURITY.md b/docs/SUPPLY_CHAIN_SECURITY.md index be271ffe..73247f03 100644 --- a/docs/SUPPLY_CHAIN_SECURITY.md +++ b/docs/SUPPLY_CHAIN_SECURITY.md @@ -134,7 +134,7 @@ reusable workflow, that file and [`verify-release.sh`](../scripts/verify-release.sh) for the mechanism, and -[alltheplaces/osm-diffs#608](https://github.com/alltheplaces/osm-diffs/pull/608) +[brawer/osmdiffs#608](https://github.com/brawer/osmdiffs/pull/608) for this having been checked against a real release, not just assumed. We use GitHub’s native @@ -151,7 +151,7 @@ per-architecture image gets its own SBOM and provenance attestation, while the top-level manifest list gets only provenance — it has no software content of its own to describe. This matches current mainstream practice; see -[alltheplaces/osm-diffs#589](https://github.com/alltheplaces/osm-diffs/issues/589) +[brawer/osmdiffs#589](https://github.com/brawer/osmdiffs/issues/589) for where it might evolve. ## Immutable releases diff --git a/docs/TECHNICAL_DESIGN.md b/docs/TECHNICAL_DESIGN.md index 02f6c203..d58399d9 100644 --- a/docs/TECHNICAL_DESIGN.md +++ b/docs/TECHNICAL_DESIGN.md @@ -103,7 +103,7 @@ its own. That’s not just assumed to work — it’s been verified on real, memory-constrained hardware, including inside a container under a real cgroup memory limit; see [“Why `conflate` doesn’t need its own cache”](#why-conflate-doesnt-need-its-own-cache) below, and -[#711](https://github.com/alltheplaces/osm-diffs/issues/711) for the +[#711](https://github.com/brawer/osmdiffs/issues/711) for the full sweep. ### What AllThePlaces does @@ -216,7 +216,7 @@ graph TD (Pink boxes are processing steps; plain rectangles are the files they read or write. `alltheplaces.wikidata-ids` has no outgoing edge above: nothing consumes it yet, it’s generated on behalf of planned future -work, see [#682](https://github.com/alltheplaces/osm-diffs/issues/682).) +work, see [#682](https://github.com/brawer/osmdiffs/issues/682).) Every top-level step above is logged with its own wall-clock time and memory snapshot, regardless of success or failure — see @@ -225,7 +225,7 @@ against files already in `--workdir`, so re-running the pipeline in the same directory skips whatever it already built (this also applies below the step level, e.g. within `import_atp`/`import_osm`’s own sub-stages) — though that memoization isn’t fully reliable yet, see -[#704](https://github.com/alltheplaces/osm-diffs/issues/704). +[#704](https://github.com/brawer/osmdiffs/issues/704). `pipeline.log` itself is uploaded — to the *internal* S3 bucket, not the CDN-fronted public one — at the very end of a run no matter how the run went (see [`upload_logs`](../src/pipeline/upload.rs)), so a failed run’s @@ -236,10 +236,10 @@ log is never lost. Timings below come from two full-planet runs on production-representative hardware, not a dev machine: a deliberately memory-constrained, bare (uncontainerized) Hetzner cpx22 (2 vCPU / 4 GB RAM, peaking at ~174 GB -disk used) — see [#665](https://github.com/alltheplaces/osm-diffs/issues/665) +disk used) — see [#665](https://github.com/brawer/osmdiffs/issues/665) for the full writeup — and a later, containerized Hetzner cpx42 (8 vCPU / 16 GB RAM, `podman run --memory=12g --cpus=6`) from the -[#711](https://github.com/alltheplaces/osm-diffs/issues/711)/[#722](https://github.com/alltheplaces/osm-diffs/issues/722) +[#711](https://github.com/brawer/osmdiffs/issues/711)/[#722](https://github.com/brawer/osmdiffs/issues/722) `--mem-limit` sweep — see [`PRODUCTION.md`](PRODUCTION.md) for that sweep’s full results and the recommended production configuration. The two runs used different hardware and container configuration, so @@ -262,12 +262,12 @@ fetch away. ([`src/pipeline/atp/wikidata_ids.rs`](../src/pipeline/atp/wikidata_ids.rs)) — extracts every `wikidata`/`brand:wikidata`/… tag value ATP carries, for a planned future feature (flagging OSM-only features whose brand ATP - tracks elsewhere, [#682](https://github.com/alltheplaces/osm-diffs/issues/682)); + tracks elsewhere, [#682](https://github.com/brawer/osmdiffs/issues/682)); not consumed by anything yet. Not separately timed. - **`import_osm`** ([`src/pipeline/osm/`](../src/pipeline/osm/)) — downloads the OpenStreetMap planet dump over plain HTTPS (`fetch.rs`; a redirect straight to a well-provisioned cloud object store, not - BitTorrent — see [#755](https://github.com/alltheplaces/osm-diffs/pull/755) + BitTorrent — see [#755](https://github.com/brawer/osmdiffs/pull/755) for why that switch happened); does a first pass over it that decides, by tag, which nodes/ways/relations are even worth fully assembling, and which node coordinates and relation members they’ll @@ -425,7 +425,7 @@ on production hardware, not just a development machine, since page-cache behavior under real memory pressure and container limits doesn’t reliably transfer from a laptop. -On the same [#665](https://github.com/alltheplaces/osm-diffs/issues/665) +On the same [#665](https://github.com/brawer/osmdiffs/issues/665) run, peak RSS was 3.16–3.39 GiB on a 3.7 GiB box (cgroup accounting agrees: ~3.5 GB) — and during `conflate.match` specifically, over 94% of that was page-cache-backed (`rss_file_bytes`), not heap. That’s not @@ -450,7 +450,7 @@ again dominated during `conflate.match` (11.0 GB of 11.2 GB total RSS), with no OOM-kill even while `cgroup_current_bytes` briefly touched 89–90% of the limit during the later, non-`conflate` steps. A follow-up `--mem-limit` sweep down to genuinely tight limits -([#711](https://github.com/alltheplaces/osm-diffs/issues/711)) +([#711](https://github.com/brawer/osmdiffs/issues/711)) confirmed the design holds well below that comfortable baseline too — see [`PRODUCTION.md`](PRODUCTION.md) for the full results and the recommended production memory limit. @@ -556,8 +556,8 @@ until the full pipeline was proven out: `brand:wikidata`, and matching well beyond stores (a tree matcher conflating municipal tree datasets against OSM by spatial distance and species looks particularly tractable). See - [#708](https://github.com/alltheplaces/osm-diffs/issues/708). + [#708](https://github.com/brawer/osmdiffs/issues/708). - There’s no per-row match-confidence or cartographic-importance signal yet, so both PMTiles archives rely entirely on tippecanoe’s own density-based dropping at low zoom — see - [#713](https://github.com/alltheplaces/osm-diffs/issues/713). + [#713](https://github.com/brawer/osmdiffs/issues/713). diff --git a/docs/TESTING.md b/docs/TESTING.md index 28a25402..e1f004b3 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -48,7 +48,7 @@ coverage instrumentation), exported as [Cobertura XML](https://www.baeldung.com/cobertura) — originally a Java coverage tool’s report format, now emitted by plenty of non-Java tools too, `cargo-llvm-cov` among them — and uploaded to -[Coveralls](https://coveralls.io/github/alltheplaces/osm-diffs?branch=main) +[Coveralls](https://coveralls.io/github/brawer/osmdiffs?branch=main) — that’s the little coverage badge at the top of the main [`README.md`](../README.md). CI fails if line coverage drops below the threshold set in `test.yml`. @@ -62,10 +62,10 @@ On a PR, findings post directly on the review thread. `codeql.yml` also runs on a weekly schedule against `main`, independent of any PR or push; *those* findings don’t have a PR to comment on, so they show up instead as code scanning alerts on the repository’s -[Security tab](https://github.com/alltheplaces/osm-diffs/security). +[Security tab](https://github.com/brawer/osmdiffs/security). `main` is protected by a -[ruleset](https://github.com/alltheplaces/osm-diffs/rules/11597145) +[ruleset](https://github.com/brawer/osmdiffs/rules/11597145) requiring `test.yml`’s tests and a clean CodeQL scan before merging — so a red check there isn’t optional. `test-container.yml` isn’t part of that ruleset (it only triggers on the paths above, and GitHub can’t diff --git a/docs/notes/2026-08-27-connector-line-zoom-runaway.md b/docs/notes/2026-08-27-connector-line-zoom-runaway.md index b7a14263..fb2b34c1 100644 --- a/docs/notes/2026-08-27-connector-line-zoom-runaway.md +++ b/docs/notes/2026-08-27-connector-line-zoom-runaway.md @@ -1,6 +1,6 @@ # Connector-line visualization: a zoom-runaway gotcha, and the fix -Investigation note for [#775](https://github.com/alltheplaces/osm-diffs/issues/775) +Investigation note for [#775](https://github.com/brawer/osmdiffs/issues/775) (visualize the ATP↔OSM offset in `conflated.pmtiles` with a connector line). A prototype, its measurements, and six real sample renders are published as an artifact: diff --git a/docs/outputs/CONFLATED_PARQUET.md b/docs/outputs/CONFLATED_PARQUET.md index 6742fbe7..0ea26510 100644 --- a/docs/outputs/CONFLATED_PARQUET.md +++ b/docs/outputs/CONFLATED_PARQUET.md @@ -67,7 +67,7 @@ A few things worth calling out that aren’t obvious from the above: changeset number resolves, via OSM’s own public API, to the account that made the edit — unlike a node/way/relation ID, which only identifies a place. See - [#730](https://github.com/alltheplaces/osm-diffs/issues/730) for the + [#730](https://github.com/brawer/osmdiffs/issues/730) for the full reasoning and trade-offs. - **`osm.way_members`/`osm.relation_members` are `null`, not an empty list, when they don’t apply** — a `null` `way_members` means “this diff --git a/scripts/README.md b/scripts/README.md index fdf16c67..14c10144 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -18,7 +18,7 @@ hardware. Both are run by hand when someone notices upstream has moved; nothing here notifies you of a new release. Automating that is a low-priority, deliberately deferred feature request, tracked in -[alltheplaces/osm-diffs#555](https://github.com/alltheplaces/osm-diffs/issues/555). +[brawer/osmdiffs#555](https://github.com/brawer/osmdiffs/issues/555). ## Release engineering @@ -46,10 +46,10 @@ ad hoc validation of a branch before it lands. up a Hetzner Cloud VM, builds a given git branch on it, runs the pipeline against it, and pulls back logs — one command instead of repeating the manual setup by hand each time. See - [alltheplaces/osm-diffs#667](https://github.com/alltheplaces/osm-diffs/issues/667) + [brawer/osmdiffs#667](https://github.com/brawer/osmdiffs/issues/667) for why this exists. - [`test-branch-on-macos/`](test-branch-on-macos/README.md): the same idea, much smaller — build and run the current checkout locally with a `vm_stat`/RSS monitor alongside it, for fast local iteration rather than matching production hardware/toolchain. See - [alltheplaces/osm-diffs#669](https://github.com/alltheplaces/osm-diffs/issues/669). + [brawer/osmdiffs#669](https://github.com/brawer/osmdiffs/issues/669). diff --git a/scripts/sbom/generate-sbom.sh b/scripts/sbom/generate-sbom.sh index b73d67f5..f4d8bb41 100755 --- a/scripts/sbom/generate-sbom.sh +++ b/scripts/sbom/generate-sbom.sh @@ -46,12 +46,12 @@ set -eu -# The registry-qualified image name (e.g. "ghcr.io/alltheplaces/osm-diffs") +# The registry-qualified image name (e.g. "ghcr.io/brawer/osmdiffs") # is known before the build runs, so -- unlike the image digest -- release.yml # can just pass it in as a build arg instead of patching it in afterwards. # Falls back to a plain default for local development and test-container.yml, # neither of which push a real, registry-qualified image. -IMAGE_NAME="${IMAGE_NAME:-alltheplaces/osm-diffs}" +IMAGE_NAME="${IMAGE_NAME:-brawer/osmdiffs}" # ── locate project root and jq scripts ────────────────────────────────────── SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" diff --git a/scripts/sbom/merge.jq b/scripts/sbom/merge.jq index d2815aae..a075cd71 100644 --- a/scripts/sbom/merge.jq +++ b/scripts/sbom/merge.jq @@ -18,7 +18,7 @@ # # Arguments (all required, passed with --arg unless noted): # serial SBOM serial number (a "urn:uuid:..." string) -# image container image name, e.g. "alltheplaces/osm-diffs" +# image container image name, e.g. "brawer/osmdiffs" # timestamp build timestamp, RFC 3339 # pipeline (--slurpfile) the enriched osm-diffs SBOM fragment, as # produced by pipeline.jq @@ -74,8 +74,8 @@ metadata: { timestamp: $timestamp, supplier: { - name: "All The Places", - url: ["https://github.com/alltheplaces/"] + name: "Sascha Brawer", + url: ["https://brawer.ch"] }, lifecycles: [{phase: "build"}], component: { diff --git a/scripts/sbom/pipeline.jq b/scripts/sbom/pipeline.jq index 687a1677..01bcbf52 100644 --- a/scripts/sbom/pipeline.jq +++ b/scripts/sbom/pipeline.jq @@ -75,8 +75,8 @@ else . end | .metadata.lifecycles = [{phase: "build"}] | .metadata.authors = [{name: "Sascha Brawer", email: "sascha@brawer.ch"}] | .metadata.supplier = { - name: "All The Places", - url: ["https://github.com/alltheplaces/"] + name: "Sascha Brawer", + url: ["https://brawer.ch"] } | .metadata.tools = { components: [{ @@ -112,8 +112,8 @@ else . end | } ] } | -.metadata.component.supplier = {name: "All The Places", url: ["https://github.com/alltheplaces/"]} | -.metadata.component.purl = "pkg:github/alltheplaces/osm-diffs@" + .metadata.component.version | +.metadata.component.supplier = {name: "Sascha Brawer", url: ["https://brawer.ch"]} | +.metadata.component.purl = "pkg:github/brawer/osmdiffs@" + .metadata.component.version | .metadata.component.licenses = [{expression: "MIT"}] | .components |= [ .[] | add_supplier ] | diff --git a/scripts/sbom/tippecanoe-binary.jq b/scripts/sbom/tippecanoe-binary.jq index 9b8d5b53..2db99ebc 100644 --- a/scripts/sbom/tippecanoe-binary.jq +++ b/scripts/sbom/tippecanoe-binary.jq @@ -44,7 +44,7 @@ def alpine_supplier: {name: "Alpine Linux", url: ["https://alpinelinux.org"]}; metadata: { lifecycles: [{phase: "build"}], authors: [{name: "Sascha Brawer", email: "sascha@brawer.ch"}], - supplier: {name: "All The Places", url: ["https://github.com/alltheplaces/"]}, + supplier: {name: "Sascha Brawer", url: ["https://brawer.ch"]}, component: { type: "application", name: $NAME, diff --git a/scripts/test-on-hetzner/README.md b/scripts/test-on-hetzner/README.md index 30dca7f0..1a47d49c 100644 --- a/scripts/test-on-hetzner/README.md +++ b/scripts/test-on-hetzner/README.md @@ -12,12 +12,12 @@ time. Runs either bare (the pipeline binary extracted straight onto the VM) or, via `start --containerized`, inside `podman run --memory=/--cpus=` for real cgroup memory/CPU accounting -- see -[#722](https://github.com/alltheplaces/osm-diffs/issues/722) for why +[#722](https://github.com/brawer/osmdiffs/issues/722) for why that distinction matters (a bare VM run can never populate `pipeline.log`'s own `cgroup_*` fields; a containerized one can). This exists because staged rollouts of large pipeline changes (see e.g. -[#655](https://github.com/alltheplaces/osm-diffs/issues/655)) call for +[#655](https://github.com/brawer/osmdiffs/issues/655)) call for repeating this exact dance on cloud hardware at multiple points, not just once -- and doing it by hand each time is slow and error-prone (in one evening we hit: an accidentally-wrong OS image, a default file @@ -111,7 +111,7 @@ restart a run with a clean workdir without tearing down the VM |---|---| | `up` | Create the server + volume, deploy, start the pipeline. | | `create` | Server + a formatted, attached, automounted data volume. Also collects `sysinfo` and runs `fio` once, automatically. Prints the exact `destroy` command needed to remove what it just created. | -| `deploy` | `--branch NAME`: clone/update the given branch on an existing server and build it via the project's `Containerfile`, natively (see below for why that matters). `--image REF`: pull an already-built image instead (e.g. `ghcr.io/alltheplaces/osm-diffs:v1.2.3`) -- either way, binaries get extracted the same way, so bare-mode `start` works unchanged regardless of which path was used. | +| `deploy` | `--branch NAME`: clone/update the given branch on an existing server and build it via the project's `Containerfile`, natively (see below for why that matters). `--image REF`: pull an already-built image instead (e.g. `ghcr.io/brawer/osmdiffs:v1.2.3`) -- either way, binaries get extracted the same way, so bare-mode `start` works unchanged regardless of which path was used. | | `start` | Launch `osm-diffs run` and the vmstat/disk monitor, both detached via `systemd-run`. `--clean` clears the workdir first but keeps `planet-latest.osm.pbf`/its metadata sidecar, so re-running doesn't re-download the ~94GB planet file. `--containerized --mem-limit SIZE --cpu-limit N` runs `podman run` against the image `deploy` produced instead of the bare extracted binary, for real cgroup accounting -- see below. | | `status` | `systemctl status` for the run, plus `df` and the last few `pipeline.log` lines. | | `fio` | Random-read benchmark of the attached volume (the same command used by hand throughout the PR 665 experiment -- see `#667`). Re-runnable anytime, e.g. to check whether a result was a one-off blip. | @@ -130,7 +130,7 @@ are `cpx32` / `hel1` / a 400GB volume, all overridable. ```console $ ./cloud_test.py up --name reg1 --ssh-key my-key \ - --image ghcr.io/alltheplaces/osm-diffs:v1.2.3 \ + --image ghcr.io/brawer/osmdiffs:v1.2.3 \ --containerized --mem-limit 4g --cpu-limit 2 \ --regional-extract europe/switzerland ``` diff --git a/scripts/test-on-hetzner/cloud_test.py b/scripts/test-on-hetzner/cloud_test.py index c739d054..d8607e9e 100755 --- a/scripts/test-on-hetzner/cloud_test.py +++ b/scripts/test-on-hetzner/cloud_test.py @@ -35,7 +35,7 @@ DEFAULT_LOCATION = "hel1" DEFAULT_TYPE = "cpx32" DEFAULT_VOLUME_SIZE = 400 -DEFAULT_REPO = "https://github.com/alltheplaces/osm-diffs.git" +DEFAULT_REPO = "https://github.com/brawer/osmdiffs.git" LABEL_KEY = "osm-diffs-test" REMOTE_DIR = "/root/osm-diffs" SCRIPT_DIR = Path(__file__).resolve().parent @@ -171,7 +171,7 @@ def label_flags(name, branch=None, image=None): labels.append(f"{LABEL_KEY}-branch={branch.replace('/', '--')}") if image: # Same restriction as branch names, plus image refs also use ":" - # for the tag (e.g. ghcr.io/alltheplaces/osm-diffs:v1.2.3). + # for the tag (e.g. ghcr.io/brawer/osmdiffs:v1.2.3). sanitized = image.replace("/", "--").replace(":", "--") labels.append(f"{LABEL_KEY}-image={sanitized}") flags = [] @@ -697,7 +697,7 @@ def add_deploy_target(p): group.add_argument("--branch", help="git branch/ref to build") group.add_argument( "--image", - help="pull this image instead of building (e.g. ghcr.io/alltheplaces/osm-diffs:v1.2.3)", + help="pull this image instead of building (e.g. ghcr.io/brawer/osmdiffs:v1.2.3)", ) p.add_argument("--repo", default=DEFAULT_REPO, help="ignored with --image") diff --git a/scripts/test-on-hetzner/test_data/README.md b/scripts/test-on-hetzner/test_data/README.md index 41120397..b67eb216 100644 --- a/scripts/test-on-hetzner/test_data/README.md +++ b/scripts/test-on-hetzner/test_data/README.md @@ -7,7 +7,7 @@ what these logs actually look like, and as fixtures for exercising Assembled from real values captured during the PR 665 (`OsmFeatureIndex`/ `conflate`) Hetzner experiment (see -[#667](https://github.com/alltheplaces/osm-diffs/issues/667)) -- real +[#667](https://github.com/brawer/osmdiffs/issues/667)) -- real message text, field names, and typical magnitudes -- but reassembled and re-timestamped into one small, internally-consistent example rather than a verbatim capture of any single run. In particular, `pipeline.log` diff --git a/scripts/test-on-hetzner/tests/test_cloud_test.py b/scripts/test-on-hetzner/tests/test_cloud_test.py index 3a46a208..a7bda5af 100644 --- a/scripts/test-on-hetzner/tests/test_cloud_test.py +++ b/scripts/test-on-hetzner/tests/test_cloud_test.py @@ -35,8 +35,8 @@ def test_label_flags_sanitizes_branch_slash(): def test_label_flags_sanitizes_image_slash_and_colon(): - flags = ct.label_flags("myname", image="ghcr.io/alltheplaces/osm-diffs:v1.2.3") - assert flags[-1] == "osm-diffs-test-image=ghcr.io--alltheplaces--osm-diffs--v1.2.3" + flags = ct.label_flags("myname", image="ghcr.io/brawer/osmdiffs:v1.2.3") + assert flags[-1] == "osm-diffs-test-image=ghcr.io--brawer--osmdiffs--v1.2.3" def test_label_flags_no_branch_or_image(): diff --git a/src/geometry/geometry_builder.rs b/src/geometry/geometry_builder.rs index 56fdf5c6..3fc6e816 100644 --- a/src/geometry/geometry_builder.rs +++ b/src/geometry/geometry_builder.rs @@ -652,7 +652,7 @@ mod tests { } } - /// https://github.com/alltheplaces/osm-diffs/issues/531: a ring made + /// https://github.com/brawer/osmdiffs/issues/531: a ring made /// of 2+ *open* member ways (rather than one already-closed way) /// closes once `LineStitcher` stitches them together, and in /// Containment mode that closed loop should be promoted to a ring -- @@ -704,7 +704,7 @@ mod tests { } } - /// The https://github.com/alltheplaces/osm-diffs/issues/533 scenario, + /// The https://github.com/brawer/osmdiffs/issues/533 scenario, /// end to end through `GeometryBuilder`: an "outline" member that's /// the exact union of the other members should reconstruct the full /// outline under `PolygonFill::Union`, not (as `Containment` would) diff --git a/src/geometry/line_stitcher.rs b/src/geometry/line_stitcher.rs index 6470f35c..ce838bec 100644 --- a/src/geometry/line_stitcher.rs +++ b/src/geometry/line_stitcher.rs @@ -110,7 +110,7 @@ enum ChainEnd { /// after every cutting round and only stops once a round leaves the piece /// count unchanged, so `A,B` and `B,D,E,A` end up merged back into the /// closed ring they were always meant to be. See -/// . +/// . /// /// # Duplicate segments /// A segment shared verbatim by two ways in the *same* direction (as @@ -124,7 +124,7 @@ enum ChainEnd { /// (`cut_round`, via [`line_key`]) for exactly this reason -- the same /// idea as [`PolygonAssembler`](super::PolygonAssembler)'s duplicate-ring /// guard, applied to open pieces instead of closed rings. See -/// . +/// . pub struct LineStitcher { lines: Vec>>, reference_x: Option, @@ -201,7 +201,7 @@ impl LineStitcher { /// `power=generator`/`generator:source=solar` multipolygon mapped /// panel-by-panel), every single one can collapse this way, and the /// whole relation's geometry vanishes. See - /// . + /// . fn compact(&mut self) { for _ in 0..40 { if self.total_coords <= self.max_coordinates { @@ -634,7 +634,7 @@ mod tests { } } - /// https://github.com/alltheplaces/osm-diffs/issues/537, mirroring + /// https://github.com/brawer/osmdiffs/issues/537, mirroring /// osm-testdata grid fixture `7/742`: two ways sharing both endpoints /// but doubling back on one segment (`A→B→C` and `C→B→D→E→A`) stitch /// into a chain that revisits `B`. Cutting that "spike" away should @@ -665,7 +665,7 @@ mod tests { } } - /// https://github.com/alltheplaces/osm-diffs/issues/541, mirroring + /// https://github.com/brawer/osmdiffs/issues/541, mirroring /// osm-testdata grid fixture `7/711`: two ways sharing the same /// segment in the *same* direction (`A→B→C` and `B→C→D→A`) -- unlike /// a spike's reversal -- should still close into the one ring they @@ -769,7 +769,7 @@ mod tests { #[test] fn many_small_closed_loops_survive_compaction_as_valid_rings() { - // Regression test for https://github.com/alltheplaces/osm-diffs/issues/635: + // Regression test for https://github.com/brawer/osmdiffs/issues/635: // a large `type=multipolygon` relation whose member ways are each // individually closed but untagged (so `assemble_ways` routes them // through `build_line`/`LineStitcher` rather than `build_ring`, diff --git a/src/geometry/polygon_assembler.rs b/src/geometry/polygon_assembler.rs index 295a1698..ae0f55fe 100644 --- a/src/geometry/polygon_assembler.rs +++ b/src/geometry/polygon_assembler.rs @@ -33,7 +33,7 @@ const DEFAULT_MAX_RING_COORDINATES: usize = 2000; /// against this by dropping any ring that's an exact duplicate -- up to /// starting point and winding direction -- of one already added (see /// [`ring_key`]), rather than letting an even multiplicity cancel it out. -/// See . +/// See . /// /// # Antimeridian handling /// Rings passed in are assumed to already be internally antimeridian-safe @@ -384,7 +384,7 @@ mod tests { } } - /// https://github.com/alltheplaces/osm-diffs/issues/532, mirroring + /// https://github.com/brawer/osmdiffs/issues/532, mirroring /// grid fixture `7/790`: a ring added twice (the same OSM way listed /// twice as a member) must not cancel itself out under the even-odd /// rule -- it should still resolve to that one ring's shape. diff --git a/src/geometry/polygon_union.rs b/src/geometry/polygon_union.rs index ce7c89dd..bd5b9c15 100644 --- a/src/geometry/polygon_union.rs +++ b/src/geometry/polygon_union.rs @@ -210,7 +210,7 @@ mod tests { } /// The scenario from - /// : an + /// : an /// `outline` polygon that's the exact union of several `part` /// polygons should union back to the full outline, not (as /// `PolygonAssembler`'s nesting rule would do) have the parts punched diff --git a/src/pipeline/atp/mod.rs b/src/pipeline/atp/mod.rs index c97f9d03..611a5982 100644 --- a/src/pipeline/atp/mod.rs +++ b/src/pipeline/atp/mod.rs @@ -373,7 +373,7 @@ fn parse_geometry(geojson: &GeoJson) -> Option> { /// `pipeline::conflate` searches a radius around this point instead of /// querying by actual coverage the way it does for OSM features (see /// `tables::feature_index`'s module doc comment); see -/// [alltheplaces/osm-diffs#700](https://github.com/alltheplaces/osm-diffs/issues/700). +/// [brawer/osmdiffs#700](https://github.com/brawer/osmdiffs/issues/700). fn find_point(geom: &geo::Geometry) -> Option { match geom { geo::Geometry::LineString(line_string) => { @@ -518,7 +518,7 @@ mod tests { geo::Geometry::from(Point::new(x, y)) } - /// Regression test for alltheplaces/osm-diffs#690: `find_point` + /// Regression test for brawer/osmdiffs#690: `find_point` /// reduces a line/polygon down to a single point for /// `Place::s2_cell_id`, but `Place::shape()` must return the /// feature's real (non-point) geometry, not that reduced point. diff --git a/src/pipeline/atp/wikidata_ids.rs b/src/pipeline/atp/wikidata_ids.rs index bb0622c5..030cb01a 100644 --- a/src/pipeline/atp/wikidata_ids.rs +++ b/src/pipeline/atp/wikidata_ids.rs @@ -11,7 +11,7 @@ //! world, so most unmatched OSM features are unmatched for a mundane //! reason, not because they're stale. Restricting to brands ATP //! actually tracks keeps that signal meaningful. See -//! alltheplaces/osm-diffs#682. +//! brawer/osmdiffs#682. use crate::places::PlaceReader; use crate::tables::U64Set; diff --git a/src/pipeline/conflate/writer.rs b/src/pipeline/conflate/writer.rs index c8f83062..5b56d860 100644 --- a/src/pipeline/conflate/writer.rs +++ b/src/pipeline/conflate/writer.rs @@ -599,7 +599,7 @@ impl ParquetRow { // correct if a caller ever does construct an OSM-only row (e.g. // a future "suggest creating this as a new OSM feature" flow). // Feature carries no precomputed position the way Place does - // (see https://github.com/alltheplaces/osm-diffs/issues/662), so + // (see https://github.com/brawer/osmdiffs/issues/662), so // that branch has to decode geometry and compute a centroid -- // fine for a today-unreached path, not fine to do unconditionally. let s2_cell_id = if let Some(ref atp) = atp { diff --git a/src/pipeline/conflated_tiles.rs b/src/pipeline/conflated_tiles.rs index 9232c2bb..b18ed40e 100644 --- a/src/pipeline/conflated_tiles.rs +++ b/src/pipeline/conflated_tiles.rs @@ -3,7 +3,7 @@ //! *matching* step itself -- every AllThePlaces feature, matched or //! not -- independent of whatever `crate::pipeline::edits` separately //! decides to propose as an edit (see -//! [#709](https://github.com/alltheplaces/osm-diffs/issues/709)). +//! [#709](https://github.com/brawer/osmdiffs/issues/709)). //! //! Unlike `edits`, this doesn't need an external sort: every output //! feature comes from exactly one input row (a row contributes one @@ -41,7 +41,7 @@ //! unmatched features -- which have no stable id, `conflated.parquet` //! carries none for the ATP side -- match the nearest `part: "atp"` //! detail feature of the same `spider`. See -//! [#775](https://github.com/alltheplaces/osm-diffs/issues/775) for +//! [#775](https://github.com/brawer/osmdiffs/issues/775) for //! the full design discussion. use crate::utils::parquet::{get_binary, get_string, get_struct, get_tags, get_u64}; diff --git a/src/pipeline/datapackage.rs b/src/pipeline/datapackage.rs index 83fe9317..50776af5 100644 --- a/src/pipeline/datapackage.rs +++ b/src/pipeline/datapackage.rs @@ -24,19 +24,20 @@ use time::UtcDateTime; use time::format_description::well_known::Rfc3339; const SCHEMA: &str = "https://datapackage.org/profiles/2.0/datapackage.json"; -const NAME: &str = "osm-diffs"; +const NAME: &str = "osmdiffs"; /// The dataset's stable identity -- the same value for every build, /// forever; a downstream catalog keys on it. Generated once as /// `UUIDv5(URL, "https://github.com/alltheplaces/osm-diffs#datapackage")` -/// and frozen here. **Never regenerate this.** +/// -- the repo's pre-2026-09 path, kept verbatim because the value is +/// frozen -- and frozen here. **Never regenerate this.** const ID: &str = "5a01ca49-df2a-5645-8108-bb28c7ab246f"; const TITLE: &str = "AllThePlaces \u{2194} OpenStreetMap conflation"; const DESCRIPTION: &str = "For every AllThePlaces feature that plausibly maps to OpenStreetMap, \ one row pairing it with its matched OpenStreetMap feature (or with no match). GeoParquet 2.0, \ with an AllThePlaces geometry column and an OpenStreetMap one."; -const HOMEPAGE: &str = "https://github.com/alltheplaces/osm-diffs"; +const HOMEPAGE: &str = "https://github.com/brawer/osmdiffs"; /// One file published under `data/` -- carries everything both the S3 /// upload and the manifest's `resources[]` entry need. Built by @@ -200,7 +201,7 @@ mod tests { .unwrap() .starts_with("https://datapackage.org/profiles/2.0/") ); - assert_eq!(doc["name"], "osm-diffs"); + assert_eq!(doc["name"], "osmdiffs"); assert_eq!(doc["id"], ID); // version = the anchor's date; created = its full timestamp. assert_eq!(doc["version"], "2026-09-01"); diff --git a/src/pipeline/edits.rs b/src/pipeline/edits.rs index 21c79bfc..fe9fae27 100644 --- a/src/pipeline/edits.rs +++ b/src/pipeline/edits.rs @@ -51,7 +51,7 @@ pub struct SuggestedEdit { pub tags: Vec<(String, String)>, /// (longitude, latitude). Just the OSM feature's centroid for now, /// not its full shape -- see the plan referenced in - /// alltheplaces/osm-diffs#655 for why this is deliberately scoped + /// brawer/osmdiffs#655 for why this is deliberately scoped /// down; revisit once tile layers are known to handle non-point /// geometry the way this pipeline needs. centroid: (f64, f64), diff --git a/src/pipeline/mod.rs b/src/pipeline/mod.rs index 9d9d16ad..e6e0f136 100644 --- a/src/pipeline/mod.rs +++ b/src/pipeline/mod.rs @@ -10,7 +10,7 @@ use time::UtcDateTime; /// across this pipeline (see the `ext_sort` crate) -- a single, named /// knob to bump if a chunk size ever turns out wrong, instead of hunting /// down ad hoc magic numbers scattered across call sites (see -/// https://github.com/alltheplaces/osm-diffs/issues/657, resolved by +/// https://github.com/brawer/osmdiffs/issues/657, resolved by /// consolidating every call site onto this constant). A chunk is also a /// unit of concurrently-open file descriptors: `ext_sort` keeps every /// spilled chunk's file open at once during its final merge, so a diff --git a/src/pipeline/osm/assemble.rs b/src/pipeline/osm/assemble.rs index b1a334ac..4595d386 100644 --- a/src/pipeline/osm/assemble.rs +++ b/src/pipeline/osm/assemble.rs @@ -293,7 +293,7 @@ fn assemble_ways<'a>( // possible area. Route those straight to `build_line` instead of // calling `build_ring` just to watch it correctly reject an // unbuildable ring (and drop the feature). - // See https://github.com/alltheplaces/osm-diffs/issues/627. + // See https://github.com/brawer/osmdiffs/issues/627. let geometry = if is_area(is_closed, way.tags()) && ring_is_geometrically_possible(way_members_count) { @@ -389,7 +389,7 @@ struct AssembledLeafRelations<'a> { /// -- e.g. `A, B, A`, a path that goes out and immediately doubles back /// on itself -- `build_ring` is guaranteed to return `None`, no matter /// what `is_area()`'s tag heuristic says. See -/// . +/// . fn ring_is_geometrically_possible(way_members_count: usize) -> bool { way_members_count >= 4 } @@ -889,8 +889,8 @@ fn relation_type_from_feature_tags<'a>(tags: &[u32], strings: &'a StringPool) -> /// defined in a similar manner as multipolygons: they must contain at /// least one outer way, and additional ways can be used to define /// enclaves or exclaves"). See also -/// and -/// for the bug this +/// and +/// for the bug this /// function fixes. fn polygon_fill_for_relation_type(relation_type: Option<&str>) -> PolygonFill { match relation_type { diff --git a/src/pipeline/osm/mod.rs b/src/pipeline/osm/mod.rs index 7716f2ca..e2e7adca 100644 --- a/src/pipeline/osm/mod.rs +++ b/src/pipeline/osm/mod.rs @@ -88,7 +88,7 @@ pub fn import_osm<'a>( // index-build into one undifferentiated number; not enough // resolution to tell which of those actually needs the memory a // tight `--mem-limit` run runs short on (see #711's investigation, - // e.g. alltheplaces/osm-diffs#711's comments for a real case where + // e.g. brawer/osmdiffs#711's comments for a real case where // that distinction mattered). let (pbf, fetch_metadata) = super::run_step("import_osm.fetch", || { fetch::fetch_planet(http_client, progress, workdir) diff --git a/src/pipeline/provenance.rs b/src/pipeline/provenance.rs index ff491bac..dfa37a3d 100644 --- a/src/pipeline/provenance.rs +++ b/src/pipeline/provenance.rs @@ -23,7 +23,7 @@ use uuid::Uuid; /// GitHub repository this pipeline is published from -- used to build /// `metadata.tools.components[0]`'s external references and purl. -const REPO_URL: &str = "https://github.com/alltheplaces/osm-diffs"; +const REPO_URL: &str = "https://github.com/brawer/osmdiffs"; /// Canonical license text URL for `ODbL-1.0`, shared with /// `pipeline::datapackage` (the Frictionless manifest's `licenses`). @@ -71,12 +71,22 @@ const CC0_URL: &str = "https://creativecommons.org/publicdomain/zero/1.0/legalco /// with this pipeline's ODbL-licensed output. const ATP_IN_OSM_LICENSING_DISCUSSION_URL: &str = "https://osmfoundation.org/wiki/Licensing_Working_Group/Minutes/2023-08-14#Ticket%232023081110000064_%E2%80%94_First_party_websites_as_sources"; -/// Supplier declared for this BOM and the AllThePlaces component. Copied -/// verbatim from `scripts/sbom/merge.jq`'s `metadata.supplier` (the -/// container-image SBOM) rather than kept in sync programmatically -- -/// the project name won't change, and if it ever does, a grep finds -/// both places. +/// Supplier declared for this BOM and its output component: whoever +/// stewards this pipeline and stands behind the data it publishes. Kept +/// in sync by grep with `scripts/sbom/merge.jq`'s `metadata.supplier` +/// (the container-image SBOM) and `pipeline.jq`'s +/// `metadata.component.supplier`, not programmatically. fn supplier() -> Value { + json!({ + "name": "Sascha Brawer", + "url": ["https://brawer.ch"] + }) +} + +/// Supplier declared for the AllThePlaces input component only -- distinct +/// from `supplier()`: the All The Places project, not us, supplies the +/// scraped-POI dataset this pipeline consumes. +fn atp_supplier() -> Value { json!({ "name": "All The Places", "url": ["https://github.com/alltheplaces/"] @@ -197,7 +207,9 @@ fn anchor_timestamp(atp: &AtpMetadata, osm: &OsmMetadata) -> UtcDateTime { /// BOM's `serialNumber` -- a constant so the derivation /// `UUIDv5(namespace, atp_sha256 ":" osm_sha256)` is entirely /// self-contained. Generated once as `UUIDv5(URL, -/// "https://github.com/alltheplaces/osm-diffs#provenance-bom-serial")`. +/// "https://github.com/alltheplaces/osm-diffs#provenance-bom-serial")` +/// -- the repo's pre-2026-09 path, kept verbatim because the value is +/// frozen. const SERIAL_NAMESPACE: Uuid = Uuid::from_bytes([ 0x18, 0x68, 0x7b, 0x2b, 0xa4, 0x9c, 0x56, 0x07, 0xb1, 0xe7, 0xf7, 0x40, 0xda, 0xee, 0x83, 0x2f, ]); @@ -229,7 +241,7 @@ fn tool_component() -> Value { "type": "application", "name": "osm-diffs", "version": version, - "purl": format!("pkg:github/alltheplaces/osm-diffs@{version}"), + "purl": format!("pkg:github/brawer/osmdiffs@{version}"), "externalReferences": [ {"type": "vcs", "url": REPO_URL}, {"type": "release-notes", "url": format!("{REPO_URL}/releases/tag/{version}")}, @@ -293,7 +305,7 @@ fn atp_component(atp: &AtpMetadata) -> Result { "type": "data", "name": "alltheplaces.zip", "version": &start_time, - "supplier": supplier(), + "supplier": atp_supplier(), "licenses": license("CC0-1.0", CC0_URL), "hashes": [{"alg": "SHA-256", "content": sha256}], "purl": format!( @@ -439,7 +451,7 @@ mod tests { // 2026-03-04, which is later than the OSM snapshot, 2026-01-27), // not the wall clock -- so the BOM is reproducible. assert_eq!(bom["metadata"]["timestamp"], "2026-03-04T15:16:17Z"); - assert_eq!(bom["metadata"]["supplier"]["name"], "All The Places"); + assert_eq!(bom["metadata"]["supplier"]["name"], "Sascha Brawer"); let tool = &bom["metadata"]["tools"]["components"][0]; assert_eq!(tool["bom-ref"], "tool-osm-diffs"); @@ -448,10 +460,7 @@ mod tests { assert_eq!(tool["version"], env!("CARGO_PKG_VERSION")); assert_eq!( tool["purl"], - format!( - "pkg:github/alltheplaces/osm-diffs@{}", - env!("CARGO_PKG_VERSION") - ) + format!("pkg:github/brawer/osmdiffs@{}", env!("CARGO_PKG_VERSION")) ); let output = &bom["metadata"]["component"]; diff --git a/src/pipeline/testdata/datapackage.golden.json b/src/pipeline/testdata/datapackage.golden.json index da077263..4c19021e 100644 --- a/src/pipeline/testdata/datapackage.golden.json +++ b/src/pipeline/testdata/datapackage.golden.json @@ -2,7 +2,7 @@ "$schema": "https://datapackage.org/profiles/2.0/datapackage.json", "created": "2026-09-01T00:00:02Z", "description": "For every AllThePlaces feature that plausibly maps to OpenStreetMap, one row pairing it with its matched OpenStreetMap feature (or with no match). GeoParquet 2.0, with an AllThePlaces geometry column and an OpenStreetMap one.", - "homepage": "https://github.com/alltheplaces/osm-diffs", + "homepage": "https://github.com/brawer/osmdiffs", "id": "5a01ca49-df2a-5645-8108-bb28c7ab246f", "licenses": [ { @@ -11,7 +11,7 @@ "title": "Open Data Commons Open Database License v1.0" } ], - "name": "osm-diffs", + "name": "osmdiffs", "resources": [ { "bytes": 786432000, diff --git a/src/pipeline/upload.rs b/src/pipeline/upload.rs index 93aca671..7065916c 100644 --- a/src/pipeline/upload.rs +++ b/src/pipeline/upload.rs @@ -627,7 +627,7 @@ pub fn upload_logs( // JSON Lines here, but as of August 2026, no consensus has yet been // reached on what string to use, so the registration appears to be // stalled -- see https://github.com/wardi/jsonlines/issues/19. - // Tracked in alltheplaces/osm-diffs#684 to check back in August 2027. + // Tracked in brawer/osmdiffs#684 to check back in August 2027. upload_file( Bucket::Internal, &log_path, diff --git a/src/places/mod.rs b/src/places/mod.rs index 66aad6a3..3518c5ad 100644 --- a/src/places/mod.rs +++ b/src/places/mod.rs @@ -49,7 +49,7 @@ pub struct Place { /// only points. `pipeline::conflate` works around that by searching /// a radius around this cell instead of querying by actual coverage /// -- see - /// [alltheplaces/osm-diffs#700](https://github.com/alltheplaces/osm-diffs/issues/700) + /// [brawer/osmdiffs#700](https://github.com/brawer/osmdiffs/issues/700) /// for the plan to fix this once the library gains that support. pub s2_cell_id: u64, pub spider: String, @@ -216,7 +216,7 @@ mod tests { } /// Regression test for - /// alltheplaces/osm-diffs#690: `Place::shape()` must return this + /// brawer/osmdiffs#690: `Place::shape()` must return this /// feature's real geometry, not a point reconstructed from /// `s2_cell_id` -- so this pins a *non-point* shape and a `coord` /// that's deliberately not one of its vertices (a real representative diff --git a/src/tables/coord_table.rs b/src/tables/coord_table.rs index 04e1c24c..1faebca1 100644 --- a/src/tables/coord_table.rs +++ b/src/tables/coord_table.rs @@ -184,7 +184,7 @@ impl<'a> CoordTable<'a> { /// /// Currently unused -- part of the memoization surface every table in /// this module exposes, but no pipeline stage's staleness check reads - /// it yet. See https://github.com/alltheplaces/osm-diffs/issues/704. + /// it yet. See https://github.com/brawer/osmdiffs/issues/704. #[allow(unused)] pub fn modified(&self) -> Result { Ok(self.file.metadata()?.modified()?) diff --git a/src/tables/geometry_table.rs b/src/tables/geometry_table.rs index 9604fe2d..d9ddaabc 100644 --- a/src/tables/geometry_table.rs +++ b/src/tables/geometry_table.rs @@ -61,7 +61,7 @@ impl<'a> GeometryTable<'a> { /// /// Currently unused -- part of the memoization surface every table in /// this module exposes, but no pipeline stage's staleness check reads - /// it yet. See https://github.com/alltheplaces/osm-diffs/issues/704. + /// it yet. See https://github.com/brawer/osmdiffs/issues/704. #[allow(unused)] pub fn modified(&self) -> Result { self.blobs.modified() diff --git a/src/tables/graph.rs b/src/tables/graph.rs index aa403470..a9185123 100644 --- a/src/tables/graph.rs +++ b/src/tables/graph.rs @@ -158,7 +158,7 @@ impl<'a> GraphTable<'a> { /// /// Currently unused -- part of the memoization surface every table in /// this module exposes, but no pipeline stage's staleness check reads - /// it yet. See https://github.com/alltheplaces/osm-diffs/issues/704. + /// it yet. See https://github.com/brawer/osmdiffs/issues/704. #[allow(unused)] pub fn modified(&'a self) -> Result { Ok(self.file.metadata()?.modified()?) diff --git a/src/tables/sorted_u64_index.rs b/src/tables/sorted_u64_index.rs index 2f35b359..fedba070 100644 --- a/src/tables/sorted_u64_index.rs +++ b/src/tables/sorted_u64_index.rs @@ -16,7 +16,7 @@ //! win when a table's working set doesn't fit in RAM and lookups are //! genuinely page-fault-bound, but that wasn't validated, so plain binary //! search is what's here. See -//! for the +//! for the //! benchmark and discussion. /// Returns the index of `key` in `keys`, or `None` if it is absent. diff --git a/src/tables/u64_set.rs b/src/tables/u64_set.rs index d64a0caa..d477ad59 100644 --- a/src/tables/u64_set.rs +++ b/src/tables/u64_set.rs @@ -127,7 +127,7 @@ impl U64Set { /// /// Currently unused -- part of the memoization surface every table in /// this module exposes, but no pipeline stage's staleness check reads - /// it yet. See https://github.com/alltheplaces/osm-diffs/issues/704. + /// it yet. See https://github.com/brawer/osmdiffs/issues/704. #[allow(unused)] pub fn modified(&self) -> Result { Ok(self.file.metadata()?.modified()?) diff --git a/tests/integration_test.rs b/tests/integration_test.rs index 5162b6b4..04664dc4 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -79,7 +79,7 @@ fn assert_publish_artifacts(workdir: &Path) -> Result<()> { .starts_with("https://datapackage.org/profiles/2.0/"), "datapackage.json is not a Frictionless v2 profile: {manifest}" ); - assert_eq!(manifest["name"], "osm-diffs"); + assert_eq!(manifest["name"], "osmdiffs"); let resources = manifest["resources"].as_array().context("no resources")?; // conflated + bom + conflated-tiles + edits-tiles @@ -472,7 +472,7 @@ fn assert_shops_jsonl(path: &Path) -> Result<()> { // OSM base version it was suggested against -- needed to detect // edit conflicts later (OSM's own edit API uses the version number, // not the changeset, for this), even though nothing uploads edits - // yet. Deliberately no changeset here -- see alltheplaces/osm-diffs#730. + // yet. Deliberately no changeset here -- see brawer/osmdiffs#730. for feature in &features { assert_eq!(feature["type"], "Feature"); assert_eq!(feature["geometry"]["type"], "Point");