@thomasminh1995/depverdict 0.6.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +518 -0
  3. package/bin/depverdict.js +7 -0
  4. package/bin/upgradelens.js +7 -0
  5. package/docs/GR-01-Semantic-Grounding-Failure-Analysis.md +309 -0
  6. package/docs/GR-02-Versioned-Action-Evaluation-Criteria.md +187 -0
  7. package/docs/GR-03-Extractive-Contract-Safety-Experiment.md +242 -0
  8. package/docs/GR-04-Versioned-Production-Extractive-Contract.md +154 -0
  9. package/docs/IA-01-Repository-Usage-Discovery.md +122 -0
  10. package/docs/IA-02-Repository-Impact-Analysis.md +118 -0
  11. package/docs/IA-03-Repository-Impact-Evidence.md +160 -0
  12. package/docs/IA-04-CLI-Orchestration.md +235 -0
  13. package/docs/IA-05-Real-Provider-Validation.md +235 -0
  14. package/docs/IA-05-VinGrade-Validation.md +339 -0
  15. package/docs/MVP-01.md +48 -0
  16. package/docs/MVP-02-Architecture.md +536 -0
  17. package/docs/MVP-02-CLI-HTTP-Runtime.md +50 -0
  18. package/docs/MVP-02-HTTP-Lifecycle.md +37 -0
  19. package/docs/MVP-02-Knowledge-Manifest-Generation.md +75 -0
  20. package/docs/MVP-02-Knowledge-Manifest.md +279 -0
  21. package/docs/MVP-02-Knowledge-Research-Orchestration.md +62 -0
  22. package/docs/MVP-02-Knowledge-Store.md +87 -0
  23. package/docs/MVP-02-PyPI-Registry-Adapter.md +97 -0
  24. package/docs/MVP-02-Research-Planning.md +196 -0
  25. package/docs/MVP-02-Source-Provenance.md +81 -0
  26. package/docs/MVP-02-npm-Registry-Adapter.md +99 -0
  27. package/docs/RR-01-End-to-End-and-Real-Provider-Validation.md +393 -0
  28. package/docs/RR-01-RERUN-Extractive-Contract-Validation.md +566 -0
  29. package/docs/RR-02-Full-Product-Workflow-and-Developer-CLI-UX-Review.md +35 -0
  30. package/docs/RR02-FIX-01-Persistent-Qualification-Resolution.md +32 -0
  31. package/docs/RR02-FIX-02-Stage-aware-CLI-Progress-and-Heartbeat.md +28 -0
  32. package/docs/RR02-FIX-03-npm-Capture-Evidence-Exclusion.md +33 -0
  33. package/docs/RR02-FIX-03A-Complete-Package-Exclusion-and-Evidence-Commit.md +223 -0
  34. package/docs/RR02-FIX-04-Event-loop-safe-Heartbeat.md +393 -0
  35. package/docs/RR02-FIX-05-Materialize-Persisted-Qualification.md +207 -0
  36. package/docs/RR02-RERUN-CLI-Qualification-Progress-UX-and-Package-Validation.md +342 -0
  37. package/docs/VinGrade-MVP-02-Validation.md +480 -0
  38. package/docs/VinGrade-RC02-Live-Validation.md +273 -0
  39. package/docs/ai-capability-discovery.md +573 -0
  40. package/docs/ai-engineering-production-readiness.md +390 -0
  41. package/docs/ai-engineering-review.md +251 -0
  42. package/docs/ai-runtime-governance-discovery.md +754 -0
  43. package/docs/architecture-overview.md +78 -0
  44. package/docs/cli-progress.md +111 -0
  45. package/docs/decisions/diff-01-brand-distribution-identity.md +450 -0
  46. package/docs/decisions/diff-02-identity-compatibility-contract.md +274 -0
  47. package/docs/decisions/diff-03-repository-docs-community-migration.md +165 -0
  48. package/docs/decisions/diff-04-release-evidence-gap-acceptance.md +110 -0
  49. package/docs/discovery/mvp-05-ai-migration-planning-discovery.md +350 -0
  50. package/docs/gateway-runtime-discovery.md +614 -0
  51. package/docs/live-ai-validation.md +299 -0
  52. package/docs/migration-planning-qualification-resolution.md +99 -0
  53. package/docs/migrations/upgradelens-to-depverdict.md +97 -0
  54. package/docs/mp-r03-deterministic-upgrade-decision-architecture.md +135 -0
  55. package/docs/mp-r04-evidence-bounded-migration-handoff-architecture.md +116 -0
  56. package/docs/mp-r05-product-completion-and-decision-first-cli-architecture.md +162 -0
  57. package/docs/mvp-05-deterministic-context-runtime.md +127 -0
  58. package/docs/mvp-05-migration-checklist-contract.md +166 -0
  59. package/docs/mvp-05-migration-checklist-orchestration.md +105 -0
  60. package/docs/mvp-05-migration-evaluation-and-qualification.md +135 -0
  61. package/docs/mvp-05-provider-neutral-generator.md +79 -0
  62. package/docs/ollama-local-smoke-validation.md +156 -0
  63. package/docs/openai-compatible-runtime-discovery.md +789 -0
  64. package/docs/openrouter-one-dependency-validation.md +205 -0
  65. package/docs/oss-02-package-guard-hardening-architecture.md +131 -0
  66. package/docs/oss-04-public-ci-package-metadata-architecture.md +142 -0
  67. package/docs/package-content-policy.md +98 -0
  68. package/docs/releases/v0.5.0-technical-preview.md +114 -0
  69. package/docs/releases/v0.6.0-alpha.1-depverdict-preview.md +101 -0
  70. package/docs/reviews/diff-02-identity-contract-compatibility.md +413 -0
  71. package/docs/reviews/diff-03-repository-docs-community-migration.md +364 -0
  72. package/docs/reviews/diff-04-depverdict-distribution-identity-readiness-rereview.md +453 -0
  73. package/docs/reviews/diff-04-fix-post-rename-identity-release-remediation.md +310 -0
  74. package/docs/reviews/diff-05-final-preview-distribution-qualification.md +561 -0
  75. package/docs/reviews/mvp-05-final-product-value-workflow-rereview.md +471 -0
  76. package/docs/reviews/mvp-05-product-workflow-review.md +605 -0
  77. package/docs/reviews/oss-01-duplicate-artifact-investigation-cleanup.md +411 -0
  78. package/docs/reviews/oss-02-package-guard-hardening.md +303 -0
  79. package/docs/reviews/oss-03-community-scaffolding.md +378 -0
  80. package/docs/reviews/oss-04-public-ci-package-metadata.md +439 -0
  81. package/docs/reviews/oss-05-technical-preview-qualification.md +482 -0
  82. package/docs/reviews/upgradelens-vs-upgradedepdetective-source-comparison.md +355 -0
  83. package/docs/reviews/v0.5.0-pre-release-smoke.md +263 -0
  84. package/docs/reviews/v0.5.0-version-bump-release-verification.md +306 -0
  85. package/docs/runtime-contract-discovery.md +521 -0
  86. package/docs/structured-output-compatibility-report.md +100 -0
  87. package/docs/ts-fix-01-exact-duplicate-occurrence-target-selection-architecture.md +111 -0
  88. package/docs/version-analysis-architecture.md +827 -0
  89. package/eval/README.md +86 -0
  90. package/eval/datasets/generic/declared-constraint.json +59 -0
  91. package/eval/datasets/generic/evidence-conflict.json +73 -0
  92. package/eval/datasets/generic/major-breaking-release.json +66 -0
  93. package/eval/datasets/generic/missing-evidence.json +46 -0
  94. package/eval/datasets/generic/patch-release-low.json +59 -0
  95. package/eval/datasets/node/axios-patch-low.json +59 -0
  96. package/eval/datasets/node/react-major-breaking.json +66 -0
  97. package/eval/datasets/node/react-minor-compatibility.json +66 -0
  98. package/eval/datasets/python/fastapi-deprecation.json +66 -0
  99. package/eval/datasets/python/pydantic-major-breaking.json +66 -0
  100. package/eval/migration-planning/golden-dataset-v2.json +306 -0
  101. package/eval/migration-planning/golden-dataset.json +214 -0
  102. package/eval/schemas/expected-result.schema.json +88 -0
  103. package/eval/schemas/golden-case.schema.json +181 -0
  104. package/package.json +57 -0
  105. package/schemas/ai-scorecard.schema.json +132 -0
  106. package/schemas/benchmark-report.schema.json +189 -0
  107. package/schemas/benchmark.schema.json +55 -0
  108. package/schemas/capability-profile.schema.json +44 -0
  109. package/schemas/conformance-report.schema.json +150 -0
  110. package/schemas/deployment-profile.schema.json +64 -0
  111. package/schemas/evaluation-report.schema.json +158 -0
  112. package/schemas/knowledge-evidence-bundle.schema.json +150 -0
  113. package/schemas/knowledge-manifest.schema.json +548 -0
  114. package/schemas/metrics.schema.json +178 -0
  115. package/schemas/migration-checklist-extractive-candidate.schema.json +42 -0
  116. package/schemas/migration-checklist.schema.json +706 -0
  117. package/schemas/migration-evaluation-dataset-v2.schema.json +208 -0
  118. package/schemas/migration-evaluation-dataset.schema.json +204 -0
  119. package/schemas/migration-planning-qualification-record.schema.json +234 -0
  120. package/schemas/project-manifest.schema.json +308 -0
  121. package/schemas/qualification-record.schema.json +56 -0
  122. package/schemas/repository-impact-evidence.schema.json +232 -0
  123. package/schemas/repository-impact.schema.json +202 -0
  124. package/schemas/upgrade-decision.schema.json +273 -0
  125. package/schemas/usage-index.schema.json +179 -0
  126. package/schemas/version-analysis.schema.json +449 -0
  127. package/src/ai-runtime-debug.js +325 -0
  128. package/src/ai-runtime-error.js +42 -0
  129. package/src/ai-runtime.js +174 -0
  130. package/src/ai-scorecard.js +204 -0
  131. package/src/ai-version-analysis.js +484 -0
  132. package/src/artifact-root-compatibility.js +91 -0
  133. package/src/benchmark-report.js +111 -0
  134. package/src/benchmark-runner.js +191 -0
  135. package/src/canonical-json.js +69 -0
  136. package/src/cli.js +1299 -0
  137. package/src/conformance-report.js +158 -0
  138. package/src/conformance-runner.js +253 -0
  139. package/src/constants.js +73 -0
  140. package/src/cooperative-scheduler.js +79 -0
  141. package/src/dependencies.js +44 -0
  142. package/src/dependency-ai-context.js +625 -0
  143. package/src/detectors.js +253 -0
  144. package/src/discovery.js +234 -0
  145. package/src/ecosystem-version-adapter.js +294 -0
  146. package/src/environment-compatibility.js +77 -0
  147. package/src/evaluation-comparator.js +158 -0
  148. package/src/evaluation-report.js +76 -0
  149. package/src/evaluation-runner.js +248 -0
  150. package/src/evidence-source-adapter.js +472 -0
  151. package/src/files.js +89 -0
  152. package/src/governance-diagnostics.js +64 -0
  153. package/src/governance-loader.js +63 -0
  154. package/src/governance-metadata.js +346 -0
  155. package/src/governance-validator.js +360 -0
  156. package/src/http/bounded-fetch.js +278 -0
  157. package/src/http/cli-http-runtime.js +44 -0
  158. package/src/impact/input-loader.js +157 -0
  159. package/src/impact/matcher.js +40 -0
  160. package/src/impact/repository-impact.js +199 -0
  161. package/src/impact/runtime.js +24 -0
  162. package/src/impact/status.js +62 -0
  163. package/src/impact/writer.js +30 -0
  164. package/src/impact-evidence/input-loader.js +202 -0
  165. package/src/impact-evidence/repository-impact-evidence.js +234 -0
  166. package/src/impact-evidence/runtime.js +16 -0
  167. package/src/impact-evidence/writer.js +30 -0
  168. package/src/index.js +563 -0
  169. package/src/installed-version-baseline.js +196 -0
  170. package/src/knowledge-cache.js +324 -0
  171. package/src/knowledge-evidence-bundle.js +101 -0
  172. package/src/knowledge-evidence-producer.js +233 -0
  173. package/src/knowledge-manifest-builder.js +188 -0
  174. package/src/knowledge-manifest-writer.js +32 -0
  175. package/src/knowledge-manifest.js +255 -0
  176. package/src/knowledge-research.js +615 -0
  177. package/src/metrics-engine.js +205 -0
  178. package/src/migration-checklist/ai-candidate.js +320 -0
  179. package/src/migration-checklist/assembler.js +37 -0
  180. package/src/migration-checklist/context-runtime.js +828 -0
  181. package/src/migration-checklist/evaluation/action-criteria.js +244 -0
  182. package/src/migration-checklist/evaluation/comparator-v2.js +332 -0
  183. package/src/migration-checklist/evaluation/comparator.js +279 -0
  184. package/src/migration-checklist/evaluation/dataset-v2.js +227 -0
  185. package/src/migration-checklist/evaluation/dataset.js +336 -0
  186. package/src/migration-checklist/evaluation/extractive-fixtures-v2.js +148 -0
  187. package/src/migration-checklist/evaluation/metrics-v2.js +226 -0
  188. package/src/migration-checklist/evaluation/metrics.js +158 -0
  189. package/src/migration-checklist/evaluation/qualification-v2.js +321 -0
  190. package/src/migration-checklist/evaluation/qualification.js +239 -0
  191. package/src/migration-checklist/evaluation/runner-v2.js +294 -0
  192. package/src/migration-checklist/evaluation/runner.js +194 -0
  193. package/src/migration-checklist/evaluation/scorecard-v2.js +106 -0
  194. package/src/migration-checklist/evaluation/scorecard.js +86 -0
  195. package/src/migration-checklist/extractive-candidate.js +166 -0
  196. package/src/migration-checklist/extractive-prompt.js +62 -0
  197. package/src/migration-checklist/generator.js +702 -0
  198. package/src/migration-checklist/grounding-policy.js +117 -0
  199. package/src/migration-checklist/input-loader.js +613 -0
  200. package/src/migration-checklist/migration-checklist.js +635 -0
  201. package/src/migration-checklist/presentation.js +292 -0
  202. package/src/migration-checklist/progress.js +96 -0
  203. package/src/migration-checklist/prompt.js +83 -0
  204. package/src/migration-checklist/qualification-guard.js +462 -0
  205. package/src/migration-checklist/qualification-resolution.js +122 -0
  206. package/src/migration-checklist/qualification-store.js +225 -0
  207. package/src/migration-checklist/runtime.js +205 -0
  208. package/src/migration-checklist/verification.js +134 -0
  209. package/src/migration-checklist/writer.js +35 -0
  210. package/src/openai-compatible-provider.js +451 -0
  211. package/src/orchestration/failure-log.js +32 -0
  212. package/src/orchestration/pipeline.js +200 -0
  213. package/src/orchestration/progress-events.js +337 -0
  214. package/src/orchestration/progress-reporter.js +131 -0
  215. package/src/orchestration/text-writer.js +22 -0
  216. package/src/portable.js +13 -0
  217. package/src/product-completion.js +249 -0
  218. package/src/project-manifest-input.js +90 -0
  219. package/src/project-manifest.js +141 -0
  220. package/src/python-requirements.js +137 -0
  221. package/src/registry/npm-packument.js +256 -0
  222. package/src/registry/npm-registry-adapter.js +262 -0
  223. package/src/registry/pypi-project.js +300 -0
  224. package/src/registry/pypi-registry-adapter.js +235 -0
  225. package/src/registry/sanitize-registry-body.js +51 -0
  226. package/src/renderers/console.js +160 -0
  227. package/src/renderers/impact-presentation.js +278 -0
  228. package/src/renderers/markdown.js +172 -0
  229. package/src/research-plan.js +455 -0
  230. package/src/runtime-conformance.js +275 -0
  231. package/src/source-provenance.js +393 -0
  232. package/src/source-url.js +62 -0
  233. package/src/structured-output-schema.js +66 -0
  234. package/src/target-selector.js +306 -0
  235. package/src/upgrade-decision/input-loader.js +107 -0
  236. package/src/upgrade-decision/presentation.js +43 -0
  237. package/src/upgrade-decision/runtime.js +21 -0
  238. package/src/upgrade-decision/upgrade-decision.js +626 -0
  239. package/src/upgrade-decision/writer.js +30 -0
  240. package/src/usage/analyzer-registry.js +63 -0
  241. package/src/usage/coverage.js +116 -0
  242. package/src/usage/input-loader.js +139 -0
  243. package/src/usage/js/analyzer.js +240 -0
  244. package/src/usage/js/parser.js +21 -0
  245. package/src/usage/runtime.js +187 -0
  246. package/src/usage/scope.js +44 -0
  247. package/src/usage/source-files.js +50 -0
  248. package/src/usage/usage-index.js +217 -0
  249. package/src/usage/writer.js +31 -0
  250. package/src/version-analysis-loader.js +203 -0
  251. package/src/version-analysis-manifest.js +314 -0
  252. package/src/version-analysis-writer.js +30 -0
