{"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-0612109c01d7478a", "name": "React Flow <Controls> without dark theming \u2014 resources/js/PluginPages/AutoZap/FlowCanvasEditor.vue:542", "shortDescription": {"text": "React Flow <Controls> without dark theming \u2014 resources/js/PluginPages/AutoZap/FlowCanvasEditor.vue:542"}, "fullDescription": {"text": "`<Controls>` ships with white buttons. Override `.react-flow__controls` and `.react-flow__controls-button` in your stylesheet or pass a styled wrapper.\n\nWhy: P1 in CHECKLIST.md \u2014 vendor defaults bleed light through.\nRule id: fq.controls.no-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0497ea874c8b2f39", "name": "Custom React Flow node registered without explicit width/height \u2014 resources/js/PluginPages/AutoZap/ProductPanel.vue:84", "shortDescription": {"text": "Custom React Flow node registered without explicit width/height \u2014 resources/js/PluginPages/AutoZap/ProductPanel.vue:84"}, "fullDescription": {"text": "When you register a custom node type via `nodeTypes`, the RFNode object you build must include `width` and `height` props. Without them, MiniMap renders ZERO mini-nodes for that type and `fitView` underestimates the bounds (cuts off lane labels, etc.). Add `width: \u2026, height: \u2026` to the node object. See P-I.\n\nWhy: P-I in CHECKLIST.md \u2014 RF MiniMap + fitView need explicit dims on custom nodes.\nRule id: fq.rfnode.no-dims"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d63da3583b14afc0", "name": "Dockerfile runs as root: Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aa2e8f788c255060", "name": "Docker base image is tag-pinned but not digest-pinned: php:8.2-fpm-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: php:8.2-fpm-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0c941b47f50e67c1", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/composables/useCheckoutCustomCode.js:51", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/composables/useCheckoutCustomCode.js:51"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d74f62a5c210d7f", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/MemberAreaVideoPlayer.vue:454", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/MemberAreaVideoPlayer.vue:454"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5f9acbf134d5abd0", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/checkout/CajuPaySdkMount.vue:54", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/checkout/CajuPaySdkMount.vue:54"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-224602d90626a9a3", "name": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/checkout/ConversionPixels.vue:253", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/checkout/ConversionPixels.vue:253"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e4b9121a5ebcc811", "name": "Insecure pattern 'vue_v_html' in resources/js/components/member-area/lesson/MemberLessonContent.vue:94", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in resources/js/components/member-area/lesson/MemberLessonContent.vue:94"}, "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-a3d57ca8b91e8977", "name": "Insecure pattern 'vue_v_html' in resources/js/Pages/Assinaturas/Index.vue:305", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Assinaturas/Index.vue:305"}, "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-9cb2f16ad6e8b210", "name": "Insecure pattern 'vue_v_html' in resources/js/Pages/Alunos/Index.vue:540", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Alunos/Index.vue:540"}, "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-3009c9ebc80fce32", "name": "Insecure pattern 'vue_v_html' in resources/js/Pages/Checkout/Show.vue:753", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Checkout/Show.vue:753"}, "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-c1e9572e89144017", "name": "Insecure pattern 'vue_v_html' in resources/js/Pages/Reembolsos/Index.vue:206", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Reembolsos/Index.vue:206"}, "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-891a282af8f7d9ca", "name": "Insecure pattern 'vue_v_html' in resources/js/Pages/Produtos/Index.vue:265", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Produtos/Index.vue:265"}, "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-f3e95a985b0ef6a4", "name": "Possible secret in resources/js/Pages/Produtos/MemberBuilder/Standalone.vue", "shortDescription": {"text": "Possible secret in resources/js/Pages/Produtos/MemberBuilder/Standalone.vue"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-9792e504d6fb233a", "name": "Insecure pattern 'vue_v_html' in resources/js/Pages/Partner/Vendas.vue:339", "shortDescription": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Partner/Vendas.vue:339"}, "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-3429b03ff306c886", "name": "Possible secret in docker/entrypoint.sh", "shortDescription": {"text": "Possible secret in docker/entrypoint.sh"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 49 source file(s) (ratio 0.02). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 36 placeholder/mock markers across 12 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing ci. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d4f11df04a9ddf9f", "name": "Commented-code block (7 lines) in resources/js/composables/useCajuPaySdk.js:160", "shortDescription": {"text": "Commented-code block (7 lines) in resources/js/composables/useCajuPaySdk.js:160"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-342506beb58a780f", "name": "Legacy-named symbol `migratedLegacy` in resources/js/lib/pushSubscription.js:169", "shortDescription": {"text": "Legacy-named symbol `migratedLegacy` in resources/js/lib/pushSubscription.js:169"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b5a76780c3df9aa", "name": "1 env vars used in code but missing from .env.example", "shortDescription": {"text": "1 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DEV`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24059"}, "properties": {"repository": "AlexandreTunnermann/ophir", "repoUrl": "https://github.com/AlexandreTunnermann/ophir", "branch": "main"}, "results": [{"ruleId": "scanner-0612109c01d7478a", "level": "note", "message": {"text": "React Flow <Controls> without dark theming \u2014 resources/js/PluginPages/AutoZap/FlowCanvasEditor.vue:542"}, "properties": {"repobilityId": "adad9c4998a336c0", "scanner": "scanner-primary", "fingerprint": "0612109c01d7478a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.controls.no-bg"]}}, {"ruleId": "scanner-0497ea874c8b2f39", "level": "warning", "message": {"text": "Custom React Flow node registered without explicit width/height \u2014 resources/js/PluginPages/AutoZap/ProductPanel.vue:84"}, "properties": {"repobilityId": "33fd24e667439a6e", "scanner": "scanner-primary", "fingerprint": "0497ea874c8b2f39", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.rfnode.no-dims"]}}, {"ruleId": "scanner-d63da3583b14afc0", "level": "warning", "message": {"text": "Dockerfile runs as root: Dockerfile"}, "properties": {"repobilityId": "a2ed1bd120e507db", "scanner": "scanner-primary", "fingerprint": "d63da3583b14afc0", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-aa2e8f788c255060", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: php:8.2-fpm-alpine"}, "properties": {"repobilityId": "4db416898b7d9f41", "scanner": "scanner-primary", "fingerprint": "aa2e8f788c255060", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-aa2e8f788c255060", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: php:8.2-fpm-alpine"}, "properties": {"repobilityId": "cb07cf5b2ceca3f4", "scanner": "scanner-primary", "fingerprint": "aa2e8f788c255060", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-0c941b47f50e67c1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/composables/useCheckoutCustomCode.js:51"}, "properties": {"repobilityId": "b4782400611ce8b0", "scanner": "scanner-primary", "fingerprint": "0c941b47f50e67c1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/composables/useCheckoutCustomCode.js"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-2d74f62a5c210d7f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/MemberAreaVideoPlayer.vue:454"}, "properties": {"repobilityId": "43a44c299853894f", "scanner": "scanner-primary", "fingerprint": "2d74f62a5c210d7f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/components/MemberAreaVideoPlayer.vue"}, "region": {"startLine": 454}}}]}, {"ruleId": "scanner-5f9acbf134d5abd0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/checkout/CajuPaySdkMount.vue:54"}, "properties": {"repobilityId": "dd967aa76ae4c665", "scanner": "scanner-primary", "fingerprint": "5f9acbf134d5abd0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/components/checkout/CajuPaySdkMount.vue"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-224602d90626a9a3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in resources/js/components/checkout/ConversionPixels.vue:253"}, "properties": {"repobilityId": "79dfe6986fb46a41", "scanner": "scanner-primary", "fingerprint": "224602d90626a9a3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/components/checkout/ConversionPixels.vue"}, "region": {"startLine": 253}}}]}, {"ruleId": "scanner-e4b9121a5ebcc811", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in resources/js/components/member-area/lesson/MemberLessonContent.vue:94"}, "properties": {"repobilityId": "e0da3ae093b48cc2", "scanner": "scanner-primary", "fingerprint": "e4b9121a5ebcc811", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/components/member-area/lesson/MemberLessonContent.vue"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-a3d57ca8b91e8977", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Assinaturas/Index.vue:305"}, "properties": {"repobilityId": "f185e31824939fb0", "scanner": "scanner-primary", "fingerprint": "a3d57ca8b91e8977", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/Pages/Assinaturas/Index.vue"}, "region": {"startLine": 305}}}]}, {"ruleId": "scanner-9cb2f16ad6e8b210", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Alunos/Index.vue:540"}, "properties": {"repobilityId": "8833e86ef6d421cb", "scanner": "scanner-primary", "fingerprint": "9cb2f16ad6e8b210", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/Pages/Alunos/Index.vue"}, "region": {"startLine": 540}}}]}, {"ruleId": "scanner-3009c9ebc80fce32", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Checkout/Show.vue:753"}, "properties": {"repobilityId": "24395d1caec010c4", "scanner": "scanner-primary", "fingerprint": "3009c9ebc80fce32", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/Pages/Checkout/Show.vue"}, "region": {"startLine": 753}}}]}, {"ruleId": "scanner-c1e9572e89144017", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Reembolsos/Index.vue:206"}, "properties": {"repobilityId": "ecbfeff5e6f8e7a5", "scanner": "scanner-primary", "fingerprint": "c1e9572e89144017", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/Pages/Reembolsos/Index.vue"}, "region": {"startLine": 206}}}]}, {"ruleId": "scanner-891a282af8f7d9ca", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Produtos/Index.vue:265"}, "properties": {"repobilityId": "cd2736d9598e4b82", "scanner": "scanner-primary", "fingerprint": "891a282af8f7d9ca", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/Pages/Produtos/Index.vue"}, "region": {"startLine": 265}}}]}, {"ruleId": "scanner-f3e95a985b0ef6a4", "level": "error", "message": {"text": "Possible secret in resources/js/Pages/Produtos/MemberBuilder/Standalone.vue"}, "properties": {"repobilityId": "f9f50b9517bea6d8", "scanner": "scanner-primary", "fingerprint": "f3e95a985b0ef6a4", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/Pages/Produtos/MemberBuilder/Standalone.vue"}, "region": {"startLine": 1831}}}]}, {"ruleId": "scanner-9792e504d6fb233a", "level": "warning", "message": {"text": "Insecure pattern 'vue_v_html' in resources/js/Pages/Partner/Vendas.vue:339"}, "properties": {"repobilityId": "35c9448f8f0876dd", "scanner": "scanner-primary", "fingerprint": "9792e504d6fb233a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "vue_v_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "resources/js/Pages/Partner/Vendas.vue"}, "region": {"startLine": 339}}}]}, {"ruleId": "scanner-3429b03ff306c886", "level": "error", "message": {"text": "Possible secret in docker/entrypoint.sh"}, "properties": {"repobilityId": "5615dcfa8307f946", "scanner": "scanner-primary", "fingerprint": "3429b03ff306c886", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docker/entrypoint.sh"}, "region": {"startLine": 150}}}]}, {"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-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "0734c7bb1fc35b0a", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "9f1a7369c6dd4f71", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "a9a70e7414741761", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-d4f11df04a9ddf9f", "level": "none", "message": {"text": "Commented-code block (7 lines) in resources/js/composables/useCajuPaySdk.js:160"}, "properties": {"repobilityId": "770c8a7581fe779f", "scanner": "scanner-primary", "fingerprint": "d4f11df04a9ddf9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-342506beb58a780f", "level": "note", "message": {"text": "Legacy-named symbol `migratedLegacy` in resources/js/lib/pushSubscription.js:169"}, "properties": {"repobilityId": "6402052f8e937213", "scanner": "scanner-primary", "fingerprint": "342506beb58a780f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1b5a76780c3df9aa", "level": "none", "message": {"text": "1 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d04379b337b44a15", "scanner": "scanner-primary", "fingerprint": "1b5a76780c3df9aa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}