@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,480 @@
|
|
|
1
|
+
# VinGrade MVP-02 Validation
|
|
2
|
+
|
|
3
|
+
## 1. Environment
|
|
4
|
+
|
|
5
|
+
Validation date: 2026-07-14 (Asia/Ho_Chi_Minh)
|
|
6
|
+
|
|
7
|
+
| Item | Value |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| UpgradeLens repository | `<UPGRADELENS_REPO>` |
|
|
10
|
+
| UpgradeLens branch | `feat/mvp-02-knowledge-research` |
|
|
11
|
+
| UpgradeLens package version | `0.1.1` |
|
|
12
|
+
| UpgradeLens working tree | Dirty before validation: six modified and four untracked MVP-02 files; validation made no source changes |
|
|
13
|
+
| VinGrade repository | `<VINGRADE_REPO>` |
|
|
14
|
+
| VinGrade branch | `feat/knowledege-rubric-criteria` |
|
|
15
|
+
| Node.js | `v26.0.0` |
|
|
16
|
+
| CLI under test | `node <UPGRADELENS_REPO>/bin/upgradelens.js` |
|
|
17
|
+
| Unused global CLI | `<GLOBAL_UPGRADELENS_PATH>` |
|
|
18
|
+
| Modes tested | online first run, online cache reuse, offline fresh-cache hit, offline cache miss, stdout, custom output |
|
|
19
|
+
|
|
20
|
+
VinGrade already contained unrelated untracked files. They were not modified. No pre-existing `.upgradelens/` directory was present, so no artifact backup was necessary.
|
|
21
|
+
|
|
22
|
+
## 2. Commands executed
|
|
23
|
+
|
|
24
|
+
The substantive commands below were executed without credentials. Repository paths are sanitized.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cd <UPGRADELENS_REPO>
|
|
28
|
+
git status
|
|
29
|
+
npm test
|
|
30
|
+
npm_config_cache="$TMPDIR/upgradelens-npm-cache" npm run check
|
|
31
|
+
git diff --check
|
|
32
|
+
npm_config_cache="$TMPDIR/upgradelens-npm-cache" npm pack --dry-run --json
|
|
33
|
+
which upgradelens
|
|
34
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js --version
|
|
35
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js --help
|
|
36
|
+
|
|
37
|
+
cd <VINGRADE_REPO>
|
|
38
|
+
find .upgradelens -maxdepth 5 -type f 2>/dev/null | sort
|
|
39
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js discover .
|
|
40
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js research .
|
|
41
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js research .
|
|
42
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js research . --offline
|
|
43
|
+
mv .upgradelens/cache "$TMPDIR/vingrade-knowledge-cache"
|
|
44
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js research . --offline
|
|
45
|
+
mv "$TMPDIR/vingrade-knowledge-cache" .upgradelens/cache
|
|
46
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js research . --stdout \
|
|
47
|
+
> "$TMPDIR/vingrade-knowledge-stdout.json" \
|
|
48
|
+
2> "$TMPDIR/vingrade-knowledge-stdout.stderr"
|
|
49
|
+
mkdir -p artifacts
|
|
50
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js research . \
|
|
51
|
+
--output artifacts/vingrade-knowledge.json
|
|
52
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js research . \
|
|
53
|
+
--output "$TMPDIR/knowledge.json"
|
|
54
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js discover .
|
|
55
|
+
node <UPGRADELENS_REPO>/bin/upgradelens.js research .
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Strict validation used UpgradeLens's own `loadProjectManifestInput` and `validateKnowledgeManifest` exports. Additional `jq`, Node.js recursive audits, `cmp`, `shasum`, `find`, `rg`, `lsof`, and read-only `curl` checks were used for counts, ordering, privacy, process state, and registry-response diagnostics.
|
|
59
|
+
|
|
60
|
+
### UpgradeLens gate
|
|
61
|
+
|
|
62
|
+
- Branch: `feat/mvp-02-knowledge-research`.
|
|
63
|
+
- `npm test`: 107 tests, 107 passed, 0 failed/skipped/cancelled.
|
|
64
|
+
- `npm run check`: passed; it reran all 107 tests and the npm package dry-run.
|
|
65
|
+
- `git diff --check`: passed with no output.
|
|
66
|
+
- `npm pack --dry-run --json`: passed; 42 files, 79,527-byte tarball, 316,768 bytes unpacked. Nothing was published and no tarball was written.
|
|
67
|
+
- The direct CLI reported version `0.1.1` and help for `discover`, `research`, the default discovery alias, `--output`, `--stdout`, `--offline`, `--max-depth`, `--no-pretty`, and `--fail-on-warning`.
|
|
68
|
+
|
|
69
|
+
## 3. Project Manifest result
|
|
70
|
+
|
|
71
|
+
Discovery exited 0 and wrote `.upgradelens/project-manifest.json`.
|
|
72
|
+
|
|
73
|
+
| Contract/count | Actual |
|
|
74
|
+
| --- | ---: |
|
|
75
|
+
| Schema version | `2.0.0` |
|
|
76
|
+
| Generator | `UpgradeLens 0.1.1` |
|
|
77
|
+
| Repository | `C2-App-008` |
|
|
78
|
+
| Branch | `feat/knowledege-rubric-criteria` |
|
|
79
|
+
| Projects | 2 |
|
|
80
|
+
| Node projects | 1 |
|
|
81
|
+
| Python projects | 1 |
|
|
82
|
+
| Workspaces | 0 |
|
|
83
|
+
|
|
84
|
+
| Project ID | Declarations | Unique | Duplicates |
|
|
85
|
+
| --- | ---: | ---: | ---: |
|
|
86
|
+
| `node:FE` | 19 | 19 | 0 |
|
|
87
|
+
| `python:.` | 28 | 27 | 1 |
|
|
88
|
+
|
|
89
|
+
The only warning was `DUPLICATE_DEPENDENCY_DECLARATION` for `langchain-openai` in `requirements.txt`. The Project Manifest contains two occurrences that research canonicalizes as `pypi:langchain-openai`.
|
|
90
|
+
|
|
91
|
+
Strict Draft 2020-12 Ajv validation passed. Runtime dependency invariants passed. All repository, project, manifest, workspace, and dependency paths are portable repository-relative paths; no absolute local path appears. Repeat discovery produced byte-for-byte identical canonical JSON after removing only `generatedAt`, confirming unchanged project IDs, dependencies, ordering, and warnings.
|
|
92
|
+
|
|
93
|
+
## 4. Knowledge Manifest first online run
|
|
94
|
+
|
|
95
|
+
The initial sandboxed preflight could not resolve external DNS and produced 46 `REGISTRY_UNAVAILABLE` results; it was excluded from the live baseline. Independent network-enabled probes returned HTTP 200 from both npm and PyPI.
|
|
96
|
+
|
|
97
|
+
The first network-enabled run completed research and atomically wrote a schema-valid artifact. Its process remained alive with established HTTPS sockets for more than two minutes after printing the completion message, so it was interrupted after the final file was confirmed safe; the observed shell exit was 130. The final equivalent post-discovery online run exited 0, but with substantial wall-clock delay after a 1.627-second manifest duration. See Findings.
|
|
98
|
+
|
|
99
|
+
### Contract
|
|
100
|
+
|
|
101
|
+
| Field | First online value |
|
|
102
|
+
| --- | --- |
|
|
103
|
+
| Knowledge schema | `1.0.0` |
|
|
104
|
+
| Generator | `UpgradeLens 0.1.1` |
|
|
105
|
+
| Project Manifest digest | `sha256:160516fd08196806f44203c160352646e6148fabc89b95a3e2787ff25e3ecad3` |
|
|
106
|
+
| Research ID | `sha256:6d38b75fd55c31210a73a98b5e0fe9191b8d960aa5c0feb8c3eb0db61c1668ad` |
|
|
107
|
+
| Policy mode | `online` |
|
|
108
|
+
|
|
109
|
+
### Summary and execution
|
|
110
|
+
|
|
111
|
+
| Metric | Value |
|
|
112
|
+
| --- | ---: |
|
|
113
|
+
| Input occurrences | 47 |
|
|
114
|
+
| Packages | 46 |
|
|
115
|
+
| Resolved | 31 |
|
|
116
|
+
| Partial | 0 |
|
|
117
|
+
| Not found | 0 |
|
|
118
|
+
| Invalid | 0 |
|
|
119
|
+
| Unavailable | 15 |
|
|
120
|
+
| Sources | 142 |
|
|
121
|
+
| Warnings | 15 |
|
|
122
|
+
| Cache hits | 0 |
|
|
123
|
+
| Cache misses | 46 |
|
|
124
|
+
| Stale sources | 0 |
|
|
125
|
+
| Manifest duration | 2,296 ms |
|
|
126
|
+
| Researched packages | 46 |
|
|
127
|
+
| Retries | 0 |
|
|
128
|
+
| Partial failures | 15 |
|
|
129
|
+
|
|
130
|
+
Warnings grouped by code: `REGISTRY_RESPONSE_INVALID` = 15. Affected packages were:
|
|
131
|
+
|
|
132
|
+
```text
|
|
133
|
+
npm:@playwright/test
|
|
134
|
+
npm:@types/react
|
|
135
|
+
npm:eslint
|
|
136
|
+
npm:eslint-plugin-react-hooks
|
|
137
|
+
npm:lucide-react
|
|
138
|
+
npm:pdfjs-dist
|
|
139
|
+
npm:posthog-js
|
|
140
|
+
npm:react
|
|
141
|
+
npm:react-dom
|
|
142
|
+
npm:react-router-dom
|
|
143
|
+
npm:vite
|
|
144
|
+
pypi:psycopg2-binary
|
|
145
|
+
pypi:pydantic
|
|
146
|
+
pypi:ruff
|
|
147
|
+
pypi:sqlalchemy
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
These were not confirmed external registry failures. Representative affected responses were valid HTTP 200 JSON but exceeded UpgradeLens's hard-coded 1,000,000-byte response limit: React was 6,787,766 bytes and Pydantic was 1,820,768 bytes. FastAPI, which resolved, was 490,414 bytes. UpgradeLens maps `*_RESPONSE_TOO_LARGE` to the public `REGISTRY_RESPONSE_INVALID` warning. This makes common, valid packages unavailable and is classified as an UpgradeLens defect/limit rather than an external condition.
|
|
151
|
+
|
|
152
|
+
The first, second, offline, stdout, custom, and final Knowledge Manifests all passed strict JSON Schema and runtime invariant validation.
|
|
153
|
+
|
|
154
|
+
## 5. Package spot checks
|
|
155
|
+
|
|
156
|
+
| Package | Status | Registry | Occurrences | Declared versions | Registry latest | Selection | Releases | Warning codes |
|
|
157
|
+
| --- | --- | --- | ---: | --- | --- | --- | ---: | --- |
|
|
158
|
+
| `npm:react` | unavailable | npm | 1 | `^19.2.6` | n/a | n/a | 0 | `REGISTRY_RESPONSE_INVALID` |
|
|
159
|
+
| `npm:vite` | unavailable | npm | 1 | `^8.0.12` | n/a | n/a | 0 | `REGISTRY_RESPONSE_INVALID` |
|
|
160
|
+
| `npm:@vitejs/plugin-react` | resolved | npm | 1 | `^6.0.1` | `6.0.3` | `dist-tag:latest` | 84 | none |
|
|
161
|
+
| `pypi:fastapi` | resolved | PyPI | 1 | `>=0.115.0` | `0.139.0` | `project-info-version` | 299 | none |
|
|
162
|
+
| `pypi:langchain-openai` | resolved | PyPI | 2 | unpinned; `>=0.3.0` | `1.3.5` | `project-info-version` | 132 | none |
|
|
163
|
+
|
|
164
|
+
Source IDs:
|
|
165
|
+
|
|
166
|
+
- React: `npm:react:registry`.
|
|
167
|
+
- Vite: `npm:vite:registry`.
|
|
168
|
+
- `@vitejs/plugin-react`: `npm:@vitejs/plugin-react:registry`, `npm:@vitejs/plugin-react:documentation:91d0a8e5c89a8658142b74499d5e875eeec667b9e5c546d4ec4e56e893aaa94b`, `npm:@vitejs/plugin-react:issues:393c227b303ea7f82cad23d7675d7dda4b9ae4de4176d710891958b3bd308388`, `npm:@vitejs/plugin-react:repository:20165e183b26f4e2183baf3f7af00e94d8bd41bebbedb07f19a396f3f5abef06`.
|
|
169
|
+
- FastAPI: `pypi:fastapi:registry`, `pypi:fastapi:changelog:99b394030cf8fb82194374faaa60cd2e3fd25f6def910e3e6af4d0b35ce637a9`, `pypi:fastapi:documentation:6355c1abf82e4fcf376601f7b46006cbebd218a9967846cc77b7be28e8577bff`, `pypi:fastapi:documentation:f9ecc9a5597baab2636d566e13bb342933f2b8340b57a11aebbe383d74f440a4`, `pypi:fastapi:issues:7300d73fbb3d7c7d27a77c765277ca2b64365c306702e83e222402b26ae29e96`, `pypi:fastapi:repository:f9ecc9a5597baab2636d566e13bb342933f2b8340b57a11aebbe383d74f440a4`.
|
|
170
|
+
- `langchain-openai`: `pypi:langchain-openai:registry`, `pypi:langchain-openai:changelog:f639e020ec7aafbe9fb9425c60215caed2d6fea389463911c1ed9404152bef22`, `pypi:langchain-openai:documentation:460f08369bb7f87a8454057ceaaef62252256e5b0824e9efd816a67ecb1bd467`, `pypi:langchain-openai:documentation:4e8c3949e160bc1b201617db0ff87d5d6aa08f8332f001afd2747ab702185c2d`, `pypi:langchain-openai:issues:a09c72f4e18e0994736d5179ca5a8cfa32194330c2202ea5cd401cd0d8b85016`, `pypi:langchain-openai:repository:c5a32632e586ab2c7c9c6b0311eaac2477d26a3be132e9c5b7f260a30728c0b7`.
|
|
171
|
+
|
|
172
|
+
The resolved npm spot check uses the registry's `dist-tag:latest`; it is not selected by maximum version. Both resolved PyPI checks use `project-info-version`; they are not selected by PEP 440 comparison or the maximum release key. React and Vite could not be live-confirmed because the response-size defect made them unavailable.
|
|
173
|
+
|
|
174
|
+
Duplicate preservation passed: exactly one `pypi:langchain-openai` package identity contains both ordered occurrences. No duplicate registry identity or second independent research request was created.
|
|
175
|
+
|
|
176
|
+
## 6. Cache validation
|
|
177
|
+
|
|
178
|
+
| Metric | First online | Second online |
|
|
179
|
+
| --- | ---: | ---: |
|
|
180
|
+
| Cache hits | 0 | 31 |
|
|
181
|
+
| Cache misses | 46 | 15 |
|
|
182
|
+
| Resolved | 31 | 31 |
|
|
183
|
+
| Unavailable | 15 | 15 |
|
|
184
|
+
| Warnings | 15 | 15 |
|
|
185
|
+
| Research ID | `sha256:6d38...668ad` | `sha256:6d38...668ad` |
|
|
186
|
+
|
|
187
|
+
There were 31 cache files after population. Every successfully researched package became a fresh cache hit. The 15 responses rejected before caching were fetched again and remained misses. Package facts, source records, warning records, and their ordering were exactly equal between runs.
|
|
188
|
+
|
|
189
|
+
The second online process also remained alive after safely writing its artifact and was interrupted, yielding shell exit 130. The later final online run exited 0 and retained the same package/source/warning facts.
|
|
190
|
+
|
|
191
|
+
## 7. Offline validation
|
|
192
|
+
|
|
193
|
+
### Fresh populated cache
|
|
194
|
+
|
|
195
|
+
- Exit code: 0.
|
|
196
|
+
- Resolved/unavailable: 31/15.
|
|
197
|
+
- Cache hits/misses: 31/15.
|
|
198
|
+
- `OFFLINE_CACHE_MISS`: 15.
|
|
199
|
+
- Research ID: `sha256:2a1857ee84071aaee32b2d6b0af50636e1ada7f3254d251d190931392fe82753`.
|
|
200
|
+
- Schema and runtime invariants: pass.
|
|
201
|
+
- No network-enabled execution was provided to this command, and it completed normally.
|
|
202
|
+
|
|
203
|
+
### Empty cache
|
|
204
|
+
|
|
205
|
+
- Exit code: 0.
|
|
206
|
+
- Unavailable packages: 46.
|
|
207
|
+
- Cache hits/misses: 0/46.
|
|
208
|
+
- `OFFLINE_CACHE_MISS`: 46.
|
|
209
|
+
- Total warnings: 46.
|
|
210
|
+
- Research ID: `sha256:7a751e6f3f088e56016c34f1a05b3a4370f061c3dc6432b86ea8462dd635364f`.
|
|
211
|
+
- Schema and runtime invariants: pass.
|
|
212
|
+
- No stale or online fallback occurred.
|
|
213
|
+
|
|
214
|
+
The populated 31-entry cache was restored after the miss test.
|
|
215
|
+
|
|
216
|
+
## 8. Determinism
|
|
217
|
+
|
|
218
|
+
```text
|
|
219
|
+
firstResearchId sha256:6d38b75fd55c31210a73a98b5e0fe9191b8d960aa5c0feb8c3eb0db61c1668ad
|
|
220
|
+
secondResearchId sha256:6d38b75fd55c31210a73a98b5e0fe9191b8d960aa5c0feb8c3eb0db61c1668ad
|
|
221
|
+
equal true
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
The Project Manifest digest, policy, ordered source digests, package records, source records, and warning records were unchanged between those online runs.
|
|
225
|
+
|
|
226
|
+
Repeat discovery changed only `generatedAt`, so the exact Project Manifest bytes and digest changed to `sha256:4679f3a71b09b140eb7af1900e77da7467a34ce1c45839ab667050cf34b196f6`. The final research ID accordingly changed to `sha256:9f465841b64bef8644fad89c3fa7fbd40944c27e7c21c1ff9599fb874d5e9c3d`. This is expected lineage behavior, not nondeterminism. Package, source, and warning arrays remained exactly equal and ordered. Runtime ordering invariants passed.
|
|
227
|
+
|
|
228
|
+
## 9. Privacy and portability
|
|
229
|
+
|
|
230
|
+
Focused recursive key/value audits of the Project and first online Knowledge Manifests found:
|
|
231
|
+
|
|
232
|
+
| Check | Hits |
|
|
233
|
+
| --- | ---: |
|
|
234
|
+
| `<USER_HOME>/` machine-path prefix | 0 |
|
|
235
|
+
| Absolute Unix, Windows, or `file://` paths | 0 |
|
|
236
|
+
| `.upgradelens/cache`, Knowledge Store paths, cache filenames/keys | 0 |
|
|
237
|
+
| ETag or Last-Modified | 0 |
|
|
238
|
+
| Authorization, cookies, credentials, or token markers | 0 |
|
|
239
|
+
| Raw response bodies or raw HTTP-header fields | 0 |
|
|
240
|
+
| Stack-trace markers | 0 |
|
|
241
|
+
| Query-bearing public URLs | 0 |
|
|
242
|
+
| Non-HTTPS URL occurrences | 0 |
|
|
243
|
+
|
|
244
|
+
All 5,119 URL occurrences in the online Knowledge Manifest used HTTPS. No release-blocking privacy leakage was found. The negative absolute-output command printed a Node stack trace containing local source paths to stderr, but no stack trace or local path entered either public manifest.
|
|
245
|
+
|
|
246
|
+
## 10. CLI behavior
|
|
247
|
+
|
|
248
|
+
- Default discovery and research paths were created as documented.
|
|
249
|
+
- `--stdout` wrote 1,713,123 bytes of JSON only. JSON parsing, schema validation, and invariants passed. Stderr was empty, and the default Knowledge Manifest SHA-256 remained unchanged.
|
|
250
|
+
- Custom relative output `artifacts/vingrade-knowledge.json` was created and validated. It did not replace the default artifact. The temporary `artifacts/` directory was removed after validation.
|
|
251
|
+
- Absolute output under `$TMPDIR` failed before writing with exit code 1. No partial output remained. The error escaped as a full Node stack trace rather than a concise CLI error.
|
|
252
|
+
- Online default, stdout, and custom-output runs exhibited long post-completion process lifetimes with established HTTPS sockets. Two online file runs and the stdout/custom runs were interrupted only after their complete validated outputs were confirmed. A later equivalent final online run exited 0, but substantially later than its 1.627-second manifest duration. Offline runs exited promptly.
|
|
253
|
+
|
|
254
|
+
### Atomic replacement
|
|
255
|
+
|
|
256
|
+
The automated suite passed its Knowledge Manifest atomic writer test: validated content replaced an existing target, output ended with a newline, and no `.tmp` file remained. Invalid content failed validation before a final file appeared. The cache writer's injected rename-failure test also passed and preserved the existing entry while cleaning the temporary attempt.
|
|
257
|
+
|
|
258
|
+
A real VinGrade filesystem write fault was not forced because the writer has no injected filesystem hook and damaging the valid artifact was not justified. The final valid online artifact was never deliberately corrupted.
|
|
259
|
+
|
|
260
|
+
## 11. Findings
|
|
261
|
+
|
|
262
|
+
### Pass
|
|
263
|
+
|
|
264
|
+
- UpgradeLens test/check/package gates pass.
|
|
265
|
+
- The local current CLI was used directly.
|
|
266
|
+
- Polyglot discovery counts and duplicate preservation are correct.
|
|
267
|
+
- Project and Knowledge Manifest schemas and runtime invariants pass.
|
|
268
|
+
- Latest selection is registry-designated for the resolved npm and PyPI spot checks.
|
|
269
|
+
- Cache reuse, offline hit/miss behavior, research-ID determinism, semantic repeatability, ordering, stdout separation, relative custom output, absolute-output rejection, privacy, portability, and HTTPS-only URL checks pass.
|
|
270
|
+
- The final `.upgradelens/` contains a valid latest online Project Manifest, Knowledge Manifest, and the populated 31-entry cache.
|
|
271
|
+
|
|
272
|
+
### Expected external condition
|
|
273
|
+
|
|
274
|
+
No confirmed external package or registry condition remained after network-enabled HTTP 200 diagnostics. The 15 public warnings were generated by UpgradeLens's local response limit, not by confirmed registry invalidity.
|
|
275
|
+
|
|
276
|
+
### VinGrade dependency issue
|
|
277
|
+
|
|
278
|
+
- `requirements.txt` declares `langchain-openai` twice: once unpinned and once as `>=0.3.0`. UpgradeLens correctly preserves both occurrences under one package identity.
|
|
279
|
+
|
|
280
|
+
### UpgradeLens defects
|
|
281
|
+
|
|
282
|
+
1. **Release blocking — valid registry payloads over 1 MB become unavailable.** At least React and Pydantic returned valid HTTP 200 JSON and were rejected solely because `maxResponseBytes` defaults to 1,000,000. Fifteen of 46 VinGrade packages were unavailable, including React and Vite, preventing the requested live latest/release facts for core dependencies. The public warning also calls an oversized response “invalid,” obscuring the actual cause.
|
|
283
|
+
2. **Process-lifecycle defect — online CLI can linger long after output is complete.** Multiple commands retained established HTTPS sockets after writing/printing the validated artifact. Offline commands did not. The behavior was intermittent in duration; the final run eventually exited 0.
|
|
284
|
+
3. **CLI error-handling defect — invalid absolute output emits a stack trace.** Rejection and no-partial-write behavior are correct, but the expected argument error is not caught at the CLI boundary.
|
|
285
|
+
|
|
286
|
+
No UpgradeLens source was changed during this validation.
|
|
287
|
+
|
|
288
|
+
## 12. Final verdict
|
|
289
|
+
|
|
290
|
+
**FAIL — RELEASE BLOCKING**
|
|
291
|
+
|
|
292
|
+
The data contracts, deterministic behavior, cache/offline behavior, and privacy controls are sound, but real VinGrade research cannot resolve 15 of 46 ordinary public dependencies because valid registry documents exceed the implementation's 1 MB limit. React and Vite are among the missing core spot checks. The online process-lifecycle issue further makes command completion unreliable or excessively delayed. These are implementation issues, not external warnings.
|
|
293
|
+
|
|
294
|
+
## 13. Recommended next actions
|
|
295
|
+
|
|
296
|
+
1. Keep bounded reads, but support real npm/PyPI metadata sizes (or use smaller registry representations) and expose `REGISTRY_RESPONSE_TOO_LARGE` distinctly; add regression coverage with real-size React and Pydantic fixtures.
|
|
297
|
+
2. Reproduce and fix post-fetch process retention on supported Node versions, including Node 26; add a subprocess test that asserts timely CLI exit after output.
|
|
298
|
+
3. Catch runtime argument errors at the CLI boundary and emit a concise stderr message without a stack trace.
|
|
299
|
+
4. In VinGrade, remove the duplicate `langchain-openai` declaration or consolidate it to one intentional constraint.
|
|
300
|
+
|
|
301
|
+
## 14. RC-01 release-blocker remediation (2026-07-14)
|
|
302
|
+
|
|
303
|
+
This section preserves the failure evidence above as the baseline. It records the targeted remediation in UpgradeLens; it does not reinterpret the original VinGrade network run as a pass.
|
|
304
|
+
|
|
305
|
+
### Confirmed root causes and scope
|
|
306
|
+
|
|
307
|
+
- **Payload rejection was confirmed.** Both registry adapters inherited a hard-coded `1,000,000` byte default. Valid responses larger than that value were rejected before package validation, so the mapped public warning was `REGISTRY_RESPONSE_INVALID` with an internal `*_RESPONSE_TOO_LARGE` code.
|
|
308
|
+
- **The prior online process retention was observed, not conclusively attributed.** The baseline saw established HTTPS sockets after completion, but did not prove whether unread bodies, timeout handles, or the Node global Undici keep-alive policy was the cause. RC-01 fixes the UpgradeLens-owned lifecycle paths and adds a controlled natural-exit regression; it does not claim a global Undici defect was demonstrated.
|
|
309
|
+
|
|
310
|
+
### Code and lifecycle changes
|
|
311
|
+
|
|
312
|
+
- npm now owns `DEFAULT_NPM_MAX_RESPONSE_BYTES = 16 * 1024 * 1024` (16 MiB); full packuments include complete version metadata and can be several megabytes.
|
|
313
|
+
- PyPI now owns `DEFAULT_PYPI_MAX_RESPONSE_BYTES = 8 * 1024 * 1024` (8 MiB); project JSON is often smaller but can exceed 1 MB.
|
|
314
|
+
- Explicit adapter overrides remain supported. Values must be positive safe integers and are bounded by a documented 64 MiB safety ceiling. These remain execution settings and do not enter either manifest schema or policy.
|
|
315
|
+
- The common helper no longer supplies a shared registry response-size default. It retains bounded streaming reads, cancels and unlocks an oversized reader, cancels unused status/media bodies, fully consumes valid JSON, and clears its `AbortController` timeout in `finally` across all paths.
|
|
316
|
+
- At RC-01 completion, UpgradeLens created no Undici `Agent`, `Pool`, `Client`, dispatcher, or custom HTTP runtime; the CLI still used `globalThis.fetch`. No dispatcher was introduced in RC-01, and no forced `process.exit()` workaround was added. RC-02 subsequently introduces a scoped CLI-owned runtime; its live VinGrade retest is recorded separately when available.
|
|
317
|
+
|
|
318
|
+
### Automated regression result
|
|
319
|
+
|
|
320
|
+
The controlled suite covers:
|
|
321
|
+
|
|
322
|
+
- npm payloads above 1 MiB and near 6.8 MiB; PyPI payloads above 1 MiB and near 1.8 MiB; both resolve and are reused from cache;
|
|
323
|
+
- declared payloads exceeding the new adapter limits, lower explicit overrides, invalid values, and the 64 MiB ceiling; oversized bodies are rejected and not cached;
|
|
324
|
+
- reader cancellation and lock release; 404, 429, 5xx, and invalid-media body cancellation; success, timeout, failure, and oversize timer cleanup; and sanitized cleanup failures;
|
|
325
|
+
- an actual child-process invocation of the research CLI with injected normal and oversized registry responses. It writes a valid Knowledge Manifest, exits with code 0 without `process.exit()`, and is asserted to exit naturally within three seconds.
|
|
326
|
+
|
|
327
|
+
Post-remediation local automated result: `npm test` completed with **115 passed, 0 failed** in 1.28 seconds. It is independent of external registries.
|
|
328
|
+
|
|
329
|
+
### VinGrade revalidation status
|
|
330
|
+
|
|
331
|
+
The VinGrade checkout identified by the original report was not available in the local validation environment at remediation time; no alternate repository path was supplied. Consequently, RC-01 did **not** rerun online discovery/research and does not fabricate package totals, warning counts, cache totals, or timings for React, Vite, Playwright, ESLint, Pydantic, Ruff, SQLAlchemy, or Psycopg2.
|
|
332
|
+
|
|
333
|
+
The required follow-up in an environment containing `<VINGRADE_REPO>` is to run a clean online research pass, retain the original baseline separately, and record: package-status totals; every previously blocked package; warning codes; cache first/second-run totals; manifest duration; and wall-clock natural exit. Any genuine registry failure must remain separate from the historical 1 MB implementation defect.
|
|
334
|
+
|
|
335
|
+
### Revised verdict
|
|
336
|
+
|
|
337
|
+
**PASS WITH EXTERNAL WARNINGS**
|
|
338
|
+
|
|
339
|
+
The release-blocking local implementation defect has targeted limits and automated regression coverage. The remaining warning is external validation availability: the real VinGrade checkout was unavailable for the mandatory online retest, so live package outcomes and post-completion socket behavior remain to be confirmed in that environment. The original baseline failure evidence remains unchanged above.
|
|
340
|
+
|
|
341
|
+
## 15. RC-01 Live Remediation Retest
|
|
342
|
+
|
|
343
|
+
This section records the mandatory live VinGrade follow-up and supersedes only the provisional RC-01 verdict immediately above. The original failure baseline remains preserved in Sections 1–13.
|
|
344
|
+
|
|
345
|
+
### Environment and clean-cache method
|
|
346
|
+
|
|
347
|
+
Retest date: 2026-07-14 (Asia/Ho_Chi_Minh).
|
|
348
|
+
|
|
349
|
+
| Item | Actual |
|
|
350
|
+
| --- | --- |
|
|
351
|
+
| UpgradeLens branch | `feat/mvp-02-knowledge-research` |
|
|
352
|
+
| UpgradeLens version | `0.1.1` |
|
|
353
|
+
| Node.js | `v26.0.0` |
|
|
354
|
+
| VinGrade branch | `feat/knowledege-rubric-criteria` |
|
|
355
|
+
| CLI | Direct `bin/upgradelens.js`; no global installation used |
|
|
356
|
+
|
|
357
|
+
VinGrade had no pre-existing `.upgradelens/` files at the start of this retest. The retest still executed the requested backup check, removed `.upgradelens/`, reran discovery, and performed the first valid online run with network access. A sandboxed no-network preflight produced immediate transport failures and was excluded from all live results. No VinGrade source, dependency, lock, Docker, environment, or database file was changed.
|
|
358
|
+
|
|
359
|
+
### Automated gate
|
|
360
|
+
|
|
361
|
+
- `npm test`: 115 tests passed; 0 failed, skipped, cancelled, or todo.
|
|
362
|
+
- `npm_config_cache="$TMPDIR/upgradelens-npm-cache" npm run check`: passed; it reran all 115 tests and completed `npm pack --dry-run` with 44 files, a 90.1 kB tarball, and 347.3 kB unpacked size.
|
|
363
|
+
- `git diff --check`: passed with no output.
|
|
364
|
+
- Direct CLI version/help: `0.1.1`; commands `discover` and `research`, plus documented discovery/research options.
|
|
365
|
+
|
|
366
|
+
### Discovery
|
|
367
|
+
|
|
368
|
+
Discovery exited 0 and produced schema version `2.0.0` with generator `UpgradeLens 0.1.1`.
|
|
369
|
+
|
|
370
|
+
| Metric | Actual |
|
|
371
|
+
| --- | ---: |
|
|
372
|
+
| Projects | 2 |
|
|
373
|
+
| Node/Python projects | 1 / 1 |
|
|
374
|
+
| Node declarations / unique / duplicates | 19 / 19 / 0 |
|
|
375
|
+
| Python declarations / unique / duplicates | 28 / 27 / 1 |
|
|
376
|
+
| Total research occurrences / unique packages | 47 / 46 |
|
|
377
|
+
| Discovery warnings | 1 |
|
|
378
|
+
|
|
379
|
+
The sole discovery warning remained `DUPLICATE_DEPENDENCY_DECLARATION` for `langchain-openai`. Both declarations are preserved in one `pypi:langchain-openai` package record with two occurrences, and the registry identity is researched once.
|
|
380
|
+
|
|
381
|
+
### First clean online result
|
|
382
|
+
|
|
383
|
+
The first network-enabled research phase completed and wrote a valid Knowledge Manifest, but its process did not exit naturally. The process was terminated only after 427.64 seconds, when it remained alive about 414 seconds beyond its 13.801-second manifest duration.
|
|
384
|
+
|
|
385
|
+
| Contract/execution field | Actual |
|
|
386
|
+
| --- | --- |
|
|
387
|
+
| Knowledge schema / generator | `1.0.0` / `UpgradeLens 0.1.1` |
|
|
388
|
+
| Policy mode / version | `online` / `1` |
|
|
389
|
+
| Project Manifest digest | `sha256:a59c696a5f1101f47cd17baf9e62d1914c69d06c0590f74cd705d7837fb98c16` |
|
|
390
|
+
| Research ID | `sha256:6f415344ba50a7c427164d4d9d9d57248b98e71026f372826ec3bcb505e44d0c` |
|
|
391
|
+
| Manifest duration | 13,801 ms |
|
|
392
|
+
| Timed process | `real 427.64`, `user 13.21`, `sys 0.51` seconds |
|
|
393
|
+
| Real minus manifest duration | 413.839 seconds |
|
|
394
|
+
| Exit | Did not exit naturally; terminated with shell exit 143 |
|
|
395
|
+
|
|
396
|
+
| Summary metric | Actual |
|
|
397
|
+
| --- | ---: |
|
|
398
|
+
| Input occurrences / packages | 47 / 46 |
|
|
399
|
+
| Resolved / partial / not found | 45 / 0 / 0 |
|
|
400
|
+
| Invalid / unavailable | 0 / 1 |
|
|
401
|
+
| Sources / warnings | 184 / 1 |
|
|
402
|
+
| Cache hits / misses | 0 / 46 |
|
|
403
|
+
| Researched packages | 46 |
|
|
404
|
+
| Retries / partial failures | 0 / 1 |
|
|
405
|
+
|
|
406
|
+
Warnings grouped by code: `REGISTRY_RESPONSE_INVALID` = 1, for `npm:vite` only.
|
|
407
|
+
|
|
408
|
+
At 1 minute 51 seconds the completed process still had six established HTTPS sockets. At 5 minutes 51 seconds it still had four established HTTPS sockets and was still running. It was then terminated to allow the remaining retest phases to proceed. Therefore RC-01 did not resolve the clean online CLI lifecycle blocker, even though later low-network/cache runs exited naturally.
|
|
409
|
+
|
|
410
|
+
### Previously blocked package outcomes
|
|
411
|
+
|
|
412
|
+
| Package | Status | Latest | Selection | Releases | Warnings | Occurrences |
|
|
413
|
+
| --- | --- | --- | --- | ---: | --- | ---: |
|
|
414
|
+
| `npm:react` | resolved | `19.2.7` | `dist-tag:latest` | 2,865 | none | 1 |
|
|
415
|
+
| `npm:vite` | unavailable | n/a | n/a | 0 | `REGISTRY_RESPONSE_INVALID` | 1 |
|
|
416
|
+
| `npm:@playwright/test` | resolved | `1.61.1` | `dist-tag:latest` | 3,276 | none | 1 |
|
|
417
|
+
| `npm:@types/react` | resolved | `19.2.17` | `dist-tag:latest` | 705 | none | 1 |
|
|
418
|
+
| `npm:eslint` | resolved | `10.7.0` | `dist-tag:latest` | 424 | none | 1 |
|
|
419
|
+
| `npm:eslint-plugin-react-hooks` | resolved | `7.1.1` | `dist-tag:latest` | 2,706 | none | 1 |
|
|
420
|
+
| `npm:lucide-react` | resolved | `1.24.0` | `dist-tag:latest` | 676 | none | 1 |
|
|
421
|
+
| `npm:pdfjs-dist` | resolved | `6.1.200` | `dist-tag:latest` | 1,563 | none | 1 |
|
|
422
|
+
| `npm:posthog-js` | resolved | `1.399.5` | `dist-tag:latest` | 1,246 | none | 1 |
|
|
423
|
+
| `npm:react-dom` | resolved | `19.2.7` | `dist-tag:latest` | 2,820 | none | 1 |
|
|
424
|
+
| `npm:react-router-dom` | resolved | `7.18.1` | `dist-tag:latest` | 1,058 | none | 1 |
|
|
425
|
+
| `pypi:psycopg2-binary` | resolved | `2.9.12` | `project-info-version` | 26 | none | 1 |
|
|
426
|
+
| `pypi:pydantic` | resolved | `2.13.4` | `project-info-version` | 203 | none | 1 |
|
|
427
|
+
| `pypi:ruff` | resolved | `0.15.21` | `project-info-version` | 414 | none | 1 |
|
|
428
|
+
| `pypi:sqlalchemy` | resolved | `2.0.51` | `project-info-version` | 325 | none | 1 |
|
|
429
|
+
|
|
430
|
+
The important selection semantics also passed: `npm:react`, `npm:@vitejs/plugin-react` (`6.0.3`), and all resolved npm packages use `dist-tag:latest`; `pypi:fastapi` (`0.139.0`), `pypi:pydantic`, and `pypi:langchain-openai` (`1.3.5`) use `project-info-version`. No maximum-version or PEP 440 selection was substituted.
|
|
431
|
+
|
|
432
|
+
### Payload-limit evidence
|
|
433
|
+
|
|
434
|
+
Size-only live HTTP 200 probes discarded response bodies to `/dev/null` and did not persist raw registry payloads:
|
|
435
|
+
|
|
436
|
+
| Package | Observed body | RC-01 limit | Result |
|
|
437
|
+
| --- | ---: | ---: | --- |
|
|
438
|
+
| `npm:react` | 6,787,766 bytes | 16 MiB | accepted and cached |
|
|
439
|
+
| `npm:vite` | 38,902,327 bytes | 16 MiB | rejected as over the configured ceiling |
|
|
440
|
+
| `pypi:pydantic` | 1,820,768 bytes | 8 MiB | accepted and cached |
|
|
441
|
+
|
|
442
|
+
React, Pydantic, Ruff, and SQLAlchemy are no longer unavailable because of the former 1 MB cap. Vite's current npm packument is approximately 37.1 MiB and genuinely exceeds the new 16 MiB ceiling; this is the exact internal cause of its sanitized public warning. The limit was not increased again. Valid representative npm and PyPI bodies below their new limits were accepted.
|
|
443
|
+
|
|
444
|
+
### Cache, offline, stdout, and output-path validation
|
|
445
|
+
|
|
446
|
+
| Run | Exit | Real / manifest duration | Hits / misses | Resolved / unavailable | Warnings |
|
|
447
|
+
| --- | ---: | --- | ---: | ---: | ---: |
|
|
448
|
+
| Second online | 0 | 6.44 s / 5,833 ms | 45 / 1 | 45 / 1 | 1 |
|
|
449
|
+
| Offline, populated cache | 0 | 5.82 s / 5,209 ms | 45 / 1 | 45 / 1 | 1 |
|
|
450
|
+
| Offline, empty cache | 0 | 0.43 s / 40 ms | 0 / 46 | 0 / 46 | 46 |
|
|
451
|
+
|
|
452
|
+
- The populated cache contained 45 entries. Every successful first-run package became a fresh hit; only oversized Vite remained a miss.
|
|
453
|
+
- The offline populated-cache warning was one `OFFLINE_CACHE_MISS` for Vite. The empty-cache run produced 46 `OFFLINE_CACHE_MISS` warnings. Neither offline run had network permission or online fallback, and both exited naturally with valid manifests. The 45-entry cache was restored afterward.
|
|
454
|
+
- `--stdout` exited 0 in 6.69 seconds, emitted JSON only, parsed successfully, and passed schema and runtime invariants. No progress text entered stdout; stderr contained timing output only.
|
|
455
|
+
- Repository-relative custom output was created and validated. Replacing the existing target changed its inode, left only the final file, and left no temporary file. The temporary `artifacts/` directory was removed.
|
|
456
|
+
- Absolute output rejection exited 1 before writing the `$TMPDIR/vingrade-invalid-output.json` acceptance target; no partial output remained. The existing full-stack-trace CLI error behavior remains, but no stack trace entered a public artifact.
|
|
457
|
+
|
|
458
|
+
### Determinism
|
|
459
|
+
|
|
460
|
+
```text
|
|
461
|
+
firstResearchId sha256:6f415344ba50a7c427164d4d9d9d57248b98e71026f372826ec3bcb505e44d0c
|
|
462
|
+
secondResearchId sha256:6f415344ba50a7c427164d4d9d9d57248b98e71026f372826ec3bcb505e44d0c
|
|
463
|
+
equal true
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
The Project Manifest digest, policy, package/source facts, warning, and ordering were unchanged. Timestamps and durations differed as permitted.
|
|
467
|
+
|
|
468
|
+
### Schema, invariants, privacy, and portability
|
|
469
|
+
|
|
470
|
+
The first online, second online, offline hit, offline miss, stdout, and custom-output manifests all passed UpgradeLens's existing Draft 2020-12 schema validator and runtime invariant validator. Runtime checks also confirmed deterministic package, occurrence, release, source, reference, warning, and conflict ordering.
|
|
471
|
+
|
|
472
|
+
Recursive scans of the Project Manifest and both online Knowledge Manifests found no user-home or absolute local paths, cache filenames or keys, Knowledge Store paths, ETag/Last-Modified values, authorization/cookie/credential/query-token material, raw registry bodies, raw HTTP headers, stack traces, or internal payload-limit constants. All artifact, project, and manifest paths were repository-relative. All public source URLs were HTTPS. No privacy or portability regression was found.
|
|
473
|
+
|
|
474
|
+
### Revised verdict
|
|
475
|
+
|
|
476
|
+
**FAIL — RELEASE BLOCKING**
|
|
477
|
+
|
|
478
|
+
RC-01 fixes the former 1 MB payload blocker for representative valid npm/PyPI responses below the new ecosystem limits. The only remaining live package warning is Vite, whose current 38,902,327-byte npm response demonstrably exceeds the intentional 16 MiB safety ceiling; it is not evidence of the old limit regression or an external network failure.
|
|
479
|
+
|
|
480
|
+
However, the mandatory first clean online CLI run did not exit naturally after completing and writing its validated artifact. It retained established HTTPS sockets for more than six minutes and required termination after 427.64 seconds. This directly meets the specified release-blocking criterion. Cache/offline behavior, determinism, schema/runtime validity, privacy, portability, stdout separation, and output-path behavior otherwise passed. No UpgradeLens source patch was made during this retest, and MVP-03 was not started.
|