# Initial CommandKit feature roadmap Status: proposed implementation target; open decisions require review before the staged implementation plan is prepared. Date: 2026-10-07. ## Purpose and authority This document defines the proposed end state of the initial library: packages, features, integration contracts, dependencies, and completion evidence. It is prepared using [the agreed checklist](initial-plan.md). It does not sequence implementation tasks or describe existing Go code. CommandKit currently has no Go module or dispatcher implementation. The [architecture policy](../policy/architecture.md) and nine accepted ADRs control this proposal. Recommendations below fill in implementation choices; they do not become accepted architecture merely by appearing here. Exact exported contracts will belong in Go declarations and GoDoc; implemented operator contracts will belong in `docs/cli.md`. ### Requirements and traceability | Requirement | Authority | Feature targets | | --- | --- | --- | | Own dispatch; use explicit instance registries, composable groups, typed inputs, and capability-based standard families. Keep application domain behavior with applications. | [ADR 0001](../adr/0001-command-dispatch-and-inputs.md) | REG-01, INPUT-01, INV-01, INT-01 | | Use Cobra/pflag internally; initially rebuild backend state for each invocation. | [ADR 0002](../adr/0002-cobra-backend.md) | BACK-01, INPUT-01 | | Expose one root facade with root-owned public named types and no backend leakage. | [ADR 0003](../adr/0003-public-facade.md) | API-01, BACK-01 | | Supply standard help/version and available configuration/PromptKit inspection operations; families may support different subsets. | [ADR 0004](../adr/0004-standard-inspection-surface.md) | HELP-01, VER-01, CFG-01–05, PK-01–03; deferred DIFF-01, CAT-01 | | Return explicit classifications and recommended statuses; preserve supported cause identity and report delivery failures. | [ADR 0005](../adr/0005-invocation-outcomes.md) | OUT-01 | | Apply namespace/resource-first grammar, options after the complete command path, interspersed operands, presence, and selected repetition rules. | [ADR 0006](../adr/0006-command-grammar.md) | INPUT-01, HELP-01 | | Preserve native effective YAML; prepare all selected show views before writing; frame aggregate display as separate documents. | [ADR 0007](../adr/0007-native-yaml-reports.md) | CFG-03 | | Compare safe semantic snapshots with sensitivity union and explicit coverage gaps when comparison is enabled. | [ADR 0008](../adr/0008-semantic-configuration-diff.md) | deferred DIFF-01 | | Declare scope capabilities; default to `app`; preserve the meaning and coverage of `all`; order scopes consistently. | [ADR 0009](../adr/0009-configuration-scopes.md) | CFG-01–05, INT-01 | The [four earlier roadmaps](01-cli-plan.md), [dispatcher proposal](02-dispatch.md), [backend proposal](03-backend.md), and [facade proposal](04-facade.md) supply design evidence. Carry these controlling corrections into implementation: - Singleton flags use the last supplied occurrence, including mixed `--name value` and `--name=value` spellings. Repeatable flags accumulate in order. - Every configuration operation, including `validate`, defaults to `app`. - Straightforward private implementation may live in the root package. A forwarding-only facade and a separate internal engine are unnecessary targets. - Partial capabilities remain useful; neither scopes nor families need every verb. - Preparing every selected view before report output is a `config show` requirement. Other operations have their own output timing. - The older acquisition graph, shared-load mandates, selector inheritance rules, illustrative Go declarations, and exact report layouts remain proposals. ## Recommended initial delivery scope Deliver the dispatcher, public registration/binding API, identity/outcomes, and inspection operations supported by ConfigKit v0.5.0 and PromptKit v0.12.0. Applications can use CommandKit without registering either integration; the Go module still declares the dependencies used by its bundled helpers. | Family | Initial target | | --- | --- | | Identity and discovery | `help`, command/group help, `version`, explicit CommandKit version selection | | Configuration | `config scopes`, `validate`, `show`, `sources`, `explain`, including explicit aggregate validation/display | | PromptKit configuration | The `promptkit` configuration scope, independently of definition inspection | | PromptKit definitions | `promptkit show prompt`, and a documented projection for `promptkit show profile` subject to OD-3 | | Application commands | Typed custom leaf commands, nested groups, and groups with their own runnable handler | Recommend deferring catalog listing and semantic comparison until the owning libraries expose the required public contracts. These are accepted standard operations with deferred implementation, not rejected features. Their absence must appear accurately in help and capabilities. **OD-1** considers including upstream enhancements in the initial delivery instead. This scope provides meaningful configuration inspection immediately and avoids requiring an initial consumer migration to wait for every future capability. ## Target packages and dependencies Create two production packages. Keep comparison and inspection helpers as private root implementation when needed; the current target does not justify another production package or a public integration subpackage. | Package | Purpose and owned features | Inputs and outputs | Dependencies and extension points | | --- | --- | --- | --- | | Root `commandkit` | Sole public facade; registry, typed bindings, standard handlers, provider integration, reports, identity, and outcomes | Accepts metadata, typed command declarations, acquisition callbacks, context, arguments, and caller streams; returns registration errors and invocation outcomes | Standard library, public ConfigKit/PromptKit APIs, YAML encoder, and the internal adapter. Consumers extend through commands, groups, parsers, scopes, and supported provider callbacks. | | `internal/cobra` | Routing/parsing/help adapter; fresh backend state; conversion of backend-owned failures | Accepts neutral command/flag/operand metadata, binding callbacks, and invocation callbacks; returns neutral parse/help results and classified syntax failures | Cobra/pflag and standard library. Its bridge is internal and carries no Cobra/pflag objects back to the root. | Dependency direction is root → adapter → Cobra/pflag. The adapter does not import the root. Root command declarations are lowered into the adapter's small neutral bridge; closures bind freshly allocated typed inputs and invoke root/application handlers. The root translates bridge failures into its public outcomes. Reuse standard `context.Context`, `io.Writer`, and ordinary Go values at this boundary. Keep registry policy, capability checks, standard handlers, and reports in the root. Cobra supplies routing and parsing machinery; its defaults must be adapted where they differ from the accepted grammar. Do not copy its entire API into CommandKit or introduce a selectable backend abstraction. ### Module baseline Recommend the following reproducible starting baseline, rather than floating dependencies or sibling `replace` directives: | Item | Proposed baseline | Reason | | --- | --- | --- | | Module | `gitea.maximumdirect.net/eric/CommandKit` | Matches project identity and the existing library suite's module convention. | | Go | `1.25.5` | Matches PromptKit v0.12.0's declared minimum; ConfigKit v0.5.0 declares 1.25.0. | | ConfigKit | `v0.5.0` | Reviewed released inspection API. | | PromptKit | `v0.12.0` | Reviewed released configuration and named-definition inspection API. | | Cobra | `v1.10.1` | Concrete initial pin implementing the accepted backend decision. Its [module declaration](https://github.com/spf13/cobra/blob/v1.10.1/go.mod) requires pflag v1.0.9. | | pflag | `v1.0.9` | Match that Cobra baseline; its [module declaration](https://github.com/spf13/pflag/blob/v1.0.9/go.mod) fits the selected Go baseline. | | YAML encoder | `go.yaml.in/yaml/v4 v4.0.0-rc.6` | Match ConfigKit's existing dependency for CommandKit-owned YAML reports. Native configuration writers remain authoritative. | These pins are a proposal, not a claim that they are the newest releases. Resolve and review the actual module graph and license notices when adding dependencies. OD-1's expanded delivery alternative would require released upstream versions containing its new capabilities and a revised capability assessment. ## Public API and integration model ### API-01: public facade **Owner:** root. **Prerequisites:** registry and invocation contracts below. Expose an application handle with private state and a small deliberate method set. Recommend construction from application identity and registry options, registration methods for groups/standard suites, and invocation with context, arguments, and caller streams. Keep runtime dependencies in handler closures or a separate typed execution dependency parameter; they are not parsed CLI fields. Construction automatically installs help and version from identity/build metadata. Provider registration assembles the other standard families' supported operations. The target concepts are identity, application/registry handle, command/group declarations, typed bindings, presence, invocation environment, outcome, and scope registration. Public named CommandKit types live in the root. Public ConfigKit and PromptKit types are deliberate integration dependencies where useful. Exact names/signatures are settled through **OD-2** before the Luna plan. **Completion evidence:** an external consumer uses only the root facade to register and execute commands; public signatures, callbacks, fields, constraints, and method sets contain no backend/internal types. No public aliases, anonymous embedding, loosely typed bridge values, or returned backend errors defeat this boundary. Caller-supplied values/errors retain their documented treatment. ### REG-01: instance registry and command groups **Owner:** root. **Provider requirements:** none. **Depends on:** API-01. Use one metadata declaration for each command's path, description, operands, flags, bindings, and handler. Compose groups explicitly per application instance. Support nested custom commands and a group that has both children and a runnable handler. Groups without handlers show help when invoked bare. Reject duplicate command paths and replacement of standard handlers. Own the `config` namespace when installed and `promptkit` when installed: applications cannot insert private children underneath them. Additional application families remain registerable without needing the standard families' verb subsets. Build standard command availability from declared capabilities. Validate missing wiring at registration; never load files to discover operations. Return errors from registration rather than allowing registration order to choose a winner. **Completion evidence:** two separate instances have independent registries; collisions and reserved-family violations return clear errors; nested custom groups work; partial standard suites expose only their available operations. ### INPUT-01 and BACK-01: typed inputs and adapter behavior **Owners:** root for bindings/presence; adapter for backend mechanics. **Provider requirements:** none. **Depends on:** REG-01. Recommend generic command factories with explicit typed flag/operand setters and a typed handler. Allocate the input struct for each invocation. A presence wrapper such as `Supplied[T]` carries a value and whether it was supplied; omission differs from an explicitly supplied empty string, false, or zero. A repeatable binding collects ordered values. Support ordinary scalar conversions and caller-provided typed domain parsers without handler lookups by flag name. Metadata expresses required operands/flags, counts, and declared incompatible combinations. Parsing and declared input-shape failures are usage outcomes; application domain validation stays with the application handler. Do not infer additional incompatibilities from parser convenience. Apply ADR 0006's grammar through the adapter: standard long lowercase hyphenated flags, separated/equal string values, boolean presence or explicit boolean value, `--` termination, options after the full command path, and interspersed options and operands within that command. Help bypasses missing execution requirements; unknown help paths/flags still fail as usage errors. Initially rebuild the Cobra tree and binding state for each invocation. Repeated calls retain no prior values, slices, or presence bits. Caller closures keep their own lifecycle; this design does not establish concurrent dispatch support. **Completion evidence:** public invocations exercise the real adapter, explicit zero/false/empty values, omission, singleton last-wins, ordered repetition, interspersed operands, termination, and repeated executions with fresh inputs. Help routing must follow CommandKit's grammar even where Cobra differs. ### INV-01 and OUT-01: invocation, outcomes, and diagnostics **Owner:** root, with syntax adaptation in the adapter. **Provider requirements:** handlers/acquisition callbacks. **Depends on:** INPUT-01. Pass caller context to handlers and acquisition callbacks. CommandKit does not create the executable entry point, install signal handlers, or call `os.Exit`. Return explicit success, usage, operational, or application-domain classification, recommended status, and supported cause identity. Standard statuses are 0, 2, and 1 respectively for success, usage, and operational failure. Preserve an application handler's explicit domain classification and suggested status. Recommend making root invocation the single presenter of CommandKit diagnostics. Standard handlers return report/delivery information and safe diagnostic data; the adapter suppresses its own automatic error printing. Use public `configkit.WriteDiagnostics` for ConfigKit diagnostics and neutral presentation for syntax errors. Pair diagnostics with supplied source records where useful. Do not print an owning-library diagnostic twice through nested CommandKit paths. Return a delivery indication so callers can distinguish a diagnostic already presented from one whose write failed. Preserve both the operation cause and a delivery error when both occur; do not replace either with a backend error. Warnings alone allow success. Report or diagnostic writer errors are operational failures and can leave partial output. **OD-2** includes this public result shape. Callbacks control their own output. Consumer guidance should recommend returning diagnostics to the standard path and avoiding repeated presentation, without prescribing all downstream error handling. Upstream APIs determine how much underlying error identity survives; CommandKit cannot recover causes an upstream library deliberately withholds. **Completion evidence:** usage guidance appears on the diagnostic stream; reports appear on the report stream; warnings permit success; callback, cancellation, report-write, and diagnostic-write failures are classified correctly; public causes remain usable with `errors.Is`/`errors.As` where supported. ### INT-01: acquisition and provider contracts **Owner:** root. **Depends on:** registry, typed inputs, outcomes. Recommend a typed configuration-suite factory parameterized by an application-owned inspection-context input. It installs the standard input bindings once, plus explicit typed application selector bindings, and scope registrations with acquisition callbacks. A simple consumer uses an empty context type. A complex consumer supplies campaign or other domain selection as typed fields. Exact assembly is part of OD-2; do not require a universal untyped service container or handler access to parser objects. Each scope declares supported operations and obtains a captured view only on an invocation that needs it. Use small operation-specific interfaces/callbacks: native effective writer; source reader; safe explanation reader/writer; and validation callback. Reuse `configkit.SourceInfo`, `Diagnostic`, `Path`, and `Explanation` rather than creating parallel provenance types. A bundled generic ConfigKit helper connects a loader returning `*configkit.Result[T]`; a PromptKit helper connects engine acquisition and `ConfigurationInspection`. Missing an operation must not require dummy implementations of other interfaces. For a selected operation, acquire its scope once and retain that view through reporting. A bundled helper can reuse the same loaded result for diagnostics and the report. Aggregate show retains all selected views before writing. Other operations need no application-wide cache or dependency graph. When an engine depends on application configuration, the application acquisition callback composes that dependency. It may share results in an invocation-local closure. Document that pattern, without requiring one universal loading method, forbidding consumer effects, or promising that arbitrary callbacks never reload. Recommend sharing inspection and execution loading/resolution where practical. **Completion evidence:** metadata-only commands do not invoke acquisition; single-scope operations acquire only their target; aggregate show observes its preparation rule; simple and complex consumer examples require no parallel dispatcher, manual standard-command parser, or duplicated standard report logic. ## Standard command features All features below belong to the root; routing, flag conversion, and help mechanics use the adapter. Their common prerequisites are REG-01, INPUT-01, INV-01, and OUT-01. Provider requirements and additional dependencies are stated per feature. The following flags/report shapes are recommended implementation targets, subject to the open decisions below. ### HELP-01 and VER-01: help and identity - Help describes installed standard and custom commands using registry metadata. Root bare invocation, `help [COMMAND…]`, `--help`, and `-h` follow ADR 0006. - Recommend `version` and `version --scope commandkit`; default output is only application identity. Version subjects are separate from configuration scopes. - Application identity is supplied at construction. Recommend obtaining embedded CommandKit identity from Go build information, respecting module replacement metadata; use an explicit development/unknown label when a tag is unavailable. Do not invent a separate integer CLI version. Recommend a text default and optional `--format yaml` for version records. **Provider requirements:** identity metadata only. **Completion evidence:** help, version, and discovery work with missing/invalid configuration and never invoke acquisition callbacks. Default version excludes dependency inventory; explicit CommandKit selection identifies the embedded component accurately. ### CFG-01: scope metadata and selection `config scopes` lists identifiers and supported operations in order: `app`, `promptkit`, then additional identifiers alphabetically. Recommend text by default and `--format yaml` producing `scopes: [{name, operations}]`. All installed configuration operations use `--scope NAME`, defaulting to `app`. `validate` and `show` additionally accept `all`. Check requested coverage before acquisition. An unsupported scope/operation is usage failure with available choices; `all` never silently skips a scope. If `app` is absent, its default selection fails with useful choices rather than silently selecting another scope. **Provider requirements:** registration metadata only. **Completion evidence:** discovery matches installed handlers and partial capabilities; aggregate coverage errors occur before any acquisition; ordering and defaults match ADR 0009. ### CFG-02: validation `config validate` invokes the selected provider's configuration load/validation boundary. ConfigKit's bundled helper regards successful load and required owning validation as success. PromptKit's helper constructs/obtains a valid engine; it does not run a prompt or probe model availability. Application domain context validation, when needed for its inspection view, belongs in its callback. Recommend text by default and `--format yaml` with a `scopes` sequence of completed validation records (`name`, `valid`). For `all`, preflight capability coverage, then validate in scope order and report successful scopes as they complete; stop on the first operational failure. Diagnostics explain the failure and the outcome indicates incomplete completion. This timing is an initial proposal, distinct from show's accepted preparation rule; **OD-4** considers alternatives. **Provider requirements:** validation/acquisition callback and safe diagnostics. **Depends on:** INT-01, CFG-01. **Completion evidence:** default validates `app`; explicit `all` validates requested coverage; invalid configuration yields status 1; warnings alone do not fail; no model execution is triggered by bundled handlers. ### CFG-03: native effective display `config show` writes the selected scope's owning-library effective YAML. It must not marshal `Result.Config`, reinterpret defaults, remove nulls, or rebuild the native document from runtime structs. Recommend YAML as its sole initial format; accept `--format yaml` for explicitness. For `--scope all`, acquire and complete required owning validation of every view before writing any report bytes. Compose separate native documents in scope order, with YAML separators and scope-label comments. Recommend `---` followed by `# scope: NAME` before each document. Single-scope show writes native output without an added scope envelope. Preserve native content; framing must account for any native document marker without creating accidental empty documents. **Provider requirements:** native writer plus successful acquisition/validation. **Depends on:** INT-01, CFG-01. **Completion evidence:** single native output is preserved; aggregate YAML has one labeled document per selected scope in order; a later acquisition failure leaves no successful prefix; writer failure returns operational failure and may leave partial output. ### CFG-04: source inventory `config sources` exposes the selected captured view's public source records. Retain the owning source IDs, labels, paths, kinds, layers, underlay indices, and import locations where available; missing fields do not acquire invented values. Keep owning-library record order. Recommend readable text by default and `--format yaml` with `{scope, sources}` and explicit snake-case source fields. **Provider requirements:** public source reader and acquisition. **Depends on:** INT-01, CFG-01. **Completion evidence:** acquired and synthetic records remain identifiable; import references correlate with owning IDs; reporting does not reload files or confuse provenance with effective values. ### CFG-05: path explanation Recommend `config explain --path POINTER`, including an explicitly supplied empty pointer for the root. Use public `configkit.ParsePath`; malformed pointers are usage errors and unknown effective/historical paths are operational lookup failures. Do not treat a native writer's empty output as successful lookup. Text defaults to the owning `WriteExplanation` rendering. Recommend `--format yaml` with `{scope, path, effective, origin, history, secret_reference}`. Preserve `present`, `redacted`, and the owner's YAML fragment in each value snapshot; represent fragments as strings so absence/null/masked values remain unambiguous. Canonicalize paths through public `Path.String()`. Preserve owning provenance, reasons, dependencies, and reference names, not credential values. **Provider requirements:** safe public explanation and native text writer. **Depends on:** INT-01, CFG-01. **Completion evidence:** known current and removed historical paths work, root-pointer presence works, invalid/missing paths have distinct outcomes, and safe snapshots survive YAML report conversion. ### PK-01: PromptKit configuration integration The bundled helper acquires an engine through the application callback, then uses `Engine.InspectConfiguration()` and its public native writers, sources, diagnostics, and explanation methods. Register these capabilities under the `promptkit` scope. Registration of this scope neither requires nor implicitly installs definition inspection. **Provider requirements:** engine/configuration-inspection acquisition. **Depends on:** INT-01, CFG-01–05. **Completion evidence:** native PromptKit YAML and ConfigKit-compatible provenance are exposed through the standard family; aggregate show can combine it with `app` without translating either document. ### PK-02 and PK-03: named definition inspection Recommend these command inputs: ```text app promptkit show prompt ID [--version VERSION] [--format text|yaml] app promptkit show profile ID [--format text|yaml] ``` Both acquire the engine lazily and pass the invocation context to the public inspection method. Prompt-version omission follows PromptKit's own selection semantics. Missing named definitions are operational lookup failures. These operations do not render/execute prompts, resolve credential values, or generate model output through CommandKit's handlers; application acquisition retains its own behavior. Prompt reports include ID, selected version, opaque hash, declared default profile, input definitions in declaration order, and declared output contract. Use explicit YAML fields rather than depending on incidental Go struct serialization. An output-contract value of `json` is domain metadata, not a JSON report format. Profile reports include the named ID, backend-completed static target fields, credential environment-variable name, and direct-credential requirement. Recommend an initial documented projection excluding arbitrary `ExtraParams`, with an explicit report indication that those parameters are omitted. Do not present an omitted map as empty or claim this projection is a complete effective target. **OD-3** weighs this useful current-release subset against waiting for an owner-redacted complete result. **Provider requirements:** public `InspectPrompt`/`InspectProfile` respectively; each capability can be registered independently. **Depends on:** INT-01 and the chosen report projection. **Completion evidence:** text and YAML preserve selected public metadata; profile credentials are reported as requirements/references; unknown IDs and cancellation retain supported public error identity; help never constructs an engine. ## Selectors, reports, and ownership Recommend a shared standard selection input for acquisition-bearing inspection commands, carrying presence-aware `--config` and singleton `--overlay`. Application callbacks interpret their values using the owning loader. Omission delegates discovery/default selection; an explicitly empty overlay can represent the loader's no-overlay selection. The application supplies schema, filesystem/source construction, imports, and domain resolution. PromptKit integration does not assume its configuration is at the application root path; its callback maps selectors to its acquisition path. Register application context flags through typed bindings with declared scope applicability. For example, a Narratio campaign selection can matter to `app` inspection and to engine acquisition derived from that application view. Reject explicit selectors that do not apply to any selected scope with a usage diagnostic; for `all`, route each selector to the scopes that declare it. Metadata/help should state applicability. Validate declared selector combinations before acquisition; domain lookup/validation remains operational. **OD-4** reviews this proposed selection contract. Do not infer application-specific campaign or session policy. Recommend text defaults for CommandKit-owned summaries and YAML alternatives; `config show` is native YAML. CommandKit owns report schemas for summaries, source/explanation projections, and definition reports. Owning libraries own the native documents and safe values. Select schema fields deliberately and document them with implementation; no separate schema-version integer is proposed. | Responsibility | Owner | | --- | --- | | Command paths, shared grammar, standard handlers, metadata/help, selection preflight, report framing, outcomes | CommandKit | | Typed custom input mechanics and routing | CommandKit; custom domain meaning remains with the application | | Configuration composition, recorded resolution, provenance, sensitivity, native effective/explanation rendering | ConfigKit/PromptKit through supported public APIs | | Source discovery, application schema and domain validation/resolution, engine construction, runtime dependencies | Application callbacks | | Custom session/execution commands, effects, outputs, and domain results | Application | | Process context/signals, streams, final status mapping, process exit | Application entry point | Safe owning-library inspection is required for enabled standard operations. This does not promise that arbitrary configuration or prompt content is suitable for public disclosure, and CommandKit does not inspect arbitrary consumer error objects to enforce a broader confidentiality policy. ## Upstream capability evidence The following clean sibling revisions were reviewed on 2026-10-07. They are evidence snapshots, not build dependencies. | Repository | Reviewed revision | Released API baseline | | --- | --- | --- | | ConfigKit | `dc09959cca4e105f49ec316c6d4ba585bd2340bd` | v0.5.0 | | PromptKit | `4b8169da286917fde7875425bb32b799b12c6af3` | v0.12.0 | | Scriptorium | `723fee9c466789fd3b6cca5492bf2edf99f4136c` | Consumer evidence | | Notarius | `66fa5585c1190581e96ec42102ce745c3869ba6d` | Consumer evidence | | Narratio | `8afb49c01808c04bc73f782d1619e87c8c2cd312` | Consumer evidence | | Audita | `3b4933256eff84327b812e7ae12babf743bc04a6` | Consumer evidence | | Capability | ConfigKit v0.5.0 | PromptKit v0.12.0 | Delivery consequence | | --- | --- | --- | --- | | Validated acquisition | `Load`/recorded resolution with application definition | `NewEngine` and application acquisition | Include CFG-02; do not add a parallel validator. | | Native effective YAML | `Result[T].WriteEffective` | `ConfigurationInspection.WriteEffective` | Include CFG-03 and PK-01. | | Sources/diagnostics | Public result/load-error source and diagnostic records | Configuration-inspection sources/diagnostics | Include CFG-04 and OUT-01. | | Safe path explanation | `Explain`, `WriteExplanation`, public `Path` | Equivalent configuration-inspection methods | Include CFG-05. | | Named prompt metadata | Outside its resource domain | `Engine.InspectPrompt` and `PromptInspection` | Include PK-02. | | Named effective profile target | Outside its resource domain | `Engine.InspectProfile`; credential-reference fields are documented, but `ExtraParams` is arbitrary copied data | Include the OD-3 projection only after its contract is selected. | | Catalog enumeration | Outside its resource domain | No public prompt/profile enumeration API found | Defer CAT-01; recommend upstream captured catalog inspection. | | Safe full semantic comparison snapshot | No dedicated public structured tree plus full sensitivity/coverage contract found | No corresponding configuration snapshot API found | Defer DIFF-01; recommend upstream safe snapshot support. | Relevant public declarations are [ConfigKit inspection](../../../ConfigKit/inspection.go), [metadata](../../../ConfigKit/metadata.go), [PromptKit configuration inspection](../../../promptkit/configuration_inspection.go), [engine methods](../../../promptkit/engine.go), and [inspection types](../../../promptkit/types.go). ConfigKit's `HistoricalPaths`, `Explain`, and redacted YAML provide useful pieces; they do not expressly define the full comparison representation required by ADR 0008. Deriving a comparison contract from these pieces would require an explicit owning-library agreement and design, rather than assuming masks imply equality. ### Deferred capability targets - **DIFF-01:** acquire two independently resolved selections of one scope through public safe snapshots. Preserve absent/null/empty distinctions and scalar semantics, recursively compare mappings, compare ordered sequences atomically, apply sensitivity union, and report differences plus gaps in text/YAML. Completed comparisons succeed even with differences/gaps. Snapshot data must describe hidden paths and supported reasons without fetching secrets. Comparison selector syntax/inheritance must be decided when bringing this feature into delivery. - **CAT-01:** list captured prompt/version entries and named profiles through public owning catalog APIs; deterministic reports describe actual loaded definitions. Do not infer catalogs from configuration YAML or inspect sibling internals. - **Complete PK-03:** obtain a safe owner-defined profile projection, including provider parameters and their disclosure treatment, before expanding the initial report beyond its selected coverage. Do not create empty handlers, pretend capabilities, or unused public snapshot types for these deferred targets. Future upstream contracts should inform their representations. Future FeedKit-like families can supply appropriate operations without supporting comparison or configuration scopes. ## Reuse assessment and consumer fit Use the reviewed revisions above to evaluate extraction; no source is copied by this roadmap. Prefer existing public owning writers over porting their renderers. | Candidate | Useful behavior | Adaptation and boundary | | --- | --- | --- | | [Notarius configuration handlers](../../../notarius/internal/cli/configkit_commands.go): `runConfigEffective`, `runConfigExplain` | Load an application result and call native ConfigKit writers; canonical path parsing and lookup handling | Retain the acquisition-to-writer pattern. Replace application scopes, manual flag sets, output/status handling, and loader coupling with INT-01/CFG-03/05. The application keeps its loader and domain selection. | | Same file: `runConfigProfile`, `runConfigValidate` | Named profile inspection and application-specific validation examples | Evaluate inputs and callback needs. Their JSON report, private wrappers, and runtime/domain validation are not standard contracts. | | [Scriptorium inspection dispatch](../../../scriptorium/internal/adapter/cli/inspect.go): `inspectCommand` | Lazy engine acquisition and named inspection followed by formatting | Keep upstream method use. Replace private dispatch, `context.Background`, output-file behavior, old command paths, and integer-status plumbing with caller context, streams, and outcomes. | | [Scriptorium report projections](../../../scriptorium/internal/format/inspection.go): `FormatPromptInspection`, `FormatProfileInspection` | Explicit prompt/profile field projection and readable presentation | Prompt DTO fields are a useful starting inventory. Replace JSON output with YAML and select OD-3's profile coverage; its raw `ExtraParams` serialization must not become an assumed redacted report. | | [Narratio comparison](../../../narratio/internal/app/config_diff.go): `ConfigDiff`, `configDiffWithDependencies` and comparison helpers | Independent resolved selections, deterministic path records, and add/remove/change presentation | Evidence for future DIFF-01. Its application projection/digests, overlay-only operands, shared campaign policy, and absence of ADR 0008 sensitivity-gap semantics require redesign; no initial direct port is proposed. | Recommend implementing the small integration glue from these public contracts, using consumer code as behavioral evidence. If a substantive helper or fixture is actually copied/adapted, record its source commit, affected symbols/files, modifications, and required notices when it lands. Scriptorium and Notarius grants are GPL-3.0-or-later; CommandKit is LGPL-3.0-or-later. Common ownership does not by itself change those grants. Resolve applicable reuse rights or an author's deliberate licensing choice before any such copy under the [OSS policy](../policy/oss.md). No blanket source-port permission is inferred. Use secret-free synthetic fixtures reflecting existing consumer scenarios: defaults plus overlays and historical deletion, inherited profiles, explicit zero/false selectors, missing definitions, and a second scope that fails during aggregate show. Existing consumer cases can inform these fixtures; entire application schemas/workspaces need not be imported. Two maintained public examples should substantiate infrastructure reduction: 1. **Simple ConfigKit consumer:** register one application loader and its schema, use bundled scope wiring, then register a typed custom command. Standard help, parsing, validation, native show, sources, and explanation need no private CLI handlers or formatters. 2. **Complex consumer modeled on Narratio/Scriptorium:** register app and PromptKit scopes plus named definition inspection, with typed campaign/context selection; compose app → engine acquisition in consumer code; retain a custom `session restore` group/handler. Standard paths and report composition remain CommandKit-owned while campaign/session meaning stays with the application. Review the declaration and callback burden against the existing handlers. If these examples require the consumer to recreate dispatch, standard input parsing, or standard report projection, revisit the API before making the Luna plan. ## Explicit deferrals In addition to DIFF-01, CAT-01, and complete profile projection, defer JSON report output, shell completion, output-file management, backend selection, a plugin framework, general dependency injection, concurrent-dispatch guarantees, and implementation of additional library families. None is needed to prove the initial selected feature target. Application-owned commands remain extensible. Consumer migrations, release publication, and ReleaseKit integration are separate work. Initial implementation should be a usable module with maintained examples; source-release tooling is planned under the release policy when preparing a releasable candidate. Do not create placeholder publisher commands or a binary build matrix. ## Completion and implementation-plan handoff The initial target is complete when the included feature IDs have their stated observable behavior and evidence, and the selected open-decision outcomes are reflected consistently in the API and CLI contracts. Use proportionate deterministic, offline behavioral evidence under the [testing policy](../policy/testing.md): public consumer tests with the real adapter for grammar/presence/state, real local ConfigKit/PromptKit fixtures for inspection, and controlled acquisition/writer failures at those boundaries. Review the public type/dependency boundary directly; choose automation only where its distinct protection justifies maintenance. Do not retest complete upstream libraries or add blanket coverage, race, scanner, or platform gates. Maintain these substantive documents/artifacts as implementation lands: - GoDoc for exact exported contracts, ownership, errors, and lifecycle. - `docs/cli.md` for installed standard syntax, formats, scope coverage, and outcomes. - Consumer guidance and complete simple/complex examples; link to owning upstream configuration contracts instead of duplicating schemas. - `docs/internal/overview.md` describing the two implemented packages and their actual boundary. Add focused internal/integration documents only where useful. - Dependency/source attribution and applicable license/notice material in the change that incorporates it, under the OSS policy. - Contributor commands and orientation updates once the Go module and validation commands actually exist; preserve existing policy ownership. Before writing the staged Luna plan, review the proposed delivery scope and resolve OD-1–4. Translate included IDs into ordered tasks with prerequisites, precise API/CLI deliverables, and completion checks. Carry deferred IDs forward without scaffolding them. That subsequent plan should make the selected public contracts concrete enough that the implementation agent need not invent them. ## Open Decisions ### OD-1: current-release delivery or upstream expansion first? **Recommendation:** adopt the initial scope above against released ConfigKit v0.5.0/PromptKit v0.12.0; defer DIFF-01 and CAT-01. Most duplicated inspection infrastructure can be removed now. Capability-based assembly already accommodates later additions without requiring every family/scope to acquire those verbs. **Alternative:** include public safe snapshots and catalog inspection in upstream work before completing the initial CommandKit implementation. This delivers the broader standard suite together and avoids an interim subset. It expands the initial effort into multiple independently released libraries and requires their data contracts, versions, and comparison selection rules to be selected first. Choose it if comparison/catalog inspection are required for initial adoption. ### OD-2: exact typed registration and outcome API shape **Recommendation:** use an application handle, composable groups, generic command factories with explicit typed binding setters, and generic standard-suite helpers. Handlers receive typed inputs plus a separate invocation environment; return a root-owned outcome carrying classification, suggested status, cause, and delivery information. Reuse public upstream inspection records through small capabilities. This supports an ordinary input struct and avoids parallel consumer parsing. Go generic methods are unavailable, so generic entry points should be package functions/factories rather than methods with their own type parameters. **Alternative:** use typed descriptor/builders that collect bindings before a non-generic registration call. This can offer readable fluent assembly and stronger construction guidance, but adds builder surface and potentially more conversion machinery. Evaluate it against both consumer examples before choosing signatures. For failure delivery, recommend one outcome carrying both the operation cause and delivery failure, with a clear diagnostic-delivery indication. A viable alternative is `(Outcome, error)`, with the error reserved for invocation/delivery failures. That follows familiar Go conventions but needs a precise rule preventing the same failure from being ambiguously represented in both results. Resolve this alongside the constructor, binding helpers, captured-view assembly, and stream placement; neither signature is approved by this roadmap. ### OD-3: initial profile-report coverage **Recommendation:** ship a documented current-API projection of named profile identity, static effective target fields, and credential requirements/reference names. Explicitly report that arbitrary provider parameters are omitted. This exposes useful backend-completed inspection now while keeping the coverage honest. It does not impose a new upstream confidentiality guarantee or promise complete effective-profile output. **Alternative:** defer PK-03 until PromptKit provides an owner-redacted complete profile inspection representation with provider-parameter treatment. This yields one fuller report contract and keeps sensitivity decisions entirely upstream, but delays useful named-profile inspection and expands upstream prerequisites. Directly serializing all current `ExtraParams` does not establish safe inspection semantics and is not a substitute for choosing a disclosure contract. ### OD-4: standard selector and validation-report behavior **Recommendation:** use presence-aware `--config` and singleton `--overlay`, plus explicit typed context bindings with scope applicability. Use `--path` for configuration explanation and operands for named definitions. Validate coverage and declared input combinations before acquisition. For aggregate validation, report completed scopes in order and stop at the first operational failure. Use the proposed text/YAML schemas above. This is a small consistent initial operator surface; native show retains its separate preparation requirement. **Alternative:** expose distinct application/engine source flags and acquire all validation results before emitting one aggregate report. Separate selectors make independent source selection explicit and complete validation results are useful for tooling. They increase input vocabulary and need a defined aggregation/error model. Adopt these where actual consumers need independent roots or comprehensive validation in one invocation, rather than assuming every engine follows the app selection. A narrower variant retains shared selectors and only changes validation aggregation. Decide these report/selection details before publishing contracts.