From 9fffb3e39cf3dec53b0f1d46cf876fbae123644d Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Fri, 2 Oct 2026 10:06:04 +0200 Subject: [PATCH] Remove legacy platform catalog after verified live switch --- .github/workflows/overlays-published.yml | 2 +- AGENTS.md | 3 +- docs/agents/proxy-release.md | 33 ++++-- integration-proxy/src/catalog.rs | 24 ---- overlays/README.md | 16 +-- overlays/catalog.json | 145 ----------------------- 6 files changed, 33 insertions(+), 190 deletions(-) delete mode 100644 overlays/catalog.json diff --git a/.github/workflows/overlays-published.yml b/.github/workflows/overlays-published.yml index 94ada127..c6f5f23f 100644 --- a/.github/workflows/overlays-published.yml +++ b/.github/workflows/overlays-published.yml @@ -4,7 +4,7 @@ name: Overlays published # .nojekyll so files are served byte-for-byte) publishes overlays/ at # https://ontola.github.io/atomic-plugins/overlays/, where # overlays/catalog/2026-10-02.json and integration-proxy's DEFAULT_CATALOG_PATH expect -# it. After each Pages build this checks that catalog.json and every overlay +# it. After each Pages build this checks that dated catalogs and every overlay # it lists are served there and match the built commit. Pages' CDN caches # for up to 10 minutes, so a mismatch is retried for up to 15 minutes before # failing. diff --git a/AGENTS.md b/AGENTS.md index 70634df7..afcbc805 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -193,7 +193,8 @@ served at `https://ontola.github.io/atomic-plugins/overlays/` — `integration-proxy`'s default `CATALOG_PATH` is that folder's `catalog/2026-10-02.json`. Dated catalogs and OAD-revision overlay filenames are immutable; a new overlay does not change an existing catalog selection. -The unversioned catalog is temporarily deprecated pending the live switch. See +The unversioned catalog was removed after the verified localthought.io switch +on 2026-10-02. See [`overlays/README.md`](overlays/README.md) for the publication model and its checks. Provider paths mirror `openapi-directory` as `overlays/APIs////`. diff --git a/docs/agents/proxy-release.md b/docs/agents/proxy-release.md index 7dbbb0e6..07006248 100644 --- a/docs/agents/proxy-release.md +++ b/docs/agents/proxy-release.md @@ -4,8 +4,9 @@ runs it on Heroku through a small wrapper crate in a separate repository, `localthought/integration-proxy` (template: [`integration-proxy/examples/heroku-wrapper/`](../../integration-proxy/examples/heroku-wrapper/)). -On 2026-09-30 localthought.io ran 0.2.3 (Heroku release v81), from the -hand-over; not verified from here. +On 2026-10-02 localthought.io was verified running proxy 0.2.4 through +wrapper commit `1f89c7efb25f6fd0f7394997e69ed738fd1a4aad` (deployment v84), +with the dated catalog selected in Heroku release v85. **Publishing a crate version and deploying to Heroku each need Michiel's OK, per release** (#227 rule 10). The PRs leading up to them don't. @@ -14,9 +15,7 @@ per release** (#227 rule 10). The PRs leading up to them don't. 1. **Release PR in this repo.** Set `version` in `integration-proxy/Cargo.toml` and give the release its heading in - `integration-proxy/CHANGELOG.md`. (On 2026-09-30 the CHANGELOG still says - "0.2.3 (unreleased)" although 0.2.3 was published; fix that in the next - release PR.) Merge under rule 12. + `integration-proxy/CHANGELOG.md`. Merge under rule 12. 2. **Publish** (Michiel's OK). Tag the merge commit on `main`: ```sh @@ -28,9 +27,9 @@ per release** (#227 rule 10). The PRs leading up to them don't. Publishing (OIDC; no token is stored). A crates.io version is permanent. 3. **Wrapper PR** in `localthought/integration-proxy`: bump the crate in its `Cargo.toml` and `Cargo.lock`. Merge it. -4. **Deploy** (Michiel's OK). Heroku's GitHub auto-deploy doesn't fire, so - push the wrapper's merged commit to the Heroku remote by hand, from a - checkout with Heroku access to the app `integration-proxy`: +4. **Deploy** (Michiel's OK). Check whether GitHub auto-deploy has produced + a release for the merged commit; if it has not, push that commit to the + Heroku remote by hand, from a checkout with Heroku access to the app `integration-proxy`: ```sh git push https://git.heroku.com/integration-proxy.git :refs/heads/main @@ -50,6 +49,18 @@ files and explicitly switch the default or `CATALOG_PATH` to opt in. On 2026-10-02, before this rollout, Heroku's `CATALOG_PATH` was verified as `https://raw.githubusercontent.com/ontola/atomic-plugins/refs/heads/main/overlays/catalog.json` and its current release was v82, deploying wrapper commit `e31b4f2d`. -The unversioned file carries a `_comment` deprecation notice and retains the -prior OAD revisions until the authorized deployment is confirmed to load the -dated catalog. Only then remove it; published overlay revision files remain. +After proxy 0.2.4 was published to crates.io and wrapper PR +[localthought/integration-proxy#81](https://github.com/localthought/integration-proxy/pull/81) +merged, Heroku deployed that wrapper as v84. The authorized catalog switch +created release v85: + +```sh +heroku config:set CATALOG_PATH=https://ontola.github.io/atomic-plugins/overlays/catalog/2026-10-02.json -a integration-proxy +``` + +The running web dyno was up, `/catalog` listed nine platforms, and +`/catalog/discord.yaml` changed from two paths to 153. With that switch +verified, the deprecated `overlays/catalog.json` was removed. Published +overlay revision files remain immutable. The full Discord document composes, +but its mixed bot-token/OAuth connection support awaits +[atomic-plugins#258](https://github.com/ontola/atomic-plugins/issues/258). diff --git a/integration-proxy/src/catalog.rs b/integration-proxy/src/catalog.rs index c8014722..144326b2 100644 --- a/integration-proxy/src/catalog.rs +++ b/integration-proxy/src/catalog.rs @@ -870,30 +870,6 @@ mod tests { .is_ok()); } - #[tokio::test] - #[ignore = "downloads pinned OADs from the deprecated compatibility catalog"] - async fn deprecated_catalog_retains_connectable_security_profiles() { - let overlays = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../overlays"); - let catalog = Catalog::load_with_mirror( - overlays.join("catalog.json").to_str().unwrap(), - &crate::build_http_client(), - Some(&overlays), - ) - .await - .unwrap(); - for name in catalog.names() { - catalog - .security_scheme(&name) - .unwrap_or_else(|error| panic!("{name}: {error}")); - } - assert!(catalog - .allows("discord", "GET", "/api/v10/users/@me") - .is_some()); - assert!(catalog - .allows("discord", "POST", "/api/v10/channels/123/messages") - .is_none()); - } - fn tempfile_path(name: &str) -> std::path::PathBuf { let dir = std::env::temp_dir().join(format!( "integration-proxy-test-{}-{}", diff --git a/overlays/README.md b/overlays/README.md index 24c5836d..f1fd85ae 100644 --- a/overlays/README.md +++ b/overlays/README.md @@ -26,12 +26,12 @@ to `main` changes what the proxy composes at its next start. The OAD `ontola/openapi-directory` document at the full commit SHA that last changed that file, rather than a later unrelated repository commit. -The unversioned `catalog.json` is a deprecated compatibility bridge; its -`_comment` carries the notice without invalidating JSON. It retains the -prior OAD revisions (including Discord's two-read subset and Clockify's -older revision), with their overlays under canonical revision filenames. -Keep it until the authorized localthought.io deployment is confirmed to use -the dated catalog, then remove it. Old overlay revision files stay published. +The unversioned `catalog.json` was removed after localthought.io switched to +this dated catalog on 2026-10-02 (Heroku release v85, wrapper commit +`1f89c7efb25f6fd0f7394997e69ed738fd1a4aad`, proxy 0.2.4). Its live Discord +document changed from two paths to 153, confirming the catalog switch. +Historical overlay revisions remain published, including Discord's two-read +subset and Clockify's older revision; existing revision URLs stay valid. Dated catalogs and their selected revision files are immutable once on `main`; publish a new dated catalog and update the proxy's default or its @@ -92,7 +92,7 @@ python3 overlays/scripts/validate_oad_pins.py --directory /path/to/openapi-direc ``` Add `--fetch-missing` to fetch historical pins absent from current upstream -`main` (the compatibility catalog selects two of these). +`main` (historical Discord and Clockify revisions remain published). The history check accepts old revisions but rejects a pin at a commit that did not change the OAD. For an audit requiring every overlay to target the @@ -155,7 +155,7 @@ Checks: compose the selected dated catalog with the proxy's runtime loader, reading overlays from this folder. - `.github/workflows/overlays-published.yml` (after each Pages build): the - served dated catalogs, the deprecated compatibility catalog, every overlay and Pages-published OAD it lists, and + served dated catalogs, every overlay and Pages-published OAD they list, and the pets demo's data match the built commit. ## Authenticated principal overlays diff --git a/overlays/catalog.json b/overlays/catalog.json deleted file mode 100644 index 85739fc6..00000000 --- a/overlays/catalog.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "platforms": [ - { - "name": "github-issues", - "openapi": "https://raw.githubusercontent.com/ontola/openapi-directory/9c5cfb87b3f8b64e11069373a73e3fc85de0de5e/APIs/github.com/github-issues/1.1.4/openapi.yaml", - "overlays": [ - "https://ontola.github.io/atomic-plugins/overlays/APIs/github.com/github-issues/1.1.4/auth-9c5cfb87b3f8b64e11069373a73e3fc85de0de5e-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/github.com/github-issues/1.1.4/pagination-9c5cfb87b3f8b64e11069373a73e3fc85de0de5e-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/github.com/github-issues/1.1.4/repositories-read-9c5cfb87b3f8b64e11069373a73e3fc85de0de5e-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/github.com/github-issues/1.1.4/crud-causality-9c5cfb87b3f8b64e11069373a73e3fc85de0de5e-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/github.com/github-issues/1.1.4/canonical-paths-9c5cfb87b3f8b64e11069373a73e3fc85de0de5e-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/github.com/github-issues/1.1.4/identity-9c5cfb87b3f8b64e11069373a73e3fc85de0de5e-overlay.yaml" - ], - "selection": { - "oauthSecurityScheme": "githubOAuth", - "tenantIdentity": { - "operationId": "getGitHubAuthenticatedPrincipal", - "namespace": "https://github.com" - } - } - }, - { - "name": "google-calendar", - "openapi": "https://raw.githubusercontent.com/ontola/openapi-directory/32237fa5d14aa887dc9f3923395dac971e00a36c/APIs/googleapis.com/calendar/v3/openapi.yaml", - "overlays": [ - "https://ontola.github.io/atomic-plugins/overlays/APIs/googleapis.com/calendar/v3/auth-32237fa5d14aa887dc9f3923395dac971e00a36c-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/googleapis.com/calendar/v3/app-pagination-32237fa5d14aa887dc9f3923395dac971e00a36c-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/googleapis.com/calendar/v3/app-crud-causality-32237fa5d14aa887dc9f3923395dac971e00a36c-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/googleapis.com/calendar/v3/identity-32237fa5d14aa887dc9f3923395dac971e00a36c-overlay.yaml" - ], - "selection": { - "oauthSecurityScheme": "googleOffline", - "tenantIdentity": { - "operationId": "getGoogleAuthenticatedPrincipal", - "namespace": "https://accounts.google.com" - } - } - }, - { - "name": "moneybird", - "openapi": "https://raw.githubusercontent.com/ontola/openapi-directory/85a6105220036a98ef0d7cd6f228d4aae0036508/APIs/moneybird.com/v2-readonly/openapi.yaml", - "overlays": [ - "https://ontola.github.io/atomic-plugins/overlays/APIs/moneybird.com/v2-readonly/auth-85a6105220036a98ef0d7cd6f228d4aae0036508-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/moneybird.com/v2-readonly/pagination-85a6105220036a98ef0d7cd6f228d4aae0036508-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/moneybird.com/v2-readonly/crud-causality-85a6105220036a98ef0d7cd6f228d4aae0036508-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/moneybird.com/v2-readonly/throttling-85a6105220036a98ef0d7cd6f228d4aae0036508-overlay.yaml" - ], - "selection": { - "query_overrides": [ - { - "path": "/{administration_id}/assets.json", - "values": { - "active": false - } - }, - { - "path": "/{administration_id}/contacts/{contact_id}/additional_charges.json", - "values": { - "include_billed": true - } - }, - { - "path": "/{administration_id}/contacts.json", - "values": { - "include_archived": true - } - }, - { - "path": "/{administration_id}/products.json", - "values": { - "active": false - } - }, - { - "path": "/{administration_id}/projects.json", - "values": { - "filter": "state:all" - } - }, - { - "path": "/{administration_id}/subscriptions/{id}/additional_charges.json", - "values": { - "include_billed": true - } - } - ] - } - }, - { - "name": "todoist", - "openapi": "https://raw.githubusercontent.com/ontola/openapi-directory/ac07532b0a0ac101cf8bae2a54177fb1d8ea3779/APIs/todoist.com/1/openapi.yaml", - "overlays": [ - "https://ontola.github.io/atomic-plugins/overlays/APIs/todoist.com/1/auth-ac07532b0a0ac101cf8bae2a54177fb1d8ea3779-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/todoist.com/1/pagination-ac07532b0a0ac101cf8bae2a54177fb1d8ea3779-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/todoist.com/1/crud-causality-ac07532b0a0ac101cf8bae2a54177fb1d8ea3779-overlay.yaml" - ] - }, - { - "name": "spotify", - "openapi": "https://raw.githubusercontent.com/ontola/openapi-directory/2914e6bed4db4389921b36e4ed79e645c2085668/APIs/spotify.com/1.0.0-readonly/openapi.yaml", - "overlays": [ - "https://ontola.github.io/atomic-plugins/overlays/APIs/spotify.com/1.0.0-readonly/auth-2914e6bed4db4389921b36e4ed79e645c2085668-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/spotify.com/1.0.0-readonly/pagination-2914e6bed4db4389921b36e4ed79e645c2085668-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/spotify.com/1.0.0-readonly/crud-causality-2914e6bed4db4389921b36e4ed79e645c2085668-overlay.yaml" - ] - }, - { - "name": "discord", - "openapi": "https://raw.githubusercontent.com/ontola/openapi-directory/4087a087b080acd1931b39cc942bb7ef92b32e4e/APIs/discord.com/v10-readonly/openapi.yaml", - "overlays": [ - "https://ontola.github.io/atomic-plugins/overlays/APIs/discord.com/v10-readonly/auth-4087a087b080acd1931b39cc942bb7ef92b32e4e-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/discord.com/v10-readonly/pagination-4087a087b080acd1931b39cc942bb7ef92b32e4e-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/discord.com/v10-readonly/crud-causality-4087a087b080acd1931b39cc942bb7ef92b32e4e-overlay.yaml" - ] - }, - { - "name": "notion", - "openapi": "https://raw.githubusercontent.com/ontola/openapi-directory/0c8e229623efdcc1d4ab50111d17bcca3214a899/APIs/notion.com/2026-03-11/openapi.yaml", - "overlays": [ - "https://ontola.github.io/atomic-plugins/overlays/APIs/notion.com/2026-03-11/auth-0c8e229623efdcc1d4ab50111d17bcca3214a899-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/notion.com/2026-03-11/pagination-0c8e229623efdcc1d4ab50111d17bcca3214a899-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/notion.com/2026-03-11/crud-causality-0c8e229623efdcc1d4ab50111d17bcca3214a899-overlay.yaml" - ], - "selection": { - "oauthSecurityScheme": "notionOAuth" - } - }, - { - "name": "clockify", - "openapi": "https://raw.githubusercontent.com/ontola/openapi-directory/dc7b2bdb8b9435ce7da15e48ff3955853bcc589c/APIs/clockify.me/1.0.0-readonly/openapi.yaml", - "overlays": [ - "https://ontola.github.io/atomic-plugins/overlays/APIs/clockify.me/1.0.0-readonly/crud-causality-dc7b2bdb8b9435ce7da15e48ff3955853bcc589c-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/clockify.me/1.0.0-readonly/auth-dc7b2bdb8b9435ce7da15e48ff3955853bcc589c-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/clockify.me/1.0.0-readonly/pagination-dc7b2bdb8b9435ce7da15e48ff3955853bcc589c-overlay.yaml", - "https://ontola.github.io/atomic-plugins/overlays/APIs/clockify.me/1.0.0-readonly/time-entry-write-dc7b2bdb8b9435ce7da15e48ff3955853bcc589c-overlay.yaml" - ] - }, - { - "name": "pets", - "openapi": "https://ontola.github.io/atomic-plugins/overlays/pets-demo/1.0.0/openapi.json", - "overlays": [] - } - ], - "_comment": "Deprecated: switch CATALOG_PATH to https://ontola.github.io/atomic-plugins/overlays/catalog/2026-10-02.json. Retained until localthought.io has switched." -}