{"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-8e1ab8669abdd5d6", "name": "Possibly dead Python function: enrich", "shortDescription": {"text": "Possibly dead Python function: enrich"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-900078eb5cf1b537", "name": "Possibly dead Python function: save_spotlights", "shortDescription": {"text": "Possibly dead Python function: save_spotlights"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-412fe4d63e669a1c", "name": "Possibly dead Python function: condition_to_categories", "shortDescription": {"text": "Possibly dead Python function: condition_to_categories"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-970622226535f284", "name": "Possibly dead Python function: save_stories", "shortDescription": {"text": "Possibly dead Python function: save_stories"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc22a8e97df78f72", "name": "Possibly dead Python function: create_blog_post", "shortDescription": {"text": "Possibly dead Python function: create_blog_post"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb56fe5b0029cf5f", "name": "Stray `console.log` in TS/JS \u2014 deploy.js:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 deploy.js:10"}, "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-06d02235fd420d03", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-date-added.js:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-date-added.js:61"}, "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-385d837e9fb97cae", "name": "Stray `console.log` in TS/JS \u2014 cloudflare-worker-admin-api/worker.js:274", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 cloudflare-worker-admin-api/worker.js:274"}, "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-d6f696a0fb7df358", "name": "\"active\" state uses light bg in a dark theme \u2014 src/admin/review/portal.js:220", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/admin/review/portal.js:220"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "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-9ab7aaa5dd1f6f04", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/js/gigRespond.js:32", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/js/gigRespond.js:32"}, "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-5d147654a5209727", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/js/resourceFilter.js:31", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/js/resourceFilter.js:31"}, "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-e4f495be4cf0b6c9", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/js/eventCalendar.js:212", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/js/eventCalendar.js:212"}, "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-d4f63da385ab9e33", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f12b8051a0aac21a", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-node@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad6701f0a8405e22", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28dd12ee15a27f80", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7add9d9dc6e55201", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "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": "2 test file(s) for 48 source file(s) (ratio 0.04). 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 147 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "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 license. 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-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8b61cf3bbbef67b3", "name": "Agent authority lacks a verifier contract: .claude/agents/code-reviewer.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/code-reviewer.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-96ed4a3de37a3777", "name": "Agent instruction/config may expose a secret: .claude/skills/designing-onboarding-paths/references/feedback-insights.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/designing-onboarding-paths/references/feedback-insights.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5ac0b1cbbe908493", "name": "Agent authority lacks a verifier contract: .claude/skills/json/references/patterns.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/json/references/patterns.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ca1c51004c00448c", "name": "Agent authority lacks a verifier contract: .claude/skills/orchestrating-feature-adoption/references/activation-onboardin", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/orchestrating-feature-adoption/references/activation-onboarding.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35d0c2e30035ced8", "name": "Agent authority lacks a verifier contract: .claude/skills/clarifying-market-fit/references/growth-engineering.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/clarifying-market-fit/references/growth-engineering.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e22e19e3fd2e2dbb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker/worker.js:166", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker/worker.js:166"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f93d0fbf255d273e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker-decap-oauth/worker.js:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker-decap-oauth/worker.js:26"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dffbc26f03e85763", "name": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker-admin-api/worker.js:120", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker-admin-api/worker.js:120"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9e3574909e721ed1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/js/main.js:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/js/main.js:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-67f5d0c1fa6fd18a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/admin/review/portal.js:96", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/admin/review/portal.js:96"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cc0f9d8e41b33b0e", "name": "11 env vars used in code but missing from .env.example", "shortDescription": {"text": "11 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `PATH_PREFIX`, `TFP_BLOCKLIST_FILE`, `TFP_CMS_STATES`, `TFP_DATA_DIR`, `TFP_LLM_ENRICH`, `TFP_NEWS_LEADS`, `TFP_NEWS_STATES` + 3 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscrapers/sources/spotlight_scraper.py:write_log, scrapers/sources/blog_content.py:write_log\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21054"}, "properties": {"repository": "The-Fullest-Project/thefullestproject", "repoUrl": "https://github.com/The-Fullest-Project/thefullestproject", "branch": "main"}, "results": [{"ruleId": "scanner-8e1ab8669abdd5d6", "level": "note", "message": {"text": "Possibly dead Python function: enrich"}, "properties": {"repobilityId": "59d6a595aa25355f", "scanner": "scanner-primary", "fingerprint": "8e1ab8669abdd5d6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scrapers/_extraction.py:110"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-900078eb5cf1b537", "level": "note", "message": {"text": "Possibly dead Python function: save_spotlights"}, "properties": {"repobilityId": "2de0785db14dd001", "scanner": "scanner-primary", "fingerprint": "900078eb5cf1b537", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scrapers/sources/spotlight_scraper.py:69"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-412fe4d63e669a1c", "level": "note", "message": {"text": "Possibly dead Python function: condition_to_categories"}, "properties": {"repobilityId": "1203b9b287d957f4", "scanner": "scanner-primary", "fingerprint": "412fe4d63e669a1c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scrapers/sources/medically_complex.py:37"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-970622226535f284", "level": "note", "message": {"text": "Possibly dead Python function: save_stories"}, "properties": {"repobilityId": "16fbab10b44a234a", "scanner": "scanner-primary", "fingerprint": "970622226535f284", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scrapers/sources/positive_stories.py:45"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fc22a8e97df78f72", "level": "note", "message": {"text": "Possibly dead Python function: create_blog_post"}, "properties": {"repobilityId": "c523f803f01be085", "scanner": "scanner-primary", "fingerprint": "fc22a8e97df78f72", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scrapers/sources/blog_content.py:171"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb56fe5b0029cf5f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 deploy.js:10"}, "properties": {"repobilityId": "4f6d2dcf5dcdbe14", "scanner": "scanner-primary", "fingerprint": "cb56fe5b0029cf5f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06d02235fd420d03", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-date-added.js:61"}, "properties": {"repobilityId": "dd9d2b95bfc99fc6", "scanner": "scanner-primary", "fingerprint": "06d02235fd420d03", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-385d837e9fb97cae", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 cloudflare-worker-admin-api/worker.js:274"}, "properties": {"repobilityId": "0eb3f2d0a852a33f", "scanner": "scanner-primary", "fingerprint": "385d837e9fb97cae", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d6f696a0fb7df358", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 src/admin/review/portal.js:220"}, "properties": {"repobilityId": "33874a9e35bf6992", "scanner": "scanner-primary", "fingerprint": "d6f696a0fb7df358", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"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-9ab7aaa5dd1f6f04", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/js/gigRespond.js:32"}, "properties": {"repobilityId": "39101e4bd2e06c00", "scanner": "scanner-primary", "fingerprint": "9ab7aaa5dd1f6f04", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/js/gigRespond.js"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-5d147654a5209727", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/js/resourceFilter.js:31"}, "properties": {"repobilityId": "3e834f3a1f13e1e2", "scanner": "scanner-primary", "fingerprint": "5d147654a5209727", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/js/resourceFilter.js"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-e4f495be4cf0b6c9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/js/eventCalendar.js:212"}, "properties": {"repobilityId": "41cda7f7d18c84e3", "scanner": "scanner-primary", "fingerprint": "e4f495be4cf0b6c9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/js/eventCalendar.js"}, "region": {"startLine": 212}}}]}, {"ruleId": "scanner-d4f63da385ab9e33", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8ddc7cf841b3e18f", "scanner": "scanner-primary", "fingerprint": "d4f63da385ab9e33", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/scrape.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-d4f63da385ab9e33", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "df59ba11c10671d9", "scanner": "scanner-primary", "fingerprint": "d4f63da385ab9e33", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/scrape.yml"}, "region": {"startLine": 88}}}]}, {"ruleId": "scanner-d4f63da385ab9e33", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "e41f89ce9d86b210", "scanner": "scanner-primary", "fingerprint": "d4f63da385ab9e33", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/scrape.yml"}, "region": {"startLine": 100}}}]}, {"ruleId": "scanner-d4f63da385ab9e33", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "88e56990fa18e599", "scanner": "scanner-primary", "fingerprint": "d4f63da385ab9e33", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/scrape.yml"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-f12b8051a0aac21a", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "23f89d5adb4dd94e", "scanner": "scanner-primary", "fingerprint": "f12b8051a0aac21a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/scrape.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "bee6b8956e03198c", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b70dbcc8f54d72ab", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "419d1ec7943efec2", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-ad6701f0a8405e22", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "8384c23520d55657", "scanner": "scanner-primary", "fingerprint": "ad6701f0a8405e22", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-28dd12ee15a27f80", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a4e9e4c3eb9fbab9", "scanner": "scanner-primary", "fingerprint": "28dd12ee15a27f80", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/gig-publish.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-7add9d9dc6e55201", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "5adf9c81bee2ecb6", "scanner": "scanner-primary", "fingerprint": "7add9d9dc6e55201", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/gig-publish.yml"}, "region": {"startLine": 1}}}]}, {"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": "90ad57a2cc9dfab6", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "6a6ac1f7a815bcef", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "ff051fc34e5cde70", "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": "288ea9e9d245f7e9", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "604636239f5f9249", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "444577eabda10229", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8b61cf3bbbef67b3", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/code-reviewer.md"}, "properties": {"repobilityId": "5bdbcbe505ae9cd6", "scanner": "scanner-primary", "fingerprint": "8b61cf3bbbef67b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/code-reviewer.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-96ed4a3de37a3777", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/designing-onboarding-paths/references/feedback-insights.md"}, "properties": {"repobilityId": "ec8975bed0ce0607", "scanner": "scanner-primary", "fingerprint": "96ed4a3de37a3777", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/designing-onboarding-paths/references/feedback-insights.md"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-5ac0b1cbbe908493", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/json/references/patterns.md"}, "properties": {"repobilityId": "47f8e26e590ebdc8", "scanner": "scanner-primary", "fingerprint": "5ac0b1cbbe908493", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/json/references/patterns.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ca1c51004c00448c", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/orchestrating-feature-adoption/references/activation-onboarding.md"}, "properties": {"repobilityId": "4bb342b2020ecb9a", "scanner": "scanner-primary", "fingerprint": "ca1c51004c00448c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/orchestrating-feature-adoption/references/activation-onboarding.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-35d0c2e30035ced8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/clarifying-market-fit/references/growth-engineering.md"}, "properties": {"repobilityId": "1ecf0fd8969b87a5", "scanner": "scanner-primary", "fingerprint": "35d0c2e30035ced8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/clarifying-market-fit/references/growth-engineering.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e22e19e3fd2e2dbb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker/worker.js:166"}, "properties": {"repobilityId": "40424ddee6916c63", "scanner": "scanner-primary", "fingerprint": "e22e19e3fd2e2dbb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f93d0fbf255d273e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker-decap-oauth/worker.js:26"}, "properties": {"repobilityId": "3acb361c63d2f648", "scanner": "scanner-primary", "fingerprint": "f93d0fbf255d273e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dffbc26f03e85763", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 cloudflare-worker-admin-api/worker.js:120"}, "properties": {"repobilityId": "4685bf1ad55b2e31", "scanner": "scanner-primary", "fingerprint": "dffbc26f03e85763", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9e3574909e721ed1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/js/main.js:27"}, "properties": {"repobilityId": "caf4723b6f594ff6", "scanner": "scanner-primary", "fingerprint": "9e3574909e721ed1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-67f5d0c1fa6fd18a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/admin/review/portal.js:96"}, "properties": {"repobilityId": "6544df3b8a1cea33", "scanner": "scanner-primary", "fingerprint": "67f5d0c1fa6fd18a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cc0f9d8e41b33b0e", "level": "note", "message": {"text": "11 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "c82cd8cd626c3599", "scanner": "scanner-primary", "fingerprint": "cc0f9d8e41b33b0e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d88570f90f6cb231", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "f70dcd64b9cd28cc", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}