Record reporting and evidence review findings
This commit is contained in:
140
docs/roadmap/remediation.md
Normal file
140
docs/roadmap/remediation.md
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
# 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.
|
||||||
Reference in New Issue
Block a user