@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,160 @@
1
+ # IA-03 — Repository Impact Evidence Generation
2
+
3
+ ## 1. Scope and architecture review
4
+
5
+ IA-03 là một artifact-to-artifact stage giải thích mọi kết luận trong Repository Impact bằng dữ liệu đã tồn tại. Stage này không scan repository, không parse source, không gọi AI/internet, không tính severity/confidence và không sinh migration plan.
6
+
7
+ Input trust chain:
8
+
9
+ ```text
10
+ Project Manifest
11
+
12
+ Version Analysis
13
+
14
+ Usage Index
15
+
16
+ Repository Impact
17
+
18
+ Repository Impact Evidence
19
+ ```
20
+
21
+ Contract hiện tại đủ để tạo evidence ở cấp dependency/symbol/file:
22
+
23
+ - Version Analysis có stable analysis result ID, breaking finding ID và original summary.
24
+ - Usage Index có `projectId`, `packageId`, symbol và repository-relative files.
25
+ - Repository Impact có exact matched symbols/files và giữ cả impacted lẫn non-impacted breaking findings.
26
+
27
+ Technical debt/contract gaps:
28
+
29
+ 1. Usage Index `1.0.0` chưa có usage/import kind. Evidence chỉ chứa `{file}`; không tạo `kind` giả.
30
+ 2. Usage Index chưa có line, column, snippet, function, call count hoặc member-level usage. Evidence schema không có các field này.
31
+ 3. Version Analysis chưa có structured affected API paths. IA-02 exact matcher đã xử lý free-text summary; IA-03 không tìm hoặc suy luận match mới.
32
+ 4. Repository Impact finding dùng cùng finding ID với Version Analysis và chưa có evidence-record ID riêng. IA-03 tạo stable SHA-256 ID từ `{analysisResultId, findingId}`, đồng thời giữ nguyên hai source references để trace ngược.
33
+ 5. Evidence reason contract hiện hỗ trợ `exact-symbol@1.0.0`. Matcher khác phải có evidence policy/version riêng thay vì bị gắn nhãn exact sai.
34
+
35
+ Các gap trên không chặn IA-03 và không được giải quyết bằng cách sửa artifact cũ.
36
+
37
+ ## 2. Runtime flow
38
+
39
+ ```text
40
+ project-manifest.json --------\
41
+ version-analysis.json ---------+--> schema + invariant + exact-byte lineage
42
+ usage-index.json --------------+--> dependency/finding/symbol/file references
43
+ repository-impact.json -------/ |
44
+ v
45
+ deterministic reason selection
46
+ |
47
+ v
48
+ evidence model + stable evidence IDs
49
+ |
50
+ v
51
+ .upgradelens/repository-impact-evidence.json
52
+ ```
53
+
54
+ Không có repository path hoặc source scanner/parser trong runtime IA-03.
55
+
56
+ ## 3. Module structure
57
+
58
+ ```text
59
+ src/impact-evidence/
60
+ input-loader.js four-artifact trust boundary
61
+ repository-impact-evidence.js generator, model, summary, invariants
62
+ runtime.js pure orchestration
63
+ writer.js validated atomic writer
64
+
65
+ schemas/
66
+ repository-impact-evidence.schema.json
67
+ ```
68
+
69
+ Infrastructure được tái sử dụng theo chuỗi: IA-03 loader gọi IA-02 loader; IA-02 loader gọi IA-01 loader. Mỗi stage chỉ bổ sung validation cho artifact mới của nó.
70
+
71
+ ## 4. Artifact contract
72
+
73
+ Artifact mặc định: `.upgradelens/repository-impact-evidence.json`.
74
+
75
+ Schema version: `1.0.0`.
76
+
77
+ ```json
78
+ {
79
+ "analysisResultId": "sha256:...",
80
+ "projectId": "node:.",
81
+ "packageId": "npm:antd",
82
+ "name": "antd",
83
+ "impacted": true,
84
+ "findings": [
85
+ {
86
+ "id": "sha256:...",
87
+ "findingId": "modal-info-removed",
88
+ "kind": "breakingChange",
89
+ "summary": "Modal.info was removed.",
90
+ "impacted": true,
91
+ "reasonCode": "EXACT_SYMBOL_USAGE_FOUND",
92
+ "matchedSymbols": [
93
+ {
94
+ "symbol": "Modal",
95
+ "usages": [
96
+ { "file": "src/components/UserDialog.tsx" },
97
+ { "file": "src/pages/Home.tsx" }
98
+ ]
99
+ }
100
+ ]
101
+ }
102
+ ]
103
+ }
104
+ ```
105
+
106
+ Input lineage giữ exact-byte SHA-256 cho Project Manifest, Version Analysis, Usage Index và Repository Impact. Output không copy evidence refs/release notes vì chúng không cần thiết để giải thích repository usage match.
107
+
108
+ ## 5. Reason codes
109
+
110
+ | Code | Điều kiện deterministic |
111
+ | --- | --- |
112
+ | `EXACT_SYMBOL_USAGE_FOUND` | Repository Impact finding impacted và có ít nhất một exact matched symbol/file record. |
113
+ | `NO_EXACT_SYMBOL_USAGE_FOUND` | Dependency có ít nhất một matchable API symbol nhưng finding không có exact match. |
114
+ | `DEPENDENCY_NOT_USED` | Không có Usage Index dependency entry cho exact `projectId + packageId`. |
115
+ | `NO_MATCHABLE_SYMBOL_FOUND` | Dependency có usage entry nhưng không có API symbol có thể exact-match, ví dụ chỉ `*`, `default` hoặc side-effect usage. |
116
+
117
+ Reason code không kèm AI prose. Consumer có thể render message bằng template riêng dựa trên enum ổn định.
118
+
119
+ ## 6. Validation and invariants
120
+
121
+ Loader từ chối input khi:
122
+
123
+ - bất kỳ artifact nào sai schema/runtime invariants;
124
+ - Project/Version/Usage/Impact lineage khác artifact bytes đang load;
125
+ - repository identity hoặc artifact path không khớp lineage;
126
+ - Repository Impact dependency không trỏ tới exact Version Analysis result;
127
+ - dependency identity/name khác source result;
128
+ - thiếu/thừa/unknown breaking finding;
129
+ - original finding summary bị đổi;
130
+ - matched symbol không tồn tại trong Usage Index;
131
+ - file set khác exact symbol usage files;
132
+ - impact matcher không phải `exact-symbol@1.0.0`.
133
+
134
+ Output invariants:
135
+
136
+ - dependencies sort theo project/package/analysis result;
137
+ - findings sort theo finding ID;
138
+ - matched symbols và usage files sort lexical;
139
+ - mọi evidence ID ổn định từ analysis result + finding ID;
140
+ - impacted finding phải có `EXACT_SYMBOL_USAGE_FOUND` và non-empty matches;
141
+ - non-impacted finding không được có match;
142
+ - dependency impacted phải bằng OR của findings;
143
+ - summary và bốn reason counts phải tái tính đúng từ records;
144
+ - IDs, symbols và usage files không trùng.
145
+
146
+ ## 7. Known limitations and upgrade path
147
+
148
+ - Evidence chỉ chứng minh symbol-level impact. `Modal.info` match `Modal` chưa chứng minh exact member `info` được gọi.
149
+ - Không có usage kind trong schema hiện tại, nên evidence không thể phân biệt named/default/namespace import ngoài canonical symbol facts.
150
+ - Dependency có side-effect usage nhưng không có API symbol nhận `NO_MATCHABLE_SYMBOL_FOUND`; engine không suy diễn side effect có bị breaking change ảnh hưởng hay không.
151
+ - Non-breaking Version Analysis findings không thuộc Repository Impact `1.0.0`, do đó không nằm trong evidence artifact.
152
+
153
+ Hướng nâng cấp sau MVP:
154
+
155
+ 1. thêm optional structured `affectedApiPaths` vào Version Analysis version mới;
156
+ 2. thêm optional `usageKind` và member paths vào Usage Index version mới;
157
+ 3. thêm matcher/evidence-policy version mới để match exact API path;
158
+ 4. chỉ thêm line/snippet khi source discovery artifact thực sự sở hữu và version các dữ liệu đó.
159
+
160
+ Không dùng fuzzy matching hoặc AI để bù contract gap.
@@ -0,0 +1,235 @@
1
+ # IA-04 — CLI Orchestration & Report
2
+
3
+ ## Architecture review
4
+
5
+ IA-01, IA-02, and IA-03 already expose independent runtimes, validators, and artifact writers. IA-04 keeps those boundaries: it schedules the runtimes and passes artifact paths to the next stage without duplicating discovery, matching, or evidence logic.
6
+
7
+ The earlier Knowledge Research and Version Analysis entry-point orchestration still lives in `src/cli.js`. IA-04 uses small stage adapters around those existing functions. Moving them into dedicated application-service modules is useful future cleanup, but is deliberately outside IA-04 because it would increase regression risk without changing pipeline behavior.
8
+
9
+ Legacy stage commands remain available for backward compatibility. `upgradelens analyze` is the primary end-to-end command.
10
+
11
+ ## Pipeline flow
12
+
13
+ ```text
14
+ upgradelens analyze <repository>
15
+ |
16
+ v
17
+ Project Discovery
18
+ |
19
+ v
20
+ Knowledge Research
21
+ |
22
+ v
23
+ Version Analysis
24
+ |
25
+ v
26
+ Repository Usage Discovery
27
+ |
28
+ v
29
+ Repository Impact Analysis
30
+ |
31
+ v
32
+ Repository Impact Evidence
33
+ |
34
+ v
35
+ Markdown Report
36
+ |
37
+ v
38
+ Console Summary
39
+ ```
40
+
41
+ The scheduler runs stages sequentially. Every successful stage writes its existing artifact before the next stage starts. A failed stage is wrapped with its stage identity, the remaining stages are not invoked, and a concise log is written to `.upgradelens/logs/analyze.log`.
42
+
43
+ The scheduler accepts injected stage runners and a progress reporter. This keeps orchestration tests deterministic and keeps each runtime independently testable.
44
+
45
+ ## Artifact flow
46
+
47
+ | Stage | Reads | Writes |
48
+ | --- | --- | --- |
49
+ | Project Discovery | repository | `.upgradelens/project-manifest.json` |
50
+ | Knowledge Research | Project Manifest | `.upgradelens/knowledge-manifest.json` and the existing evidence bundle |
51
+ | Version Analysis | Project, Knowledge, and knowledge evidence artifacts | `.upgradelens/version-analysis.json` |
52
+ | Usage Discovery | Project Manifest, Version Analysis, repository source | `.upgradelens/usage-index.json` |
53
+ | Impact Analysis | Project Manifest, Version Analysis, Usage Index | `.upgradelens/repository-impact.json` |
54
+ | Impact Evidence | Project Manifest, Version Analysis, Usage Index, Repository Impact | `.upgradelens/repository-impact-evidence.json` |
55
+ | Markdown Report | completed in-memory artifact values produced by the same run | `.upgradelens/repository-impact.md` |
56
+
57
+ IA-04 does not rescan or parse source outside the existing Usage Discovery runtime. It does not perform impact matching or evidence generation itself.
58
+
59
+ ## CLI usage
60
+
61
+ Run the complete pipeline:
62
+
63
+ ```bash
64
+ upgradelens analyze .
65
+ ```
66
+
67
+ Select a validated caller-owned target without converting other registry
68
+ candidates into recommendations:
69
+
70
+ ```bash
71
+ upgradelens analyze . --target 'package=npm:framework-a,target=2.0.0'
72
+ ```
73
+
74
+ For an ambiguous monorepo occurrence, add the stable occurrence qualifiers:
75
+
76
+ ```bash
77
+ upgradelens analyze . \
78
+ --target 'package=npm:framework-a,target=2.0.0,project=node:apps/web,manifest=apps/web/package.json,type=dependency'
79
+ ```
80
+
81
+ If the same package is declared more than once with those same qualifiers,
82
+ the ambiguity error supplies one copy/paste-ready selector per declaration:
83
+
84
+ ```bash
85
+ upgradelens analyze . \
86
+ --target 'package=pypi:library-a,target=2.0.0,project=python:.,manifest=requirements.txt,type=runtime,occurrence=sha256:<candidate-id>'
87
+ ```
88
+
89
+ The optional `occurrence` discriminator is derived from canonical portable
90
+ declaration facts. It does not use array position or an absolute path.
91
+ Existing selectors remain valid when they already resolve one occurrence.
92
+ Stale or conflicting occurrence identifiers fail before provider
93
+ construction.
94
+
95
+ The repeatable key/value grammar is safe for scoped npm packages and Python
96
+ canonical IDs. Resolution is exact; zero matches, ambiguous matches, and
97
+ ecosystem-invalid targets fail before provider construction.
98
+
99
+ Use cached research data without registry requests:
100
+
101
+ ```bash
102
+ upgradelens analyze . --offline
103
+ ```
104
+
105
+ Limit discovery and usage scanning depth:
106
+
107
+ ```bash
108
+ upgradelens analyze . --max-depth 6
109
+ ```
110
+
111
+ On success, progress is printed without internal stage output or stack traces:
112
+
113
+ ```text
114
+ Running UpgradeLens Analysis...
115
+
116
+ ✓ Project Discovery
117
+ ✓ Knowledge Research
118
+ ✓ Version Analysis
119
+ ✓ Repository Usage Discovery
120
+ ✓ Repository Impact Analysis
121
+ ✓ Repository Impact Evidence
122
+ ✓ Markdown Report
123
+
124
+ Analysis completed.
125
+ ```
126
+
127
+ On failure, the failed stage is identified and later stages do not run:
128
+
129
+ ```text
130
+ ✗ Repository Usage Discovery
131
+
132
+ Repository Usage Discovery failed.
133
+
134
+ See:
135
+ .upgradelens/logs/analyze.log
136
+ ```
137
+
138
+ ## Renderer architecture
139
+
140
+ ```text
141
+ Version Analysis + Repository Impact + Repository Impact Evidence
142
+ |
143
+ v
144
+ Presentation View Model
145
+ |
146
+ +---------------+---------------+
147
+ | |
148
+ v v
149
+ Console renderer Markdown renderer
150
+ ```
151
+
152
+ The report stage builds one immutable, in-memory presentation view model and passes that same instance to both renderers. The builder joins dependency occurrences by `analysisResultId`, preserves Repository Impact ordering, validates artifact counts and cross-references, and clones evidence records without modifying the source artifacts. It creates no artifact or schema.
153
+
154
+ Renderers are presentation-only functions. They receive the shared view model and return text. They do not call analyzers or matchers, modify artifacts, derive severity or confidence, or write files. Writing is handled by the orchestration adapter after rendering.
155
+
156
+ This boundary permits future HTML, SARIF, or GitHub Summary renderers without changing the scheduler or IA-01 through IA-03.
157
+
158
+ ### Analysis completeness contract
159
+
160
+ Overall analysis status comes only from existing Version Analysis result statuses:
161
+
162
+ - `COMPLETE`: every dependency occurrence has status `analyzed`;
163
+ - `INCOMPLETE`: one or more dependency occurrences has status `skipped` or `failed`.
164
+
165
+ `requiresHumanReview` remains an explicit count, but does not by itself make an analyzed result incomplete.
166
+
167
+ This legacy analysis completeness is diagnostic. The public CLI separately
168
+ projects product completion as `COMPLETED`, `COMPLETED_WITH_REVIEW`, `PARTIAL`,
169
+ or `INSUFFICIENT_DATA`. Fatal pipeline failures and controlled cancellation are
170
+ reported as `FAILED` and `CANCELLED`.
171
+
172
+ Default `analyze` exits 0 for completed, review-required, and valid
173
+ insufficient-data outcomes; retained provider/output/runtime failures are
174
+ `PARTIAL` and exit 2. `--fail-on-incomplete` also exits 2 for
175
+ `COMPLETED_WITH_REVIEW` and `INSUFFICIENT_DATA`, but never fails only because
176
+ there are zero actions or all occurrences are `KEEP_CURRENT`.
177
+
178
+ Each dependency occurrence has exactly one presentation status:
179
+
180
+ - `IMPACTED`: Version Analysis status is `analyzed` and Repository Impact reports `impacted: true`;
181
+ - `NOT_IMPACTED`: Version Analysis status is `analyzed` and Repository Impact reports `impacted: false`;
182
+ - `NOT_ANALYZED`: Version Analysis status is `skipped` or `failed`.
183
+
184
+ Skipped and failed results are never described as not impacted. They receive a deterministic safe message based only on their status; raw runtime errors are not included. The following invariant must hold or presentation fails clearly:
185
+
186
+ ```text
187
+ impacted + not impacted + not analyzed = dependency occurrences
188
+ ```
189
+
190
+ Missing references, identity mismatches, finding-reference mismatches, and inconsistent summary counts also fail rather than being silently classified.
191
+
192
+ ### Console format
193
+
194
+ The console summary leads with:
195
+
196
+ - product completion and plain-language next step;
197
+ - decision counts and an occurrence-level installed-to-target table;
198
+ - handoff counts and failed-occurrence recovery guidance;
199
+ - report and artifact paths;
200
+ - legacy impact counts as trailing diagnostics.
201
+
202
+ The diagnostic section contains:
203
+
204
+ - repository name from Project Manifest;
205
+ - overall `COMPLETE` or `INCOMPLETE` analysis status;
206
+ - analyzed, skipped, failed, and human-review counts from Version Analysis;
207
+ - separate impacted, not-impacted, and not-analyzed occurrence counts;
208
+ - breaking finding count from Repository Impact;
209
+ - evidence record count from Repository Impact Evidence (`summary.findingCount`);
210
+ - Markdown report path.
211
+
212
+ An incomplete run also prints a plain-text warning that impact conclusions are incomplete. Color is not required to understand the state.
213
+
214
+ ### Markdown format
215
+
216
+ The Markdown report contains:
217
+
218
+ - repository name;
219
+ - an Analysis Completeness section and warning when incomplete;
220
+ - analyzed, skipped, failed, impacted, not-impacted, and not-analyzed counts;
221
+ - one section per dependency;
222
+ - the dependency's Version Analysis and impact presentation statuses;
223
+ - finding ID, original finding summary, impacted flag, evidence reason code;
224
+ - matched symbols and source file paths already present in Repository Impact Evidence.
225
+
226
+ For `NOT_ANALYZED`, the dependency section renders no impact conclusion or evidence and explains only whether Version Analysis was skipped or failed. The report does not add conclusions beyond the artifact fields.
227
+
228
+ ## Limitations and technical debt
229
+
230
+ - Knowledge Research and Version Analysis application orchestration remain CLI-local legacy code. They should eventually be extracted into dedicated stage services without changing their domain runtimes.
231
+ - `analyze` inherits the configured behavior of existing stages. Online Research may access registries, and Version Analysis may require its already-configured runtime. IA-04 adds no provider or AI behavior.
232
+ - Failure logging currently keeps one deterministic `analyze.log`; a later observability task may add rotation or run identifiers.
233
+ - The presentation builder checks the cross-artifact relationships required for truthful rendering, but upstream artifact schema validation remains the responsibility of each owning stage.
234
+ - `INCOMPLETE` does not repair or retry skipped/failed Version Analysis results. Provider/runtime configuration and Version Analysis quality remain outside IA-04.
235
+ - Dependency ordering is deterministic for the same inputs and preserves occurrence-level Repository Impact ordering. Stable identifiers across separate pipeline runs remain outside this fix.
@@ -0,0 +1,235 @@
1
+ # IA-05-RERUN — Real Provider Validation on VinGrade
2
+
3
+ ## 1. Executive verdict
4
+
5
+ **GO WITH KNOWN LIMITATIONS**
6
+
7
+ The existing OpenAI-compatible HTTP runtime successfully invoked a configured remote provider, parsed strict structured output, and produced schema-valid Version Analysis results. The progressive validation analyzed three selected frontend dependencies, then the complete VinGrade pipeline analyzed 44 of 47 dependency occurrences with no provider/runtime failures.
8
+
9
+ IA-04-FIX-01 rendered the mixed result truthfully: 44 analyzed occurrences were `NOT_IMPACTED`, three skipped occurrences were `NOT_ANALYZED`, and the report was `INCOMPLETE`. No skipped occurrence was presented as not impacted.
10
+
11
+ The principal limitation is the declared IA-01 MVP scope: Usage Discovery currently indexes JavaScript/TypeScript only. Five of the six real breaking findings were for Python dependencies. Manual inspection found that the changed APIs in the sampled findings are not used, but IA-03's `DEPENDENCY_NOT_USED` reason for those Python packages means “absent from the supported usage index,” not proof that the repository does not import the package. MVP-04 is therefore validated for its current JS/TS usage-analysis scope, not as complete polyglot impact coverage.
12
+
13
+ ## 2. Provider configuration
14
+
15
+ UpgradeLens does not automatically load `.env`. Validation explicitly used the existing ignored local file with `node --env-file=.env`; no secret value was printed or copied into an artifact, command transcript, source file, or this report.
16
+
17
+ | Setting | Environment variable | Required by selected adapter | Secret | Validation value/status |
18
+ | --- | --- | ---: | ---: | --- |
19
+ | Provider adapter | `UPGRADELENS_AI_PROVIDER` | Yes, to select OpenAI-compatible mapping | No | `openai-compatible` |
20
+ | Endpoint | `UPGRADELENS_AI_ENDPOINT` | Yes | No | configured; host `openrouter.ai` |
21
+ | Model | `UPGRADELENS_AI_MODEL` | Yes | No | `openai/gpt-5.5` |
22
+ | Authorization | `UPGRADELENS_AI_AUTHORIZATION` | Provider-dependent | Yes | configured |
23
+ | Timeout | `UPGRADELENS_AI_TIMEOUT_MS` | No; default is 60000 ms | No | `180000` ms |
24
+
25
+ The endpoint URL path and authorization value are intentionally not recorded. `UPGRADELENS_AI_DEBUG` was not enabled.
26
+
27
+ ## 3. Commands executed
28
+
29
+ No command contained a key or authorization value.
30
+
31
+ ```bash
32
+ git -C <VINGRADE_REPO> status --short
33
+ git -C <VINGRADE_REPO> diff --name-only
34
+
35
+ node ./bin/upgradelens.js discover \
36
+ <VINGRADE_REPO>
37
+
38
+ node ./bin/upgradelens.js research \
39
+ <VINGRADE_REPO>
40
+
41
+ node --env-file=.env ./bin/upgradelens.js analyze-version \
42
+ <VINGRADE_REPO> \
43
+ --package npm:react-router-dom
44
+
45
+ node --env-file=.env ./bin/upgradelens.js analyze-version \
46
+ <VINGRADE_REPO> \
47
+ --package npm:react \
48
+ --output .upgradelens/validation/version-analysis-react.json
49
+
50
+ node --env-file=.env ./bin/upgradelens.js analyze-version \
51
+ <VINGRADE_REPO> \
52
+ --package npm:axios \
53
+ --output .upgradelens/validation/version-analysis-axios.json
54
+
55
+ node --env-file=.env ./bin/upgradelens.js analyze \
56
+ <VINGRADE_REPO>
57
+ ```
58
+
59
+ Read-only `jq`, `rg`, `sed`, and `find` checks were then used to inspect artifact references, evidence content, report states, source usages, and Git safety. UpgradeLens verification used `npm test`, `npm pack --dry-run --cache "$TMPDIR/upgradelens-npm-cache"`, and `git diff --check`.
60
+
61
+ ## 4. Progressive validation
62
+
63
+ ### Preparation
64
+
65
+ The VinGrade `.upgradelens` directory was absent at the start of this rerun, so Project Discovery and online Knowledge Research were run before the provider probe.
66
+
67
+ The preparation Research run planned 46 unique packages from 47 occurrences. It reported 45 resolved packages, one unavailable package (`npm:vite`), 581 evidence records, zero cache hits, and 46 cache misses.
68
+
69
+ ### Level A — one dependency
70
+
71
+ Selected `npm:react-router-dom` because it had one clear occurrence, declared constraint `^7.16.0`, registry target `7.18.1`, and publisher release/changelog evidence.
72
+
73
+ Result:
74
+
75
+ - one real remote request completed without timeout or retry;
76
+ - result status: `analyzed`;
77
+ - artifact validation: `valid`, with no validation warning codes;
78
+ - target: `7.18.1` from registry evidence;
79
+ - baseline: unresolved because the manifest declaration is a constraint, so risk remained `unknown` and required human review;
80
+ - finding: a concrete compatibility finding describing the 7.18.1 patch fixes;
81
+ - evidence: publisher changelog reference `sha256:4b82f43a882325c485526aaa805ef33a85efb355b09a7688fb3d895ec11575a5` directly contains those fixes.
82
+
83
+ No unsupported URL or evidence reference survived validation.
84
+
85
+ ### Level B — small frontend set
86
+
87
+ The cumulative set was `react-router-dom`, `react`, and `axios`. `vite` was excluded because Knowledge Research marked its target unavailable. Three dependencies met the requested minimum, so `pdfjs-dist` was not added merely to increase request volume.
88
+
89
+ | Dependency | Declared | Target | Status | Findings |
90
+ | --- | --- | --- | --- | ---: |
91
+ | `npm:react-router-dom` | `^7.16.0` | `7.18.1` | analyzed | 1 compatibility |
92
+ | `npm:react` | `^19.2.6` | `19.2.7` | analyzed | 5 compatibility |
93
+ | `npm:axios` | `^1.17.0` | `1.18.1` | analyzed | 3 compatibility |
94
+
95
+ All three outputs were schema-valid and had valid evidence references. There was no timeout, malformed response, schema mismatch, authentication failure, or provider compatibility error. The React output included some low-value compatibility records derived from registry status or unscoped changelog sections; this is model-quality noise, but it did not create breaking impact findings.
96
+
97
+ ### Level C — full VinGrade run
98
+
99
+ The complete pipeline ran in online Research mode. Research reused 45 fresh registry cache entries and had one miss; it again produced 45 resolved and one unavailable unique package.
100
+
101
+ Full Version Analysis produced 44 analyzed, three skipped, and zero failed occurrences. Under the one-call-per-eligible-context contract, this is 44 remote AI requests for Level C. Together with Level A and the two additional Level B calls, the progressive exercise made 47 remote requests. No retries or alternative models were used.
102
+
103
+ The runtime does not publish an aggregate duration, per-result latency, token usage, or billing data in `version-analysis.json`; none is estimated here.
104
+
105
+ The three skipped occurrences were:
106
+
107
+ - `npm:vite`: target missing;
108
+ - `pypi:langchain-core`: unsupported baseline;
109
+ - one occurrence of `pypi:langchain-openai`: unsupported baseline.
110
+
111
+ Another exact-baseline occurrence of `pypi:langchain-openai` was analyzed, confirming occurrence-level accounting.
112
+
113
+ ## 5. Pipeline counts
114
+
115
+ | Metric | Count |
116
+ | --- | ---: |
117
+ | Dependency occurrences | 47 |
118
+ | Analyzed | 44 |
119
+ | Skipped | 3 |
120
+ | Failed | 0 |
121
+ | Requires human review | 46 |
122
+ | Impacted | 0 |
123
+ | Not impacted | 44 |
124
+ | Not analyzed | 3 |
125
+ | Breaking findings | 6 |
126
+ | Impacted findings | 0 |
127
+ | Evidence records | 6 |
128
+ | Matched symbols | 0 |
129
+ | Affected files | 0 |
130
+
131
+ Version Analysis validation statuses were 44 `valid` and three `validWithWarnings`. The only warning codes were two `BASELINE_UNSUPPORTED` and one `TARGET_MISSING`. Across all results, 217 evidence references resolved to 111 unique included evidence records.
132
+
133
+ ## 6. Manual finding matrix
134
+
135
+ Five of the six breaking findings were selected. Every selected claim is supported by the referenced publisher release evidence.
136
+
137
+ | Dependency | Finding | Analyzed | Matched symbol | Source confirmed | Verdict |
138
+ | --- | --- | ---: | --- | ---: | --- |
139
+ | `pdfjs-dist` | `PageViewport.convertToViewportRectangle` removed in 6.1.200 | Yes | None | Yes: package is used, removed API is not | `CORRECT_NON_IMPACT` |
140
+ | `langsmith` | `AsyncClient.projects` accessor removed in 0.10.0 | Yes | None | Yes: repository imports `Client`, not this accessor | `CORRECT_NON_IMPACT` |
141
+ | `langsmith` | `online_evaluator` renamed to `evaluator` in 0.9.8 | Yes | None | Yes: no use of either SDK component was found | `CORRECT_NON_IMPACT` |
142
+ | `python-dotenv` | `set_key`/`unset_key` symlink behavior changed in 1.2.2 | Yes | None | Yes: repository uses `find_dotenv`/`load_dotenv`, not mutation APIs | `CORRECT_NON_IMPACT` |
143
+ | `python-jose` | Python 3.8 support removed in 3.5.0 | Yes | None | Yes: deployed Docker runtime is Python 3.11 | `CORRECT_NON_IMPACT` |
144
+
145
+ Detailed observations:
146
+
147
+ - VinGrade imports `pdfjs-dist` in `FE/src/components/shared/SubmissionDocumentPreview.jsx` and uses `GlobalWorkerOptions`, `Util`, `getDocument`, and the namespace value. Neither `PageViewport` nor `convertToViewportRectangle` is used. IA-02/IA-03 correctly returned `NO_EXACT_SYMBOL_USAGE_FOUND`.
148
+ - VinGrade imports LangSmith `Client`; no LangSmith `AsyncClient.projects` or `online_evaluator` use was found.
149
+ - VinGrade imports python-dotenv's loading helpers only; neither breaking mutation API is used.
150
+ - VinGrade imports python-jose's `JWTError` and `jwt`, while its Dockerfile uses Python 3.11. The Python 3.8 platform removal does not affect that runtime.
151
+
152
+ The unselected sixth finding concerns python-dotenv file-mode preservation and has the same manual non-impact result as the selected symlink finding.
153
+
154
+ ## 7. False positives and false negatives
155
+
156
+ No confirmed false positive was found among the six breaking findings: each claim is specific and directly supported by publisher evidence.
157
+
158
+ No confirmed false negative was found in the five manually inspected findings. However, there is a material false-negative risk for Python because IA-01 does not index Python imports in this MVP. `langsmith`, `python-dotenv`, and `python-jose` are demonstrably used in VinGrade source, while IA-03 reports `DEPENDENCY_NOT_USED` for their findings. The sampled changed APIs are not used, so the final non-impact conclusions happen to be correct, but the evidence reason is not a repository-wide Python usage assertion.
159
+
160
+ ## 8. Model and knowledge quality
161
+
162
+ ### Runtime correctness
163
+
164
+ - OpenAI-compatible request mapping worked with the configured remote endpoint and exact model.
165
+ - Strict JSON Schema output parsed successfully.
166
+ - There were no provider, authentication, timeout, truncation, or malformed-response failures.
167
+ - Package-local skipped states were produced before runtime invocation when target or baseline facts were insufficient.
168
+
169
+ ### Evidence support
170
+
171
+ - All six breaking findings cite evidence present in the Knowledge Evidence Bundle.
172
+ - Manual checks confirmed the cited release content supports each selected claim.
173
+ - No invented evidence reference or unsupported URL survived the Trust Layer.
174
+
175
+ ### Finding specificity
176
+
177
+ - Breaking findings were concrete: removed methods/accessors, renamed SDK surface, changed dotenv mutation behavior, and removed Python runtime support.
178
+ - Some non-breaking compatibility findings were noisy or weakly actionable, especially registry-status observations and changelog items without exact release applicability.
179
+
180
+ ### Knowledge/version limitations
181
+
182
+ - Forty-two results retained `unknown` risk, and 46 required human review.
183
+ - Many declarations are ranges, so current versions remain unresolved despite lockfiles being present in the repository. For example, VinGrade's `pdfjs-dist` lock entry is already 6.1.200 while Version Analysis treats the baseline as unresolved and target as 6.1.200.
184
+ - The Trust Layer correctly retained uncertainty instead of converting these cases into precise delta claims.
185
+
186
+ ## 9. Report validation
187
+
188
+ The generated `.upgradelens/repository-impact.md` contains:
189
+
190
+ - `Status: INCOMPLETE`;
191
+ - 44 `NOT_IMPACTED` dependency sections;
192
+ - three `NOT_ANALYZED` dependency sections;
193
+ - zero `IMPACTED` dependency sections;
194
+ - an explicit incomplete-analysis warning;
195
+ - six non-impacted breaking finding records matching IA-02/IA-03.
196
+
197
+ The skipped `vite`, `langchain-core`, and unresolvable `langchain-openai` occurrence use `NOT_ANALYZED` and the safe deterministic skipped message. They do not contain `Impacted: No`. The six `Impacted: No` lines in the report belong only to breaking findings under analyzed dependencies and agree with Repository Impact Evidence.
198
+
199
+ No report claim was found that was absent from the presentation view model or upstream artifacts.
200
+
201
+ ## 10. Repository safety
202
+
203
+ Before validation, VinGrade already had a deleted tracked `Makefile` and multiple untracked user files/directories. `.upgradelens` was absent. `git diff --name-only` returned only `Makefile`.
204
+
205
+ After validation, the same pre-existing changes remained and `.upgradelens/` was newly untracked. `git diff --name-only` still returned only `Makefile`.
206
+
207
+ Validation did not modify tracked source, `package.json`, requirements files, lockfiles, or manifests, and did not install dependencies. All validation writes were confined to `.upgradelens/`.
208
+
209
+ ## 11. Known limitations
210
+
211
+ - Usage Discovery is JS/TS-only in IA-01 MVP; Python impact evidence is not source-aware.
212
+ - Range declarations do not use lockfiles as exact baselines, leaving most risk classifications unknown.
213
+ - No real-provider breaking finding matched a used symbol in this run, so the positive `IMPACTED`/affected-file path was not exercised with live model output; its deterministic implementation remains unit-tested.
214
+ - The public Version Analysis artifact omits provider/model identity, latency, and token usage, so those operational facts must be recorded from the controlled configuration/run rather than derived from the artifact.
215
+ - Three occurrences remained legitimately not analyzed because of missing target/baseline facts.
216
+
217
+ ## 12. Final recommendation
218
+
219
+ MVP-04 meets **GO WITH KNOWN LIMITATIONS** for its current JS/TS usage-discovery scope:
220
+
221
+ - the real provider runtime works;
222
+ - real Version Analysis results are produced and evidence-grounded;
223
+ - deterministic impact/evidence stages preserve all breaking findings;
224
+ - the IA-04 report distinguishes analyzed and not-analyzed states correctly;
225
+ - manual inspection found no confirmed false impact conclusion in the sampled findings.
226
+
227
+ MVP-05 can begin provided product claims continue to state the current language-coverage limitation and do not present Python `DEPENDENCY_NOT_USED` as proof of repository non-use. There is no remaining real-provider blocker. Stable-ID work, Python Usage Discovery, and lockfile baseline resolution remain outside this validation and were not changed.
228
+
229
+ ## 13. Verification
230
+
231
+ - `npm test`: 403 tests, 402 passed, zero failed, one existing sandbox-related skip because local loopback listeners were unavailable.
232
+ - `npm pack --dry-run --cache "$TMPDIR/upgradelens-npm-cache"`: passed; 132 files, approximately 321.3 kB packed.
233
+ - `git diff --check`: passed with no output.
234
+ - Secret check: the configured authorization value was absent from all 113 generated/report files inspected.
235
+ - VinGrade post-run `git diff --name-only`: only the pre-existing deleted `Makefile`; validation artifacts remained untracked under `.upgradelens/`.