@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.
- package/LICENSE +21 -0
- package/README.md +518 -0
- package/bin/depverdict.js +7 -0
- package/bin/upgradelens.js +7 -0
- package/docs/GR-01-Semantic-Grounding-Failure-Analysis.md +309 -0
- package/docs/GR-02-Versioned-Action-Evaluation-Criteria.md +187 -0
- package/docs/GR-03-Extractive-Contract-Safety-Experiment.md +242 -0
- package/docs/GR-04-Versioned-Production-Extractive-Contract.md +154 -0
- package/docs/IA-01-Repository-Usage-Discovery.md +122 -0
- package/docs/IA-02-Repository-Impact-Analysis.md +118 -0
- package/docs/IA-03-Repository-Impact-Evidence.md +160 -0
- package/docs/IA-04-CLI-Orchestration.md +235 -0
- package/docs/IA-05-Real-Provider-Validation.md +235 -0
- package/docs/IA-05-VinGrade-Validation.md +339 -0
- package/docs/MVP-01.md +48 -0
- package/docs/MVP-02-Architecture.md +536 -0
- package/docs/MVP-02-CLI-HTTP-Runtime.md +50 -0
- package/docs/MVP-02-HTTP-Lifecycle.md +37 -0
- package/docs/MVP-02-Knowledge-Manifest-Generation.md +75 -0
- package/docs/MVP-02-Knowledge-Manifest.md +279 -0
- package/docs/MVP-02-Knowledge-Research-Orchestration.md +62 -0
- package/docs/MVP-02-Knowledge-Store.md +87 -0
- package/docs/MVP-02-PyPI-Registry-Adapter.md +97 -0
- package/docs/MVP-02-Research-Planning.md +196 -0
- package/docs/MVP-02-Source-Provenance.md +81 -0
- package/docs/MVP-02-npm-Registry-Adapter.md +99 -0
- package/docs/RR-01-End-to-End-and-Real-Provider-Validation.md +393 -0
- package/docs/RR-01-RERUN-Extractive-Contract-Validation.md +566 -0
- package/docs/RR-02-Full-Product-Workflow-and-Developer-CLI-UX-Review.md +35 -0
- package/docs/RR02-FIX-01-Persistent-Qualification-Resolution.md +32 -0
- package/docs/RR02-FIX-02-Stage-aware-CLI-Progress-and-Heartbeat.md +28 -0
- package/docs/RR02-FIX-03-npm-Capture-Evidence-Exclusion.md +33 -0
- package/docs/RR02-FIX-03A-Complete-Package-Exclusion-and-Evidence-Commit.md +223 -0
- package/docs/RR02-FIX-04-Event-loop-safe-Heartbeat.md +393 -0
- package/docs/RR02-FIX-05-Materialize-Persisted-Qualification.md +207 -0
- package/docs/RR02-RERUN-CLI-Qualification-Progress-UX-and-Package-Validation.md +342 -0
- package/docs/VinGrade-MVP-02-Validation.md +480 -0
- package/docs/VinGrade-RC02-Live-Validation.md +273 -0
- package/docs/ai-capability-discovery.md +573 -0
- package/docs/ai-engineering-production-readiness.md +390 -0
- package/docs/ai-engineering-review.md +251 -0
- package/docs/ai-runtime-governance-discovery.md +754 -0
- package/docs/architecture-overview.md +78 -0
- package/docs/cli-progress.md +111 -0
- package/docs/decisions/diff-01-brand-distribution-identity.md +450 -0
- package/docs/decisions/diff-02-identity-compatibility-contract.md +274 -0
- package/docs/decisions/diff-03-repository-docs-community-migration.md +165 -0
- package/docs/decisions/diff-04-release-evidence-gap-acceptance.md +110 -0
- package/docs/discovery/mvp-05-ai-migration-planning-discovery.md +350 -0
- package/docs/gateway-runtime-discovery.md +614 -0
- package/docs/live-ai-validation.md +299 -0
- package/docs/migration-planning-qualification-resolution.md +99 -0
- package/docs/migrations/upgradelens-to-depverdict.md +97 -0
- package/docs/mp-r03-deterministic-upgrade-decision-architecture.md +135 -0
- package/docs/mp-r04-evidence-bounded-migration-handoff-architecture.md +116 -0
- package/docs/mp-r05-product-completion-and-decision-first-cli-architecture.md +162 -0
- package/docs/mvp-05-deterministic-context-runtime.md +127 -0
- package/docs/mvp-05-migration-checklist-contract.md +166 -0
- package/docs/mvp-05-migration-checklist-orchestration.md +105 -0
- package/docs/mvp-05-migration-evaluation-and-qualification.md +135 -0
- package/docs/mvp-05-provider-neutral-generator.md +79 -0
- package/docs/ollama-local-smoke-validation.md +156 -0
- package/docs/openai-compatible-runtime-discovery.md +789 -0
- package/docs/openrouter-one-dependency-validation.md +205 -0
- package/docs/oss-02-package-guard-hardening-architecture.md +131 -0
- package/docs/oss-04-public-ci-package-metadata-architecture.md +142 -0
- package/docs/package-content-policy.md +98 -0
- package/docs/releases/v0.5.0-technical-preview.md +114 -0
- package/docs/releases/v0.6.0-alpha.1-depverdict-preview.md +101 -0
- package/docs/reviews/diff-02-identity-contract-compatibility.md +413 -0
- package/docs/reviews/diff-03-repository-docs-community-migration.md +364 -0
- package/docs/reviews/diff-04-depverdict-distribution-identity-readiness-rereview.md +453 -0
- package/docs/reviews/diff-04-fix-post-rename-identity-release-remediation.md +310 -0
- package/docs/reviews/diff-05-final-preview-distribution-qualification.md +561 -0
- package/docs/reviews/mvp-05-final-product-value-workflow-rereview.md +471 -0
- package/docs/reviews/mvp-05-product-workflow-review.md +605 -0
- package/docs/reviews/oss-01-duplicate-artifact-investigation-cleanup.md +411 -0
- package/docs/reviews/oss-02-package-guard-hardening.md +303 -0
- package/docs/reviews/oss-03-community-scaffolding.md +378 -0
- package/docs/reviews/oss-04-public-ci-package-metadata.md +439 -0
- package/docs/reviews/oss-05-technical-preview-qualification.md +482 -0
- package/docs/reviews/upgradelens-vs-upgradedepdetective-source-comparison.md +355 -0
- package/docs/reviews/v0.5.0-pre-release-smoke.md +263 -0
- package/docs/reviews/v0.5.0-version-bump-release-verification.md +306 -0
- package/docs/runtime-contract-discovery.md +521 -0
- package/docs/structured-output-compatibility-report.md +100 -0
- package/docs/ts-fix-01-exact-duplicate-occurrence-target-selection-architecture.md +111 -0
- package/docs/version-analysis-architecture.md +827 -0
- package/eval/README.md +86 -0
- package/eval/datasets/generic/declared-constraint.json +59 -0
- package/eval/datasets/generic/evidence-conflict.json +73 -0
- package/eval/datasets/generic/major-breaking-release.json +66 -0
- package/eval/datasets/generic/missing-evidence.json +46 -0
- package/eval/datasets/generic/patch-release-low.json +59 -0
- package/eval/datasets/node/axios-patch-low.json +59 -0
- package/eval/datasets/node/react-major-breaking.json +66 -0
- package/eval/datasets/node/react-minor-compatibility.json +66 -0
- package/eval/datasets/python/fastapi-deprecation.json +66 -0
- package/eval/datasets/python/pydantic-major-breaking.json +66 -0
- package/eval/migration-planning/golden-dataset-v2.json +306 -0
- package/eval/migration-planning/golden-dataset.json +214 -0
- package/eval/schemas/expected-result.schema.json +88 -0
- package/eval/schemas/golden-case.schema.json +181 -0
- package/package.json +57 -0
- package/schemas/ai-scorecard.schema.json +132 -0
- package/schemas/benchmark-report.schema.json +189 -0
- package/schemas/benchmark.schema.json +55 -0
- package/schemas/capability-profile.schema.json +44 -0
- package/schemas/conformance-report.schema.json +150 -0
- package/schemas/deployment-profile.schema.json +64 -0
- package/schemas/evaluation-report.schema.json +158 -0
- package/schemas/knowledge-evidence-bundle.schema.json +150 -0
- package/schemas/knowledge-manifest.schema.json +548 -0
- package/schemas/metrics.schema.json +178 -0
- package/schemas/migration-checklist-extractive-candidate.schema.json +42 -0
- package/schemas/migration-checklist.schema.json +706 -0
- package/schemas/migration-evaluation-dataset-v2.schema.json +208 -0
- package/schemas/migration-evaluation-dataset.schema.json +204 -0
- package/schemas/migration-planning-qualification-record.schema.json +234 -0
- package/schemas/project-manifest.schema.json +308 -0
- package/schemas/qualification-record.schema.json +56 -0
- package/schemas/repository-impact-evidence.schema.json +232 -0
- package/schemas/repository-impact.schema.json +202 -0
- package/schemas/upgrade-decision.schema.json +273 -0
- package/schemas/usage-index.schema.json +179 -0
- package/schemas/version-analysis.schema.json +449 -0
- package/src/ai-runtime-debug.js +325 -0
- package/src/ai-runtime-error.js +42 -0
- package/src/ai-runtime.js +174 -0
- package/src/ai-scorecard.js +204 -0
- package/src/ai-version-analysis.js +484 -0
- package/src/artifact-root-compatibility.js +91 -0
- package/src/benchmark-report.js +111 -0
- package/src/benchmark-runner.js +191 -0
- package/src/canonical-json.js +69 -0
- package/src/cli.js +1299 -0
- package/src/conformance-report.js +158 -0
- package/src/conformance-runner.js +253 -0
- package/src/constants.js +73 -0
- package/src/cooperative-scheduler.js +79 -0
- package/src/dependencies.js +44 -0
- package/src/dependency-ai-context.js +625 -0
- package/src/detectors.js +253 -0
- package/src/discovery.js +234 -0
- package/src/ecosystem-version-adapter.js +294 -0
- package/src/environment-compatibility.js +77 -0
- package/src/evaluation-comparator.js +158 -0
- package/src/evaluation-report.js +76 -0
- package/src/evaluation-runner.js +248 -0
- package/src/evidence-source-adapter.js +472 -0
- package/src/files.js +89 -0
- package/src/governance-diagnostics.js +64 -0
- package/src/governance-loader.js +63 -0
- package/src/governance-metadata.js +346 -0
- package/src/governance-validator.js +360 -0
- package/src/http/bounded-fetch.js +278 -0
- package/src/http/cli-http-runtime.js +44 -0
- package/src/impact/input-loader.js +157 -0
- package/src/impact/matcher.js +40 -0
- package/src/impact/repository-impact.js +199 -0
- package/src/impact/runtime.js +24 -0
- package/src/impact/status.js +62 -0
- package/src/impact/writer.js +30 -0
- package/src/impact-evidence/input-loader.js +202 -0
- package/src/impact-evidence/repository-impact-evidence.js +234 -0
- package/src/impact-evidence/runtime.js +16 -0
- package/src/impact-evidence/writer.js +30 -0
- package/src/index.js +563 -0
- package/src/installed-version-baseline.js +196 -0
- package/src/knowledge-cache.js +324 -0
- package/src/knowledge-evidence-bundle.js +101 -0
- package/src/knowledge-evidence-producer.js +233 -0
- package/src/knowledge-manifest-builder.js +188 -0
- package/src/knowledge-manifest-writer.js +32 -0
- package/src/knowledge-manifest.js +255 -0
- package/src/knowledge-research.js +615 -0
- package/src/metrics-engine.js +205 -0
- package/src/migration-checklist/ai-candidate.js +320 -0
- package/src/migration-checklist/assembler.js +37 -0
- package/src/migration-checklist/context-runtime.js +828 -0
- package/src/migration-checklist/evaluation/action-criteria.js +244 -0
- package/src/migration-checklist/evaluation/comparator-v2.js +332 -0
- package/src/migration-checklist/evaluation/comparator.js +279 -0
- package/src/migration-checklist/evaluation/dataset-v2.js +227 -0
- package/src/migration-checklist/evaluation/dataset.js +336 -0
- package/src/migration-checklist/evaluation/extractive-fixtures-v2.js +148 -0
- package/src/migration-checklist/evaluation/metrics-v2.js +226 -0
- package/src/migration-checklist/evaluation/metrics.js +158 -0
- package/src/migration-checklist/evaluation/qualification-v2.js +321 -0
- package/src/migration-checklist/evaluation/qualification.js +239 -0
- package/src/migration-checklist/evaluation/runner-v2.js +294 -0
- package/src/migration-checklist/evaluation/runner.js +194 -0
- package/src/migration-checklist/evaluation/scorecard-v2.js +106 -0
- package/src/migration-checklist/evaluation/scorecard.js +86 -0
- package/src/migration-checklist/extractive-candidate.js +166 -0
- package/src/migration-checklist/extractive-prompt.js +62 -0
- package/src/migration-checklist/generator.js +702 -0
- package/src/migration-checklist/grounding-policy.js +117 -0
- package/src/migration-checklist/input-loader.js +613 -0
- package/src/migration-checklist/migration-checklist.js +635 -0
- package/src/migration-checklist/presentation.js +292 -0
- package/src/migration-checklist/progress.js +96 -0
- package/src/migration-checklist/prompt.js +83 -0
- package/src/migration-checklist/qualification-guard.js +462 -0
- package/src/migration-checklist/qualification-resolution.js +122 -0
- package/src/migration-checklist/qualification-store.js +225 -0
- package/src/migration-checklist/runtime.js +205 -0
- package/src/migration-checklist/verification.js +134 -0
- package/src/migration-checklist/writer.js +35 -0
- package/src/openai-compatible-provider.js +451 -0
- package/src/orchestration/failure-log.js +32 -0
- package/src/orchestration/pipeline.js +200 -0
- package/src/orchestration/progress-events.js +337 -0
- package/src/orchestration/progress-reporter.js +131 -0
- package/src/orchestration/text-writer.js +22 -0
- package/src/portable.js +13 -0
- package/src/product-completion.js +249 -0
- package/src/project-manifest-input.js +90 -0
- package/src/project-manifest.js +141 -0
- package/src/python-requirements.js +137 -0
- package/src/registry/npm-packument.js +256 -0
- package/src/registry/npm-registry-adapter.js +262 -0
- package/src/registry/pypi-project.js +300 -0
- package/src/registry/pypi-registry-adapter.js +235 -0
- package/src/registry/sanitize-registry-body.js +51 -0
- package/src/renderers/console.js +160 -0
- package/src/renderers/impact-presentation.js +278 -0
- package/src/renderers/markdown.js +172 -0
- package/src/research-plan.js +455 -0
- package/src/runtime-conformance.js +275 -0
- package/src/source-provenance.js +393 -0
- package/src/source-url.js +62 -0
- package/src/structured-output-schema.js +66 -0
- package/src/target-selector.js +306 -0
- package/src/upgrade-decision/input-loader.js +107 -0
- package/src/upgrade-decision/presentation.js +43 -0
- package/src/upgrade-decision/runtime.js +21 -0
- package/src/upgrade-decision/upgrade-decision.js +626 -0
- package/src/upgrade-decision/writer.js +30 -0
- package/src/usage/analyzer-registry.js +63 -0
- package/src/usage/coverage.js +116 -0
- package/src/usage/input-loader.js +139 -0
- package/src/usage/js/analyzer.js +240 -0
- package/src/usage/js/parser.js +21 -0
- package/src/usage/runtime.js +187 -0
- package/src/usage/scope.js +44 -0
- package/src/usage/source-files.js +50 -0
- package/src/usage/usage-index.js +217 -0
- package/src/usage/writer.js +31 -0
- package/src/version-analysis-loader.js +203 -0
- package/src/version-analysis-manifest.js +314 -0
- package/src/version-analysis-writer.js +30 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# IA-05 — VinGrade Real-world Validation
|
|
2
|
+
|
|
3
|
+
## 1. Executive conclusion
|
|
4
|
+
|
|
5
|
+
**NO-GO**
|
|
6
|
+
|
|
7
|
+
The IA-04 scheduler can run all seven stages and publish a schema-valid, exact-lineage artifact chain on the real VinGrade repository. Project Discovery and JavaScript/TypeScript Usage Discovery performed well in manual source checks: all eight requested dependencies were found correctly, at least five artifact-first usage samples were confirmed, and at least five source-first searches were present in the Usage Index.
|
|
8
|
+
|
|
9
|
+
MVP-04 should not be accepted yet for two reasons:
|
|
10
|
+
|
|
11
|
+
1. The successful offline cache-miss run had 47 of 47 Version Analysis results skipped, but the console and Markdown report presented `Impacted: No` for every dependency without disclosing that no dependency had actually been analyzed. This is false reassurance, not merely a cosmetic limitation.
|
|
12
|
+
2. With identical repository, options, and offline cache-miss state, `researchId`, all 47 `contextId` values, and all 47 Version Analysis result IDs changed between runs. Business payloads and Markdown were deterministic, but the stable IDs were not.
|
|
13
|
+
|
|
14
|
+
The final artifacts contain no breaking findings, so real-world Impact matching and finding-level Evidence correctness could not be proven. A one-package local-model probe produced schema-valid but factually weak React findings, confirming that upstream knowledge/model quality is also a material validation constraint.
|
|
15
|
+
|
|
16
|
+
No UpgradeLens or VinGrade source fix was made during IA-05.
|
|
17
|
+
|
|
18
|
+
## 2. Environment
|
|
19
|
+
|
|
20
|
+
| Item | Value |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| UpgradeLens repository | current UpgradeLens checkout |
|
|
23
|
+
| UpgradeLens branch | `feat/mv-04-knowledge-evidence` |
|
|
24
|
+
| UpgradeLens commit | `e0f0e447aa7d43defb0d97a1c1439fb858634804` |
|
|
25
|
+
| UpgradeLens state | IA-04 working-tree implementation present and uncommitted |
|
|
26
|
+
| UpgradeLens package | `upgradelens@0.2.0` |
|
|
27
|
+
| VinGrade repository | isolated VinGrade checkout |
|
|
28
|
+
| VinGrade identity | README title `VinGrade`; package `vingrade-frontend` |
|
|
29
|
+
| VinGrade branch | `feat/knowledege-rubric-criteria` |
|
|
30
|
+
| VinGrade commit | `25811ef997fcf45810105e89e4500688f28f7ba5` |
|
|
31
|
+
| VinGrade last commit | `2026-07-10T10:47:47+07:00`, `merge develop` |
|
|
32
|
+
| Node.js | `v26.0.0` |
|
|
33
|
+
| Local Ollama | `0.23.0`; service was started for probes and stopped afterward |
|
|
34
|
+
|
|
35
|
+
This VinGrade checkout was selected over other local polyglot repositories because its README explicitly identifies VinGrade, its frontend package is named `vingrade-frontend`, and its branch and commit match prior VinGrade validation context. No second VinGrade checkout was found.
|
|
36
|
+
|
|
37
|
+
### Baseline safety state
|
|
38
|
+
|
|
39
|
+
Before validation, VinGrade already had the following Git state:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
D Makefile
|
|
43
|
+
?? .agents/skills/
|
|
44
|
+
?? .aider.chat.history.md
|
|
45
|
+
?? .aider.input.history
|
|
46
|
+
?? .aider.tags.cache.v4/
|
|
47
|
+
?? .upgradelens/
|
|
48
|
+
?? FE/public/pitch/
|
|
49
|
+
?? PROJECT_DESCRIPTION.md
|
|
50
|
+
?? docs/architecture/legacy-architecture-audit.md
|
|
51
|
+
?? docs/architecture/prompt-management-audit.md
|
|
52
|
+
?? docs/architecture/teaching-intelligence-roadmap.md
|
|
53
|
+
?? docs/architecture/teaching-intelligence-systematic-review.md
|
|
54
|
+
?? docs/migration/
|
|
55
|
+
?? docs/reports/ai-quality-architecture-review.md
|
|
56
|
+
?? docs/reports/project-discovery-report.md
|
|
57
|
+
?? presentation/vingrade-pitch-speaker-notes.md
|
|
58
|
+
?? skills-lock.json
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The deleted tracked `Makefile` and all unrelated untracked paths predated IA-05.
|
|
62
|
+
|
|
63
|
+
Four old UpgradeLens artifacts existed. Their timestamps were from 2026-07-16 01:24–01:32 local time, and the old Version Analysis contained only one result. The complete old `.upgradelens` directory was moved intact to:
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
$TMPDIR/vingrade-ia05-before-20260716-validated
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The online research cache generated during IA-05 was later moved intact to:
|
|
70
|
+
|
|
71
|
+
```text
|
|
72
|
+
$TMPDIR/vingrade-ia05-online-cache-20260716
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
This allowed the final two runs to exercise the same clean offline cache-miss state without mixing old artifacts.
|
|
76
|
+
|
|
77
|
+
## 3. Pipeline result
|
|
78
|
+
|
|
79
|
+
The CLI was invoked directly from the current UpgradeLens working tree:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
node ./bin/upgradelens.js analyze <VINGRADE_REPO>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
| Run | Mode | Result | Exit | Details |
|
|
86
|
+
| --- | --- | --- | ---: | --- |
|
|
87
|
+
| Initial smoke | Online research, no AI configuration | Failed at Version Analysis | 1 | Discovery and Research passed; `UPGRADELENS_AI_ENDPOINT` was unset |
|
|
88
|
+
| Cache retry | `--offline`, fresh cache from online run | Failed at Version Analysis | 1 | 45 cache hits; failure was independent of registry access |
|
|
89
|
+
| Local qwen3 attempt | Offline, `qwen3:latest`, 180 s timeout | Operator-stopped after reproducible package timeout | 130 | First request was truncated from 5,316 to 4,096 tokens and returned HTTP 500 at 180 s |
|
|
90
|
+
| React probe | `analyze-version --package npm:react`, `qwen2.5-coder:7b` | Completed | 0 | One schema-valid result; quality concerns documented below |
|
|
91
|
+
| Full qwen2.5 attempt | Offline, `qwen2.5-coder:7b`, 180 s timeout | Operator-stopped | 130 | First full-run request timed out at 180 s; continuing 46 sequential requests was not useful validation |
|
|
92
|
+
| Degraded end-to-end run 1 | Offline cache miss, no AI call required | Completed all seven stages | 0 | 47 deterministic skipped Version Analysis results |
|
|
93
|
+
| Degraded end-to-end run 2 | Same repository/options/cache state | Completed all seven stages | 0 | Used for determinism comparison |
|
|
94
|
+
|
|
95
|
+
The successful runs reported:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
✓ Project Discovery
|
|
99
|
+
✓ Knowledge Research
|
|
100
|
+
✓ Version Analysis
|
|
101
|
+
✓ Repository Usage Discovery
|
|
102
|
+
✓ Repository Impact Analysis
|
|
103
|
+
✓ Repository Impact Evidence
|
|
104
|
+
✓ Markdown Report
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
All required final files exist, JSON files parse, and the Markdown report is non-empty:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
.upgradelens/project-manifest.json
|
|
111
|
+
.upgradelens/knowledge-manifest.json
|
|
112
|
+
.upgradelens/knowledge-evidence-bundle.json
|
|
113
|
+
.upgradelens/version-analysis.json
|
|
114
|
+
.upgradelens/usage-index.json
|
|
115
|
+
.upgradelens/repository-impact.json
|
|
116
|
+
.upgradelens/repository-impact-evidence.json
|
|
117
|
+
.upgradelens/repository-impact.md
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## 4. Artifact summary
|
|
121
|
+
|
|
122
|
+
| Metric | Result |
|
|
123
|
+
| --- | ---: |
|
|
124
|
+
| Projects | 2 |
|
|
125
|
+
| Dependency declarations / analysis occurrences | 47 |
|
|
126
|
+
| Unique researched packages | 46 |
|
|
127
|
+
| Version results analyzed | 0 |
|
|
128
|
+
| Version results skipped | 47 |
|
|
129
|
+
| Version results requiring human review | 47 |
|
|
130
|
+
| Usage dependencies | 17 |
|
|
131
|
+
| Usage symbols | 152 |
|
|
132
|
+
| Usage files | 79 |
|
|
133
|
+
| Source files scanned / analyzed | 141 / 140 |
|
|
134
|
+
| Usage warnings | 1 |
|
|
135
|
+
| Impacted dependencies | 0 |
|
|
136
|
+
| Breaking findings | 0 |
|
|
137
|
+
| Evidence records | 0 |
|
|
138
|
+
|
|
139
|
+
The console `Dependencies: 47` count is the number of dependency occurrences, not 46 unique packages. `langchain-openai` is declared twice in `requirements.txt`, explaining the difference.
|
|
140
|
+
|
|
141
|
+
### Trust-chain validation
|
|
142
|
+
|
|
143
|
+
The production loaders successfully validated all boundaries:
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
Project + Knowledge + Knowledge Evidence -> Version Analysis
|
|
147
|
+
Project + Version Analysis -> Usage Index
|
|
148
|
+
Project + Version Analysis + Usage Index -> Repository Impact
|
|
149
|
+
Project + Version Analysis + Usage Index + Repository Impact -> Impact Evidence
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Direct hash checks also passed for every exact-byte reference from Project Manifest through Repository Impact Evidence. Reference checks showed:
|
|
153
|
+
|
|
154
|
+
- all 47 Repository Impact `analysisResultId` values existed in Version Analysis;
|
|
155
|
+
- all 47 Impact Evidence `analysisResultId` values existed in Repository Impact;
|
|
156
|
+
- all 17 Usage Index package/project keys existed in Version Analysis;
|
|
157
|
+
- all project references resolved to `node:FE` or `python:.`;
|
|
158
|
+
- no dangling finding, symbol, or file references existed (the final chain contained zero findings).
|
|
159
|
+
|
|
160
|
+
## 5. Project discovery and manual correctness matrix
|
|
161
|
+
|
|
162
|
+
Project Discovery correctly found:
|
|
163
|
+
|
|
164
|
+
| Project | Path | Ecosystem | Manifest | Dependencies |
|
|
165
|
+
| --- | --- | --- | --- | ---: |
|
|
166
|
+
| `node:FE` | `FE` | Node | `FE/package.json` | 19 unique declarations |
|
|
167
|
+
| `python:.` | `.` | Python | `requirements.txt` | 28 declarations, 27 unique, 1 duplicate |
|
|
168
|
+
|
|
169
|
+
The nested Node project correctly owned frontend source files instead of the root Python project. No project was missing or duplicated. IA-01 only has a JavaScript/TypeScript analyzer, so Python source usage was intentionally not indexed.
|
|
170
|
+
|
|
171
|
+
### Source-to-artifact matrix
|
|
172
|
+
|
|
173
|
+
| Dependency | Real source usage | Usage Index | Result |
|
|
174
|
+
| --- | --- | --- | --- |
|
|
175
|
+
| `react` | `lazy` and `Suspense` in `FE/src/App.jsx`; `useState` across frontend files | Symbols and files found under `node:FE` | Correct |
|
|
176
|
+
| `react-router-dom` | `BrowserRouter`, `Routes`, `Route`, `Navigate` in `FE/src/App.jsx` | All four found in `FE/src/App.jsx` | Correct |
|
|
177
|
+
| `axios` | default import and `axios.create(...)` in `FE/src/services/api.js` | `default` in the same file | Correct |
|
|
178
|
+
| `lucide-react` | named `Loader2` in `FE/src/App.jsx` and many other named icons | `Loader2` and source file found | Correct |
|
|
179
|
+
| `pdfjs-dist` | namespace `pdfjsLib` plus worker default import in `SubmissionDocumentPreview.jsx` | `GlobalWorkerOptions`, `Util`, `getDocument`, and `default` in the same file | Correct |
|
|
180
|
+
| `posthog-js` | default import; `posthog.init/capture/...` in `FE/src/lib/analytics.js` | `default` in the same file | Correct |
|
|
181
|
+
| `react-markdown` | default `ReactMarkdown` used as JSX in `MarkdownView.jsx` | `default` in the same file | Correct |
|
|
182
|
+
| `remark-gfm` | default `remarkGfm` passed in `remarkPlugins` in `MarkdownView.jsx` | `default` in the same file | Correct |
|
|
183
|
+
|
|
184
|
+
All eight records had the correct `node:FE` ownership.
|
|
185
|
+
|
|
186
|
+
### Syntax patterns observed
|
|
187
|
+
|
|
188
|
+
| Pattern | VinGrade observation |
|
|
189
|
+
| --- | --- |
|
|
190
|
+
| Named import | Common; confirmed for React, React Router, and Lucide |
|
|
191
|
+
| Default import | Confirmed for Axios, PostHog, React Markdown, Remark GFM, and PDF worker subpath |
|
|
192
|
+
| Namespace import | `import * as pdfjsLib from 'pdfjs-dist'`; concrete member extraction was correct |
|
|
193
|
+
| Constant dynamic dependency import | Not present; constant dynamic imports in `App.jsx` are local relative modules |
|
|
194
|
+
| Non-constant dynamic import | Present for a local service path in `TeacherGrading.jsx`; correctly unrelated to dependency indexing |
|
|
195
|
+
| Re-export from dependency | Not found in the sampled repository |
|
|
196
|
+
| Side-effect dependency import | Not found in the sampled repository |
|
|
197
|
+
| Unused import | `React` in `VinUniLogo.jsx` was correctly excluded; unused default `React` in `TeacherDashboard.jsx` was excluded while referenced `useMemo` remained indexed |
|
|
198
|
+
| Shadowed dependency import | No real VinGrade example was confirmed |
|
|
199
|
+
|
|
200
|
+
One file, `FE/src/services/gradingService.js`, failed parsing because line 3 starts with `#`, which is invalid JavaScript outside a hashbang. UpgradeLens isolated it as `SOURCE_PARSE_FAILED` and continued. The file imports only local modules, so this warning did not create a sampled third-party dependency false negative. It is a VinGrade source issue, not an IA-01 parser defect.
|
|
201
|
+
|
|
202
|
+
## 6. False positives, false negatives, and Impact validation
|
|
203
|
+
|
|
204
|
+
### Usage false-positive sampling
|
|
205
|
+
|
|
206
|
+
The following artifact-first records were opened and confirmed as referenced bindings in source:
|
|
207
|
+
|
|
208
|
+
1. Axios `default` in `FE/src/services/api.js` (`axios.create`).
|
|
209
|
+
2. React Router `BrowserRouter` in `FE/src/App.jsx`.
|
|
210
|
+
3. Lucide `Loader2` in `FE/src/App.jsx`.
|
|
211
|
+
4. PDF.js `Util` in `SubmissionDocumentPreview.jsx` (`pdfjsLib.Util.transform`).
|
|
212
|
+
5. PDF.js `getDocument` in the same file.
|
|
213
|
+
6. PostHog `default` in `FE/src/lib/analytics.js`.
|
|
214
|
+
7. React Markdown `default` in `MarkdownView.jsx`.
|
|
215
|
+
|
|
216
|
+
**Confirmed usage false positives: none in the sample.**
|
|
217
|
+
|
|
218
|
+
### Usage false-negative sampling
|
|
219
|
+
|
|
220
|
+
Source-first searches for React, React Router, Axios, Lucide, PDF.js, PostHog, React Markdown, and Remark GFM all resolved to corresponding Usage Index records with the expected files and symbols.
|
|
221
|
+
|
|
222
|
+
**Confirmed usage false negatives: none in the sample.**
|
|
223
|
+
|
|
224
|
+
The parse warning means global completeness is not absolute, but the failed file contains no direct third-party import.
|
|
225
|
+
|
|
226
|
+
### Impact findings
|
|
227
|
+
|
|
228
|
+
The final exact-lineage chain had zero breaking findings because every Version Analysis result was skipped. Therefore:
|
|
229
|
+
|
|
230
|
+
- there were no five impacted findings to sample;
|
|
231
|
+
- there were no non-impacted findings to sample;
|
|
232
|
+
- the `Modal`/`Modal.info` lexical boundary could not be exercised on a real VinGrade finding;
|
|
233
|
+
- no Impact false positive or false negative can be honestly confirmed from the final artifacts.
|
|
234
|
+
|
|
235
|
+
This is **insufficient upstream knowledge**, not proof that VinGrade is unaffected and not an IA-02 matching bug.
|
|
236
|
+
|
|
237
|
+
The separate React model probe did return two `breakingChange` records, but both were knowledge-quality problems rather than API changes: “features and optimizations are not available” and “performance improvements ... may not be available.” The result also referred to React `19.3.0` while the artifact target was `19.2.7`. Trust validation downgraded risk to `unknown`, added `CLAIMS_DROPPED`, and required human review, but retained the findings. Since their summaries contained no concrete React API symbol, exact-symbol matching would not establish repository impact. This is an MVP-03/model-output quality issue.
|
|
238
|
+
|
|
239
|
+
### Evidence
|
|
240
|
+
|
|
241
|
+
The final Evidence artifact correctly contained:
|
|
242
|
+
|
|
243
|
+
- 47 dependency records linked to Repository Impact;
|
|
244
|
+
- zero finding records;
|
|
245
|
+
- zero matched symbols and usage records;
|
|
246
|
+
- zero counts for all four reason codes.
|
|
247
|
+
|
|
248
|
+
Structural lineage passed, but stable finding evidence IDs, finding summaries, reason codes, and file traceability could not be validated on real findings. This remains an uncompleted IA-05 acceptance area.
|
|
249
|
+
|
|
250
|
+
## 7. Markdown report UX review
|
|
251
|
+
|
|
252
|
+
### Strengths
|
|
253
|
+
|
|
254
|
+
- The report is deterministic and valid Markdown.
|
|
255
|
+
- Repository, summary counts, package IDs, and dependency ordering match artifacts.
|
|
256
|
+
- A developer can identify the output as belonging to directory `C2-App-008`.
|
|
257
|
+
|
|
258
|
+
### Problems
|
|
259
|
+
|
|
260
|
+
1. **False reassurance:** the report says `Impacted: No` for all 47 occurrences even though Version Analysis says `analyzedCount: 0`, `skippedCount: 47`, and `requiresHumanReviewCount: 47`.
|
|
261
|
+
2. **Missing completeness context:** the report does not show Knowledge availability, analyzed/skipped/failed Version counts, human-review counts, or Usage warnings.
|
|
262
|
+
3. **Too noisy:** it renders 47 nearly identical sections saying “No breaking findings,” including Python dependencies that IA-01 cannot inspect for source usage.
|
|
263
|
+
4. **Duplicate ambiguity:** `langchain-openai` appears twice without showing manifest occurrence or declared constraint.
|
|
264
|
+
5. **Repository naming:** `C2-App-008` is the correct directory identity but less useful to a developer than the product name VinGrade.
|
|
265
|
+
6. A developer must open `version-analysis.json` to discover that the apparently safe report is actually incomplete.
|
|
266
|
+
|
|
267
|
+
Reason codes and affected files would be useful when findings exist, but this run could not assess their real report presentation.
|
|
268
|
+
|
|
269
|
+
## 8. Determinism result
|
|
270
|
+
|
|
271
|
+
The two successful runs used the same repository, `--offline`, no cache, no AI runtime, and unchanged source.
|
|
272
|
+
|
|
273
|
+
### Passed
|
|
274
|
+
|
|
275
|
+
- Project business payload: identical after removing `generatedAt`.
|
|
276
|
+
- Knowledge packages/sources/warnings and counters: identical after removing execution time and lineage metadata.
|
|
277
|
+
- Version statuses, dependency facts, versions, findings, limitations, and ordering: identical after removing volatile lineage-derived IDs.
|
|
278
|
+
- Usage, Impact, and Evidence business payloads and ordering: identical after removing timestamps, exact-byte lineage digests, and propagated analysis result IDs.
|
|
279
|
+
- Markdown report: exact same SHA-256 (`b0f694bcc61e8494384d8132ec2277d0dd474a7394cc5b1b17fb104867f2efb1`).
|
|
280
|
+
|
|
281
|
+
### Failed
|
|
282
|
+
|
|
283
|
+
- `researchId`: changed.
|
|
284
|
+
- Stable `contextId`: 0 of 47 remained the same.
|
|
285
|
+
- Stable Version Analysis result ID: 0 of 47 remained the same.
|
|
286
|
+
- Downstream `analysisResultId` references changed accordingly.
|
|
287
|
+
|
|
288
|
+
Root cause is deterministic but time-coupled identity material: `createResearchId` includes the exact Project Manifest artifact digest; that artifact digest changes because Project Manifest contains `generatedAt`. Dependency context identity then includes exact Project/Knowledge/Evidence digests and `knowledgeResearchId`, and result identity includes `contextId`. Exact-byte lineage itself is correct, but it should not make IDs documented or expected as stable change solely because a new run has a different timestamp.
|
|
289
|
+
|
|
290
|
+
## 9. Repository safety result
|
|
291
|
+
|
|
292
|
+
After validation, VinGrade Git status was identical to the baseline status shown in Section 2. `git diff --name-only` still contained only the pre-existing deleted `Makefile`. A timestamp scan found no file modified during IA-05 outside `.upgradelens/`.
|
|
293
|
+
|
|
294
|
+
No source, manifest, lockfile, dependency, branch, commit, database, or environment file was changed. No package was installed in VinGrade. The only VinGrade path created or updated by validation was `.upgradelens/`.
|
|
295
|
+
|
|
296
|
+
The final `.upgradelens` contains the second deterministic offline cache-miss run. Old artifacts and the online cache are preserved in the `/private/tmp` backup paths documented above.
|
|
297
|
+
|
|
298
|
+
## 10. Bugs and technical debt
|
|
299
|
+
|
|
300
|
+
### P0 — blocks MVP-04
|
|
301
|
+
|
|
302
|
+
**Report and console conflate “not impacted” with “not analyzed.”**
|
|
303
|
+
|
|
304
|
+
Validation finding: 47/47 Version Analysis results were skipped, while console and Markdown reported zero impacted dependencies and every dependency as `Impacted: No`.
|
|
305
|
+
|
|
306
|
+
Root cause: IA-04 renderers read Repository Impact/Evidence counts but do not expose Version Analysis completeness. Repository Impact represents a lack of matched findings as `impacted: false`, even when no upstream finding exists.
|
|
307
|
+
|
|
308
|
+
Smallest proposed fix: make report input include the existing Version Analysis artifact and render analyzed/skipped/failed/human-review counts. When analysis is incomplete, show an explicit “Analysis incomplete” state and do not label skipped dependencies as a conclusive “Impacted: No.” This is presentation of existing data, not new impact reasoning.
|
|
309
|
+
|
|
310
|
+
### P1 — should fix before MVP-05
|
|
311
|
+
|
|
312
|
+
**Stable IDs change across identical runs.** Separate exact-byte lineage from semantic identity material, retain artifact digests in lineage, add a two-run regression test, and document which IDs are run-scoped versus stable if semantics cannot remain stable.
|
|
313
|
+
|
|
314
|
+
**No viable full real-world Version Analysis result set was produced.** Revalidate with a configured runtime/model that can handle the selected prompt size and 47 sequential occurrences. The local qwen3 path truncated prompts and timed out; qwen2.5 passed one probe but was too slow/unreliable for the full run and produced weak React findings.
|
|
315
|
+
|
|
316
|
+
**React probe retained non-breaking availability/performance statements as `breakingChange`.** This belongs to MVP-03 trust/output quality, not IA-02. Tighten acceptance of breaking findings so a supported concrete change is required; do not use fuzzy matching to compensate.
|
|
317
|
+
|
|
318
|
+
### P2 — follow-up improvement
|
|
319
|
+
|
|
320
|
+
- Compact dependencies with no findings instead of rendering 47 repeated sections.
|
|
321
|
+
- Show occurrence/manifest/declared constraint when one package has duplicate declarations.
|
|
322
|
+
- Surface Usage Index warning count and analyzer coverage.
|
|
323
|
+
- Consider a display name separate from basename-derived repository identity.
|
|
324
|
+
- VinGrade should replace the invalid `#` line in `gradingService.js` with valid JavaScript comment syntax, outside this UpgradeLens task.
|
|
325
|
+
|
|
326
|
+
### Known limitation — accepted for Usage Index 1.0.0
|
|
327
|
+
|
|
328
|
+
- Python source usage is not analyzed.
|
|
329
|
+
- Usage records do not include line, column, snippet, call count, function name, or usage kind.
|
|
330
|
+
- Dynamic dependency import coverage is limited to constant specifiers; VinGrade had no such dependency example.
|
|
331
|
+
- No real VinGrade re-export, side-effect dependency import, or shadowed import example was available.
|
|
332
|
+
|
|
333
|
+
## 11. Final recommendation
|
|
334
|
+
|
|
335
|
+
- **Is MVP-04 complete?** No. The scheduler and artifact lineage work, but the primary report can present completely skipped analysis as a clean non-impact conclusion.
|
|
336
|
+
- **Can MVP-05 start?** Not as the next acceptance milestone. Fix the P0 incomplete-analysis presentation first and rerun IA-05.
|
|
337
|
+
- **What must be fixed first?** Report/console completeness state, followed by the stable-ID contract and a viable full Version Analysis run.
|
|
338
|
+
- **What can be accepted?** JS/TS-only Usage Discovery, absence of line/snippet/call metadata, and lack of Python usage analysis are acceptable declared 1.0.0 limitations.
|
|
339
|
+
- **What must be revalidated?** At least five real impacted and five real non-impacted findings, their exact symbol matches, stable evidence IDs, reason codes, and source-file traceability. None can be inferred from the zero-finding degraded run.
|
package/docs/MVP-01.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# MVP-01 — Project Discovery Foundation
|
|
2
|
+
|
|
3
|
+
MVP-01 establishes the local discovery boundary used by future UpgradeLens analysis stages. It intentionally contains no network service, database, user interface, container runtime, MCP integration, agent framework, or LLM runtime.
|
|
4
|
+
|
|
5
|
+
## Responsibilities
|
|
6
|
+
|
|
7
|
+
1. Accept a repository or project directory.
|
|
8
|
+
2. Walk it without following symbolic links and skip generated/dependency directories.
|
|
9
|
+
3. Detect supported project manifests, including multiple ecosystems and workspace members.
|
|
10
|
+
4. Preserve partial results when an individual manifest cannot be read or parsed.
|
|
11
|
+
5. Produce a portable, versioned JSON manifest with stable ordering and relative paths.
|
|
12
|
+
6. Write atomically to `.upgradelens/project-manifest.json` by default.
|
|
13
|
+
|
|
14
|
+
## Supported discovery signals
|
|
15
|
+
|
|
16
|
+
| Ecosystem | Manifest signals |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| Node.js | `package.json` |
|
|
19
|
+
| Python | `pyproject.toml`, `requirements.txt` |
|
|
20
|
+
| Java/Kotlin | Maven and Gradle build/settings files |
|
|
21
|
+
| .NET | solution and C#/F#/Visual Basic project files |
|
|
22
|
+
| Go | `go.mod` |
|
|
23
|
+
| Rust | `Cargo.toml` |
|
|
24
|
+
| Ruby | `Gemfile` |
|
|
25
|
+
| PHP | `composer.json` |
|
|
26
|
+
| Dynamics 365 Business Central AL | a valid AL `app.json` |
|
|
27
|
+
|
|
28
|
+
Node workspaces declared through the root `package.json` or `pnpm-workspace.yaml` are represented with root/member relationships, including pnpm exclusion patterns. UpgradeLens itself remains a single npm package; workspace discovery only concerns target repositories.
|
|
29
|
+
|
|
30
|
+
## Manifest contract
|
|
31
|
+
|
|
32
|
+
The contract is versioned independently through `schemaVersion`. Schema v2 places `dependencySummary` and `dependencies` on every project. A parsed summary reports total valid declarations before deduplication, unique normalized identities, and their difference as duplicate count. Node summaries also provide counts for all four supported package sections. Unsupported and failed parsers contain only their status, with no counts; their inventory is empty. This rule applies consistently to every ecosystem and avoids representing missing support, parse failure, or partial results as zero dependencies.
|
|
33
|
+
|
|
34
|
+
Every dependency declaration remains in the inventory, including duplicates. Records contain the declared name, normalized identity, declared version or reference, dependency type, and repository-relative manifest path. Inventories and warnings are sorted deterministically. Repeated normalized identities emit `DUPLICATE_DEPENDENCY_DECLARATION` without becoming parse failures.
|
|
35
|
+
|
|
36
|
+
The deterministic `requirements.txt` parser normalizes named packages using rules close to PEP 503. Blank lines and comments are ignored; version specifiers, extras, markers, editable declarations, and direct URL/Git references are supported. Unnamed references use their exact reference as a stable identity. `-r`/`--requirement`, `-c`/`--constraint`, and package-index options are directives rather than dependencies. Include and constraint files are intentionally not followed in MVP-01. Malformed dependency lines produce `DEPENDENCY_PARSE_FAILED` without removing the detected project or exposing partial counts/inventory.
|
|
37
|
+
|
|
38
|
+
Paths are POSIX-style and relative to the discovered root so output does not expose machine-specific absolute paths. Projects, dependencies, and warnings are sorted, making every field except `generatedAt` reproducible for unchanged input.
|
|
39
|
+
|
|
40
|
+
The normative schema is [`schemas/project-manifest.schema.json`](../schemas/project-manifest.schema.json).
|
|
41
|
+
|
|
42
|
+
## Exit codes
|
|
43
|
+
|
|
44
|
+
| Code | Meaning |
|
|
45
|
+
| --- | --- |
|
|
46
|
+
| `0` | Discovery completed (warnings may be present unless strict mode is used) |
|
|
47
|
+
| `1` | Invalid invocation or discovery could not start |
|
|
48
|
+
| `2` | Discovery completed with warnings and `--fail-on-warning` was set |
|