{"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-65849233c608c4f1", "name": "Possibly dead Python function: execute_search_places", "shortDescription": {"text": "Possibly dead Python function: execute_search_places"}, "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-d605395d61ccb287", "name": "Possibly dead Python function: execute_get_trip_context", "shortDescription": {"text": "Possibly dead Python function: execute_get_trip_context"}, "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-9ac9853ec5e984b9", "name": "Possibly dead Python function: execute_propose_replace_places", "shortDescription": {"text": "Possibly dead Python function: execute_propose_replace_places"}, "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-c3f0237724b7af0d", "name": "Possibly dead Python function: execute_propose_add_places", "shortDescription": {"text": "Possibly dead Python function: execute_propose_add_places"}, "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-5ac50fe1fa277779", "name": "Possibly dead Python function: execute_evaluate_day_balance", "shortDescription": {"text": "Possibly dead Python function: execute_evaluate_day_balance"}, "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-08a249ff603effc3", "name": "Possibly dead Python function: execute_generate_full_itinerary", "shortDescription": {"text": "Possibly dead Python function: execute_generate_full_itinerary"}, "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-df3453775a035caf", "name": "Possibly dead Python function: execute_estimate_budget", "shortDescription": {"text": "Possibly dead Python function: execute_estimate_budget"}, "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-cb47dd8a70592621", "name": "Possibly dead Python function: execute_compare_places", "shortDescription": {"text": "Possibly dead Python function: execute_compare_places"}, "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-a205c6306743e319", "name": "Possibly dead Python function: execute_get_directions", "shortDescription": {"text": "Possibly dead Python function: execute_get_directions"}, "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-f5f0f2cc3bddaf1d", "name": "Possibly dead Python function: execute_get_weather", "shortDescription": {"text": "Possibly dead Python function: execute_get_weather"}, "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-fdb231641bf1c0d3", "name": "Stray `console.log` in TS/JS \u2014 server/src/app.module.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server/src/app.module.ts:50"}, "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-6b0073526e3e9889", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/main/ExchangeRate.tsx:97", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/main/ExchangeRate.tsx:97"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1682be32e8d208f8", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/community/AttachedPlanCard.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/community/AttachedPlanCard.tsx:62"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e3e8be0dc134d7a4", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/PlaceDetailContainer.tsx:327", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/PlaceDetailContainer.tsx:327"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2949ca1f0756ce2f", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SlotEditModal.tsx:93", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SlotEditModal.tsx:93"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7efe39766b559210", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/PlaceItem.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/PlaceItem.tsx:92"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0188c24dd1c3bac8", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/LeftPanel.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/LeftPanel.tsx:54"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-68e46a4c7f1f3c28", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SlotItem.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SlotItem.tsx:84"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c7d683d321f0deee", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SearchContainer.tsx:269", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SearchContainer.tsx:269"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2bf984293c394577", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/TripSetupModal.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/TripSetupModal.tsx:87"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-61ed1687c1469042", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SavePlanModal.tsx:333", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SavePlanModal.tsx:333"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f678d43fd221d3b9", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/PlaceSearch.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/PlaceSearch.tsx:106"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-06f63db7d8a8780d", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/ai-chat/ActionCard.tsx:339", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/ai-chat/ActionCard.tsx:339"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-642ed256ebc15f2d", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/ai-chat/AiChatPanel.tsx:209", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/ai-chat/AiChatPanel.tsx:209"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d404a63163e7f16f", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/mypage/PlanCard.tsx:30", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/mypage/PlanCard.tsx:30"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c94a91e3003993ae", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/mypage/MyPageClient.tsx:310", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/mypage/MyPageClient.tsx:310"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-334f3f4982581fe5", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/common/Header.tsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/common/Header.tsx:179"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c4bd275cc0bff088", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/city/ChatPanel.tsx:156", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/city/ChatPanel.tsx:156"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3df3436c759e4313", "name": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/city/CityHubClient.tsx:245", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/city/CityHubClient.tsx:245"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "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 194 source file(s) (ratio 0.01). 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-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 83 placeholder/mock markers across 16 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. 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": "low", "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, 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-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-8273c5f2df03a708", "name": "Agent authority lacks a verifier contract: .claude/rules/frontend/ui-ux.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/rules/frontend/ui-ux.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-f9dd08064a98a775", "name": "Agent authority lacks a verifier contract: .claude/rules/server/crud.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/rules/server/crud.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-b2587a1719b94ba3", "name": "Agent instruction/config may expose a secret: .claude/rules/ai-server/python.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/rules/ai-server/python.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-bbc234f2ad01d7a9", "name": "Agent instruction/config may expose a secret: .claude/rules/common/security.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/rules/common/security.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-cfdac2522adf190f", "name": "Agent authority lacks a verifier contract: .claude/rules/common/security.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/rules/common/security.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-a53a9fce81227265", "name": "Agent authority lacks a verifier contract: .claude/rules/common/session.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/rules/common/session.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-9027f62dac189b4d", "name": "Agent authority lacks a verifier contract: .claude/skills/session-log/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/session-log/SKILL.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-9afc209864f07986", "name": "Commented-code block (5 lines) in ai-server/services/sort_service.py:19", "shortDescription": {"text": "Commented-code block (5 lines) in ai-server/services/sort_service.py:19"}, "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-7c33596b6bb3ce78", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/app/(main)/community/page.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/app/(main)/community/page.tsx:21"}, "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-56c54b2d4a8d2e60", "name": "Commented-code block (7 lines) in client/src/components/plans/ai-chat/hooks/useChatMessages.ts:178", "shortDescription": {"text": "Commented-code block (7 lines) in client/src/components/plans/ai-chat/hooks/useChatMessages.ts:178"}, "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-c5bfe17e20744da1", "name": "Commented-code block (5 lines) in client/src/components/common/Button.tsx:12", "shortDescription": {"text": "Commented-code block (5 lines) in client/src/components/common/Button.tsx:12"}, "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-46121cf307287b16", "name": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/city/CityHubClient.tsx:367", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/city/CityHubClient.tsx:367"}, "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-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:\nai-server/core/models.py:validate_time, ai-server/core/models.py:validate_time\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}}, {"id": "scanner-284ad54fc7a6a329", "name": "FastAPI POST `sort` without auth dependency \u2014 ai-server/routers/sort.py:11", "shortDescription": {"text": "FastAPI POST `sort` without auth dependency \u2014 ai-server/routers/sort.py:11"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-088fadce83433f64", "name": "FastAPI POST `chat_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:13", "shortDescription": {"text": "FastAPI POST `chat_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:13"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8b90b5a905aee5e8", "name": "FastAPI POST `chat_stream_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:20", "shortDescription": {"text": "FastAPI POST `chat_stream_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:20"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-840ce1e0a4d6a13f", "name": "FastAPI POST `generate_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:33", "shortDescription": {"text": "FastAPI POST `generate_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:33"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-20c3a7b084f8a876", "name": "FastAPI POST `select_transit_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:39", "shortDescription": {"text": "FastAPI POST `select_transit_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:39"}, "fullDescription": {"text": "`@router.post` decorator with no `Depends(get_current_user)` or auth-shaped dependency in its signature. Mutating endpoints should require authentication unless explicitly public."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4c4b95269c8b9aac", "name": "Dangling fetch: POST https://places.googleapis.com/v1/places:autocomplete (client/src/components/main/CitySearchModal.ts", "shortDescription": {"text": "Dangling fetch: POST https://places.googleapis.com/v1/places:autocomplete (client/src/components/main/CitySearchModal.tsx:50)"}, "fullDescription": {"text": "`client/src/components/main/CitySearchModal.tsx:50` calls `POST https://places.googleapis.com/v1/places:autocomplete` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/places.googleapis.com/v1/places/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a27a57d8bb83d43d", "name": "Dangling fetch: GET /api/exchange (client/src/components/main/ExchangeRate.tsx:33)", "shortDescription": {"text": "Dangling fetch: GET /api/exchange (client/src/components/main/ExchangeRate.tsx:33)"}, "fullDescription": {"text": "`client/src/components/main/ExchangeRate.tsx:33` calls `GET /api/exchange` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/exchange`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`ai-server/main.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37f915e4a3e08600", "name": "Unused endpoint: POST /sort", "shortDescription": {"text": "Unused endpoint: POST /sort"}, "fullDescription": {"text": "`ai-server/routers/sort.py` declares `POST /sort` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cff8da5fbc19c76d", "name": "Unused endpoint: POST /chat", "shortDescription": {"text": "Unused endpoint: POST /chat"}, "fullDescription": {"text": "`ai-server/routers/chat.py` declares `POST /chat` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b30ef55a849c5f77", "name": "Unused endpoint: POST /chat/stream", "shortDescription": {"text": "Unused endpoint: POST /chat/stream"}, "fullDescription": {"text": "`ai-server/routers/chat.py` declares `POST /chat/stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-970eb92d6ec2bfaa", "name": "Unused endpoint: POST /generate", "shortDescription": {"text": "Unused endpoint: POST /generate"}, "fullDescription": {"text": "`ai-server/routers/chat.py` declares `POST /generate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-992c1ca69013452f", "name": "Unused endpoint: POST /select-transit", "shortDescription": {"text": "Unused endpoint: POST /select-transit"}, "fullDescription": {"text": "`ai-server/routers/chat.py` declares `POST /select-transit` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-52d18a6bbac84f8c", "name": "Unused endpoint: GET /review/stats", "shortDescription": {"text": "Unused endpoint: GET /review/stats"}, "fullDescription": {"text": "`server/src/review/review.controller.ts` declares `GET /review/stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-13eb367f611bf878", "name": "Unused endpoint: GET /review/bulk-stats", "shortDescription": {"text": "Unused endpoint: GET /review/bulk-stats"}, "fullDescription": {"text": "`server/src/review/review.controller.ts` declares `GET /review/bulk-stats` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a4532e6e997c040e", "name": "Unused endpoint: DELETE /review/:id", "shortDescription": {"text": "Unused endpoint: DELETE /review/:id"}, "fullDescription": {"text": "`server/src/review/review.controller.ts` declares `DELETE /review/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2436d3e594d74f54", "name": "Unused endpoint: POST /review/:id/like", "shortDescription": {"text": "Unused endpoint: POST /review/:id/like"}, "fullDescription": {"text": "`server/src/review/review.controller.ts` declares `POST /review/:id/like` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a23e0ef0af0a6b72", "name": "Unused endpoint: GET /plan/public", "shortDescription": {"text": "Unused endpoint: GET /plan/public"}, "fullDescription": {"text": "`server/src/plan/plan.controller.ts` declares `GET /plan/public` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc7c405357ce83b9", "name": "Unused endpoint: GET /plan/public/:id", "shortDescription": {"text": "Unused endpoint: GET /plan/public/:id"}, "fullDescription": {"text": "`server/src/plan/plan.controller.ts` declares `GET /plan/public/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb14b660f71e848f", "name": "Unused endpoint: GET /plan/:id", "shortDescription": {"text": "Unused endpoint: GET /plan/:id"}, "fullDescription": {"text": "`server/src/plan/plan.controller.ts` declares `GET /plan/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f29e89892dd96ae6", "name": "Unused endpoint: POST /plan/:id/clone", "shortDescription": {"text": "Unused endpoint: POST /plan/:id/clone"}, "fullDescription": {"text": "`server/src/plan/plan.controller.ts` declares `POST /plan/:id/clone` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4f2d27fe4d3e476d", "name": "Unused endpoint: POST /plan/full", "shortDescription": {"text": "Unused endpoint: POST /plan/full"}, "fullDescription": {"text": "`server/src/plan/plan.controller.ts` declares `POST /plan/full` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3a0f07395881573b", "name": "Unused endpoint: PUT /plan/:id/full", "shortDescription": {"text": "Unused endpoint: PUT /plan/:id/full"}, "fullDescription": {"text": "`server/src/plan/plan.controller.ts` declares `PUT /plan/:id/full` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f0d96513c8d536bf", "name": "Unused endpoint: PATCH /plan/:id", "shortDescription": {"text": "Unused endpoint: PATCH /plan/:id"}, "fullDescription": {"text": "`server/src/plan/plan.controller.ts` declares `PATCH /plan/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6639ee16ea4d3f39", "name": "Unused endpoint: DELETE /plan/:id", "shortDescription": {"text": "Unused endpoint: DELETE /plan/:id"}, "fullDescription": {"text": "`server/src/plan/plan.controller.ts` declares `DELETE /plan/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5bbad7535e608386", "name": "Unused endpoint: POST /chat/rooms/:roomNum/join", "shortDescription": {"text": "Unused endpoint: POST /chat/rooms/:roomNum/join"}, "fullDescription": {"text": "`server/src/chat/chat-room.controller.ts` declares `POST /chat/rooms/:roomNum/join` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-77ffe1a1e69043cf", "name": "Unused endpoint: DELETE /chat/rooms/:roomNum/leave", "shortDescription": {"text": "Unused endpoint: DELETE /chat/rooms/:roomNum/leave"}, "fullDescription": {"text": "`server/src/chat/chat-room.controller.ts` declares `DELETE /chat/rooms/:roomNum/leave` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9e59d6c02de05224", "name": "Unused endpoint: GET /chat/rooms/my", "shortDescription": {"text": "Unused endpoint: GET /chat/rooms/my"}, "fullDescription": {"text": "`server/src/chat/chat-room.controller.ts` declares `GET /chat/rooms/my` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c171687ec66c7039", "name": "Unused endpoint: GET /chat/rooms/:roomNum/messages", "shortDescription": {"text": "Unused endpoint: GET /chat/rooms/:roomNum/messages"}, "fullDescription": {"text": "`server/src/chat/chat-room.controller.ts` declares `GET /chat/rooms/:roomNum/messages` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f85a32feeafd78c9", "name": "Unused endpoint: POST /ai/chat", "shortDescription": {"text": "Unused endpoint: POST /ai/chat"}, "fullDescription": {"text": "`server/src/ai-proxy/ai-proxy.controller.ts` declares `POST /ai/chat` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8d58e566c989437d", "name": "Unused endpoint: POST /ai/chat/stream", "shortDescription": {"text": "Unused endpoint: POST /ai/chat/stream"}, "fullDescription": {"text": "`server/src/ai-proxy/ai-proxy.controller.ts` declares `POST /ai/chat/stream` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-849509e7ec081afa", "name": "Unused endpoint: POST /ai/generate", "shortDescription": {"text": "Unused endpoint: POST /ai/generate"}, "fullDescription": {"text": "`server/src/ai-proxy/ai-proxy.controller.ts` declares `POST /ai/generate` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f687e6281b1c8c6f", "name": "Unused endpoint: POST /ai/sort", "shortDescription": {"text": "Unused endpoint: POST /ai/sort"}, "fullDescription": {"text": "`server/src/ai-proxy/ai-proxy.controller.ts` declares `POST /ai/sort` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-50ca94182a77f51f", "name": "Unused endpoint: POST /ai/select-transit", "shortDescription": {"text": "Unused endpoint: POST /ai/select-transit"}, "fullDescription": {"text": "`server/src/ai-proxy/ai-proxy.controller.ts` declares `POST /ai/select-transit` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4c24967e46458f9e", "name": "Unused endpoint: GET /community/:id", "shortDescription": {"text": "Unused endpoint: GET /community/:id"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `GET /community/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c401457c2595342f", "name": "Unused endpoint: PATCH /community/:id", "shortDescription": {"text": "Unused endpoint: PATCH /community/:id"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `PATCH /community/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d9ac0de946a07820", "name": "Unused endpoint: DELETE /community/:id", "shortDescription": {"text": "Unused endpoint: DELETE /community/:id"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `DELETE /community/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-130aa727ff1fc366", "name": "Unused endpoint: POST /community/:id/images", "shortDescription": {"text": "Unused endpoint: POST /community/:id/images"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `POST /community/:id/images` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-332c7c1d3ad064d7", "name": "Unused endpoint: POST /community/:id/like", "shortDescription": {"text": "Unused endpoint: POST /community/:id/like"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `POST /community/:id/like` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ff45ed07cf571e7", "name": "Unused endpoint: GET /community/:id/like", "shortDescription": {"text": "Unused endpoint: GET /community/:id/like"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `GET /community/:id/like` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a299be1591f8a51", "name": "Unused endpoint: POST /community/:id/clone-plan", "shortDescription": {"text": "Unused endpoint: POST /community/:id/clone-plan"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `POST /community/:id/clone-plan` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dc565d5f5f536165", "name": "Unused endpoint: POST /community/:id/report", "shortDescription": {"text": "Unused endpoint: POST /community/:id/report"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `POST /community/:id/report` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e9788b9a99a7903", "name": "Unused endpoint: POST /community/comment/:commentId/report", "shortDescription": {"text": "Unused endpoint: POST /community/comment/:commentId/report"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `POST /community/comment/:commentId/report` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46a9f54f89a2dbd5", "name": "Unused endpoint: GET /community/:id/comments", "shortDescription": {"text": "Unused endpoint: GET /community/:id/comments"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `GET /community/:id/comments` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9e7c3d305f63fbed", "name": "Unused endpoint: POST /community/:id/comments", "shortDescription": {"text": "Unused endpoint: POST /community/:id/comments"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `POST /community/:id/comments` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a59a3bb5775e107", "name": "Unused endpoint: PATCH /community/:id/comments/:commentId", "shortDescription": {"text": "Unused endpoint: PATCH /community/:id/comments/:commentId"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `PATCH /community/:id/comments/:commentId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-87d388140f212289", "name": "Unused endpoint: DELETE /community/:id/comments/:commentId", "shortDescription": {"text": "Unused endpoint: DELETE /community/:id/comments/:commentId"}, "fullDescription": {"text": "`server/src/community/community.controller.ts` declares `DELETE /community/:id/comments/:commentId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e64b3dd1132bd446", "name": "Unused endpoint: GET /user/me", "shortDescription": {"text": "Unused endpoint: GET /user/me"}, "fullDescription": {"text": "`server/src/user/user.controller.ts` declares `GET /user/me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-37ef7d931bf7ed70", "name": "Unused endpoint: PATCH /user/me", "shortDescription": {"text": "Unused endpoint: PATCH /user/me"}, "fullDescription": {"text": "`server/src/user/user.controller.ts` declares `PATCH /user/me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3d53b0842b0269df", "name": "Unused endpoint: POST /auth/send-verification", "shortDescription": {"text": "Unused endpoint: POST /auth/send-verification"}, "fullDescription": {"text": "`server/src/auth/auth.controller.ts` declares `POST /auth/send-verification` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7c24523ddc468eef", "name": "Unused endpoint: POST /auth/verify-code", "shortDescription": {"text": "Unused endpoint: POST /auth/verify-code"}, "fullDescription": {"text": "`server/src/auth/auth.controller.ts` declares `POST /auth/verify-code` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8292c0931391749a", "name": "Unused endpoint: POST /auth/register", "shortDescription": {"text": "Unused endpoint: POST /auth/register"}, "fullDescription": {"text": "`server/src/auth/auth.controller.ts` declares `POST /auth/register` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8fdbacfe9430a6ed", "name": "Unused endpoint: POST /auth/login", "shortDescription": {"text": "Unused endpoint: POST /auth/login"}, "fullDescription": {"text": "`server/src/auth/auth.controller.ts` declares `POST /auth/login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2e9f0c712241895d", "name": "Unused endpoint: GET /auth/google", "shortDescription": {"text": "Unused endpoint: GET /auth/google"}, "fullDescription": {"text": "`server/src/auth/auth.controller.ts` declares `GET /auth/google` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5b39b75067f063f9", "name": "Unused endpoint: GET /auth/kakao", "shortDescription": {"text": "Unused endpoint: GET /auth/kakao"}, "fullDescription": {"text": "`server/src/auth/auth.controller.ts` declares `GET /auth/kakao` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a51925b1d0c40863", "name": "Unused endpoint: GET /auth/naver", "shortDescription": {"text": "Unused endpoint: GET /auth/naver"}, "fullDescription": {"text": "`server/src/auth/auth.controller.ts` declares `GET /auth/naver` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-392dcbd9c0e4ed85", "name": "Unused endpoint: GET /auth/google/callback", "shortDescription": {"text": "Unused endpoint: GET /auth/google/callback"}, "fullDescription": {"text": "`server/src/auth/auth.controller.ts` declares `GET /auth/google/callback` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24985"}, "properties": {"repository": "CingDam/TripAdviser", "repoUrl": "https://github.com/CingDam/TripAdviser", "branch": "main"}, "results": [{"ruleId": "scanner-65849233c608c4f1", "level": "note", "message": {"text": "Possibly dead Python function: execute_search_places"}, "properties": {"repobilityId": "11b17ffe0aea9896", "scanner": "scanner-primary", "fingerprint": "65849233c608c4f1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/services/tools/search_places.py:45"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d605395d61ccb287", "level": "note", "message": {"text": "Possibly dead Python function: execute_get_trip_context"}, "properties": {"repobilityId": "136fc1652d801268", "scanner": "scanner-primary", "fingerprint": "d605395d61ccb287", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/services/tools/get_trip_context.py:25"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9ac9853ec5e984b9", "level": "note", "message": {"text": "Possibly dead Python function: execute_propose_replace_places"}, "properties": {"repobilityId": "0515675f618dd579", "scanner": "scanner-primary", "fingerprint": "9ac9853ec5e984b9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/services/tools/propose_replace_places.py:62"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c3f0237724b7af0d", "level": "note", "message": {"text": "Possibly dead Python function: execute_propose_add_places"}, "properties": {"repobilityId": "308f34d5969c1432", "scanner": "scanner-primary", "fingerprint": "c3f0237724b7af0d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/services/tools/propose_add_places.py:64"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5ac50fe1fa277779", "level": "note", "message": {"text": "Possibly dead Python function: execute_evaluate_day_balance"}, "properties": {"repobilityId": "6015d58d15ab076c", "scanner": "scanner-primary", "fingerprint": "5ac50fe1fa277779", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/services/tools/evaluate_day_balance.py:40"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-08a249ff603effc3", "level": "note", "message": {"text": "Possibly dead Python function: execute_generate_full_itinerary"}, "properties": {"repobilityId": "8e955b40eedaedc5", "scanner": "scanner-primary", "fingerprint": "08a249ff603effc3", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/services/tools/generate_full_itinerary.py:89"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-df3453775a035caf", "level": "note", "message": {"text": "Possibly dead Python function: execute_estimate_budget"}, "properties": {"repobilityId": "86089769670605af", "scanner": "scanner-primary", "fingerprint": "df3453775a035caf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/services/tools/estimate_budget.py:57"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cb47dd8a70592621", "level": "note", "message": {"text": "Possibly dead Python function: execute_compare_places"}, "properties": {"repobilityId": "e22c666e9b03baeb", "scanner": "scanner-primary", "fingerprint": "cb47dd8a70592621", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/services/tools/compare_places.py:35"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a205c6306743e319", "level": "note", "message": {"text": "Possibly dead Python function: execute_get_directions"}, "properties": {"repobilityId": "40d586c746410603", "scanner": "scanner-primary", "fingerprint": "a205c6306743e319", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/services/tools/get_directions.py:79"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f5f0f2cc3bddaf1d", "level": "note", "message": {"text": "Possibly dead Python function: execute_get_weather"}, "properties": {"repobilityId": "c046879d5c33e224", "scanner": "scanner-primary", "fingerprint": "f5f0f2cc3bddaf1d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/services/tools/get_weather.py:39"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fdb231641bf1c0d3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server/src/app.module.ts:50"}, "properties": {"repobilityId": "233fbdbf9b2f481d", "scanner": "scanner-primary", "fingerprint": "fdb231641bf1c0d3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6b0073526e3e9889", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/main/ExchangeRate.tsx:97"}, "properties": {"repobilityId": "5f5ba6e322f12863", "scanner": "scanner-primary", "fingerprint": "6b0073526e3e9889", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1682be32e8d208f8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/community/AttachedPlanCard.tsx:62"}, "properties": {"repobilityId": "b11c7847309f7608", "scanner": "scanner-primary", "fingerprint": "1682be32e8d208f8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3e8be0dc134d7a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/PlaceDetailContainer.tsx:327"}, "properties": {"repobilityId": "be8e967c88794acd", "scanner": "scanner-primary", "fingerprint": "e3e8be0dc134d7a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2949ca1f0756ce2f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SlotEditModal.tsx:93"}, "properties": {"repobilityId": "f0cff790606ec073", "scanner": "scanner-primary", "fingerprint": "2949ca1f0756ce2f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7efe39766b559210", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/PlaceItem.tsx:92"}, "properties": {"repobilityId": "9fa0f5b809751579", "scanner": "scanner-primary", "fingerprint": "7efe39766b559210", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0188c24dd1c3bac8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/LeftPanel.tsx:54"}, "properties": {"repobilityId": "30592de0d11f8b1e", "scanner": "scanner-primary", "fingerprint": "0188c24dd1c3bac8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68e46a4c7f1f3c28", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SlotItem.tsx:84"}, "properties": {"repobilityId": "af14b1a8ceedab95", "scanner": "scanner-primary", "fingerprint": "68e46a4c7f1f3c28", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c7d683d321f0deee", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SearchContainer.tsx:269"}, "properties": {"repobilityId": "0cdd35358f01cb9a", "scanner": "scanner-primary", "fingerprint": "c7d683d321f0deee", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2bf984293c394577", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/TripSetupModal.tsx:87"}, "properties": {"repobilityId": "bd30b353fb457e98", "scanner": "scanner-primary", "fingerprint": "2bf984293c394577", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61ed1687c1469042", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/SavePlanModal.tsx:333"}, "properties": {"repobilityId": "d79b15b268355b1f", "scanner": "scanner-primary", "fingerprint": "61ed1687c1469042", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f678d43fd221d3b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/PlaceSearch.tsx:106"}, "properties": {"repobilityId": "4f81a58be446fd05", "scanner": "scanner-primary", "fingerprint": "f678d43fd221d3b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-06f63db7d8a8780d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/ai-chat/ActionCard.tsx:339"}, "properties": {"repobilityId": "82c13ee3019232b4", "scanner": "scanner-primary", "fingerprint": "06f63db7d8a8780d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-642ed256ebc15f2d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/plans/ai-chat/AiChatPanel.tsx:209"}, "properties": {"repobilityId": "0842380ea409b64b", "scanner": "scanner-primary", "fingerprint": "642ed256ebc15f2d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d404a63163e7f16f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/mypage/PlanCard.tsx:30"}, "properties": {"repobilityId": "b908a2365bf1f3f7", "scanner": "scanner-primary", "fingerprint": "d404a63163e7f16f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c94a91e3003993ae", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/mypage/MyPageClient.tsx:310"}, "properties": {"repobilityId": "01b64338f00af2b3", "scanner": "scanner-primary", "fingerprint": "c94a91e3003993ae", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-334f3f4982581fe5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/common/Header.tsx:179"}, "properties": {"repobilityId": "f03fb14844c3f904", "scanner": "scanner-primary", "fingerprint": "334f3f4982581fe5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c4bd275cc0bff088", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/city/ChatPanel.tsx:156"}, "properties": {"repobilityId": "7bc5fb0eaf675a3b", "scanner": "scanner-primary", "fingerprint": "c4bd275cc0bff088", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3df3436c759e4313", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 client/src/components/city/CityHubClient.tsx:245"}, "properties": {"repobilityId": "6bfdf83a05d0ea08", "scanner": "scanner-primary", "fingerprint": "3df3436c759e4313", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"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": "d355e04b5992b2d3", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "d6298c83f11ca3bb", "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": "aeb21266bfbec169", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "8e457db2ea97ab5a", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "1ba4e156774489d8", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"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-8273c5f2df03a708", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/rules/frontend/ui-ux.md"}, "properties": {"repobilityId": "fbd20388c02f14bd", "scanner": "scanner-primary", "fingerprint": "8273c5f2df03a708", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/rules/frontend/ui-ux.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f9dd08064a98a775", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/rules/server/crud.md"}, "properties": {"repobilityId": "516602f0595fec3a", "scanner": "scanner-primary", "fingerprint": "f9dd08064a98a775", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/rules/server/crud.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b2587a1719b94ba3", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/rules/ai-server/python.md"}, "properties": {"repobilityId": "f7cce94cbdcfa561", "scanner": "scanner-primary", "fingerprint": "b2587a1719b94ba3", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/rules/ai-server/python.md"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-bbc234f2ad01d7a9", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/rules/common/security.md"}, "properties": {"repobilityId": "7981ef92f24b4687", "scanner": "scanner-primary", "fingerprint": "bbc234f2ad01d7a9", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/rules/common/security.md"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-cfdac2522adf190f", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/rules/common/security.md"}, "properties": {"repobilityId": "a6438f564908b144", "scanner": "scanner-primary", "fingerprint": "cfdac2522adf190f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/rules/common/security.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a53a9fce81227265", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/rules/common/session.md"}, "properties": {"repobilityId": "7ffec8f780d01d9e", "scanner": "scanner-primary", "fingerprint": "a53a9fce81227265", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/rules/common/session.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9027f62dac189b4d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/session-log/SKILL.md"}, "properties": {"repobilityId": "8ec53647ba3ff909", "scanner": "scanner-primary", "fingerprint": "9027f62dac189b4d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/session-log/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9afc209864f07986", "level": "none", "message": {"text": "Commented-code block (5 lines) in ai-server/services/sort_service.py:19"}, "properties": {"repobilityId": "a5fdead23b999d6c", "scanner": "scanner-primary", "fingerprint": "9afc209864f07986", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7c33596b6bb3ce78", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/app/(main)/community/page.tsx:21"}, "properties": {"repobilityId": "ba896cf15cf1aea5", "scanner": "scanner-primary", "fingerprint": "7c33596b6bb3ce78", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-56c54b2d4a8d2e60", "level": "none", "message": {"text": "Commented-code block (7 lines) in client/src/components/plans/ai-chat/hooks/useChatMessages.ts:178"}, "properties": {"repobilityId": "5969b42161ed04d2", "scanner": "scanner-primary", "fingerprint": "56c54b2d4a8d2e60", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c5bfe17e20744da1", "level": "none", "message": {"text": "Commented-code block (5 lines) in client/src/components/common/Button.tsx:12"}, "properties": {"repobilityId": "66aec4d1fd50f41f", "scanner": "scanner-primary", "fingerprint": "c5bfe17e20744da1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-46121cf307287b16", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 client/src/components/city/CityHubClient.tsx:367"}, "properties": {"repobilityId": "b2f7f8e3c759879e", "scanner": "scanner-primary", "fingerprint": "46121cf307287b16", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d38bffde7f1f3ab7", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-284ad54fc7a6a329", "level": "error", "message": {"text": "FastAPI POST `sort` without auth dependency \u2014 ai-server/routers/sort.py:11"}, "properties": {"repobilityId": "06cceb6996b81b39", "scanner": "scanner-primary", "fingerprint": "284ad54fc7a6a329", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/routers/sort.py"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-088fadce83433f64", "level": "error", "message": {"text": "FastAPI POST `chat_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:13"}, "properties": {"repobilityId": "e39b44b9687477c2", "scanner": "scanner-primary", "fingerprint": "088fadce83433f64", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/routers/chat.py"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-8b90b5a905aee5e8", "level": "error", "message": {"text": "FastAPI POST `chat_stream_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:20"}, "properties": {"repobilityId": "c7cedb20b5954f38", "scanner": "scanner-primary", "fingerprint": "8b90b5a905aee5e8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/routers/chat.py"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-840ce1e0a4d6a13f", "level": "error", "message": {"text": "FastAPI POST `generate_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:33"}, "properties": {"repobilityId": "dc01d341888d14c5", "scanner": "scanner-primary", "fingerprint": "840ce1e0a4d6a13f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/routers/chat.py"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-20c3a7b084f8a876", "level": "error", "message": {"text": "FastAPI POST `select_transit_endpoint` without auth dependency \u2014 ai-server/routers/chat.py:39"}, "properties": {"repobilityId": "507e4fc4858bb9a5", "scanner": "scanner-primary", "fingerprint": "20c3a7b084f8a876", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.fastapi.unauth_mutation"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-server/routers/chat.py"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-4c4b95269c8b9aac", "level": "error", "message": {"text": "Dangling fetch: POST https://places.googleapis.com/v1/places:autocomplete (client/src/components/main/CitySearchModal.tsx:50)"}, "properties": {"repobilityId": "f6684c3e31efebe0", "scanner": "scanner-primary", "fingerprint": "4c4b95269c8b9aac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a27a57d8bb83d43d", "level": "error", "message": {"text": "Dangling fetch: GET /api/exchange (client/src/components/main/ExchangeRate.tsx:33)"}, "properties": {"repobilityId": "f668066fdb87060b", "scanner": "scanner-primary", "fingerprint": "a27a57d8bb83d43d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "09290b60d1f2135c", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37f915e4a3e08600", "level": "note", "message": {"text": "Unused endpoint: POST /sort"}, "properties": {"repobilityId": "e58b3e8a38f624df", "scanner": "scanner-primary", "fingerprint": "37f915e4a3e08600", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cff8da5fbc19c76d", "level": "note", "message": {"text": "Unused endpoint: POST /chat"}, "properties": {"repobilityId": "000e77a8b66f122b", "scanner": "scanner-primary", "fingerprint": "cff8da5fbc19c76d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b30ef55a849c5f77", "level": "note", "message": {"text": "Unused endpoint: POST /chat/stream"}, "properties": {"repobilityId": "9c0292742ccd55e0", "scanner": "scanner-primary", "fingerprint": "b30ef55a849c5f77", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-970eb92d6ec2bfaa", "level": "note", "message": {"text": "Unused endpoint: POST /generate"}, "properties": {"repobilityId": "fc0a963d642c1a9e", "scanner": "scanner-primary", "fingerprint": "970eb92d6ec2bfaa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-992c1ca69013452f", "level": "note", "message": {"text": "Unused endpoint: POST /select-transit"}, "properties": {"repobilityId": "3a46ca1c258f1819", "scanner": "scanner-primary", "fingerprint": "992c1ca69013452f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52d18a6bbac84f8c", "level": "note", "message": {"text": "Unused endpoint: GET /review/stats"}, "properties": {"repobilityId": "e91f849b0ab1b24b", "scanner": "scanner-primary", "fingerprint": "52d18a6bbac84f8c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-13eb367f611bf878", "level": "note", "message": {"text": "Unused endpoint: GET /review/bulk-stats"}, "properties": {"repobilityId": "131151f711e1d7e5", "scanner": "scanner-primary", "fingerprint": "13eb367f611bf878", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a4532e6e997c040e", "level": "note", "message": {"text": "Unused endpoint: DELETE /review/:id"}, "properties": {"repobilityId": "dcbb5c742688c2ab", "scanner": "scanner-primary", "fingerprint": "a4532e6e997c040e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2436d3e594d74f54", "level": "note", "message": {"text": "Unused endpoint: POST /review/:id/like"}, "properties": {"repobilityId": "b03aee51e28dff34", "scanner": "scanner-primary", "fingerprint": "2436d3e594d74f54", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a23e0ef0af0a6b72", "level": "note", "message": {"text": "Unused endpoint: GET /plan/public"}, "properties": {"repobilityId": "e856b835048032b4", "scanner": "scanner-primary", "fingerprint": "a23e0ef0af0a6b72", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc7c405357ce83b9", "level": "note", "message": {"text": "Unused endpoint: GET /plan/public/:id"}, "properties": {"repobilityId": "d6fc7df1ea5e3590", "scanner": "scanner-primary", "fingerprint": "cc7c405357ce83b9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bb14b660f71e848f", "level": "note", "message": {"text": "Unused endpoint: GET /plan/:id"}, "properties": {"repobilityId": "df62b78e63a74cd9", "scanner": "scanner-primary", "fingerprint": "bb14b660f71e848f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f29e89892dd96ae6", "level": "note", "message": {"text": "Unused endpoint: POST /plan/:id/clone"}, "properties": {"repobilityId": "6ec34a7205e0520c", "scanner": "scanner-primary", "fingerprint": "f29e89892dd96ae6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f2d27fe4d3e476d", "level": "note", "message": {"text": "Unused endpoint: POST /plan/full"}, "properties": {"repobilityId": "68acf29e6f53aa64", "scanner": "scanner-primary", "fingerprint": "4f2d27fe4d3e476d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3a0f07395881573b", "level": "note", "message": {"text": "Unused endpoint: PUT /plan/:id/full"}, "properties": {"repobilityId": "1e31ff5a7b969d1f", "scanner": "scanner-primary", "fingerprint": "3a0f07395881573b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f0d96513c8d536bf", "level": "note", "message": {"text": "Unused endpoint: PATCH /plan/:id"}, "properties": {"repobilityId": "71187ec64f286a41", "scanner": "scanner-primary", "fingerprint": "f0d96513c8d536bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6639ee16ea4d3f39", "level": "note", "message": {"text": "Unused endpoint: DELETE /plan/:id"}, "properties": {"repobilityId": "10a8bdd749fefc96", "scanner": "scanner-primary", "fingerprint": "6639ee16ea4d3f39", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5bbad7535e608386", "level": "note", "message": {"text": "Unused endpoint: POST /chat/rooms/:roomNum/join"}, "properties": {"repobilityId": "f22853c4747f1c0c", "scanner": "scanner-primary", "fingerprint": "5bbad7535e608386", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-77ffe1a1e69043cf", "level": "note", "message": {"text": "Unused endpoint: DELETE /chat/rooms/:roomNum/leave"}, "properties": {"repobilityId": "76f780ec77a01a25", "scanner": "scanner-primary", "fingerprint": "77ffe1a1e69043cf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9e59d6c02de05224", "level": "note", "message": {"text": "Unused endpoint: GET /chat/rooms/my"}, "properties": {"repobilityId": "d728c6b2f2eedea2", "scanner": "scanner-primary", "fingerprint": "9e59d6c02de05224", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c171687ec66c7039", "level": "note", "message": {"text": "Unused endpoint: GET /chat/rooms/:roomNum/messages"}, "properties": {"repobilityId": "7422bafd2897cceb", "scanner": "scanner-primary", "fingerprint": "c171687ec66c7039", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f85a32feeafd78c9", "level": "note", "message": {"text": "Unused endpoint: POST /ai/chat"}, "properties": {"repobilityId": "f69c75be2b7932f2", "scanner": "scanner-primary", "fingerprint": "f85a32feeafd78c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d58e566c989437d", "level": "note", "message": {"text": "Unused endpoint: POST /ai/chat/stream"}, "properties": {"repobilityId": "e57d680ced6a770e", "scanner": "scanner-primary", "fingerprint": "8d58e566c989437d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-849509e7ec081afa", "level": "note", "message": {"text": "Unused endpoint: POST /ai/generate"}, "properties": {"repobilityId": "4c38b506bcca7eda", "scanner": "scanner-primary", "fingerprint": "849509e7ec081afa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f687e6281b1c8c6f", "level": "note", "message": {"text": "Unused endpoint: POST /ai/sort"}, "properties": {"repobilityId": "f4dde30e0ff0bd89", "scanner": "scanner-primary", "fingerprint": "f687e6281b1c8c6f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-50ca94182a77f51f", "level": "note", "message": {"text": "Unused endpoint: POST /ai/select-transit"}, "properties": {"repobilityId": "c877d93161d99908", "scanner": "scanner-primary", "fingerprint": "50ca94182a77f51f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4c24967e46458f9e", "level": "note", "message": {"text": "Unused endpoint: GET /community/:id"}, "properties": {"repobilityId": "80bccd1876e596d0", "scanner": "scanner-primary", "fingerprint": "4c24967e46458f9e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c401457c2595342f", "level": "note", "message": {"text": "Unused endpoint: PATCH /community/:id"}, "properties": {"repobilityId": "3534fd34cf275580", "scanner": "scanner-primary", "fingerprint": "c401457c2595342f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d9ac0de946a07820", "level": "note", "message": {"text": "Unused endpoint: DELETE /community/:id"}, "properties": {"repobilityId": "89ceab5ece0a83d2", "scanner": "scanner-primary", "fingerprint": "d9ac0de946a07820", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-130aa727ff1fc366", "level": "note", "message": {"text": "Unused endpoint: POST /community/:id/images"}, "properties": {"repobilityId": "005aff630f8ff458", "scanner": "scanner-primary", "fingerprint": "130aa727ff1fc366", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-332c7c1d3ad064d7", "level": "note", "message": {"text": "Unused endpoint: POST /community/:id/like"}, "properties": {"repobilityId": "39ac5f8d97d4cb0d", "scanner": "scanner-primary", "fingerprint": "332c7c1d3ad064d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ff45ed07cf571e7", "level": "note", "message": {"text": "Unused endpoint: GET /community/:id/like"}, "properties": {"repobilityId": "6d1a86b28505b506", "scanner": "scanner-primary", "fingerprint": "8ff45ed07cf571e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a299be1591f8a51", "level": "note", "message": {"text": "Unused endpoint: POST /community/:id/clone-plan"}, "properties": {"repobilityId": "ab374199b1907ab3", "scanner": "scanner-primary", "fingerprint": "5a299be1591f8a51", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dc565d5f5f536165", "level": "note", "message": {"text": "Unused endpoint: POST /community/:id/report"}, "properties": {"repobilityId": "027b4a71360ddadf", "scanner": "scanner-primary", "fingerprint": "dc565d5f5f536165", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0e9788b9a99a7903", "level": "note", "message": {"text": "Unused endpoint: POST /community/comment/:commentId/report"}, "properties": {"repobilityId": "098aaa1366c85a1c", "scanner": "scanner-primary", "fingerprint": "0e9788b9a99a7903", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-46a9f54f89a2dbd5", "level": "note", "message": {"text": "Unused endpoint: GET /community/:id/comments"}, "properties": {"repobilityId": "ef906fd02e8a5290", "scanner": "scanner-primary", "fingerprint": "46a9f54f89a2dbd5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9e7c3d305f63fbed", "level": "note", "message": {"text": "Unused endpoint: POST /community/:id/comments"}, "properties": {"repobilityId": "191ce12437dad1aa", "scanner": "scanner-primary", "fingerprint": "9e7c3d305f63fbed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a59a3bb5775e107", "level": "note", "message": {"text": "Unused endpoint: PATCH /community/:id/comments/:commentId"}, "properties": {"repobilityId": "fbe021ae91081631", "scanner": "scanner-primary", "fingerprint": "5a59a3bb5775e107", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-87d388140f212289", "level": "note", "message": {"text": "Unused endpoint: DELETE /community/:id/comments/:commentId"}, "properties": {"repobilityId": "21bc6ca393cc8c1e", "scanner": "scanner-primary", "fingerprint": "87d388140f212289", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e64b3dd1132bd446", "level": "note", "message": {"text": "Unused endpoint: GET /user/me"}, "properties": {"repobilityId": "1b712c808c2366ed", "scanner": "scanner-primary", "fingerprint": "e64b3dd1132bd446", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-37ef7d931bf7ed70", "level": "note", "message": {"text": "Unused endpoint: PATCH /user/me"}, "properties": {"repobilityId": "5f743134001dc7e2", "scanner": "scanner-primary", "fingerprint": "37ef7d931bf7ed70", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3d53b0842b0269df", "level": "note", "message": {"text": "Unused endpoint: POST /auth/send-verification"}, "properties": {"repobilityId": "f16975bf8e156111", "scanner": "scanner-primary", "fingerprint": "3d53b0842b0269df", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7c24523ddc468eef", "level": "note", "message": {"text": "Unused endpoint: POST /auth/verify-code"}, "properties": {"repobilityId": "a68356f5c1ef4dee", "scanner": "scanner-primary", "fingerprint": "7c24523ddc468eef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8292c0931391749a", "level": "note", "message": {"text": "Unused endpoint: POST /auth/register"}, "properties": {"repobilityId": "77cd0ebf641e7938", "scanner": "scanner-primary", "fingerprint": "8292c0931391749a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8fdbacfe9430a6ed", "level": "note", "message": {"text": "Unused endpoint: POST /auth/login"}, "properties": {"repobilityId": "f8d074c8e9ea7898", "scanner": "scanner-primary", "fingerprint": "8fdbacfe9430a6ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e9f0c712241895d", "level": "note", "message": {"text": "Unused endpoint: GET /auth/google"}, "properties": {"repobilityId": "f9ea10aeb2e1c94f", "scanner": "scanner-primary", "fingerprint": "2e9f0c712241895d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5b39b75067f063f9", "level": "note", "message": {"text": "Unused endpoint: GET /auth/kakao"}, "properties": {"repobilityId": "a6018da798a0d4db", "scanner": "scanner-primary", "fingerprint": "5b39b75067f063f9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a51925b1d0c40863", "level": "note", "message": {"text": "Unused endpoint: GET /auth/naver"}, "properties": {"repobilityId": "a7d300460617f523", "scanner": "scanner-primary", "fingerprint": "a51925b1d0c40863", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-392dcbd9c0e4ed85", "level": "note", "message": {"text": "Unused endpoint: GET /auth/google/callback"}, "properties": {"repobilityId": "74e4b5e867fc62f6", "scanner": "scanner-primary", "fingerprint": "392dcbd9c0e4ed85", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}