Record requirement inspection review findings
This commit is contained in:
@@ -1,9 +1,133 @@
|
|||||||
# ReleaseKit Adoption Review Remediation
|
# Implementation Review Remediation
|
||||||
|
|
||||||
|
## Effective Requirement Inspection Review
|
||||||
|
|
||||||
|
Review baseline: `a051edd82d9d20cdc82dfebf25adb689dc58b01f`.
|
||||||
|
Scope: implementation commits after `a6e0ffe`, compared with the simplified
|
||||||
|
[feature roadmap](inspection.md) and [implementation plan](implementation.md).
|
||||||
|
The existing ReleaseKit documentation finding is retained below.
|
||||||
|
|
||||||
|
### Finding 1 — Report Lost Caller-Map Scope As Incomplete (P2)
|
||||||
|
|
||||||
|
Locations: [requirement walker](../../internal/prompt/requirements.go),
|
||||||
|
`visit`'s `WithNode` handling (lines 481–503), `visitCommand` (lines 675–690),
|
||||||
|
and `visitVariable` (lines 694–708).
|
||||||
|
|
||||||
|
The walker treats every `with` body as nonroot and suppresses an unresolved
|
||||||
|
condition issue unless a recognizable dependency was recorded in that body.
|
||||||
|
Unsupported local-map accesses are similarly discarded without an issue when
|
||||||
|
the dependency counter does not change. Losing the ability to recognize a
|
||||||
|
caller key can therefore be mistaken for proof that no key is referenced.
|
||||||
|
|
||||||
|
With `Vars: {"audience": "visible"}`, all six of these valid templates render
|
||||||
|
`visible`, but inspection reports `Complete: true`, no variables, and no issues:
|
||||||
|
|
||||||
|
```gotemplate
|
||||||
|
{{with .}}{{.audience}}{{end}}
|
||||||
|
{{with $}}{{.audience}}{{end}}
|
||||||
|
{{$alias := .}}{{with $alias}}{{.audience}}{{end}}
|
||||||
|
{{with .}}{{index . "audience"}}{{end}}
|
||||||
|
{{$alias := .}}{{index $alias "audience"}}
|
||||||
|
{{$alias := .}}{{$alias.audience}}
|
||||||
|
```
|
||||||
|
|
||||||
|
This is not merely accepted failure to enumerate a complex reference: the
|
||||||
|
result incorrectly claims complete discovery. Consumers can consequently
|
||||||
|
accept an incomplete variable inventory as exhaustive.
|
||||||
|
|
||||||
|
Remediation: distinguish known nonroot values from unknown scope. Preserve
|
||||||
|
straightforward root identity where already determinable, or report an
|
||||||
|
unsupported-scope limitation when a reachable access may hide caller keys.
|
||||||
|
Unrecognized access must not depend on successfully recording a named
|
||||||
|
dependency before it can mark discovery incomplete. Apply the existing unknown
|
||||||
|
caller-key effect handling to affected optional entries as needed. Do not add
|
||||||
|
alias-value propagation or general assignment interpretation; conservative
|
||||||
|
partial results satisfy the approved scope.
|
||||||
|
|
||||||
|
Verification: add focused package cases for root-map `with`, local-map field
|
||||||
|
access, and local-map `index`. A result may enumerate the known key correctly
|
||||||
|
or remain explicitly incomplete, but must not silently omit it from complete
|
||||||
|
discovery. Retain known-string dot isolation and inactive-path behavior.
|
||||||
|
|
||||||
|
### Finding 2 — Avoid Recursive Rescanning Of Unsupported Names (P2)
|
||||||
|
|
||||||
|
Location: [requirement walker](../../internal/prompt/requirements.go),
|
||||||
|
`evaluateInputName` (lines 231–244), through `evaluateValue`,
|
||||||
|
`evaluateCommand`, and `visitCommand`.
|
||||||
|
|
||||||
|
Unsupported name evaluation already scans the expression for recognizable
|
||||||
|
references. `evaluateInputName` then calls `visit` on that same subtree again.
|
||||||
|
When a computed name contains another `input` with an unsupported computed
|
||||||
|
name, both traversals recursively repeat the same fallback. Work grows
|
||||||
|
exponentially even though the source grows linearly.
|
||||||
|
|
||||||
|
An isolated diagnostic starts with `.selector` and repeatedly wraps it as
|
||||||
|
`input (printf "%s" (EXPRESSION))`. Observed visits to that single caller key
|
||||||
|
are 2, 4, 8, 64, and 1,024 at depths 1, 2, 3, 6, and 10 respectively. The
|
||||||
|
depth-10 source is only 233 bytes. Result deduplication masks the repeated work.
|
||||||
|
|
||||||
|
Remediation: collect recognizable references once when simple name evaluation
|
||||||
|
falls back to syntax enumeration. Use one conservative traversal rather than
|
||||||
|
recursively reevaluating the same unsupported subtree. Preserve classifications,
|
||||||
|
known references, and safe issues; more expression support, memoization
|
||||||
|
machinery, or new size/depth/work restrictions are unnecessary.
|
||||||
|
|
||||||
|
Verification: retain existing computed-name results and exercise a nested
|
||||||
|
unsupported expression. Use a small growth benchmark or equivalent focused
|
||||||
|
work check to guard against repeated recursive scans, without making exact
|
||||||
|
visit counts or a wall-clock threshold a public guarantee.
|
||||||
|
|
||||||
|
### Finding 3 — Qualify The Public Variable-Disclosure Statement (P3)
|
||||||
|
|
||||||
|
Location: [public request GoDoc](../../requirements.go), `Vars` (lines 22–24).
|
||||||
|
|
||||||
|
The comment says that supplied values are not returned in inspection.
|
||||||
|
However, `{{input .binding}}` with `Vars: {"binding": "transcript"}` intentionally
|
||||||
|
returns `transcript` as an input identifier. The approved roadmap explicitly
|
||||||
|
permits that necessary identifier disclosure while excluding unrelated values.
|
||||||
|
The current wording can be read as a stronger privacy guarantee than was
|
||||||
|
requested or implemented.
|
||||||
|
|
||||||
|
Remediation: state that caller values are not returned as values, while a
|
||||||
|
resolved input identifier can equal its supplying variable value. Put this
|
||||||
|
exception in the canonical GoDoc; preserve existing unrelated-value and
|
||||||
|
diagnostic disclosure protections. Do not redact legitimate binding names or
|
||||||
|
introduce a new confidentiality mechanism.
|
||||||
|
|
||||||
|
Verification: review GoDoc against a direct dynamic-name result and the existing
|
||||||
|
privacy contract test. A documentation-only correction does not need another
|
||||||
|
full-suite run.
|
||||||
|
|
||||||
|
### Review Evidence And Architecture
|
||||||
|
|
||||||
|
- The root facade owns exported values, request copying, result copying, and
|
||||||
|
error conversion. The use-case runner reuses captured prompt/profile
|
||||||
|
selection and retrieves the exact snapshot without readiness checks.
|
||||||
|
- Configuration captures effective input metadata presence at the final
|
||||||
|
ConfigKit handoff. Parsed templates are shared read-only; request analysis
|
||||||
|
and inventories remain operation-local in `internal/prompt`.
|
||||||
|
- Inspection avoids artifact/schema loading, credentials, provider calls,
|
||||||
|
admission, observations, and run IDs. Required declarations, inactive input
|
||||||
|
and variable inventories, exact names, session bypass, and independent
|
||||||
|
returned metadata are implemented and covered by focused tests.
|
||||||
|
- The existing full offline race suite passed:
|
||||||
|
`go test -race -vet=off -mod=readonly -count=1 ./...`.
|
||||||
|
`go vet -mod=readonly ./...` and `python3 scripts/check-examples.py` also passed.
|
||||||
|
Commands used
|
||||||
|
`GOTOOLCHAIN=local GOWORK=off GOPROXY=off GONOPROXY=none GOSUMDB=off`.
|
||||||
|
- Temporary Go overlay probes, outside the repository, reproduced Finding 1
|
||||||
|
against real template execution and quantified the repeated work in Finding 2.
|
||||||
|
No implementation or maintained test files were changed during review.
|
||||||
|
- No new template rejection, caller limit, input-format constraint, readiness
|
||||||
|
requirement, or ConfigKit-boundary expansion was found in these commits.
|
||||||
|
Finding 3 identifies the one overstated documentation guarantee.
|
||||||
|
|
||||||
|
## Earlier ReleaseKit Adoption Review
|
||||||
|
|
||||||
Review baseline: `d5f3464`. The release implementation matches the selected
|
Review baseline: `d5f3464`. The release implementation matches the selected
|
||||||
architecture; no runtime defect or additional release gate was identified.
|
architecture; no runtime defect or additional release gate was identified.
|
||||||
|
|
||||||
## Finding 1 — Complete Documentation Alignment (P3)
|
### Finding 1 — Complete Documentation Alignment (P3)
|
||||||
|
|
||||||
Two descriptions were left behind during the cutover:
|
Two descriptions were left behind during the cutover:
|
||||||
|
|
||||||
@@ -26,7 +150,7 @@ profile and runbook, and check changed local links. The disposable fixture
|
|||||||
already demonstrates acceptance of a note without fixed section headings;
|
already demonstrates acceptance of a note without fixed section headings;
|
||||||
these prose corrections do not require repeating the complete Go suite.
|
these prose corrections do not require repeating the complete Go suite.
|
||||||
|
|
||||||
## Review Evidence
|
### Review Evidence
|
||||||
|
|
||||||
- `python3 scripts/test-release.py` passed: successful annotated publication,
|
- `python3 scripts/test-release.py` passed: successful annotated publication,
|
||||||
one race-enabled suite and additional check, same-Go tool build, unchanged
|
one race-enabled suite and additional check, same-Go tool build, unchanged
|
||||||
|
|||||||
Reference in New Issue
Block a user