@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,205 @@
1
+ # OpenRouter One-Dependency Enriched Evidence Validation
2
+
3
+ **IMPLEMENTED — NOT YET EXECUTED**
4
+
5
+ ## 1. Purpose
6
+
7
+ This procedure validates one real dependency with its enriched release/changelog evidence through the existing OpenAI-compatible runtime and Version Analysis path. It is a bounded manual transport and integration check, not a model benchmark, qualification, or production certification.
8
+
9
+ The intended path is:
10
+
11
+ ```text
12
+ one real dependency
13
+ → enriched evidence
14
+ → exact OpenRouter model slug
15
+ → structured output
16
+ → JSON Schema/Ajv validation
17
+ → Trust Layer
18
+ → version-analysis.json
19
+ ```
20
+
21
+ ## 2. Prerequisites
22
+
23
+ - An OpenRouter API key and sufficient credit/quota for the exact selected model.
24
+ - A repository in which `discover` and `research` have already completed.
25
+ - An enriched Knowledge Evidence Bundle produced by the current UpgradeLens research flow.
26
+ - One exact OpenRouter model slug chosen by the maintainer.
27
+ - A Node.js version supported by UpgradeLens.
28
+ - The current UpgradeLens binary, or an existing local `npm link` installation.
29
+
30
+ ## 3. Local `.env`
31
+
32
+ From the UpgradeLens checkout, create an ignored local file:
33
+
34
+ ```bash
35
+ cp .env.example .env
36
+ ```
37
+
38
+ Then replace the placeholders locally:
39
+
40
+ ```dotenv
41
+ UPGRADELENS_AI_MODEL=<exact-model-slug>
42
+ UPGRADELENS_AI_AUTHORIZATION=Bearer <real-key>
43
+ ```
44
+
45
+ Do not send the key to Codex, chat, logs, or issue reports. Never commit `.env`.
46
+
47
+ UpgradeLens does not load `.env` automatically and does not search parent directories for runtime configuration. Node `--env-file` should not be assumed to interpolate `${OPENROUTER_API_KEY}` inside `.env`. Put the complete local value directly in that ignored file:
48
+
49
+ ```dotenv
50
+ UPGRADELENS_AI_AUTHORIZATION=Bearer <REAL_OPENROUTER_KEY>
51
+ ```
52
+
53
+ ## 4. Configurations Maintainer Must Add
54
+
55
+ The manual run requires exactly these runtime settings:
56
+
57
+ ```text
58
+ UPGRADELENS_AI_PROVIDER=openai-compatible
59
+ UPGRADELENS_AI_ENDPOINT=https://openrouter.ai/api/v1/chat/completions
60
+ UPGRADELENS_AI_MODEL=<exact-model-slug>
61
+ UPGRADELENS_AI_AUTHORIZATION=Bearer <real-openrouter-key>
62
+ UPGRADELENS_AI_TIMEOUT_MS=180000
63
+ ```
64
+
65
+ - `UPGRADELENS_AI_PROVIDER` remains `openai-compatible`; OpenRouter is not hardcoded into the AI core.
66
+ - `UPGRADELENS_AI_ENDPOINT` is the OpenRouter Chat Completions endpoint.
67
+ - `UPGRADELENS_AI_MODEL` is one exact model slug selected by the maintainer. Do not use `openrouter/auto` or `openrouter/free`.
68
+ - `UPGRADELENS_AI_AUTHORIZATION` is `Bearer` followed by the real local OpenRouter key.
69
+ - `UPGRADELENS_AI_TIMEOUT_MS` is the bounded runtime deadline; `180000` is the suggested validation value.
70
+
71
+ No `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, or `GOOGLE_API_KEY` is required by this procedure.
72
+
73
+ ## 5. Loading Environment
74
+
75
+ ### Option A — Node env file
76
+
77
+ Use the local ignored `.env` without relying on any automatic application loader:
78
+
79
+ ```bash
80
+ node --env-file=.env /path/to/UpgradeLens/bin/upgradelens.js \
81
+ analyze-version . \
82
+ --package pypi:langsmith
83
+ ```
84
+
85
+ Replace `/path/to/UpgradeLens` with the maintainer's local checkout path.
86
+
87
+ ### Option B — Shell exports
88
+
89
+ If the OpenRouter key is already present in a private shell variable, export the five UpgradeLens settings explicitly:
90
+
91
+ ```bash
92
+ export UPGRADELENS_AI_PROVIDER="openai-compatible"
93
+ export UPGRADELENS_AI_ENDPOINT="https://openrouter.ai/api/v1/chat/completions"
94
+ export UPGRADELENS_AI_MODEL="<exact-model-slug>"
95
+ export UPGRADELENS_AI_AUTHORIZATION="Bearer ${OPENROUTER_API_KEY}"
96
+ export UPGRADELENS_AI_TIMEOUT_MS="180000"
97
+
98
+ upgradelens analyze-version . --package pypi:langsmith
99
+ ```
100
+
101
+ The placeholders above are documentation only; never paste a real key into a committed file or shared command transcript.
102
+
103
+ ## 6. Preparing Enriched Evidence
104
+
105
+ The maintainer should prepare the target repository before loading the cloud runtime configuration:
106
+
107
+ ```bash
108
+ upgradelens discover .
109
+ upgradelens research .
110
+ ```
111
+
112
+ Confirm that these artifacts exist without printing their full contents:
113
+
114
+ ```text
115
+ .upgradelens/project-manifest.json
116
+ .upgradelens/knowledge-manifest.json
117
+ .upgradelens/knowledge-evidence-bundle.json
118
+ ```
119
+
120
+ The `analyze-version` command reads these artifacts but does not modify them.
121
+
122
+ ## 7. Recommended First Dependency
123
+
124
+ The recommended initial selector is:
125
+
126
+ ```text
127
+ pypi:langsmith
128
+ ```
129
+
130
+ KR-10 found an exact baseline, a target, nearby release notes, and real enriched context for this package. The package is not hardcoded in UpgradeLens; another exact canonical ID can be supplied with `--package`.
131
+
132
+ The selector is exact and case-sensitive. Bare names, wildcard/regex selectors, multiple package values, and automatic package choice are not supported. If one package ID maps to multiple dependency occurrences, the command stops before creating the runtime so the run cannot exceed one dependency call.
133
+
134
+ ## 8. Manual Validation Command
135
+
136
+ With the ignored `.env` populated locally:
137
+
138
+ ```bash
139
+ node --env-file=.env /path/to/UpgradeLens/bin/upgradelens.js \
140
+ analyze-version . \
141
+ --package pypi:langsmith
142
+ ```
143
+
144
+ When UpgradeLens is already linked, the equivalent command is:
145
+
146
+ ```bash
147
+ upgradelens analyze-version . --package pypi:langsmith
148
+ ```
149
+
150
+ ## 9. Expected Checks
151
+
152
+ After the maintainer runs the command, verify all of the following rather than assuming success:
153
+
154
+ - Exactly one runtime call occurred.
155
+ - The selected result has status `analyzed`.
156
+ - The candidate passed structured JSON Schema/Ajv validation.
157
+ - The Trust Layer passed.
158
+ - Every evidence reference belongs to the enriched Evidence Bundle.
159
+ - The output contains no invented URL, API, migration step, or evidence reference.
160
+ - The risk assessment has evidence support.
161
+ - The human-review decision follows the current policy.
162
+ - `.upgradelens/version-analysis.json` is valid.
163
+ - No retry or fallback occurred.
164
+
165
+ These are post-run checks, not claims that the validation has already passed.
166
+
167
+ ## 10. Security
168
+
169
+ - Do not log the key or include it in errors, artifacts, fixtures, documentation, or chat.
170
+ - Do not store the Authorization header in `version-analysis.json` or another report.
171
+ - Do not commit `.env`; only `.env.example` is intended for version control.
172
+ - Do not persist the raw prompt, full evidence payload, or raw provider response in a report.
173
+ - Do not use an automatic model router for this validation.
174
+ - Enriched evidence is sent to a cloud service. The maintainer must explicitly accept this disclosure and use only repositories/evidence permitted to leave the local environment.
175
+
176
+ ## 11. Interpretation
177
+
178
+ One successful request demonstrates only this combined path:
179
+
180
+ ```text
181
+ OpenRouter transport
182
+ + exact selected model
183
+ + enriched evidence
184
+ + structured-output/trust path
185
+ ```
186
+
187
+ It does not prove that:
188
+
189
+ - the model is `CERTIFIED`;
190
+ - the upstream provider route is reproducible;
191
+ - this is the best model;
192
+ - the model is ready for MVP-04 or MVP-05;
193
+ - benchmark quality gates pass.
194
+
195
+ An exact model slug prevents model-level automatic selection, but OpenRouter may still route that model through multiple upstream providers. This setup does not add `provider.only`, `allow_fallbacks: false`, or other OpenRouter-specific request fields because the current adapter has no generic safe request-extra contract. Provider pinning and fallback control belong to a separate gateway-conformance task. This run is therefore not a reproducible locked-provider benchmark.
196
+
197
+ ## 12. Status
198
+
199
+ ```text
200
+ Execution status: NOT RUN
201
+ Qualification status: EXPERIMENTAL
202
+ Production certification: NONE
203
+ ```
204
+
205
+ Tests and live OpenRouter validation were intentionally deferred to the maintainer.
@@ -0,0 +1,131 @@
1
+ # OSS-02 Package Guard Hardening Architecture
2
+
3
+ ## Decision
4
+
5
+ UpgradeLens treats the entries read from the actual gzip tarball produced by
6
+ `npm pack --json` as the package authority. The guard remains a repository release
7
+ check, not a consumer lifecycle hook or a general source-tree scanner.
8
+
9
+ ## 1. Current boundary
10
+
11
+ The existing guard already invokes `npm pack --json`, reads the resulting `.tgz`,
12
+ and validates tar entry paths. It does not rely only on a working-tree walk.
13
+ However, its pure validation layer currently checks only capture exclusions and 20
14
+ required paths. It does not reject copy/backup names, invalid or duplicate manifest
15
+ paths, or packaged untracked implementation files.
16
+
17
+ ## 2. Manifest production and recursion safety
18
+
19
+ `inspectNpmPackage` remains the manifest producer:
20
+
21
+ 1. create isolated temporary pack and npm-cache directories;
22
+ 2. run `npm pack --json --ignore-scripts`;
23
+ 3. read the actual tarball entries;
24
+ 4. correlate those entries with optional Git state;
25
+ 5. run the pure validator;
26
+ 6. delete only the task-owned temporary directory.
27
+
28
+ `--ignore-scripts` makes manifest production independent of package lifecycle
29
+ scripts. The current `package.json` has no `prepack`, `prepare`, `prepublishOnly`, or
30
+ install lifecycle hook, and `check:package` is not invoked by npm lifecycle. Thus
31
+ there is no `check:package → npm pack → prepack → check:package` recursion. Tests
32
+ call the pure validator directly, while one isolated integration test exercises
33
+ actual npm inclusion.
34
+
35
+ ## 3. Protected implementation areas
36
+
37
+ Strict filename and optional untracked-file policy applies to actual packaged files
38
+ under:
39
+
40
+ - `package/bin/`: executable entry points;
41
+ - `package/src/`: runtime implementation and public exports;
42
+ - `package/schemas/`: public data contracts;
43
+ - `package/eval/datasets/`: published evaluation cases;
44
+ - `package/eval/migration-planning/`: published versioned evaluation datasets;
45
+ - `package/eval/schemas/`: published evaluation contracts.
46
+
47
+ `scripts/` and `test/` are repository-only under the current `files` allowlist, so
48
+ they cannot be checked as package entries. Their accidental inclusion would first
49
+ require an explicit package-boundary change. Documentation is still checked by the
50
+ existing capture and general forbidden-entry rules, but is excluded from the
51
+ copy-name grammar because legitimate historical names such as the TS-FIX-01
52
+ duplicate-occurrence architecture document must remain valid.
53
+
54
+ ## 4. Suspicious filename grammar
55
+
56
+ Within protected areas, a basename is suspicious when it has:
57
+
58
+ - a whitespace-delimited numeric copy suffix immediately before its extension,
59
+ including multi-extension files: `runtime 2.js`, `schema 3.schema.json`;
60
+ - a parenthesized numeric suffix: `runtime (2).js`;
61
+ - a terminal copy label delimited by whitespace, hyphen, or underscore:
62
+ `runtime copy.js`, `runtime-copy.js`, `runtime_duplicate.js`;
63
+ - a backup/editor suffix: `~`, `.bak`, `.orig`, `.save`, `.tmp`, `.swp`, `.swo`.
64
+
65
+ The numeric rule requires a copy delimiter and terminal copy position. It therefore
66
+ accepts `sha256.js`, `oauth2.js`, `v2-runtime.js`, `schema-v2.json`,
67
+ `mp-r02-policy.js`, `python3.md`, and `fixture-2fa.json`.
68
+
69
+ ## 5. Portable path policy
70
+
71
+ The pure validator first rejects absolute paths, drive-letter paths, NUL bytes,
72
+ empty/dot segments, parent traversal, and paths outside the npm `package/` root.
73
+ Backslashes are normalized to `/` only after the original path has passed the
74
+ absolute/traversal checks. It then detects duplicate normalized entries before
75
+ deduplication and sorts diagnostics by stable reason code and portable path.
76
+
77
+ ## 6. Git-state policy
78
+
79
+ The release command asks Git for tracked entries and untracked non-ignored entries.
80
+ In strict release mode, an actual packaged untracked regular file under a protected
81
+ area fails with `UNEXPECTED_PACKAGED_UNTRACKED_IMPLEMENTATION_FILE`.
82
+
83
+ Git absence or a source archive without `.git` is represented explicitly as
84
+ `GIT_METADATA_UNAVAILABLE`; it does not fail package-content validation by itself.
85
+ Suspicious filename, required-asset, forbidden-entry, invalid-path, and duplicate
86
+ entry rules remain authoritative without Git. Git command errors other than
87
+ repository absence are surfaced as operational errors, not silently treated as a
88
+ clean tracked state. There is no generated-file allowlist because the current
89
+ package has no repository-owned generated public implementation path.
90
+
91
+ ## 7. Diagnostics and exit contract
92
+
93
+ The validator returns a frozen structured result with normalized entries, summary,
94
+ Git state, and violations. Every violation has a stable `code` and relative portable
95
+ `path`. Policy failures render:
96
+
97
+ ```text
98
+ Package guard failed.
99
+
100
+ REASON_CODE
101
+ - relative/path
102
+ ```
103
+
104
+ Reasons and paths are sorted, output is bounded, totals are retained in the
105
+ structured result, file contents are never printed, and the script exits non-zero.
106
+ Pass output reports package entry count, zero suspicious artifacts, and the single
107
+ authoritative required-asset count.
108
+
109
+ ## 8. Isolated adversarial tests
110
+
111
+ Pure unit tests use in-memory manifest entries. The npm-boundary integration test
112
+ creates an isolated temporary package containing an untracked `src/runtime 2.js`,
113
+ runs npm pack with lifecycle scripts disabled, proves npm includes the file, and
114
+ passes those actual tar entries to the validator. Temporary fixtures and npm caches
115
+ live outside the repository and are removed by the test. Mutation checks compare
116
+ fixture bytes before and after validation.
117
+
118
+ ## 9. Manifest determinism layer
119
+
120
+ The validator sorts normalized entries and diagnostics, detects duplicate normalized
121
+ paths, and produces byte-identical structured/rendered results for reversed input.
122
+ Release validation may repeat `npm pack` and compare actual entry inventories.
123
+ Neither a file count nor a tarball digest is a permanent business invariant.
124
+
125
+ ## 10. Explicit scope boundary
126
+
127
+ OSS-02 preserves the existing required assets, capture exclusion, `.env`, local
128
+ artifact, credential/authorization-file, qualification-input/record, bin, and export
129
+ target checks. It adds structural package hygiene only. It does not inspect arbitrary
130
+ file content, detect malware, scan secrets generally, alter product behavior, pin a
131
+ manifest snapshot, delete findings, or run on consumer installation.
@@ -0,0 +1,142 @@
1
+ # OSS-04 Public CI and Package Metadata Architecture
2
+
3
+ ## Status and scope
4
+
5
+ This decision defines read-only public continuous integration and npm/GitHub
6
+ metadata for UpgradeLens `0.5.0`. It does not change runtime, schema, evaluation,
7
+ upgrade-decision, or Migration Checklist policy. It also does not publish a package,
8
+ create a release, or mutate repository state.
9
+
10
+ ## Workflow triggers
11
+
12
+ CI runs for every `pull_request`, pushes to `main` and `develop`, and manual
13
+ `workflow_dispatch` requests. Both long-lived branches exist locally and on the
14
+ canonical remote. Pull requests are the primary review gate; direct pushes are
15
+ covered so the protected branch state is independently validated. There is no
16
+ schedule because OSS-04 has no time-based check or dependency-update policy.
17
+
18
+ `pull_request_target` is prohibited. Fork code therefore runs only in the ordinary
19
+ pull-request context with a read-only token and no repository secrets.
20
+
21
+ ## Supported Node matrix
22
+
23
+ The package declares `node >=20`, so CI does not narrow the engine contract. The
24
+ mandatory compatibility matrix is:
25
+
26
+ - Node 20: the declared minimum, retained as a compatibility floor even though its
27
+ upstream support window ended on 2026-04-30;
28
+ - Node 22: the newer maintenance LTS line, supported through 2027-04-30;
29
+ - Node 24: the current active LTS line, supported through 2028-04-30.
30
+
31
+ The dates come from the official
32
+ [Node.js release schedule](https://github.com/nodejs/Release/blob/main/schedule.json).
33
+ Node 26 is Current until October 2026, not LTS at this decision date, so it is not a
34
+ mandatory preview gate. The Node 24 package-smoke job is the primary release-line
35
+ check. Node 20 remains visible rather than being silently removed; changing the
36
+ minimum engine is a separate compatibility and release-policy decision.
37
+
38
+ ## Action supply-chain policy
39
+
40
+ Only GitHub-maintained `actions/checkout` and `actions/setup-node` are used. Each is
41
+ pinned to the full commit currently referenced by its supported `v6` release line,
42
+ with the major version retained in a comment:
43
+
44
+ - `actions/checkout`: `df4cb1c069e1874edd31b4311f1884172cec0e10`;
45
+ - `actions/setup-node`: `249970729cb0ef3589644e2896645e5dc5ba9c38`.
46
+
47
+ Full SHA pinning makes a reviewed workflow revision immutable. The trade-off is
48
+ that action security and runtime updates require an explicit pull request instead
49
+ of arriving through a moving major tag. No third-party action is needed.
50
+
51
+ Checkout disables credential persistence because no later step performs an
52
+ authenticated Git operation. Setup Node uses the committed lockfile as the explicit
53
+ npm cache dependency.
54
+
55
+ ## Permissions, fork safety, and provider isolation
56
+
57
+ Workflow permissions are exactly `contents: read`. There is no write, package,
58
+ identity-token, security-event, issue, or pull-request permission. Jobs do not read
59
+ `secrets`, call a write API, interpolate pull-request-controlled fields into shell
60
+ commands, upload artifacts, or retain credentials.
61
+
62
+ The test job sets `CI=true` and shadows supported UpgradeLens provider variables
63
+ with empty values. This prevents a runner or repository environment from supplying
64
+ an inherited endpoint, model, authorization value, timeout, or debug mode. Tests
65
+ continue to inject their own deterministic fake environments where required.
66
+ Neither CI job needs OpenAI, OpenRouter, Anthropic, Ollama, a local qualification
67
+ record, private repository access, or any real-provider credential.
68
+
69
+ ## Install, test, and package-smoke stages
70
+
71
+ The matrix job performs:
72
+
73
+ 1. read-only checkout;
74
+ 2. Node setup with npm cache;
75
+ 3. deterministic `npm ci`;
76
+ 4. the canonical `npm test`;
77
+ 5. `npm run check:package`, which creates and validates an actual tarball with
78
+ lifecycle scripts disabled.
79
+
80
+ No lint, typecheck, or build command is invented because the repository defines
81
+ none. Local matrix replay found that Node 20's default test-runner concurrency can
82
+ starve one real keep-alive lifecycle test past its unchanged three-second natural
83
+ exit budget. The same test passes alone, and the complete Node 20 suite passes when
84
+ the canonical npm test script receives `--test-concurrency=2`. CI applies that
85
+ bounded runner concurrency only on Node 20; it does not skip the test, increase its
86
+ timeout, or alter product behavior. Node 22 and Node 24 use plain `npm test`.
87
+
88
+ The Node 24 package-smoke job performs:
89
+
90
+ 1. the same checkout, setup, and deterministic install;
91
+ 2. `npm pack --dry-run --json --ignore-scripts`;
92
+ 3. a repository-owned Node script that creates an actual tarball in an isolated
93
+ cache/output directory;
94
+ 4. actual-manifest package-guard validation and tar extraction;
95
+ 5. a clean, lifecycle-disabled install from that tarball;
96
+ 6. installed CLI `--version` and `--help`;
97
+ 7. ESM package import and the existing 438-public-export contract;
98
+ 8. cleanup of all task-owned temporary state in `finally`.
99
+
100
+ The package smoke does not call the product analysis workflow, a provider, a
101
+ publisher, or a deployment target. No tarball is uploaded as an Actions artifact;
102
+ logs contain only bounded verification summaries, so artifact retention is zero.
103
+
104
+ ## Lifecycle and side-effect boundary
105
+
106
+ `package.json` has no `prepack`, `prepare`, `prepublishOnly`, `preinstall`,
107
+ `install`, or `postinstall` hook. The package guard calls
108
+ `npm pack --json --ignore-scripts`, so `check:package` cannot recurse through an npm
109
+ lifecycle. Consumer installation in the smoke also uses `--ignore-scripts`.
110
+
111
+ The workflow contains no `npm publish`, Git tag, release creation, commit, push,
112
+ deployment, PR comment, or generated-file writeback. It cannot publish because it
113
+ has neither a publishing command nor write/OIDC credentials.
114
+
115
+ ## Concurrency, cancellation, and timeout
116
+
117
+ The concurrency group uses the workflow name and stable Git ref. A newer commit on
118
+ the same branch or pull-request ref cancels the older run. Different branches and
119
+ pull requests remain independent.
120
+
121
+ Each job has a 20-minute timeout. This allows deterministic install and the
122
+ canonical suite reasonable runner variance while bounding dependency, listener, or
123
+ subprocess hangs. The package smoke has the same finite ceiling.
124
+
125
+ ## Package metadata ownership and lockfile policy
126
+
127
+ `package.json` owns the public npm description, repository, homepage, issue URL,
128
+ keywords, version, engine, executable, export, license, and package-content
129
+ boundary. OSS-04 updates only stale positioning and missing public discovery
130
+ metadata.
131
+
132
+ `package-lock.json` mirrors dependency-tree and root-package fields that npm records.
133
+ Description, homepage, bugs, and keywords are not forced into the lockfile. A
134
+ lockfile-only npm consistency check must produce no dependency, resolved, integrity,
135
+ or version drift.
136
+
137
+ ## Hosted acceptance
138
+
139
+ Static validation and local command replay can prove the workflow contract but
140
+ cannot prove a hosted run. After a maintainer commits and pushes the change, every
141
+ Node matrix job and the Node 24 package-smoke job must pass at the recorded commit
142
+ before branch protection or the next qualification gate treats CI as hosted proof.
@@ -0,0 +1,98 @@
1
+ # npm package content policy
2
+
3
+ DepVerdict treats the tarball produced by `npm pack` as the authoritative
4
+ public package boundary. Repository evidence can remain tracked without
5
+ becoming npm consumer content.
6
+
7
+ ## Included content
8
+
9
+ `package.json.files` explicitly includes the executable, public runtime source,
10
+ schemas, evaluation datasets, user-facing documentation, license, and README.
11
+ The package guard additionally requires critical assets such as:
12
+
13
+ - `bin/depverdict.js`, the bounded `bin/upgradelens.js` compatibility wrapper,
14
+ and the public runtime entry points;
15
+ - the current architecture overview, identity-migration decision,
16
+ UpgradeLens-to-DepVerdict guide, preview release draft, and migration report;
17
+ - Migration Planning qualification and extractive-candidate schemas;
18
+ - Migration Planning v1 and v2 golden datasets;
19
+ - CLI progress, qualification-resolution, and package-policy documentation.
20
+
21
+ The guard reads actual gzip tar entries from a fresh
22
+ `npm pack --json --ignore-scripts`; it does not infer package contents from the
23
+ working tree. Lifecycle scripts are disabled for manifest production so a future
24
+ `prepack` hook cannot recurse into the guard.
25
+
26
+ ## Repository-only CLI capture evidence
27
+
28
+ CLI transcripts, screenshots, environment summaries, and manifests use the
29
+ direct-child convention:
30
+
31
+ ```text
32
+ docs/*-cli-captures/
33
+ ```
34
+
35
+ They are retained in Git for release review but excluded by the path-specific
36
+ `package.json.files` rule:
37
+
38
+ ```text
39
+ !docs/*-cli-captures
40
+ ```
41
+
42
+ The rule intentionally does not exclude all documentation. User-facing
43
+ Markdown remains package-visible.
44
+
45
+ Capture helper programs under `scripts/` or `tools/` are also repository-only.
46
+ Those directories are outside the package allowlist. The guard recognizes
47
+ known release capture trees, the future direct-child naming convention, and
48
+ capture-helper path patterns as forbidden tarball entries.
49
+
50
+ ## Validation
51
+
52
+ Run:
53
+
54
+ ```text
55
+ npm run check:package
56
+ ```
57
+
58
+ The check fails when an actual tarball:
59
+
60
+ - contains a capture, environment, credential-file, local-machine, or private
61
+ qualification artifact;
62
+ - omits any required public asset;
63
+ - contains an invalid, traversing, absolute, or duplicate normalized entry;
64
+ - contains numeric-copy, parenthesized-copy, copy/duplicate-label, or backup
65
+ filenames in packaged runtime, executable, schema, or evaluation areas; or
66
+ - contains a protected implementation file that is not tracked by Git during a
67
+ strict release check.
68
+
69
+ Git correlation is supplemental. In a source archive without Git metadata, the
70
+ structural tarball rules still run and Git absence does not fail by itself. The
71
+ filename grammar is copy-suffix-specific: legitimate names such as `sha256.js`,
72
+ `oauth2.js`, `v2-runtime.js`, and `schema-v2.json` remain valid. Documentation is
73
+ outside strict copy-name matching so intentional historical document identities are
74
+ preserved.
75
+
76
+ `npm run check` runs the repository tests and this package check. Focused guard
77
+ tests also verify stable path normalization, the future capture convention,
78
+ missing-required-asset failures, invalid paths, deterministic diagnostics,
79
+ tracked/untracked policy, valid numeric-name false positives, and an isolated npm
80
+ tarball that contains an untracked numeric-copy artifact.
81
+
82
+ The guard reports findings and exits non-zero; it never deletes or rewrites them.
83
+ Investigate ownership and content before cleanup.
84
+
85
+ Package validation for a release should inspect the real tar entries, perform
86
+ an isolated install of the produced tarball, and smoke-test the packaged
87
+ version, help, public import, and default analysis command. Generated tarballs,
88
+ installation directories, caches, and raw provider data are never committed.
89
+
90
+ ## Privacy and compatibility
91
+
92
+ Capture evidence must be sanitized before staging: no credentials,
93
+ authorization material, private endpoints, raw provider payloads, hidden
94
+ reasoning, or machine-specific absolute paths. Exclusion from npm is a package
95
+ size and privacy boundary, not a substitute for repository privacy review.
96
+
97
+ This policy changes only package composition. It does not alter qualification,
98
+ progress, impact, evidence, migration-planning, or provider semantics.