Finalize smoke test roadmap decisions and evidence contracts
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
# Explicit Smoke Test Diagnostics
|
# Explicit Smoke Test Diagnostics
|
||||||
|
|
||||||
Status: purpose and ownership boundary accepted; the concrete API and delivery
|
Status: feature design and delivery direction accepted; remaining implementation
|
||||||
proposals below remain subject to review. Implementation has not started.
|
details are listed below. Implementation has not started.
|
||||||
|
|
||||||
This roadmap replaces the earlier capability proposal and incorporates the
|
This roadmap replaces the earlier capability proposal and incorporates the
|
||||||
subsequent discussion. It defines the target feature, not a staged implementation
|
subsequent discussion. It defines the target feature, not a staged implementation
|
||||||
plan or current public API. Significant remaining choices appear under Open Decisions.
|
plan or current public API. Remaining questions appear under Remaining Decisions.
|
||||||
|
|
||||||
## Purpose And Ownership
|
## Purpose And Ownership
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ ConfigKit owns loading and composition; PromptKit interprets and validates final
|
|||||||
effective values. Provenance stays available for explicit inspection and is not
|
effective values. Provenance stays available for explicit inspection and is not
|
||||||
an execution-time resolution or validation mechanism.
|
an execution-time resolution or validation mechanism.
|
||||||
|
|
||||||
## Proposed Public Operation And Request
|
## Public Operation And Request
|
||||||
|
|
||||||
One synchronous call runs one independently selected operation:
|
One synchronous call runs one independently selected operation:
|
||||||
|
|
||||||
@@ -117,11 +117,23 @@ does not fall back to a backend default. Missing backend/default selection is an
|
|||||||
error when inference needs it, not a reason to substitute an arbitrary profile.
|
error when inference needs it, not a reason to substitute an arbitrary profile.
|
||||||
Backend-only probes require neither a default profile nor unrelated prompt data.
|
Backend-only probes require neither a default profile nor unrelated prompt data.
|
||||||
|
|
||||||
Proposed routing: when a prompt or profile is selected, the effective profile
|
Whenever inference selects a profile, that profile supplies the resolved endpoint,
|
||||||
supplies the backend identity and endpoint. Otherwise `BackendID` selects the
|
credential settings, and backend/capacity identity, subject to ordinary execution
|
||||||
backend. If both are provided, profile selection wins, including over a different
|
overrides. This applies equally to explicit profiles, prompt defaults, and
|
||||||
backend hint; report the actual choice. This is proposed precedence, not an
|
backend-default profiles. A supplied `BackendID` is a selection fallback, not a
|
||||||
accepted new prohibition on selector combinations; see Open Decisions.
|
constraint or a request to rebind the selected profile's backend identity.
|
||||||
|
|
||||||
|
For example, if backend A names a default profile that resolves to backend B,
|
||||||
|
inference uses B's resolved target and capacity identity. If that default profile
|
||||||
|
is endpoint-only, inference retains an empty backend identity. Report A as the
|
||||||
|
default-selection source and B (or the empty identity) as the effective backend.
|
||||||
|
No recursive backend-default lookup or mismatch rejection is introduced.
|
||||||
|
|
||||||
|
For backend-only probes, an explicit or prompt-selected profile likewise supplies
|
||||||
|
the target and its backend's diagnostic metadata. Otherwise `BackendID` selects
|
||||||
|
the backend directly, without consulting its default inference profile. The
|
||||||
|
profile wins when both selectors are supplied, even when they name different
|
||||||
|
backends.
|
||||||
|
|
||||||
An endpoint-only profile remains usable for inference and reachability without
|
An endpoint-only profile remains usable for inference and reachability without
|
||||||
an inferred backend identity or provider-specific authentication adapter.
|
an inferred backend identity or provider-specific authentication adapter.
|
||||||
@@ -130,7 +142,7 @@ Backend-only probes can resolve profile endpoint/credential metadata without
|
|||||||
requiring its model. Prompt selection uses captured identity/default-profile
|
requiring its model. Prompt selection uses captured identity/default-profile
|
||||||
metadata without rendering or loading the application's artifacts or schemas.
|
metadata without rendering or loading the application's artifacts or schemas.
|
||||||
|
|
||||||
## Proposed Report Shapes
|
## Report Shapes
|
||||||
|
|
||||||
Use factual Boolean observations with presence, rather than a caller-configurable
|
Use factual Boolean observations with presence, rather than a caller-configurable
|
||||||
list of criteria. These Go-facing values need no stable JSON contract initially.
|
list of criteria. These Go-facing values need no stable JSON contract initially.
|
||||||
@@ -141,7 +153,7 @@ type SmokeTestReport struct {
|
|||||||
Supported bool
|
Supported bool
|
||||||
Applicable *bool
|
Applicable *bool
|
||||||
Completed bool
|
Completed bool
|
||||||
Reason string
|
Reason SmokeTestReason
|
||||||
Target SmokeTestTarget
|
Target SmokeTestTarget
|
||||||
Facts SmokeTestFacts
|
Facts SmokeTestFacts
|
||||||
Timing SmokeTestTiming
|
Timing SmokeTestTiming
|
||||||
@@ -152,8 +164,9 @@ type SmokeTestReport struct {
|
|||||||
|
|
||||||
type SmokeTestTarget struct {
|
type SmokeTestTarget struct {
|
||||||
BackendID, ProfileID, PromptID, PromptVersion string
|
BackendID, ProfileID, PromptID, PromptVersion string
|
||||||
|
DefaultSourceBackendID string // backend whose default selected the profile, if any
|
||||||
SelectionSource string // "backend_default", "profile", "prompt", or "backend"
|
SelectionSource string // "backend_default", "profile", "prompt", or "backend"
|
||||||
Endpoint string // effective diagnostic destination
|
Endpoint string // initially resolved diagnostic destination
|
||||||
EffectiveSettings ExecutionTarget
|
EffectiveSettings ExecutionTarget
|
||||||
SettingsPresence ExecutionTargetPresence
|
SettingsPresence ExecutionTargetPresence
|
||||||
}
|
}
|
||||||
@@ -176,39 +189,60 @@ type SmokeTestTiming struct {
|
|||||||
Duration time.Duration
|
Duration time.Duration
|
||||||
CapacityWait *time.Duration
|
CapacityWait *time.Duration
|
||||||
RequestDuration *time.Duration
|
RequestDuration *time.Duration
|
||||||
|
RetryDelay *time.Duration
|
||||||
EvaluationDuration *time.Duration
|
EvaluationDuration *time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
type SmokeTestAttempt struct {
|
type SmokeTestAttempt struct {
|
||||||
Dispatched bool
|
Dispatched bool
|
||||||
Endpoint string
|
InitialEndpoint string // resolved destination before redirects
|
||||||
|
Endpoint string // last observed request destination; facts refer to this destination
|
||||||
HTTPStatus *int
|
HTTPStatus *int
|
||||||
Facts SmokeTestFacts
|
Facts SmokeTestFacts
|
||||||
Timing SmokeTestTiming
|
Timing SmokeTestTiming
|
||||||
Failure ExecutionFailureKind
|
Failure ExecutionFailureKind
|
||||||
Usage ObservedTokenUsage
|
Usage ObservedTokenUsage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SmokeTestReason string
|
||||||
|
|
||||||
|
const (
|
||||||
|
SmokeTestReasonNone SmokeTestReason = ""
|
||||||
|
SmokeTestReasonAuthenticationNotApplicable SmokeTestReason = "authentication_not_applicable"
|
||||||
|
SmokeTestReasonProbeNotConfigured SmokeTestReason = "probe_not_configured"
|
||||||
|
SmokeTestReasonHTTPDiagnosticsUnavailable SmokeTestReason = "http_diagnostics_unavailable"
|
||||||
|
SmokeTestReasonRequiredCredentialMissing SmokeTestReason = "required_credential_missing"
|
||||||
|
SmokeTestReasonAuthenticationResponseUnrecognized SmokeTestReason = "authentication_response_unrecognized"
|
||||||
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
`Supported` records whether an implementation is available for the target and
|
`Supported` records whether an implementation is available for the target and
|
||||||
selected client. `Applicable=false` records known inapplicability; nil leaves
|
selected client. `Applicable=false` records known inapplicability; nil leaves
|
||||||
applicability undetermined, for example when no authentication probe is configured.
|
applicability undetermined, for example when no authentication probe is configured.
|
||||||
Missing probe metadata does not imply that a provider accepts anonymous access.
|
Missing probe metadata does not imply that a provider accepts anonymous access.
|
||||||
`Reason` is a short factual code such as `authentication_not_applicable`,
|
`Reason` is a named factual code, not application severity or free-form diagnostic
|
||||||
`probe_not_configured`, or `http_diagnostics_unavailable`, not an application
|
text. The constants distinguish, respectively, no additional reason, explicitly
|
||||||
severity or verdict.
|
inapplicable authentication, absent probe metadata, unavailable HTTP diagnostics
|
||||||
|
for the selected client, a required credential missing before inference dispatch,
|
||||||
|
and an authentication response whose documented meaning cannot be established.
|
||||||
|
HTTP status and `Failure` classify ordinary rejection and transport outcomes;
|
||||||
|
they do not need duplicate reason codes.
|
||||||
|
|
||||||
`Completed` means the diagnostic concluded, not that checks passed. A rejected,
|
`Completed` means the diagnostic concluded, not that checks passed. A rejected,
|
||||||
failed, unsupported, or inapplicable diagnostic can conclude with nil Go error.
|
failed, unsupported, or inapplicable diagnostic can conclude with nil Go error.
|
||||||
Caller cancellation before completion leaves it false and returns available facts.
|
Caller cancellation before completion leaves it false and returns available facts.
|
||||||
|
**A nil Go error means the diagnostic concluded, not that the tested operation
|
||||||
|
succeeded.** Make this distinction prominent in GoDoc and consumer examples.
|
||||||
|
|
||||||
A fact is true or false only when established; nil means not evaluated,
|
A fact is true or false only when established; nil means not evaluated,
|
||||||
undetermined, or inapplicable. Operation metadata and failure classification
|
undetermined, or inapplicable. Operation metadata and failure classification
|
||||||
provide context. In particular:
|
provide context. In particular:
|
||||||
|
|
||||||
- `CredentialsSupplied`: a nonempty credential was supplied with the dispatched
|
- `CredentialsSupplied`: a nonempty credential was attached to the observed
|
||||||
request, not merely named in configuration. No dispatch leaves this fact absent.
|
dispatched request for the attempt's `Endpoint`, not merely named in configuration
|
||||||
For injected clients, do not claim upstream transmission PromptKit cannot observe.
|
or attached to an earlier redirect hop. No observed request leaves this fact
|
||||||
|
absent. For injected clients, do not claim upstream transmission PromptKit cannot
|
||||||
|
observe. Observation at the transport boundary is not proof of wire transmission.
|
||||||
- `EndpointReachable`: an HTTP response was received from the tested destination,
|
- `EndpointReachable`: an HTTP response was received from the tested destination,
|
||||||
regardless of status. HTTP 401 therefore yields true. An attempted HTTP operation
|
regardless of status. HTTP 401 therefore yields true. An attempted HTTP operation
|
||||||
ending without a response yields false. An injected generation result alone
|
ending without a response yields false. An injected generation result alone
|
||||||
@@ -217,7 +251,8 @@ provide context. In particular:
|
|||||||
or rejection. A rejection yields false; transport failure, server error, or an
|
or rejection. A rejection yields false; transport failure, server error, or an
|
||||||
uninterpretable response can leave it nil. Acceptance does not certify balance,
|
uninterpretable response can leave it nil. Acceptance does not certify balance,
|
||||||
model permissions, or future access. Absence of credentials is not an invalid-key
|
model permissions, or future access. Absence of credentials is not an invalid-key
|
||||||
assertion.
|
assertion: a documented 401 with `CredentialsSupplied=false` records rejection
|
||||||
|
of an unauthenticated request, not rejection of a supplied key.
|
||||||
- `ResponseReceived`: an HTTP response was obtained for built-in operations, or a
|
- `ResponseReceived`: an HTTP response was obtained for built-in operations, or a
|
||||||
response was returned by the injected generation boundary. A non-success or
|
response was returned by the injected generation boundary. A non-success or
|
||||||
malformed HTTP response still counts as received.
|
malformed HTTP response still counts as received.
|
||||||
@@ -235,13 +270,24 @@ provide context. In particular:
|
|||||||
|
|
||||||
Known inapplicable authentication performs no dispatch and leaves request and
|
Known inapplicable authentication performs no dispatch and leaves request and
|
||||||
acceptance facts absent. Unknown measurements remain unknown, including phase
|
acceptance facts absent. Unknown measurements remain unknown, including phase
|
||||||
measurements for unperformed work. Total duration includes waiting and evaluation;
|
measurements for unperformed work. Report-level capacity wait, request duration,
|
||||||
request duration excludes capacity waiting. Timings impose no application latency
|
evaluation duration, and retry delay sum the corresponding measured work across
|
||||||
threshold or universal deadline.
|
the diagnostic. Request duration excludes capacity waiting, evaluation, and retry
|
||||||
|
backoff. Retry delay includes completed and interrupted backoff. Per-attempt
|
||||||
|
timings retain their own measurements; backoff is reported at the operation level.
|
||||||
|
Total duration is wall time, including selection and other orchestration overhead,
|
||||||
|
so it need not equal the phase sum. Timings impose no application latency threshold
|
||||||
|
or universal deadline.
|
||||||
|
|
||||||
If retries are enabled, top-level facts describe the terminal attempt and attempt
|
If retries are enabled, top-level facts describe the most recent dispatched
|
||||||
records preserve earlier failures. Usage reuses presence-aware accounting without
|
attempt. Cancellation during backoff or a later capacity wait does not replace
|
||||||
claiming complete provider billing. No facts are inferred from arbitrary error text.
|
those facts with an undispatched attempt's empty facts. The operation's `Failure`
|
||||||
|
and `Completed` still describe the interruption; earlier attempt records retain
|
||||||
|
their own outcomes. A canceled capacity acquisition can add a `Dispatched=false`
|
||||||
|
record, but no synthetic attempt is added for cancellation during backoff. With
|
||||||
|
no dispatched attempt, request facts remain absent. Usage reuses presence-aware
|
||||||
|
accounting without claiming complete provider billing. No facts are inferred from
|
||||||
|
arbitrary error text.
|
||||||
`Dispatched` means the HTTP/client boundary was invoked, as in existing attempt
|
`Dispatched` means the HTTP/client boundary was invoked, as in existing attempt
|
||||||
observations; it is not proof that packets were sent or billable work occurred.
|
observations; it is not proof that packets were sent or billable work occurred.
|
||||||
|
|
||||||
@@ -257,7 +303,7 @@ for unrestricted logging.
|
|||||||
|
|
||||||
### Reachability
|
### Reachability
|
||||||
|
|
||||||
Propose one unauthenticated HTTP GET to the configured diagnostic endpoint, or
|
Perform one unauthenticated HTTP GET to the configured diagnostic endpoint, or
|
||||||
the effective base endpoint when no separate endpoint is supplied. Any HTTP
|
the effective base endpoint when no separate endpoint is supplied. Any HTTP
|
||||||
response establishes reachability, including 401, 404, or 405. It does not establish
|
response establishes reachability, including 401, 404, or 405. It does not establish
|
||||||
that the completion route, credentials, or a model work. Authentication is tested
|
that the completion route, credentials, or a model work. Authentication is tested
|
||||||
@@ -267,7 +313,7 @@ DNS/TLS diagnosis.
|
|||||||
### Authentication
|
### Authentication
|
||||||
|
|
||||||
Metadata names a supported provider adapter or explicitly marks authentication
|
Metadata names a supported provider adapter or explicitly marks authentication
|
||||||
inapplicable. The proposed first adapter is `openrouter_key`, using GET on the
|
inapplicable. The first adapter is `openrouter_key`, using GET on the
|
||||||
selected base endpoint's `key` path with ordinary bearer credential resolution.
|
selected base endpoint's `key` path with ordinary bearer credential resolution.
|
||||||
OpenRouter's [current-key API](https://openrouter.ai/docs/api/api-reference/api-keys/get-current-key)
|
OpenRouter's [current-key API](https://openrouter.ai/docs/api/api-reference/api-keys/get-current-key)
|
||||||
documents this authenticated operation and its 200 and 401 responses. Recognize
|
documents this authenticated operation and its 200 and 401 responses. Recognize
|
||||||
@@ -292,7 +338,7 @@ clients and providers necessarily receive the content they execute: privacy here
|
|||||||
is an API-exposure boundary, not secrecy from executing collaborators. There is
|
is an API-exposure boundary, not secrecy from executing collaborators. There is
|
||||||
no persistent diagnostic prompt or session state.
|
no persistent diagnostic prompt or session state.
|
||||||
|
|
||||||
### Proposed Backend Metadata
|
### Backend Metadata
|
||||||
|
|
||||||
Extend optional backend configuration through the final-value loader and the
|
Extend optional backend configuration through the final-value loader and the
|
||||||
`BackendConfig`/`BackendSource` convenience. Illustrative shape:
|
`BackendConfig`/`BackendSource` convenience. Illustrative shape:
|
||||||
@@ -321,14 +367,39 @@ presence/null and layering semantics. Validate syntax and recognized configurati
|
|||||||
at the final handoff, without contacting providers or validating intermediate layers.
|
at the final handoff, without contacting providers or validating intermediate layers.
|
||||||
|
|
||||||
Provider paths follow the selected endpoint override, not silently the catalog's
|
Provider paths follow the selected endpoint override, not silently the catalog's
|
||||||
original endpoint. Explicitly configured diagnostic destinations can be different;
|
original endpoint. Explicit absolute diagnostic endpoints are supported for separate
|
||||||
report the destination actually tested. Exact endpoint options remain a proposal
|
health/auth routes and take precedence for their operation. Configuration stays
|
||||||
under Open Decisions.
|
limited to named adapters and endpoint settings, not arbitrary methods or response
|
||||||
|
predicates. Concrete field names and presence/null rules remain to be specified.
|
||||||
|
|
||||||
Catalogs or caller overlays can supply backend-specific metadata. New catalog
|
Reuse the configured HTTP client and its redirect handling, without adding custom
|
||||||
fields need a coordinated compatible loader release: older strict PromptKit
|
credential forwarding. `Target.Endpoint` records the resolved starting destination.
|
||||||
loaders may reject them. A catalog default is replaceable metadata, not a promise
|
Each HTTP attempt records `InitialEndpoint` and the last observed dispatched
|
||||||
of upstream availability or a stable model choice.
|
request destination as `Endpoint`; its credential, reachability, response, and
|
||||||
|
acceptance facts describe that destination. If a redirect leads to a failed request,
|
||||||
|
do not attribute an earlier hop's response or credentials to the later destination.
|
||||||
|
When a client prevents observing the relevant request, leave the affected evidence
|
||||||
|
unknown. Injected generation alone supplies no HTTP destination evidence.
|
||||||
|
|
||||||
|
Authentication acceptance is interpreted from the response for the observed
|
||||||
|
destination under the selected adapter's contract. It does not assert acceptance
|
||||||
|
at the initial destination or at every redirect hop. These endpoint fields provide
|
||||||
|
attribution without introducing a public redirect trace.
|
||||||
|
|
||||||
|
Deliver built-in metadata through coordinated compatible catalog releases; caller
|
||||||
|
overlays remain available. First release loader support while retaining compatible
|
||||||
|
existing catalog dependencies, then release catalogs containing the new metadata,
|
||||||
|
then adopt those versions in PromptKit. Older strict loaders may reject new fields,
|
||||||
|
so do not direct their consumers to upgrade catalogs independently. Select actual
|
||||||
|
versions and compatibility notes during release preparation.
|
||||||
|
|
||||||
|
Use `promptkit-openrouter-standard` for OpenRouter's default, its `openrouter_key`
|
||||||
|
adapter, and RakestrawHome's `none` authentication setting. The RakestrawHome catalog
|
||||||
|
maintainer must select its current default profile. Verify each shipped default
|
||||||
|
resolves in the supported assembled effective configuration, including any
|
||||||
|
PromptKit-owned profiles. This is final-value integration validation, not a second
|
||||||
|
validation pass over intermediate sources. A catalog default is replaceable metadata,
|
||||||
|
not a promise of upstream availability, cheap inference, or a stable model choice.
|
||||||
|
|
||||||
## Execution And Error Boundary
|
## Execution And Error Boundary
|
||||||
|
|
||||||
@@ -337,22 +408,34 @@ validation, and usage accounting internally. A separate diagnostic orchestration
|
|||||||
entry point may retain evidence that ordinary `Run` intentionally discards.
|
entry point may retain evidence that ordinary `Run` intentionally discards.
|
||||||
Do not duplicate inference serialization or build a second inference stack.
|
Do not duplicate inference serialization or build a second inference stack.
|
||||||
|
|
||||||
|
Add a narrow internal evidence path at the transport/coordinator boundary. Existing
|
||||||
|
execution events do not carry redirect destinations or dispatched credential
|
||||||
|
presence, and the coordinator can discard a completed response when cancellation
|
||||||
|
is observed before return. Capture available facts before that discard and retain
|
||||||
|
them for diagnostics. Keep ordinary execution's error/result contracts unchanged;
|
||||||
|
do not expand public execution events just to reconstruct smoke-test evidence.
|
||||||
|
|
||||||
Inference participates in existing engine-local admission and active backend
|
Inference participates in existing engine-local admission and active backend
|
||||||
limits. HTTP-only probes need no generation permit or unrelated model selection.
|
limits. HTTP-only probes need no generation permit or unrelated model selection.
|
||||||
Caller context and configured timeouts govern operations. The proposed inference
|
Caller context and configured timeouts govern operations. Inference defaults to
|
||||||
baseline is a single attempt, no structural repair, and otherwise the selected
|
one attempt: nil `TransientRetries` means zero for this operation rather than
|
||||||
profile plus explicit overrides. Retry choices below remain proposals; ordinary
|
inheritance from the engine retry budget. Positive values reuse existing built-in
|
||||||
|
inference status retries and retain attempt records; injected generation remains
|
||||||
|
single-dispatch. Reachability and authentication remain single-attempt regardless
|
||||||
|
of a valid inference retry setting. Structural repair is excluded from the initial
|
||||||
|
procedure. Otherwise use the selected profile plus explicit overrides. Ordinary
|
||||||
engine defaults and repair behavior do not change. Small test content does not
|
engine defaults and repair behavior do not change. Small test content does not
|
||||||
establish small output, a price estimate, or a cost ceiling.
|
establish small output, a price estimate, or a cost ceiling.
|
||||||
|
|
||||||
Keep `LLMClient` unchanged. Injected clients serve inference smoke tests without
|
Keep `LLMClient` unchanged. Injected clients serve inference smoke tests without
|
||||||
new required methods. HTTP diagnostics must describe an explicitly selected
|
new required methods. HTTP diagnostics must describe an explicitly selected
|
||||||
transport, not secretly probe a different transport in an injected-client engine.
|
transport, not secretly probe a different transport in an injected-client engine.
|
||||||
The proposed initial behavior is to report HTTP diagnostics unavailable unless
|
The initial behavior is to report HTTP diagnostics unavailable unless
|
||||||
that transport is supported or explicitly supplied; an additional injection option
|
that transport is supported or explicitly supplied; an additional injection option
|
||||||
is a delivery choice below.
|
remains a delivery detail below. Do not silently fall back to a default HTTP client
|
||||||
|
to diagnose an injected generation client.
|
||||||
|
|
||||||
Proposed return conventions:
|
Return conventions:
|
||||||
|
|
||||||
- Invalid kinds/settings, nil engines, or invalid target/profile/prompt selections
|
- Invalid kinds/settings, nil engines, or invalid target/profile/prompt selections
|
||||||
return ordinary public errors before probe work. Unsupported capability is not
|
return ordinary public errors before probe work. Unsupported capability is not
|
||||||
@@ -399,11 +482,20 @@ Expected report examples:
|
|||||||
| Operation/outcome | Observations | Go error |
|
| Operation/outcome | Observations | Go error |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| Authentication rejected | Supported/applicable/completed; credentials supplied true, endpoint reachable true, response received true, credentials accepted false; attempt status 401 | nil |
|
| Authentication rejected | Supported/applicable/completed; credentials supplied true, endpoint reachable true, response received true, credentials accepted false; attempt status 401 | nil |
|
||||||
| RakestrawHome authentication | Applicable false, completed, `authentication_not_applicable`; no dispatch/acceptance facts | nil |
|
| RakestrawHome authentication | Supported true, applicable false, completed, `authentication_not_applicable`; no dispatch/acceptance facts | nil |
|
||||||
| Unconfigured authentication | Supported false, applicability unknown, completed, `probe_not_configured` | nil |
|
| Unconfigured authentication | Supported false, applicability unknown, completed, `probe_not_configured` | nil |
|
||||||
|
| HTTP diagnostics unavailable for injected client | Supported false, applicability unknown, completed, `http_diagnostics_unavailable`; no dispatch | nil |
|
||||||
|
| Authentication without credentials receives documented 401 | Supported/applicable/completed; credentials supplied false, endpoint reachable and response received true, credentials accepted false; rejection describes an unauthenticated request | nil |
|
||||||
|
| Required credential absent before inference | Supported/applicable/completed; `required_credential_missing`, failure `invalid_request`; no dispatch and no request facts | nil |
|
||||||
|
| Authentication receives uninterpretable HTTP 200 | Supported/applicable/completed; endpoint reachable and response received true, credential supply recorded, acceptance unknown; `authentication_response_unrecognized`, failure `malformed_response` | nil |
|
||||||
| Text inference returns unexpected nonempty text | Generation completed and text returned true; expected-text match false | nil |
|
| Text inference returns unexpected nonempty text | Generation completed and text returned true; expected-text match false | nil |
|
||||||
| Structured inference matches schema | Structured output requested, response received, valid JSON, and schema matched true; no provider-enforcement assertion | nil |
|
| Structured inference matches schema | Structured output requested, response received, valid JSON, and schema matched true; no provider-enforcement assertion | nil |
|
||||||
| Authentication transport fails | Endpoint reachable/response received false; credential supply recorded when known; acceptance nil | nil |
|
| Authentication transport fails | Endpoint reachable/response received false; credential supply recorded when known; acceptance nil | nil |
|
||||||
|
| Configured request timeout while caller context remains active | Supported/applicable/completed; failure `deadline`; retain observed response facts, or record response/reachability false for observed HTTP dispatch without a response; injected clients do not establish HTTP facts | nil |
|
||||||
|
| Local capacity exhausted | Supported/applicable/completed; failure `capacity`; no dispatch or request facts | nil |
|
||||||
|
| Caller cancels during initial capacity wait | Supported/applicable, completed false; failure `canceled`, measured capacity wait, undispatched attempt; request facts absent | `context.Canceled` identity |
|
||||||
|
| Caller deadline expires during a dispatched request | Supported/applicable, completed false; failure `deadline`; retain available attempt evidence | `context.DeadlineExceeded` identity |
|
||||||
|
| Caller cancels during retry backoff after HTTP 503 | Completed false, failure `canceled`; top-level facts retain the last dispatched attempt, its 503 remains in attempts, interrupted retry delay recorded, no extra attempt | `context.Canceled` identity |
|
||||||
| Caller cancels | Available observations retained; completed false when interrupted | Recognizable context error |
|
| Caller cancels | Available observations retained; completed false when interrupted | Recognizable context error |
|
||||||
|
|
||||||
Consumers decide whether any of these findings warrant success, a warning, or a
|
Consumers decide whether any of these findings warrant success, a warning, or a
|
||||||
@@ -413,7 +505,7 @@ scheduling, and any combination with `ValidateRequest` or normal execution.
|
|||||||
## Work Needed And Target Completion
|
## Work Needed And Target Completion
|
||||||
|
|
||||||
- Add the public request/report operation and GoDoc, keeping business logic internal.
|
- Add the public request/report operation and GoDoc, keeping business logic internal.
|
||||||
Resolve significant Open Decisions before writing the staged implementation plan.
|
Resolve the remaining delivery details when writing the staged implementation plan.
|
||||||
- Extend final backend metadata interpretation and captured lookup for capabilities
|
- Extend final backend metadata interpretation and captured lookup for capabilities
|
||||||
and defaults. Preserve explicit configuration inspection without exposing test
|
and defaults. Preserve explicit configuration inspection without exposing test
|
||||||
content or using source history for validation.
|
content or using source history for validation.
|
||||||
@@ -421,15 +513,21 @@ scheduling, and any combination with `ValidateRequest` or normal execution.
|
|||||||
capacity, generation, decoding, and structural evaluation without preparing
|
capacity, generation, decoding, and structural evaluation without preparing
|
||||||
application inputs or messages.
|
application inputs or messages.
|
||||||
- Add narrow HTTP probes, credential handling, evidence retention, factual results,
|
- Add narrow HTTP probes, credential handling, evidence retention, factual results,
|
||||||
and partial cancellation reporting while preserving existing client contracts.
|
and partial cancellation reporting through the internal evidence path while
|
||||||
- Supply agreed built-in metadata through compatible catalog releases or PromptKit
|
preserving existing client contracts. Specify destination/credential attribution
|
||||||
underlays, with normal caller overlays and no provider-availability guarantee.
|
without exposing headers or a redirect trace.
|
||||||
|
- Supply agreed built-in metadata through compatible catalog releases in the
|
||||||
|
documented order, with normal caller overlays and no provider-availability
|
||||||
|
guarantee. Check default-profile resolution in the assembled final configuration.
|
||||||
- Add focused offline tests with controlled transports and injected clients for
|
- Add focused offline tests with controlled transports and injected clients for
|
||||||
selection, rejected/absent credentials, applicability/support, transport/malformed
|
selection, rejected/absent credentials, applicability/support, transport/malformed
|
||||||
responses, content/JSON/schema facts, cancellation, shared inference capacity,
|
responses, content/JSON/schema facts, cancellation, shared inference capacity,
|
||||||
and credential/private-content exposure. Assign distinct test owners; do not
|
and credential/private-content exposure. Assign distinct test owners; do not
|
||||||
repeat existing transport, capacity, or validation matrices or snapshot private
|
repeat existing transport, capacity, or validation matrices or snapshot private
|
||||||
test language.
|
test language.
|
||||||
|
- Include the report-state matrix, cross-backend and endpoint-only default profiles,
|
||||||
|
redirect attribution, cancellation after a response, and interrupted retry waits
|
||||||
|
in focused contract coverage. Reuse existing lower-level checks where sufficient.
|
||||||
- Update canonical consumer, backend-format, integration, and internal documentation
|
- Update canonical consumer, backend-format, integration, and internal documentation
|
||||||
when implementation lands, with release notes explaining the optional addition.
|
when implementation lands, with release notes explaining the optional addition.
|
||||||
Live diagnostics are explicit consumer operations, not default tests or new
|
Live diagnostics are explicit consumer operations, not default tests or new
|
||||||
@@ -442,69 +540,28 @@ scope excludes application CLI/service work, readiness policy, continuous monito
|
|||||||
model-status tests, batch orchestration, customizable test language, cost estimates,
|
model-status tests, batch orchestration, customizable test language, cost estimates,
|
||||||
and guarantees about later generation.
|
and guarantees about later generation.
|
||||||
|
|
||||||
## Open Decisions
|
## Remaining Decisions And Delivery Dependencies
|
||||||
|
|
||||||
### 1. Backend Selection Alongside A Profile
|
The operation, routing precedence, report/error boundary, initial adapters,
|
||||||
|
retry/repair policy, and catalog delivery direction are settled. The remaining
|
||||||
|
items should be resolved in the focused implementation plan:
|
||||||
|
|
||||||
**Recommendation:** adopt the proposed precedence: explicit or prompt-selected
|
1. **Configuration representation.** Finalize the Go convenience types and exact
|
||||||
profiles supply routing; `BackendID` supplies backend/default selection otherwise.
|
endpoint fields, including omission/null/overlay behavior and interpretation of
|
||||||
Report the effective choice. This follows familiar profile precedence without
|
configured default-profile references at construction versus selection. Preserve
|
||||||
inventing a mismatch prohibition or rebinding capacity identity.
|
final-value ownership and verify shipped defaults in assembled configuration;
|
||||||
|
do not introduce source-history validation or change ordinary profile selection.
|
||||||
**Alternative:** treat `BackendID` as a constraint when combined with profile/prompt
|
2. **Explicit diagnostic transport for injected clients.** Decide whether the first
|
||||||
selection and reject mismatches. That catches mistakes and makes every selector
|
delivery exposes a separate diagnostic HTTP-client option or reports HTTP
|
||||||
operative, but adds a diagnostic-specific restriction and makes profile changes
|
diagnostics unavailable for injected-client engines until such an option exists.
|
||||||
more disruptive. Choose it only if consumers want that constraint.
|
Inference remains available through `LLMClient` in either case. No hidden
|
||||||
|
transport fallback or new required client methods are permitted.
|
||||||
### 2. Initial HTTP Adapters, Endpoints, Redirects, And Injection
|
3. **Catalog coordination.** Obtain the RakestrawHome maintainer's default-profile
|
||||||
|
choice and select compatible loader/catalog versions in the documented release
|
||||||
**Recommendation:** start with generic unauthenticated HTTP-response reachability,
|
order. These are delivery dependencies, not reasons to reopen routing policy.
|
||||||
the OpenRouter current-key adapter, and explicit `none` authentication. Derive the
|
4. **Implementation details.** Choose private content and schema, the narrow evidence
|
||||||
key route from the effective base, while allowing explicitly configured absolute
|
handoff, and content-free classifications for internal faults that prevent a
|
||||||
diagnostic endpoints for separate health/auth routes. Reuse the configured HTTP
|
meaningful report. Define ownership and copying for reports and request values.
|
||||||
client and its standard redirect handling, record the final observed destination,
|
Verify the state matrix, timeout/cancellation distinction, and redirect evidence
|
||||||
and avoid custom redirect credential forwarding. A separate diagnostic host is
|
against actual transport behavior before finalizing GoDoc. Keep public execution
|
||||||
explicit configuration, not an inference from an overridden completion endpoint.
|
events and ordinary result/error semantics unchanged.
|
||||||
Keep configuration limited to named adapters and endpoints, not arbitrary methods
|
|
||||||
or response predicates. For injected generation clients, initially report HTTP
|
|
||||||
diagnostics unavailable unless a separate transport is explicitly supported.
|
|
||||||
|
|
||||||
This serves the maintained backends with a small adapter surface. Planning must
|
|
||||||
settle concrete endpoint fields and how request/credential observations reflect
|
|
||||||
redirects: a final response is not proof of acceptance at every redirect hop.
|
|
||||||
|
|
||||||
**Alternative:** initially support base-relative routes only, with no separate
|
|
||||||
host or additional transport option. That simplifies routing but excludes dedicated
|
|
||||||
diagnostic hosts. Another viable addition is an explicit diagnostic HTTP-client
|
|
||||||
option for injected-client engines; it improves custom-client coverage but adds a
|
|
||||||
supported injection surface. Neither choice requires expanding `LLMClient`.
|
|
||||||
|
|
||||||
### 3. Retry And Repair Controls
|
|
||||||
|
|
||||||
**Recommendation:** retain `TransientRetries`, with nil meaning zero for this
|
|
||||||
operation. Positive values reuse built-in inference status retries and preserve
|
|
||||||
attempt records; injected generation remains single-dispatch. Keep reachability
|
|
||||||
and authentication single-attempt and structural repair outside the initial test
|
|
||||||
procedure. This gives direct default evidence while preserving caller choice for
|
|
||||||
transient inference failures, without changing ordinary execution policy.
|
|
||||||
|
|
||||||
**Alternative:** omit the retry field and keep every diagnostic single-attempt.
|
|
||||||
That is the smallest API, but applications must repeat calls themselves. Inheriting
|
|
||||||
the engine retry budget is also viable: it standardizes defaults but makes cost
|
|
||||||
and recovery less obvious. Automatic structural repair would test recovery as
|
|
||||||
well as first-response conformance and warrants a separate explicit decision.
|
|
||||||
|
|
||||||
### 4. Built-In Metadata Delivery And Default Profiles
|
|
||||||
|
|
||||||
**Recommendation:** coordinate compatible catalog releases containing capability
|
|
||||||
metadata and backend defaults. Use `promptkit-openrouter-standard` for OpenRouter;
|
|
||||||
have the RakestrawHome catalog maintainer select an explicit current profile for
|
|
||||||
its diagnostic default. Include OpenRouter's adapter and RakestrawHome's `none`
|
|
||||||
setting. Caller overlays remain available. These are replaceable defaults, not
|
|
||||||
new promises about model names, availability, or cheap inference.
|
|
||||||
|
|
||||||
**Alternative:** contribute metadata through PromptKit-owned underlays initially,
|
|
||||||
or require caller configuration. Underlays avoid waiting for catalog releases but
|
|
||||||
move provider configuration into core. Caller-only metadata avoids coupled releases
|
|
||||||
but loses much of the convenience motivating adoption. No new stable profile-name
|
|
||||||
promise is necessary for the RakestrawHome default.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user