Align the assessment with ConfigKit v0.5.0

This commit is contained in:
2026-09-30 00:25:10 +00:00
parent 34f5980973
commit 08409dd472

View File

@@ -1,8 +1,9 @@
# ConfigKit Adoption Assessment # ConfigKit Adoption Assessment
Status: assessment with agreed design direction; upstream API details remain Status: assessment aligned to released ConfigKit v0.5.0. Upstream capability
to be settled before the feature roadmap and implementation plan. No runtime prerequisites are available; PromptKit integration and migration decisions remain
changes are part of this assessment. for the feature roadmap and implementation plan. No runtime changes are part of
this assessment.
## Goal And Recommendation ## Goal And Recommendation
@@ -14,8 +15,8 @@ and their migration paths.
Recommend adoption through an eager, immutable definition-loading boundary. Recommend adoption through an eager, immutable definition-loading boundary.
ConfigKit should own YAML interpretation, source-tier combination, strict typed ConfigKit should own YAML interpretation, source-tier combination, strict typed
decoding, presence, and source diagnostics. PromptKit should own definition identity, named profile decoding, sibling inheritance, presence, and source diagnostics. PromptKit should
relationships, LLM-specific rules, and execution. Do not retain the lazy loading own definition selection, LLM-specific rules, and execution. Do not retain the lazy loading
architecture merely to minimize migration, or introduce a second generic architecture merely to minimize migration, or introduce a second generic
configuration framework inside PromptKit. configuration framework inside PromptKit.
@@ -25,69 +26,53 @@ lazy error arbitration, and repeated profile-chain resolution. Some of those
savings come from the loading redesign rather than ConfigKit itself. ConfigKit savings come from the loading redesign rather than ConfigKit itself. ConfigKit
adds ongoing value by owning the generic decoding behavior and its tests. adds ongoing value by owning the generic decoding behavior and its tests.
## Prerequisite: Proposed Upstream ConfigKit Work ## Released ConfigKit Capabilities
Design, implement, and release these two ConfigKit capabilities before the ConfigKit v0.5.0 satisfies the two requested prerequisites and also implements
dependent PromptKit refactor. The remaining recommendations assume this upstream sibling inheritance. Adopt the released public contracts rather than waiting for
work; finalize their integration details against its agreed public contracts. the earlier proposals to be implemented:
These are selected architectural prerequisites, not a claim that adoption is
technically impossible using today's reader-based API.
1. **Native `fs.FS` sources and source-relative context.** Support embedded and 1. **Filesystem sources:** `NewFilesystem(label, fsys).File(name)` borrows an
caller-supplied filesystems as first-class configuration sources. Define source `fs.FS` with reusable namespace identity. Imports and resource contexts retain
identity, relative path resolution, ownership, and how enabled imports and that namespace. `Result.SourceContext` and `Resolution.SourceContext` expose
overlays operate within that filesystem. This is broadly useful for libraries passive `ResourceContext` values with `FS` and `BaseDir`.
bundling default configuration. Passing an opened file to today's `Reader` 2. **Source-backed underlays:** `LoadLayered` accepts a main `Input`
supplies bytes and a label, but does not make filesystem-relative loading and ordered `Underlay` groups. Each group composes strictly; groups overlay
native to ConfigKit; that workaround is not the target architecture. recursively from lowest to highest priority. `Input{Source: NoSource()}` omits
2. **Source-backed underlays with origins and programmatic input.** Adopt the main input. `Mapping(label, map[string]any)` snapshots supported built-in
ConfigKit's working design: strictly compose contributions within each tier, scalar/list/map values with explicit presence; it does not ingest arbitrary
then recursively overlay explicitly ordered tiers. Support embedded, host-file, typed structs. Generic programmatic input is not represented as CLI overrides.
byte/reader, and labeled programmatic sources without temporary files or YAML 3. **Sibling inheritance:** the reserved `extends` key names one immediate sibling
serialization round trips. Prefer the proposed string-keyed programmatic mapping. Relationships resolve after precedence assembly and before typed
mappings: omitted keys convey absence; present values, including nil/null, decoding, with inherited origins, history, and resource context preserved.
convey explicit input. Do not require typed-value ingestion as a prerequisite. This is built-in behavior, not the opt-in/registered-collection API originally
suggested by PromptKit.
Adopt ConfigKit's recursive combination model rather than preserving PromptKit's Adopt ConfigKit's recursive combination model rather than preserving PromptKit's
whole-profile shadowing or atomic provider-map replacement across source tiers. whole-profile shadowing or atomic provider-map replacement across source tiers.
No hidden replacement pass should run after ConfigKit loading. Named inheritance No hidden replacement or inheritance pass should run after ConfigKit loading.
is a separate optional upstream request, not part of these prerequisites. Use released sibling inheritance for profiles, leaving domain validation in
PromptKit. This assessment does not authorize code changes in either repository.
The upstream design should show how the two capabilities work together, including
source origins and efficient ownership/copying. Resolve these API questions before
turning the assessment into a decision-complete PromptKit implementation plan.
This assessment does not authorize code changes in either repository.
## Evidence And Scope ## Evidence And Scope
Reviewed local baselines on 2026-09-29: PromptKit's runtime baseline remains v0.11.2; this assessment has since received
documentation-only revisions. Updated upstream review on 2026-09-30:
- PromptKit: `12d6d80024e80c552d122a076c22429bf6f2f6c2` (v0.11.2). - PromptKit: `12d6d80024e80c552d122a076c22429bf6f2f6c2` (v0.11.2).
- ConfigKit: `67c03690181c5af8dde6be325abac241dae6732f` (v0.4.2). - ConfigKit: `dc09959cca4e105f49ec316c6d4ba585bd2340bd` (v0.5.0), verified
against the published tag. Its clean checkout passed `go test ./...` during
Design update: reviewed ConfigKit's working the release review. This replaces the earlier v0.4.2 and uncommitted-roadmap
`docs/roadmap/sources-and-layering.md` with checkout HEAD comparison as the upstream basis for adoption.
`36172ed20e832b371506d6aceb02dc6c8f50f71b`. The reviewed roadmap included
uncommitted changes, so that commit alone does not identify the reviewed text.
It remains a proposed target, not implemented behavior. The recommendations here
now follow its underlay semantics and support its two open-decision recommendations:
labeled programmatic mappings and direct source-context queries. Verify the
final upstream contracts before preparing dependent implementation details.
PromptKit evidence: [consumer workflows](../consumers/pkg-promptkit.md), PromptKit evidence: [consumer workflows](../consumers/pkg-promptkit.md),
[file formats](../formats.md), [source implementation](../internal/sources.md), [file formats](../formats.md), [source implementation](../internal/sources.md),
[runner](../internal/runner.md), and the implementation owners identified below. [runner](../internal/runner.md), and the implementation owners identified below.
ConfigKit evidence: its reviewed `docs/config.md`, `docs/roadmap/deferred.md`, ConfigKit evidence at that release: `docs/config.md`, `docs/releases/v0.5.0.md`,
`lifecycle.go`, `source.go`, and ADR 0001 in the sibling checkout. That checkout `layered.go`, `source.go`, `resource_context.go`, and ADR 0009 in the sibling
is review context, not a proposed build dependency or required directory layout. checkout. That checkout is review context, not a build dependency or required
directory layout. The released configuration contract owns exact upstream behavior;
ConfigKit currently exposes `Load[T]` over file, byte, reader, and defaults-only the summaries here identify its consequences for the proposed PromptKit design.
sources. It supports strict decoding, presence/origin records, defaults,
recorded resolution, semantic validation, explicit imports, one selected
filesystem overlay, and secret handling. Its parser and generic conversion
machinery are private. It has no public arbitrary layer-composition, generic
inheritance, or `fs.FS` source API. Its deferred scope explicitly excludes several
of these generalizations; an upstream enhancement requires a deliberate decision.
This is a source-and-contract assessment, not a performance benchmark or full This is a source-and-contract assessment, not a performance benchmark or full
correctness audit. It does not claim measured allocation, latency, or line-count correctness audit. It does not claim measured allocation, latency, or line-count
@@ -132,7 +117,8 @@ provide configuration provenance.
| Configuration filesystem sources, relative imports, and generic layer origins | Delegate to the prerequisite ConfigKit APIs; do not maintain parallel reader-based loading machinery | | Configuration filesystem sources, relative imports, and generic layer origins | Delegate to the prerequisite ConfigKit APIs; do not maintain parallel reader-based loading machinery |
| Definition discovery and relative message-content references | Retain PromptKit's domain resource adapters, using ConfigKit source context and standard `io/fs` facilities where sufficient | | Definition discovery and relative message-content references | Retain PromptKit's domain resource adapters, using ConfigKit source context and standard `io/fs` facilities where sufficient |
| Profile-source priority and combination | PromptKit selects tiers; ConfigKit owns strict within-tier composition and recursive cross-tier overlay; eliminate repository fallback and whole-definition shadowing | | Profile-source priority and combination | PromptKit selects tiers; ConfigKit owns strict within-tier composition and recursive cross-tier overlay; eliminate repository fallback and whole-definition shadowing |
| Named profile inheritance and backend selection | PromptKit owns domain relationships unless the separate inheritance proposal is adopted; integrate resolution with ConfigKit's recorded lifecycle | | Named profile inheritance | Delegate sibling graph resolution, combination, and derivation to ConfigKit's `extends`; remove the custom profile resolver |
| Backend selection and domain normalization | Retain PromptKit domain rules; use recorded application resolution for configuration transformations not already handled by structural inheritance |
| LLM setting bounds, role/session normalization, output rules, reserved provider fields | Retain shared PromptKit domain owners; ConfigKit validation callbacks may invoke them | | LLM setting bounds, role/session normalization, output rules, reserved provider fields | Retain shared PromptKit domain owners; ConfigKit validation callbacks may invoke them |
| Definition defaults | Use ConfigKit defaults where they do not erase inheritance presence; apply effective execution defaults after inheritance | | Definition defaults | Use ConfigKit defaults where they do not erase inheritance presence; apply effective execution defaults after inheritance |
| Programmatic configuration | Prefer labeled mapping input with explicit presence; evaluate whether typed PromptKit convenience constructors justify conversion code, without YAML round trips or zero-value inference | | Programmatic configuration | Prefer labeled mapping input with explicit presence; evaluate whether typed PromptKit convenience constructors justify conversion code, without YAML round trips or zero-value inference |
@@ -162,7 +148,8 @@ in the feature roadmap. Support OS directories, individual files, embedded/custo
`fs.FS` sources, and programmatic input through the new source model; source selection `fs.FS` sources, and programmatic input through the new source model; source selection
and definition discovery remain PromptKit concerns, not a second composition engine. and definition discovery remain PromptKit concerns, not a second composition engine.
Perform domain-specific resolution through ConfigKit's recorded lifecycle before ConfigKit expands structural inheritance before typed defaults/decoding. Perform
any remaining domain-specific resolution through its recorded lifecycle before
semantic validation and result publication. Reuse its presence and provenance; semantic validation and result publication. Reuse its presence and provenance;
do not add a generic merge/defaulting pass or reconstruct origins after loading. do not add a generic merge/defaulting pass or reconstruct origins after loading.
Runtime client assembly and resource interpretation remain outside typed decoding. Runtime client assembly and resource interpretation remain outside typed decoding.
@@ -174,7 +161,7 @@ source-relative content resolution and containment without expanding the threat
model. A snapshot is a set of captured reads, not an atomic filesystem transaction. model. A snapshot is a set of captured reads, not an atomic filesystem transaction.
Resolve each effective content reference using its contributing source's context, Resolve each effective content reference using its contributing source's context,
not the highest tier's directory. Support ConfigKit's proposed direct context not the highest tier's directory. Use ConfigKit's released direct context
query rather than a consumer-maintained filesystem registry. Composite origins query rather than a consumer-maintained filesystem registry. Composite origins
must not be assigned an arbitrary directory; ambiguous or absent context needs must not be assigned an arbitrary directory; ambiguous or absent context needs
an actionable resource error or explicit consumer-supplied context. ConfigKit an actionable resource error or explicit consumer-supplied context. ConfigKit
@@ -212,7 +199,7 @@ not a reason to impose intermediate typed validation on ordinary inputs.
Preserve profile templates that become usable through descendants or runtime Preserve profile templates that become usable through descendants or runtime
overrides: eager loading must not require every consumer profile to be an overrides: eager loading must not require every consumer profile to be an
independently runnable endpoint/model pair. Validate supplied fields and graph independently runnable endpoint/model pair. Validate supplied fields and graph
integrity eagerly (including missing bases and cycles), and check final execution integrity eagerly (ConfigKit handles missing bases and cycles), and check final execution
requirements after runtime selection/overrides. Prompt default-profile references requirements after runtime selection/overrides. Prompt default-profile references
can be checked against the assembled collection; a prompt with no default remains can be checked against the assembled collection; a prompt with no default remains
valid for callers that supply a profile explicitly. valid for callers that supply a profile explicitly.
@@ -230,7 +217,7 @@ If a separate configuration schema version is later needed, respect ConfigKit's
designated main-input ownership and pre-underlay check timing; do not assume designated main-input ownership and pre-underlay check timing; do not assume
last-wins version selection across catalogs. last-wins version selection across catalogs.
### Source Presence And Separate Named Inheritance ### Source Presence And Released Sibling Inheritance
Adopt ConfigKit source-layer semantics: absence retains lower input; explicit Adopt ConfigKit source-layer semantics: absence retains lower input; explicit
zero, false, and empty strings replace it; mappings combine recursively; empty zero, false, and empty strings replace it; mappings combine recursively; empty
@@ -247,21 +234,40 @@ profile fields in ways that erase that distinction before relationship resolutio
Provider `extra_params` maps combine recursively across source tiers too: `{}` Provider `extra_params` maps combine recursively across source tiers too: `{}`
does not clear lower keys. Retire the proposed atomic source-map replacement and does not clear lower keys. Retire the proposed atomic source-map replacement and
null-as-unspecified conventions; do not emulate them after loading. An operator null-as-unspecified conventions; do not emulate them after loading. An operator
overriding only `model` also retains a lower `base_profile` declaration and other overriding only `model` also retains a lower `extends` declaration and other
omitted settings. Diagnose and document these consequences explicitly. omitted settings. Diagnose and document these consequences explicitly.
Named inheritance still selects relationships between effective entries; source Replace `base_profile` with `extends` on sibling profile mappings. A string names
layering does not implement it. The optional upstream request remains pending. one exact immediate sibling; null cancels the relationship while preserving the
Finalize named-inheritance null/map semantics separately, favoring consistency child's own settings. Omission retains a lower-tier directive. There is no ancestor
with source layering rather than automatically retaining atomic maps or null-as- scope search or cross-collection reference. Superseded references are history,
inherit. Any domain exception needs explicit justification. This also does not not active relationships to validate; every effective relationship resolves,
silently change the existing request-level override contract, which is a separate including profiles not selected for execution.
runtime boundary to review in the feature roadmap.
Resolve shared ancestors once per snapshot. Use recorded domain resolution to Children recursively overlay their resolved parents with the same value rules:
keep resulting values and origins consistent. Confirm the upstream lifecycle can zero/false/empty strings and sequences/null replace, mappings combine, and `{}`
express required relationship provenance; do not claim generic layer history does not clear inherited keys. Inherited values count as explicit input for
already explains named inheritance or invent a parallel audit framework. presence queries and absence-based defaults, even when false, zero, or null.
Do not repeat inheritance in PromptKit's application-resolution callback. Use
`Origin.Inheritance` and retained history for explicit operator inspection.
Inherited resource references retain their declaring source's context.
Enclosing inheritance resolves before nested relationships; nested inherited
directives resolve at each destination against its siblings. Defaults and
application-derived values do not trigger another inheritance pass. Model this
deliberately in PromptKit configuration rather than promising arbitrary graph
resolution over runtime values. Partial bases must fit the typed schema and
PromptKit's validation; ConfigKit grants them no special validation exemption.
`extends` is reserved in every input mapping, including provider-parameter maps,
across all source kinds. There is no opt-in switch or ordinary-data escape in the
released contract. Audit catalog and consumer payload needs before finalizing
their format; a literal provider field with that name cannot silently pass through
the configuration loader. Do not invent an encoding workaround in this assessment.
The existing request-level override API remains a separate runtime boundary.
The feature roadmap must review its interaction with configured values without
silently subjecting runtime request data to configuration inheritance directives.
### Reloading, Errors, And Application Integration ### Reloading, Errors, And Application Integration
@@ -335,7 +341,7 @@ cost, but explanation generation and provenance analysis stay off the run path.
| `internal/profile/filesystem_repository.go`: metadata scans, selected strict decode, stream-end checks, malformed-file selection arbitration | Replace with source acquisition, ConfigKit assembly/decoding, and indexed effective values; remove the metadata prepass and per-lookup filesystem path | | `internal/profile/filesystem_repository.go`: metadata scans, selected strict decode, stream-end checks, malformed-file selection arbitration | Replace with source acquisition, ConfigKit assembly/decoding, and indexed effective values; remove the metadata prepass and per-lookup filesystem path |
| `internal/promptdef/filesystem_repository.go`: metadata selection and repeated decoding/content opening | Replace with eager prompt loads and an ID/version index; keep domain normalization and contained content reading | | `internal/promptdef/filesystem_repository.go`: metadata selection and repeated decoding/content opening | Replace with eager prompt loads and an ID/version index; keep domain normalization and contained content reading |
| Profile filesystem, `fs.FS`, eager, memory, and overlay repository variants | Collapse loading into source adapters plus immutable collections; preserve only interfaces that still serve a real boundary | | Profile filesystem, `fs.FS`, eager, memory, and overlay repository variants | Collapse loading into source adapters plus immutable collections; preserve only interfaces that still serve a real boundary |
| `internal/profile/resolving_repository.go` | Replace per-operation traversal and zero-sentinel merging with once-per-snapshot presence-aware typed resolution; graph logic remains | | `internal/profile/resolving_repository.go` | Remove custom graph traversal, cycle detection, and zero-sentinel merging in favor of ConfigKit sibling inheritance; retain only PromptKit domain validation |
| `internal/engine` raw repository-stack assembly | Replace with ConfigKit source tiers and one effective typed collection; engine capacity/client assembly remains | | `internal/engine` raw repository-stack assembly | Replace with ConfigKit source tiers and one effective typed collection; engine capacity/client assembly remains |
| `internal/catalog` profile metadata extraction | Obtain explicit field information from ConfigKit; retain manifests, ownership, namespace, connection-metadata and secret checks | | `internal/catalog` profile metadata extraction | Obtain explicit field information from ConfigKit; retain manifests, ownership, namespace, connection-metadata and secret checks |
| `internal/filecatalog` | Retain/reduce discovery and containment helpers actually needed by the eager loader; do not claim the entire package disappears | | `internal/filecatalog` | Retain/reduce discovery and containment helpers actually needed by the eager loader; do not claim the entire package disappears |
@@ -377,10 +383,12 @@ input and produced-data size, not a blanket O(n) claim with an undefined n.
captured content instead of reparsing it for metadata, selection, and validation. captured content instead of reparsing it for metadata, selection, and validation.
- Build identity indexes in one pass, with expected constant-time map lookup. - Build identity indexes in one pass, with expected constant-time map lookup.
Do not scan whole collections for every lookup or precedence decision. Do not scan whole collections for every lookup or precedence decision.
- Process inheritance graph structure in O(V + E), where V is the number of - Delegate inheritance expansion to ConfigKit once during loading rather than
profiles and E the inheritance edges. Resolve shared ancestors once. Account rebuilding its graph in PromptKit. Assess scaling against input, materialized
separately for the size of materialized settings and retained origins; copying inherited values, nested destination resolution, and retained history; do not
large inherited maps to many independent results necessarily costs more than V. claim unconditional O(V + E) total work from the count of profiles and edges.
ConfigKit bounds expansion and retained evidence through its existing budgets;
representative catalog sizes must fit them without new per-run processing.
- Avoid whole-collection copying per layer, repeated serialization, and repeated - Avoid whole-collection copying per layer, repeated serialization, and repeated
prefix/history traversal. Analyze layer processing against total input nodes prefix/history traversal. Analyze layer processing against total input nodes
and produced values/provenance, including intentionally retained history. and produced values/provenance, including intentionally retained history.
@@ -397,17 +405,13 @@ The implementation plan should include focused benchmarks for consequential
repeated-work risks, such as shared-ancestor profiles and many layers, rather than repeated-work risks, such as shared-ancestor profiles and many layers, rather than
machine-dependent timing gates or benchmarks for every helper. machine-dependent timing gates or benchmarks for every helper.
## 5. Additional Upstream Opportunities ## 5. Upstream Readiness And Remaining Opportunities
Native filesystem sources and public layered loading with origins are the Filesystem sources, underlays, programmatic mappings, source contexts, and sibling
prerequisites described near the beginning, not optional follow-ups. The following inheritance are released in v0.5.0. No additional upstream feature is currently a
remain optional and do not block adoption unless the upstream design establishes demonstrated prerequisite. Context-aware loading remains a possible future request
a concrete dependency: if concrete consumers need it, not a reason to delay adoption. Existing loading
is synchronous; do not simulate cancellation with detached background work.
| Candidate | Recommendation and tradeoff |
| --- | --- |
| Generic named configuration inheritance | Requested separately in ConfigKit's `docs/roadmap/feature-request-promptkit-inheritance.md`, primarily for shared semantics across consumers. ConfigKit decides whether to adopt it; PromptKit can retain a small domain resolver if declined. Presence-aware source layering belongs to the prerequisite work, not this optional proposal. |
| Context-aware loading | Optional for reusable cancellable construction if large-source consumers need it. Promise cooperative cancellation only; no detached reads or instant interruption of arbitrary readers. |
Do not propose a public raw AST, permissive identity-only decoder, or dynamic Do not propose a public raw AST, permissive identity-only decoder, or dynamic
subtree conversion solely to preserve PromptKit's current scanning design. subtree conversion solely to preserve PromptKit's current scanning design.
@@ -418,12 +422,12 @@ ConfigKit and PromptKit both declare LGPL-3.0-or-later. Adoption must still upda
dependency notices under the OSS policy and inspect the exact selected release dependency notices under the OSS policy and inspect the exact selected release
and its transitive notices. Their current Go minimums do not require a PromptKit and its transitive notices. Their current Go minimums do not require a PromptKit
toolchain increase. Use a released module dependency, not a sibling-directory toolchain increase. Use a released module dependency, not a sibling-directory
replacement. This assessment proposes upstream work, but makes no upstream edits replacement. Select v0.5.0 as the assessed adoption baseline; any newer selection
or licensing change. needs its own review. This assessment changes neither dependencies nor licenses.
## 6. Decisions And Migration ## 6. Decisions And Migration
The agreed direction now incorporates ConfigKit's working roadmap. This supersedes The agreed direction now incorporates ConfigKit's v0.5.0 contracts. This supersedes
the earlier recommendations for independently typed documents, whole-definition the earlier recommendations for independently typed documents, whole-definition
shadowing, intermediate typed validation, and atomic maps/null-as-unspecified at shadowing, intermediate typed validation, and atomic maps/null-as-unspecified at
the source boundary. the source boundary.
@@ -438,9 +442,9 @@ the source boundary.
typed loads followed by custom combination are not the selected direction. typed loads followed by custom combination are not the selected direction.
3. **Presence and relationships.** Accept recursive source-tier overlay, retained 3. **Presence and relationships.** Accept recursive source-tier overlay, retained
children for empty mappings, explicit null replacement, and effective metadata. children for empty mappings, explicit null replacement, and effective metadata.
Named inheritance remains separate pending the upstream decision; settle its Adopt built-in sibling inheritance, including reserved `extends`, recursive
domain semantics before implementation rather than assuming either automatic mapping combination, null cancellation, and inherited explicit presence. Do
equivalence or an exception to ConfigKit's rules. not preserve a parallel PromptKit structural resolver.
4. **Diagnostic boundary.** Keep wrapping ConfigKit's public loading errors rather 4. **Diagnostic boundary.** Keep wrapping ConfigKit's public loading errors rather
than mirroring them. Retain actionable domain relationship and resource errors than mirroring them. Retain actionable domain relationship and resource errors
without duplicating ConfigKit's generic diagnostic/provenance system. without duplicating ConfigKit's generic diagnostic/provenance system.
@@ -450,14 +454,17 @@ the source boundary.
ordinary prompt execution. Finalize targeted query shapes and ownership in the ordinary prompt execution. Finalize targeted query shapes and ownership in the
feature roadmap, with presentation remaining application-owned. feature roadmap, with presentation remaining application-owned.
Support the upstream recommendations for labeled mapping-based programmatic input Use released mapping-based programmatic input and direct filesystem resource-context
and direct filesystem resource-context queries. If real consumer examples show queries. If real consumer examples show
mapping construction to be repetitive, consider small typed PromptKit conveniences mapping construction to be repetitive, consider small typed PromptKit conveniences
with explicit presence rather than requiring an upstream typed-ingestion API. with explicit presence rather than requiring an upstream typed-ingestion API.
Final upstream signatures and ownership details remain open dependencies of the
feature roadmap, not implemented guarantees. Resolve the named-inheritance Remaining PromptKit decisions are the exact collection/version format, catalog
direction there as well; a PromptKit-owned resolver remains viable if ConfigKit migration, programmatic ergonomics, operator-inspection surface, and validation
declines or defers that optional request. of partial base profiles. Also settle how operators discard unwanted provider
settings or old relationships using the released null semantics without a hidden
replacement pass. Check the reserved-key impact on arbitrary provider maps. These
are integration decisions, not unresolved ConfigKit API proposals.
Expected consumer migration: Expected consumer migration:
@@ -467,11 +474,15 @@ Expected consumer migration:
for historical YAML coercion. for historical YAML coercion.
- Move standalone definitions into the agreed keyed contribution format. Review - Move standalone definitions into the agreed keyed contribution format. Review
same-name contributions: disjoint fields within a tier can combine, and higher same-name contributions: disjoint fields within a tier can combine, and higher
tiers retain omitted lower fields, including `base_profile` references. tiers retain omitted lower fields, including `extends` references. Convert
`base_profile` to sibling `extends`; use `extends: null` to cancel a lower-tier
relationship, not to erase all settings already supplied to the child.
- Review zero/false/empty/null values explicitly. Provider maps merge across - Review zero/false/empty/null values explicitly. Provider maps merge across
tiers, `{}` does not clear them, and null replaces rather than means omission. tiers, `{}` does not clear them, and null replaces rather than means omission.
Use labeled programmatic mappings or approved presence-aware conveniences. Use labeled programmatic mappings or approved presence-aware conveniences.
Document the separately selected inheritance semantics when settled. Apply those same combination rules to inherited settings. Rename ordinary
configuration keys named `extends`; examine provider maps for cases where
renaming would change their substantive meaning and resolve those explicitly.
- Handle effective-definition errors at construction, fix syntax/composition - Handle effective-definition errors at construction, fix syntax/composition
failures even in overridden inputs, and deliberately rebuild/swap engines failures even in overridden inputs, and deliberately rebuild/swap engines
after definition changes. after definition changes.
@@ -486,8 +497,9 @@ Expected consumer migration:
custom backend, fallback, and embedded workflows in the migration guidance. custom backend, fallback, and embedded workflows in the migration guidance.
The subsequent feature roadmap should carry forward these choices, resolve the The subsequent feature roadmap should carry forward these choices, resolve the
upstream API details, and specify the target end state. The staged implementation remaining PromptKit integration decisions, and specify the target end state.
plan must sequence the prerequisite ConfigKit releases before dependent PromptKit The staged implementation plan can now adopt released ConfigKit support without
work, then cover deletions/replacements, contract tests, canonical documentation, waiting for upstream feature work, coordinating any catalog format releases before
their consumption. Cover deletions/replacements, contract tests, canonical documentation,
examples, attribution, and minor-release migration notes. Neither document should examples, attribution, and minor-release migration notes. Neither document should
become a reason to preserve obsolete compatibility machinery. become a reason to preserve obsolete compatibility machinery.