Skip to content
6 changes: 4 additions & 2 deletions docs/identity-handoff.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@ No package, image, release asset, or source archive is published by this change.
| Legal copyright owner | Luntraa, Inc. |
| Release API | `https://api.diffex.ai/api/latest-version`, owned by `diffex-cloud` |
| Model catalog API | `https://api.diffex.ai/api/models/providers/{providerId}`, owned by `diffex-cloud` |
| Radius services | Approved external integrations recorded in the candidate handoff |
| Radius services | Removed; prohibited in development, testing, evaluation, and production |
| Security contact | Existing private access to a Diffex repository owner; no dedicated mailbox or public reporting channel claimed |
| Issue authorization | Write/admin permission on the current Diffex repository |

Diffex and Luntraa, Inc. are unrelated to Earendil.
The former staff-team authorization, security mailbox reference, announcement, and product affiliation wording have been removed.
The owner explicitly retained OpenAI Codex and xAI OAuth in addition to the release audit's Radius and provider-attribution integrations.
The owner explicitly retained OpenAI Codex and xAI OAuth and provider attribution.
Radius is removed; the older release audit does not authorize its use.
See [migration and validation](release/radius-removal.md).
The catalog authority is now Diffex; see [the catalog contract](model-catalog.md).
The exact residual inventory is [identity-residual-allowlist.md](../identity-residual-allowlist.md).

