Plan symmetric typed prompt source helpers

This commit is contained in:
2026-11-06 12:15:00 +00:00
parent 06315062b3
commit 363920deb2

View File

@@ -8,9 +8,9 @@ presentation; Promptkit exposes the selected resource's resolved configuration.
The direction is accepted for planning; implementation has not begun. Selected
work includes fuller prompt inspection, profile inspection of the resolved
profile itself, a new `InspectBackend`, and `BackendConfig.Extends`. Execution-
policy reporting and prepared-request enhancements have been removed from this
roadmap. Decisions below record the accepted boundary and remaining choices.
profile itself, a new `InspectBackend`, `BackendConfig.Extends`, and typed prompt
construction through `PromptConfig`/`PromptSource`. Execution-policy reporting
and prepared-request enhancements have been removed from this roadmap. Decisions below record the accepted boundary and remaining choices.
## Resource-Inspection Boundary
@@ -195,18 +195,54 @@ mappings remain available for generic controls outside the convenience helper.
See [resource inheritance](../formats.md#resource-inheritance) and the existing
[profile helper](../../profiles.go).
## Typed Prompt Sources
Add `PromptConfig` and `PromptSource` to complete the typed source-helper set
alongside `BackendConfig`/`BackendSource` and `ProfileConfig`/`ProfileSource`.
The proposed helper follows their calling convention:
```go
func PromptSource(label string, prompts []PromptConfig) configkit.Source
```
Cover prompt identity, sibling inheritance through `Extends`, default profile,
description, session template, inputs, messages with inline or file content and
cache controls, and output settings. Choose nested input types for configuration
semantics; reuse existing types where suitable without forcing execution or
inspection values into the source-input role.
Keep the helper a straightforward mapping constructor. Encode supplied fields
under a `prompts` list, then delegate to `configkit.Mapping`. Optional nil fields
mean omission; explicit values, including zero, false, and empty strings where
supported, must remain representable. Preserve nil-versus-empty collections
where that distinction matters to composition. Raw ConfigKit mappings remain
the escape hatch for explicit-null configuration operations and other advanced
composition controls outside the typed convenience surface.
The helper does not resolve inheritance, apply execution defaults, render
messages, read content files, or independently validate a prompt. Existing
ConfigKit composition and engine loading retain those responsibilities. Relative
content references use the ordinary input/source resource-context mechanism;
creating a typed source does not select a new filesystem root or file-loading
workflow. Reuse ConfigKit's source snapshot behavior rather than adding another
copier or recursive compatibility converter.
Keep all three source-helper families consistent in their scope and omission
conventions. They need not reproduce every generic configuration operation or
share a reflection-based encoding framework. Maintain the field mappings and
focused behavioral tests as the configuration model evolves.
## Related Work
Typed prompt construction remains open decision 3. Listing return-type
consistency is a possible later cleanup, not required here. Collections,
schemas, and engine options do not need identical APIs merely for symmetry.
Listing return-type consistency is a possible later cleanup, not required here.
Collections, schemas, and engine options do not need identical APIs merely for symmetry.
The [deferred fingerprint proposal](deferred.md#semantic-execution-target-fingerprints)
remains separate. Live capacity monitoring, provider health guarantees, and
source round-tripping are not selected deliverables.
## Decisions
Decisions 1, 2, and 5 are accepted. Decisions 3 and 4 remain open. Numbering is
Decisions 1, 2, 3, and 5 are accepted. Only decision 4 remains open. Numbering is
retained for continuity with the discussion; implementation is pending.
### 1. How Should An Unknown Backend Be Classified?
@@ -252,14 +288,23 @@ where to place those additions remains necessary for resource inspection.
### 3. Should Typed Prompt Construction Be Added In This Round?
**Recommendation:** Keep `PromptConfig`/`PromptSource` separate until a
programmatic authoring need justifies the public input model. Files and ConfigKit
mappings already support prompts; this does not block operator inspection.
**Status:** Accepted; implementation pending.
**Alternative:** Add the typed helper for discoverability and compiler assistance.
It would need useful message/input/output and omission semantics, inheritance,
and source context for relative content files. Its maintenance cost is larger
than adding backend `Extends`; composition can still delegate to ConfigKit.
**Decision:** Add `PromptConfig` and `PromptSource`, including inheritance,
following the thin mapping-constructor pattern described above. Retain the
backend/profile helpers and raw ConfigKit mapping support.
**Rationale:** API symmetry and convenient programmatic construction have value
as Promptkit approaches 1.0. The existing helpers are small explicit encoders;
a prompt helper adds nested input values and mappings, not a new authoring,
composition, or validation subsystem. That bounded maintenance cost is justified
by consistent discoverability and compiler assistance across all three resources.
**Alternatives considered:** Deferring prompt helpers would leave asymmetric Go
conveniences. Removing the existing typed helpers would simplify Promptkit's
surface but move string-keyed mapping construction to consumers and require
migration. Neither is selected. Full typed coverage of all ConfigKit operations
is unnecessary; raw mappings continue to serve those cases.
### 4. How Should Resolved Resource Results And Presence Be Represented?
@@ -300,14 +345,16 @@ in resource inspection.
## Implementation And Verification
1. Resolve result representation/migration in decision 4. Decide typed prompt
construction separately; it is not a prerequisite for the selected work.
1. Resolve result representation/migration in decision 4. Source-input helper
types and inspection results have distinct purposes; select their shapes
accordingly.
2. Expose expanded prompt content and resolved profile fields through existing
capture/lookup paths, before execution completion. Preserve configured
presence/null distinctions without another composition pass.
3. Add backend inspection and the accepted public missing-backend error,
returning configured diagnostic metadata without endpoint derivation.
4. Add typed backend inheritance through the existing ConfigKit source helper.
4. Add typed backend inheritance and the prompt source/helper types, delegating
both to the ordinary ConfigKit mapping and loading path.
5. Update GoDoc, consumer/internal guidance, and release notes for the selected
behavior and profile compatibility change. Coordinate CommandKit reporting.
@@ -325,8 +372,11 @@ Use focused offline tests for actual boundary risks:
leaving omitted overrides absent. It does not require diagnostic readiness.
- Resource selection, error classification, and mutable-result ownership follow
the selected contract; reuse existing namespace and ownership coverage.
- Typed backend inheritance works through real ConfigKit composition without
retesting ConfigKit's entire generic inheritance feature set.
- Typed backend and prompt inheritance work through real ConfigKit composition.
Prompt sources preserve nested message/input/output settings, omission and
explicit values, ordering, and source snapshot behavior. Include a representative
relative content-file case using ordinary source context. Reuse generic loading,
validation, and inheritance coverage rather than duplicating it for each helper.
CommandKit owns presentation tests for the migrated resource view. Follow the
[testing policy](../policy/testing.md), combine cases where useful, and reuse
@@ -334,6 +384,7 @@ existing coverage. No new benchmark threshold or release gate is selected.
Completion means operators can inspect the resolved selected prompt, profile,
or backend accurately without assembling execution settings or navigating raw
configuration paths. Backend inheritance is available through the typed source
helper, and consumers have migration guidance for changed profile inspection.
configuration paths. All three resource kinds have typed source helpers,
including inheritance support, and consumers have migration guidance for changed
profile inspection.
No engine-policy or prepared-request additions are part of completion.