chore(quality): gate provider asset provenance (#11743)

Merged via /merge-batch (v3.8.51 provenance sweep). Boarded and validated together with the batch's other provenance PRs in a combined worktree — full gate suite green, including the new provider-asset-provenance gate/manifest introduced here. Thank you.
This commit is contained in:
Diego Rodrigues de Sa e Souza
2026-08-28 04:39:35 -03:00
committed by GitHub
parent 3f5b08f2a6
commit acb9ba6978
7 changed files with 1240 additions and 1 deletions

View File

@@ -93,6 +93,7 @@ jobs:
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
persist-credentials: false
- uses: actions/setup-node@v7
with:
@@ -127,6 +128,7 @@ jobs:
- run: npm run check:any-budget:t11
- run: npm run check:provider-consistency
- run: npm run check:model-lifecycle
- run: npm run check:provider-asset-provenance
- run: npm run check:fetch-targets
- run: npm run check:deps
- run: npm run check:file-size

View File

@@ -269,7 +269,7 @@ jobs:
run: |
set -uo pipefail
gates=(
provider-consistency fetch-targets deps file-size error-helper
provider-consistency provider-asset-provenance fetch-targets deps file-size error-helper
migration-numbering public-creds db-rules known-symbols
route-guard-membership test-discovery test-runner-api
mutation-test-coverage any-budget:t11 build-scope pack-policy

View File

@@ -0,0 +1 @@
- **chore(quality):** added a versioned 225/225 provider-asset provenance manifest and blocking drift gate ([#11743](https://github.com/diegosouzapw/OmniRoute/pull/11743)) — the inventory pins magic MIME and SHA-256 for every physical file, records immutable source matches for 71 assets, keeps 69 probable and 85 unresolved entries explicit but non-blocking, and treats provenance as source evidence rather than copyright or trademark clearance.

View File

@@ -0,0 +1,231 @@
{"recordType":"manifest","schemaVersion":1,"expectedAssetCount":225,"auditedCommit":"091589089cd134a94df9f6cdab9ba562b2cefd18","auditedAt":"2026-08-26","scope":"Every regular file directly under public/providers at the audited commit.","statusSemantics":{"proven":"Immutable source plus byte-exact or SVG path-data match.","probable":"Repository evidence suggests provenance, but no immutable upstream match is proven.","unresolved":"No sufficient immutable provenance evidence is recorded."},"enforcement":"All physical files, hashes, magic MIME values, statuses, and duplicate aliases are blocking. Probable and unresolved statuses are recorded but non-blocking in schema version 1.","legalScope":"Provenance records source matching only; it does not establish copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/360ai.svg","mediaType":"image/svg+xml","sha256":"59366fe04a4336518b8277b430f4a464a91e7ec944c9cf6f40a945c74002386d","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/Ai360/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"All 5/5 local SVG path d values match the pinned Color component."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."}
{"recordType":"asset","path":"public/providers/adapta-web.png","mediaType":"image/png","sha256":"4b6e748879bd76ced99f3885767ead179739c5d56a63daf7baccda0805b69d11","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/agentrouter.png","mediaType":"image/png","sha256":"32132a307cad98d7f93b0384de87411f087bb34c148c932dcd5eea92101cbec3","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/aimlapi.png","mediaType":"image/png","sha256":"775ac2602a35e725b4f452b29c0827ca51872914a6f834afaf451342c1400c90","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/alibaba.svg","mediaType":"image/svg+xml","sha256":"1cd1e7be5108d1e847508dc9e40591fb6eb29aac20bbf7f4c56c6f082359b323","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/alibaba/default.svg","integrity":"sha256:1cd1e7be5108d1e847508dc9e40591fb6eb29aac20bbf7f4c56c6f082359b323","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://alibaba.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/anthropic-m.png","mediaType":"image/png","sha256":"2440273e0dde1c58af905aa5c6246e603d949b11aceef70dc39502e620e4e3ee","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/anthropic.svg","mediaType":"image/svg+xml","sha256":"7fea3100bfc2a9480e181fc615d4791cab014f54674b83953785abb86dc293f0","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/anthropic/default.svg","integrity":"sha256:7fea3100bfc2a9480e181fc615d4791cab014f54674b83953785abb86dc293f0","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.anthropic.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/api-airforce.svg","mediaType":"image/svg+xml","sha256":"1b03c991ad613f781fa02b3a22e357e753beee6e8801249ac366acec7a6b974f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/apikey.svg","mediaType":"image/svg+xml","sha256":"b348407ccd0b19eaa00b5ed4e5cf7e69ea8e244291c9cadc41dfb2495f80c381","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/arcee-ai.svg","mediaType":"image/svg+xml","sha256":"41a8ed8278ec89d6a12ba5c96172ee30d6fadc93474792a8c95732ad7466233e","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/arcee.svg","mediaType":"image/svg+xml","sha256":"c54fde7b3f98270594daaa1215f07c22d705bb89799d9a116321fd2b3379e971","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/arcee/default.svg","integrity":"sha256:c54fde7b3f98270594daaa1215f07c22d705bb89799d9a116321fd2b3379e971","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://arcee.ai/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/arena-dark.svg","mediaType":"image/svg+xml","sha256":"5c783b4dadd9c76f65cc64d4a42a3a285d12dfe3d6b297280223b5f893350735","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/arena-light.svg","mediaType":"image/svg+xml","sha256":"b4e3a8342fa5e9669455581d68e5ae0b34deaf3dde7e99297bc002626b7f3679","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/assemblyai.svg","mediaType":"image/svg+xml","sha256":"12b95e8db89da1d2676fe289b942e5ebd23e61743bfbae5291c18e07509f5f1a","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/assemblyai/default.svg","integrity":"sha256:12b95e8db89da1d2676fe289b942e5ebd23e61743bfbae5291c18e07509f5f1a","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://assemblyai.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/auggie.svg","mediaType":"image/svg+xml","sha256":"deef0f33f2be4516c977d1ca0c2580265752eb6b2111ffa6a10d99ae6e39f3fb","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/aws.svg","mediaType":"image/svg+xml","sha256":"65e2ca39ef0669dbb0323bc5ab69f981b8087d8ebb3e4a3bce1d3b32b3b67151","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/aws/default.svg","integrity":"sha256:65e2ca39ef0669dbb0323bc5ab69f981b8087d8ebb3e4a3bce1d3b32b3b67151","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://aws.amazon.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/azure.svg","mediaType":"image/svg+xml","sha256":"6c6f0097f0e4a2b4adb7c29f770205c25b7b5c97fb317f3eaebab603f0de4a35","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/azure/default.svg","integrity":"sha256:6c6f0097f0e4a2b4adb7c29f770205c25b7b5c97fb317f3eaebab603f0de4a35","match":"byte-exact"},"upstreamLicenseClaim":{"value":"brand-use","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://azure.microsoft.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/azureai.svg","mediaType":"image/svg+xml","sha256":"a8ad4524c2b8277209bfd0fda29dd9a659fa0d8c2d75f7adb0acd36045b98f96","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/baichuan.svg","mediaType":"image/svg+xml","sha256":"7d49311206402734850ed9dc112759780429bb363dcee31eccb5a92f428532a6","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/Baichuan/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"The local SVG path d value matches the pinned Color component (1/1)."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."}
{"recordType":"asset","path":"public/providers/baidu.svg","mediaType":"image/svg+xml","sha256":"1059750a2069aec6080ff48732931e87a99bd3d22db3e8471cebe255b6014b75","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/bailian.svg","mediaType":"image/svg+xml","sha256":"240f4584c8ae0a32ec84ab53068abc6649881393e831af716c389e4825ac6779","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/bailian/default.svg","integrity":"sha256:240f4584c8ae0a32ec84ab53068abc6649881393e831af716c389e4825ac6779","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://bailian.console.aliyun.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/baseten.svg","mediaType":"image/svg+xml","sha256":"345e69ec97668ac946cdeb36cd47f39f82d9d0a9fb597325df21874881c6c95c","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/baseten/default.svg","integrity":"sha256:345e69ec97668ac946cdeb36cd47f39f82d9d0a9fb597325df21874881c6c95c","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://baseten.co"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/bazaarlink.svg","mediaType":"image/svg+xml","sha256":"9e16ff0a57ca5badc2e2fdcc3661b69ea4c5395c5cedc839d93ae670f043f9a8","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/blackbox-web.png","mediaType":"image/png","sha256":"ba3be1b3edff386b3a55bedb03e219d6cd497504ead4eae93a20d4172924af54","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/blackbox.png","mediaType":"image/png","sha256":"4f5f895b0b6a777f0ab75e9be328ca7c092be2625c89414a2d994d1255c6524f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/bluesminds.svg","mediaType":"image/svg+xml","sha256":"669efe432349463f0753fc093e55181f91ac604a08ef23d354085c2ed439c9e4","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/brave-search.svg","mediaType":"image/svg+xml","sha256":"2530f80fdf2144b62f96953a81c6988c9c31a6cc7c9de72e069079485817cbe7","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/brave.svg","mediaType":"image/svg+xml","sha256":"2530f80fdf2144b62f96953a81c6988c9c31a6cc7c9de72e069079485817cbe7","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/byteplus.svg","mediaType":"image/svg+xml","sha256":"8fe36c991b3f5a4f7ab32d381f8685705894ee9167bd54def172065cc90e8667","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/bytez.svg","mediaType":"image/svg+xml","sha256":"64e352d06ecb3f5d4ecb64506eea82f6b1583118574dd203316b750e2737421b","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/cartesia.svg","mediaType":"image/svg+xml","sha256":"f9771f7cc47f6ead48cc82202fcf48343ca7c8d6acc112d2a810aa0719f37341","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/cerebras.svg","mediaType":"image/svg+xml","sha256":"b0f331de0f07ef52cd9078b7cd85a646b3363fbdafe8203a022a8ce01038d0d4","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/cerebras/default.svg","integrity":"sha256:b0f331de0f07ef52cd9078b7cd85a646b3363fbdafe8203a022a8ce01038d0d4","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://cerebras.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/charm-hyper.svg","mediaType":"image/svg+xml","sha256":"2203baaa2c92e3ba51ce1102a56d5252de464769f3a136e0e541dd770f6e0493","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/cheaperinference.svg","mediaType":"image/svg+xml","sha256":"ba0bc069c23635cec121631c00a83821c2b37a9c305047e1137c5ed91c206f04","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/chipotle.svg","mediaType":"image/svg+xml","sha256":"a6dbd58ac2709f911f72a5b3f7b213eefaf386e45ca57265bb5d846490b41802","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/chutes.svg","mediaType":"image/svg+xml","sha256":"0da85d29012d21825d7a23e9ed9733f1736fb4457aaa807ac1cbb6ccd50447e5","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/clarifai.svg","mediaType":"image/svg+xml","sha256":"329d129d742c7a98ddb9609d14fd5fa40ed6a6acb0df37f7df1ec6a625d7b3cf","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/claude-web.svg","mediaType":"image/svg+xml","sha256":"a3101f3047a119aa11825ad9369510f0c472428c8c52d420e31bc62db44a8364","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/claude.svg","mediaType":"image/svg+xml","sha256":"a3101f3047a119aa11825ad9369510f0c472428c8c52d420e31bc62db44a8364","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/cli-generic.svg","mediaType":"image/svg+xml","sha256":"7e84afa7786c12713ef24fae43636ac569238baa183f4f4cf447bfe8927abef2","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history describes a neutral terminal glyph, but no immutable authorship or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/cline.svg","mediaType":"image/svg+xml","sha256":"9ba76231c007d458b43d6ed104feff2e0e32299cef30e43f643f941ff92a7153","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/cline/default.svg","integrity":"sha256:9ba76231c007d458b43d6ed104feff2e0e32299cef30e43f643f941ff92a7153","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://cline.bot/assets/branding/logos/cline-wordmark-black.svg"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/cliproxyapi.png","mediaType":"image/png","sha256":"ec3768ec99fe47ac13e748720e85f67c7e05aa6794d619d13af50f5b8f8d1f21","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/cloudflare.svg","mediaType":"image/svg+xml","sha256":"a986a9eda9b111bb0e3745bb4453f3c7aad33b974367348d36b5c02719ae01a2","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/codex.svg","mediaType":"image/svg+xml","sha256":"4a2f43ce46b5b6e3722c95088f88d26ef91e6a8c2e598e70642a1c54367386e4","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/Codex/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"All 2/2 local SVG path d values match the pinned Color component."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."}
{"recordType":"asset","path":"public/providers/cohere.svg","mediaType":"image/svg+xml","sha256":"f6aa4ebde660951b60e9f3438bbf82f48d7e64ddcd1707a672b92ba57626a024","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/comfyui.svg","mediaType":"image/svg+xml","sha256":"0867b6df03d94ac9240993abb8f7636e4d1254aa8a0cb69fe3c29be1d30fbdcf","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/comfyui/default.svg","integrity":"sha256:0867b6df03d94ac9240993abb8f7636e4d1254aa8a0cb69fe3c29be1d30fbdcf","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://comfy.org"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/command-code.svg","mediaType":"image/svg+xml","sha256":"7137a48d8522ee555dde47166edc3b36f1078a8952e77943df037648f6b5b571","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/continue.svg","mediaType":"image/svg+xml","sha256":"c289d46ef6901c5fa9f4968e314d209af4d3bb774b9f390d7aeb4a5290b9ed2b","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/continue/default.svg","integrity":"sha256:c289d46ef6901c5fa9f4968e314d209af4d3bb774b9f390d7aeb4a5290b9ed2b","match":"byte-exact"},"upstreamLicenseClaim":{"value":"Apache-2.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://continue.dev"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/copilot.svg","mediaType":"image/svg+xml","sha256":"04f15d0556fbac10a4e0f82d1560610db8b33cd04780a4f24ad3b91c4abd278d","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/Copilot/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"All 6/6 local SVG path d values match the pinned Color component."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."}
{"recordType":"asset","path":"public/providers/coze.svg","mediaType":"image/svg+xml","sha256":"6e941b56746e9c58e9b3ec9734f92384462bec857fff7234abb671b0aa81a5e6","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/crof.svg","mediaType":"image/svg+xml","sha256":"10287dca3f0efca484d917a6abb8b3b1b7cb9458127522dedd1df3095df792bf","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/cursor.svg","mediaType":"image/svg+xml","sha256":"cd0e3e5d8991a4cdd4577f8896cd063105207665165c73e25a1ff918dd367eb7","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/cursor/default.svg","integrity":"sha256:cd0e3e5d8991a4cdd4577f8896cd063105207665165c73e25a1ff918dd367eb7","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.cursor.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/dahl.png","mediaType":"image/png","sha256":"f89396a077cd4118157fca8d983ff31397baabe6531d03c4e7fd3bc3a7342982","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/deepgram.svg","mediaType":"image/svg+xml","sha256":"391f7d32e87f97489a3f409fc80a38bc8ef592617070e735055bfaa2c6e6f711","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/deepgram/default.svg","integrity":"sha256:391f7d32e87f97489a3f409fc80a38bc8ef592617070e735055bfaa2c6e6f711","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://deepgram.com/company/newsroom"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/deepinfra.svg","mediaType":"image/svg+xml","sha256":"e2daddb98348277845a52a78bf1b04d33d333aaaf06fd641b020f26e5a0669ee","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/deepinfra/default.svg","integrity":"sha256:e2daddb98348277845a52a78bf1b04d33d333aaaf06fd641b020f26e5a0669ee","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://deepinfra.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/deepseek.svg","mediaType":"image/svg+xml","sha256":"2ac9f2281f078ffd2857c050b7828fe5eb49a69bdcea65da3839fdc46af70335","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/dgrid.svg","mediaType":"image/svg+xml","sha256":"7b55bc9f408193c2a6e9967b33ef1e17522194341a4f51c54025ec7c68afb5a6","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/dify.svg","mediaType":"image/svg+xml","sha256":"6c1704b6f14eb995d010549847b733dbbc54af66974a2bc62623fbdad4981c66","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/digitalocean.svg","mediaType":"image/svg+xml","sha256":"095e5839f856cc930d8cf33c619470480dddbf785b930cd4c20a360347effdce","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/dit.svg","mediaType":"image/svg+xml","sha256":"2df81e2ba3401ed8024b01dd1f11704744574e5333dbf0ef0a5c1898e9be6f93","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/docker-model-runner.svg","mediaType":"image/svg+xml","sha256":"d516c4eda88941f8816786d310624e42a40941712c9801abe2a918d1a6fdcbc7","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/doubao.svg","mediaType":"image/svg+xml","sha256":"3cd31ba03ae44b8c29561597a3b863809efecb13fcdfd08407a086df86a69b55","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/droid.svg","mediaType":"image/svg+xml","sha256":"96290a3c012904a4796e51629ef72ff20fddc6a24d1a21fece96f17c0439e062","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/duckduckgo-web.svg","mediaType":"image/svg+xml","sha256":"83fde60229cb98fd381a1b0f01e7330ac74bcd50cbaf43db5d2e3004a3eeab84","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/elevenlabs.svg","mediaType":"image/svg+xml","sha256":"24e2fe318bc1ed54a29ceb867e4ecead952355cda4241b07402d1ff6510dc133","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/elevenlabs/default.svg","integrity":"sha256:24e2fe318bc1ed54a29ceb867e4ecead952355cda4241b07402d1ff6510dc133","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://elevenlabs.io/brand"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/empower.png","mediaType":"image/png","sha256":"ea0dbf43dbbcc8d6ea22681a95ca694f2ba7797ce5a8abdfced3f73eb1b0a72a","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/exa.svg","mediaType":"image/svg+xml","sha256":"2ccd7ec05fa43dbfcfa7d0df1810f07978edb82afca3b2cb83a9393aa2e33ee8","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/exa/default.svg","integrity":"sha256:2ccd7ec05fa43dbfcfa7d0df1810f07978edb82afca3b2cb83a9393aa2e33ee8","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://exa.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/factory.svg","mediaType":"image/svg+xml","sha256":"472057d6a04afc32a23af1e90ce318491dee2f3fc03ab3e6b6c06d254c419253","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/fal.svg","mediaType":"image/svg+xml","sha256":"5214ae1cf705b0ce4c155f03efadca2b16685586fc46a237910610b920a46e2f","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/fal/default.svg","integrity":"sha256:5214ae1cf705b0ce4c155f03efadca2b16685586fc46a237910610b920a46e2f","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://fal.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/fireworks.svg","mediaType":"image/svg+xml","sha256":"1df32a350d032f6d8a0860271473c10ae5d9d97273f3f8402c454e7feb33a626","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/fireworks/default.svg","integrity":"sha256:1df32a350d032f6d8a0860271473c10ae5d9d97273f3f8402c454e7feb33a626","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://fireworks.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/freeaiapikey.svg","mediaType":"image/svg+xml","sha256":"36dac65bf68ce787c222d342fa497e2c1c2e051ca011befa4e3d27f6e9dd3b0d","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/freebuff-dark.svg","mediaType":"image/svg+xml","sha256":"4d48a1405c68b00121fa7100e080025fa3e9e090c59055b56e4ad0aee1a7de7f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/freebuff-light.svg","mediaType":"image/svg+xml","sha256":"4d48a1405c68b00121fa7100e080025fa3e9e090c59055b56e4ad0aee1a7de7f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/freebuff.png","mediaType":"image/png","sha256":"ef3ddde4bbda499f6d9e04139bfef9a9eac310244d8b5215da7c075806388011","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/freebuff.svg","mediaType":"image/svg+xml","sha256":"4d48a1405c68b00121fa7100e080025fa3e9e090c59055b56e4ad0aee1a7de7f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/freemodel-dev.svg","mediaType":"image/svg+xml","sha256":"492311bb580cb397a8ba245fcd7585912bc3e3ffc09c2e0a6a245319c6005c77","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/friendli.svg","mediaType":"image/svg+xml","sha256":"2c39f9cfb3cb37dd96c72972495341b6e5dc5077a49566a232a692428a39aefa","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/friendli/default.svg","integrity":"sha256:2c39f9cfb3cb37dd96c72972495341b6e5dc5077a49566a232a692428a39aefa","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://friendli.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/galadriel.svg","mediaType":"image/svg+xml","sha256":"c515553cb07a098a9e494fc139954deb19abd97ed9a0fa212005d3fb1c0ad31d","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/gemini.svg","mediaType":"image/svg+xml","sha256":"c11d94a9e3ecb32f67dd9350848cf3124d617680533275c672e1e6bf61ce8cd4","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/gemini/default.svg","integrity":"sha256:c11d94a9e3ecb32f67dd9350848cf3124d617680533275c672e1e6bf61ce8cd4","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://gemini.google.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/gigachat.png","mediaType":"image/jpeg","sha256":"e541f8a2537150bec9c1f09ed4e850205af6f553a31207c95372af3ba1f9d3a9","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/gitlab-duo.svg","mediaType":"image/svg+xml","sha256":"67413dbdc9be21ca995ad318234e5463af1262668b4a203da72388e22ef3ac40","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/gitlab.svg","mediaType":"image/svg+xml","sha256":"67413dbdc9be21ca995ad318234e5463af1262668b4a203da72388e22ef3ac40","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/gitlawb-gmi.svg","mediaType":"image/svg+xml","sha256":"7e79329c67b011fece39606151f500720ff6017bc2c2cb2ca8a841a453fb14ef","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/gitlawb.svg","mediaType":"image/svg+xml","sha256":"4f8a7ba91c2db0383bbab00c80d45919de1394337e83269396afedad1c957a15","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/google.svg","mediaType":"image/svg+xml","sha256":"fb800918b0b68f12d7a143cb3f51316e478697daa662e7c3d03621f15a4d1d73","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/grok.svg","mediaType":"image/svg+xml","sha256":"b20648e2f111d7fbc91f58b22d1e76e9885b68a163cb5a1010f7f11bf5840491","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/grok/default.svg","integrity":"sha256:b20648e2f111d7fbc91f58b22d1e76e9885b68a163cb5a1010f7f11bf5840491","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://grok.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/groq.svg","mediaType":"image/svg+xml","sha256":"f8b4420340ff8875a1f04ce80909325dd81b0cb78d0c7a15fd567977338ae956","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/groq/default.svg","integrity":"sha256:f8b4420340ff8875a1f04ce80909325dd81b0cb78d0c7a15fd567977338ae956","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://groq.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/haiper.svg","mediaType":"image/svg+xml","sha256":"961d91a3cbcf20372128a5e2a12f568ff8fb5b09cd6d63e5b85fe2e8f5e47c48","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/hcnsec.svg","mediaType":"image/svg+xml","sha256":"ea059057d9f92f7ad8ee0fea634812ff31e454924043f26009f6c1f58db58146","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/heroku.svg","mediaType":"image/svg+xml","sha256":"eed8d3cb106c7d1047cbf85d974011911c46aed78616dc748133fe6b7740ee33","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/heroku/default.svg","integrity":"sha256:eed8d3cb106c7d1047cbf85d974011911c46aed78616dc748133fe6b7740ee33","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.heroku.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/huggingchat.svg","mediaType":"image/svg+xml","sha256":"5d39d66bb6c9b026d3cb5de7bd9978dad3906570df2aca8f00078a6f8a3d0f5e","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/huggingface.svg","mediaType":"image/svg+xml","sha256":"596c7b0e1fb7598c0b178276bfba4a33022e9e285461db42c5903b07375f81fa","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/huggingface/default.svg","integrity":"sha256:596c7b0e1fb7598c0b178276bfba4a33022e9e285461db42c5903b07375f81fa","match":"byte-exact"},"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source, but that registry ref has no license metadata for this slug. No legal clearance is inferred."}
{"recordType":"asset","path":"public/providers/hyperbolic.svg","mediaType":"image/svg+xml","sha256":"f61f429451497ffc5d03e3e4dfc09f79ac067d848336a048e0a373aa5299990a","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/hyperbolic/default.svg","integrity":"sha256:f61f429451497ffc5d03e3e4dfc09f79ac067d848336a048e0a373aa5299990a","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://hyperbolic.xyz"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/ibm.svg","mediaType":"image/svg+xml","sha256":"b68f2d7e0cb1e0a7c09a54574402528be3b00bfdd4bb7710e85aec7a50efb6f2","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/ibm/default.svg","integrity":"sha256:b68f2d7e0cb1e0a7c09a54574402528be3b00bfdd4bb7710e85aec7a50efb6f2","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.ibm.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/ideogram.svg","mediaType":"image/svg+xml","sha256":"bbccfb17aaf068aeebdfd598b4130f0992feea075f553015be82f086b9ff68ad","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/iflytek.svg","mediaType":"image/svg+xml","sha256":"0012c7c24cf8d987a9e2fd17e9b555ff8082e4a7369b3e57dc0a827146bb0868","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/inclusionai.svg","mediaType":"image/svg+xml","sha256":"5f400bfb76593c16907eecc95fa875e3d0751ba49b32c6c10d7c07744d5d1ba0","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/inference.svg","mediaType":"image/svg+xml","sha256":"f3f44ad6cb293023d7df21dd38109377197503df52b1baeb2f51556a6d52873b","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/inference/default.svg","integrity":"sha256:f3f44ad6cb293023d7df21dd38109377197503df52b1baeb2f51556a6d52873b","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://inference.net"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/inner-ai.png","mediaType":"image/png","sha256":"fbc0bf77452b6b705c788aeef0c396d8cafe32a5e7143f9fcb3030ce221b9ebc","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/inworld.svg","mediaType":"image/svg+xml","sha256":"04d63fe0089ba50aaa98a5e77f6970ff8cfa8aa807f51c38967170879762f9ed","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/ironclaw.png","mediaType":"image/png","sha256":"af3a8075083264332fc8a3d5b0d4f936716753738e57f3b63e9c81f16bb83171","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/kenari.svg","mediaType":"image/svg+xml","sha256":"d5c66cc423f69cbd326c1b4612e343d97278ec0cc1bcdfc39a23e074ac06420c","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/kie.png","mediaType":"image/png","sha256":"c1854980b86614a6539341cf38bb1f83ddcda1ce11e3718543d3a8562973f6a7","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/kilo-gateway.svg","mediaType":"image/svg+xml","sha256":"0bf05e2f9c1355e8a1d020c07f433ea725f1270607f04b83c398d44914ebe422","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/kilocode.svg","mediaType":"image/svg+xml","sha256":"0bf05e2f9c1355e8a1d020c07f433ea725f1270607f04b83c398d44914ebe422","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/kimi-logomark-dark.svg","mediaType":"image/svg+xml","sha256":"e15425da3274436f2203cfe532e8194965cbc2602c49baf60e320fe3c6f76b08","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #8039 describes official partnership logomarks, but no immutable asset URL or explicit rights grant is recorded."}
{"recordType":"asset","path":"public/providers/kimi-logomark-light.svg","mediaType":"image/svg+xml","sha256":"dbb37a7a98d6661516c35229376b9bfd22d3d802a559aeebca274d7ad7140be8","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #8039 describes official partnership logomarks, but no immutable asset URL or explicit rights grant is recorded."}
{"recordType":"asset","path":"public/providers/kimi.svg","mediaType":"image/svg+xml","sha256":"193be48cd5306bf67ab3bc349e8fba9bfdeae85b3a52ffa86fd145ed2ff23f0e","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/kiro.svg","mediaType":"image/svg+xml","sha256":"4eae4d6e818da7342c32c7d443ab7c97b93c544db9af379d5b5bf7f0a3127d66","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/krutrim.svg","mediaType":"image/svg+xml","sha256":"7ab68a187354ea58039e5d9129886e063b9fa21af4e3875bb395e8eba727808b","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/lambda.svg","mediaType":"image/svg+xml","sha256":"5749cb1b812858dca0c85233e9b1400d67dfbdd47c5ddea5ec70e1b47538799d","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/lambda/default.svg","integrity":"sha256:5749cb1b812858dca0c85233e9b1400d67dfbdd47c5ddea5ec70e1b47538799d","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://lambdalabs.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/lemonade.png","mediaType":"image/png","sha256":"e7717e379558213ec9675dac8c07cd74ed62b485259b02e76359a8489885f30a","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/leonardo.svg","mediaType":"image/svg+xml","sha256":"5269781259061dae191cde70884e3a108c215d8c530e7b1458d9d7dc1b698243","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/letta.png","mediaType":"image/png","sha256":"f3f47bce18599153df5b8a683172f9fc644f343da3ba2d8416d791c3b2941e57","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/linkup-search.png","mediaType":"image/png","sha256":"ba30bce9eb7e7eac2669df05174d64215a584022e86fd7c1a3cea06bd242e384","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/liquid.svg","mediaType":"image/svg+xml","sha256":"a09beaff7addad17c5a55add836aabb95acfe3147055a9d9a38000ce076e153c","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/llamafile.png","mediaType":"image/png","sha256":"dba51fea70faacb3dc985dbc33142a459e74c983222a818375ca455c0dd2e300","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/llamagate.png","mediaType":"image/jpeg","sha256":"255510f8d30b26bee7618c5524e1c3b27524cc9594eb70e0500c05c0ac5cf75c","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/llm7.svg","mediaType":"image/svg+xml","sha256":"0b763a74f152dbaea9d55171bedad9614259ac1979feeb8452a7f09dfa402e32","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/logfare.png","mediaType":"image/png","sha256":"f08afcdb0e3886de6f9433dccfd915a14006a554f01f2f6cf4064d9f4fffd6ec","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/longcat.svg","mediaType":"image/svg+xml","sha256":"73e6838c126557998803a3c864ceb8ac6982597fa680fa139ff942d456c23687","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/longcat/default.svg","integrity":"sha256:73e6838c126557998803a3c864ceb8ac6982597fa680fa139ff942d456c23687","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://longcat.chat/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/maritalk.png","mediaType":"image/png","sha256":"61cf3c66581e4b2c356b3ca37e056efb4cf2bcefd5560f0f7a7613ce6c2744e0","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/meta.svg","mediaType":"image/svg+xml","sha256":"f983ce7206fa1a889255f47b4a70bd13ddcbb01e8cefb4f2d0f98638f6d5d500","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/metaai.svg","mediaType":"image/svg+xml","sha256":"a7b52cfde49434eab56dfaf8550633fe2200885d7fe9880f0ddac49ecef71393","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/minimax.svg","mediaType":"image/svg+xml","sha256":"e514235f472e335f8bb0094ddcc2762b7e38e0dca66225893294457081cc6abf","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/minimax/default.svg","integrity":"sha256:e514235f472e335f8bb0094ddcc2762b7e38e0dca66225893294457081cc6abf","match":"byte-exact"},"upstreamLicenseClaim":{"value":"Custom","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://github.com/MiniMax-AI/MiniMax-01/blob/57cf223b177e99636c7711a0f179e9fdc9c38e8a/figures/minimax.svg"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/mistral.svg","mediaType":"image/svg+xml","sha256":"a21838f4a3714b9f537bd849de4848dca712778517bfc4177621cc58b3050006","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/mistral/default.svg","integrity":"sha256:a21838f4a3714b9f537bd849de4848dca712778517bfc4177621cc58b3050006","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://mistral.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/modal.svg","mediaType":"image/svg+xml","sha256":"650307e51a2972207ac3f480db2c6326f08b21978b9fcfed4a383997a6da3575","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/modelscope.svg","mediaType":"image/svg+xml","sha256":"abf2eed2273769c447af57bcbb0b13e23c23fac97182664b31c5cf67c8cb321e","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/monsterapi.svg","mediaType":"image/svg+xml","sha256":"463d672cbb1caa930d50457c4f4c0319a67305b03d45328eef4c3c00ce451da7","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/moonshot.svg","mediaType":"image/svg+xml","sha256":"a6ac95d972fdb044cd4155b0f75d9c1c816348868c810f63c7e5c8840c9e3e12","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/moonshot/default.svg","integrity":"sha256:a6ac95d972fdb044cd4155b0f75d9c1c816348868c810f63c7e5c8840c9e3e12","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://moonshot.cn"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/morph.svg","mediaType":"image/svg+xml","sha256":"0fdb479e13c5d5de15aa89d1f87c8d55f8f8a56d33fc5dee8c566d2e0dbd5b96","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/morph/default.svg","integrity":"sha256:0fdb479e13c5d5de15aa89d1f87c8d55f8f8a56d33fc5dee8c566d2e0dbd5b96","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://morphllm.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/nanobot.png","mediaType":"image/png","sha256":"5ddd4b100b012b9f48f29e5f8e2d254ffb802f73afb34617f86005c2d1f343a6","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/nanogpt.png","mediaType":"image/png","sha256":"38cef0646e02d8b98da4577e2c83950cb77e4f12b217b83d0b543d2dae37a4b5","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/nebius.svg","mediaType":"image/svg+xml","sha256":"fb190b4efb1d143442ef6c5eb0258801fc27b7316e88216c59a0f4b58b8b0281","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/nebius/default.svg","integrity":"sha256:fb190b4efb1d143442ef6c5eb0258801fc27b7316e88216c59a0f4b58b8b0281","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://nebius.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/nlpcloud.svg","mediaType":"image/svg+xml","sha256":"ace1d772d2a7d6fa10ecf76f45af550c9c9a6f96ce1783f398472ba46fe79f85","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/nomic.svg","mediaType":"image/svg+xml","sha256":"73cc513c9d5f460ec8f00a097f3fabaa54c0e1f824944412e9a4461c0620fba6","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/novita.svg","mediaType":"image/svg+xml","sha256":"ab99ef3113a12e64ef8b44eda132094017359ede5bdb33e830ed855b69520612","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/novita/default.svg","integrity":"sha256:ab99ef3113a12e64ef8b44eda132094017359ede5bdb33e830ed855b69520612","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://novita.ai/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/nscale.png","mediaType":"image/png","sha256":"6a8b22c12696fe55048793b251921c7c19673cc17dce76cad27bd4f11085adf8","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/nube.svg","mediaType":"image/svg+xml","sha256":"e5eff793cbc8a917e499c18365979f001010b229dd53b0802d5f29d9dfb963e1","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/nvidia.svg","mediaType":"image/svg+xml","sha256":"c0ba24515aa21f07119e15914abbde64dd17b42fd95518a15df208a615c3810e","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/nvidia/default.svg","integrity":"sha256:c0ba24515aa21f07119e15914abbde64dd17b42fd95518a15df208a615c3810e","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.nvidia.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/oai-cc.png","mediaType":"image/png","sha256":"ad7f82ac767381117a6eee9102184611fd9b930c8f5e1ed60381872482137eb9","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/oai-r.png","mediaType":"image/png","sha256":"6d8111fb61596d0d445f869d40f82eb115ee19c5d6e8c56ba88ce40a96ef3398","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/oauth.svg","mediaType":"image/svg+xml","sha256":"661c74f5381a85ebc04edb7bae8fffbf1610a248d4389b8c2745191065fa6c88","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/oci.svg","mediaType":"image/svg+xml","sha256":"c4886bba91144a634b646343911da7801524e1c7118b1542172483bddeaa83ad","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/ollama.svg","mediaType":"image/svg+xml","sha256":"04d95aa0e2cccdd24f8f6c9c58ac2f312464d0f8280a6744fdd48b28b15aebab","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/ollama/default.svg","integrity":"sha256:04d95aa0e2cccdd24f8f6c9c58ac2f312464d0f8280a6744fdd48b28b15aebab","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://www.ollama.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/omp.png","mediaType":"image/png","sha256":"1e67ede0be3373c6fdfe32be6d0704692db368010fa05d8cf5de8064071c4977","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/openadapter.svg","mediaType":"image/svg+xml","sha256":"dd55136c854f36a2ffe93062e5296ac77f3d4b753f7106cf832212f87f81c408","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/openai.svg","mediaType":"image/svg+xml","sha256":"db81a8225166f02f773304ba4d8f0141343da5f43870d8b41f10bf6bc59840c8","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/openai/default.svg","integrity":"sha256:db81a8225166f02f773304ba4d8f0141343da5f43870d8b41f10bf6bc59840c8","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://openai.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/openclaw.svg","mediaType":"image/svg+xml","sha256":"4123c0c75dda5b28e3e0d38075514085bf546178a620776344813c08fa41277c","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/OpenClaw/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"All 6/6 local SVG path d values match the pinned Color component."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."}
{"recordType":"asset","path":"public/providers/opencode-dark.svg","mediaType":"image/svg+xml","sha256":"4e84f87aa7bc2a5f8a72eeb08d3d4f1836b422189256d0bd5e7bfabc830d7ed0","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/opencode-light.svg","mediaType":"image/svg+xml","sha256":"5eeb3a5f14dbbccc03111296ecfd3cd05cc98844150d4f9d77ba921847953380","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/opencode.svg","mediaType":"image/svg+xml","sha256":"231e3f47f332a0ace170bae2605488ac016cc85e584d89b1f9f9f0dff47170ee","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/openference.svg","mediaType":"image/svg+xml","sha256":"c70cc7e1a0e2e14b5e42d53a2b4432218e223d520fcfdf7da592352283a91851","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/openrouter.svg","mediaType":"image/svg+xml","sha256":"d05021526e72fddf3426eabc066924aca83da0cd66a699a3de3bac58ed2fe0a2","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/openrouter/default.svg","integrity":"sha256:d05021526e72fddf3426eabc066924aca83da0cd66a699a3de3bac58ed2fe0a2","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://openrouter.ai/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/openvecta.svg","mediaType":"image/svg+xml","sha256":"97f49e7096ef502e8c498011989e467294a5b997707beea4455e0cc1160cb89c","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/orcarouter.svg","mediaType":"image/svg+xml","sha256":"06b36d030492901cada4c1e757b613c3ada340727d74f601fe407cfad7b529cf","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/ovhcloud.svg","mediaType":"image/svg+xml","sha256":"ab65efec83d5106fa649e1f3ec5db98beb20ec6708158362844c912c34e1d31a","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/ovhcloud/default.svg","integrity":"sha256:ab65efec83d5106fa649e1f3ec5db98beb20ec6708158362844c912c34e1d31a","match":"byte-exact"},"upstreamLicenseClaim":{"value":"brand-use","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://ovhcloud.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/perplexity.svg","mediaType":"image/svg+xml","sha256":"c7a4c847b6b3c0e8a10868d35b0b4a89727c03f8db3394060dcdb33c4b21c83b","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/phind.svg","mediaType":"image/svg+xml","sha256":"d22bfa86c189016aad4a8f2fa115549f33af825b5be91c31f5566c672009cf01","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/piapi.png","mediaType":"image/png","sha256":"6f3d64217aa149098db84d4a5c5608918781cf864947275aae51e3f5ab6ccfca","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/picoclaw.jpg","mediaType":"image/jpeg","sha256":"f2274cc93345c8218f574f6c51a26f624a56ecc2b6f909d5b7e0c3d7d4f49c92","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/picoclaw.svg","mediaType":"image/svg+xml","sha256":"a4efdede50ec1d327f83bc61d2e811ac9b245f1b8c82aff45fd3fac299bc6a57","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/picoclaw/default.svg","integrity":"sha256:a4efdede50ec1d327f83bc61d2e811ac9b245f1b8c82aff45fd3fac299bc6a57","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://picoclaw.io"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/pioneer.svg","mediaType":"image/svg+xml","sha256":"d30adb4ffa16988af01f49682ca0c849dca173efa8d894053e3628449247d44a","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/playht.svg","mediaType":"image/svg+xml","sha256":"ec4a7bf38b10c1ea045237f2c7b01f3781a7c9c00ac2d79d6a7b3ad5841485fe","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/poe.svg","mediaType":"image/svg+xml","sha256":"5e50e10d6ef231593fc406b0d78bea24f8266e2555cab47a8bbbb88e42d31797","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/poe/default.svg","integrity":"sha256:5e50e10d6ef231593fc406b0d78bea24f8266e2555cab47a8bbbb88e42d31797","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://poe.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/pollinations.svg","mediaType":"image/svg+xml","sha256":"49011d5b329349754c7722571ae0d9d384ea32331e22c0fb6a9a2d1a22862346","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/pollinations/default.svg","integrity":"sha256:49011d5b329349754c7722571ae0d9d384ea32331e22c0fb6a9a2d1a22862346","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://pollinations.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/poolside.svg","mediaType":"image/svg+xml","sha256":"1bf4dfc87c887b8abc93eb7df5faa0588139a89052c7d3fa25abcf8bd259a223","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/predibase.png","mediaType":"image/png","sha256":"70c8d3b98500d2f3a169771cfd53e2cc65b2b7152fa11cae342c8d3fe1d4c8e4","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/publicai.svg","mediaType":"image/svg+xml","sha256":"6553a9acf2e8cbe8cc2253ddd589d8132dc81c5301013a9ca94d2661f0d6e46f","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/qianfan.svg","mediaType":"image/svg+xml","sha256":"a6fb89080675ae00a4a240b7aa50dae31c80e67b24bfa2dc08f2c98277f2a0a7","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/qiniu.svg","mediaType":"image/svg+xml","sha256":"f92a36faea7b76b8e708f3866ccb315011f0f91dd486868546dfe8523199a728","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/qwen.svg","mediaType":"image/svg+xml","sha256":"1729febe65990585b1ba96c223143f108f709f722c1d354238fd470630b51f54","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/qwen/default.svg","integrity":"sha256:1729febe65990585b1ba96c223143f108f709f722c1d354238fd470630b51f54","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://chat.qwenlm.ai/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/qwencloud.svg","mediaType":"image/svg+xml","sha256":"84ae1a3822a67a9281c3f19221f046fb4fe7f8dcd5ec71bb2470503a8dcfa086","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/recraft.svg","mediaType":"image/svg+xml","sha256":"1fab4aeaf66fc3f9ffdc08bc2e13d9f99335e246e5be2877fae5801045ff4ce6","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/recraft/default.svg","integrity":"sha256:1fab4aeaf66fc3f9ffdc08bc2e13d9f99335e246e5be2877fae5801045ff4ce6","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://recraft.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/reka.png","mediaType":"image/jpeg","sha256":"6881acff8cd7b2dc92bbe90066f549114e6d4066ffc4c43ac84cb69402834aca","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/replicate.svg","mediaType":"image/svg+xml","sha256":"3a1a39f81c20c507bb84b105d022f5c3af35c1f561005493b1c654bcf356f3a5","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/replicate/default.svg","integrity":"sha256:3a1a39f81c20c507bb84b105d022f5c3af35c1f561005493b1c654bcf356f3a5","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://replicate.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/requesty.svg","mediaType":"image/svg+xml","sha256":"edaf34203dd8c575b460435e01eabbc764c80724bfb5d9891420329949d7008e","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/roocode.svg","mediaType":"image/svg+xml","sha256":"6f3f1767bbe13ec049aa179689d66354fc2ec8c8ffb083eeab56b6730d3f92e4","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/roocode/default.svg","integrity":"sha256:6f3f1767bbe13ec049aa179689d66354fc2ec8c8ffb083eeab56b6730d3f92e4","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://roocode.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/runway.svg","mediaType":"image/svg+xml","sha256":"ef0fbd9493bef73b1db7d69910078fbc90024780e4e326d33107983ebd66a4e0","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/runway/default.svg","integrity":"sha256:ef0fbd9493bef73b1db7d69910078fbc90024780e4e326d33107983ebd66a4e0","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://runwayml.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/sambanova.svg","mediaType":"image/svg+xml","sha256":"1eae1179dbeb2a31edcabeca5f2c9d593bb1255aa8354e784be60a94dd850aa9","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/sambanova/default.svg","integrity":"sha256:1eae1179dbeb2a31edcabeca5f2c9d593bb1255aa8354e784be60a94dd850aa9","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://sambanova.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/sap.svg","mediaType":"image/svg+xml","sha256":"99df1825ec8254f712794c8e980d844967427d6720855ebad02ec6803df04374","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/scaleway.svg","mediaType":"image/svg+xml","sha256":"4fc81081bd54878b20e05c9344f34d9e77df4a8f37844f4e29a7cfe99eaeea76","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/searchapi.svg","mediaType":"image/svg+xml","sha256":"124f551340b92a8493faeddce914d7034377ab1d0364c5b4285ecc940e80a2c1","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/searchapi/default.svg","integrity":"sha256:124f551340b92a8493faeddce914d7034377ab1d0364c5b4285ecc940e80a2c1","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://searchapi.io"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/searxng-search.svg","mediaType":"image/svg+xml","sha256":"7e40327a9ce25056fd73712b2ea0bd57490bbb86ce7330cacac893c13e7adbcf","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/sensenova.svg","mediaType":"image/svg+xml","sha256":"bd2e0f8e310ff6a5edcc56a85560221923262767ba76b660a193f45c40c123fa","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/serper-search.svg","mediaType":"image/svg+xml","sha256":"b417fbf30fe71bac4350b0e18d91bd0917c732257a74b50a0cc59b2984b9c0dd","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/snowflake.svg","mediaType":"image/svg+xml","sha256":"262b832658b821a8ff2eb0c536b5deb151dca0915f780f10161e3b2d219abe63","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/soniox.svg","mediaType":"image/svg+xml","sha256":"92b81993f7fd72b17b957d13e6b49a19d75f7668230a6cf9ef0d4975d6e825db","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/sparkdesk.svg","mediaType":"image/svg+xml","sha256":"e597fc689ea06a6a23166ff769fac8a6839535a9b626565913d87989c724b559","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository history shows a shared generic initial-badge pattern, but no immutable authorship or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/stepfun.svg","mediaType":"image/svg+xml","sha256":"f55afc0e6004c8854f76bd5bbcc0fce9fc0ed9316691d54fb02d088c24fab40d","provenanceStatus":"proven","source":{"kind":"npm","url":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz","ref":"5.10.0","path":"package/es/Stepfun/components/Color.js","integrity":"sha512-CIpjkISCLRK7haDtSugGFd0o3odaJts8ewJOkUiEFtns3xvsqbl8i24eowBnjw+yMDQVQyNONlhqTD58YC6Ljg==","packageShasum":"add1baced073a60157d39c7820b8d5c1928a1054","match":"svg-path-data","matchDetail":"The local SVG path d value matches the pinned Color component (1/1)."},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"@lobehub/icons@5.10.0 package/LICENSE","evidence":"https://registry.npmjs.org/@lobehub/icons/-/icons-5.10.0.tgz#package/LICENSE","independentlyVerified":true,"scope":"Pinned package distribution only; no trademark clearance."},"trademarkClearance":null,"evidenceNote":"All local SVG path data matches the pinned LobeHub Color component. This proves source provenance only, not trademark clearance."}
{"recordType":"asset","path":"public/providers/sumopod.svg","mediaType":"image/svg+xml","sha256":"a0a903dbb021049a6faa62c757d18abbb192d4a26a4352e459a9e462facee42f","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/suno.svg","mediaType":"image/svg+xml","sha256":"03bd7a6888d7ba010c616ae6402c222683d7f909eddb028241220f227ff6d1a6","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/suno/default.svg","integrity":"sha256:03bd7a6888d7ba010c616ae6402c222683d7f909eddb028241220f227ff6d1a6","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://suno.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/synthetic.svg","mediaType":"image/svg+xml","sha256":"c6db0e026416fdee7376185ce6cbeda05b1afdc74bdd2ee8f5d158767aa5ce4b","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/t3-web.svg","mediaType":"image/svg+xml","sha256":"776c95beab6f441754bac9911cc6669ffdf6631f76661a659ee69de2af053a06","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/tavily.svg","mediaType":"image/svg+xml","sha256":"80dddf9848f8761a2552c10ad0b60e4d11ad399f6ae014a8b43af6150456aa1a","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/tavily/default.svg","integrity":"sha256:80dddf9848f8761a2552c10ad0b60e4d11ad399f6ae014a8b43af6150456aa1a","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://tavily.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/tencent.svg","mediaType":"image/svg+xml","sha256":"7c370ad4b75e3f30d0fa7da71f90466a0ee95a887189479aa9df414079b50eb6","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/theoldllm.svg","mediaType":"image/svg+xml","sha256":"41214483e28c7464d44ade68c29d05ec9eb5f9413a7df8a30ed2e2ff6bb171c5","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/tokenrouter.svg","mediaType":"image/svg+xml","sha256":"a9613d5a485878613e50300a5d675c456fd551ca37c978522342a4d2d0313a21","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/topazlabs.svg","mediaType":"image/svg+xml","sha256":"93b23f19b6c9ef2f5edc88205318dbd908d8071435fc971cef5f05dd13b97450","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/topazlabs/default.svg","integrity":"sha256:93b23f19b6c9ef2f5edc88205318dbd908d8071435fc971cef5f05dd13b97450","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://topazlabs.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/trae.svg","mediaType":"image/svg+xml","sha256":"1445a2fa3fba86fe876175e23ddb0bc8dbfa889971628bc451d5d2f53f974703","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/trae/default.svg","integrity":"sha256:1445a2fa3fba86fe876175e23ddb0bc8dbfa889971628bc451d5d2f53f974703","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://trae.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/udio.svg","mediaType":"image/svg+xml","sha256":"ae4b9af080f08bb1aedbe6f5b7fa2532c3a0b3e5de129b2dbcb795245ff05ee6","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/udio/default.svg","integrity":"sha256:ae4b9af080f08bb1aedbe6f5b7fa2532c3a0b3e5de129b2dbcb795245ff05ee6","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://udio.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/uncloseai.svg","mediaType":"image/svg+xml","sha256":"09de727ac4976b6bf737d7f6f02ea2d7919d8c4ea19228d80f5b872eabf65f98","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/unorouter.svg","mediaType":"image/svg+xml","sha256":"89024ca813164d736836addc83d5f313095ce2b27474d39c941236fc45ea9cae","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/upstage.svg","mediaType":"image/svg+xml","sha256":"14dc984f2f6d1dcb3481387438d5b4528f794aea8ac20f1a4442bb5d8f2dcedc","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/upstage/default.svg","integrity":"sha256:14dc984f2f6d1dcb3481387438d5b4528f794aea8ac20f1a4442bb5d8f2dcedc","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://upstage.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/v0.svg","mediaType":"image/svg+xml","sha256":"e33ce9865356b381e2752a07a100d136ed80179645084eef185448be29c65a17","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/v0/default.svg","integrity":"sha256:e33ce9865356b381e2752a07a100d136ed80179645084eef185448be29c65a17","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://v0.dev/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/veoaifree-web.svg","mediaType":"image/svg+xml","sha256":"24a38f25e677b479907feccdd00d19476f2a0646c37f88b1dd5d68a109b58664","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/vercel.svg","mediaType":"image/svg+xml","sha256":"a9ae5ad4ea10c39122cc6b07927132f9c684dd2f1a7bef5337b0eb7364e139ae","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/vercel/default.svg","integrity":"sha256:a9ae5ad4ea10c39122cc6b07927132f9c684dd2f1a7bef5337b0eb7364e139ae","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://vercel.com/"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/vllm.svg","mediaType":"image/svg+xml","sha256":"918d594cfb73c0dd269b725cf6672f4863d10c39a443d58c68c0662ae6ae84b1","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/vllm/default.svg","integrity":"sha256:918d594cfb73c0dd269b725cf6672f4863d10c39a443d58c68c0662ae6ae84b1","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://github.com/vllm-project"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/volcengine.svg","mediaType":"image/svg+xml","sha256":"e519337670163eb3babc1fb5ce8abe24b8777f3180aeb135870c40672d757a58","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/volcengine/default.svg","integrity":"sha256:e519337670163eb3babc1fb5ce8abe24b8777f3180aeb135870c40672d757a58","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://volcengine.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/voyage.svg","mediaType":"image/svg+xml","sha256":"f20ac1f2bef06f52e34bb63dbb215163641d4703fe347337250d03b19bcecb2c","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/voyage/default.svg","integrity":"sha256:f20ac1f2bef06f52e34bb63dbb215163641d4703fe347337250d03b19bcecb2c","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://voyageai.com"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/wafer.svg","mediaType":"image/svg+xml","sha256":"6b00a03f1e8781e94effd6ac93f812a2c2feb386bf87793a2483f72aaf297058","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/wandb.svg","mediaType":"image/svg+xml","sha256":"bbb87752bb3b16555841198b6fa77a9d934be317c0109280b16739d30abc98b1","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/windsurf.svg","mediaType":"image/svg+xml","sha256":"e961c08c7e84e90d74e67830cc4812298af404f2e205a9b120a16bff80b1d617","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/windsurf/default.svg","integrity":"sha256:e961c08c7e84e90d74e67830cc4812298af404f2e205a9b120a16bff80b1d617","match":"byte-exact"},"upstreamLicenseClaim":{"value":"CC0-1.0","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://windsurf.com/editor"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/x5lab.svg","mediaType":"image/svg+xml","sha256":"52f9eb439192a563dd0b8f5545e851b5bcd6b661d64538997ca338616d0f2716","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/xai.svg","mediaType":"image/svg+xml","sha256":"823bbbf2c6781192aa849f69dbaf57c8caffa21d39e79992c473dacaad2b09f5","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/xai/default.svg","integrity":"sha256:823bbbf2c6781192aa849f69dbaf57c8caffa21d39e79992c473dacaad2b09f5","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://x.ai"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/xinference.svg","mediaType":"image/svg+xml","sha256":"e0caa389b4acd614f4f6a809fddf55d96563936fd47c12d6cb6f8e5ff335aeb9","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/yi.svg","mediaType":"image/svg+xml","sha256":"d78b1ce0eeb7a7d1a6132785dfa0218be48d6d1ccd3751ca3f9240a2e3b38756","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6317 and the asset structure indicate a likely source family, but no immutable upstream source or hash was proven."}
{"recordType":"asset","path":"public/providers/youcom-search.svg","mediaType":"image/svg+xml","sha256":"0657bd314df49bcca7d0e2446099a517272c0166db84b45c9994a9b62638d742","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/yuanbao-web.svg","mediaType":"image/svg+xml","sha256":"21b658d85bcda8344b484db75cf10ec1bdbbc60ee428071b7a747ed80b9780f8","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/zed-hosted.svg","mediaType":"image/svg+xml","sha256":"52435227cd02ff2152ae2e69e5737cb7f5c87d9169c16591c6f50040beb8d197","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/zenmux-free.svg","mediaType":"image/svg+xml","sha256":"13cb431c91a018d16ad384de205a2b2aff7d786306f2401ea88f3caac0ee4d9e","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/zenmux.svg","mediaType":"image/svg+xml","sha256":"e16974c1ef2177b93e5820967f07542f433b56e46f28447a62e2a00bee91f597","provenanceStatus":"probable","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"Repository PR #6926 describes this family as letter-in-circle placeholders, but original authorship and license were not independently proven."}
{"recordType":"asset","path":"public/providers/zeroclaw.png","mediaType":"image/png","sha256":"247a7d9519a4e97ffa1c8691ce071bfbd9b85dc9d9158b1f1b3810a5dc82ba0f","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"asset","path":"public/providers/zhipu.svg","mediaType":"image/svg+xml","sha256":"4e7400476df64ad7c41a19828bd1dc8250cfab014a97e7cc89a1536384c48e31","provenanceStatus":"proven","source":{"kind":"git","url":"https://github.com/GLINCKER/thesvg","ref":"7870bc1c5f657d9accbb7f96cc457b8dd3363ee8","path":"public/icons/zhipu/default.svg","integrity":"sha256:4e7400476df64ad7c41a19828bd1dc8250cfab014a97e7cc89a1536384c48e31","match":"byte-exact"},"upstreamLicenseClaim":{"value":"MIT","assertedBy":"theSVG pinned registry","evidence":"https://github.com/GLINCKER/thesvg/blob/7870bc1c5f657d9accbb7f96cc457b8dd3363ee8/src/data/icons.json","independentlyVerified":false,"scope":"Upstream SVG copyright claim only; no trademark clearance.","upstreamUrl":"https://zhipuai.cn"},"trademarkClearance":null,"evidenceNote":"Local bytes are byte-identical to the pinned theSVG source. This proves source provenance only, not copyright or trademark clearance."}
{"recordType":"asset","path":"public/providers/zoocode.png","mediaType":"image/png","sha256":"a90d9ff41a3436e35069dc0c3d3c8f1ce27a2df2fd7fea1692913021f83292a5","provenanceStatus":"unresolved","source":null,"upstreamLicenseClaim":null,"trademarkClearance":null,"evidenceNote":"No immutable upstream source or license evidence is recorded."}
{"recordType":"contentAlias","sha256":"2530f80fdf2144b62f96953a81c6988c9c31a6cc7c9de72e069079485817cbe7","canonicalPath":"public/providers/brave.svg","aliases":["public/providers/brave-search.svg"]}
{"recordType":"contentAlias","sha256":"a3101f3047a119aa11825ad9369510f0c472428c8c52d420e31bc62db44a8364","canonicalPath":"public/providers/claude.svg","aliases":["public/providers/claude-web.svg"]}
{"recordType":"contentAlias","sha256":"4d48a1405c68b00121fa7100e080025fa3e9e090c59055b56e4ad0aee1a7de7f","canonicalPath":"public/providers/freebuff.svg","aliases":["public/providers/freebuff-dark.svg","public/providers/freebuff-light.svg"]}
{"recordType":"contentAlias","sha256":"67413dbdc9be21ca995ad318234e5463af1262668b4a203da72388e22ef3ac40","canonicalPath":"public/providers/gitlab.svg","aliases":["public/providers/gitlab-duo.svg"]}
{"recordType":"contentAlias","sha256":"0bf05e2f9c1355e8a1d020c07f433ea725f1270607f04b83c398d44914ebe422","canonicalPath":"public/providers/kilocode.svg","aliases":["public/providers/kilo-gateway.svg"]}

View File

@@ -165,6 +165,7 @@
"check:model-lifecycle": "node --import tsx/esm scripts/check/check-model-lifecycle.mjs",
"check:provider-consistency": "bun scripts/check/check-provider-consistency.ts",
"check:provider-assets": "node scripts/check/check-provider-assets.mjs",
"check:provider-asset-provenance": "node scripts/check/check-provider-asset-provenance.mjs",
"check:nvidia-catalog-drift": "node --import tsx/esm scripts/check/check-nvidia-catalog-drift.ts",
"check:fetch-targets": "node scripts/check/check-fetch-targets.mjs",
"check:openapi-routes": "node scripts/check/check-openapi-routes.mjs",

View File

@@ -0,0 +1,480 @@
#!/usr/bin/env node
import { spawnSync } from "node:child_process";
import { createHash } from "node:crypto";
import { readFile, readdir } from "node:fs/promises";
import { join, resolve } from "node:path";
import { fileURLToPath } from "node:url";
const repoRoot = fileURLToPath(new URL("../..", import.meta.url));
const defaultProvidersDir = join(repoRoot, "public/providers");
const defaultManifestPath = join(repoRoot, "config/quality/provider-assets-provenance.jsonl");
function readOption(name, fallback) {
const index = process.argv.indexOf(name);
return index >= 0 ? resolve(process.argv[index + 1]) : fallback;
}
const providersDir = readOption("--providers-dir", defaultProvidersDir);
const manifestPath = readOption("--manifest", defaultManifestPath);
const PROVENANCE_STATUSES = new Set(["proven", "probable", "unresolved"]);
function isXmlWhitespace(character) {
return character === " " || character === "\t" || character === "\n" || character === "\r";
}
function skipXmlWhitespace(text, start) {
let index = start;
while (index < text.length && isXmlWhitespace(text[index])) index += 1;
return index;
}
function startsWithAsciiCaseInsensitive(text, token, start) {
if (start + token.length > text.length) return false;
return text.slice(start, start + token.length).toLowerCase() === token;
}
function skipXmlComments(text, start) {
let index = start;
while (text.startsWith("<!--", index)) {
const commentEnd = text.indexOf("-->", index + 4);
if (commentEnd < 0) return -1;
index = skipXmlWhitespace(text, commentEnd + 3);
}
return index;
}
function skipSvgDoctype(text, start) {
if (!startsWithAsciiCaseInsensitive(text, "<!doctype", start)) return start;
let index = start + "<!doctype".length;
if (!isXmlWhitespace(text[index])) return -1;
index = skipXmlWhitespace(text, index);
if (!startsWithAsciiCaseInsensitive(text, "svg", index)) return -1;
index += 3;
if (
index < text.length &&
!isXmlWhitespace(text[index]) &&
text[index] !== "[" &&
text[index] !== ">"
) {
return -1;
}
let quote = null;
let subsetDepth = 0;
for (; index < text.length; index++) {
const character = text[index];
if (quote) {
if (character === quote) quote = null;
} else if (character === '"' || character === "'") {
quote = character;
} else if (character === "[") {
subsetDepth += 1;
} else if (character === "]" && subsetDepth > 0) {
subsetDepth -= 1;
} else if (character === ">" && subsetDepth === 0) {
return index + 1;
}
}
return -1;
}
function hasSvgRoot(content) {
let text = content.toString("utf8");
if (text.charCodeAt(0) === 0xfeff) text = text.slice(1);
let index = skipXmlWhitespace(text, 0);
if (startsWithAsciiCaseInsensitive(text, "<?xml", index)) {
const declarationEnd = text.indexOf("?>", index + 5);
if (declarationEnd < 0) return false;
index = skipXmlWhitespace(text, declarationEnd + 2);
}
index = skipXmlComments(text, index);
if (index < 0) return false;
const afterDoctype = skipSvgDoctype(text, index);
if (afterDoctype < 0) return false;
index = skipXmlWhitespace(text, afterDoctype);
index = skipXmlComments(text, index);
if (index < 0 || !startsWithAsciiCaseInsensitive(text, "<svg", index)) return false;
const boundary = text[index + 4];
return (
boundary === undefined || boundary === ">" || boundary === "/" || isXmlWhitespace(boundary)
);
}
function detectMediaType(content) {
const pngSignature = "89504e470d0a1a0a";
if (content.length >= 8 && content.subarray(0, 8).toString("hex") === pngSignature) {
return "image/png";
}
if (content.length >= 3 && content[0] === 0xff && content[1] === 0xd8 && content[2] === 0xff) {
return "image/jpeg";
}
return hasSvgRoot(content) ? "image/svg+xml" : null;
}
function isAsciiDigitString(value) {
if (!value) return false;
for (const character of value) {
if (character < "0" || character > "9") return false;
}
return true;
}
function isPinnedSemver(value) {
if (typeof value !== "string" || value.length === 0) return false;
const normalized = value.startsWith("v") ? value.slice(1) : value;
let suffixIndex = -1;
for (let index = 0; index < normalized.length; index++) {
if (normalized[index] === "-" || normalized[index] === "+") {
suffixIndex = index;
break;
}
}
const core = suffixIndex < 0 ? normalized : normalized.slice(0, suffixIndex);
const suffix = suffixIndex < 0 ? null : normalized.slice(suffixIndex + 1);
if (suffix !== null) {
if (suffix.length === 0) return false;
for (const character of suffix) {
const isDigit = character >= "0" && character <= "9";
const isLowercase = character >= "a" && character <= "z";
const isUppercase = character >= "A" && character <= "Z";
if (!isDigit && !isLowercase && !isUppercase && character !== "." && character !== "-") {
return false;
}
}
}
const parts = core.split(".");
return parts.length === 3 && parts.every(isAsciiDigitString);
}
function hasImmutableSourceEvidence(source) {
if (!source || typeof source !== "object") return false;
if (!new Set(["git", "npm"]).has(source.kind)) return false;
if (typeof source.url !== "string" || !source.url.startsWith("https://")) return false;
if (typeof source.path !== "string" || source.path.length === 0) return false;
if (!new Set(["byte-exact", "svg-path-data"]).has(source.match)) return false;
if (source.kind === "git") {
return /^[0-9a-f]{40}$/i.test(source.ref) && /^sha256:[0-9a-f]{64}$/.test(source.integrity);
}
return (
isPinnedSemver(source.ref) &&
/^sha512-[A-Za-z0-9+/]{86}==$/.test(source.integrity) &&
/^[0-9a-f]{40}$/i.test(source.packageShasum)
);
}
function isValidUpstreamLicenseClaim(claim) {
if (claim === null) return true;
return (
typeof claim === "object" &&
typeof claim.value === "string" &&
claim.value.length > 0 &&
typeof claim.assertedBy === "string" &&
claim.assertedBy.length > 0 &&
typeof claim.evidence === "string" &&
claim.evidence.startsWith("https://") &&
typeof claim.independentlyVerified === "boolean" &&
typeof claim.scope === "string" &&
/no trademark clearance/i.test(claim.scope)
);
}
function inspectGitCommit(objectId) {
const result = spawnSync("git", ["-C", repoRoot, "cat-file", "-t", objectId], {
encoding: "utf8",
});
if (result.error) {
return `unable to verify auditedCommit with Git: ${result.error.message}`;
}
if (result.status !== 0) {
return `auditedCommit object does not exist: ${objectId}`;
}
const objectType = result.stdout.trim();
if (objectType !== "commit") {
return `auditedCommit must identify a Git commit: ${objectId} (found ${objectType || "unknown"})`;
}
return null;
}
function verifyAuditedProviderSnapshot(commit, physicalFiles) {
const failures = [];
const treeResult = spawnSync(
"git",
["-C", repoRoot, "ls-tree", "-r", "-z", commit, "--", "public/providers"],
{ encoding: "utf8" }
);
if (treeResult.error) {
return [`unable to read audited provider tree with Git: ${treeResult.error.message}`];
}
if (treeResult.status !== 0) {
return [
`unable to read audited provider tree for ${commit}: ${treeResult.stderr.trim() || "git ls-tree failed"}`,
];
}
const auditedBlobs = new Map();
for (const entry of treeResult.stdout.split("\0").filter(Boolean)) {
const tabIndex = entry.indexOf("\t");
const metadata = entry.slice(0, tabIndex).split(" ");
const path = entry.slice(tabIndex + 1);
const [, objectType, objectId] = metadata;
if (tabIndex < 0 || objectType !== "blob" || !objectId) {
failures.push(`invalid Git tree entry at auditedCommit: ${entry}`);
continue;
}
auditedBlobs.set(path, objectId);
}
const hashResult = spawnSync("git", ["-C", repoRoot, "hash-object", "--", ...physicalFiles], {
encoding: "utf8",
});
if (hashResult.error) {
return [
...failures,
`unable to hash physical provider assets with Git: ${hashResult.error.message}`,
];
}
if (hashResult.status !== 0) {
return [
...failures,
`unable to hash physical provider assets with Git: ${hashResult.stderr.trim() || "git hash-object failed"}`,
];
}
const physicalBlobIds = hashResult.stdout.trim() ? hashResult.stdout.trim().split(/\r?\n/) : [];
if (physicalBlobIds.length !== physicalFiles.length) {
failures.push(
`Git hash count mismatch: expected ${physicalFiles.length}, received ${physicalBlobIds.length}`
);
}
const physicalPaths = new Set(physicalFiles);
for (let index = 0; index < physicalFiles.length; index++) {
const path = physicalFiles[index];
const auditedBlobId = auditedBlobs.get(path);
if (!auditedBlobId) {
failures.push(`auditedCommit provider snapshot is missing: ${path}`);
} else if (auditedBlobId !== physicalBlobIds[index]) {
failures.push(`auditedCommit provider snapshot differs: ${path}`);
}
}
for (const path of auditedBlobs.keys()) {
if (!physicalPaths.has(path)) {
failures.push(`auditedCommit provider snapshot has no physical file: ${path}`);
}
}
return failures;
}
async function readManifest(path) {
const text = await readFile(path, "utf8");
return text
.split("\n")
.filter((line) => line.trim())
.map((line, index) => {
try {
return JSON.parse(line);
} catch (error) {
throw new Error(`invalid JSON on manifest line ${index + 1}: ${error.message}`);
}
});
}
async function main() {
const records = await readManifest(manifestPath);
const headers = records.filter((record) => record.recordType === "manifest");
const assets = records.filter((record) => record.recordType === "asset");
const aliases = records.filter((record) => record.recordType === "contentAlias");
const providerEntries = await readdir(providersDir, { withFileTypes: true });
const physicalFiles = providerEntries
.filter((entry) => entry.isFile())
.map((entry) => `public/providers/${entry.name}`)
.sort();
const nonRegularPaths = providerEntries
.filter((entry) => !entry.isFile())
.map((entry) => `public/providers/${entry.name}`)
.sort();
const manifestPaths = new Set(assets.map((asset) => asset.path));
const physicalPaths = new Set(physicalFiles);
const failures = [];
const pathsBySha256 = new Map();
for (const path of nonRegularPaths) {
failures.push(`non-regular provider asset entry is not allowed: ${path}`);
}
if (headers.length !== 1 || records[0]?.recordType !== "manifest") {
failures.push("manifest must contain exactly one recordType=manifest header on line 1");
}
const header = headers[0];
if (header) {
if (header.schemaVersion !== 1) {
failures.push(`unsupported schemaVersion: ${header.schemaVersion}`);
}
if (
header.expectedAssetCount !== assets.length ||
header.expectedAssetCount !== physicalFiles.length
) {
failures.push(
`expectedAssetCount mismatch: manifest ${header.expectedAssetCount}, ` +
`records ${assets.length}, physical ${physicalFiles.length}`
);
}
if (typeof header.auditedCommit !== "string" || !/^[0-9a-f]{40}$/i.test(header.auditedCommit)) {
failures.push("manifest auditedCommit must be a full 40-character Git SHA");
} else {
const gitCommitFailure = inspectGitCommit(header.auditedCommit);
if (gitCommitFailure) {
failures.push(gitCommitFailure);
} else if (providersDir === defaultProvidersDir) {
failures.push(...verifyAuditedProviderSnapshot(header.auditedCommit, physicalFiles));
}
}
if (typeof header.auditedAt !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(header.auditedAt)) {
failures.push("manifest auditedAt must use YYYY-MM-DD");
}
if (
typeof header.legalScope !== "string" ||
!header.legalScope.includes("does not establish copyright or trademark clearance")
) {
failures.push("manifest legalScope must disclaim copyright and trademark clearance");
}
}
for (const record of records) {
if (!new Set(["manifest", "asset", "contentAlias"]).has(record.recordType)) {
failures.push(`unknown manifest recordType: ${record.recordType}`);
}
}
const pathRecordCounts = new Map();
for (const asset of assets) {
pathRecordCounts.set(asset.path, (pathRecordCounts.get(asset.path) ?? 0) + 1);
}
for (const [path, count] of pathRecordCounts) {
if (count > 1) failures.push(`duplicate manifest asset path: ${path}`);
}
for (const path of physicalFiles) {
if (!manifestPaths.has(path)) failures.push(`missing from manifest: ${path}`);
}
for (const path of manifestPaths) {
if (!physicalPaths.has(path)) failures.push(`manifest path missing on disk: ${path}`);
}
for (const asset of assets) {
if (typeof asset.path !== "string" || !/^public\/providers\/[^/]+$/.test(asset.path)) {
failures.push(`invalid provider asset path: ${asset.path}`);
}
if (typeof asset.sha256 !== "string" || !/^[0-9a-f]{64}$/.test(asset.sha256)) {
failures.push(`invalid sha256 for ${asset.path}`);
}
if (!new Set(["image/svg+xml", "image/png", "image/jpeg"]).has(asset.mediaType)) {
failures.push(`invalid mediaType for ${asset.path}: ${asset.mediaType}`);
}
if (!PROVENANCE_STATUSES.has(asset.provenanceStatus)) {
failures.push(`invalid provenanceStatus for ${asset.path}: ${asset.provenanceStatus}`);
}
if (asset.provenanceStatus === "proven" && !hasImmutableSourceEvidence(asset.source)) {
failures.push(`proven asset requires immutable source evidence: ${asset.path}`);
}
if (
asset.provenanceStatus === "proven" &&
asset.source?.match === "byte-exact" &&
asset.source.integrity !== `sha256:${asset.sha256}`
) {
failures.push(`byte-exact source integrity must match local sha256: ${asset.path}`);
}
if (
asset.provenanceStatus === "proven" &&
asset.source?.match === "svg-path-data" &&
(typeof asset.source.matchDetail !== "string" || asset.source.matchDetail.length === 0)
) {
failures.push(`svg-path-data source requires matchDetail: ${asset.path}`);
}
if (!isValidUpstreamLicenseClaim(asset.upstreamLicenseClaim)) {
failures.push(`invalid upstreamLicenseClaim for ${asset.path}`);
}
if (new Set(["probable", "unresolved"]).has(asset.provenanceStatus) && asset.source !== null) {
failures.push(`${asset.provenanceStatus} asset source must be null: ${asset.path}`);
}
if (
new Set(["probable", "unresolved"]).has(asset.provenanceStatus) &&
asset.upstreamLicenseClaim !== null
) {
failures.push(`${asset.provenanceStatus} asset license claim must be null: ${asset.path}`);
}
if (asset.trademarkClearance !== null) {
failures.push(`trademarkClearance must remain null: ${asset.path}`);
}
if (typeof asset.evidenceNote !== "string" || asset.evidenceNote.trim().length === 0) {
failures.push(`evidenceNote is required: ${asset.path}`);
}
if (!physicalPaths.has(asset.path)) continue;
const fileName = asset.path.slice("public/providers/".length);
const content = await readFile(join(providersDir, fileName));
const actualSha256 = createHash("sha256").update(content).digest("hex");
const matchingPaths = pathsBySha256.get(actualSha256) ?? [];
matchingPaths.push(asset.path);
pathsBySha256.set(actualSha256, matchingPaths);
if (asset.sha256 !== actualSha256) {
failures.push(`sha256 mismatch: ${asset.path}`);
}
const actualMediaType = detectMediaType(content);
if (asset.mediaType !== actualMediaType) {
failures.push(
`mediaType mismatch: ${asset.path} (manifest ${asset.mediaType}, actual ${actualMediaType ?? "unknown"})`
);
}
}
const aliasesBySha256 = new Map();
for (const alias of aliases) {
if (aliasesBySha256.has(alias.sha256)) {
failures.push(`duplicate contentAlias record: sha256:${alias.sha256}`);
continue;
}
aliasesBySha256.set(alias.sha256, alias);
}
for (const [sha256, paths] of pathsBySha256) {
if (paths.length < 2) continue;
const alias = aliasesBySha256.get(sha256);
if (!alias) {
failures.push(`duplicate content missing alias record: sha256:${sha256}`);
continue;
}
const declaredPaths = [alias.canonicalPath, ...(alias.aliases ?? [])].sort();
const actualPaths = [...paths].sort();
if (JSON.stringify(declaredPaths) !== JSON.stringify(actualPaths)) {
failures.push(`contentAlias paths mismatch: sha256:${sha256}`);
}
}
for (const alias of aliases) {
if ((pathsBySha256.get(alias.sha256) ?? []).length < 2) {
failures.push(`contentAlias does not describe duplicate content: sha256:${alias.sha256}`);
}
}
if (failures.length > 0) {
console.error("Provider asset provenance failed:");
for (const failure of failures) console.error(`- ${failure}`);
process.exitCode = 1;
return;
}
const statusCounts = { proven: 0, probable: 0, unresolved: 0 };
for (const asset of assets) statusCounts[asset.provenanceStatus] += 1;
const duplicateGroupCount = [...pathsBySha256.values()].filter(
(paths) => paths.length > 1
).length;
console.log(
`Provider asset provenance passed: ${assets.length}/${physicalFiles.length} registered; ` +
`proven=${statusCounts.proven} probable=${statusCounts.probable} ` +
`unresolved=${statusCounts.unresolved}; duplicate-groups=${duplicateGroupCount}.`
);
}
main().catch((error) => {
console.error(`Provider asset provenance failed: ${error.message}`);
process.exitCode = 1;
});

View File

@@ -0,0 +1,524 @@
import assert from "node:assert/strict";
import { spawnSync } from "node:child_process";
import { createHash } from "node:crypto";
import { mkdirSync, mkdtempSync, readFileSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { fileURLToPath } from "node:url";
import test from "node:test";
const SCRIPT_PATH = fileURLToPath(
new URL("../../scripts/check/check-provider-asset-provenance.mjs", import.meta.url)
);
const REPO_ROOT = fileURLToPath(new URL("../..", import.meta.url));
const SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1 1"></svg>\n';
const SVG_WITH_DOCTYPE = `<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1 1"></svg>
`;
function sha256(value: string | Buffer) {
return createHash("sha256").update(value).digest("hex");
}
function makeFixture() {
const root = mkdtempSync(join(tmpdir(), "provider-asset-provenance-"));
const providersDir = join(root, "public/providers");
const manifestPath = join(root, "config/quality/provider-assets-provenance.jsonl");
mkdirSync(providersDir, { recursive: true });
mkdirSync(join(root, "config/quality"), { recursive: true });
return { root, providersDir, manifestPath };
}
function writeManifest(
path: string,
records: Record<string, unknown>[],
headerOverrides: Record<string, unknown> = {}
) {
const header = {
recordType: "manifest",
schemaVersion: 1,
expectedAssetCount: records.filter((record) => record.recordType === "asset").length,
auditedCommit: "091589089cd134a94df9f6cdab9ba562b2cefd18",
auditedAt: "2026-08-26",
legalScope:
"Provenance records source matching only; it does not establish copyright or trademark clearance.",
...headerOverrides,
};
writeFileSync(
path,
`${[header, ...records].map((record) => JSON.stringify(record)).join("\n")}\n`
);
}
function unresolvedAsset(path: string, content: string | Buffer = SVG) {
return {
recordType: "asset",
path,
mediaType: "image/svg+xml",
sha256: sha256(content),
provenanceStatus: "unresolved",
source: null,
upstreamLicenseClaim: null,
trademarkClearance: null,
evidenceNote: "No immutable upstream source is recorded yet.",
};
}
function provenAsset(path: string, content: string | Buffer = SVG) {
return {
...unresolvedAsset(path, content),
provenanceStatus: "proven",
source: {
kind: "git",
url: "https://example.invalid/source",
ref: "a".repeat(40),
path: "icons/example.svg",
integrity: `sha256:${sha256(content)}`,
match: "byte-exact",
},
evidenceNote: "Local bytes match an immutable source; no legal clearance is inferred.",
};
}
function runGate(providersDir: string, manifestPath: string, timeout?: number) {
return spawnSync(
process.execPath,
[SCRIPT_PATH, "--providers-dir", providersDir, "--manifest", manifestPath],
{ encoding: "utf8", timeout }
);
}
function gitObjectId(revision: string) {
const result = spawnSync("git", ["-C", REPO_ROOT, "rev-parse", revision], {
encoding: "utf8",
});
assert.equal(result.status, 0, result.stderr);
return result.stdout.trim();
}
function gitRootCommit() {
const result = spawnSync("git", ["-C", REPO_ROOT, "rev-list", "--max-parents=0", "HEAD"], {
encoding: "utf8",
});
assert.equal(result.status, 0, result.stderr);
return result.stdout.trim().split(/\r?\n/)[0];
}
function workflowJob(source: string, name: string) {
const lines = source.split("\n");
const start = lines.indexOf(` ${name}:`);
assert.notEqual(start, -1, `workflow job ${name} must exist`);
let end = lines.length;
for (let index = start + 1; index < lines.length; index++) {
const line = lines[index];
if (line.startsWith(" ") && !line.startsWith(" ") && line.endsWith(":")) {
end = index;
break;
}
}
return lines.slice(start + 1, end).join("\n");
}
test("provider asset provenance gate rejects a new physical asset without a manifest record", () => {
const fixture = makeFixture();
try {
writeFileSync(join(fixture.providersDir, "registered.svg"), SVG);
writeFileSync(join(fixture.providersDir, "surprise.svg"), SVG);
writeManifest(fixture.manifestPath, [unresolvedAsset("public/providers/registered.svg")]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/missing from manifest: public\/providers\/surprise\.svg/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate rejects a symlink that could evade physical coverage", () => {
const fixture = makeFixture();
try {
writeFileSync(join(fixture.providersDir, "registered.svg"), SVG);
symlinkSync("registered.svg", join(fixture.providersDir, "unregistered-link.svg"));
writeManifest(fixture.manifestPath, [unresolvedAsset("public/providers/registered.svg")]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/non-regular provider asset entry is not allowed: public\/providers\/unregistered-link\.svg/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate rejects a stale SHA-256", () => {
const fixture = makeFixture();
try {
writeFileSync(join(fixture.providersDir, "registered.svg"), SVG);
writeManifest(fixture.manifestPath, [
{
...unresolvedAsset("public/providers/registered.svg"),
sha256: "0".repeat(64),
},
]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/sha256 mismatch: public\/providers\/registered\.svg/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate validates magic MIME instead of trusting the suffix", () => {
const fixture = makeFixture();
const jpeg = Buffer.from([0xff, 0xd8, 0xff, 0xd9]);
try {
writeFileSync(join(fixture.providersDir, "misleading.png"), jpeg);
writeManifest(fixture.manifestPath, [
{
...unresolvedAsset("public/providers/misleading.png", jpeg),
mediaType: "image/png",
},
]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/mediaType mismatch: public\/providers\/misleading\.png \(manifest image\/png, actual image\/jpeg\)/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate does not accept a truncated JPEG prefix", () => {
const fixture = makeFixture();
const falseJpeg = Buffer.from([0xff, 0xd8, 0x00]);
try {
writeFileSync(join(fixture.providersDir, "truncated.jpg"), falseJpeg);
writeManifest(fixture.manifestPath, [
{
...unresolvedAsset("public/providers/truncated.jpg", falseJpeg),
mediaType: "image/jpeg",
},
]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/mediaType mismatch: public\/providers\/truncated\.jpg \(manifest image\/jpeg, actual unknown\)/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate recognizes an SVG with an XML doctype", () => {
const fixture = makeFixture();
try {
writeFileSync(join(fixture.providersDir, "doctype.svg"), SVG_WITH_DOCTYPE);
writeManifest(fixture.manifestPath, [
unresolvedAsset("public/providers/doctype.svg", SVG_WITH_DOCTYPE),
]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate scans adversarial SVG comment chains within a fixed bound", () => {
const fixture = makeFixture();
const adversarial = `<!--${"--><!--".repeat(50_000)}`;
try {
writeFileSync(join(fixture.providersDir, "adversarial.svg"), adversarial);
writeManifest(fixture.manifestPath, [
unresolvedAsset("public/providers/adversarial.svg", adversarial),
]);
const result = runGate(fixture.providersDir, fixture.manifestPath, 10_000);
assert.equal(result.error, undefined, result.error?.message);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/mediaType mismatch: public\/providers\/adversarial\.svg \(manifest image\/svg\+xml, actual unknown\)/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate rejects a status that implies legal clearance", () => {
const fixture = makeFixture();
try {
writeFileSync(join(fixture.providersDir, "registered.svg"), SVG);
writeManifest(fixture.manifestPath, [
{
...unresolvedAsset("public/providers/registered.svg"),
provenanceStatus: "licensed",
},
]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/invalid provenanceStatus for public\/providers\/registered\.svg: licensed/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate requires an alias record for duplicate content", () => {
const fixture = makeFixture();
try {
writeFileSync(join(fixture.providersDir, "canonical.svg"), SVG);
writeFileSync(join(fixture.providersDir, "alias.svg"), SVG);
writeManifest(fixture.manifestPath, [
unresolvedAsset("public/providers/alias.svg"),
unresolvedAsset("public/providers/canonical.svg"),
]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
new RegExp(`duplicate content missing alias record: sha256:${sha256(SVG)}`)
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate requires immutable source evidence for proven assets", () => {
const fixture = makeFixture();
try {
writeFileSync(join(fixture.providersDir, "registered.svg"), SVG);
writeManifest(fixture.manifestPath, [
{
...unresolvedAsset("public/providers/registered.svg"),
provenanceStatus: "proven",
},
]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/proven asset requires immutable source evidence: public\/providers\/registered\.svg/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate rejects malformed pinned-source integrity", () => {
const fixture = makeFixture();
try {
writeFileSync(join(fixture.providersDir, "registered.svg"), SVG);
writeManifest(fixture.manifestPath, [
{
...provenAsset("public/providers/registered.svg"),
source: {
kind: "npm",
url: "https://registry.npmjs.org/example/-/example-1.2.3.tgz",
ref: "1.2.3",
path: "package/icon.js",
integrity: "sha512:not-a-digest",
packageShasum: "a".repeat(40),
match: "svg-path-data",
matchDetail: "The only local path matches the pinned component.",
},
},
]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/proven asset requires immutable source evidence: public\/providers\/registered\.svg/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate rejects an unstructured upstream license claim", () => {
const fixture = makeFixture();
try {
writeFileSync(join(fixture.providersDir, "registered.svg"), SVG);
writeManifest(fixture.manifestPath, [
{
...provenAsset("public/providers/registered.svg"),
upstreamLicenseClaim: "MIT",
},
]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/invalid upstreamLicenseClaim for public\/providers\/registered\.svg/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate allows probable and unresolved records and reports counts", () => {
const fixture = makeFixture();
try {
writeFileSync(join(fixture.providersDir, "probable.svg"), SVG);
writeFileSync(join(fixture.providersDir, "unresolved.svg"), SVG);
writeManifest(fixture.manifestPath, [
{
...unresolvedAsset("public/providers/probable.svg"),
provenanceStatus: "probable",
evidenceNote:
"Repository history suggests a source family, but no immutable source exists.",
},
unresolvedAsset("public/providers/unresolved.svg"),
{
recordType: "contentAlias",
sha256: sha256(SVG),
canonicalPath: "public/providers/probable.svg",
aliases: ["public/providers/unresolved.svg"],
},
]);
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`);
assert.match(
result.stdout,
/2\/2 registered; proven=0 probable=1 unresolved=1; duplicate-groups=1/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate rejects a stale expected asset count", () => {
const fixture = makeFixture();
try {
writeFileSync(join(fixture.providersDir, "registered.svg"), SVG);
writeManifest(fixture.manifestPath, [unresolvedAsset("public/providers/registered.svg")], {
expectedAssetCount: 225,
});
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/expectedAssetCount mismatch: manifest 225, records 1, physical 1/
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate rejects a missing or non-commit auditedCommit", () => {
const fixture = makeFixture();
const missingObject = "f".repeat(40);
const blobObject = gitObjectId("HEAD:README.md");
try {
writeFileSync(join(fixture.providersDir, "registered.svg"), SVG);
for (const [auditedCommit, expectedError] of [
[missingObject, `auditedCommit object does not exist: ${missingObject}`],
[blobObject, `auditedCommit must identify a Git commit: ${blobObject} (found blob)`],
] as const) {
writeManifest(fixture.manifestPath, [unresolvedAsset("public/providers/registered.svg")], {
auditedCommit,
});
const result = runGate(fixture.providersDir, fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.ok(`${result.stdout}\n${result.stderr}`.includes(expectedError));
}
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("provider asset provenance gate binds auditedCommit to the physical provider snapshot", () => {
const fixture = makeFixture();
try {
const records = readFileSync(
join(REPO_ROOT, "config/quality/provider-assets-provenance.jsonl"),
"utf8"
)
.trim()
.split("\n")
.map((line) => JSON.parse(line));
records[0] = { ...records[0], auditedCommit: gitRootCommit() };
writeFileSync(
fixture.manifestPath,
`${records.map((record) => JSON.stringify(record)).join("\n")}\n`
);
const result = runGate(join(REPO_ROOT, "public/providers"), fixture.manifestPath);
assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`);
assert.match(
`${result.stdout}\n${result.stderr}`,
/auditedCommit provider snapshot (?:is missing|differs): public\/providers\//
);
} finally {
rmSync(fixture.root, { recursive: true, force: true });
}
});
test("repository provider asset manifest covers the audited 225-file snapshot", () => {
const result = runGate(
join(REPO_ROOT, "public/providers"),
join(REPO_ROOT, "config/quality/provider-assets-provenance.jsonl")
);
assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`);
assert.match(
result.stdout,
/225\/225 registered; proven=71 probable=69 unresolved=85; duplicate-groups=5/
);
});
test("provider asset provenance gate stays on both blocking CI rails", () => {
const ci = readFileSync(join(REPO_ROOT, ".github/workflows/ci.yml"), "utf8");
const ciLintJob = workflowJob(ci, "lint");
assert.match(ciLintJob, /^\s*- run: npm run check:provider-asset-provenance\s*$/m);
assert.match(ciLintJob, /fetch-depth: 0/);
const quality = readFileSync(join(REPO_ROOT, ".github/workflows/quality.yml"), "utf8");
const qualityFastGatesJob = workflowJob(quality, "fast-gates");
assert.match(qualityFastGatesJob, /gates=\([\s\S]*?\bprovider-asset-provenance\b[\s\S]*?\)/);
assert.match(qualityFastGatesJob, /npm run "check:\$g"/);
assert.match(qualityFastGatesJob, /fetch-depth: 0/);
});