Expand Down
22 changes: 13 additions & 9 deletions docs/release/candidate-handoff.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,17 @@ The accepted implementation is [`33704b32c5d17b849c013834fd1c56d65de843fd`](http
The follow-up evidence commit changes only documents; [the artifact manifest](candidate-artifacts.json) pins the tested implementation and bytes.
The companion cloud change is stacked on PR #147.

Current policy supersedes this historical candidate's Radius approval.
Radius is removed and must not be used in development, testing, evaluation, or production.
The pinned JSON manifests and identity reports below describe historical bytes containing Radius and must not be reused as release candidates.
See [Radius removal](radius-removal.md) for current migration and validation.

## Reconciled decisions

The canonical private source, package map, executable, hosted image identity, and Luntraa, Inc. copyright are recorded in [the identity handoff](../identity-handoff.md).
The release audit approves Pi-supported catalogs, Radius gateway/OAuth, and provider attribution.
The historical release audit approved external catalogs and provider attribution.
The owner additionally instructed this implementation to retain OpenAI Codex and xAI OAuth.
The earlier backend plan's proposed replacement catalogs, Diffex Radius service, and replacement provider registrations are therefore not prerequisites for this candidate.
Radius gateway/OAuth approval has been revoked; no replacement Radius service is planned.
No Diffex ownership of those external services or registrations is asserted.

The obsolete security/staff exceptions are removed.
Expand All @@ -34,18 +39,15 @@ The [exact residual inventory](../../identity-residual-allowlist.md) replaces th
| Operation | Endpoint or authority | Policy |
| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| Release discovery | `https://api.diffex.ai/api/latest-version` | Diffex Cloud public Worker; anonymous; fixed canonical package identity; no redirects |
| Diffex account login and product APIs | `https://api.diffex.ai`, existing Render/WorkOS routes | Separate account credentials; never implicitly reused as Radius credentials |
| Diffex account login and product APIs | `https://api.diffex.ai`, existing Render/WorkOS routes | Separate account credentials |
| Built-in catalog refresh | `https://pi.dev/api/models/providers/<provider>` | Explicitly retained external catalogs for configured providers |
| Radius config and inference | `https://radius.pi.dev/v1/config`, gateway-selected message base URL | Explicitly retained Radius trust boundary; provider credentials only |
| Radius OAuth | Gateway `/v1/oauth` discovery and discovered authorization/device/token URLs; client `pi-gateway` | Retained registration; the earlier audit observed issuer `https://radius.earendil.com`; live discovery was not repeated |
| OpenAI Codex | `https://auth.openai.com`, `https://chatgpt.com/backend-api`; client `app_EMoamEEZ73f0CkXaXp7hrann` | Explicit owner retention of OAuth and provider attribution |
| xAI subscription | `https://auth.x.ai/oauth2/device/code`, `https://auth.x.ai/oauth2/token`; client `b1a00492-073a-47ea-816f-4c329264a828` | Explicit owner retention of OAuth and provider attribution |
| Other model providers | Selected built-in provider endpoints or explicitly configured custom endpoints | Provider-specific credentials and model traffic |
| Optional attribution | OpenRouter, NVIDIA NIM, Cloudflare | Existing optional provider headers; default off; separate from removed install reporting |
| OpenCode attribution | Selected OpenCode endpoint | Existing client/session headers retained independently of optional attribution |

Radius discovery and model configurations remain trusted inputs that can supply endpoint URLs.
Retaining them accepts that existing trust boundary; this change does not implement the older plan's endpoint allowlisting or cache-origin migration proposal.
Radius discovery, authentication, and inference are no longer supported or allowed egress.
Custom gateways remain explicit user configuration.
No runtime egress permission extends to install-report routes, upstream update discovery, security reporting to upstream contacts, or external organization authorization.
GitHub access remains available for explicitly requested extension/package operations and source-host operations.
Expand All @@ -55,7 +57,8 @@ GitHub access remains available for explicitly requested extension/package opera
The frozen built-in catalog was generated at `2026-08-25T03:02:44.635Z` with structure hash `888155e376e18c5eb02a88c79c374edaa9a517730bfe17f82f76ca51c96cca12`.
The local build validates and uses that checked-in snapshot without refreshing model metadata.
`packages/ai/src/providers/data/.manifest.json` records every provider shard digest.
The static provider IDs in that manifest, plus dynamic `radius`, remain supported by the source adapters.
The static provider IDs in that historical manifest describe the candidate's catalog.
Dynamic `radius` is no longer supported by the source adapters.
The installed artifact manifest lists all 40 provider IDs and display names; listing a provider does not claim live authentication or inference acceptance.

Configured built-in providers retain the external overlay and its four-hour refresh interval.
Expand All @@ -76,7 +79,8 @@ No deployment or production metadata mutation was needed.
## Validation and explicit exclusions

The full `./test.sh` suite passed without provider credentials.
This includes the retained Radius, OpenAI Codex, xAI, remote catalog, provider-attribution, install-report removal, and updater regressions.
That historical run included Radius, OpenAI Codex, xAI, remote catalog, provider-attribution, install-report removal, and updater regressions.
Current Radius tests assert rejection without service access.
The new issue-workflow tests first reproduced rejection of Diffex maintainers because an inherited token was absent, then passed after repository-scoped authorization replaced it.
The CLI quality gate and exact identity scan passed.
The cloud/CLI contract checker passed with no public contract changes.
Expand Down
6 changes: 5 additions & 1 deletion docs/release/candidate-rehearsal.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Candidate release rehearsal

This is historical evidence for the pinned revision below.
Its Radius-containing artifacts are superseded and must not be reused; see [Radius removal](radius-removal.md).

The rehearsal validates the approved npm-only distribution without publishing a release.
The current public inventory is `@diffexai/diffex`, with internal runtime modules bundled inside its tarball.
The older eleven-package and standalone acceptance requirements are superseded by the owner-approved [distribution policy](distribution-policy.json).
Expand Down Expand Up @@ -91,7 +94,8 @@ These application-level guards and event logs are not a whole-host packet captur
Catalog preparation contacts its approved catalog inputs; the local refresh encountered a transport failure, so the existing validated local snapshot was used for source gates while the native build retained its freshly hydrated snapshot.

The source identity gate accepts exactly seventeen reviewed occurrences across 915 files.
Inspection of every final tarball member finds sixteen identity matches in nine files, all mapping to approved Radius, catalog, OAuth, and provider-attribution entries.
Inspection of that historical tarball found sixteen identity matches in nine files, then approved as Radius, catalog, OAuth, and provider-attribution entries.
Radius approval has since been revoked for every environment.
The final payload gate verifies required notices, runtime-file hashes, the documentation allowlist, and absence of prohibited source and embedded maps.
Image inspection accepts 1,414 project files across twelve runtime workspaces and thirty approved documentation assets.
All isolated installation prefixes, caches, homes, mock sessions, fixture servers, and runtime containers are removed by their harnesses.
Expand Down
3 changes: 2 additions & 1 deletion docs/release/client-canaries.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ npm --prefix <isolated-prefix> install -g --ignore-scripts --min-release-age=0 @
No package-manager process executed, no uninstall was attempted, and no installed software changed.
The preload intercepted the separate `https://pi.dev/api/report-install` call during non-offline startup and returned a controlled failure without forwarding it.
There was no Pi version-check traffic or any Pi socket connection.
Install telemetry, model catalogs, and Radius remain separate migration work.
At the time of this historical run, install telemetry, model catalogs, and Radius remained separate migration work.
Radius is now removed and prohibited in all environments; see [Radius removal](radius-removal.md).

## Regression and artifact checks

Expand Down
1 change: 1 addition & 0 deletions docs/release/provider-branding-validation.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Diffex controls the local callback presentation and default application attribut
Registered OAuth client IDs, provider consent pages, authentication protocols, stored credentials, inference endpoints, and payloads remain unchanged.
The separate Diffex account feature is excluded.
Radius was excluded from the original branding change and subsequently removed from the built-in provider and authentication integrations.
The [Radius removal record](radius-removal.md) supersedes its historical approval and documents configuration rejection and offline validation.

## Implemented defaults

Expand Down
68 changes: 68 additions & 0 deletions docs/release/radius-removal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Radius removal

Radius must not be used in development, testing, evaluation, or production.
The removal supersedes the older candidate handoff and rehearsal approvals.
Historical JSON evidence remains a record of the original bytes, not an approved release candidate or permission to use Radius.

## Configuration behavior

The common rejection explains that Radius support was removed and requires selecting another provider.
The runtime rejects Radius registrations before changing provider or credential state.
It does not migrate Radius traffic to another provider automatically.

| Existing state or request | Result |
| --- | --- |
| Saved API key, OAuth credential, environment key, or model cache | Remains inactive; no refresh, discovery, authentication, or inference request |
| `providers.radius` in `models.json` | Configuration error naming the entry and file, including configurations without OAuth |
| `oauth: "radius"` under another provider ID | Same configuration error before schema validation or provider composition |
| CLI provider/model selection or Radius model scope | Explicit removal error before inference |
| Saved default provider | Startup fails with instructions to update `defaultProvider` and `defaultModel` in `settings.json` |
| Resumed Radius session | Startup fails with instructions to choose a replacement using `--model provider/model` |
| Auth check or credential printing | Explicit removal error; no Radius credential is exported |
| Extension or SDK provider registration | Rejected, including case variants of the removed provider ID |
| `/login` | Radius absent from both subscription and API-key selectors |
| `/logout` with a saved Radius credential | Local credential deletion remains available without contacting the former service |

Invalid Radius entries invalidate the custom configuration file; built-in providers remain registered.
Unselected stale credentials and caches do not prevent use of supported providers.
See the [user migration steps](../../packages/coding-agent/docs/providers.md#removed-providers).

## Source and artifact review

The built-in provider factory, OAuth implementation and loader, environment-key mapping, provider type, and default-model integration were removed in `3cd84966f`.
`f1a3608e1` closes custom-configuration and registration paths and adds actionable selection errors.
`19d038f8b` adds the archive gate and checks legacy CLI and session behavior.
`27b844ad3` presents expected startup rejections without a Node stack trace.
The generic `diffex-messages` transport remains available for other backends, with neutral local test fixtures.

The remaining source references identify the removed provider for rejection or assert that access is unavailable.
Documentation records migration policy or explicitly superseded historical evidence.
CSS `border-radius` properties are unrelated.
The evaluation configuration and workflows contain no Radius integration.

The distribution checker rejects former provider/OAuth module paths and service, environment-key, or client-registration markers in executable payloads and declarations.
The same inspection applies to bundled internal workspaces and nested archives.
The removal explanation itself is permitted.
Old ignored local build outputs were cleaned and regenerated offline rather than edited manually.

## Validation

Validation uses synthetic credentials, local fixtures, and isolated configuration directories.
No Radius service, real provider credential, paid inference, or live Radius compatibility test is used.

- `npm run check` passes, including identity, dependency, lockfile, TypeScript, and browser checks.
- `./test.sh` passes with provider credentials removed and live E2E tests disabled.
- Focused AI tests cover provider discovery, environment-key removal, registration rejection, and the generic message transport.
- Focused coding-agent tests cover stale credentials/caches, configuration, registration, selection, defaults, resumption, auth commands, both login methods, and local logout cleanup.
- The distribution payload suite passes all 47 tests, including stale modules and markers in renamed or bundled payloads.
- Fresh offline compilation and reviewed packing produce a local tarball that passes payload inspection.
- A clean npm consumer installs that tarball with lifecycle scripts disabled and verifies every runtime hash against the reviewed archive.
- The installed executable passes help, version, model listing, controlled print and terminal prompt/reply, Radius search exclusion in both login methods, and clean exit.
- Installed legacy configuration, defaults, resumed sessions, and auth commands produce the removal explanation.

The terminal fixture answers the logical Diffex version request locally and rejects unexpected provider requests and socket connections.
This establishes removal and local package behavior; it does not publish a release or establish unrelated live-provider compatibility.

The tested runtime source is `27b844ad3` on macOS arm64 with Node 22.19.0 and npm 10.9.3.
The local `0.3.3` tarball contains 1,243 payload files and has SHA-256 `7bacd1bf5fdebb4a0097ad683cf6cf26fc497b0a469df0e72231f318be5bfb71`.
This checksum identifies validation bytes only, not a published replacement for an existing version.
3 changes: 1 addition & 2 deletions packages/ai/src/api/diffex-messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@
* Streams Diffex's own message protocol directly to a backend: the request is a
* single POST of `{ model, context, options }` to `<baseUrl>/messages`, the
* response is an SSE stream of serialized assistant-message events plus a
* terminal `done`/`error` event. This is the wire protocol spoken by the
* Radius gateway, but any backend implementing it can be used, e.g. via a
* terminal `done`/`error` event. Any backend implementing this protocol can be used via a
* models.json custom provider with `"api": "diffex-messages"`.
*/

Expand Down
Loading
Loading