@@ -0,0 +1,471 @@
1
+ # UpgradeLens MVP-05 — Final Product Value & Workflow Re-review
2
+
3
+ ## 1. Executive Verdict
4
+
5
+ **`PARTIAL_MATCH`**
6
+
7
+ The remediation changes the supported workflow materially: UpgradeLens now
8
+ resolves installed baselines, distinguishes analyzer coverage from non-use,
9
+ persists a deterministic upgrade decision, projects product completion before
10
+ diagnostics, and can produce an evidence-bounded Coding Agent handoff for an
11
+ explicitly selected target.
12
+
13
+ | Decision | Result |
14
+ | --- | --- |
15
+ | Product workflow readiness | **Ready with known limitations** |
16
+ | CLI readiness | **Ready with one High selector limitation** |
17
+ | Coding Agent handoff readiness | **`PASS` / ready for review-gated planning** |
18
+ | Migration Checklist v2 | **Real-provider qualified, still experimental** |
19
+ | v0.5.0 release readiness | **`GO_WITH_KNOWN_LIMITATIONS`** for CLI/product core |
20
+
21
+ The workflow is not a registry-latest auto-upgrader, an autonomous Coding
22
+ Agent, or proof that a migration is safe. A discovered newer version becomes
23
+ `INVESTIGATE` unless another deterministic driver exists. An explicit
24
+ human-selected target can become `PLAN_UPGRADE`; every implementation action
25
+ still requires source inspection and approval.
26
+
27
+ The remaining release-relevant defect is fail-closed rather than unsafe:
28
+ duplicate occurrences that differ only by declared version can produce
29
+ identical retry selectors. This blocks selecting that exact occurrence but
30
+ does not silently fan out or select the first match.
31
+
32
+ ## 2. Environment and Scope
33
+
34
+ | Item | Value |
35
+ | --- | --- |
36
+ | Branch | `feat/mvp-05-evidence-migration-checklist` |
37
+ | Commit before review | `e1ff3b38f42bfb34bb052e03a11645b17b8b892f` |
38
+ | Package | `upgradelens@0.4.0` |
39
+ | Node.js / npm | `v26.0.0` / `11.12.1` |
40
+ | Platform | macOS arm64 |
41
+ | UpgradeLens target | Current dirty working tree, reviewed without overwriting existing changes |
42
+ | Representative repository | VinGrade clean archive at `25811ef997fcf45810105e89e4500688f28f7ba5` |
43
+ | Generic repositories | Isolated single-Node, scoped-package, ambiguity, and polyglot shapes |
44
+ | Provider / model / adapter | `openai-compatible` / `openai/gpt-5.5` / `openai-compatible` |
45
+ | Qualification | `QUALIFIED`, ID `sha256:4fa4954d6f254d94859bce17aec6209394d380e4635155a6f3ce23a7e9b70765` |
46
+ | Capture directory | `.upgradelens/review/mvp-05-final-rereview/` (git-ignored) |
47
+ | Capture manifest digest | `sha256:a507c9576bb8ee107d49e163899e05fe9c8aef863402fc3f4b8a363b66d06dad` |
48
+
49
+ The working tree already contained the completed MP-R01–MP-R05 remediation
50
+ and earlier review material. This review created only this report and ignored
51
+ captures. It did not change production source, schema, tests, fixtures,
52
+ target repositories, version, git history, or credentials.
53
+
54
+ All target executions used clean isolated snapshots and the clean-installed
55
+ tarball. Captures contain safe commands, exit status, stdout/stderr, duration,
56
+ completion/count metadata, and artifact inventory where applicable. Provider
57
+ request bodies and secrets were not retained.
58
+
59
+ One canonical-suite test was skipped because the sandbox could not expose the
60
+ local loopback listener needed by the online CLI keep-alive lifecycle test.
61
+ It is reported as skipped, not passed. No required workflow scenario was
62
+ blocked: cancellation was reproduced with exit 130, and a bounded real-provider
63
+ positive run completed.
64
+
65
+ ## 3. Baseline Comparison
66
+
67
+ | Area | Before remediation | Current result |
68
+ | --- | --- | --- |
69
+ | Executive verdict | `PARTIAL_MATCH` | `PARTIAL_MATCH`, now because of bounded residual gaps rather than missing core outcomes |
70
+ | Feature alignment | 5 MATCH / 6 PARTIAL / 4 NOT | **11 MATCH / 3 PARTIAL / 0 NOT / 1 OUT OF SCOPE** |
71
+ | Installed baseline | Lockfile not resolved | npm lockfile v1/v2/v3 exact version and workspace ownership are resolved; unavailable ecosystems fail closed |
72
+ | Python usage | Unsupported coverage could become unused/not impacted | `ANALYZER_UNAVAILABLE` produces coverage unavailable and never verified non-use |
73
+ | Upgrade decision | No clear keep/plan/investigate outcome | Policy 1.1.0 persists `KEEP_CURRENT`, `PLAN_UPGRADE`, `INVESTIGATE`, insufficient, and not-analyzed outcomes |
74
+ | Migration handoff | No implementation-usable handoff | Explicit positive target produced grounded action, affected source, validation commands, limitations, and approval boundary |
75
+ | Provider/output failure | Package-local failure could look fully successful | Retained failure projects `PARTIAL`, lists the failed occurrence and recovery, exits 2 |
76
+ | CLI hierarchy | Counts/artifacts before decision | Product completion and decisions lead; diagnostics/artifacts follow |
77
+ | Coding Agent | `NOT READY` | **`PASS`** without external re-research |
78
+ | Release | `NO_GO` | **`GO_WITH_KNOWN_LIMITATIONS`** for core; experimental handoff remains opt-in |
79
+
80
+ The current score is not based on schema-field presence alone. Each MATCH
81
+ below is supported by current source plus packaged runtime output or focused
82
+ runtime tests.
83
+
84
+ ## 4. Workflow Results
85
+
86
+ | Scenario | Completion | Decisions | Handoff | Exit | Verdict |
87
+ | --- | --- | --- | --- | ---: | --- |
88
+ | A. Default registry | `COMPLETED_WITH_REVIEW` | 1 `INVESTIGATE`; 0 plan | No fabricated action | 0 | MATCH |
89
+ | B. Explicit target, controlled public run | `COMPLETED_WITH_REVIEW` | 1 `PLAN_UPGRADE` / `USER_SELECTED_TARGET` | 1 actionable with review | 0 | MATCH |
90
+ | B. Explicit target, real provider | `COMPLETED_WITH_REVIEW` | 1 `PLAN_UPGRADE` | 2 grounded items, 1 location, verification available | 0 | MATCH |
91
+ | C. Scoped npm selector | Selector parsed `npm:@scope/package` without splitting on `@`; package absent | None | None | 1 | MATCH for scoped parsing/fail-closed behavior |
92
+ | D. Different-project ambiguity | Unqualified selector rejected; qualified project/manifest selectors pass focused tests | None | None | 1 when ambiguous | PARTIAL because same-manifest duplicates cannot be uniquely retried |
93
+ | E. Polyglot coverage | Unsupported Python coverage remains unavailable | No false unused/not-impacted decision | No fabricated action | 0 in empty-cache run | MATCH |
94
+ | F. Installed baseline | Exact lockfile baseline; same installed/target becomes keep | `KEEP_CURRENT` where equal | `NO_VERSION_CHANGE_REQUIRED` | Contract verified | MATCH |
95
+ | G. Provider/output partial | `PARTIAL` | 1 keep retained, 1 not analyzed | Failed occurrence and recovery retained | 2 | MATCH |
96
+ | H. Insufficient data | `INSUFFICIENT_DATA` | 1 insufficient, no recommendation | No action | 0 default / 2 strict | MATCH |
97
+ | I. Offline valid cache | `COMPLETED_WITH_REVIEW` | 1 investigate | No invented external claim | 0 | MATCH |
98
+ | I. Offline empty cache | `INSUFFICIENT_DATA` | No fabricated decision/action | No action | 0 default / 2 strict | MATCH |
99
+ | J. Cancellation | `CANCELLED` | Successful completion not published | None | 130 | MATCH |
100
+ | VinGrade current empty-cache public run | `INSUFFICIENT_DATA` | 47 `NOT_ANALYZED` | 47 `NOT_ANALYZED`, 0 action | 0 | MATCH |
101
+ | VinGrade persisted partial replay | `PARTIAL` | 9 keep, 8 investigate, 19 insufficient, 11 not analyzed | 0 action | 2 | MATCH for retained-failure projection |
102
+
103
+ The controlled generic captures invoke the public `runCli` path from the
104
+ clean-installed package while supplying bounded validated upstream stage
105
+ results; they are not represented as real-provider runs. Capture 015 is the
106
+ separate real-provider public positive run. VinGrade capture 018 replays the
107
+ representative persisted decision chain through the current public completion
108
+ boundary; it is not a fresh 47-occurrence provider run.
109
+
110
+ The VinGrade empty-cache run reconciled 2 projects and 47 occurrences. Exact
111
+ lockfile baselines included PDF.js `6.1.200`, React `19.2.7`, React DOM
112
+ `19.2.7`, and `remark-gfm` `4.0.1`. LangSmith/Python remained
113
+ `NOT_ANALYZED` with `ANALYZER_UNAVAILABLE`, not unused or verified
114
+ `NOT_IMPACTED`. Cached offline research resolved 45 fresh package sources,
115
+ left 1 unavailable, recorded 1 warning, and made 0 external calls.
116
+
117
+ The completion/exit matrix was exercised:
118
+
119
+ | Product outcome | Default | Strict |
120
+ | --- | ---: | ---: |
121
+ | `COMPLETED` | 0 | 0 |
122
+ | `COMPLETED_WITH_REVIEW` | 0 | 2 |
123
+ | `PARTIAL` | 2 | 2 |
124
+ | `INSUFFICIENT_DATA` | 0 | 2 |
125
+ | `FAILED` | 1 | 1 |
126
+ | `CANCELLED` | 130 | 130 |
127
+
128
+ Zero actions, all-keep outcomes, and trustworthy `INVESTIGATE` outcomes do not
129
+ fail by themselves. A provider/output/runtime failure has precedence over
130
+ successful counts. Strict mode only changes the process exit; it does not
131
+ rewrite persisted decisions.
132
+
133
+ ## 5. Three Product Questions
134
+
135
+ ### Should a dependency move to the evaluated target?
136
+
137
+ The answer is now explicit and conditional. A registry-discovered newer
138
+ version alone yields `INVESTIGATE`, not a recommendation. Equal installed and
139
+ target versions yield `KEEP_CURRENT`. In the positive workflow, the human
140
+ selected React `2.0.0` from installed `1.0.0`, so the deterministic decision
141
+ was `PLAN_UPGRADE` with driver `USER_SELECTED_TARGET`.
142
+
143
+ ### Why, and what is the repository-specific risk?
144
+
145
+ The selected target was considered because it was explicitly chosen and
146
+ target-scoped official evidence described a breaking `oldApi` to `newApi`
147
+ change. The repository evidence located the `oldApi` import/call in
148
+ `src/main.js`. The handoff retained `HIGH_RISK`, source coverage, official
149
+ provenance, and the limitation that extractive provenance does not prove
150
+ semantic applicability or runtime safety.
151
+
152
+ ### What handoff is available?
153
+
154
+ After human approval, inspect `src/main.js`, replace `oldApi` with `newApi`
155
+ before changing React to `2.0.0`, then run the project-derived
156
+ `npm run build` and `npm run test`. These commands are available but not
157
+ executed by UpgradeLens. The checklist explicitly lacks a recovery plan; a
158
+ Coding Agent must define rollback and improve behavioral test coverage before
159
+ implementation approval.
160
+
161
+ ## 6. Feature Alignment Matrix
162
+
163
+ | Feature | Verdict | Evidence | User impact | Release relevance |
164
+ | --- | --- | --- | --- | --- |
165
+ | Dependency Inventory | **MATCH** | Current discovery plus VinGrade capture: 2 projects/47 exact occurrences; lockfile versions remain separate from declarations | Teams know what is declared and installed per occurrence | Core ready |
166
+ | Upgrade Detection | **MATCH** | Default registry capture identifies a newer target but projects `INVESTIGATE` | Attention is visible without implying approval | Core ready |
167
+ | Upgrade Recommendation | **MATCH** | Policy 1.1.0 and captures produce keep/plan/investigate/insufficient/not-analyzed deterministically | Lead receives a direct decision | Core ready |
168
+ | Reason and Evidence | **MATCH** | Decision driver, reason, official evidence provenance, freshness, and limitations survive to artifacts/output | Reviewers can audit why a decision exists | Core ready |
169
+ | Repository Risk Assessment | **MATCH** | Positive Node affected area is retained; unsupported Python coverage is unavailable rather than non-use | Supported findings are useful; unsupported coverage is honest | Core ready |
170
+ | Dependency Classification | **PARTIAL_MATCH** | Direct dependency type/ecosystem/project are preserved, but framework/core/small/transitive planning classes are absent | Enough occurrence context for current planning, not richer portfolio grouping | Non-blocking |
171
+ | Prioritization | **OUT_OF_SCOPE_FOR_V0_5_0** | No rank, urgency score, or ordered multi-dependency queue | Teams order accepted work themselves | Future interface/product layer |
172
+ | Migration Handoff | **MATCH** | Real positive checklist contains installed→target, selected official action, affected source, project commands, limitations, and review gate | Coding Agent can start bounded planning | Experimental but usable |
173
+ | Human Review | **MATCH** | Explicit approval language and `ACTIONABLE_WITH_REVIEW`; no automatic source/dependency edit | Human remains the authorization boundary | Core invariant ready |
174
+ | Coding Agent Handoff | **MATCH** | Independent agent answered all requested questions from source + checklist only | No external docs/version/impact re-research was needed | Ready for planning |
175
+ | Model Transparency | **PARTIAL_MATCH** | CLI/resolver and qualification record expose exact provider/model/adapter/qualification ID, but the checklist JSON itself does not embed that runtime identity | Audit is possible with the qualification record, not from the standalone checklist | Keep experimental |
176
+ | Evidence Freshness | **MATCH** | Cached/fresh/unavailable source state is explicit; exact qualification binds prompt/candidate/runtime | Offline and provider claims are bounded in time and identity | Core ready |
177
+ | Offline Readiness | **MATCH** | Valid-cache and empty-cache captures made zero external calls and invented no latest/security/support claims | Private/offline use fails safely | Core ready |
178
+ | Continuous Tracking Readiness | **MATCH** | Stable occurrence/decision IDs, artifact digests, lineage, and deterministic replay tests | Runs can be compared and tampering rejected | Core ready |
179
+ | CLI-first Delivery | **PARTIAL_MATCH** | One packaged `analyze` command is decision-first and CI-friendly; duplicate same-manifest selector retries remain unusable | Main path is usable; one exact-selection shape is blocked | High known limitation |
180
+
181
+ **After: 11 MATCH / 3 PARTIAL_MATCH / 0 NOT_MATCH /
182
+ 1 OUT_OF_SCOPE_FOR_V0_5_0.**
183
+
184
+ ## 7. CLI UX Review
185
+
186
+ The packaged CLI now leads with `UpgradeLens product outcome`, then decisions,
187
+ handoff/next step, and only then diagnostics and artifact paths. Raw internal
188
+ reason codes are hidden from default presentation. This is a material
189
+ decision-first improvement over the previous counts-first output.
190
+
191
+ Default registry UX correctly says that availability is not a recommendation
192
+ and points to `--target`. Explicit target UX persists target origin and exposes
193
+ the recommendation driver. Invalid target and ambiguous selector errors fail
194
+ before provider work. Partial completion lists failed occurrences and a
195
+ specific recovery step. Strict mode is suitable for CI without changing
196
+ artifact semantics.
197
+
198
+ The exact captures are under
199
+ `.upgradelens/review/mvp-05-final-rereview/`:
200
+
201
+ - 001–002: packaged help/version.
202
+ - 003–004: default and explicit-target public workflows.
203
+ - 005–007: scoped, ambiguous, and invalid target selectors.
204
+ - 008–013: partial, insufficient, offline cached/empty, strict, cancellation.
205
+ - 014: clean-installed packaged CLI.
206
+ - 015: real-provider explicit positive.
207
+ - 016–018: VinGrade empty-cache, cached research, and partial replay.
208
+
209
+ The primary UX limitation is the High selector issue described in section 11.
210
+ The CLI fails closed, but its displayed candidates can be identical and
211
+ therefore cannot guide the user to a resolvable exact selector.
212
+
213
+ ## 8. Coding Agent Handoff
214
+
215
+ An independent Coding Agent received only:
216
+
217
+ - an isolated source snapshot containing `package.json` and `src/main.js`;
218
+ - the Migration Checklist v2 from the real-provider explicit-target workflow.
219
+
220
+ It received no network/web/MCP access, raw upstream UpgradeLens artifacts,
221
+ prior reports, or source modification authority.
222
+
223
+ **Verdict: `PASS`.** The Agent recovered React `1.0.0 → 2.0.0`, explained the
224
+ explicit-selection driver and official breaking evidence, identified
225
+ `oldApi → newApi`, located the import and call in `src/main.js`, and identified
226
+ the package declaration. It correctly treated `npm run build` and
227
+ `npm run test` as available but not run.
228
+
229
+ No external re-research was required. Source inspection was still required
230
+ before patch planning, which is the intended division of responsibility. The
231
+ Agent did not invent or perform source edits. It placed API-semantic checks,
232
+ lockfile generation, installation, validation execution, behavioral tests,
233
+ and rollback definition outside the supplied handoff.
234
+
235
+ The approval/recovery boundary remained clear: human approval is required;
236
+ the checklist does not authorize code changes, does not verify semantic
237
+ applicability, and provides no recovery plan. The isolated snapshot also did
238
+ not contain the referenced lockfile, so installed-baseline provenance could
239
+ be read from the checklist but not independently revalidated by the Agent.
240
+
241
+ ## 9. Offline and Model/Provider Review
242
+
243
+ With a valid offline cache, the workflow reused cached evidence, reported
244
+ freshness, made no external call, and produced a review outcome rather than
245
+ inventing a latest/security/support claim. With an empty cache, it abstained,
246
+ reported `INSUFFICIENT_DATA`, and gave an online refresh/explicit validated
247
+ target next step. VinGrade behaved the same way at representative scale.
248
+
249
+ The persisted real-provider qualification matched:
250
+
251
+ - provider/model/adapter:
252
+ `openai-compatible / openai/gpt-5.5 / openai-compatible`;
253
+ - qualification ID:
254
+ `sha256:4fa4954d6f254d94859bce17aec6209394d380e4635155a6f3ce23a7e9b70765`;
255
+ - prompt version `2`;
256
+ - candidate schema digest:
257
+ `sha256:6ac9e1477e206ab082ac38cdb263254c996ee4684e04c80af6b9a08ceae0375d`;
258
+ - verdict `QUALIFIED`.
259
+
260
+ The positive path was rerun against that exact real runtime. It made 2
261
+ requests, observed 0 hidden retries, had 0 retained failures, and completed in
262
+ 6.987 seconds. The result was `PLAN_UPGRADE` and
263
+ `ACTIONABLE_WITH_REVIEW`. No fake runtime is used to claim real qualification.
264
+
265
+ Qualification matching is exact across task/dataset/criteria/policy/prompt,
266
+ candidate schema, and runtime identity. A compatible model is not silently
267
+ treated as qualified. The deterministic v2 envelope is part of the bound
268
+ candidate/prompt scope rather than an untracked equivalence.
269
+
270
+ **Default-enablement decision: keep Migration Checklist v2 experimental.**
271
+ Real qualification removes the positive-path qualification blocker, but
272
+ semantic applicability remains unverified, recovery evidence is absent, and
273
+ runtime identity is not self-contained in the checklist artifact. These are
274
+ not blockers for the deterministic CLI/product core release.
275
+
276
+ ## 10. Completion Threshold Assessment
277
+
278
+ Product completion schema `1.0.0` implements a documented closed-state
279
+ projection. Precedence is:
280
+
281
+ 1. any retained version/provider/output/runtime or action-generation failure
282
+ → `PARTIAL`;
283
+ 2. an explicitly selected insufficient target, or strictly more than half of
284
+ all occurrences unanswered → `INSUFFICIENT_DATA`;
285
+ 3. a valid review-bearing result → `COMPLETED_WITH_REVIEW`;
286
+ 4. otherwise → `COMPLETED`.
287
+
288
+ The architecture document states the rule, and runtime tests cover the closed
289
+ statuses, default/strict exits, explicit-target insufficiency, and failure
290
+ precedence. The code uses an exact `unansweredCount * 2 > occurrenceCount`
291
+ comparison, so 50% is not a majority.
292
+
293
+ The policy still has a product discontinuity: 49% unanswered produces a
294
+ review/completed projection while 51% produces `INSUFFICIENT_DATA`, even when
295
+ the unanswered absolute count differs by only one. No direct 49%/50%/51%
296
+ boundary test was found. The semantics also scale mathematically but do not
297
+ express whether one critical unanswered dependency outweighs many answered
298
+ minor dependencies.
299
+
300
+ Selected explicit-target insufficiency correctly has precedence, so unrelated
301
+ unselected occurrences cannot hide it. Provider failure always overrides the
302
+ threshold. The current rule is deterministic and safe, but its user-facing
303
+ rationale and boundary coverage are Medium product/technical debt. It is not
304
+ a core release blocker because it changes the completion label and strict
305
+ exit, not the persisted dependency decisions.
306
+
307
+ ## 11. Defects and Gaps
308
+
309
+ ### Blocker
310
+
311
+ None found for the CLI/product core release.
312
+
313
+ ### High — Exact selector cannot disambiguate same-manifest duplicates
314
+
315
+ - **Reproduction:** Run an unqualified target selector where the same canonical
316
+ package appears twice in one project, manifest, and dependency type but with
317
+ different declared versions; VinGrade's duplicate
318
+ `pypi:langchain-openai` occurrence reproduces it.
319
+ - **Expected:** Stable candidate guidance contains a selector field that makes
320
+ each occurrence uniquely selectable.
321
+ - **Actual:** Occurrence identity includes declared version, but target-selector
322
+ grammar does not. The error prints two identical retry selectors, and either
323
+ retry remains ambiguous.
324
+ - **Product impact:** The public explicit-target path is unavailable for that
325
+ occurrence shape. It fails closed—there is no wrong first-match selection or
326
+ fan-out—but a user cannot proceed without changing the manifest or product.
327
+ - **Evidence:** Capture
328
+ `006-ambiguous-monorepo-selector/`, `src/target-selector.js`, and the
329
+ occurrence-identity tests.
330
+
331
+ ### Medium — Completion majority boundary lacks direct boundary coverage
332
+
333
+ - **Reproduction:** Project completion with 49%, 50%, then 51% unanswered
334
+ non-failed occurrences.
335
+ - **Expected:** A versioned, user-explainable boundary with direct tests for
336
+ behavior immediately around it.
337
+ - **Actual:** The rule is documented and deterministic, but focused tests cover
338
+ representative statuses rather than the 49/50/51 boundary.
339
+ - **Product impact:** A one-occurrence change can alter completion/strict-exit
340
+ semantics without changing any individual decision.
341
+ - **Evidence:** `src/product-completion.js`, MP-R05 architecture, and
342
+ `test/product-completion-cli.test.js`.
343
+
344
+ ### Medium — Checklist runtime identity is not self-contained
345
+
346
+ - **Reproduction:** Give a reviewer only the generated
347
+ `migration-checklist.json`.
348
+ - **Expected:** If model transparency is claimed for the standalone handoff,
349
+ it should identify or directly link its exact qualified runtime.
350
+ - **Actual:** The CLI resolver and separate persisted qualification record show
351
+ provider/model/adapter and qualification ID, but Checklist v2 contains
352
+ generator and input lineage, not runtime/qualification identity.
353
+ - **Product impact:** A standalone shared checklist cannot independently prove
354
+ which qualified runtime selected its action.
355
+ - **Evidence:** Real-provider checklist and capture 015 metadata.
356
+
357
+ ### Low — Verification availability can be over-read
358
+
359
+ - **Reproduction:** Read `verificationStatus: AVAILABLE` without the command
360
+ execution state.
361
+ - **Expected:** Users understand that project-derived commands exist but have
362
+ not been executed.
363
+ - **Actual:** The detailed handoff preserves the state, and the Coding Agent
364
+ interpreted it correctly; compact consumers could still over-read
365
+ “available” as “passed.”
366
+ - **Product impact:** Presentation risk only; no test success is fabricated.
367
+ - **Evidence:** Real-provider checklist and Coding Agent reassessment.
368
+
369
+ ### Future scope
370
+
371
+ Dependency portfolio classification, prioritization/ranking, dashboard/MCP/IDE
372
+ interfaces, autonomous patching, and automatic rollback are not implemented.
373
+ They are not required for the v0.5.0 CLI-first positioning.
374
+
375
+ ## 12. Over-engineering Assessment
376
+
377
+ Complexity that directly protects the product outcome should remain:
378
+
379
+ - exact occurrence identity and fail-closed selection;
380
+ - artifact lineage/digests and tamper rejection;
381
+ - ecosystem-scoped coverage and installed-baseline provenance;
382
+ - deterministic decision/completion precedence;
383
+ - provider qualification bound to runtime/prompt/candidate identity;
384
+ - extractive action selection, limitations, and human-review gates.
385
+
386
+ Complexity that should stay behind the default CLI:
387
+
388
+ - raw reason codes, schema/digest detail, qualification matching diagnostics,
389
+ stage-level counters, and provider envelope internals;
390
+ - governance/evaluation/benchmark machinery used to qualify an experimental
391
+ model path.
392
+
393
+ The default user normally needs the Markdown report, persisted Upgrade
394
+ Decision, and—only for an eligible selected target—the Migration Checklist.
395
+ Most raw chain artifacts are audit/debug inputs, not documents a planning
396
+ meeting should open.
397
+
398
+ The product still exposes many separately runnable stages, but the supported
399
+ `analyze` command hides that orchestration adequately. The largest
400
+ not-yet-demonstrated product layers are classification and prioritization;
401
+ they should remain future scope rather than trigger a rewrite. Dashboard,
402
+ MCP, and IDE surfaces are also future interfaces, not MVP requirements.
403
+
404
+ ## 13. Tests and Validation
405
+
406
+ | Validation | Result |
407
+ | --- | --- |
408
+ | Canonical `npm test` | **603 passed, 0 failed, 1 skipped; 604 total** |
409
+ | Canonical skip | Online CLI keep-alive lifecycle; local loopback listeners unavailable in sandbox |
410
+ | Focused MP-R01–MP-R05 | **82 passed, 0 failed, 0 skipped** |
411
+ | Invariant/tamper/determinism group | **188 passed, 0 failed, 0 skipped** |
412
+ | Package content guard | **Passed:** 225 files after adding this report, 0 capture evidence, 20 required assets |
413
+ | `git diff --check` | **Passed** |
414
+ | Actual `npm pack` | **Passed:** `upgradelens-0.4.0.tgz` |
415
+ | Clean install from tarball | **Passed** |
416
+ | Packaged `--version` / `--help` | **Passed** |
417
+ | Clean-installed public exports | **437** |
418
+ | Forbidden packaged names | **None:** no `.env`, `.upgradelens`, review capture, or qualification input |
419
+ | CLI captures | **18 entries**, sequential and manifest-validated |
420
+ | Cancellation | **Passed**, controlled exit 130 |
421
+ | Real-provider positive | **Passed:** 2 requests, 0 hidden retry, 0 failure, qualified runtime |
422
+
423
+ Focused coverage included supported lockfile/workspace resolution, unsupported
424
+ coverage fail-closed behavior, impact evidence, target selection, policy
425
+ 1.1.0, product completion/exit semantics, migration context/contract/eval v2,
426
+ extractive generation, orchestration, qualification, package governance,
427
+ tamper rejection, and deterministic replay.
428
+
429
+ Three generic repository shapes were covered: a single Node explicit-positive
430
+ workflow, supported/unsupported polyglot coverage, and monorepo/different-project
431
+ ambiguity with qualified selection. The additional VinGrade duplicate capture
432
+ exposed the same-manifest selector gap rather than masking it.
433
+
434
+ The canonical skip is not counted as a pass. There were no blocked required
435
+ workflow scenarios. VinGrade's partial chain was replayed from persisted
436
+ representative artifacts rather than funded and rerun through all 47 current
437
+ provider contexts; the current real-provider acceptance was instead bounded
438
+ to the explicit-positive qualified path.
439
+
440
+ ## 14. Release Recommendation
441
+
442
+ **`GO_WITH_KNOWN_LIMITATIONS`**
443
+
444
+ For the CLI/product core, the previous release blockers are resolved:
445
+ installed versions are trustworthy where supported, coverage limitations do
446
+ not become non-use, recommendation semantics are deterministic, partial
447
+ provider failure cannot masquerade as full success, and the CLI communicates
448
+ the product decision first. The High selector gap is narrow, reproducible, and
449
+ fail-closed; it should be documented and fixed promptly, but it does not
450
+ create a wrong recommendation or unauthorized migration.
451
+
452
+ For Migration Checklist v2 default enablement: **do not enable by default**.
453
+ Keep it opt-in and experimental. The exact real-provider path is now qualified
454
+ and its Coding Agent handoff passes, but semantic applicability, recovery
455
+ planning, and standalone runtime identity remain bounded limitations.
456
+
457
+ This recommendation does not authorize a version bump, merge, tag, push,
458
+ release, target-repository modification, or dependency migration.
459
+
460
+ ## 15. Next Tasks
461
+
462
+ 1. Extend target-selector grammar and stable candidate guidance with a field
463
+ that uniquely resolves same-project/same-manifest/same-type duplicates;
464
+ add the VinGrade-shaped regression.
465
+ 2. Add direct 49%/50%/51% completion-threshold tests and document the
466
+ user-facing rationale without changing the policy in this review.
467
+ 3. Make the experimental checklist self-identify or directly link its exact
468
+ qualification/runtime identity.
469
+ 4. Clarify compact verification UX as “commands available, not executed.”
470
+ 5. Keep default enablement gated until recovery semantics and semantic
471
+ applicability expectations have an explicit product decision.