2026-10-12 01:40:15 +00:00
|
|
|
|
# Implement PromptKit comparison and catalogs
|
2026-10-11 20:35:38 +00:00
|
|
|
|
|
2026-10-12 02:17:54 +00:00
|
|
|
|
Status: Stages 1–7 complete; remaining stages are planned.
|
2026-10-11 20:35:38 +00:00
|
|
|
|
|
|
|
|
|
|
## Scope and authority
|
|
|
|
|
|
|
2026-10-12 01:40:15 +00:00
|
|
|
|
This plan implements the accepted [PromptKit feature roadmap](promptkit.md).
|
|
|
|
|
|
That roadmap owns the target state and product choices; this document assigns
|
|
|
|
|
|
work needed to reach it. Baseline: CommandKit commit `20e19b9`. ConfigKit
|
|
|
|
|
|
comparison is complete, ckprompt uses PromptKit v0.12.0, and PromptKit comparison
|
|
|
|
|
|
and catalogs are not yet exposed.
|
|
|
|
|
|
|
|
|
|
|
|
Read [development orientation](../development.md) and applicable policies,
|
|
|
|
|
|
including [agent discipline](../policy/agents.md),
|
|
|
|
|
|
[architecture](../policy/architecture.md), [testing](../policy/testing.md),
|
|
|
|
|
|
[documentation ownership](../policy/documentation.md), [OSS](../policy/oss.md),
|
|
|
|
|
|
and [release policy](../policy/release.md). The accepted ADRs linked from the
|
|
|
|
|
|
feature roadmap govern declaration capture, scope capabilities, and paired inputs.
|
|
|
|
|
|
|
|
|
|
|
|
CommandKit exposes capabilities owned by PromptKit and ConfigKit. It owns CLI
|
|
|
|
|
|
access and presentation, not a replacement definition of comparison or catalog
|
|
|
|
|
|
membership. Dependencies remain ckprompt to ckconfig and core. This sprint needs
|
|
|
|
|
|
no core API, backend, general registry, or additional module.
|
|
|
|
|
|
|
|
|
|
|
|
The repository is an unreleased alpha with no downstream consumers. Give the
|
|
|
|
|
|
prototype shape no compatibility preference: choose straightforward private
|
|
|
|
|
|
helpers and refactor existing ones where useful. Preserve deliberately selected
|
|
|
|
|
|
contracts, not incidental implementation details. No compatibility wrappers,
|
|
|
|
|
|
migration period, or buildable intermediate commits are required. The final
|
|
|
|
|
|
assembled end state must build and pass relevant validation.
|
|
|
|
|
|
|
|
|
|
|
|
### Execute the stages
|
|
|
|
|
|
|
|
|
|
|
|
- Follow stages in order. Each stage is one bounded Luna assignment; inspect its
|
|
|
|
|
|
linked owners and current code before editing.
|
|
|
|
|
|
- Scope changes to that stage and necessary integration repairs. Reuse existing
|
|
|
|
|
|
paths rather than copying parser, comparison, or delivery infrastructure.
|
|
|
|
|
|
- Format changed Go files and add focused behavioral evidence as assigned.
|
|
|
|
|
|
Validation instructions apply during implementation, not this planning pass.
|
|
|
|
|
|
Use existing fast native fixtures; no model-provider access is needed.
|
|
|
|
|
|
- Add completion evidence under each completed stage: changes, checks actually
|
|
|
|
|
|
run, results, and validation deferred until a later stage. Do not mark the
|
|
|
|
|
|
adoption complete before its assembled behavior works.
|
|
|
|
|
|
- Commit completed nonempty units with plain English messages under the agent
|
|
|
|
|
|
policy. Do not create empty commits, publish releases, or push changes.
|
|
|
|
|
|
- Existing tests asserting that PromptKit comparison is unavailable become
|
|
|
|
|
|
obsolete intentionally. Replace them in their assigned stage; do not add
|
|
|
|
|
|
temporary behavior to preserve that expectation.
|
|
|
|
|
|
|
|
|
|
|
|
| Target | Primary stages |
|
|
|
|
|
|
| --- | --- |
|
|
|
|
|
|
| PromptKit v0.14.0 and real dependency metadata | 1, 11, 12 |
|
|
|
|
|
|
| Side diagnostics and native configuration comparison | 2–4 |
|
|
|
|
|
|
| Optional native catalog providers | 5 |
|
|
|
|
|
|
| Catalog YAML presentation and command invocation | 6–8 |
|
|
|
|
|
|
| Maintained consumer and canonical documentation | 9–10 |
|
|
|
|
|
|
| Notices, prepared notes, and complete validation | 11–12 |
|
|
|
|
|
|
|
|
|
|
|
|
## Stage 1: Adopt PromptKit and prepare module validation
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** ckprompt selects PromptKit v0.14.0 using real upstream metadata,
|
|
|
|
|
|
and the sprint has a usable local validation setup.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Upgrade `integrations/ckprompt/go.mod` from PromptKit v0.12.0 to v0.14.0,
|
|
|
|
|
|
pinned by the feature roadmap to upstream commit
|
|
|
|
|
|
`143c6e9b3a675872117b0471e2ff8bcb25055a54`. Reconcile legitimate indirect
|
|
|
|
|
|
requirements and real checksums using Go tooling against the released module.
|
|
|
|
|
|
2. Retain Go 1.26.0, ConfigKit v0.7.1, and existing independent CommandKit
|
|
|
|
|
|
prerequisites: core v0.2.0 and ckconfig v0.1.0. Core's declared ReleaseKit
|
|
|
|
|
|
v0.4.0 tool/launcher stays unchanged; integration graphs may select v0.4.1
|
|
|
|
|
|
through upstream dependencies.
|
|
|
|
|
|
3. Preserve an existing ignored `go.work`; ensure it includes core, ckconfig,
|
|
|
|
|
|
and ckprompt. Commit neither workspace files nor sibling replacements.
|
|
|
|
|
|
4. Establish workspace-off checks using disposable copies of each integration's
|
|
|
|
|
|
module file and accompanying sum file in a temporary directory (`go.mod` and
|
|
|
|
|
|
`go.sum`, so `-modfile` finds the matching sums). Replace only unpublished
|
|
|
|
|
|
CommandKit prerequisites: core for ckconfig, and core plus ckconfig for ckprompt.
|
|
|
|
|
|
Resolve PromptKit and ConfigKit at real released versions. Keep disposable
|
|
|
|
|
|
files outside the tracked distribution.
|
|
|
|
|
|
5. If tidying a disposable module file, transfer legitimate requirements and sums
|
|
|
|
|
|
back without temporary replacements. Invent no sums for unpublished modules;
|
|
|
|
|
|
workspace selection is not evidence of an independently declared graph.
|
|
|
|
|
|
|
|
|
|
|
|
**Validation and handoff**
|
|
|
|
|
|
|
|
|
|
|
|
Run the existing ckprompt suite against the upgrade before adding capabilities.
|
|
|
|
|
|
List the isolated module graph to confirm PromptKit v0.14.0 and ConfigKit v0.7.1.
|
|
|
|
|
|
Record baseline failures, and repair genuine upgrade regressions. The composed
|
|
|
|
|
|
negative PromptKit diff test remains valid until Stage 3 enables the capability;
|
|
|
|
|
|
its replacement belongs to Stage 9.
|
|
|
|
|
|
|
|
|
|
|
|
For isolated test/list checks after preparing the disposable files, use
|
|
|
|
|
|
`GOWORK=off GOTOOLCHAIN=local`, `-modfile=<disposable module file>`, and
|
|
|
|
|
|
`-mod=readonly`. This proves local-source compatibility, not future tag
|
|
|
|
|
|
availability. The reviewed maintainer toolchain is Go 1.26.8; do not raise the
|
|
|
|
|
|
consumer minimum to that patch version.
|
|
|
|
|
|
|
2026-10-12 01:46:28 +00:00
|
|
|
|
**Completion evidence (2026-10-12)**
|
|
|
|
|
|
|
|
|
|
|
|
- Updated ckprompt to PromptKit v0.14.0. `go mod download -json` confirmed the
|
|
|
|
|
|
release tag resolves to the roadmap's pinned source commit
|
|
|
|
|
|
`143c6e9b3a675872117b0471e2ff8bcb25055a54`; Go tooling supplied the module
|
|
|
|
|
|
checksums. Go 1.26.0, ConfigKit v0.7.1, and the existing CommandKit module
|
|
|
|
|
|
requirements remain unchanged. No additional indirect requirements were
|
|
|
|
|
|
needed, and the ignored workspace remains unchanged.
|
|
|
|
|
|
- Workspace-off `go test ./...` passed for both ckprompt and ckconfig with
|
|
|
|
|
|
`GOWORK=off GOTOOLCHAIN=local`, `-mod=readonly`, temporary module/sum pairs,
|
|
|
|
|
|
and local replacements only for unpublished CommandKit prerequisites.
|
|
|
|
|
|
- `GOTOOLCHAIN=local go test ./...` passed in `integrations/ckprompt` with the
|
|
|
|
|
|
workspace. The isolated ckprompt graph selected PromptKit v0.14.0 and ConfigKit
|
|
|
|
|
|
v0.7.1; the isolated ckconfig graph selected ConfigKit v0.7.1 and contained no
|
|
|
|
|
|
PromptKit module. The existing composed negative diff test passed; there were
|
|
|
|
|
|
no baseline failures.
|
|
|
|
|
|
- Full repository and final assembled-state validation remain assigned to
|
|
|
|
|
|
Stage 12.
|
|
|
|
|
|
|
2026-10-12 01:40:15 +00:00
|
|
|
|
## Stage 2: Make engine diagnostics reusable for paired acquisition
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** private engine acquisition retains completed diagnostics and can
|
|
|
|
|
|
identify comparison sides without duplicating native loading logic.
|
|
|
|
|
|
|
|
|
|
|
|
**Starting points:** `loadPromptKitEngine` and `promptKitDiagnostics` in
|
|
|
|
|
|
`integrations/ckprompt/adapters.go`; acquisition and deferred-diagnostic tests
|
|
|
|
|
|
in `adapters_test.go`.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Refactor the private helper to support ordinary and comparison-side diagnostic
|
|
|
|
|
|
headings. Keep the existing ordinary scope heading; comparison headings
|
|
|
|
|
|
identify scope `promptkit` and left/right. A private heading parameter/helper
|
|
|
|
|
|
is sufficient; add no public diagnostic API.
|
|
|
|
|
|
2. Continue adapting `configkit.LoadError` sources and records while preserving
|
|
|
|
|
|
supported error identity. Retain the nil-engine operational failure and
|
|
|
|
|
|
ordinary configuration inspection facets.
|
|
|
|
|
|
3. After a successful engine load, obtain its captured configuration inspection
|
|
|
|
|
|
and adapt its diagnostics before honoring cancellation observed after the
|
|
|
|
|
|
load. The current helper returns too early and loses those diagnostics.
|
|
|
|
|
|
Return collected diagnostics with the cancellation error, without starting
|
|
|
|
|
|
a later side or delivering a report.
|
|
|
|
|
|
4. Retain deferred writers, severity conversion, and the metadata copies needed
|
|
|
|
|
|
by those writers. Each side's native source IDs must remain associated with
|
|
|
|
|
|
its own source legend.
|
|
|
|
|
|
5. Preserve ordinary public callbacks and successful reports. Reuse this helper
|
|
|
|
|
|
in following stages; do not promise interruption inside synchronous inspection
|
|
|
|
|
|
or transactional output.
|
|
|
|
|
|
|
|
|
|
|
|
**Validation and handoff**
|
|
|
|
|
|
|
|
|
|
|
|
Extend adapter tests with a loader that returns an engine with inspection
|
|
|
|
|
|
warnings and cancels before returning. Observe cancellation identity and retained
|
|
|
|
|
|
warnings. Check ordinary headings and deferred-writer error propagation. Create
|
|
|
|
|
|
native diagnostic fixtures through public APIs; do not import upstream internals
|
|
|
|
|
|
or assert exact cancellation polling counts.
|
|
|
|
|
|
|
2026-10-12 01:55:08 +00:00
|
|
|
|
**Completion evidence (2026-10-12)**
|
|
|
|
|
|
|
|
|
|
|
|
- Refactored the private engine loader to collect inspection diagnostics before
|
|
|
|
|
|
checking cancellation observed after a successful load. Diagnostic headings
|
|
|
|
|
|
retain the ordinary scope form and can identify a comparison side. ConfigKit
|
|
|
|
|
|
load diagnostics and the original load error remain available.
|
|
|
|
|
|
- Added adapter coverage for post-load cancellation, ConfigKit load-error identity
|
|
|
|
|
|
and diagnostics, ordinary and comparison-side headings, and deferred-writer
|
|
|
|
|
|
error propagation. `GOTOOLCHAIN=local go test ./...` passed in
|
|
|
|
|
|
`integrations/ckprompt`.
|
|
|
|
|
|
- PromptKit v0.14.0 provides no public warning callback in engine configuration,
|
|
|
|
|
|
and its native configuration path emits no warnings. Therefore a successful
|
|
|
|
|
|
engine with inspection warnings cannot be constructed through the public API;
|
|
|
|
|
|
native warning retention across cancellation remains unexercised. The ordering
|
|
|
|
|
|
change directly retains any diagnostics if a later PromptKit version supplies
|
|
|
|
|
|
them. The selected integration evidence is otherwise complete.
|
|
|
|
|
|
- Full repository and final assembled-state validation remain assigned to
|
|
|
|
|
|
Stage 12.
|
|
|
|
|
|
|
2026-10-12 01:40:15 +00:00
|
|
|
|
## Stage 3: Add the bundled PromptKit configuration pair provider
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** `ConfigScope` advertises Diff and supplies a native provider usable
|
|
|
|
|
|
by ckconfig's existing paired-input command and report path.
|
|
|
|
|
|
|
|
|
|
|
|
**Starting points:** `ConfigScope` in ckprompt's `adapters.go`, and public
|
|
|
|
|
|
`ckconfig.Scope`, `ComparisonRequest`, and the existing ConfigKit adapter.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Add `ckconfig.Diff` to the bundled operations and supply `Compare` with the
|
|
|
|
|
|
existing request/state signature, returning
|
|
|
|
|
|
`commandkit.Acquired[[]configkit.Difference]`.
|
|
|
|
|
|
2. Use already prepared left/right selections and inputs. Load left then right
|
|
|
|
|
|
with the same supplied `S`, obtain both `ConfigurationInspection` views through
|
|
|
|
|
|
Stage 2's helper, and call native `left.Diff(right)`.
|
|
|
|
|
|
3. Accumulate reached-side diagnostics in order. Keep left diagnostics if right
|
|
|
|
|
|
acquisition fails and both sides' diagnostics if comparison fails. Add scope,
|
|
|
|
|
|
side, or comparison context through supported error wrapping, preserving
|
|
|
|
|
|
`errors.Is`/`errors.As` behavior.
|
|
|
|
|
|
4. Check cancellation at operation boundaries before reaching the next loader
|
|
|
|
|
|
or comparison, retaining completed diagnostics. Equal selections do not skip
|
|
|
|
|
|
reached loader calls; application caches determine whether engines are reused.
|
|
|
|
|
|
5. Keep ordinary `Acquire` and facets. Retain nil-loader construction errors even
|
|
|
|
|
|
when operations are narrowed or cleared. Callers may still replace `Compare`
|
|
|
|
|
|
or narrow capabilities before declaration capture.
|
|
|
|
|
|
|
|
|
|
|
|
**Validation and handoff**
|
|
|
|
|
|
|
|
|
|
|
|
Use two fast real engines with different captured configurations, comparing the
|
|
|
|
|
|
adapter's native records with the upstream result. Cover equal selections reaching
|
|
|
|
|
|
both calls, correct side inputs/shared state, left failure stopping right,
|
|
|
|
|
|
right failure retaining left diagnostics, and cancellation retaining completed
|
|
|
|
|
|
side diagnostics. Exercise reachable native failures without adding a public
|
|
|
|
|
|
comparator injection hook solely for tests. Add no reconstructed configuration
|
|
|
|
|
|
model or duplicate ckprompt comparison renderer.
|
|
|
|
|
|
|
2026-10-12 02:01:10 +00:00
|
|
|
|
**Completion evidence (2026-10-12)**
|
|
|
|
|
|
|
|
|
|
|
|
- `ConfigScope` now declares `ckconfig.Diff` and supplies a pair callback that
|
|
|
|
|
|
loads left then right with each side's selection/input and the shared state,
|
|
|
|
|
|
collects diagnostics in order, checks cancellation at operation boundaries,
|
|
|
|
|
|
and returns PromptKit's native `ConfigurationInspection.Diff` records. Ordinary
|
|
|
|
|
|
acquisition and the retained nil-loader issue remain available.
|
|
|
|
|
|
- Added fast native-engine adapter coverage for the PromptKit result, equal
|
|
|
|
|
|
selections reaching both loader calls, side inputs/shared state, left failure
|
|
|
|
|
|
stopping right, right ConfigKit load diagnostics and error identity, and
|
|
|
|
|
|
cancellation stopping before right load. `GOTOOLCHAIN=local go test -count=1 .`
|
|
|
|
|
|
passed in `integrations/ckprompt`.
|
|
|
|
|
|
- PromptKit v0.14.0 exposes no public way to add successful inspection warnings,
|
|
|
|
|
|
and valid engine-derived inspection views do not expose a reachable native Diff
|
|
|
|
|
|
failure. Therefore successful left-side warning retention on right failure,
|
|
|
|
|
|
both-side warning retention on native failure, and a native Diff failure are
|
|
|
|
|
|
not exercisable without adding a test-only injection path. The implementation
|
|
|
|
|
|
accumulates reached diagnostics and preserves error causes; these limits remain
|
|
|
|
|
|
recorded alongside Stage 2's warning-retention limitation.
|
|
|
|
|
|
- Installed-command verification and the composed consumer's obsolete negative
|
|
|
|
|
|
comparison expectation remain for Stages 4 and 9 respectively.
|
|
|
|
|
|
|
2026-10-12 01:40:15 +00:00
|
|
|
|
## Stage 4: Verify comparison through installed config commands
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** the adapter works through public assembly, existing typed-input
|
|
|
|
|
|
preparation, and existing YAML report delivery.
|
|
|
|
|
|
|
|
|
|
|
|
**Starting points:** ckprompt external composition tests and ckconfig comparison
|
|
|
|
|
|
coverage. New integration behavior belongs in ckprompt; retain generic coverage
|
|
|
|
|
|
with its current owner.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Install `ckconfig.Command` with a real `ckprompt.ConfigScope` and an app
|
|
|
|
|
|
scope for default-scope evidence; invoke `config diff --scope promptkit`
|
|
|
|
|
|
through a public `commandkit.App`.
|
|
|
|
|
|
2. Demonstrate left/right selection, omitted right inheritance, and a supplied
|
|
|
|
|
|
empty override. Apply one original captured domain selector to both separately
|
|
|
|
|
|
prepared inputs, finish both checks before shared state, and observe received
|
|
|
|
|
|
loader values. Reuse generic ckconfig preparation tests for unrelated cases.
|
|
|
|
|
|
3. Decode the report using the existing additions/changes/deletions schema;
|
|
|
|
|
|
demonstrate meaningful native changes and successful comparisons with
|
|
|
|
|
|
differences. Bare diff still defaults to `app`, and comparison with scope
|
|
|
|
|
|
`all` remains unsupported.
|
|
|
|
|
|
4. Check help/discovery reflects a narrowed operation set and that help, version,
|
|
|
|
|
|
and scope discovery acquire no engines. Clearing Diff leaves other declared
|
|
|
|
|
|
scope operations usable.
|
|
|
|
|
|
5. Verify diagnostics/error identity through an installed failure path. Reuse
|
|
|
|
|
|
generic delivery-failure coverage unless the integration exposes a distinct
|
|
|
|
|
|
gap; do not copy the comparator, parser matrix, or renderer test suite.
|
|
|
|
|
|
|
|
|
|
|
|
**Validation and handoff**
|
|
|
|
|
|
|
|
|
|
|
|
Run focused ckprompt comparison tests. The composed example's obsolete negative
|
|
|
|
|
|
expectation is knowingly pending Stage 9; do not report the whole suite as passing
|
|
|
|
|
|
while it remains. Keep assertions on semantic reports and supported outcomes,
|
|
|
|
|
|
not exact diagnostic snapshots or private layout.
|
|
|
|
|
|
|
2026-10-12 02:07:28 +00:00
|
|
|
|
**Completion evidence (2026-10-12)**
|
|
|
|
|
|
|
|
|
|
|
|
- Added external-package integration coverage that installs `ckconfig.Command`
|
|
|
|
|
|
with the real `ckprompt.ConfigScope`, an app scope, and a public
|
|
|
|
|
|
`commandkit.App`. It compares two native PromptKit engines and decodes the
|
|
|
|
|
|
existing additions/changes/deletions YAML report, including a meaningful
|
|
|
|
|
|
change.
|
|
|
|
|
|
- Verified explicit left/right selection, omitted-right inheritance, and a
|
|
|
|
|
|
supplied empty right override. The same captured campaign selector reaches
|
|
|
|
|
|
separately prepared left/right inputs; both checks finish before shared state
|
|
|
|
|
|
creation, and the provider receives those inputs and state.
|
|
|
|
|
|
- Confirmed bare diff uses the app scope, scope `all` is rejected before engine
|
|
|
|
|
|
loading, installed ConfigKit failure preserves its `LoadError` identity and
|
|
|
|
|
|
left-side diagnostic heading, and help/version/scope discovery do not load an
|
|
|
|
|
|
engine. Narrowed discovery lists only enabled operations, and Show remains
|
|
|
|
|
|
usable after Diff is cleared.
|
|
|
|
|
|
- `GOTOOLCHAIN=local go test -count=1 .` passed in `integrations/ckprompt`.
|
|
|
|
|
|
The composed example's obsolete negative expectation remains assigned to
|
|
|
|
|
|
Stage 9; no full-module pass is claimed here.
|
|
|
|
|
|
|
2026-10-12 01:40:15 +00:00
|
|
|
|
## Stage 5: Add optional catalog providers to the public suite
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** either catalog can be supplied independently, and `FromEngine`
|
|
|
|
|
|
provides both using PromptKit's native APIs.
|
|
|
|
|
|
|
|
|
|
|
|
**Starting points:** `Suite` and `FromEngine` in
|
|
|
|
|
|
`integrations/ckprompt/adapters.go`.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Add the accepted fields to `Suite[I, S]` exactly as selected:
|
|
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
|
ListPrompts func(context.Context, ckconfig.Selection, I, S) (commandkit.Acquired[[]promptkit.PromptIdentity], error)
|
|
|
|
|
|
ListProfiles func(context.Context, ckconfig.Selection, I, S) (commandkit.Acquired[[]string], error)
|
2026-10-11 20:35:38 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-10-12 01:40:15 +00:00
|
|
|
|
2. Update declaration comments for catalogs and named inspection. Document
|
|
|
|
|
|
optional callbacks and retain existing input/state zero-value and check timing
|
|
|
|
|
|
contracts. Add no catalog request wrapper.
|
|
|
|
|
|
3. Extend `FromEngine` to supply both callbacks alongside its named-inspection
|
|
|
|
|
|
callbacks. Acquire only when reached, then call `Engine.ListPrompts(ctx)` or
|
|
|
|
|
|
`Engine.ListProfiles(ctx)` through the public API.
|
|
|
|
|
|
4. Return native identities/order with acquisition diagnostics and supported
|
|
|
|
|
|
error identity. Use Stage 2's ordinary-heading acquisition helper. Do not
|
|
|
|
|
|
derive catalogs from YAML or perform named inspection/readiness loops.
|
|
|
|
|
|
5. Keep nil-loader issues attached even when callers clear all four operations.
|
|
|
|
|
|
This stage changes providers; family assembly follows in Stage 7.
|
|
|
|
|
|
|
|
|
|
|
|
**Validation and handoff**
|
|
|
|
|
|
|
|
|
|
|
|
Use real engines and their public listing results as the native oracle. Cover
|
|
|
|
|
|
selection/input/state forwarding, load diagnostics/errors, and cancellation.
|
|
|
|
|
|
Retain named-inspection tests. Custom empty catalogs and presentation belong to
|
|
|
|
|
|
Stage 8; do not retest PromptKit's complete membership semantics.
|
|
|
|
|
|
|
2026-10-12 02:10:45 +00:00
|
|
|
|
**Completion evidence (2026-10-12)**
|
|
|
|
|
|
|
|
|
|
|
|
- Added the selected optional `ListPrompts` and `ListProfiles` callbacks to
|
|
|
|
|
|
`ckprompt.Suite` with the accepted signatures, and updated its declaration and
|
|
|
|
|
|
`FromEngine` documentation to cover catalogs alongside named inspection.
|
|
|
|
|
|
- `FromEngine` now loads an engine only when a catalog callback is reached,
|
|
|
|
|
|
delegates to PromptKit's native `ListPrompts` and `ListProfiles`, and returns
|
|
|
|
|
|
the native ordered results with acquisition diagnostics.
|
|
|
|
|
|
- Adapter tests compare both results with the same engine's public native
|
|
|
|
|
|
methods and cover context/selection/input/state forwarding, ConfigKit load
|
|
|
|
|
|
diagnostic and error identity retention, cancellation after loading, and a
|
|
|
|
|
|
nil-loader issue after all four callbacks are cleared. Existing named
|
|
|
|
|
|
inspection coverage remains in place.
|
|
|
|
|
|
- `GOTOOLCHAIN=local go test -count=1 .` passed in `integrations/ckprompt`.
|
|
|
|
|
|
Family assembly and catalog presentation remain assigned to Stages 7 and 8.
|
|
|
|
|
|
|
2026-10-12 01:40:15 +00:00
|
|
|
|
## Stage 6: Implement the catalog YAML representation
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** small private helpers encode the explicitly selected CLI schema.
|
|
|
|
|
|
|
|
|
|
|
|
**Starting points:** ckprompt's existing YAML/buffered report helpers in
|
|
|
|
|
|
`command.go`.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Define a private prompt catalog entry with explicit `yaml:"id"` and
|
|
|
|
|
|
`yaml:"version"` string fields, without `omitempty`, populated from native
|
|
|
|
|
|
`PromptIdentity` values. Upstream struct serialization does not define the
|
|
|
|
|
|
CLI schema.
|
|
|
|
|
|
2. Encode one bare entry sequence for prompts and a bare string sequence for
|
|
|
|
|
|
profiles. Preserve provider order and exact strings, including duplicates,
|
|
|
|
|
|
whitespace, and numeric-looking versions. Let the YAML encoder quote values.
|
|
|
|
|
|
3. Normalize both nil and allocated empty successful slices to an empty sequence
|
|
|
|
|
|
rendered as `[]`, not null. Named-inspection nil-pointer failure handling
|
|
|
|
|
|
does not apply to successful catalog slices.
|
|
|
|
|
|
4. Prepare the full encoded bytes before output; Stage 7 reuses existing delivery.
|
|
|
|
|
|
Add no public report type or generic resource serialization framework.
|
|
|
|
|
|
|
|
|
|
|
|
**Validation and handoff**
|
|
|
|
|
|
|
|
|
|
|
|
Review the mapping to the accepted schema. Add command-boundary schema evidence
|
|
|
|
|
|
in Stage 8 once helpers are wired. Test decoded types, fields, sequence order,
|
|
|
|
|
|
and empty inventories; incidental quoting style, private names, and indentation
|
|
|
|
|
|
are not new contracts.
|
|
|
|
|
|
|
2026-10-12 02:12:47 +00:00
|
|
|
|
**Completion evidence (2026-10-12)**
|
|
|
|
|
|
|
|
|
|
|
|
- Added private YAML encoders that map native prompt identities to entries with
|
|
|
|
|
|
explicit string `id` and `version` fields and encode profile IDs as a bare
|
|
|
|
|
|
string sequence. Both return fully prepared bytes using the existing YAML
|
|
|
|
|
|
encoder; nil and allocated empty catalogs normalize to empty sequences.
|
|
|
|
|
|
- Unit coverage decodes prompt entries and profile values to check field names,
|
|
|
|
|
|
string types, order, duplicates, whitespace, and numeric-looking values. Nil
|
|
|
|
|
|
and allocated empty inputs both encode as `[]`.
|
|
|
|
|
|
- `GOTOOLCHAIN=local go test -count=1 .` passed in `integrations/ckprompt`.
|
|
|
|
|
|
Command-boundary schema coverage remains assigned to Stage 8; command wiring
|
|
|
|
|
|
and delivery remain assigned to Stage 7.
|
|
|
|
|
|
|
2026-10-12 01:40:15 +00:00
|
|
|
|
## Stage 7: Assemble and execute independent catalog commands
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** catalog commands and optional named-show commands share existing
|
|
|
|
|
|
capture, input preparation, acquisition, and outcome mechanics.
|
|
|
|
|
|
|
|
|
|
|
|
**Starting points:** `Command`, `newDefinitionCommand`,
|
|
|
|
|
|
`prepareDefinitionInput`, and `runDefinitionInspection` in ckprompt;
|
|
|
|
|
|
`writePromptReport` and `definitionFailure`.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Return absence only when all four operation callbacks are nil. Retain attached
|
|
|
|
|
|
construction errors before skipping absence. Valid absence claims no namespace;
|
|
|
|
|
|
a nonempty family retains root-only installation/collision behavior.
|
|
|
|
|
|
2. Generate `show` only with supplied named-inspection operations and `list`
|
|
|
|
|
|
only with supplied catalog operations. Generate `list prompts` and
|
|
|
|
|
|
`list profiles` independently. Empty intermediate groups/help entries vanish.
|
|
|
|
|
|
3. Capture selector metadata and callback references when `Command` is called.
|
|
|
|
|
|
Use `CaptureFlags` and original handles for `ApplyTo`, not a second parser,
|
|
|
|
|
|
internal setters, or backend objects.
|
|
|
|
|
|
4. Catalogs accept presence-aware config/overlay selection and suite selectors,
|
|
|
|
|
|
no operands, version selector, or scope selector. Default `--format` to
|
|
|
|
|
|
`yaml`; accept only `yaml` here. Preserve named-show formats/defaults.
|
|
|
|
|
|
5. Check format before runtime acquisition. Reuse or straightforwardly generalize
|
|
|
|
|
|
private input preparation: create one suite `I`, apply captured converted
|
|
|
|
|
|
selectors once, then call `CheckInput(selection, input)`.
|
|
|
|
|
|
6. After checks, when reached, initialize one suite `S` and invoke only the
|
|
|
|
|
|
selected provider. Nil factories supply zero values including nil pointers.
|
|
|
|
|
|
Do not repair caller aliases or allocate arbitrary pointer types; preserve
|
|
|
|
|
|
core-owned parsed collection independence.
|
|
|
|
|
|
7. Retain diagnostics on provider, cancellation, encoding, and delivery errors;
|
|
|
|
|
|
check cancellation at existing operation boundaries. Successful nil/empty
|
|
|
|
|
|
catalogs use Stage 6's empty-sequence path.
|
|
|
|
|
|
8. Finish encoding before delivery; reuse `writePromptReport` for failures,
|
|
|
|
|
|
short writes, and incomplete-report fields. Preserve usage/operational
|
|
|
|
|
|
classifications and supported error identity. Caller effects remain theirs.
|
|
|
|
|
|
|
|
|
|
|
|
**Validation and handoff**
|
|
|
|
|
|
|
|
|
|
|
|
Compile and exercise custom prompts-only/profiles-only suites. Check a successful
|
|
|
|
|
|
catalog, invalid format stopping before factories, and catalog-only help omitting
|
|
|
|
|
|
`show`. Stage 8 completes evidence. No new core public API should be necessary.
|
|
|
|
|
|
|
2026-10-12 02:17:54 +00:00
|
|
|
|
**Completion evidence (2026-10-12)**
|
|
|
|
|
|
|
|
|
|
|
|
- `Command` now builds `show` and `list` independently, omits absent families,
|
|
|
|
|
|
retains construction issues when all four callbacks are cleared, and captures
|
|
|
|
|
|
the caller's selectors when the command is created. Catalog commands expose
|
|
|
|
|
|
config, overlay, selectors, and YAML format without named-show arguments.
|
|
|
|
|
|
- Catalog invocation checks format before suite input preparation, applies
|
|
|
|
|
|
captured selectors once, checks the prepared input, then creates one state and
|
|
|
|
|
|
calls only the selected provider. It retains diagnostics through provider and
|
|
|
|
|
|
cancellation failures, encodes before output, and reuses existing report
|
|
|
|
|
|
delivery behavior.
|
|
|
|
|
|
- Added focused command coverage for prompts-only and profiles-only help,
|
|
|
|
|
|
catalog-only omission of `show`, successful preparation and provider input,
|
|
|
|
|
|
and invalid-format preflight before suite factories/providers.
|
|
|
|
|
|
- `GOTOOLCHAIN=local go test -count=1 .` passed in `integrations/ckprompt`.
|
|
|
|
|
|
Complete lifecycle, YAML schema, cancellation, and delivery-failure coverage
|
|
|
|
|
|
remains assigned to Stage 8.
|
|
|
|
|
|
|
2026-10-12 01:40:15 +00:00
|
|
|
|
## Stage 8: Complete catalog invocation and presentation coverage
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** observable catalog contracts have focused coverage without freezing
|
|
|
|
|
|
private organization or repeating upstream suites.
|
|
|
|
|
|
|
|
|
|
|
|
**Starting points:** ckprompt `command_test.go`, external `composition_test.go`,
|
|
|
|
|
|
and existing fake writers/public declaration helpers.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Cover independent callbacks, catalog-only/show-only/mixed trees, and valid
|
|
|
|
|
|
absence. Extend installation coverage only for distinct new risks. Confirm
|
|
|
|
|
|
nil-loader errors remain after all four callbacks are cleared.
|
|
|
|
|
|
2. Observe construction, installation, help, and version invoking no suite
|
|
|
|
|
|
factories/providers. Help with supplied flags still performs normal conversion.
|
|
|
|
|
|
3. Cover one input/state per reached invocation, checks before state/provider,
|
|
|
|
|
|
failed preflight/check preventing acquisition, nil-factory zero values, and
|
|
|
|
|
|
original selector identity/presence. Include representative supplied
|
|
|
|
|
|
empty/false/zero and repeatable values, plus a second run without leaked values.
|
|
|
|
|
|
Assert received data and selected lifecycle events, not private storage.
|
|
|
|
|
|
4. Decode custom-provider reports: explicit prompt `id`/`version` strings,
|
|
|
|
|
|
profile strings, no envelope, exact values/order, and nil/allocated-empty
|
|
|
|
|
|
inventories. Include numeric-looking versions, YAML-sensitive identifiers,
|
|
|
|
|
|
and deliberately unsorted entries to detect command-side reordering.
|
|
|
|
|
|
5. Check default/explicit YAML, unsupported format, and unwanted operands.
|
|
|
|
|
|
Core parsing owns unknown version/scope flags; add no special rejection parser.
|
|
|
|
|
|
6. Cover provider errors with diagnostics, cancellation after a completed
|
|
|
|
|
|
provider preventing delivery, writer errors, and short writes. Observe supported
|
|
|
|
|
|
error identity, classification, diagnostics, and incomplete delivery fields.
|
|
|
|
|
|
Reuse existing diagnostic-writer coverage.
|
|
|
|
|
|
|
|
|
|
|
|
**Validation and handoff**
|
|
|
|
|
|
|
|
|
|
|
|
Run focused catalog and existing named-show tests through assembled public
|
|
|
|
|
|
commands. Native membership belongs to Stage 5. Add no provider network access,
|
|
|
|
|
|
benchmark thresholds, concurrency guarantees, or general fixture framework.
|
|
|
|
|
|
|
|
|
|
|
|
## Stage 9: Demonstrate capabilities in the composed consumer
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** the maintained example exercises both features through bundled
|
|
|
|
|
|
adapters, without duplicated application command infrastructure.
|
|
|
|
|
|
|
|
|
|
|
|
**Starting points:** `integrations/ckprompt/examples/composed/main.go`, tests,
|
|
|
|
|
|
fixtures, and README.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Keep `ConfigScope(loadPromptEngine)` and `FromEngine(loadPromptEngine)`;
|
|
|
|
|
|
their new defaults provide comparison and catalogs. Do not reproduce commands.
|
|
|
|
|
|
2. Demonstrate PromptKit-scope diff using the existing before/after fixtures and
|
|
|
|
|
|
campaign selection through the selection-aware application loader. Adjust a
|
|
|
|
|
|
small fixture only if needed for meaningful native evidence.
|
|
|
|
|
|
3. Replace `TestPromptKitScopeDoesNotSupportConfigurationDiff` with a positive
|
|
|
|
|
|
public invocation test decoding a meaningful YAML change. Retain app comparison
|
|
|
|
|
|
and cache tests distinguishing selection and supplied campaign identity.
|
|
|
|
|
|
4. Add both catalog invocations with campaign/config selection and native
|
|
|
|
|
|
identities. Check relevant entries without pinning the entire maintained
|
|
|
|
|
|
upstream inventory. No requirement inspection or readiness loop is added.
|
|
|
|
|
|
5. Update the example README with copyable diff/catalog/named-show commands.
|
|
|
|
|
|
Preserve session restore and scope-specific domain checks. Example cache
|
|
|
|
|
|
choices are recommendations/evidence, not policy for consuming applications.
|
|
|
|
|
|
|
|
|
|
|
|
**Validation and handoff**
|
|
|
|
|
|
|
|
|
|
|
|
Run example tests and the complete ckprompt suite. Existing ordinary scope
|
|
|
|
|
|
operations, named reports, app comparison, and the domain command must work with
|
|
|
|
|
|
the upgraded dependency.
|
|
|
|
|
|
|
|
|
|
|
|
## Stage 10: Reconcile canonical documentation and capability status
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** current documentation describes delivered behavior and separates
|
|
|
|
|
|
completed adoption from deferred requirement inspection.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Update ckprompt declarations/GoDoc and `doc.go` for providers, defaults,
|
|
|
|
|
|
narrowing, and preparation. Exact public contracts belong there. Review the
|
|
|
|
|
|
module/root READMEs for accurate orientation.
|
|
|
|
|
|
2. Update the [CLI reference](../cli.md) for both catalogs, selectors, YAML
|
|
|
|
|
|
default/schema, empty inventories, and PromptKit diff availability through
|
|
|
|
|
|
the existing comparison section. Keep named-show formats and comparison rules.
|
|
|
|
|
|
3. Update [consumer guidance](../consumers/guide.md),
|
|
|
|
|
|
[internal overview](../internal/overview.md), and development examples.
|
|
|
|
|
|
Explain all four `FromEngine` callbacks and `ConfigScope`'s Diff plus ordinary
|
|
|
|
|
|
operations. Show narrowing before capture; link maintained examples for full
|
|
|
|
|
|
code rather than adding another complete prose example.
|
|
|
|
|
|
4. Replace claims of absent PromptKit comparison/catalogs. Reconcile the completed
|
|
|
|
|
|
`configkit.md` summary and `deferred.md`; keep a standard `InspectRequirements`
|
|
|
|
|
|
command deferred without inventing syntax or adding it to validation/show.
|
|
|
|
|
|
5. Review architecture/ADRs for consistency; existing decisions authorize this
|
|
|
|
|
|
work. Do not revise durable records merely to duplicate fields/report details.
|
|
|
|
|
|
Report any actual authority conflict instead of strengthening policy silently.
|
|
|
|
|
|
6. Record the feature roadmap's delivered status, with final validation evidence
|
|
|
|
|
|
in Stage 12. Preserve previous implementation history links; do not restart
|
|
|
|
|
|
completed ConfigKit work.
|
|
|
|
|
|
|
|
|
|
|
|
**Validation and handoff**
|
|
|
|
|
|
|
|
|
|
|
|
Review diffs, links/fragments, examples, and stale statements; run documented
|
|
|
|
|
|
Markdown whitespace checks. Describe native semantics as upstream-owned. Do not
|
|
|
|
|
|
promise arbitrary catalog/provider data is safe for public disclosure.
|
|
|
|
|
|
|
|
|
|
|
|
## Stage 11: Reconcile notices and prepared release notes
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** distributed metadata/notices match actual graphs, and unpublished
|
|
|
|
|
|
integration notes describe delivered capabilities.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Reconcile final ckprompt requirements/sums with Stage 1's isolated procedure.
|
|
|
|
|
|
Review other manifests for accidental workspace-induced changes. No committed
|
|
|
|
|
|
local replacements or invented prerequisite sums.
|
|
|
|
|
|
2. Update `integrations/ckprompt/docs/oss/attribution.md` to PromptKit v0.14.0
|
|
|
|
|
|
with the roadmap's pinned source. Review upstream grant, license, notices, and
|
|
|
|
|
|
selected direct/transitive graph; change copied texts/entries where required.
|
|
|
|
|
|
3. Keep notice ownership module-local. Core notices describe its declared
|
|
|
|
|
|
ReleaseKit v0.4.0 tool; integration selection of v0.4.1 does not alter that
|
|
|
|
|
|
declaration. Preserve project grants and source-pinned links.
|
|
|
|
|
|
4. Confirm `integrations/ckprompt/docs/releases/v0.1.0.md` is still prepared and
|
|
|
|
|
|
unpublished before editing. Describe PromptKit v0.14.0, native engine-scope
|
|
|
|
|
|
diff, both catalogs, and optional selection. Remove its obsolete no-diff claim.
|
|
|
|
|
|
5. Follow independent versioning and the existing release procedure. Do not
|
|
|
|
|
|
mirror upstream versions, manufacture tags, or publish. Published notes remain
|
|
|
|
|
|
immutable: if release state changed, prepare the next appropriate unpublished
|
|
|
|
|
|
note rather than rewriting a published one.
|
|
|
|
|
|
|
|
|
|
|
|
**Validation and handoff**
|
|
|
|
|
|
|
|
|
|
|
|
Check graph/notice consistency, pinned links, required texts, and module-local
|
|
|
|
|
|
release/attribution URLs. Validate prose using existing procedures. No publication
|
|
|
|
|
|
exercise or new release gate is needed for this adoption sprint.
|
|
|
|
|
|
|
|
|
|
|
|
## Stage 12: Validate the complete end state and finish
|
|
|
|
|
|
|
|
|
|
|
|
**Outcome:** features work together, distribution boundaries remain intact, and
|
|
|
|
|
|
completion evidence matches checks actually performed.
|
|
|
|
|
|
|
|
|
|
|
|
**Steps**
|
|
|
|
|
|
|
|
|
|
|
|
1. Format changed Go files. With the ignored workspace, run `go test ./...` in
|
|
|
|
|
|
core, ckconfig, and ckprompt separately; root traversal misses nested modules.
|
|
|
|
|
|
Include maintained consumer tests in their owning module suites.
|
|
|
|
|
|
2. Run core tests with `GOWORK=off GOTOOLCHAIN=local` and `-mod=readonly`.
|
|
|
|
|
|
Run integration suites likewise with their disposable module/sum files and
|
|
|
|
|
|
only the unpublished CommandKit replacements from Stage 1. Use `go list -m all`
|
|
|
|
|
|
for each isolated selected graph and `go list -deps -test ./...` for imported
|
|
|
|
|
|
dependencies, with the same environment/module-file flags as its test run.
|
|
|
|
|
|
3. Confirm ckprompt selects PromptKit v0.14.0 and ConfigKit v0.7.1; ckconfig
|
|
|
|
|
|
selects ConfigKit without ckprompt/PromptKit. Core has no optional integration
|
|
|
|
|
|
or owning-library dependency through production, tests, examples, or tools.
|
|
|
|
|
|
Distinguish root and integration release-tool selections.
|
|
|
|
|
|
4. From the composed example directory exercise representative invocations:
|
2026-10-11 21:09:53 +00:00
|
|
|
|
|
|
|
|
|
|
```sh
|
2026-10-12 01:40:15 +00:00
|
|
|
|
go run . config diff --scope promptkit --config fixtures/before.yml --against-config fixtures/after.yml
|
|
|
|
|
|
go run . promptkit list prompts --campaign spring
|
|
|
|
|
|
go run . promptkit list profiles --campaign spring --format yaml
|
|
|
|
|
|
go run . promptkit show prompt briefing --campaign spring --format yaml
|
|
|
|
|
|
go run . session restore session-42 --campaign spring
|
2026-10-11 21:09:53 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-10-12 01:40:15 +00:00
|
|
|
|
Retain representative app diff and ordinary multi-scope inspection checks
|
|
|
|
|
|
from that example. Inspect YAML semantically; external services are unnecessary.
|
|
|
|
|
|
5. Audit every roadmap target against code, tests, docs, and notices. Resolve
|
|
|
|
|
|
implementation defects; report environmental limits honestly rather than
|
|
|
|
|
|
declaring unrun checks successful. If required validation remains blocked,
|
|
|
|
|
|
record it as pending rather than marking that check or the sprint complete.
|
|
|
|
|
|
6. Add final completion evidence here and in `promptkit.md`. Keep requirement
|
|
|
|
|
|
inspection deferred. Review documentation links/whitespace and final status,
|
|
|
|
|
|
then commit the completed nonempty unit.
|
|
|
|
|
|
|
|
|
|
|
|
**Completion criteria**
|
|
|
|
|
|
|
|
|
|
|
|
- Native captured PromptKit comparison uses ckconfig's existing paired preparation
|
|
|
|
|
|
and YAML delivery path, preserving reached diagnostics and error identity.
|
|
|
|
|
|
- Independent catalogs preserve native identities, render the accepted YAML, and
|
|
|
|
|
|
follow selected preparation, cancellation, diagnostic, and delivery behavior.
|
|
|
|
|
|
- Optional groups, absence, narrowing, and construction errors follow existing
|
|
|
|
|
|
installation contracts; named-show behavior remains available.
|
|
|
|
|
|
- Relevant module suites, consumers, and isolated graph/import checks pass;
|
|
|
|
|
|
any external validation limits are recorded as pending work.
|
|
|
|
|
|
- Metadata, notices, prepared notes, and canonical docs match implemented behavior.
|
|
|
|
|
|
No workspace files, local replacements, unrelated changes, or publication form
|
|
|
|
|
|
part of the sprint.
|
|
|
|
|
|
|
|
|
|
|
|
All product/API decisions needed for this plan are settled; no open questions
|
|
|
|
|
|
remain.
|