# Rakestrawhome Built-In Backend Implementation Plan ## Purpose Implement the target state defined in the [Rakestrawhome built-in backend roadmap](rakestrawhome-backend.md): make the maintainer's OpenAI-compatible inference service a reserved built-in backend, publish its first built-in model profile, and document the resulting consumer surface. This is an execution plan, not an additional source of feature policy. When a detail in this plan requires interpretation, preserve the decisions and scope boundaries in the feature roadmap and the ownership rules under [`docs/policy/`](../policy/). ## Fixed Decisions - The internal and wire-facing backend ID is `rakestrawhome`; its exported root constant is `BackendRakestrawHome`. - Its base endpoint is `https://inference.ai.rakestrawhome.com/v1`. The existing OpenAI-compatible client composes the final request URL as `https://inference.ai.rakestrawhome.com/v1/chat/completions`. - Its API-key environment variable is `RAKESTRAWHOME_INFERENCE_API_KEY`. - Each engine permits four active generation calls for this backend. The existing default bounded waiting capacity of 1024 applies. - The embedded profile ID is `rakestrawhome-gemma-4-31b`, its backend is `rakestrawhome`, and its model is `google/gemma-4-31b-it`. - The new profile contains no optional generation settings. The existing OpenRouter `gemma-4-31b` profile remains unchanged. - Built-in registration is inert: engine construction does not read a credential or contact the service. Existing selection-time credential, endpoint-override, profile-precedence, and error behavior remains in force. - Consumer backend additions cannot replace either built-in ID. Consumer profile sources may continue to override an embedded profile by profile ID. - Verification is deterministic and offline. Do not add a live service test, provider-specific client, duplicate concurrency stress matrix, or duplicate endpoint-composition matrix. ## Execution Rules - Implement the stages in numerical order. Treat each stage as one bounded coding-agent prompt, and complete its focused and regression verification before beginning the next stage. - At the start of each stage, review the feature roadmap and the policy files relevant to that stage. Follow the task-specific reading guide in [`docs/development.md`](../development.md). - Preserve unrelated working-tree changes. Do not commit, tag, push, or modify release documentation unless a separate instruction authorizes it. - Keep tests at their narrowest owner. Extend existing tests where they already own the contract instead of creating parallel test matrices. - Update current-state documentation only in Stage 3, after the implemented behavior exists. ## Stage 1: Generalize Built-In Backend Registration ### Objective Add the exact Rakestrawhome definition to the immutable backend registry and expose its reserved ID through the public facade without changing the generic backend, capacity, or client mechanisms. ### Implementation 1. In `internal/backend/registry.go`, add the stable exported internal ID `RakestrawHomeID = "rakestrawhome"` and private constants for: - endpoint `https://inference.ai.rakestrawhome.com/v1`; - API-key environment variable `RAKESTRAWHOME_INFERENCE_API_KEY`; and - concurrency limit `4`. 2. Replace the inline OpenRouter construction in `NewRegistry` with a private `builtInBackends() []domain.Backend` factory that returns fresh definitions for OpenRouter and Rakestrawhome on every call. Do not use a mutable package- level slice or map. The Rakestrawhome definition must leave `QueueCapacitySet` false so the existing normalization path assigns the shared default queue capacity of 1024. 3. Have `NewRegistry` allocate from `len(builtIns) + len(additions)`, process built-ins before consumer additions, and pass every definition through the existing `normalizeBackend` and duplicate-ID logic. Preserve defensive-copy behavior and all validation and error contracts. 4. In the root `backends.go`, expose `BackendRakestrawHome = backend.RakestrawHomeID`. Update the `Backend` and `WithBackend` GoDoc so their reservation language applies to all built-ins, not only OpenRouter. Do not expose endpoint, credential, or capacity constants in the root package. 5. Make no changes to `NewEngine`, the capacity manager, or the OpenAI- compatible client. They must consume the new definition through their existing registry and policy interfaces. ### Tests 1. In `internal/backend/registry_test.go`, generalize the exact built-in test to assert both definitions. For Rakestrawhome, assert the exact ID, base endpoint, API-key environment-variable name, concurrency limit `4`, normalized queue capacity `1024`, `QueueCapacitySet == true`, and absence of extra parameters. Preserve the corresponding exact OpenRouter assertions. 2. Assert that `CapacityPolicies` contains exactly both built-in policies in a registry with no additions, including the exact concurrency and queue values. Retain lookup-isolation coverage rather than exposing registry- owned data to mutation. 3. Update addition-related expected counts to include two built-ins. Ensure the custom-addition mutation test still proves registry isolation and does not accidentally replace either built-in. 4. Table-drive the existing built-in collision coverage over whitespace- normalized `openrouter` and `rakestrawhome` additions. Each must return the existing duplicate-ID configuration error. 5. At the root public-contract owner, extend the existing reserved-backend registration test to cover both `BackendOpenRouter` and `BackendRakestrawHome`. Do not duplicate the internal registry's full validation matrix. ### Verification Run the focused backend and root tests first, then the ordinary regression suite: ```sh go test ./internal/backend go test . go test ./... ``` The stage is complete when both exact built-ins are published through the same immutable registry path, both IDs are reserved, and existing custom-backend and OpenRouter behavior remains green. **Status:** Complete. ## Stage 2: Add the Built-In Profile and Prove Assembly ### Objective Embed the minimal Gemma profile, generalize built-in catalog assumptions from one backend to the maintained built-in set, and prove ordinary engine assembly without adding provider-specific execution logic. ### Implementation 1. Add `internal/profile/builtin/assets/google/rakestrawhome-gemma-4-31b.yml` with exactly these semantic fields and no optional settings: ```yaml id: rakestrawhome-gemma-4-31b backend: rakestrawhome model: google/gemma-4-31b-it ``` Keep the asset under `google` because the existing directory hierarchy groups profiles by model provider; the profile ID and `backend` field carry the inference-backend distinction. 2. Do not change the embedded repository implementation: its existing recursive `assets/**/*.yml` pattern must discover the new asset. Do not alter `internal/profile/builtin/assets/google/gemma-4-31b.yml`. 3. In the built-in repository tests, replace the assumption that every asset selects OpenRouter with an explicit allowed built-in set containing `backend.OpenRouterID` and `backend.RakestrawHomeID`. Continue to reject a blank or duplicate profile ID, an unapproved backend ID, raw `api_key`, `endpoint`, or `api_key_env` fields, and any asset that fails ordinary repository parsing and validation. 4. Add a focused assertion that loading `rakestrawhome-gemma-4-31b` returns the exact backend and model and leaves every optional generation setting, timeout, service tier, endpoint, credential field, and extra-parameter map absent or at its zero value. This protects the deliberate native-default policy rather than merely proving that the YAML parses. 5. Generalize the existing root test that prepares a built-in profile without a profile directory into a small table covering its current OpenRouter case and the new Rakestrawhome case. Supply a synthetic credential with `t.Setenv`; call preparation only; and assert the selected profile ID, backend ID, base endpoint, credential environment-variable name, and model. Capacity policy has no public inspection seam and is intentionally covered by the registry and existing generic capacity-contract owners instead. ### Test Boundaries - Rely on the registry test for the literal Rakestrawhome capacity values and on the existing generic capacity-contract tests for semaphore and queue behavior. Do not add another four-way goroutine test. - Rely on the exact registered base endpoint plus the existing generic client endpoint-composition test. Do not make a live request or add a second copy of the transport matrix. - Preserve existing profile-source precedence tests. The new asset uses the same repository and resolution path, so do not duplicate the complete precedence matrix. ### Verification Run the focused catalog and root tests, then the ordinary regression suite: ```sh go test ./internal/profile/builtin go test . go test ./... ``` The stage is complete when the new ID resolves through the embedded catalog and ordinary engine assembly, contains no unintended request defaults, and does not alter the existing OpenRouter Gemma profile. ## Stage 3: Update Canonical Documentation and Complete Validation ### Objective Bring each canonical documentation owner into line with the implemented public and internal state, give manual registrants an explicit migration path, and run the complete maintainer workflow. ### Documentation 1. Update `docs/policy/architecture.md` and `docs/internal/overview.md` so the backend registry is described as owning multiple maintained built-ins rather than a single inline OpenRouter definition. Keep architectural policy at the ownership level; do not turn it into a catalog of duplicated literal values. 2. Update `docs/internal/sources.md` to remove the assertion that every built-in profile selects OpenRouter. Explain that embedded profiles inherit connection and credential metadata from whichever maintained built-in backend they select. 3. Update `docs/formats.md` as the canonical owner of backend definitions and the embedded profile catalog: - list OpenRouter and Rakestrawhome with their exact stable IDs, endpoints, API-key environment variables, concurrency limits, and default queue capacity; - add a `Backend` column to the built-in profile table so a mixed-backend catalog is unambiguous; and - add `rakestrawhome-gemma-4-31b` with backend `rakestrawhome` and model `google/gemma-4-31b-it`, while preserving every existing catalog row. 4. Update `docs/consumers/pkg-promptkit.md` with the shortest supported use of the built-in profile and `BackendRakestrawHome`. State that consumers set `RAKESTRAWHOME_INFERENCE_API_KEY`, do not register the built-in manually, and must remove an existing `WithBackend` registration under the exact `rakestrawhome` ID to avoid the intentional duplicate-ID error. Preserve the documented direct credential and runtime endpoint overrides. 5. Ensure root GoDoc added in Stage 1 documents the exported constant and the plural built-in reservation rule. Leave `docs/integrations/openai-compatible-chat.md` as the canonical owner of generic endpoint composition and wire behavior; change it only if it contains an inaccurate single-built-in statement. Do not duplicate its transport details in consumer guidance. 6. Do not add release notes in this feature pass. Release documentation and tagging are separate maintainer actions. ### Final Verification Run the complete offline workflow in [`docs/development.md#maintainer-validation`](../development.md#maintainer-validation), including: ```sh go test ./... go test -race ./... go vet ./... go build ./... go run ./examples/go-library/prepare go run ./examples/go-library/run ``` Also perform the documented Go-formatting, local Markdown-link, and repository- hygiene checks. Review the examples' deterministic output as instructed. No command may require a real Rakestrawhome credential or contact either provider. Finally, inspect the diff against the feature roadmap and confirm all of the following: - only the new public constant and embedded profile ID enlarge the consumer surface; - OpenRouter's definition and existing `gemma-4-31b` profile are unchanged; - both built-in backend IDs are reserved and consumer-added IDs remain extensible; - no API key value, mutable global registry, provider-specific transport, live test, or hidden generation default was introduced; and - current-state documentation and GoDoc agree with the implemented behavior. ## Open Questions None. The feature roadmap and this plan fix every implementation-relevant choice required for the three stages.