Phase A of vendor-agnostic model access (ADR 0050): the foundation the Anthropic, OpenAI and local adapters all ride.
provider→vendor on the licence's vendor field only (the unrelated provider-pin stays "provider"): Go structs/columns/CLI, the consolidated 0001 schema and a new guarded incremental 0002-vendor-not-provider.sql (the project's dual-write rule; no-op on a fresh DB, renames an existing one).
Adapter abstraction (internal/licences/adapters): an Adapter with Vendor()/Shape()/Accept()/Deliver(), a static-key impl (accept = the existing seal, deliver = identity — today's behaviour byte-for-byte), and optional capability interfacesRefresher/Identifier/UsageReader as the seam for Phase B (refreshable-grant) and ADR 0054 (usage). Dispatch by vendor via a registry; unknown vendor refused clearly.
The licence layer now Accepts and KeyFors through the adapter selected by the licence's vendor.
go build/go vet/make check (real Postgres, applies 0001+0002, exercises Accept→adapter and KeyFor→Deliver) all green. The in-mesh model-access bed (mesh.test.ts) needs no edits and is byte-identical for static-key; full end-to-end re-verification runs at Phase C with the real Anthropic adapter.
Phase A of vendor-agnostic model access (ADR 0050): the foundation the Anthropic, OpenAI and local adapters all ride.
- **`provider`→`vendor`** on the licence's vendor field only (the unrelated provider-pin stays "provider"): Go structs/columns/CLI, the consolidated `0001` schema **and** a new guarded incremental `0002-vendor-not-provider.sql` (the project's dual-write rule; no-op on a fresh DB, renames an existing one).
- **Adapter abstraction** (`internal/licences/adapters`): an `Adapter` with `Vendor()`/`Shape()`/`Accept()`/`Deliver()`, a `static-key` impl (accept = the existing seal, deliver = identity — today's behaviour byte-for-byte), and **optional capability interfaces** `Refresher`/`Identifier`/`UsageReader` as the seam for Phase B (refreshable-grant) and ADR 0054 (usage). Dispatch by `vendor` via a registry; unknown vendor refused clearly.
- The licence layer now `Accept`s and `KeyFor`s through the adapter selected by the licence's vendor.
`go build`/`go vet`/`make check` (real Postgres, applies 0001+0002, exercises Accept→adapter and KeyFor→Deliver) all green. The in-mesh model-access bed (mesh.test.ts) needs no edits and is byte-identical for static-key; full end-to-end re-verification runs at Phase C with the real Anthropic adapter.
https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
ADR 0050 Phase A. Rename the licence's `provider` field to `vendor` — the
inventory already uses "provider" for which node answers a brokered provision,
and one word must not carry two facts — and route the licence layer's sealing
and delivery through a per-vendor adapter selected by that field.
The rename touches the Go struct/params/SQL in internal/licences, the operator
CLI, and the schema: 0001 (the consolidated schema) now creates the column as
`vendor`; a new guarded 0002 renames it on a database that predates the change,
and is a no-op on a fresh one.
The adapter (internal/licences/adapters) has a `shape` and the two verbs a
static-key vendor needs — accept (the generic anonymous-box seal) and deliver
(the sealed blob unchanged). refresh/identity/usage are named as optional
capability interfaces so the refreshable-grant seam exists before its code.
A registry maps vendor→shape (anthropic→static-key for now, with a Phase-B
TODO to swap it to refreshable-grant); an unknown vendor is refused clearly.
Behaviour is unchanged from the operator's view except the field name.
Claude-Session: https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Phase A of vendor-agnostic model access (ADR 0050): the foundation the Anthropic, OpenAI and local adapters all ride.
provider→vendoron the licence's vendor field only (the unrelated provider-pin stays "provider"): Go structs/columns/CLI, the consolidated0001schema and a new guarded incremental0002-vendor-not-provider.sql(the project's dual-write rule; no-op on a fresh DB, renames an existing one).internal/licences/adapters): anAdapterwithVendor()/Shape()/Accept()/Deliver(), astatic-keyimpl (accept = the existing seal, deliver = identity — today's behaviour byte-for-byte), and optional capability interfacesRefresher/Identifier/UsageReaderas the seam for Phase B (refreshable-grant) and ADR 0054 (usage). Dispatch byvendorvia a registry; unknown vendor refused clearly.Accepts andKeyFors through the adapter selected by the licence's vendor.go build/go vet/make check(real Postgres, applies 0001+0002, exercises Accept→adapter and KeyFor→Deliver) all green. The in-mesh model-access bed (mesh.test.ts) needs no edits and is byte-identical for static-key; full end-to-end re-verification runs at Phase C with the real Anthropic adapter.https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF