13 KiB
Weatherreporter PromptKit Wishlist
Purpose
This document records features and interface changes that would be useful additions to PromptKit from the perspective of the maintainers of Weatherreporter, a downstream application planning to replace its Scriptorium CLI integration with PromptKit.
PromptKit now provides the capabilities Weatherreporter needs for the migration. The remaining deferred ideas are optional opportunities to validate configuration earlier and improve durable failure diagnostics.
The examples are API sketches intended to communicate the desired capability, not prescriptive names or finalized Go contracts. The related Notarius PromptKit wishlist proposes several overlapping features from another downstream consumer's perspective.
Priority 1: Executable Preparation Handles
Disposition: Implemented as Engine.PrepareExecution and
Engine.RunPrepared. See the
consumer guidance.
Downstream need
Weatherreporter treats prompt preparation as a durable preflight boundary. It needs to:
- prepare the exact request that will be executed;
- persist a safe preparation record before starting the provider call; and
- execute without reloading or rerendering prompt, profile, schema, or input sources.
Persisting preflight before generation leaves useful evidence when a provider call fails or the process is interrupted during generation.
Implemented behavior
Weatherreporter can prepare one frozen execution snapshot, persist a
caller-owned and credential-redacted Details value, and execute that same
snapshot through RunPrepared. The opaque handle is engine-bound and
single-use; an unused handle can be released with Discard. The consumer
guide and exported GoDoc own the exact lifecycle, credential, cancellation,
and capacity contracts.
Value to Weatherreporter
This preserves Weatherreporter's durable preflight behavior, removes duplicate work, eliminates the source-consistency window, and ensures that persisted provenance describes the actual execution.
Priority 2: Prompt-Definition Inspection
Disposition: Implemented as
Engine.InspectPrompt. See the
consumer guidance.
Downstream need
Weatherreporter has a fixed registry of seven report definitions. Each report selects a prompt ID and one of two output workflows:
- direct Markdown; or
- structured generated text followed by application-owned domain validation and Markdown template rendering.
Weatherreporter will embed the PromptKit prompt definitions and private response schemas that implement those reports. It needs to validate that the report registry and embedded prompt corpus agree before weather collection or provider execution.
Previous integration option
Before prompt inspection was available, Weatherreporter could maintain
synthetic data-package fixtures and call Engine.Prepare for every report
prompt during tests. Runtime validation could also occur through the ordinary
per-report preparation stage.
This required complete placeholder inputs and profile resolution when the application primarily wanted to inspect prompt identity and declared contracts.
Value to Weatherreporter
The implemented interface lets Weatherreporter directly verify that every
report prompt exists, requires the curated data_package input, and declares
the expected Markdown or JSON Schema output contract. It reduces synthetic
test setup and moves failures ahead of weather collection.
Priority 3: Prompt-Independent Profile Inspection
Disposition: Implemented as
Engine.InspectProfile. See the
consumer guidance.
Downstream need
Weatherreporter will allow operators to select an external PromptKit profile source and may allow an explicit profile override. It needs to reject a missing profile, unknown backend, or malformed execution target before collecting weather data or writing report artifacts, and to apply its own policy to a reported credential requirement.
Value to Weatherreporter
The implemented interface improves fail-fast configuration validation and gives operator-facing errors direct profile and backend context. It remains optional for the initial migration.
Priority 4: Eager Source Validation
Disposition: Deferred until prompt and profile inspection have been used to determine whether a broader engine-wide validation operation is still needed.
Downstream need
PromptKit deliberately defers reading and validating filesystem and fs.FS
prompt, profile, and schema content until a request needs it. Weatherreporter
has a small fixed embedded prompt corpus and one optional external profile
source. It would benefit from an explicit offline validation operation for
tests, startup diagnostics, and configuration checks.
Current integration option
Weatherreporter can prepare every report prompt with fixture inputs and inspect any explicit profiles individually. That provides strong coverage but requires consumer-maintained traversal and synthetic material.
Requested capability
Consider an opt-in source-validation operation:
type SourceValidationOptions struct {
RequireCredentials bool
}
func (e *Engine) ValidateSources(
ctx context.Context,
opts SourceValidationOptions,
) error
The operation should eagerly discover and structurally validate the configured prompt, profile, and schema sources without model generation.
Design considerations
- Keep deferred validation as the normal
NewEnginebehavior. - Make eager validation an explicit consumer choice.
- Validate duplicate IDs and versions, strict YAML decoding, referenced content files, profile/backend membership, schema syntax, and schema references.
- Distinguish structural credential declarations from current environment availability.
- Do not read or expose credential values when credential availability is not requested.
- Preserve source-specific public error identities and useful path context.
- Respect context cancellation during filesystem discovery and schema work.
- Consider whether exact prompt and profile inspection APIs already provide a smaller sufficient surface before adding an engine-wide operation.
Value to Weatherreporter
This would simplify offline corpus checks and catch malformed operator profile sources before report work begins. It is helpful but lower priority than exact prompt and profile inspection.
Priority 5: Structured Generation Errors
Disposition: Deferred pending stronger downstream demand and a narrower design that does not duplicate prepared provenance or impose HTTP-specific fields on injected model clients.
Downstream need
Weatherreporter preserves redacted, inspectable failure receipts for report runs. When model generation fails operationally, it needs to classify the failure and retain safe execution context without parsing error prose.
Prompt preparation already supplies selected profile, backend, and model identity. Provider status classification would add useful operator context, especially when the built-in OpenAI-compatible client receives a non-success HTTP status.
Current integration option
PromptKit exposes ErrLLMGenerate and preserves injected client errors through
errors.Is. Weatherreporter can reliably classify generation failure and use
its preparation record for profile, backend, and model provenance. Any further
diagnostic detail remains a redacted error string.
Requested capability
Consider a typed generation error that continues to match ErrLLMGenerate:
type GenerationError struct {
BackendID string
Model string
StatusCode int
}
The exact fields may differ. The useful contract is safe structured context
available through errors.As, while errors.Is(err, ErrLLMGenerate) remains
compatible.
Design considerations
- Include only fields that PromptKit knows reliably and can expose safely.
- Treat an HTTP status as optional because injected model clients may not use HTTP.
- Do not expose provider response bodies, endpoints, credential environment names, credential values, request content, or generated content.
- Do not make a structured error a second source of prompt/profile provenance already present in a prepared execution.
- Preserve injected client error identity.
- Keep retry and backoff policy with the consuming application.
Value to Weatherreporter
This would improve durable failure receipts and troubleshooting, particularly for built-in transport failures. It is not required if preparation details and the existing sentinel remain available.
Lower-Priority Shared Wishlist Items
Structured Capacity Errors
Disposition: Implemented behavior. See the consumer guide's Handle Errors section.
PromptKit now exposes the stable backend ID for capacity rejection without requiring Weatherreporter to parse error text.
Weatherreporter currently generates batch reports sequentially and constructs one engine per invocation, so engine-local capacity exhaustion is unlikely in the initial design. The typed error becomes more valuable if report generation later becomes concurrent or PromptKit engines become longer-lived. It should not block adoption.
Semantic Execution-Target Fingerprints
Disposition: Deferred pending a separate semantic-equality design for resolved execution targets.
The semantic target digest proposed by the Notarius wishlist would provide a compact equality signal for audit metadata.
Weatherreporter does not currently reuse LLM-dependent checkpoints. Its Recent Changes behavior compares deterministic module snapshots rather than generated reports, so the digest has no immediate cache-correctness role. Existing PromptKit result metadata is sufficient for the initial integration. A digest would still be useful provenance and future-proofing, but it is not a migration priority.
Capabilities PromptKit Already Provides Well
PromptKit already provides the essential Weatherreporter integration surface:
- importable in-process engine construction;
- filesystem,
fs.FS, and programmatic prompt, profile, and schema sources; - offline preparation without model execution;
- prepared execution handles for a durable preflight boundary;
- exact prompt and profile inspection;
- versioned prompt selection;
- text, Markdown, JSON, and JSON Schema output contracts;
- single-pass output validation with raw output retained after completed validation failure;
- inline input artifacts with provenance URIs and input hashes;
- selected profile, backend, model, effective target, prompt hashes, timing, and token-usage provenance;
- endpoint-only profiles and engine-scoped backend registration;
- injected model-client and artifact-reader interfaces;
- caller cancellation, generation timeout, and transport timeout behavior; and
- public error sentinels for configuration, prompt, profile, artifact, validation, capacity, and generation failures; and
- structured backend identity for capacity rejection.
These capabilities are sufficient for Weatherreporter to adopt PromptKit without waiting for new upstream work.
Responsibilities That Should Remain In Weatherreporter
The following concerns belong to Weatherreporter and should not move into PromptKit:
- report definitions, valid periods, batches, and output naming;
- application prompt content and private report response schemas;
- deterministic weather facts, modules, and Recent Changes;
- curated
data_packageconstruction and persistence; - generated-text domain validation and Markdown template rendering;
- managed artifact paths, atomic writes, metadata, and inspection commands;
- preparation, execution, raw-output, and failure-receipt schemas;
- CLI configuration loading and precedence;
- debug enablement, redaction, placement, sensitivity, and retention;
- distributor notification;
- batch continuation and any future retry policy; and
- application-level compatibility and migration policy.
Suggested Upstream Sequence
For downstream adoption and any remaining upstream work, the useful order is:
- Adopt the implemented executable preparation handles.
- Consider eager source validation after evaluating whether the two exact inspection APIs are sufficient.
- Add structured generation errors.
- Use structured capacity errors and consider semantic execution-target fingerprints as lower-priority operational improvements.
The first item removes the material integration workaround. Prompt and profile inspection improve fail-fast validation. The remaining items are optional ergonomic and diagnostic improvements.
Adoption Sequencing
Weatherreporter should not wait for the deferred wishlist items. The current PromptKit interface is sufficient when Weatherreporter:
- embeds immutable prompt and schema assets;
- supplies immutable inline data-package bytes;
- constructs one engine per CLI invocation;
- prepares an execution, persists selected
Details, and callsRunPrepared; and - keeps PromptKit behind a weatherreporter-owned adapter contract.
Prompt inspection, profile inspection, source validation, structured errors, capacity details, and semantic fingerprints should not gate adoption.