@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,827 @@
1
+ # VA-01A — Version Analysis Architecture Discovery
2
+
3
+ Tài liệu này đề xuất kiến trúc tối thiểu cho MVP-03 — AI Version Analysis dựa trên source code, schema, tests và tài liệu hiện có của UpgradeLens tại phiên bản `0.2.0`. Đây là tài liệu discovery; không mô tả production code đã tồn tại và không thay đổi runtime behavior.
4
+
5
+ ## 1. Executive Summary
6
+
7
+ MVP-03 nên là một pipeline tuần tự, một lần phân tích cho một dependency occurrence và một model invocation cho mỗi context đủ điều kiện:
8
+
9
+ ```text
10
+ Project Manifest + Knowledge Manifest + evidence artifact (khi có)
11
+
12
+
13
+ deterministic input/context preparation
14
+
15
+
16
+ one structured model invocation
17
+
18
+
19
+ schema validation + evidence validation
20
+
21
+
22
+ Version Analysis Manifest
23
+ ```
24
+
25
+ Các quyết định chính:
26
+
27
+ 1. Project Manifest `2.0.0` tiếp tục là nguồn duy nhất cho project/dependency facts. MVP-03 không scan repository hoặc source code.
28
+ 2. Knowledge Manifest `1.0.0` tiếp tục là nguồn package/release/provenance facts. Nó không bị sửa tại chỗ.
29
+ 3. Current version, target version, version direction/delta, evidence selection, lineage và validation đều là deterministic. Model chỉ tóm tắt ý nghĩa của delta, phân loại release-level risk và rút ra findings từ evidence đã chọn.
30
+ 4. AI core chỉ hiểu một `DependencyAiContext` chung. SemVer, PEP 440 và các scheme tương lai nằm sau một static ecosystem version adapter nhỏ; không có plugin SDK hoặc dynamic loading.
31
+ 5. Output là Version Analysis Manifest có JSON Schema, gồm deterministic facts, AI claims, evidence references và kết quả trust validation. Invalid model output không được publish trực tiếp.
32
+ 6. Không dùng multi-agent hoặc agent framework. Một workflow và một structured-output call là đủ cho phạm vi hiện tại.
33
+ 7. Không dùng vector database. Evidence được lọc deterministic theo package, version interval, role, authority, freshness và giới hạn kích thước.
34
+ 8. Knowledge Manifest hiện tại **chưa chứa nội dung** changelog, release notes hoặc migration guide. Non-registry sources do [`source-provenance.js`](../src/source-provenance.js) tạo đang là URL `unverified` với `snapshot: null`; registry snapshots chỉ có digest, không có portable content locator. Vì fetching, normalization, provenance và snapshot ownership đều thuộc Knowledge Research, Knowledge Evidence Bundle phải là output companion của **MVP-02.x**, không phải một task của MVP-03. Bundle riêng giữ Knowledge Manifest `1.0.0` backward-compatible. Nếu artifact đó không có, MVP-03 phải trả `insufficientEvidence`, `riskLevel: unknown`, yêu cầu human review và không gọi model.
35
+ 9. Project Manifest hiện chỉ có `declaredVersion`; không có lockfile/resolved version. Đây là enhancement chứ không phải blocker của MVP-03. MVP đầu tiên hỗ trợ hai mode: `exactBaseline` cho exact pin/explicit current và `declaredConstraint` cho range đã parse được. Mode thứ hai không giả range là installed version, chỉ phân tích target-scoped evidence, để delta `unknown`, không cho risk `low` và luôn yêu cầu human review. Lockfile/resolved artifact có thể bổ sung sau mà không đổi AI core.
36
+
37
+ Kiến trúc này giữ nguyên MVP-01/MVP-02, tái sử dụng lineage, package identity, occurrence, source và digest đã có, đồng thời tạo extension point nhỏ nhất để thêm ecosystem.
38
+
39
+ ## 2. Current Architecture Findings
40
+
41
+ ### 2.1 MVP-01 — Project Discovery và Project Manifest
42
+
43
+ Luồng hiện tại:
44
+
45
+ ```text
46
+ repository files
47
+ → collectCandidateFiles
48
+ → ecosystem detector
49
+ → dependency parser (Node, requirements.txt)
50
+ → discoverProject
51
+ → Project Manifest 2.0.0
52
+ ```
53
+
54
+ Các module chính:
55
+
56
+ | Module | Trách nhiệm đã xác minh |
57
+ | --- | --- |
58
+ | [`src/files.js`](../src/files.js) | Scan candidate manifests, bỏ symlink và ignored directories, chuẩn hóa path tương đối POSIX. |
59
+ | [`src/detectors.js`](../src/detectors.js) | Detect Node, Python, Java, .NET, Go, Rust, Ruby, PHP, AL; chỉ Node và Python `requirements.txt` tạo dependency inventory đầy đủ. |
60
+ | [`src/python-requirements.js`](../src/python-requirements.js) | Parse deterministic requirements, normalize tên gần PEP 503, giữ specifier/direct/editable references. |
61
+ | [`src/dependencies.js`](../src/dependencies.js) | Sort dependencies, tính declaration/unique/duplicate counts và warning duplicate. |
62
+ | [`src/discovery.js`](../src/discovery.js) | Điều phối discovery, workspace relationship, Git metadata, summary, warnings và Project Manifest. |
63
+ | [`schemas/project-manifest.schema.json`](../schemas/project-manifest.schema.json) | Public contract Draft 2020-12, `schemaVersion: 2.0.0`, `additionalProperties: false`. |
64
+ | [`src/project-manifest.js`](../src/project-manifest.js) | Runtime invariants cho count, portable path, unique project ID và dependency inventory. |
65
+ | [`src/project-manifest-input.js`](../src/project-manifest-input.js) | Đọc đúng một byte sequence, validate schema/invariants và tạo exact-byte SHA-256 lineage. |
66
+
67
+ MVP-01 tạo các facts có thể tái sử dụng trực tiếp trong MVP-03:
68
+
69
+ - repository name/root và Project Manifest digest;
70
+ - project `id`, `path`, `ecosystem`, languages, manifests;
71
+ - package manager name/version khi detector biết;
72
+ - mỗi dependency occurrence: declared name, normalized name, declared version/reference, dependency type và manifest path;
73
+ - trạng thái parser và warnings;
74
+ - quan hệ Node workspace.
75
+
76
+ Giới hạn quan trọng:
77
+
78
+ - `declaredVersion` là declaration/constraint, không phải installed version;
79
+ - không đọc lockfile và không có `resolvedVersion`;
80
+ - Java, .NET, Go, Rust, Ruby, PHP và AL mới chủ yếu được detect; inventory thường `unsupported`;
81
+ - không có source usage, import, symbol hoặc API usage.
82
+
83
+ Các tests xác nhận behavior này gồm [`test/discovery.test.js`](../test/discovery.test.js), [`test/python-requirements.test.js`](../test/python-requirements.test.js) và [`test/schema.test.js`](../test/schema.test.js). Tests kiểm tra polyglot/workspace, duplicate declarations, parser failure không phát partial inventory, ordering deterministic và schema/runtime invariants.
84
+
85
+ ### 2.2 MVP-02 — Research planning, providers và Knowledge Manifest
86
+
87
+ Luồng production hiện tại:
88
+
89
+ ```text
90
+ Project Manifest bytes
91
+ → loadProjectManifestInput
92
+ → createResearchPlan
93
+ → npm/PyPI registry adapters
94
+ → resolveSourceProvenance
95
+ → KnowledgeResearchResult
96
+ → build + validate + atomically write Knowledge Manifest 1.0.0
97
+ ```
98
+
99
+ Các module chính:
100
+
101
+ | Module | Trách nhiệm đã xác minh |
102
+ | --- | --- |
103
+ | [`src/research-plan.js`](../src/research-plan.js) | Group occurrences thành package identity `npm:<name>`/`pypi:<name>`, phân loại invalid/unsupported, sort và validate plan. |
104
+ | [`src/knowledge-cache.js`](../src/knowledge-cache.js) | Private filesystem cache có canonical digest, TTL, atomic write và privacy validation. Không phải downstream artifact. |
105
+ | [`src/registry/npm-packument.js`](../src/registry/npm-packument.js) | Validate/normalize npm packument thành identity, metadata, registry latest và lexical release index. |
106
+ | [`src/registry/npm-registry-adapter.js`](../src/registry/npm-registry-adapter.js) | npm fetch/cache/error boundary; không phụ thuộc npm/Yarn/pnpm/Bun installer behavior. |
107
+ | [`src/registry/pypi-project.js`](../src/registry/pypi-project.js) | Validate/normalize PyPI project JSON, release index, yanked facts, metadata và source candidates. |
108
+ | [`src/registry/pypi-registry-adapter.js`](../src/registry/pypi-registry-adapter.js) | PyPI fetch/cache/error boundary độc lập installer. |
109
+ | [`src/source-provenance.js`](../src/source-provenance.js) | Canonicalize publisher URLs, classify source roles, build source IDs/trust/conflicts. Không fetch nội dung. |
110
+ | [`src/knowledge-research.js`](../src/knowledge-research.js) | Bounded-concurrency orchestration, adapter isolation, provenance, warning/cache/status aggregation. |
111
+ | [`schemas/knowledge-manifest.schema.json`](../schemas/knowledge-manifest.schema.json) | Public Knowledge Manifest `1.0.0`: lineage, policy, research, package facts, sources, cache summary, warnings. |
112
+ | [`src/knowledge-manifest.js`](../src/knowledge-manifest.js) | Referential integrity, ordering, counts, source/warning relationships và timestamp invariants. |
113
+ | [`src/knowledge-manifest-builder.js`](../src/knowledge-manifest-builder.js) | Project internal research result sang public manifest; deterministic `researchId`; schema + runtime validation. |
114
+ | [`src/knowledge-manifest-writer.js`](../src/knowledge-manifest-writer.js) | Pretty serialization và atomic publication. |
115
+ | [`src/http/bounded-fetch.js`](../src/http/bounded-fetch.js) | Bounded JSON response, timeout, media type, redirect/error sanitation và body cleanup. |
116
+ | [`src/http/cli-http-runtime.js`](../src/http/cli-http-runtime.js) | CLI-owned Undici lifecycle, không mutate global dispatcher. |
117
+ | [`src/cli.js`](../src/cli.js) | `discover` và `research`; research luôn load default Project Manifest, build/validate rồi write Knowledge Manifest. |
118
+
119
+ MVP-02 tạo dữ liệu có thể tái sử dụng:
120
+
121
+ - exact Project Manifest lineage và deterministic `researchId`;
122
+ - package ID, ecosystem, registry identity và mọi occurrence;
123
+ - registry-designated latest version và selection mechanism;
124
+ - release index với opaque version/tag, date, URL, prerelease/yanked/deprecated nullable facts và source IDs;
125
+ - package metadata, gồm package-level deprecation message khi registry có;
126
+ - source catalog: ID, kind, authority, trust, URL, status, supported roles, provenance, digest/retrieval/freshness khi fetched, conflicts;
127
+ - explicit package/source status và structured warnings.
128
+
129
+ Những dữ liệu còn thiếu cho MVP-03:
130
+
131
+ 1. resolved/current version cho non-exact declarations — hữu ích để tăng precision nhưng không chặn `declaredConstraint` analysis;
132
+ 2. semantic version normalization/comparison và releases nằm trong interval current → target;
133
+ 3. target policy/request của analysis;
134
+ 4. content của release notes, changelog, migration guide và compatibility documentation;
135
+ 5. locator từ một claim/snippet về exact source snapshot;
136
+ 6. Knowledge Manifest input loader tương đương `loadProjectManifestInput`; hiện builder có validator nhưng CLI chưa có downstream reader;
137
+ 7. AI runtime, prompt version, structured analysis schema, evidence validator, eval và analysis telemetry.
138
+
139
+ Điểm thiếu evidence là thực tế implementation, không chỉ thiếu documentation:
140
+
141
+ - [`src/source-provenance.js`](../src/source-provenance.js) buộc non-registry source chưa fetch phải `status: unverified`, `snapshot: null`;
142
+ - [`src/registry/pypi-project.js`](../src/registry/pypi-project.js) ghi rõ changelog/release-note candidates là internal-only và public metadata không có content field;
143
+ - registry normalizers chỉ tạo minimal release index;
144
+ - [`docs/MVP-02-Knowledge-Manifest-Generation.md`](MVP-02-Knowledge-Manifest-Generation.md) xác nhận source-content fetching nằm ngoài MVP-02 implementation hiện tại;
145
+ - [`docs/MVP-02-Knowledge-Manifest.md`](MVP-02-Knowledge-Manifest.md) và [`docs/MVP-02-Architecture.md`](MVP-02-Architecture.md) xác định Knowledge Store là private và MVP-03 không được consume trực tiếp.
146
+
147
+ Tests liên quan gồm [`test/research-plan.test.js`](../test/research-plan.test.js), [`test/npm-registry-adapter.test.js`](../test/npm-registry-adapter.test.js), [`test/pypi-registry-adapter.test.js`](../test/pypi-registry-adapter.test.js), [`test/source-provenance.test.js`](../test/source-provenance.test.js), [`test/knowledge-research.test.js`](../test/knowledge-research.test.js), [`test/knowledge-manifest-schema.test.js`](../test/knowledge-manifest-schema.test.js), [`test/knowledge-manifest-generation.test.js`](../test/knowledge-manifest-generation.test.js), cache/HTTP lifecycle tests và fixtures dưới [`test/fixtures/knowledge-manifest`](../test/fixtures/knowledge-manifest).
148
+
149
+ ### 2.3 Boundary hiện tại và coding conventions
150
+
151
+ Boundary đã được code và docs duy trì nhất quán:
152
+
153
+ | Stage | Owns | Không owns |
154
+ | --- | --- | --- |
155
+ | MVP-01 Discovery | Repository scan, project/dependency facts | Registry/network, version meaning, AI |
156
+ | MVP-02 Research | Package identity, external facts, provenance, cache, Knowledge Manifest và portable Knowledge Evidence Bundle | Current resolution, version comparison, breaking-change reasoning |
157
+ | MVP-03 Version Analysis | Current/target/delta, evidence-grounded release meaning | Source usage/impact, code change, migration plan |
158
+ | MVP-04 Impact Analysis | Repository-specific affected usage/components | Automatic patch và detailed migration planning |
159
+ | MVP-05 Migration Planning | Ordered migration plan/validation/rollback | Package-manager execution hoặc implicit repository mutation |
160
+
161
+ Naming/coding patterns nên tiếp tục:
162
+
163
+ - file name kebab-case; exported functions dạng `create*`, `load*`, `build*`, `validate*`, `serialize*`, `write*`;
164
+ - factories trả explicit boundary object (`createKnowledgeCache`, `createNpmRegistryAdapter`, `createKnowledgeResearchOrchestrator`);
165
+ - public schema version độc lập package version và internal result/plan version;
166
+ - JSON Schema Draft 2020-12 với `additionalProperties: false`, sau đó runtime invariants cho ordering/referential integrity;
167
+ - exact-byte digest cho input lineage, canonical JSON digest cho logical identity;
168
+ - injected clock/fetch/adapters/filesystem cho deterministic tests;
169
+ - partial external failure thành status/warning; invalid top-level input/invariant là fatal;
170
+ - arrays sorted code-unit lexically; async completion order không ảnh hưởng artifact;
171
+ - adapters/providers là static implementation extension, không phải runtime plugin;
172
+ - [`src/index.js`](../src/index.js) chỉ export discovery và research-planning entry points; phần orchestration/manifest/provider hiện vẫn internal.
173
+
174
+ ## 3. MVP-03 Scope
175
+
176
+ ### In scope
177
+
178
+ - load và cross-validate Project Manifest, Knowledge Manifest và evidence artifact được khai báo;
179
+ - resolve một dependency occurrence thành analysis input;
180
+ - chọn `exactBaseline` khi có exact declaration/explicit current/future resolved artifact, hoặc `declaredConstraint` khi chỉ có parseable declaration range;
181
+ - resolve target từ explicit target hoặc opt-in `registryLatest` policy;
182
+ - normalize/compare version bằng ecosystem adapter;
183
+ - chọn release/evidence liên quan đến interval current → target;
184
+ - tạo một bounded, generic `DependencyAiContext` cho một dependency;
185
+ - dùng một AI runtime boundary để sinh structured claims;
186
+ - phân tích release-level breaking changes, deprecations và compatibility notes;
187
+ - phân loại release-level risk `low | medium | high | unknown`;
188
+ - validate JSON Schema và mọi evidence reference;
189
+ - tính evidence coverage, result validity và human-review requirement deterministic;
190
+ - emit một Version Analysis Manifest machine-readable, reusable bởi CLI/eval/MVP-04.
191
+
192
+ ### Out of scope
193
+
194
+ - scan source code, manifest hoặc lockfile ngoài versioned input artifacts;
195
+ - tìm file, symbol, import hoặc API usage bị ảnh hưởng;
196
+ - project-specific impact/severity;
197
+ - automatic code edit, patch hoặc dependency upgrade;
198
+ - detailed multi-step migration plan, command sequence, rollback plan;
199
+ - chạy npm/pip/Maven/NuGet/Cargo/Go;
200
+ - vector database, semantic index hoặc general web search;
201
+ - multi-agent, agent framework, MCP/server;
202
+ - dynamic plugin loading hoặc public plugin SDK;
203
+ - vulnerability/supply-chain analysis;
204
+ - sửa Project/Knowledge Manifest đã publish.
205
+
206
+ `migrationComplexity` không nằm trong minimal output. Không có source usage, field này dễ bị hiểu là độ khó migration thực tế của project, thuộc MVP-04/MVP-05. MVP-03 vẫn có thể ghi documented breaking/deprecation/compatibility findings để stage sau đánh giá complexity có căn cứ.
207
+
208
+ ## 4. Proposed Data Flow
209
+
210
+ ```mermaid
211
+ flowchart TD
212
+ A["Load Project, Knowledge and optional Evidence artifacts"] --> B["Validate schemas, invariants and lineage"]
213
+ B --> C["Resolve one dependency occurrence"]
214
+ C --> D["Resolve current and target versions"]
215
+ D --> E["Compare versions and select relevant releases"]
216
+ E --> F["Select bounded evidence"]
217
+ F --> G{"AI call is warranted?"}
218
+ G -- No --> H["Emit skipped/insufficient result"]
219
+ G -- Yes --> I["Build Dependency AI Context"]
220
+ I --> J["Invoke one model through AI runtime"]
221
+ J --> K["Validate structured candidate"]
222
+ K --> L["Validate and sanitize evidence references"]
223
+ L --> M["Derive coverage, validity, review and next action"]
224
+ H --> N["Assemble and validate Version Analysis Manifest"]
225
+ M --> N
226
+ ```
227
+
228
+ ### 4.1 Phân loại trách nhiệm
229
+
230
+ | Bước | Loại | Hành vi lỗi/partial |
231
+ | --- | --- | --- |
232
+ | Load/parse artifacts | Deterministic trust boundary | Unsupported schema, invalid JSON/invariants hoặc lineage mismatch là fatal; không gọi AI, không replace output cũ. |
233
+ | Resolve dependency input | Deterministic | Missing project/package/occurrence match tạo `status: skipped`, reason cụ thể; không gọi AI. Ambiguous match là input error, không chọn ngẫu nhiên. |
234
+ | Resolve baseline/target | Ecosystem-specific deterministic | Exact current tạo `exactBaseline`; parseable range tạo `declaredConstraint`; declaration không parse được, invalid target, downgrade không được policy cho phép hoặc exact current = target thì không gọi AI. |
235
+ | Compare/select releases | Ecosystem-specific deterministic | Exact mode chọn interval `(current, target]`. Constraint mode không giả lập interval: delta là `unknown` và chỉ giữ evidence gắn trực tiếp target/target line; luôn human review. |
236
+ | Select knowledge | Deterministic retrieval | Cho phép stale/partial evidence chỉ khi được gắn warning; conflict hoặc thiếu critical evidence không được biến thành low risk. |
237
+ | Build context | Deterministic | Context vượt limit phải trim theo priority; nếu vẫn vượt thì fail package-local, không cắt JSON tùy tiện. |
238
+ | Invoke model | AI | Timeout/provider error là package-local `status: failed`; không làm mất kết quả dependency khác. Không tự retry nhiều vòng; tối đa một transport retry do runtime policy. |
239
+ | Structured validation | Trust boundary | Invalid JSON/schema: không publish candidate. Một optional format retry có thể cấu hình sau; default MVP là fail package-local. |
240
+ | Evidence validation | Trust boundary | Xóa refs ngoài selected set. Claim không còn valid evidence bị loại; risk bị hạ về `unknown`; thêm limitation/review reason. AI không được tự tạo URL/ID. |
241
+ | Final assembly | Deterministic | Copy facts từ context, derive coverage/validity/review/action, validate full manifest rồi atomic write. |
242
+
243
+ ### 4.2 Khi nào được gọi AI
244
+
245
+ Chỉ gọi model khi tất cả điều kiện sau đúng:
246
+
247
+ - Project/Knowledge/evidence lineage hợp lệ;
248
+ - dependency identity resolve duy nhất;
249
+ - có target hợp lệ và baseline là exact current **hoặc** parseable declared constraint;
250
+ - có ít nhất một evidence item có content, source/digest hợp lệ và liên quan interval;
251
+ - không có unresolved authoritative conflict cho cùng claim domain;
252
+ - context nằm trong size policy.
253
+
254
+ Trong `declaredConstraint` mode, “liên quan interval” nghĩa là evidence gắn trực tiếp target hoặc target release line; model không được claim toàn bộ thay đổi từ một installed version chưa biết. Không gọi AI khi declaration không parse được, target không hợp lệ, package `notFound/invalid/unavailable`, exact current bằng target, evidence chỉ gồm URL/digest không có content, hoặc evidence không liên quan target. Kết quả deterministic trong các case này vẫn được emit để CLI/eval phân biệt “không cần model” với “model lỗi”.
255
+
256
+ ### 4.3 Partial data và human review
257
+
258
+ Có thể tiếp tục với partial data khi current/target/delta chắc chắn và có một tập evidence hợp lệ, nhưng source stale, thiếu một evidence category, hoặc một source phụ unavailable. Kết quả phải có coverage `partial` và review reason.
259
+
260
+ Human review bắt buộc khi:
261
+
262
+ - risk là `high` hoặc `unknown`;
263
+ - coverage là `none`/`partial`;
264
+ - selected evidence stale hoặc có source conflict;
265
+ - model candidate bị drop/sanitize claim;
266
+ - adapter chỉ phân loại delta là `other`/`unknown`;
267
+ - analysis mode là `declaredConstraint` vì installed baseline chưa được xác nhận;
268
+ - evidence nói rõ breaking change/deprecation nhưng target applicability không chắc chắn;
269
+ - provider/runtime failure hoặc analysis skipped vì baseline unsupported/evidence thiếu.
270
+
271
+ ## 5. Dependency AI Context Contract
272
+
273
+ `DependencyAiContext` là internal, versioned contract; không nhất thiết publish toàn bộ vào output. Một context tương ứng một dependency occurrence và một target. Baseline có thể là exact version hoặc declared constraint; hai mode không được trộn semantics. Nếu cùng package xuất hiện ở nhiều project/manifest/type/version declarations, mỗi tuple occurrence có context riêng. Các occurrence hoàn toàn trùng nhau có thể dùng chung model result qua deterministic context digest, nhưng final manifest vẫn giữ occurrence refs riêng.
274
+
275
+ ### 5.1 Contract đề xuất
276
+
277
+ ```json
278
+ {
279
+ "contextVersion": "1",
280
+ "contextId": "sha256:<canonical-context-digest>",
281
+ "lineage": {
282
+ "projectManifestDigest": "sha256:<digest>",
283
+ "knowledgeManifestDigest": "sha256:<digest>",
284
+ "knowledgeResearchId": "sha256:<digest>",
285
+ "evidenceArtifactDigest": "sha256:<digest-or-omitted>"
286
+ },
287
+ "dependency": {
288
+ "projectId": "node:.",
289
+ "packageId": "npm:example",
290
+ "declaredName": "example",
291
+ "normalizedName": "example",
292
+ "ecosystem": "node",
293
+ "registry": "npm",
294
+ "packageManager": "npm",
295
+ "dependencyType": "dependency",
296
+ "manifest": "package.json"
297
+ },
298
+ "versions": {
299
+ "analysisMode": "exactBaseline",
300
+ "declaredVersion": "^1.0.0",
301
+ "currentVersion": "1.4.2",
302
+ "currentVersionSource": "explicit",
303
+ "targetVersion": "2.0.0",
304
+ "targetPolicy": "explicit",
305
+ "delta": {
306
+ "direction": "upgrade",
307
+ "classification": "major"
308
+ }
309
+ },
310
+ "knowledge": {
311
+ "relevantReleases": ["2.0.0"],
312
+ "evidence": [
313
+ {
314
+ "id": "sha256:<evidence-id>",
315
+ "kind": "releaseNotes",
316
+ "sourceId": "npm:example:releaseNotes:<source-digest>",
317
+ "sourceUrl": "https://example.org/releases/2",
318
+ "authority": "officialProject",
319
+ "trust": "official",
320
+ "retrievedAt": "2026-07-14T00:00:00.000Z",
321
+ "contentDigest": "sha256:<content-digest>",
322
+ "locator": "heading:2.0.0",
323
+ "releaseVersions": ["2.0.0"],
324
+ "content": "bounded normalized excerpt"
325
+ }
326
+ ]
327
+ },
328
+ "metadata": {
329
+ "selectedEvidenceIds": ["sha256:<evidence-id>"],
330
+ "missingInformation": [],
331
+ "warnings": [],
332
+ "size": {
333
+ "characters": 1234,
334
+ "evidenceItems": 1
335
+ }
336
+ }
337
+ }
338
+ ```
339
+
340
+ ### 5.2 Field sources và requirement
341
+
342
+ | Field group | Field | Required | Source/owner | Lý do |
343
+ | --- | --- | --- | --- | --- |
344
+ | Identity | `projectId` | Có | Project Manifest + occurrence | Scope dependency theo project. |
345
+ | Identity | `packageId` | Có | Knowledge package ID | Stable cross-artifact identity. |
346
+ | Identity | `declaredName`, `normalizedName` | Có | Occurrence + Knowledge identity | Giữ spelling và lookup identity tách biệt. |
347
+ | Identity | `ecosystem` | Có | Cross-validated Project/Knowledge | Chọn adapter, không cho model suy đoán. |
348
+ | Identity | `registry` | Có khi researched | Knowledge identity | Package manager không đồng nghĩa registry. |
349
+ | Identity | `packageManager` | Không | Project Manifest project | Contextual fact; không dùng để chọn AI behavior. |
350
+ | Identity | `dependencyType`, `manifest` | Có | Occurrence | Phân biệt duplicate declarations và downstream display. |
351
+ | Version | `analysisMode` | Có | Baseline resolver enum | `exactBaseline | declaredConstraint`; quyết định độ chính xác và review policy. |
352
+ | Version | `declaredVersion` | Có, nullable | Project/Knowledge occurrence | Giữ declaration gốc. |
353
+ | Version | `currentVersion` | Có nhưng nullable | Explicit input, exact pin, hoặc future resolved artifact | Bắt buộc non-null trong `exactBaseline`; null trong `declaredConstraint`, không được model điền. |
354
+ | Version | `currentVersionSource` | Có nhưng nullable | Resolver enum | `explicit | exactDeclaration | resolvedArtifact`; null trong constraint mode. |
355
+ | Version | `targetVersion` | Có để gọi AI | Explicit input hoặc deterministic target policy | Không cho model chọn target. |
356
+ | Version | `targetPolicy` | Có | Request/policy enum | `explicit | registryLatest`; default đề xuất là `explicit`. |
357
+ | Version | `delta` | Có | Ecosystem adapter | `direction` và `classification` deterministic. |
358
+ | Knowledge | `relevantReleases` | Có, có thể rỗng | Adapter + Knowledge release index | Giới hạn evidence theo interval. |
359
+ | Knowledge | `evidence[]` | Có, có thể rỗng | Knowledge facts + portable evidence artifact | Chỉ content selected mới vào prompt. |
360
+ | Evidence | `id`, `sourceId`, `contentDigest` | Có | Deterministic evidence materialization | Trust validator dùng allowlist IDs. |
361
+ | Evidence | `kind` | Có | Research normalization enum | `releaseNotes | breakingChanges | deprecations | migrationGuide | compatibility | changelog | registryFact`. |
362
+ | Evidence | URL/ref, timestamp, locator | Có khi source cung cấp | Source catalog/evidence artifact | Audit được exact snapshot/section. |
363
+ | Evidence | `content` | Có để model dùng | Bounded evidence artifact | Digest/URL một mình không đủ grounding. |
364
+ | Metadata | lineage | Có | Exact artifact bytes | Reproducibility và cache/eval identity. |
365
+ | Metadata | missing/warnings | Có, arrays | Resolver/selector | Model thấy rõ uncertainty nhưng không quyết định validity. |
366
+ | Metadata | size | Có | Context builder | Observability/budget; character count là baseline đơn giản. Token estimate chỉ thêm khi runtime cung cấp tokenizer. |
367
+
368
+ Không đưa `generatedAt`, toàn bộ package list, toàn bộ source catalog, cache summary, unrelated occurrences hoặc full release index vào prompt.
369
+
370
+ ### 5.3 Evidence artifact tối thiểu
371
+
372
+ Knowledge Manifest `1.0.0` không đủ để phục hồi content bằng public contract. Đề xuất nhỏ nhất là một `Knowledge Evidence Bundle 1.0.0` do Knowledge Research sở hữu và được triển khai trong MVP-02.x, không phải trong Version Analysis. Bundle không sửa Knowledge Manifest đã publish, không expose Knowledge Store layout, và có lineage tới Knowledge Manifest digest/research ID cùng các item:
373
+
374
+ ```json
375
+ {
376
+ "id": "sha256:<sourceId + contentDigest + locator>",
377
+ "packageId": "npm:example",
378
+ "sourceId": "npm:example:releaseNotes:<digest>",
379
+ "kind": "releaseNotes",
380
+ "contentDigest": "sha256:<normalized-content>",
381
+ "retrievedAt": "2026-07-14T00:00:00.000Z",
382
+ "mediaType": "text/plain",
383
+ "locator": "heading:2.0.0",
384
+ "releaseVersions": ["2.0.0"],
385
+ "content": "bounded normalized evidence"
386
+ }
387
+ ```
388
+
389
+ Chỉ fetch các changelog/release-notes/migration URLs đã được provenance resolver xác định; không crawl site, search web hoặc follow arbitrary links. Bundle phải có schema, size limits, canonical ordering và digest validation. Đây là focused completion của research evidence boundary đã được [`docs/MVP-02-Architecture.md`](MVP-02-Architecture.md) dự liệu, không phải rewrite MVP-02.
390
+
391
+ Việc dùng companion artifact thay vì thêm required fields vào Knowledge Manifest có ba hệ quả mong muốn:
392
+
393
+ - Knowledge Manifest `1.0.0`, readers và fixtures hiện tại không thay đổi; consumer không cần textual evidence vẫn hoạt động như trước;
394
+ - Knowledge Research sở hữu trọn vòng đời fetch → normalize → provenance → snapshot → publication, còn MVP-03 chỉ load/select/reason;
395
+ - Evidence Bundle có thể được tái sử dụng bởi eval, MVP-04 hoặc tooling khác mà không phụ thuộc prompt/context format của Version Analysis, nhờ đó giảm coupling hai stage.
396
+
397
+ ### 5.4 Context selection policy
398
+
399
+ Selector deterministic thực hiện theo thứ tự:
400
+
401
+ 1. join đúng `packageId` và occurrence;
402
+ 2. giữ release facts trong `(current, target]` theo adapter;
403
+ 3. giữ evidence có `releaseVersions` giao interval; evidence không version-tagged chỉ giữ khi role là migration/compatibility/changelog cho target major/minor tương ứng;
404
+ 4. ưu tiên `officialProject/official`, sau đó `publisherProvided|registryAuthoritative/publisher`, rồi `verified`; community mặc định loại;
405
+ 5. loại `notFound`, `unavailable`, digest mismatch và content không có;
406
+ 6. stale evidence có thể giữ nhưng thêm warning/review; source conflict không được resolve bằng thứ tự ưu tiên một cách im lặng;
407
+ 7. deduplicate theo content digest; giữ source refs của duplicate nếu cần provenance;
408
+ 8. cap theo số item và tổng characters bằng policy versioned; trim lowest priority trước;
409
+ 9. stable sort theo version applicability, kind priority, authority/trust, source ID, locator;
410
+ 10. tính `contextId` sau selection từ canonical JSON.
411
+
412
+ Không cần embeddings/vector DB cho exact package + bounded version interval. Chỉ xem xét semantic retrieval khi evidence thực tế chứng minh deterministic filtering không đủ.
413
+
414
+ ## 6. AI Version Analysis Output Contract
415
+
416
+ ### 6.1 Top-level Version Analysis Manifest
417
+
418
+ Default artifact đề xuất: `.upgradelens/version-analysis-manifest.json`.
419
+
420
+ ```json
421
+ {
422
+ "schemaVersion": "1.0.0",
423
+ "generatedAt": "2026-07-14T00:00:00.000Z",
424
+ "generator": { "name": "UpgradeLens", "version": "<package version>" },
425
+ "input": {
426
+ "projectManifest": { "schemaVersion": "2.0.0", "artifact": "...", "artifactDigest": "..." },
427
+ "knowledgeManifest": { "schemaVersion": "1.0.0", "artifact": "...", "artifactDigest": "...", "researchId": "..." },
428
+ "evidenceArtifact": { "schemaVersion": "1.0.0", "artifact": "...", "artifactDigest": "..." }
429
+ },
430
+ "analysis": {
431
+ "promptVersion": "1",
432
+ "contextVersion": "1",
433
+ "resultCount": 1
434
+ },
435
+ "results": []
436
+ }
437
+ ```
438
+
439
+ `runId` là operational correlation ID, khác deterministic `contextId` và `researchId`, và chỉ nằm trong telemetry. Model/provider/token/latency cũng không cần nằm trong portable result để tránh vendor coupling. Có thể ghi provider/model ở optional execution metadata sau khi privacy/reproducibility policy được chốt, nhưng không dùng làm semantic identity.
440
+
441
+ ### 6.2 Một result tối thiểu
442
+
443
+ ```json
444
+ {
445
+ "id": "sha256:<lineage + occurrence + current + target>",
446
+ "status": "analyzed",
447
+ "contextId": "sha256:<context-digest>",
448
+ "dependency": {
449
+ "projectId": "node:.",
450
+ "packageId": "npm:example",
451
+ "declaredName": "example",
452
+ "normalizedName": "example",
453
+ "ecosystem": "node",
454
+ "registry": "npm",
455
+ "dependencyType": "dependency",
456
+ "manifest": "package.json"
457
+ },
458
+ "versions": {
459
+ "analysisMode": "exactBaseline",
460
+ "declaredVersion": "^1.0.0",
461
+ "currentVersion": "1.4.2",
462
+ "currentVersionSource": "explicit",
463
+ "targetVersion": "2.0.0",
464
+ "targetPolicy": "explicit",
465
+ "delta": { "direction": "upgrade", "classification": "major" }
466
+ },
467
+ "summary": "Concise evidence-grounded meaning of this upgrade.",
468
+ "summaryEvidenceRefs": ["sha256:<evidence-id>"],
469
+ "riskLevel": "high",
470
+ "riskEvidenceRefs": ["sha256:<evidence-id>"],
471
+ "findings": [
472
+ {
473
+ "id": "finding-1",
474
+ "kind": "breakingChange",
475
+ "summary": "A documented behavior changed.",
476
+ "appliesToVersions": ["2.0.0"],
477
+ "evidenceRefs": ["sha256:<evidence-id>"]
478
+ }
479
+ ],
480
+ "evidenceCoverage": "sufficient",
481
+ "validation": {
482
+ "status": "valid",
483
+ "warningCodes": []
484
+ },
485
+ "requiresHumanReview": true,
486
+ "humanReviewReasons": ["HIGH_RISK"],
487
+ "nextAction": "reviewBeforeImpactAnalysis",
488
+ "limitations": []
489
+ }
490
+ ```
491
+
492
+ ### 6.3 Field ownership
493
+
494
+ | Field | Owner | Enum/evidence | Quy tắc |
495
+ | --- | --- | --- | --- |
496
+ | `id`, `status`, `contextId` | Deterministic assembler | status enum | `analyzed | skipped | failed`; không do model sinh. |
497
+ | `dependency`, `versions` | Deterministic context | enums cho mode/source/policy/delta | Copy verbatim; model output schema không chứa các field này. Constraint mode giữ `currentVersion: null` và delta `unknown`. |
498
+ | `summary` | AI | refs bắt buộc khi analyzed | Không được nói source-code impact. |
499
+ | `riskLevel` | AI candidate, trust validator có quyền hạ về unknown | `low | medium | high | unknown`; refs bắt buộc nếu khác unknown | Là release-level risk, không phải project impact. |
500
+ | `findings` | AI | kind enum; refs bắt buộc | Một array chung giúp schema/eval đơn giản; CLI group theo kind. |
501
+ | `evidenceCoverage` | Deterministic trust validator | `none | partial | sufficient` | Coverage không phải truth/confidence. |
502
+ | `validation` | Deterministic trust validator | `valid | validWithWarnings` | Invalid candidate không được publish như valid result. |
503
+ | `requiresHumanReview`, reasons | Deterministic policy | boolean + reason-code enums | Không để model tự miễn review. |
504
+ | `nextAction` | Deterministic policy | `collectEvidence | resolveCurrentVersion | reviewBeforeImpactAnalysis | proceedToImpactAnalysis | noUpgradeNeeded | retryAnalysis` | Tránh free-text migration recommendation. |
505
+ | `limitations` | Deterministic builder/validator | structured code + message | Từ missing info, stale/conflict, dropped claims, runtime errors. |
506
+
507
+ Finding kinds tối thiểu: `breakingChange`, `deprecation`, `compatibility`. Migration guide là evidence kind, không phải một loại kết luận riêng. Nếu một guide chứa required action, finding phù hợp vẫn là breaking/compatibility/deprecation; detailed step planning để MVP-05.
508
+
509
+ Candidate schema gửi cho model chỉ gồm `summary`, `summaryEvidenceRefs`, `riskLevel`, `riskEvidenceRefs` và `findings`. Final assembler thêm mọi field còn lại. Trong `declaredConstraint` mode, trust policy không cho final risk là `low`; output phải có `VERSION_UNCERTAIN`, `requiresHumanReview: true`, và findings chỉ được claim target-scoped behavior. Với `status: skipped | failed`, result vẫn giữ deterministic dependency/version facts đã resolve được, nhưng claims/findings rỗng, risk `unknown`, coverage `none`, review `true` và limitation/error code cụ thể.
510
+
511
+ `humanReviewReasons` dùng tập enum nhỏ: `HIGH_RISK`, `UNKNOWN_RISK`, `EVIDENCE_NONE`, `EVIDENCE_PARTIAL`, `SOURCE_STALE`, `SOURCE_CONFLICT`, `VERSION_UNCERTAIN`, `CLAIMS_DROPPED`, `ANALYSIS_FAILED`. Nhiều reason được sort/deduplicate deterministic.
512
+
513
+ ### 6.4 Các field không chọn
514
+
515
+ - `migrationComplexity`: bỏ khỏi MVP-03 minimal contract vì thiếu source usage và project constraints.
516
+ - numeric `confidence`: bỏ vì model self-score không calibrated và khó so sánh provider/model. Nếu runtime trả model confidence, chỉ trace như diagnostic. Trust gate dùng evidence coverage + validation + review policy.
517
+ - free-text `recommendedNextAction`: thay bằng deterministic enum `nextAction`.
518
+ - top-level duplicate arrays `breakingChanges`, `deprecations`, `compatibilityNotes`: thay bằng một `findings[]` có `kind` để giảm schema và validation branches.
519
+ - AI-generated URL/source title/version facts: không cho phép; lấy từ context/evidence catalog.
520
+
521
+ ## 7. Evidence and Trust Rules
522
+
523
+ ### 7.1 Claim rules
524
+
525
+ 1. `summary`, non-`unknown` risk và mọi finding là material AI claims, phải có ít nhất một `evidenceRef` trong selected context.
526
+ 2. Evidence ref chỉ được trỏ tới `knowledge.evidence[].id` đã allowlist. Model không được tạo URL, source ID, digest hoặc evidence ID.
527
+ 3. Ref hợp lệ về ID nhưng evidence digest/lineage không hợp lệ vẫn bị reject.
528
+ 4. Deterministic facts không được hỏi lại model và không được merge từ model response.
529
+ 5. Một registry release fact chứng minh version/date/yanked/deprecated fact mà nó support; nó không tự chứng minh breaking change.
530
+ 6. Absence of evidence không phải evidence of absence. Không có breaking-change content không đủ để kết luận risk `low`.
531
+ 7. Source conflict phải được giữ visible. Validator không chọn source thắng chỉ vì array order.
532
+ 8. Invalid refs bị loại. Claim chỉ còn invalid refs bị drop; summary không còn support được thay bằng deterministic insufficient-evidence summary; risk thành `unknown`; result `validWithWarnings` và human review.
533
+ 9. Raw invalid model candidate được lưu tối đa trong ephemeral debug telemetry theo redaction policy, không vào public manifest.
534
+
535
+ ### 7.2 Risk rubric tối thiểu
536
+
537
+ | Risk | Ý nghĩa release-level | Điều kiện evidence |
538
+ | --- | --- | --- |
539
+ | `low` | Relevant evidence đủ, không nêu breaking/deprecation/compatibility action cho interval và delta nhỏ theo adapter. | Coverage `sufficient`; absence phải dựa trên bộ evidence category được policy coi là đủ, không chỉ một release list. |
540
+ | `medium` | Có documented deprecation, opt-in behavior change hoặc compatibility/manual adjustment nhưng chưa có supported hard break. | Valid refs cho các findings/risk. |
541
+ | `high` | Có documented breaking change, incompatible requirement hoặc mandatory migration action trong interval. | Valid authoritative/publisher evidence refs; luôn human review. |
542
+ | `unknown` | Thiếu/mâu thuẫn/stale critical evidence, version applicability không chắc hoặc validation đã loại material claims. | Không cần fake refs; luôn human review. |
543
+
544
+ ### 7.3 Bốn khái niệm không được trộn
545
+
546
+ | Khái niệm | Nguồn | Ý nghĩa | Có quyết định publish/review? |
547
+ | --- | --- | --- | --- |
548
+ | Model confidence | Provider/model self-assessment | Cảm nhận của model, chưa calibrated | Không. Trace-only nếu có. |
549
+ | Evidence coverage | Deterministic validator | Material claims có valid refs và required evidence categories có mặt tới mức nào | Có. `none/partial` bắt buộc review. |
550
+ | Result validity | Schema + invariant + evidence validator | Output có đúng shape, refs và trust rules không | Có. Invalid candidate không publish; repaired result là `validWithWarnings`. |
551
+ | Human-review requirement | Deterministic policy | Con người có phải xác nhận trước stage tiếp theo không | Có. Derived từ risk, coverage, conflict, stale, validation và error states. |
552
+
553
+ Không cần composite trust score. Các enum và reason codes riêng dễ audit hơn một số tổng hợp khó giải thích.
554
+
555
+ ## 8. Ecosystem Extension Points
556
+
557
+ AI workflow không biết npm, React, Ant Design, PyPI hoặc framework name. Nó nhận context chung sau khi version adapter đã hoàn thành facts.
558
+
559
+ Interface tối thiểu đề xuất:
560
+
561
+ ```ts
562
+ interface EcosystemVersionAdapter {
563
+ ecosystem: string;
564
+ registries: readonly string[];
565
+
566
+ normalizeVersion(value: string):
567
+ | { ok: true; value: string }
568
+ | { ok: false; reason: string };
569
+
570
+ resolveDeclaredBaseline(declaredVersion: string | null):
571
+ | { kind: "exactVersion"; version: string }
572
+ | { kind: "declaredConstraint"; constraint: string }
573
+ | { kind: "unsupported"; reason: string };
574
+
575
+ targetSatisfiesDeclaration(
576
+ declaredVersion: string,
577
+ target: string
578
+ ): "yes" | "no" | "unknown";
579
+
580
+ compareVersions(current: string, target: string): {
581
+ direction: "upgrade" | "same" | "downgrade" | "unknown";
582
+ classification: "major" | "minor" | "patch" | "prerelease" | "other" | "unknown";
583
+ };
584
+
585
+ selectRelevantReleases(
586
+ releases: readonly KnowledgeRelease[],
587
+ input: {
588
+ mode: "exactBaseline" | "declaredConstraint";
589
+ current: string | null;
590
+ target: string;
591
+ }
592
+ ): readonly KnowledgeRelease[];
593
+ }
594
+ ```
595
+
596
+ Target policy resolver có thể là common deterministic component gọi adapter để validate/compare target. Package identity và registry metadata vẫn thuộc discovery/research adapters hiện có; không copy các rule đó vào AI core.
597
+
598
+ Static registry ban đầu:
599
+
600
+ ```text
601
+ node → npm-compatible SemVer adapter
602
+ python → PEP 440 adapter
603
+ ```
604
+
605
+ `declaredConstraint` là common mode, còn syntax do adapter sở hữu: npm/Cargo dùng SemVer-style ranges, Python dùng PEP 440 specifiers, Maven/NuGet có range riêng, và Go thường cung cấp selected module version hoặc pseudo-version trong `go.mod`. Vì core giữ declaration opaque ngoài adapter và cho phép current nullable, lockfile support có thể thêm theo ecosystem mà không đổi prompt/output claim model.
606
+
607
+ Khi thêm ecosystem:
608
+
609
+ | Ecosystem | Logic chỉ nằm ở boundary | Common AI core nhận |
610
+ | --- | --- | --- |
611
+ | Maven/Gradle | Maven coordinates, comparable-version policy, repository mapping, release selection | normalized identity, current/target/delta, evidence |
612
+ | NuGet | package ID normalization, NuGet version rules, registry target facts | cùng common context |
613
+ | Cargo | crate identity, Cargo SemVer/range resolution, crates.io metadata | cùng common context |
614
+ | Go Modules | module path/version/pseudo-version rules, proxy metadata | cùng common context |
615
+ | Python | PEP 503 identity đã có ở research; PEP 440 exact/range/ordering ở version adapter | cùng common context |
616
+ | npm | npm identity đã có ở research; SemVer/tags/ranges ở version adapter | cùng common context |
617
+
618
+ Contributor thêm ecosystem cần:
619
+
620
+ 1. Project Manifest dependency inventory support (nếu chưa có);
621
+ 2. Knowledge Research registry/provider mapping và fixtures;
622
+ 3. một `EcosystemVersionAdapter` + conformance tests;
623
+ 4. không sửa context builder, AI runtime, output schema hoặc trust validator nếu common fields đủ.
624
+
625
+ Không tạo dynamic loader, package hooks, arbitrary third-party code execution hoặc namespaced plugin manifest trong MVP-03.
626
+
627
+ ## 9. Evaluation Strategy
628
+
629
+ ### 9.1 Dataset format
630
+
631
+ Một thư mục fixtures nhỏ, không cần eval framework riêng:
632
+
633
+ ```text
634
+ test/fixtures/version-analysis/<case>/
635
+ project-manifest.json
636
+ knowledge-manifest.json
637
+ evidence-bundle.json
638
+ request.json
639
+ expected.json
640
+ ```
641
+
642
+ `expected.json` không assert exact prose. Nó chứa machine-checkable expectations:
643
+
644
+ ```json
645
+ {
646
+ "expectedModelInvocation": true,
647
+ "expectedStatus": "analyzed",
648
+ "expectedAnalysisMode": "exactBaseline",
649
+ "expectedDelta": "major",
650
+ "allowedRiskLevels": ["high"],
651
+ "requiredFindingKinds": ["breakingChange"],
652
+ "minimumEvidenceCoverage": "sufficient",
653
+ "requiresHumanReview": true,
654
+ "forbiddenUnsupportedClaims": ["source-code impact"]
655
+ }
656
+ ```
657
+
658
+ Model response fixtures có thể được injected vào `AiRuntime` để unit tests không gọi external service. Một optional manual/live eval sau này dùng cùng cases nhưng không nằm trong default CI.
659
+
660
+ ### 9.2 Golden samples ban đầu
661
+
662
+ | Case | Expected focus |
663
+ | --- | --- |
664
+ | npm major upgrade | Major delta, breaking evidence, high risk, valid refs, review true. |
665
+ | npm minor/patch | Deterministic minor/patch; chỉ low khi evidence set đủ; không suy từ delta một mình. |
666
+ | Python upgrade | PEP 440 normalization/range; compatibility/deprecation evidence; common context/output không đổi. |
667
+ | Missing knowledge/content | Không gọi model; `skipped`, risk unknown, coverage none, `collectEvidence`, review true. |
668
+ | Conflicting evidence | Không silently choose source; risk unknown hoặc supported high theo non-conflicting evidence, coverage partial, review true. |
669
+
670
+ Nên thêm hai deterministic edge fixtures sớm: (1) declared range không có current fact nhưng có target-scoped evidence vẫn gọi model ở `declaredConstraint`, delta unknown, không cho low risk và review true; (2) exact current = target không gọi model.
671
+
672
+ ### 9.3 Metrics tối thiểu
673
+
674
+ | Metric | Cách tính |
675
+ | --- | --- |
676
+ | Structured output validity | Tỷ lệ raw model candidates pass candidate JSON Schema. |
677
+ | Evidence reference validity | Valid selected refs / all emitted refs; final published result phải đạt 100%. |
678
+ | Evidence coverage | Material claims có ≥1 valid ref / material claims, cộng required-category check. |
679
+ | Unsupported claim rate | Human-annotated claims không entailed bởi cited evidence / material claims. Không tự động hóa bằng model trong MVP. |
680
+ | Risk classification agreement | Result risk thuộc `allowedRiskLevels` của golden case. |
681
+ | Human-review correctness | Boolean/reasons match expected policy cases. |
682
+ | Context repeatability | Canonical context bytes/context ID giống nhau cho cùng artifacts/request/policy bất kể array/completion order hợp lệ. |
683
+ | No-call correctness | Missing/invalid/no-op cases không invoke runtime. |
684
+
685
+ Không dùng exact summary string hoặc single aggregate score. Báo từng metric giúp thấy lỗi nằm ở model, context, evidence hay trust validator.
686
+
687
+ ## 10. Observability Boundary
688
+
689
+ AI runtime boundary tối thiểu:
690
+
691
+ ```ts
692
+ interface AiRuntime {
693
+ generateStructured(request: {
694
+ runId: string;
695
+ contextId: string;
696
+ promptVersion: string;
697
+ context: DependencyAiContext;
698
+ outputSchema: object;
699
+ }): Promise<{
700
+ output: unknown;
701
+ provider: string;
702
+ model: string;
703
+ latencyMs: number;
704
+ usage?: { inputTokens?: number; outputTokens?: number };
705
+ }>;
706
+ }
707
+
708
+ interface AnalysisTelemetry {
709
+ record(event: AnalysisTelemetryEvent): void | Promise<void>;
710
+ }
711
+ ```
712
+
713
+ Workflow chỉ phụ thuộc interface và no-op implementation mặc định. Adapter cho OpenTelemetry/Langfuse hoặc provider SDK có thể thêm sau; core không import vendor.
714
+
715
+ Metadata trace tối thiểu:
716
+
717
+ - run ID, deterministic context ID;
718
+ - project ID, package/dependency ID, ecosystem, registry;
719
+ - analysis mode, baseline source, nullable normalized current, target và delta classification;
720
+ - provider/model;
721
+ - prompt/context/schema version;
722
+ - context characters, selected evidence count và optional token estimate;
723
+ - latency và token usage khi provider trả;
724
+ - model invocation outcome;
725
+ - candidate schema validation status;
726
+ - evidence validation status/coverage;
727
+ - final status/risk/review boolean;
728
+ - stable error category, không phải raw stack/body.
729
+
730
+ Event names có thể chỉ cần `analysis.started`, `model.completed`, `validation.completed`, `analysis.completed|failed`. Không log full prompt/evidence mặc định vì có thể lớn hoặc nhạy cảm; log digests/IDs. Debug content capture phải opt-in, redacted và không nằm trong portable manifest.
731
+
732
+ Error categories tối thiểu: `INPUT_INVALID`, `LINEAGE_MISMATCH`, `BASELINE_UNSUPPORTED`, `TARGET_INVALID`, `VERSION_UNSUPPORTED`, `EVIDENCE_MISSING`, `EVIDENCE_CONFLICT`, `CONTEXT_LIMIT`, `MODEL_TIMEOUT`, `MODEL_PROVIDER_ERROR`, `OUTPUT_SCHEMA_INVALID`, `EVIDENCE_REFERENCE_INVALID`, `ARTIFACT_WRITE_FAILED`.
733
+
734
+ ## 11. Recommended Implementation Plan
735
+
736
+ Evidence completion là prerequisite do MVP-02.x sở hữu, sau đó MVP-03 còn ba task. Việc tách roadmap phản ánh artifact ownership; nó không tạo runtime coupling ngược từ Research sang AI.
737
+
738
+ ### MVP-02-09 — Portable Knowledge Evidence Completion (prerequisite)
739
+
740
+ **Phạm vi:** Hoàn thiện Knowledge Research bằng một versioned Knowledge Evidence Bundle liên kết Knowledge Manifest/source IDs. Fetch có giới hạn chỉ cho explicit changelog/release-notes/migration/compatibility candidates; normalize bounded text, locator, digest, version applicability; không crawl/search/vector DB và không chứa AI-specific prompt fields.
741
+
742
+ **Dependency:** MVP-02 `0.2.0`, source provenance và Knowledge Manifest `1.0.0`.
743
+
744
+ **Acceptance criteria:** Bundle có schema/invariants/lineage/atomic writer; không expose cache path/secrets; every item resolves package/source/digest; missing content tạo explicit status/warning; Knowledge Manifest `1.0.0`, existing readers/fixtures/runtime không đổi.
745
+
746
+ **Test strategy:** Recorded HTTP/content fixtures; size/media/redirect/privacy limits; digest mismatch; stale/conflict/missing; canonical ordering; offline behavior; no live service in CI.
747
+
748
+ **Đầu ra:** Evidence bundle schema, reader/writer, bounded source-content adapter(s), fixtures và Knowledge Research contract documentation. Đây là companion output reusable, không phải Version Analysis implementation.
749
+
750
+ ### VA-02 — Deterministic Version Baseline and Context
751
+
752
+ **Phạm vi:** Load/validate exact-byte Knowledge Manifest và evidence bundle; cross-check lineage; resolve occurrence/baseline/target; implement static Node SemVer và Python PEP 440 adapters; select releases/evidence; build canonical `DependencyAiContext`. Hỗ trợ `exactBaseline` và `declaredConstraint` từ đầu; không parse lockfile.
753
+
754
+ **Dependency:** MVP-02-09.
755
+
756
+ **Acceptance criteria:** Range không bị giả thành installed version; exact/explicit current và target có provenance; constraint mode giữ current null/delta unknown, chỉ chọn target-scoped evidence và bắt buộc review; identical inputs tạo identical context bytes/ID; AI core không import ecosystem modules; no-call decision deterministic.
757
+
758
+ **Test strategy:** Table-driven exact/range/direction/classification tests; fixtures cho duplicate occurrences, declared-constraint advisory, unsupported declaration, same/downgrade, prerelease/yanked, interval/target selection, size trimming và lineage mismatch.
759
+
760
+ **Đầu ra:** Internal context contract/version, input resolvers, ecosystem version adapter interface/registry và deterministic selector/builder.
761
+
762
+ ### VA-03 — Structured AI Analysis and Trust Validation
763
+
764
+ **Phạm vi:** Vendor-neutral `AiRuntime`, prompt v1, candidate schema, Version Analysis Manifest schema/builder/writer, evidence validator, human-review/next-action policy và minimal `analyze` CLI/API.
765
+
766
+ **Dependency:** VA-02.
767
+
768
+ **Acceptance criteria:** Một dependency context → tối đa một model call; deterministic facts không nằm trong candidate schema; invalid refs không xuất hiện trong final manifest; insufficient evidence không gọi model; constraint mode không emit low risk hoặc exact-delta claims; full artifact schema/invariants pass trước atomic write; partial package failure được biểu diễn rõ.
769
+
770
+ **Test strategy:** Fake runtime cho valid/invalid JSON, invented refs, unsupported/exact-delta claims trong constraint mode, timeout/provider errors; schema/invariant mutation tests; CLI stdout/custom/default output; no replacement on fatal validation.
771
+
772
+ **Đầu ra:** `.upgradelens/version-analysis-manifest.json`, runtime/trust boundaries, CLI/API và regression tests.
773
+
774
+ ### VA-04 — Evaluation and Observability Hardening
775
+
776
+ **Phạm vi:** Thêm năm golden cases, constraint-mode edge cases, metric runner nhỏ và no-op telemetry boundary với optional adapter đầu tiên nếu thật sự cần; chốt prompt/context versions và baseline results.
777
+
778
+ **Dependency:** VA-03.
779
+
780
+ **Acceptance criteria:** Metrics trong mục 9 chạy offline; context repeatability/no-call checks ở CI; exact/constraint policy được eval riêng; trace metadata/error categories đủ; không log raw prompt mặc định; không khóa vendor.
781
+
782
+ **Test strategy:** Golden fixture runner, deterministic fake-model replay, telemetry event snapshot/redaction tests và một opt-in live smoke test ngoài CI.
783
+
784
+ **Đầu ra:** Dataset/runner/report format, baseline, telemetry interface/events và operational documentation.
785
+
786
+ ## 12. Architecture Decisions
787
+
788
+ | Quyết định | Lý do | Phương án bị loại |
789
+ | --- | --- | --- |
790
+ | Không đọc source code trong MVP-03 | MVP-03 phân tích release meaning; code usage/impact thuộc MVP-04. Project Manifest là repository snapshot duy nhất và hiện không có usage inventory. | Scan imports/files trong analysis, đọc repository ad hoc. |
791
+ | Không dùng multi-agent | Một dependency có một bounded context, một reasoning task và một structured result; nhiều agent tăng latency, cost và khó evidence attribution. | Planner/researcher/reviewer agents, agent framework. |
792
+ | Structured output là bắt buộc | JSON Schema, CLI, eval, manifest persistence, evidence validation và MVP-04 reuse cần stable machine contract. | Free-form Markdown rồi parse heuristically. |
793
+ | Deterministic facts nằm ngoài AI | Current/target/delta/identity/lineage có thuật toán hoặc artifact source; để model suy đoán sẽ tạo hallucination và giảm repeatability. | Prompt model tự parse range/chọn target/copy facts. |
794
+ | AI core độc lập ecosystem | Version syntax/registry identity khác nhau nhưng reasoning trên selected evidence có cùng shape; contributor chỉ cần adapter nhỏ. | `if npm/react/...` trong prompt/workflow core. |
795
+ | Một dependency occurrence = một context | Declared version, project và dependency type có thể khác dù package ID giống nhau; context nhỏ và traceable hơn. | Một prompt cho toàn repository hoặc full package manifest. |
796
+ | Một workflow và một model call/context | Đủ cho scope; trust validation deterministic sau model. | Iterative agent loop hoặc multiple model judges mặc định. |
797
+ | Không vector database | Package ID + exact version interval + source roles tạo deterministic retrieval nhỏ; repo chưa có semantic corpus/DB runtime. | Embedding/index infrastructure trước khi có evidence volume. |
798
+ | Evidence Bundle thuộc MVP-02.x | Fetching, normalization, source provenance và snapshots là Knowledge Research responsibilities. Companion bundle giảm coupling, reusable và giữ Knowledge Manifest `1.0.0` backward-compatible. | Xây bundle trong VA task, MVP-03 đọc cache path/refetch web, hoặc thêm required content vào Knowledge Manifest 1.0.0. |
799
+ | Resolved current version không chặn MVP-03 | Exact pins/explicit current cho full interval analysis; parseable declared constraints vẫn cho target-scoped advisory có giới hạn rõ. Lockfile support tăng precision nhưng không tạo capability cốt lõi. | Chờ lockfile parser cho mọi ecosystem hoặc để model đoán installed version từ range. |
800
+ | Không sửa Project/Knowledge Manifest đã publish | Artifact ownership/immutability đã là invariant của MVP-02; missing facts phải được tạo ở artifact/version mới. | Enrich manifest in place hoặc repair downstream. |
801
+ | Chưa xây plugin SDK hoàn chỉnh | Static adapters là extension point đủ, phù hợp packaging/security hiện tại. | Dynamic loading, marketplace, arbitrary third-party adapters. |
802
+ | Chỉ một tài liệu discovery | Data flow, contracts, trust, eval và plan phụ thuộc nhau; một source of truth giảm drift trước implementation. | Tách ba tài liệu context/output/runtime có thể mâu thuẫn. |
803
+ | Bỏ migration complexity và numeric confidence | Không có project usage để đo complexity; model confidence chưa calibrated. Evidence coverage/validity/review dễ kiểm chứng hơn. | Persist subjective numeric scores. |
804
+ | Explicit target là default; registry latest là opt-in | Knowledge `latest` là registry fact, không phải recommendation. | Tự động coi latest là target cho mọi dependency. |
805
+
806
+ ## 13. Risks and Open Questions
807
+
808
+ ### Risks
809
+
810
+ - Evidence URL do publisher cung cấp có thể stale/sai/malicious; MVP-02-09 phải giữ URL safety, bounded fetch và trust semantics hiện có.
811
+ - Changelog monorepo có thể không map package version một-một; applicability cần explicit locator/version mapping hoặc review, không heuristic im lặng.
812
+ - Mutable documentation làm cùng URL đổi nội dung; digest + retrieved timestamp + retained evidence content là bắt buộc cho audit.
813
+ - Complete release index và evidence bundle có thể lớn; size policy phải versioned và đo bằng fixtures trước khi thêm index/DB.
814
+ - Risk `low` dễ bị hiểu sai nếu evidence corpus không đủ; validator chỉ cho low khi coverage policy đạt `sufficient`.
815
+ - Model output vẫn có thể diễn giải quá mức dù citation hợp lệ; unsupported claim rate cần human-annotated eval, không chỉ reference validity.
816
+ - Ecosystem version schemes không luôn map major/minor/patch; adapter phải trả `other/unknown` thay vì ép về SemVer.
817
+ - Constraint-mode analysis có thể bị đọc nhầm là installed-version analysis; mode, nullable current, unknown delta, review reason và CLI rendering phải luôn visible.
818
+
819
+ ### Open questions thực sự chưa kết luận được từ repository
820
+
821
+ 1. **Nguồn current version dài hạn:** MVP-01 hiện không đọc lockfiles, nhưng đây không còn là blocker. MVP-03 bắt đầu bằng `exactBaseline` và `declaredConstraint`. Sau khi có nhu cầu precision/batch thực tế, cần quyết định nâng Project Manifest bằng resolved dependency artifact hay nhận một analysis request artifact riêng; không nên tự scan lockfile trong MVP-03.
822
+ 2. **Provider/model đầu tiên:** repository chưa có AI SDK, credential/config convention hoặc deployment target. Runtime boundary đã đủ để implementation bắt đầu, nhưng lựa chọn provider/model cần yêu cầu vận hành/cost/privacy ngoài source hiện tại.
823
+ 3. **Evidence extraction policy cho complex docs:** explicit heading/version sections là default. Cần fixtures thực tế để chốt liệu một số projects cần bounded whole-document fallback hay repository-release API; không nên generalize trước dữ liệu.
824
+ 4. **CLI shape cho batch target requests:** source hiện không có config/manifest cho target per dependency. Library contract nên làm trước; sau đó chọn giữa repeated CLI flags và một versioned request file dựa trên expected usage, không nhét target recommendation vào Knowledge Manifest.
825
+ 5. **Risk rubric ownership:** các enum/rules ở trên đủ để implement, nhưng golden labels cần một maintainer/domain reviewer phê duyệt trước khi xem risk agreement là release gate.
826
+
827
+ Các câu hỏi này không chặn VA-02/VA-03. Thiếu evidence content vẫn dẫn đến no-call. Thiếu exact current nhưng còn parseable declared constraint cho phép target-scoped advisory với current null, delta unknown và human review; declaration không parse được mới dẫn đến no-call. Trong mọi trường hợp AI không được suy đoán installed version.