Files
commandkit/docs/roadmap/remediation.md

141 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Shared reporting and PromptKit adoption remediation
Status: three open findings from review of `f83866e44a8a9066db52cbd2aa5cccde0d69a839`.
## Review basis and boundaries
The review covers the implementation since `105bb74`, against the final
[feature roadmap](https://forge.maximumdirect.net/base-layer/commandkit/src/commit/2f43f78f76439f5d11ef313cd379bec036543504/docs/roadmap/promptkit-v0.20.0.md)
and [implementation plan](https://forge.maximumdirect.net/base-layer/commandkit/src/commit/2f43f78f76439f5d11ef313cd379bec036543504/docs/roadmap/implementation.md),
now retired into Git history. The [architecture policy](../policy/architecture.md),
[CLI reference](../cli.md), and public GoDoc govern current boundaries.
Core supplies command mechanics, typed input composition, CLI JSON parsing,
shared report representation/rendering, and the existing invocation reporting
and outcome lifecycle. ckconfig supplies declared scopes, independent comparison
inputs, opt-in overrides, and configuration report content. ckprompt adapts
released PromptKit v0.20.0 resources, preparation, namespaces, requirements,
smoke evidence, and configuration inspection through those shared contracts.
Applications retain loading and execution; upstream libraries retain domain
semantics. Module requirements select released core and ckconfig v0.4.0,
ConfigKit v1.1.0, and PromptKit v0.20.0.
All three independent module suites and all three aligned workspace suites
passed with Go 1.27.0. Temporary external-consumer probes using local module
replacements reproduced the findings below. Those probes did not modify the
repository's source or tests. No additional strengthened invariant, prohibition,
or guarantee was identified; the findings concern incomplete report/evidence
adaptation, not a request for stronger domain validation or new guarantees.
## R1 — P2: Explain still uses a separate provider text renderer
**Location:** [explain.go](../../integrations/ckconfig/explain.go),
`runConfigExplanation`, particularly lines 160–169.
The handler prepares an explanationReport, but its text template is only a
`{{render .}}` thunk. That function calls the acquired provider's
WriteExplanation again and appends explicit/null lines. YAML/JSON serialize the
prepared report instead. This preserves the old parallel rendering path inside
a template instead of completing the shared handoff selected for the output
inventory and Stages 7/23. Formatting still depends on the provider after the
report content has been selected.
**Observed consequence:** an external provider returning a valid Explain result
and an error from WriteExplanation succeeds with `--format json` but fails with
status 1 under text/default formatting. The error comes from the separate
provider writer, not the selected report data. The maintained simple consumer
also demonstrates different selected evidence: JSON includes scope and metadata
history/previous-origin records, while text calls the native writer and appends
only current explicit/null metadata. Native text can introduce source labels
that are absent from the handed-off projection.
**Required change:** render text from the same acquired projection as the other
formats. Prepare a reusable ordinary template and project any selected source
labels or metadata needed by it before handoff. Stop invoking WriteExplanation
from the template. Keep upstream safe evidence and meaning; no second loading
or explanation algorithm, custom template language, or per-format report tree.
**Verification:** use an explanation provider whose Explain result is valid and
whose WriteExplanation records or rejects calls. Confirm the standard handler
uses its selected report value in text, YAML, and JSON without calling that
writer. Check selected scope, current/historical metadata, and available
provenance semantically across formats, plus ordinary presentation failures.
Do not freeze incidental text layout.
## R2 — P2: PromptKit configuration cancellation discards captured evidence
**Location:** [adapters.go](../../integrations/ckprompt/adapters.go),
loadPromptKitEngine lines 487–495 and ConfigScope.Acquire lines 276–287.
After the loader returns an engine, loadPromptKitEngine obtains a native
ConfigurationInspection. If the context is then canceled, it returns a zero
inspection together with the cancellation error. ConfigScope's error branch
only supplies structured facets for a ConfigKit LoadError, so the inspection's
already-captured source inventory and diagnostics are lost.
**Observed consequence:** a loader that returns a valid engine and cancels the
invocation before returning yields context.Canceled with Sources and Findings
both nil, even though direct InspectConfiguration on that engine supplies a
source inventory. The probe retained one native source before adaptation and
none afterward. Detailed validation therefore reports evidence as unavailable
instead of the available native state; source listing cannot report the acquired
inventory. This conflicts with OD-6's preservation of reached-scope evidence
when cancellation stops acquisition. The validation handler's post-cancellation
submission cannot recover data already discarded by its adapter.
**Required change:** retain an explicitly available native inspection through
the acquisition error path and expose its safe Sources/Findings to ConfigScope.
Keep cancellation as the operation failure, and keep effective configuration,
metadata, and ordinary resource/request work unavailable after the failed
acquisition. Preserve the distinction between unavailable and available-empty
evidence. Do not resume canceled acquisition or add a blanket reporting guard.
**Verification:** return an engine from a loader that cancels the context after
successful loading. Compare the adapter's retained sources/diagnostics with the
native inspection, and exercise source reporting and detailed aggregate
validation. Confirm context.Canceled identity, no unvisited-scope success, and
separate presentation failure. Existing ordinary inspection cancellation behavior
should continue to stop domain work.
## R3 — P2: A native ConfigKit result accompanying an error loses evidence
**Location:** [configkit_adapter.go](../../integrations/ckconfig/configkit_adapter.go),
FromConfigKit.Acquire lines 35–47.
The adapter now handles err before examining result. When an application loader
returns an acquired native Result plus a non-LoadError failure (for example, a
post-load application check), it returns an empty View and drops the result's
captured sources and diagnostics. The previous adapter inspected a nonnil result
before handling the error. Restricting effective/metadata availability after
failure should not also discard the safe evidence already supplied by a native
result.
**Observed consequence:** a loader returning a successfully loaded native result
with one source plus a sentinel application error preserves the error identity,
but Sources and Findings are nil. Consequently `config sources` says inventory
is unavailable and detailed validation cannot expose the available findings.
This falls short of the selected failed-acquisition evidence behavior without
requiring any additional loading or upstream inference.
**Required change:** when a nonnil native result accompanies such a failure,
retain its source/diagnostic evidence and associated ordinary messages while
returning the original error. Do not expose effective configuration or metadata
as successful acquisition facets. A matching ConfigKit LoadError should continue
to supply its authoritative failure snapshot without duplicating it with result
evidence. Nil result plus a generic error may legitimately have no evidence.
**Verification:** cover result-plus-application-error and result-plus-cancellation
with source reporting and detailed validation; compare retained facts with that
result's native inspection data. Preserve original causes, available-empty versus
unavailable findings, ordinary warnings, and separate presentation errors.
Retain a matched LoadError case to prevent duplicate inventories/diagnostics.
## Applying the fixes
Keep fixes and regression coverage at the CommandKit adaptation/reporting
boundaries under the [testing policy](../policy/testing.md). These findings do
not call for reimplementation or independent verification of upstream domain
algorithms. Follow the [release procedure](../release.md) and existing
immutability policy for any subsequent released dependency alignment; do not
rewrite published core or ckconfig v0.4.0 contents.