diff --git a/docs/formats.md b/docs/formats.md index c70f594..124e3f5 100644 --- a/docs/formats.md +++ b/docs/formats.md @@ -312,8 +312,8 @@ cross-version compatibility boundary. The selected catalog modules, not this document, own their profile inventories: -- [OpenRouter catalog v3.20260930.0 profiles](https://gitea.maximumdirect.net/eric/promptkit-backend-openrouter/src/tag/v3.20260930.0/catalog/profiles) -- [Rakestrawhome catalog v3.20260930.0 profiles](https://gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/src/tag/v3.20260930.0/catalog/profiles) +- [OpenRouter catalog v3.20261013.0 profiles](https://gitea.maximumdirect.net/eric/promptkit-backend-openrouter/src/tag/v3.20261013.0/catalog/profiles) +- [Rakestrawhome catalog v3.20261013.0 profiles](https://gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/src/tag/v3.20261013.0/catalog/profiles) These are tested local data, not a promise of live provider availability. The [release policy](policy/release.md#catalog-profile-compatibility) owns diff --git a/docs/internal/sources.md b/docs/internal/sources.md index fe60043..8b3d6f9 100644 --- a/docs/internal/sources.md +++ b/docs/internal/sources.md @@ -114,10 +114,12 @@ change rendering behavior. ## Profiles And Built-Ins -`internal/catalog` selects the released keyed OpenRouter and Rakestrawhome -assets as one ConfigKit underlay and PromptKit-owned profiles as the next. -It discovers YAML inputs and supplies passive filesystem context without -parsing or pre-validating catalog definitions. The configuration loader +`internal/catalog` selects the tagged OpenRouter `v3.20261013.0` and +Rakestrawhome `v3.20261013.0` assets as one ConfigKit underlay and PromptKit-owned +profiles as the next. The selected catalog tags are local candidates and may not +be publicly available. It discovers YAML inputs, including each catalog's +opt-in diagnostic root, and supplies passive filesystem context without parsing +or pre-validating catalog definitions. The configuration loader validates only the final effective backend and profile values, including consumer overlays of maintained bases or backends. There is no catalog-only preflight, reserved source namespace, or replay of backend registration. diff --git a/docs/oss/attribution.md b/docs/oss/attribution.md index f28dbb2..253711d 100644 --- a/docs/oss/attribution.md +++ b/docs/oss/attribution.md @@ -41,32 +41,32 @@ License and notices: [LGPL 3.0](../../LICENSE) | ## Promptkit OpenRouter Catalog v3 Selected module: `gitea.maximumdirect.net/eric/promptkit-backend-openrouter/v3` -at `v3.20260930.0`. +at `v3.20261013.0`. Copyright (C) 2026 Eric Rakestraw SPDX-License-Identifier: MIT License and notices: [MIT](licenses/MIT.txt) | -[COPYRIGHT](https://gitea.maximumdirect.net/eric/promptkit-backend-openrouter/src/commit/f17d208cb7ad1fb043cda2266cd3011d11b40aa0/COPYRIGHT) | -[LICENSE](https://gitea.maximumdirect.net/eric/promptkit-backend-openrouter/src/commit/f17d208cb7ad1fb043cda2266cd3011d11b40aa0/LICENSE). +[COPYRIGHT](https://gitea.maximumdirect.net/eric/promptkit-backend-openrouter/src/commit/2a69672b1bb220f1a730153341470f5ac67e15f4/COPYRIGHT) | +[LICENSE](https://gitea.maximumdirect.net/eric/promptkit-backend-openrouter/src/commit/2a69672b1bb220f1a730153341470f5ac67e15f4/LICENSE). -[Source](https://gitea.maximumdirect.net/eric/promptkit-backend-openrouter/src/commit/f17d208cb7ad1fb043cda2266cd3011d11b40aa0). +[Source](https://gitea.maximumdirect.net/eric/promptkit-backend-openrouter/src/commit/2a69672b1bb220f1a730153341470f5ac67e15f4). ## Promptkit Rakestrawhome Catalog v3 Selected module: `gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/v3` -at `v3.20260930.0`. +at `v3.20261013.0`. Copyright (C) 2026 Eric Rakestraw SPDX-License-Identifier: MIT License and notices: [MIT](licenses/MIT.txt) | -[COPYRIGHT](https://gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/src/commit/993443d88c451901f4c917fa00c204fd3b54d28d/COPYRIGHT) | -[LICENSE](https://gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/src/commit/993443d88c451901f4c917fa00c204fd3b54d28d/LICENSE). +[COPYRIGHT](https://gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/src/commit/d40a8aad50111c15d279469170f7b5032ac22529/COPYRIGHT) | +[LICENSE](https://gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/src/commit/d40a8aad50111c15d279469170f7b5032ac22529/LICENSE). -[Source](https://gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/src/commit/993443d88c451901f4c917fa00c204fd3b54d28d). +[Source](https://gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/src/commit/d40a8aad50111c15d279469170f7b5032ac22529). ## jsonschema diff --git a/docs/roadmap/implementation.md b/docs/roadmap/implementation.md index b22b184..b471f87 100644 --- a/docs/roadmap/implementation.md +++ b/docs/roadmap/implementation.md @@ -387,6 +387,14 @@ the actual UTC publication date; if new version names are needed, retain the validated contents and update PromptKit's pins/checksums before its release. Publication and public module availability are not sprint completion gates. +**Completed: 2026-10-13.** Adopted the local OpenRouter candidate +`v3.20261013.0` at `2a69672b1bb220f1a730153341470f5ac67e15f4` and RakestrawHome +candidate `v3.20261013.0` at `d40a8aad50111c15d279469170f7b5032ac22529`. Validation passed +through a temporary filesystem module proxy: focused catalog/configuration +tests, `go test ./...`, `go vet ./...`, `go mod verify`, exact module identity +and version checks with no replacements, and `git diff --check`. No workspace or +proxy artifacts were committed; the candidate tags remain local and unpublished. + ## Stage 7: Capture Destination-Specific HTTP Evidence Scope: shared transport helpers in `internal/llm`, independent of generation. diff --git a/go.mod b/go.mod index ab32bb4..8ce3a18 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.26.0 require ( gitea.maximumdirect.net/eric/ConfigKit v0.7.1 - gitea.maximumdirect.net/eric/promptkit-backend-openrouter/v3 v3.20260930.0 - gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/v3 v3.20260930.0 + gitea.maximumdirect.net/eric/promptkit-backend-openrouter/v3 v3.20261013.0 + gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/v3 v3.20261013.0 github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 ) diff --git a/go.sum b/go.sum index 4ab4f2c..39c092f 100644 --- a/go.sum +++ b/go.sum @@ -2,10 +2,10 @@ gitea.maximumdirect.net/eric/ConfigKit v0.7.1 h1:q3HrX4WWCPt1WfMydqFEaAmCf9s6Dq+ gitea.maximumdirect.net/eric/ConfigKit v0.7.1/go.mod h1:C82sbyKHYMV1OwaD2GJanFrwTfcZfjlW2JsGze5b0kA= gitea.maximumdirect.net/eric/ReleaseKit v0.4.1 h1:Qn+mdebYOzCVCEXgCbuGSO/WHmJtItwaQ8e3XwY3qtI= gitea.maximumdirect.net/eric/ReleaseKit v0.4.1/go.mod h1:LVodqNQ3OIKv9NBq+fFeyMByd1lHY25YOmmpah/NaNI= -gitea.maximumdirect.net/eric/promptkit-backend-openrouter/v3 v3.20260930.0 h1:lzfCDbzJQRGzIlRPRprnAV9hVVL5zUQy80VMQ0kbYa0= -gitea.maximumdirect.net/eric/promptkit-backend-openrouter/v3 v3.20260930.0/go.mod h1:HjS0f+3q0IdHCTEz+VVAEgIwIWJFAZUjuKdAtvtqKdg= -gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/v3 v3.20260930.0 h1:h12ZTRldAmpLAomj0oQRGteFxHLN1LPE6XDl9zJNbm8= -gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/v3 v3.20260930.0/go.mod h1:OEFBeKdjTsLzqJwLmXI2O5gG3r64FktcVJVb3mBrRfg= +gitea.maximumdirect.net/eric/promptkit-backend-openrouter/v3 v3.20261013.0 h1:zhqxVDpQETGzCxYMsVGSWQcjsG4Xw+ftjEL/rCeh0GY= +gitea.maximumdirect.net/eric/promptkit-backend-openrouter/v3 v3.20261013.0/go.mod h1:HjS0f+3q0IdHCTEz+VVAEgIwIWJFAZUjuKdAtvtqKdg= +gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/v3 v3.20261013.0 h1:J10u3x+/siHz5ASC+Is4rfYA/ohW6colBT/8OuCA4qQ= +gitea.maximumdirect.net/eric/promptkit-backend-rakestrawhome/v3 v3.20261013.0/go.mod h1:OEFBeKdjTsLzqJwLmXI2O5gG3r64FktcVJVb3mBrRfg= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= diff --git a/internal/catalog/catalog.go b/internal/catalog/catalog.go index ebd43a5..f543418 100644 --- a/internal/catalog/catalog.go +++ b/internal/catalog/catalog.go @@ -26,6 +26,16 @@ func Underlays() ([]configkit.Underlay, error) { return nil, err } catalogInputs := append(openrouterInputs, rakestrawhomeInputs...) + openrouterSmokeTestInputs, err := assetInputs("OpenRouter smoke-test catalog", openrouter.FS(), openrouter.SmokeTestsRoot) + if err != nil { + return nil, err + } + rakestrawhomeSmokeTestInputs, err := assetInputs("Rakestrawhome smoke-test catalog", rakestrawhome.FS(), rakestrawhome.SmokeTestsRoot) + if err != nil { + return nil, err + } + catalogInputs = append(catalogInputs, openrouterSmokeTestInputs...) + catalogInputs = append(catalogInputs, rakestrawhomeSmokeTestInputs...) owned := configkit.Input{Source: configkit.Mapping("PromptKit-owned profiles", map[string]any{ "profiles": map[string]any{ "promptkit-openrouter-standard": map[string]any{"extends": "gemini-flash-latest"}, diff --git a/internal/catalog/catalog_test.go b/internal/catalog/catalog_test.go index 2513f5d..9308252 100644 --- a/internal/catalog/catalog_test.go +++ b/internal/catalog/catalog_test.go @@ -9,7 +9,7 @@ import ( "gitea.maximumdirect.net/eric/promptkit/internal/configuration" ) -func TestPublishedCatalogsResolveThroughEffectiveConfiguration(t *testing.T) { +func TestSelectedCatalogsResolveThroughEffectiveConfiguration(t *testing.T) { underlays, err := Underlays() if err != nil { t.Fatal(err) @@ -22,10 +22,22 @@ func TestPublishedCatalogsResolveThroughEffectiveConfiguration(t *testing.T) { if err != nil || openrouter.Endpoint != "https://openrouter.ai/api/v1" || openrouter.ConcurrencyLimit != 16 || openrouter.QueueCapacity != 1024 { t.Fatalf("OpenRouter backend: %+v, %v", openrouter, err) } + if openrouter.SmokeTests == nil || openrouter.SmokeTests.DefaultProfile == nil || + *openrouter.SmokeTests.DefaultProfile != "promptkit-openrouter-standard" || + openrouter.SmokeTests.Authentication == nil || openrouter.SmokeTests.Authentication.Kind == nil || + *openrouter.SmokeTests.Authentication.Kind != "openrouter_key" { + t.Fatalf("OpenRouter smoke-test defaults: %+v", openrouter.SmokeTests) + } rakestrawhome, err := state.GetBackend("rakestrawhome") if err != nil || rakestrawhome.Endpoint != "https://inference.ai.rakestrawhome.com/v1" || rakestrawhome.ConcurrencyLimit != 4 { t.Fatalf("Rakestrawhome backend: %+v, %v", rakestrawhome, err) } + if rakestrawhome.SmokeTests == nil || rakestrawhome.SmokeTests.DefaultProfile == nil || + *rakestrawhome.SmokeTests.DefaultProfile != "rakestrawhome-gemma-4-31b" || + rakestrawhome.SmokeTests.Authentication == nil || rakestrawhome.SmokeTests.Authentication.Kind == nil || + *rakestrawhome.SmokeTests.Authentication.Kind != "none" { + t.Fatalf("Rakestrawhome smoke-test defaults: %+v", rakestrawhome.SmokeTests) + } for id, want := range map[string]string{ "promptkit-openrouter-standard": "~google/gemini-flash-latest", "promptkit-openrouter-auto": "openrouter/auto", @@ -38,6 +50,42 @@ func TestPublishedCatalogsResolveThroughEffectiveConfiguration(t *testing.T) { } } +func TestConsumerCanReplaceOrClearSmokeTestDefaults(t *testing.T) { + underlays, err := Underlays() + if err != nil { + t.Fatal(err) + } + replacement := configkit.Input{Source: configkit.Mapping("operator replacement", map[string]any{ + "backends": map[string]any{"openrouter": map[string]any{ + "smoke_tests": map[string]any{ + "default_profile": "operator-profile", + "authentication": nil, + }, + }}, + })} + state, err := configuration.Load(replacement, underlays) + if err != nil { + t.Fatalf("load replacement: %v", err) + } + backend, err := state.GetBackend("openrouter") + if err != nil || backend.SmokeTests == nil || backend.SmokeTests.DefaultProfile == nil || + *backend.SmokeTests.DefaultProfile != "operator-profile" || backend.SmokeTests.Authentication != nil { + t.Fatalf("caller smoke-test replacement/null was not effective: %+v, %v", backend.SmokeTests, err) + } + + cleared := configkit.Input{Source: configkit.Mapping("operator null", map[string]any{ + "backends": map[string]any{"openrouter": map[string]any{"smoke_tests": nil}}, + })} + state, err = configuration.Load(cleared, underlays) + if err != nil { + t.Fatalf("load null smoke_tests: %v", err) + } + backend, err = state.GetBackend("openrouter") + if err != nil || backend.SmokeTests != nil { + t.Fatalf("caller null did not clear smoke-test defaults: %+v, %v", backend.SmokeTests, err) + } +} + func TestConsumerOverlayReplacesCatalogDefaultsBeforeValidation(t *testing.T) { underlays, err := Underlays() if err != nil {