{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-4+qual-2+sec-2","generated_at":"2026-11-13T23:56:51.143068Z","repo":{"ref":{"host":"github.com","owner":"bohd4nx","name":"app-landing"},"default_branch":"main","clone_url":"https://github.com/bohd4nx/app-landing.git","html_url":"https://github.com/bohd4nx/app-landing","description":"100% vibe-coded mobile app landing page template — built with Next.js, React, and Tailwind CSS. Drop in your app's content, deploy, done.","stars":229,"forks":34,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":1543,"primary_language":"TypeScript","license_spdx":"MIT","created_at":"2025-02-19T02:47:18Z","pushed_at":"2026-11-08T23:38:02Z","security_policy_url":null,"distribution":{"owner_created_at":"2023-12-24T00:13:17Z","owner_type":"User","release_assets":[]}},"commit_sha":"8c289f473c26ea4fc8a1ee0008e2200167b30e2a","profile":{"lines_by_language":{"TypeScript":2128,"JavaScript":5},"files_by_category":{"source":38,"config":10,"docs":5,"other":2,"generated":1,"binary":1},"source_lines":2133,"test_lines":0},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.6,"coverage":1.0,"label":"possible","breakdown":{"attributed_share":0.0,"suspected_share":0.0,"estimated_share":0.0,"ai_artifacts":0.0,"flagged_work_units":0.0,"flagged_releases":null},"summary":"Weak signals consistent with AI-assisted development. 1 commit(s) carry explicit AI attribution, too few to characterize the codebase."},"quality":{"score":58.5,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":100.0,"duplication":73.6,"lint":26.0,"testing":25.0,"docs":65.0,"type_safety":100.0,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.00, no CI test run detected; 0% of function code in complex or long functions; 5% duplicated lines. Weakest area: testing."},"security":{"score":69.3,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":84.6,"sast":87.0,"dependencies":83.2,"ci_actions":21.4,"posture":40.0,"scorecard":null},"summary":"Security posture is weak: 0 possible secret(s) in the tree, 1 only in history; 2 known vulnerabilities in 2 dependencies; 7 high-severity workflow issues. Weakest area: ci actions."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no published OpenSSF Scorecard result for this repo"},{"analyzer":"sec-registry","pillar":"security","status":"ok","tool_version":null,"metrics":{"declared":15.0,"checked":15.0,"missing":0.0,"recent":0.0,"lookup_errors":0.0},"findings":[],"evidence":[],"data":{"phantom":false},"error":null},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":80.0,"attributed_commits":1.0,"attributed_commit_share":0.0125,"effective_loc":9113.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 1 attributed commits, 0 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"0f30299d8b856ed56b232e871d3d6f41ef3a17b6","url":"https://github.com/bohd4nx/app-landing/commit/0f30299d8b856ed56b232e871d3d6f41ef3a17b6","weight":0.9}],"data":{"attributed_loc_by_commit":{"0f30299d8b856ed56b232e871d3d6f41ef3a17b6":0},"tools":{"claude-code":{"name":"Claude Code","commits":1,"loc":0,"first_seen":1782614955,"last_seen":1782614955}},"monthly":{"2025-02":{"loc":1238,"attributed_loc":0},"2025-03":{"loc":70,"attributed_loc":0},"2025-04":{"loc":458,"attributed_loc":0},"2025-05":{"loc":2,"attributed_loc":0},"2025-08":{"loc":576,"attributed_loc":0},"2025-09":{"loc":78,"attributed_loc":0},"2025-10":{"loc":0,"attributed_loc":0},"2025-11":{"loc":371,"attributed_loc":0},"2025-12":{"loc":2,"attributed_loc":0},"2026-01":{"loc":1875,"attributed_loc":0},"2026-02":{"loc":1130,"attributed_loc":0},"2026-03":{"loc":904,"attributed_loc":0},"2026-05":{"loc":59,"attributed_loc":0},"2026-06":{"loc":2336,"attributed_loc":0},"2026-07":{"loc":0,"attributed_loc":0},"2026-08":{"loc":0,"attributed_loc":0},"2026-09":{"loc":0,"attributed_loc":0},"2026-11":{"loc":14,"attributed_loc":0}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":0.0,"workflow_agents":0.0,"tools_configured":0.0},"findings":[],"evidence":[],"data":{"artifacts":[],"workflows":[],"tools":[]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":28.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":9113.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":446.08529598981545,"median_loc_per_hour":141.25,"pr_timed_units":0.0,"excluded_import_loc":0.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":[]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":2133.0,"index":0.0,"count:narrated_steps":0.0,"per_kloc:narrated_steps":0.0,"files:narrated_steps":0.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":0.0,"per_kloc:emoji_in_code":0.0,"files:emoji_in_code":0.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":1.0,"secrets_nonprod":0.0,"secrets_low_confidence":0.0},"findings":[{"rule_id":"gitleaks/linkedin-client-id","severity":"medium","message":"Possible linkedin-client-id secret in history (commit 29eaaf1208); removed from the current tree but still retrievable","path":"src/config/socialLinks.ts","line":22,"fingerprint":"29eaaf120844088b095e8948a13be74c17cbadda:src/config/socialLinks.ts:linkedin-client-id:22"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":2.0,"findings_high":0.0,"findings_medium":2.0,"findings_low":0.0,"weighted_findings":0.85,"scanned_lines":2133.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/typescript.react.security.audit.react-dangerouslysetinnerhtml","severity":"medium","message":"Detection of dangerouslySetInnerHTML from non-constant definition. This can inadvertently expose users to cross-site scripting (XSS) attacks if this comes from user-provided input. If you have to use dangerouslySetInnerHTML, consider using a sanitization library such as DOMPurify to sanitize your HT [confidence medium]","path":"src/components/Markdown/index.tsx","line":42,"fingerprint":"typescript.react.security.audit.react-dangerouslysetinnerhtml:src/components/Markdown/index.tsx:42"},{"rule_id":"opengrep/javascript.lang.security.html-in-template-string","severity":"medium","message":"This template literal looks like HTML and has interpolated variables. These variables are not HTML-encoded by default. If the variables contain HTML tags, these may be interpreted by the browser, resulting in cross-site scripting (XSS). [confidence low]","path":"src/components/Markdown/parseMarkdown.ts","line":16,"fingerprint":"javascript.lang.security.html-in-template-string:src/components/Markdown/parseMarkdown.ts:16"}],"evidence":[],"data":{"rulesets":["typescript","javascript"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":2.0,"vulnerabilities":2.0,"vulns_critical":0.0,"vulns_high":1.0,"vulns_medium":1.0,"vulns_low":0.0,"vulns_unknown":0.0,"penalty":11.0},"findings":[{"rule_id":"osv/GHSA-68fv-2mgg-jv7q","severity":"high","message":"source-map-js@1.2.1 (npm) is affected by GHSA-68fv-2mgg-jv7q","path":"pnpm-lock.yaml","line":null,"fingerprint":"source-map-js@1.2.1 (npm):GHSA-68fv-2mgg-jv7q"},{"rule_id":"osv/GHSA-rj75-hqrm-r3gf","severity":"medium","message":"postcss-selector-parser@6.0.10 (npm) is affected by GHSA-rj75-hqrm-r3gf","path":"pnpm-lock.yaml","line":null,"fingerprint":"postcss-selector-parser@6.0.10 (npm):GHSA-rj75-hqrm-r3gf"}],"evidence":[],"data":{"ecosystems":["npm"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":1.0,"findings":11.0,"findings_high":7.0,"findings_medium":2.0,"findings_low":2.0,"penalty":92.6},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/auto-lint-format-fixes.yml","line":21,"fingerprint":"unpinned-uses:.github/workflows/auto-lint-format-fixes.yml:21"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/auto-lint-format-fixes.yml","line":24,"fingerprint":"unpinned-uses:.github/workflows/auto-lint-format-fixes.yml:24"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/auto-lint-format-fixes.yml","line":27,"fingerprint":"unpinned-uses:.github/workflows/auto-lint-format-fixes.yml:27"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/auto-lint-format-fixes.yml","line":47,"fingerprint":"unpinned-uses:.github/workflows/auto-lint-format-fixes.yml:47"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/auto-lint-format-fixes.yml","line":50,"fingerprint":"unpinned-uses:.github/workflows/auto-lint-format-fixes.yml:50"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/auto-lint-format-fixes.yml","line":53,"fingerprint":"unpinned-uses:.github/workflows/auto-lint-format-fixes.yml:53"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/auto-lint-format-fixes.yml","line":68,"fingerprint":"unpinned-uses:.github/workflows/auto-lint-format-fixes.yml:68"},{"rule_id":"zizmor/dependabot-cooldown","severity":"medium","message":"insufficient cooldown in Dependabot updates [confidence high]","path":".github/dependabot.yml","line":3,"fingerprint":"dependabot-cooldown:.github/dependabot.yml:3"},{"rule_id":"zizmor/dependabot-cooldown","severity":"medium","message":"insufficient cooldown in Dependabot updates [confidence high]","path":".github/dependabot.yml","line":12,"fingerprint":"dependabot-cooldown:.github/dependabot.yml:12"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/auto-lint-format-fixes.yml","line":20,"fingerprint":"artipacked:.github/workflows/auto-lint-format-fixes.yml:20"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/auto-lint-format-fixes.yml","line":46,"fingerprint":"artipacked:.github/workflows/auto-lint-format-fixes.yml:46"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":1.0,"check:signed_commits":0.0,"check:lockfiles":1.0,"signed_commit_share":0.2,"unpinned_manifests":0.0},"findings":[],"evidence":[{"kind":"posture","description":"Dependency updates: .github/dependabot.yml","ref":".github/dependabot.yml","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":0.0,"binary_assets":0.0,"suspicious":0.0},"findings":[],"evidence":[],"data":{"signals":[],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":107.0,"function_nloc":1094.0,"mean_ccn":1.77,"p90_ccn":3.0,"complex_functions":0.0,"long_functions":0.0,"many_param_functions":0.0,"risky_nloc_share":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":1524.0,"duplicated_lines":78.0,"duplicated_share":0.0512,"files":38.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: src/app/privacy-policy/page.tsx:17 and src/app/terms-of-service/page.tsx:16","ref":"src/app/privacy-policy/page.tsx","url":"https://github.com/bohd4nx/app-landing/blob/8c289f473c26ea4fc8a1ee0008e2200167b30e2a/src/app/privacy-policy/page.tsx#L17","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/components/FAQ/index.tsx:9 and src/components/Features/index.tsx:9","ref":"src/components/FAQ/index.tsx","url":"https://github.com/bohd4nx/app-landing/blob/8c289f473c26ea4fc8a1ee0008e2200167b30e2a/src/components/FAQ/index.tsx#L9","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/components/Features/FeatureCard.tsx:10 and src/components/Pricing/TierCard.tsx:8","ref":"src/components/Features/FeatureCard.tsx","url":"https://github.com/bohd4nx/app-landing/blob/8c289f473c26ea4fc8a1ee0008e2200167b30e2a/src/components/Features/FeatureCard.tsx#L10","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/components/Footer/FooterMobile.tsx:31 and src/components/Footer/FooterMobile.tsx:42","ref":"src/components/Footer/FooterMobile.tsx","url":"https://github.com/bohd4nx/app-landing/blob/8c289f473c26ea4fc8a1ee0008e2200167b30e2a/src/components/Footer/FooterMobile.tsx#L31","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/config.ts:80 and src/config.ts:81","ref":"src/config.ts","url":"https://github.com/bohd4nx/app-landing/blob/8c289f473c26ea4fc8a1ee0008e2200167b30e2a/src/config.ts#L80","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":13.0,"weighted_findings":11.5,"scanned_lines":2133.0,"category:best-practice":11.0,"category:correctness":2.0},"findings":[{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/components/AppHero/index.tsx","line":29,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/AppHero/index.tsx:29"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/components/AppHero/index.tsx","line":40,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/AppHero/index.tsx:40"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/components/AppHero/index.tsx","line":53,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/AppHero/index.tsx:53"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/components/AppHero/index.tsx","line":60,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/AppHero/index.tsx:60"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/components/AppHero/index.tsx","line":66,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/AppHero/index.tsx:66"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/components/AppHero/index.tsx","line":70,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/AppHero/index.tsx:70"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/components/Footer/FooterDesktop.tsx","line":30,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/Footer/FooterDesktop.tsx:30"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/components/Footer/FooterDesktop.tsx","line":83,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/Footer/FooterDesktop.tsx:83"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/components/Footer/FooterDesktop.tsx","line":90,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/Footer/FooterDesktop.tsx:90"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/components/Footer/FooterDesktop.tsx","line":97,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/Footer/FooterDesktop.tsx:97"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"src/components/Footer/FooterMobile.tsx","line":11,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/Footer/FooterMobile.tsx:11"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/layout.tsx","line":47,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/layout.tsx:47"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"src/app/layout.tsx","line":47,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:src/app/layout.tsx:47"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":0.0,"check:test_ratio":0.0,"check:ci_present":1.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":1.0,"check:tests_cochange":0.0,"test_lines":0.0,"source_lines":2133.0,"test_ratio":0.0,"ci_files":1.0,"cochange_share":0.0,"cochange_commits":50.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/auto-lint-format-fixes.yml","ref":".github/workflows/auto-lint-format-fixes.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs linters (biome)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":[],"lint_commands":["biome"]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":1.0,"check:contributing":0.0,"check:changelog":0.0,"readme_lines":72.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE","ref":"LICENSE","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:strict_config":1.0,"check:low_escape_density":1.0,"escapes":0.0,"escapes_per_kloc":0.0},"findings":[],"evidence":[{"kind":"typing","description":"TypeScript strict type checking: tsconfig.json","ref":"tsconfig.json","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"x-blame","pillar":"ai_provenance","status":"ok","tool_version":"git-blame","metrics":{"ai_lines":0.0,"other_lines":2133.0,"files_blamed":38.0,"blame_failures":0.0,"quality:ai_findings":0.0,"quality:other_findings":13.0,"quality:other_per_kloc":6.095,"security:ai_findings":0.0,"security:other_findings":2.0,"security:other_per_kloc":0.938},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":false},"error":null}],"flags":[]}