From 07e6065d5dcfc9444d47339b4dd2924f765938f2 Mon Sep 17 00:00:00 2001 From: Pan YANG Date: Sun, 19 Jul 2026 20:48:28 +0800 Subject: [PATCH] feat(data): strengthen catalog integrity --- data/changelogs.json | 82 +++++++++++++++++ data/data-health.json | 93 ++------------------ docs/DATA-HEALTH.md | 27 ++---- docs/DATA-TRUST.md | 4 +- docs/PROJECT-REVIEW-2026-07-18.md | 12 +++ manifests/clis/claude-code-cli.json | 36 +++++++- manifests/extensions/claude-code.json | 31 ++++++- manifests/extensions/droid.json | 2 +- manifests/extensions/gemini-code-assist.json | 68 ++++++++++---- manifests/extensions/qoder.json | 2 +- manifests/ides/intellij-idea.json | 7 +- manifests/ides/vscode.json | 7 +- manifests/ides/zed.json | 7 +- scripts/validate/data-health.ts | 2 +- tests/data-health.test.ts | 5 +- 15 files changed, 233 insertions(+), 152 deletions(-) diff --git a/data/changelogs.json b/data/changelogs.json index 06c5f151..9835cfbe 100644 --- a/data/changelogs.json +++ b/data/changelogs.json @@ -1,6 +1,88 @@ { "version": 1, "entries": [ + { + "id": "2026-07-19-data-integrity", + "date": "2026-07-19", + "summary": "Fixed product relationships and expanded official-source provenance for coding assistants", + "changes": [ + { + "category": "clis", + "id": "claude-code-cli", + "change": "updated", + "fields": [ + "docsUrl", + "latestVersion", + "resourceUrls", + "confidence", + "lastVerifiedAt", + "sources", + "verifiedBy" + ] + }, + { + "category": "extensions", + "id": "claude-code", + "change": "updated", + "fields": [ + "docsUrl", + "latestVersion", + "resourceUrls", + "confidence", + "lastVerifiedAt", + "sources", + "verifiedBy" + ] + }, + { + "category": "extensions", + "id": "droid", + "change": "updated", + "fields": ["relatedProducts"] + }, + { + "category": "extensions", + "id": "gemini-code-assist", + "change": "updated", + "fields": [ + "docsUrl", + "latestVersion", + "license", + "pricing", + "resourceUrls", + "supportedIdes", + "confidence", + "lastVerifiedAt", + "sources", + "verifiedBy" + ] + }, + { + "category": "extensions", + "id": "qoder", + "change": "updated", + "fields": ["relatedProducts"] + }, + { + "category": "ides", + "id": "intellij-idea", + "change": "updated", + "fields": ["relatedProducts"] + }, + { + "category": "ides", + "id": "vscode", + "change": "updated", + "fields": ["relatedProducts"] + }, + { + "category": "ides", + "id": "zed", + "change": "updated", + "fields": ["relatedProducts"] + } + ] + }, { "id": "2026-07-18-project-review", "date": "2026-07-18", diff --git a/data/data-health.json b/data/data-health.json index be91272d..1fb55dc3 100644 --- a/data/data-health.json +++ b/data/data-health.json @@ -1,5 +1,5 @@ { - "asOf": "2026-07-18", + "asOf": "2026-07-19", "thresholds": { "models": 30, "providers": 30, @@ -10,18 +10,18 @@ }, "summary": { "totalRecords": 134, - "recordsWithSources": 6, + "recordsWithSources": 9, "verifiedRecords": 39, - "provenanceComplete": 6, + "provenanceComplete": 9, "staleVerifiedRecords": 0, "translationPlaceholderValues": 1411, - "danglingRelationships": 5, + "danglingRelationships": 0, "modelBenchmarkCoverage": 28.1, "productsWithPricing": 48, "productRecords": 48, "errors": 0, - "warnings": 38, - "info": 128 + "warnings": 30, + "info": 125 }, "byCategory": { "ides": { @@ -33,13 +33,13 @@ "clis": { "total": 20, "verified": 2, - "provenanceComplete": 0, + "provenanceComplete": 1, "stale": 0 }, "extensions": { "total": 15, "verified": 3, - "provenanceComplete": 0, + "provenanceComplete": 2, "stale": 0 }, "models": { @@ -119,48 +119,6 @@ } }, "issues": [ - { - "severity": "warning", - "code": "dangling-related-product", - "category": "extensions", - "id": "droid", - "message": "References missing clis/factory." - }, - { - "severity": "warning", - "code": "dangling-related-product", - "category": "extensions", - "id": "qoder", - "message": "References missing ides/qoder-ide." - }, - { - "severity": "warning", - "code": "dangling-related-product", - "category": "ides", - "id": "intellij-idea", - "message": "References missing clis/idea." - }, - { - "severity": "warning", - "code": "dangling-related-product", - "category": "ides", - "id": "vscode", - "message": "References missing clis/code." - }, - { - "severity": "warning", - "code": "dangling-related-product", - "category": "ides", - "id": "zed", - "message": "References missing clis/zed." - }, - { - "severity": "warning", - "code": "verified-without-provenance", - "category": "clis", - "id": "claude-code-cli", - "message": "Verified record is missing sources, review date, reviewer, or confidence." - }, { "severity": "warning", "code": "verified-without-provenance", @@ -168,20 +126,6 @@ "id": "kilo-code-cli", "message": "Verified record is missing sources, review date, reviewer, or confidence." }, - { - "severity": "warning", - "code": "verified-without-provenance", - "category": "extensions", - "id": "claude-code", - "message": "Verified record is missing sources, review date, reviewer, or confidence." - }, - { - "severity": "warning", - "code": "verified-without-provenance", - "category": "extensions", - "id": "gemini-code-assist", - "message": "Verified record is missing sources, review date, reviewer, or confidence." - }, { "severity": "warning", "code": "verified-without-provenance", @@ -406,13 +350,6 @@ "id": "augment-code-cli", "message": "No structured source references are recorded." }, - { - "severity": "info", - "code": "missing-sources", - "category": "clis", - "id": "claude-code-cli", - "message": "No structured source references are recorded." - }, { "severity": "info", "code": "missing-sources", @@ -539,13 +476,6 @@ "id": "augment-code", "message": "No structured source references are recorded." }, - { - "severity": "info", - "code": "missing-sources", - "category": "extensions", - "id": "claude-code", - "message": "No structured source references are recorded." - }, { "severity": "info", "code": "missing-sources", @@ -574,13 +504,6 @@ "id": "droid", "message": "No structured source references are recorded." }, - { - "severity": "info", - "code": "missing-sources", - "category": "extensions", - "id": "gemini-code-assist", - "message": "No structured source references are recorded." - }, { "severity": "info", "code": "missing-sources", diff --git a/docs/DATA-HEALTH.md b/docs/DATA-HEALTH.md index ab255f4a..fccf249f 100644 --- a/docs/DATA-HEALTH.md +++ b/docs/DATA-HEALTH.md @@ -1,29 +1,29 @@ # Data Health Report -Snapshot date: 2026-07-18. Regenerate with `npm run data-health:report`. +Snapshot date: 2026-07-19. Regenerate with `npm run data-health:report`. ## Scorecard | Metric | Value | | --- | ---: | | Manifest records | 134 | -| Records with structured sources | 6 | +| Records with structured sources | 9 | | Verified records | 39 | -| Verified with complete provenance | 6 | +| Verified with complete provenance | 9 | | Stale verified records | 0 | | Non-English values identical to English | 1411 | -| Dangling product relationships | 5 | +| Dangling product relationships | 0 | | Model benchmark coverage | 28.1% | | Products with pricing | 48/48 | -| Errors / warnings / info | 0 / 38 / 128 | +| Errors / warnings / info | 0 / 30 / 125 | ## Category Breakdown | Category | Total | Verified | Provenance complete | Stale | | --- | ---: | ---: | ---: | ---: | | ides | 13 | 0 | 0 | 0 | -| clis | 20 | 2 | 0 | 0 | -| extensions | 15 | 3 | 0 | 0 | +| clis | 20 | 2 | 1 | 0 | +| extensions | 15 | 3 | 2 | 0 | | models | 33 | 28 | 3 | 0 | | providers | 13 | 4 | 3 | 0 | | vendors | 40 | 2 | 0 | 0 | @@ -50,9 +50,8 @@ Exact English matches are a triage signal; product names and technical terms can | Issue | Count | | --- | ---: | -| missing-sources | 128 | -| verified-without-provenance | 33 | -| dangling-related-product | 5 | +| missing-sources | 125 | +| verified-without-provenance | 30 | ## Priority Queue @@ -61,15 +60,7 @@ visible in the scorecards and `data/data-health.json`. | Severity | Issue | Record | Detail | | --- | --- | --- | --- | -| warning | dangling-related-product | extensions/droid | References missing clis/factory. | -| warning | dangling-related-product | extensions/qoder | References missing ides/qoder-ide. | -| warning | dangling-related-product | ides/intellij-idea | References missing clis/idea. | -| warning | dangling-related-product | ides/vscode | References missing clis/code. | -| warning | dangling-related-product | ides/zed | References missing clis/zed. | -| warning | verified-without-provenance | clis/claude-code-cli | Verified record is missing sources, review date, reviewer, or confidence. | | warning | verified-without-provenance | clis/kilo-code-cli | Verified record is missing sources, review date, reviewer, or confidence. | -| warning | verified-without-provenance | extensions/claude-code | Verified record is missing sources, review date, reviewer, or confidence. | -| warning | verified-without-provenance | extensions/gemini-code-assist | Verified record is missing sources, review date, reviewer, or confidence. | | warning | verified-without-provenance | extensions/kilo-code | Verified record is missing sources, review date, reviewer, or confidence. | | warning | verified-without-provenance | models/claude-opus-4 | Verified record is missing sources, review date, reviewer, or confidence. | | warning | verified-without-provenance | models/claude-opus-4-1 | Verified record is missing sources, review date, reviewer, or confidence. | diff --git a/docs/DATA-TRUST.md b/docs/DATA-TRUST.md index f7485e20..8c48df63 100644 --- a/docs/DATA-TRUST.md +++ b/docs/DATA-TRUST.md @@ -36,7 +36,7 @@ Example: ## Current rollout state -Legacy records may have `verified: true` without structured provenance because the boolean predates these fields. Treat those badges as evidence of a prior team review, not as a current freshness guarantee. They are being backfilled category by category; no source or review date should be invented merely to complete the fields. The first official-source batch covers OpenAI, Anthropic, and Google providers plus one representative model from each. +Legacy records may have `verified: true` without structured provenance because the boolean predates these fields. Treat those badges as evidence of a prior team review, not as a current freshness guarantee. They are being backfilled category by category; no source or review date should be invented merely to complete the fields. The first official-source batch covers OpenAI, Anthropic, and Google providers plus one representative model from each. The second batch covers the Claude Code CLI and IDE integration plus Gemini Code Assist, including current product editions and release information. For new entries and material updates, a `verified: true` change should include at least one authoritative source, `lastVerifiedAt`, `verifiedBy`, and `confidence`. Official product documentation and pricing pages are preferred over third-party summaries. Benchmark fields should cite the benchmark owner or an official model report. @@ -44,4 +44,4 @@ For new entries and material updates, a `verified: true` change should include a Run `npm run data-health:report` after manifest or translation changes and commit both generated snapshots. CI runs `npm run data-health:check` to reject invalid or stale snapshots. -The current review thresholds are 30 days for models and providers, 60 days for IDEs, CLIs, and extensions, and 90 days for vendors. Threshold findings remain warnings so that legacy debt stays visible without blocking unrelated work. Network reachability is checked by the separate scheduled URL workflow; source authority and field coverage remain pull-request review responsibilities. +The current review thresholds are 30 days for models and providers, 60 days for IDEs, CLIs, and extensions, and 90 days for vendors. Threshold findings remain warnings so that legacy debt stays visible without blocking unrelated work. Dangling product relationships are errors because they always point to nonexistent records and can break navigation. Network reachability is checked by the separate scheduled URL workflow; source authority and field coverage remain pull-request review responsibilities. diff --git a/docs/PROJECT-REVIEW-2026-07-18.md b/docs/PROJECT-REVIEW-2026-07-18.md index 5061dff6..2a969d3b 100644 --- a/docs/PROJECT-REVIEW-2026-07-18.md +++ b/docs/PROJECT-REVIEW-2026-07-18.md @@ -184,3 +184,15 @@ evidence; completed items are reflected in the checklists and implementation log - Added Axe browser checks for the search dialog, language menu, model comparison tables, and expanded mobile navigation, fixing the accessible names, ARIA relationships, decorative content, and contrast issues those checks exposed. + +### 2026-07-19 + +- Merged the six project-review delivery PRs into `main` in dependency order after revalidating each + layer's independent diff and completing the final combined CI run. +- Corrected five dangling product relationships, distinguishing actual catalog products from local + IDE launch commands, and made future dangling relationships fail the data-health CI check. +- Added official-source provenance for Claude Code CLI, Claude Code IDE integrations, and Gemini + Code Assist; refreshed current documentation, releases, licensing, and product editions where the + official sources showed that legacy values had changed. +- Improved the health snapshot from 6 to 9 records with complete provenance, reduced warnings from + 38 to 30, and eliminated all dangling relationships. diff --git a/manifests/clis/claude-code-cli.json b/manifests/clis/claude-code-cli.json index b78aa68e..16bd4d40 100644 --- a/manifests/clis/claude-code-cli.json +++ b/manifests/clis/claude-code-cli.json @@ -39,10 +39,40 @@ } }, "verified": true, + "sources": [ + { + "url": "https://code.claude.com/docs/en/how-claude-code-works", + "title": "How Claude Code works", + "fields": ["name", "description", "websiteUrl", "docsUrl"] + }, + { + "url": "https://code.claude.com/docs/en/installation", + "title": "Claude Code installation", + "fields": ["platforms"] + }, + { + "url": "https://github.com/anthropics/claude-code/releases/tag/v2.1.215", + "title": "Claude Code v2.1.215 release", + "fields": ["latestVersion", "resourceUrls.changelog"] + }, + { + "url": "https://claude.com/pricing", + "title": "Claude plans and pricing", + "fields": ["pricing"] + }, + { + "url": "https://code.claude.com/docs/en/mcp", + "title": "Claude Code MCP documentation", + "fields": ["description", "resourceUrls.mcp"] + } + ], + "lastVerifiedAt": "2026-07-19", + "verifiedBy": "codex-agent", + "confidence": "medium", "websiteUrl": "https://code.claude.com", - "docsUrl": "https://docs.claude.com", + "docsUrl": "https://code.claude.com/docs", "vendor": "Anthropic", - "latestVersion": "2.0.56", + "latestVersion": "2.1.215", "githubUrl": "https://github.com/anthropics/claude-code", "license": "Proprietary", "pricing": [ @@ -93,7 +123,7 @@ "download": null, "changelog": "https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md", "pricing": "https://claude.com/pricing", - "mcp": "https://docs.claude.com/en/docs/claude-code/mcp", + "mcp": "https://code.claude.com/docs/en/mcp", "issue": "https://github.com/anthropics/claude-code/issues" }, "communityUrls": { diff --git a/manifests/extensions/claude-code.json b/manifests/extensions/claude-code.json index 681d4327..7addd532 100644 --- a/manifests/extensions/claude-code.json +++ b/manifests/extensions/claude-code.json @@ -39,10 +39,35 @@ } }, "verified": true, + "sources": [ + { + "url": "https://code.claude.com/docs/en/ide-integrations", + "title": "Claude Code for VS Code", + "fields": ["description", "supportedIdes"] + }, + { + "url": "https://code.claude.com/docs/en/jetbrains", + "title": "Claude Code for JetBrains IDEs", + "fields": ["supportedIdes"] + }, + { + "url": "https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code", + "title": "Claude Code for VS Code marketplace listing", + "fields": ["name", "websiteUrl", "supportedIdes"] + }, + { + "url": "https://claude.com/pricing", + "title": "Claude plans and pricing", + "fields": ["pricing"] + } + ], + "lastVerifiedAt": "2026-07-19", + "verifiedBy": "codex-agent", + "confidence": "medium", "websiteUrl": "https://code.claude.com", - "docsUrl": "https://docs.claude.com", + "docsUrl": "https://code.claude.com/docs/en/ide-integrations", "vendor": "Anthropic", - "latestVersion": "2.0.42", + "latestVersion": "Latest", "githubUrl": "https://github.com/anthropics/claude-code", "license": "Proprietary", "pricing": [ @@ -93,7 +118,7 @@ "download": null, "changelog": "https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md", "pricing": "https://claude.com/pricing", - "mcp": "https://docs.claude.com/en/docs/claude-code/mcp", + "mcp": "https://code.claude.com/docs/en/mcp", "issue": "https://github.com/anthropics/claude-code/issues" }, "communityUrls": { diff --git a/manifests/extensions/droid.json b/manifests/extensions/droid.json index 74436bb1..661698ba 100644 --- a/manifests/extensions/droid.json +++ b/manifests/extensions/droid.json @@ -94,7 +94,7 @@ "relatedProducts": [ { "type": "cli", - "productId": "factory" + "productId": "droid-cli" } ], "supportedIdes": [ diff --git a/manifests/extensions/gemini-code-assist.json b/manifests/extensions/gemini-code-assist.json index 2a9aa29c..2c499991 100644 --- a/manifests/extensions/gemini-code-assist.json +++ b/manifests/extensions/gemini-code-assist.json @@ -39,39 +39,71 @@ } }, "verified": true, + "sources": [ + { + "url": "https://docs.cloud.google.com/gemini/docs/codeassist/overview", + "title": "Gemini Code Assist Standard and Enterprise overview", + "fields": ["name", "description", "docsUrl", "supportedIdes"] + }, + { + "url": "https://docs.cloud.google.com/gemini/docs/codeassist/release-notes", + "title": "Gemini Code Assist release notes", + "fields": ["latestVersion", "resourceUrls.changelog"] + }, + { + "url": "https://cloud.google.com/products/gemini/pricing", + "title": "Gemini for Google Cloud pricing", + "fields": ["pricing"] + }, + { + "url": "https://marketplace.visualstudio.com/items/Google.geminicodeassist/license", + "title": "Gemini Code Assist plugin license", + "fields": ["license"] + } + ], + "lastVerifiedAt": "2026-07-19", + "verifiedBy": "codex-agent", + "confidence": "medium", "websiteUrl": "https://codeassist.google/", - "docsUrl": "https://developers.google.com/code-assist", + "docsUrl": "https://docs.cloud.google.com/gemini/docs/codeassist/overview", "vendor": "Google", - "latestVersion": "1.0.0", + "latestVersion": "VS Code 2.87.0 / JetBrains 1.54.1", "githubUrl": null, - "license": "Freemium", + "license": "Proprietary", "pricing": [ { - "name": "Individual", - "value": 0, - "currency": null, - "per": "month", - "category": "Individual" + "name": "Standard (Monthly Commitment)", + "value": 22.8, + "currency": "USD", + "per": "user/month", + "category": "Business" }, { - "name": "Teams", + "name": "Standard (12-Month Commitment)", "value": 19, "currency": "USD", "per": "user/month", "category": "Business" }, { - "name": "Enterprise", - "value": null, - "currency": null, - "per": "custom", + "name": "Enterprise (Monthly Commitment)", + "value": 54, + "currency": "USD", + "per": "user/month", + "category": "Enterprise" + }, + { + "name": "Enterprise (12-Month Commitment)", + "value": 45, + "currency": "USD", + "per": "user/month", "category": "Enterprise" } ], "resourceUrls": { - "download": "https://marketplace.visualstudio.com/items?itemName=google.gemini-code-assist", - "changelog": "https://developers.google.com/code-assist/changelog", - "pricing": "https://developers.google.com/code-assist/pricing", + "download": "https://marketplace.visualstudio.com/items?itemName=Google.geminicodeassist", + "changelog": "https://docs.cloud.google.com/gemini/docs/codeassist/release-notes", + "pricing": "https://cloud.google.com/products/gemini/pricing", "mcp": null, "issue": null }, @@ -88,8 +120,8 @@ "supportedIdes": [ { "ideId": "vscode", - "marketplaceUrl": "https://marketplace.visualstudio.com/items?itemName=google.gemini-code-assist", - "installUri": "vscode:extension/google.gemini-code-assist" + "marketplaceUrl": "https://marketplace.visualstudio.com/items?itemName=Google.geminicodeassist", + "installUri": "vscode:extension/Google.geminicodeassist" }, { "ideId": "jetbrains", diff --git a/manifests/extensions/qoder.json b/manifests/extensions/qoder.json index 3b9d37f6..0628cdd3 100644 --- a/manifests/extensions/qoder.json +++ b/manifests/extensions/qoder.json @@ -77,7 +77,7 @@ }, { "type": "ide", - "productId": "qoder-ide" + "productId": "qoder" } ], "supportedIdes": [ diff --git a/manifests/ides/intellij-idea.json b/manifests/ides/intellij-idea.json index f2d8da51..6f412b80 100644 --- a/manifests/ides/intellij-idea.json +++ b/manifests/ides/intellij-idea.json @@ -84,12 +84,7 @@ "reddit": "https://www.reddit.com/r/IntelliJIDEA", "blog": "https://blog.jetbrains.com/idea" }, - "relatedProducts": [ - { - "type": "cli", - "productId": "idea" - } - ], + "relatedProducts": [], "platforms": [ { "os": "macOS", diff --git a/manifests/ides/vscode.json b/manifests/ides/vscode.json index 3fa0404f..e53baef3 100644 --- a/manifests/ides/vscode.json +++ b/manifests/ides/vscode.json @@ -70,12 +70,7 @@ "reddit": "https://www.reddit.com/r/vscode", "blog": "https://code.visualstudio.com/blogs" }, - "relatedProducts": [ - { - "type": "cli", - "productId": "code" - } - ], + "relatedProducts": [], "platforms": [ { "os": "macOS", diff --git a/manifests/ides/zed.json b/manifests/ides/zed.json index be40fedf..0d7edcb4 100644 --- a/manifests/ides/zed.json +++ b/manifests/ides/zed.json @@ -84,12 +84,7 @@ "reddit": null, "blog": "https://zed.dev/blog" }, - "relatedProducts": [ - { - "type": "cli", - "productId": "zed" - } - ], + "relatedProducts": [], "platforms": [ { "os": "macOS", diff --git a/scripts/validate/data-health.ts b/scripts/validate/data-health.ts index 8afef296..c855a699 100644 --- a/scripts/validate/data-health.ts +++ b/scripts/validate/data-health.ts @@ -316,7 +316,7 @@ export function analyzeDataHealth( const productId = getString(related.productId) if (targetCategory && productId && !idsByCategory.get(targetCategory)?.has(productId)) { issues.push({ - severity: 'warning', + severity: 'error', code: 'dangling-related-product', category: record.category, id, diff --git a/tests/data-health.test.ts b/tests/data-health.test.ts index 3622a5ec..4c3a78b7 100644 --- a/tests/data-health.test.ts +++ b/tests/data-health.test.ts @@ -44,7 +44,7 @@ describe('data health reporting', () => { }) }) - it('reports missing provenance, stale reviews, and missing relationships', () => { + it('treats missing relationships as errors alongside provenance and freshness warnings', () => { const report = analyzeDataHealth( [ record('ides', 'editor', { @@ -66,7 +66,8 @@ describe('data health reporting', () => { recordsWithSources: 0, staleVerifiedRecords: 1, danglingRelationships: 1, - warnings: 3, + errors: 1, + warnings: 2, info: 1, }) })