{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-ce61cc3cab6216f1", "name": "Stray `console.log` in TS/JS \u2014 src/components/TenYearsHome.vue:457", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/TenYearsHome.vue:457"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b577e910ae5e793c", "name": "Stray `console.log` in TS/JS \u2014 src/components/UploadRole.vue:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/UploadRole.vue:86"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-815f1fb09a5c2977", "name": "Stray `console.log` in TS/JS \u2014 src/components/DailyReport.vue:170", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/DailyReport.vue:170"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-665baa0bca6e7759", "name": "Stray `console.log` in TS/JS \u2014 src/components/TenYears.vue:218", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/TenYears.vue:218"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0ede65c2c3853392", "name": "Stray `console.log` in TS/JS \u2014 src/components/HomePage.vue:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/HomePage.vue:131"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-855600d0b7b0c174", "name": "TODO/FIXME marker in shipping code \u2014 src/components/Login.vue:24", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/Login.vue:24"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1dd86827ca7f4014", "name": "Stray `console.log` in TS/JS \u2014 src/components/admin/OriginalDailyReportList.vue:267", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/OriginalDailyReportList.vue:267"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f47512c0ad0af3da", "name": "Stray `console.log` in TS/JS \u2014 src/components/admin/HalfYearInfoList.vue:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/HalfYearInfoList.vue:108"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ab84ad580d07c7b", "name": "Stray `console.log` in TS/JS \u2014 src/components/admin/GroupsList.vue:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/GroupsList.vue:129"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d3382caade78d66a", "name": "Stray `console.log` in TS/JS \u2014 src/components/admin/DailyReportList.vue:400", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/DailyReportList.vue:400"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ddda4c5640767881", "name": "Stray `console.log` in TS/JS \u2014 src/components/admin/MonthInfoList.vue:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/MonthInfoList.vue:113"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b6febc0206525eab", "name": "Stray `console.log` in TS/JS \u2014 src/components/admin/AdminHome.vue:265", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/AdminHome.vue:265"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9d3d4b04b045e5db", "name": "Stray `console.log` in TS/JS \u2014 src/components/admin/InfoList.vue:318", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/InfoList.vue:318"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-058888ea52c6c1f2", "name": "Stray `console.log` in TS/JS \u2014 src/components/admin/GroupList.vue:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/GroupList.vue:122"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-208591866ab10466", "name": "Stray `console.log` in TS/JS \u2014 src/components/settings/Notification.vue:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/Notification.vue:81"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-01e3705449ce4feb", "name": "Stray `console.log` in TS/JS \u2014 src/components/settings/DefaultTemplateList.vue:114", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/DefaultTemplateList.vue:114"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-678f30f975b5be1f", "name": "Stray `console.log` in TS/JS \u2014 src/components/settings/DefaultTemplateList2.vue:121", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/DefaultTemplateList2.vue:121"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d2312cd19d480354", "name": "Stray `console.log` in TS/JS \u2014 src/components/settings/DefaultTemplateList1.vue:121", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/DefaultTemplateList1.vue:121"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a1fd3c12c55db751", "name": "Stray `console.log` in TS/JS \u2014 src/components/settings/TemplateList.vue:231", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/TemplateList.vue:231"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e2e50e2c544eed0", "name": "Insecure pattern 'vue_v_html' in src/components/TenYears.vue:5", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in src/components/TenYears.vue:5"}, "fullDescription": {"text": "Found a known-risky pattern (vue_v_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-37b457ceea29b356", "name": "Insecure pattern 'vue_v_html' in src/components/CheckinCircle.vue:86", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in src/components/CheckinCircle.vue:86"}, "fullDescription": {"text": "Found a known-risky pattern (vue_v_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "0 test file(s) for 8 source file(s) (ratio 0.00). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24889"}, "properties": {"repository": "chaihuasong/TenYeas-Vue", "repoUrl": "https://github.com/chaihuasong/TenYeas-Vue", "branch": "main"}, "results": [{"ruleId": "scanner-ce61cc3cab6216f1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/TenYearsHome.vue:457"}, "properties": {"repobilityId": "58bd4acb15865e7e", "scanner": "scanner-primary", "fingerprint": "ce61cc3cab6216f1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b577e910ae5e793c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/UploadRole.vue:86"}, "properties": {"repobilityId": "40cef971894f9012", "scanner": "scanner-primary", "fingerprint": "b577e910ae5e793c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-815f1fb09a5c2977", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/DailyReport.vue:170"}, "properties": {"repobilityId": "8bc21537b3f94364", "scanner": "scanner-primary", "fingerprint": "815f1fb09a5c2977", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-665baa0bca6e7759", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/TenYears.vue:218"}, "properties": {"repobilityId": "47ef89475b90b5c9", "scanner": "scanner-primary", "fingerprint": "665baa0bca6e7759", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0ede65c2c3853392", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/HomePage.vue:131"}, "properties": {"repobilityId": "880a7c89753d53f7", "scanner": "scanner-primary", "fingerprint": "0ede65c2c3853392", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-855600d0b7b0c174", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 src/components/Login.vue:24"}, "properties": {"repobilityId": "17c4679367c980cf", "scanner": "scanner-primary", "fingerprint": "855600d0b7b0c174", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1dd86827ca7f4014", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/OriginalDailyReportList.vue:267"}, "properties": {"repobilityId": "7671cc2e8bddee3d", "scanner": "scanner-primary", "fingerprint": "1dd86827ca7f4014", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f47512c0ad0af3da", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/HalfYearInfoList.vue:108"}, "properties": {"repobilityId": "0710a69160ae9a7f", "scanner": "scanner-primary", "fingerprint": "f47512c0ad0af3da", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8ab84ad580d07c7b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/GroupsList.vue:129"}, "properties": {"repobilityId": "8b69aa107e850eea", "scanner": "scanner-primary", "fingerprint": "8ab84ad580d07c7b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d3382caade78d66a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/DailyReportList.vue:400"}, "properties": {"repobilityId": "76e165509ac9ee86", "scanner": "scanner-primary", "fingerprint": "d3382caade78d66a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ddda4c5640767881", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/MonthInfoList.vue:113"}, "properties": {"repobilityId": "f132a4cad5836c6d", "scanner": "scanner-primary", "fingerprint": "ddda4c5640767881", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b6febc0206525eab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/AdminHome.vue:265"}, "properties": {"repobilityId": "b0f443be503c0533", "scanner": "scanner-primary", "fingerprint": "b6febc0206525eab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d3d4b04b045e5db", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/InfoList.vue:318"}, "properties": {"repobilityId": "dee75b109a5ebab2", "scanner": "scanner-primary", "fingerprint": "9d3d4b04b045e5db", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-058888ea52c6c1f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/admin/GroupList.vue:122"}, "properties": {"repobilityId": "1ab15453fd9ae0ef", "scanner": "scanner-primary", "fingerprint": "058888ea52c6c1f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-208591866ab10466", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/Notification.vue:81"}, "properties": {"repobilityId": "312385b33c93d36c", "scanner": "scanner-primary", "fingerprint": "208591866ab10466", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-01e3705449ce4feb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/DefaultTemplateList.vue:114"}, "properties": {"repobilityId": "621b68e6f634acbf", "scanner": "scanner-primary", "fingerprint": "01e3705449ce4feb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-678f30f975b5be1f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/DefaultTemplateList2.vue:121"}, "properties": {"repobilityId": "92031b137598729c", "scanner": "scanner-primary", "fingerprint": "678f30f975b5be1f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d2312cd19d480354", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/DefaultTemplateList1.vue:121"}, "properties": {"repobilityId": "d91f4499b9a24d28", "scanner": "scanner-primary", "fingerprint": "d2312cd19d480354", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1fd3c12c55db751", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/settings/TemplateList.vue:231"}, "properties": {"repobilityId": "4ff167688c185308", "scanner": "scanner-primary", "fingerprint": "a1fd3c12c55db751", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4e2e50e2c544eed0", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in src/components/TenYears.vue:5"}, "properties": {"repobilityId": "69d261dec04b5e45", "scanner": "scanner-primary", "fingerprint": "4e2e50e2c544eed0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/TenYears.vue"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-37b457ceea29b356", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in src/components/CheckinCircle.vue:86"}, "properties": {"repobilityId": "8c0fd78ed5e72cb9", "scanner": "scanner-primary", "fingerprint": "37b457ceea29b356", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/CheckinCircle.vue"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "5eca1b8881562890", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "71cd8452d3629145", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}]}]}