{"data":{"skill":{"slug":"xixi048-feeling-search","name":"feeling-search","icon":"📦","repo":"https://github.com/xixi048/feeling-search-skill/tree/0a9953d0ef3ad6a32bbcdb69672a486e60f35c04/skills/feeling-search","status":"approved","author":"xixi048","authorVersion":"1.2.0","skillstoreRevision":5},"audit":{"id":"e272888c-216a-4e83-b920-ef5d69a20cd1","skill_id":"2b4b580c-45db-489d-ab5f-2498d7648e7a","version":5,"content_hash":"v3:5b5bad298d69ae8fd37204d293d395c5f80ce32f:cb044cb3c796fa239e37105bba8e6482f98db6a126ea711d127bee96c3742cf3:8894e73fc13f6586953dcda6b174547835e16b6bba173fd14969829cc675a9d4:736b696c6c732f786978693034382f6665656c696e672d736561726368:529924937b6db9b525c33a0d32ef76cb","risk_level":"medium","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Of 115 static findings, four are confirmed: unpinned package execution, insecure token-file creation, and credential forwarding in two HTTP helpers. The remaining alerts reflect documented client behavior, Markdown formatting, or readable multilingual text. A semantic finding covers quota tokens in URLs; no evidence found of malicious intent or prompt injection.","remediation":[{"issue":"The documented npx command downloads and executes the latest external package without review or a pinned version.","severity":"medium","suggestion":"Pin a reviewed package version, verify lockfile integrity, and require informed approval before downloading or executing it."},{"issue":"Quota tokens are saved with default filesystem permissions in a predictable temporary file.","severity":"medium","suggestion":"Create the credential directory with mode 0700. Write credentials through exclusive, symlink-safe temporary files with mode 0600, then replace atomically."},{"issue":"HTTP helpers can forward X-FS-Quota headers across redirects without validating the destination origin.","severity":"medium","suggestion":"Require HTTPS and validate endpoint origins. Reject cross-origin redirects or strip credentials before following them."},{"issue":"Quota balance requests place bearer tokens in URL query strings.","severity":"medium","suggestion":"Use the X-FS-Quota header for balance and validation requests. Redact tokens from diagnostics and access logs."},{"issue":"Free-service and semantic-engine claims conflict with the bundled client's token gate and lexical implementation.","severity":"low","suggestion":"Distinguish bundled lexical features from external semantic features. Reconcile token requirements and billing guidance before suggesting payments."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"scripts/fs_api.py","line_end":103,"line_start":103},{"file":"scripts/fs_api.py","line_end":112,"line_start":112},{"file":"scripts/fs_api.py","line_end":221,"line_start":221},{"file":"scripts/fs_api.py","line_end":417,"line_start":417},{"file":"scripts/fs_api.py","line_end":418,"line_start":418},{"file":"scripts/fs_api.py","line_end":502,"line_start":502},{"file":"scripts/fs_api.py","line_end":503,"line_start":503},{"file":"SKILL.md","line_end":21,"line_start":17},{"file":"SKILL.md","line_end":36,"line_start":21},{"file":"SKILL.md","line_end":37,"line_start":36},{"file":"SKILL.md","line_end":38,"line_start":37},{"file":"SKILL.md","line_end":38,"line_start":38},{"file":"SKILL.md","line_end":45,"line_start":43},{"file":"SKILL.md","line_end":57,"line_start":45},{"file":"SKILL.md","line_end":60,"line_start":57},{"file":"SKILL.md","line_end":61,"line_start":60},{"file":"SKILL.md","line_end":61,"line_start":61},{"file":"SKILL.md","line_end":65,"line_start":63},{"file":"SKILL.md","line_end":67,"line_start":65},{"file":"SKILL.md","line_end":68,"line_start":67},{"file":"SKILL.md","line_end":68,"line_start":68},{"file":"SKILL.md","line_end":72,"line_start":71},{"file":"SKILL.md","line_end":74,"line_start":72},{"file":"SKILL.md","line_end":74,"line_start":74},{"file":"SKILL.md","line_end":75,"line_start":75},{"file":"SKILL.md","line_end":81,"line_start":79},{"file":"SKILL.md","line_end":84,"line_start":81},{"file":"SKILL.md","line_end":86,"line_start":84},{"file":"SKILL.md","line_end":86,"line_start":86},{"file":"SKILL.md","line_end":96,"line_start":95},{"file":"SKILL.md","line_end":102,"line_start":96},{"file":"SKILL.md","line_end":104,"line_start":102},{"file":"SKILL.md","line_end":106,"line_start":104},{"file":"SKILL.md","line_end":107,"line_start":106},{"file":"SKILL.md","line_end":111,"line_start":107},{"file":"SKILL.md","line_end":113,"line_start":111},{"file":"SKILL.md","line_end":115,"line_start":113},{"file":"SKILL.md","line_end":120,"line_start":115},{"file":"SKILL.md","line_end":126,"line_start":120},{"file":"SKILL.md","line_end":129,"line_start":126},{"file":"SKILL.md","line_end":129,"line_start":129},{"file":"SKILL.md","line_end":135,"line_start":131},{"file":"SKILL.md","line_end":140,"line_start":135},{"file":"SKILL.md","line_end":142,"line_start":140},{"file":"SKILL.md","line_end":143,"line_start":142},{"file":"SKILL.md","line_end":146,"line_start":143},{"file":"SKILL.md","line_end":146,"line_start":146},{"file":"SKILL.md","line_end":149,"line_start":149},{"file":"SKILL.md","line_end":151,"line_start":150},{"file":"SKILL.md","line_end":155,"line_start":151}]},{"factor":"network","evidence":[{"file":"scripts/fs_api.py","line_end":46,"line_start":46},{"file":"scripts/fs_api.py","line_end":156,"line_start":156},{"file":"scripts/fs_api.py","line_end":161,"line_start":161},{"file":"scripts/fs_api.py","line_end":180,"line_start":180},{"file":"scripts/fs_api.py","line_end":186,"line_start":186},{"file":"scripts/fs_api.py","line_end":27,"line_start":27},{"file":"scripts/fs_api.py","line_end":31,"line_start":31},{"file":"scripts/fs_api.py","line_end":54,"line_start":54},{"file":"SKILL.md","line_end":67,"line_start":67},{"file":"SKILL.md","line_end":151,"line_start":151},{"file":"SKILL.md","line_end":197,"line_start":197}]},{"factor":"filesystem","evidence":[{"file":"scripts/fs_api.py","line_end":33,"line_start":33},{"file":"scripts/fs_api.py","line_end":33,"line_start":33},{"file":"scripts/fs_api.py","line_end":122,"line_start":122},{"file":"scripts/fs_api.py","line_end":227,"line_start":227},{"file":"scripts/fs_api.py","line_end":117,"line_start":117},{"file":"scripts/fs_api.py","line_end":225,"line_start":225},{"file":"SKILL.md","line_end":107,"line_start":107},{"file":"SKILL.md","line_end":149,"line_start":149},{"file":"SKILL.md","line_end":198,"line_start":198},{"file":"SKILL.md","line_end":107,"line_start":107},{"file":"SKILL.md","line_end":149,"line_start":149},{"file":"SKILL.md","line_end":198,"line_start":198}]},{"factor":"env_access","evidence":[{"file":"scripts/fs_api.py","line_end":76,"line_start":76},{"file":"scripts/fs_api.py","line_end":80,"line_start":80},{"file":"scripts/fs_api.py","line_end":84,"line_start":84},{"file":"scripts/fs_api.py","line_end":148,"line_start":148}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Python HTTP libraries","locations":[{"file":"scripts/fs_api.py","line_end":161,"line_start":161}],"confidence":0.97,"description":"with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"urlopen follows redirects with custom headers added by http_get, including X-FS-Quota from style and images calls. Cross-origin redirects can disclose credentials."},{"title":"Python HTTP libraries","locations":[{"file":"scripts/fs_api.py","line_end":186,"line_start":186}],"confidence":0.97,"description":"with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The POST helper uses default redirect handling after adding caller-supplied headers. A redirect from cloud analysis can forward X-FS-Quota to another origin."},{"title":"Python file write/append","locations":[{"file":"scripts/fs_api.py","line_end":122,"line_start":122}],"confidence":0.98,"description":"with open(tmp, \"w\", encoding=\"utf-8\") as fh:","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"save_quota writes a bearer token without restrictive permissions to a predictable temporary path. With a permissive umask and traversable parent directories, other local users can read the saved credential."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":65,"line_start":63}],"confidence":0.98,"description":"```bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The block instructs npx -y feeling-search-mcp@latest --self-test, downloading and executing an unpinned external package. Automatic confirmation creates a supply-chain execution risk."},{"title":"Bearer Token Exposure Through Quota Query URLs","locations":[{"file":"scripts/fs_api.py","line_end":113,"line_start":111},{"file":"scripts/fs_api.py","line_end":420,"line_start":408},{"file":"references/api-contract.md","line_end":135,"line_start":133},{"file":"references/api-contract.md","line_end":154,"line_start":150}],"confidence":0.98,"description":"quota_url places the quota bearer token in a URL query parameter. Balance and token-validation requests can expose this reusable credential to access logs and monitoring.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The client builds credential-bearing URLs, and the contract accepts the same token in an authentication header. Actual server logging was not verified."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":3,"total_lines":1136,"audit_model":"codex","audited_at":"2026-10-29T21:48:10.723+00:00","created_at":"2026-10-30T04:00:00.523642+00:00","static_findings":[{"id":"external_commands:scripts/fs_api.py:103:ruby-shell-backtick-execution","file":"scripts/fs_api.py","pattern":"Ruby/shell backtick execution","snippet":"\"\"\"上次保存下来的额度 token(`quota --set/--claim` 写的)\"\"\"","category":"external_commands","line_end":103,"severity":"medium","line_start":103},{"id":"external_commands:scripts/fs_api.py:112:ruby-shell-backtick-execution","file":"scripts/fs_api.py","pattern":"Ruby/shell backtick execution","snippet":"\"\"\"额度端点 URL。统一用 urlencode,别手拼 `?token=`+- 拼接(转义漏一处就会带上原始 token)。\"\"\"","category":"external_commands","line_end":112,"severity":"medium","line_start":112},{"id":"external_commands:scripts/fs_api.py:221:ruby-shell-backtick-execution","file":"scripts/fs_api.py","pattern":"Ruby/shell backtick execution","snippet":"raise ApiError(\"本地没有词表缓存且处于离线模式,先跑一次 `dict`\", \"no_cache_offline\")","category":"external_commands","line_end":221,"severity":"medium","line_start":221},{"id":"external_commands:scripts/fs_api.py:417:ruby-shell-backtick-execution","file":"scripts/fs_api.py","pattern":"Ruby/shell backtick execution","snippet":"\"还没有额度 token:用 `quota --set <token>` 存一个,\"","category":"external_commands","line_end":417,"severity":"medium","line_start":417},{"id":"external_commands:scripts/fs_api.py:418:ruby-shell-backtick-execution","file":"scripts/fs_api.py","pattern":"Ruby/shell backtick execution","snippet":"\"或 `quota --claim --proof <payment_proof> --trade <trade_no>` 领取;\"","category":"external_commands","line_end":418,"severity":"medium","line_start":418},{"id":"external_commands:scripts/fs_api.py:502:ruby-shell-backtick-execution","file":"scripts/fs_api.py","pattern":"Ruby/shell backtick execution","snippet":"\"1 先确认这台机器上有支付宝付款回执,用 `quota --claim --proof <payment_proof> --trade <trade_no>` 领取;\"","category":"external_commands","line_end":502,"severity":"medium","line_start":502},{"id":"external_commands:scripts/fs_api.py:503:ruby-shell-backtick-execution","file":"scripts/fs_api.py","pattern":"Ruby/shell backtick execution","snippet":"\"2 已有 token 就 `quota --set <token>` 存下来;\"","category":"external_commands","line_end":503,"severity":"medium","line_start":503},{"id":"network:scripts/fs_api.py:46:python-http-libraries","file":"scripts/fs_api.py","pattern":"Python HTTP libraries","snippet":"import urllib.request","category":"network","line_end":46,"severity":"low","line_start":46},{"id":"network:scripts/fs_api.py:156:python-http-libraries","file":"scripts/fs_api.py","pattern":"Python HTTP libraries","snippet":"req = urllib.request.Request(url, method=\"GET\")","category":"network","line_end":156,"severity":"low","line_start":156},{"id":"network:scripts/fs_api.py:161:python-http-libraries","file":"scripts/fs_api.py","pattern":"Python HTTP libraries","snippet":"with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:","category":"network","line_end":161,"severity":"low","line_start":161},{"id":"network:scripts/fs_api.py:180:python-http-libraries","file":"scripts/fs_api.py","pattern":"Python HTTP libraries","snippet":"req = urllib.request.Request(url, data=data, method=\"POST\")","category":"network","line_end":180,"severity":"low","line_start":180},{"id":"network:scripts/fs_api.py:186:python-http-libraries","file":"scripts/fs_api.py","pattern":"Python HTTP libraries","snippet":"with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:","category":"network","line_end":186,"severity":"low","line_start":186},{"id":"network:scripts/fs_api.py:27:hardcoded-url","file":"scripts/fs_api.py","pattern":"Hardcoded URL","snippet":"--base URL      服务端点,默认 https://xiximm.cloud","category":"network","line_end":27,"severity":"low","line_start":27},{"id":"network:scripts/fs_api.py:31:hardcoded-url","file":"scripts/fs_api.py","pattern":"Hardcoded URL","snippet":"FS_API_BASE     服务端点(默认 https://xiximm.cloud)","category":"network","line_end":31,"severity":"low","line_start":31},{"id":"network:scripts/fs_api.py:54:hardcoded-url","file":"scripts/fs_api.py","pattern":"Hardcoded URL","snippet":"DEFAULT_BASE = \"https://xiximm.cloud\"","category":"network","line_end":54,"severity":"low","line_start":54},{"id":"filesystem:scripts/fs_api.py:33:hidden-file-in-home-directory","file":"scripts/fs_api.py","pattern":"Hidden file in home directory","snippet":"FS_CACHE_DIR    词表缓存目录(默认 ~/.cache/feeling-search)","category":"filesystem","line_end":33,"severity":"high","line_start":33},{"id":"filesystem:scripts/fs_api.py:33:hidden-file-access","file":"scripts/fs_api.py","pattern":"Hidden file access","snippet":"FS_CACHE_DIR    词表缓存目录(默认 ~/.cache/feeling-search)","category":"filesystem","line_end":33,"severity":"medium","line_start":33},{"id":"filesystem:scripts/fs_api.py:122:python-file-write-append","file":"scripts/fs_api.py","pattern":"Python file write/append","snippet":"with open(tmp, \"w\", encoding=\"utf-8\") as fh:","category":"filesystem","line_end":122,"severity":"medium","line_start":122},{"id":"filesystem:scripts/fs_api.py:227:python-file-write-append","file":"scripts/fs_api.py","pattern":"Python file write/append","snippet":"with open(tmp, \"w\", encoding=\"utf-8\") as fh:","category":"filesystem","line_end":227,"severity":"medium","line_start":227},{"id":"filesystem:scripts/fs_api.py:117:python-os-file-operations","file":"scripts/fs_api.py","pattern":"Python os file operations","snippet":"os.makedirs(cache_dir(), exist_ok=True)","category":"filesystem","line_end":117,"severity":"medium","line_start":117},{"id":"filesystem:scripts/fs_api.py:225:python-os-file-operations","file":"scripts/fs_api.py","pattern":"Python os file operations","snippet":"os.makedirs(cache_dir(), exist_ok=True)","category":"filesystem","line_end":225,"severity":"medium","line_start":225},{"id":"env_access:scripts/fs_api.py:76:python-environment-access","file":"scripts/fs_api.py","pattern":"Python environment access","snippet":"return (os.environ.get(\"FS_API_BASE\") or DEFAULT_BASE).rstrip(\"/\")","category":"env_access","line_end":76,"severity":"low","line_start":76},{"id":"env_access:scripts/fs_api.py:80:python-environment-access","file":"scripts/fs_api.py","pattern":"Python environment access","snippet":"return (os.environ.get(\"FS_QUOTA\") or \"\").strip()","category":"env_access","line_end":80,"severity":"low","line_start":80},{"id":"env_access:scripts/fs_api.py:84:python-environment-access","file":"scripts/fs_api.py","pattern":"Python environment access","snippet":"d = os.environ.get(\"FS_CACHE_DIR\")","category":"env_access","line_end":84,"severity":"low","line_start":84},{"id":"env_access:scripts/fs_api.py:148:python-environment-access","file":"scripts/fs_api.py","pattern":"Python environment access","snippet":"return int(os.environ.get(\"FS_CACHE_TTL\") or CACHE_TTL)","category":"env_access","line_end":148,"severity":"low","line_start":148},{"id":"external_commands:SKILL.md:17:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":21,"severity":"medium","line_start":17},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":36,"severity":"medium","line_start":21},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> 上游默认免费——只有运营端显式设 `FS_PAID=1` 才会恢复 402 / x402。","category":"external_commands","line_end":37,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> 限量:每 IP 20 次/分钟;云端 `analyze` 每访客每天 200 次(北京时间零点重置)。","category":"external_commands","line_end":38,"severity":"medium","line_start":37},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"> 所以 `FS_QUOTA` 可以不配,`--allow-cloud` 也不再消耗任何额度。","category":"external_commands","line_end":38,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| 云端 analyze | 本地**一个词都没命中**,且显式 `--allow-cloud` | 是 | **现在免费**(计费恢复后为 1 次额度) |","category":"external_commands","line_end":45,"severity":"medium","line_start":43},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"顺序仍然是硬的:**先用本地,本地不够再 `--fuzzy`,还是不行才走云端**。","category":"external_commands","line_end":57,"severity":"medium","line_start":45},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| 本地 MCP 包(推荐) | 真语义理解:`霓虹雨街 0.53 / 雨夜暖灯 / 热带佛塔` | 装一次 21MB,之后 ~25ms/次、不联网 |","category":"external_commands","line_end":60,"severity":"medium","line_start":57},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"两边现在是同一份融合实现(服务端的 `api/semantic.mjs` 与包内副本同源),差别只在谁出算力。","category":"external_commands","line_end":61,"severity":"medium","line_start":60},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"返回值里的 `source` 会说清楚:`local` 词典命中 / `engine` 语义引擎 / `cloud` 云端兜底。","category":"external_commands","line_end":61,"severity":"medium","line_start":61},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":65,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":67,"severity":"medium","line_start":65},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"MCP 客户端配置见 `https://xiximm.cloud` 的文档;工具是同一套五个,","category":"external_commands","line_end":68,"severity":"medium","line_start":67},{"id":"external_commands:SKILL.md:68:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`word_analyze` 的返回会带 `source`(`local` 词典 / `engine` 语义引擎 / `cloud` 云端)。","category":"external_commands","line_end":68,"severity":"medium","line_start":68},{"id":"external_commands:SKILL.md:71:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"只要含汉字就会判成中文,`有点 lonely 的雨夜` 这种混写会被中文分词切碎;","category":"external_commands","line_end":72,"severity":"medium","line_start":71},{"id":"external_commands:SKILL.md:72:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"要强制指定用 `lang: \"zh\" | \"en\"`。","category":"external_commands","line_end":74,"severity":"medium","line_start":72},{"id":"external_commands:SKILL.md:74:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**否定是确定性算的,不是模型的直觉**:`不要压抑` 会返回 `excluded: [\"压抑\"]` 且词表为空,","category":"external_commands","line_end":74,"severity":"medium","line_start":74},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"带「压抑」的风格全被降级;`不太压抑` 走弱否定,压抑降到 0.4(`weakened` 字段可见)。","category":"external_commands","line_end":75,"severity":"medium","line_start":75},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"所有相对路径相对**技能目录**(`SKILL.md` 所在目录),不是用户的工作目录:","category":"external_commands","line_end":81,"severity":"medium","line_start":79},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":84,"severity":"medium","line_start":81},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":86,"severity":"medium","line_start":84},{"id":"external_commands:SKILL.md:86:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Windows 控制台中文乱码时先 `set PYTHONIOENCODING=utf-8` 或 `chcp 65001`。","category":"external_commands","line_end":86,"severity":"medium","line_start":86},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| 付费 | 调用付费端点前**必须让用户知情**,不要在用户没同意时加 `--allow-cloud` |","category":"external_commands","line_end":96,"severity":"medium","line_start":95},{"id":"external_commands:SKILL.md:96:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| 图片 | `placeholder` 类型的图是占位图,**不要当风格样本引用** |","category":"external_commands","line_end":102,"severity":"medium","line_start":96},{"id":"external_commands:SKILL.md:102:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":104,"severity":"medium","line_start":102},{"id":"external_commands:SKILL.md:104:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":106,"severity":"medium","line_start":104},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"看三件事:线上是否可达、是否配了额度(`FS_QUOTA`)、词表缓存有没有。","category":"external_commands","line_end":107,"severity":"medium","line_start":106},{"id":"external_commands:SKILL.md:107:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"首次使用会顺带把词表拉到本地缓存(`~/.cache/feeling-search/`,默认 7 天有效)。","category":"external_commands","line_end":111,"severity":"medium","line_start":107},{"id":"external_commands:SKILL.md:111:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":113,"severity":"medium","line_start":111},{"id":"external_commands:SKILL.md:113:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":115,"severity":"medium","line_start":113},{"id":"external_commands:SKILL.md:115:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `--json` 拿结构化结果给后续流程用;默认是人类可读文本。","category":"external_commands","line_end":120,"severity":"medium","line_start":115},{"id":"external_commands:SKILL.md:120:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":126,"severity":"medium","line_start":120},{"id":"external_commands:SKILL.md:126:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":129,"severity":"medium","line_start":126},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"并提示改走免费端点。**不会静默失败、也不会把本地结果伪装成云端结果**(`source` 只有 `local` / `cloud` 两个值)。","category":"external_commands","line_end":129,"severity":"medium","line_start":129},{"id":"external_commands:SKILL.md:131:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"#### 额度怎么来(`quota` 子命令)","category":"external_commands","line_end":135,"severity":"medium","line_start":131},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":140,"severity":"medium","line_start":135},{"id":"external_commands:SKILL.md:140:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":142,"severity":"medium","line_start":140},{"id":"external_commands:SKILL.md:142:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**`--claim --order` 是推荐路径**:只给订单号,**服务端自己向支付宝查单**,","category":"external_commands","line_end":143,"severity":"medium","line_start":142},{"id":"external_commands:SKILL.md:143:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"已付就发 token、未付返回 `not_paid`(付完再跑一次同一条命令即可)。","category":"external_commands","line_end":146,"severity":"medium","line_start":143},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`--proof` + `--trade` 是给「集成支付宝 SDK 的宿主」用的,与本 skill 无关的场景","category":"external_commands","line_end":146,"severity":"medium","line_start":146},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"token 解析优先级:`--quota <token>` > `FS_QUOTA` 环境变量 > 本地缓存 `~/.cache/feeling-search/quota.json`。","category":"external_commands","line_end":149,"severity":"medium","line_start":149},{"id":"external_commands:SKILL.md:150:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"领取或 `--set` 成功后会自动写进缓存,之后所有命令自动带上,**用户只需做一次**。","category":"external_commands","line_end":151,"severity":"medium","line_start":150},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"领取页(人可点):`https://xiximm.cloud/docs/quota.html`。","category":"external_commands","line_end":155,"severity":"medium","line_start":151},{"id":"external_commands:SKILL.md:155:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":158,"severity":"medium","line_start":155},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":162,"severity":"medium","line_start":158},{"id":"external_commands:SKILL.md:162:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":165,"severity":"medium","line_start":162},{"id":"external_commands:SKILL.md:165:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":167,"severity":"medium","line_start":165},{"id":"external_commands:SKILL.md:167:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"图带 `thumb` / `full` 两个尺寸、`kind`(`work` 有出处的真作品 / `synthetic` AI 示意图 /","category":"external_commands","line_end":167,"severity":"medium","line_start":167},{"id":"external_commands:SKILL.md:168:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`placeholder` 占位)、以及 `credit` / `license` / `source_url`。引用作品图时把出处带上。","category":"external_commands","line_end":168,"severity":"medium","line_start":168},{"id":"external_commands:SKILL.md:173:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"如果本地档出的结果明显不对路,说清这是词表命中结果,可尝试 `--fuzzy` 或付费云端档。","category":"external_commands","line_end":179,"severity":"medium","line_start":173},{"id":"external_commands:SKILL.md:179:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `quota [--set T] [--claim --proof P --trade T]` | 查余额 / 存 token / 用支付凭证领取 | 免费 |","category":"external_commands","line_end":180,"severity":"medium","line_start":179},{"id":"external_commands:SKILL.md:180:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `status` | 额度/缓存/连通性体检(含 token 来源) | 免费 |","category":"external_commands","line_end":181,"severity":"medium","line_start":180},{"id":"external_commands:SKILL.md:181:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `dict [--refresh] [--with-items]` | 拉取/刷新词表缓存 | 免费 |","category":"external_commands","line_end":182,"severity":"medium","line_start":181},{"id":"external_commands:SKILL.md:182:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `analyze <文本>` | 一句描述 → 感受词 + 风格 | 本地免费;`--allow-cloud` 时 1 次 |","category":"external_commands","line_end":182,"severity":"medium","line_start":182},{"id":"external_commands:SKILL.md:183:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `lookup <词>` | 词的落点风格、共现词、对立词 | 免费 |","category":"external_commands","line_end":184,"severity":"medium","line_start":183},{"id":"external_commands:SKILL.md:184:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `style-words <风格id>` | 某风格挂了哪些词 | 免费 |","category":"external_commands","line_end":185,"severity":"medium","line_start":184},{"id":"external_commands:SKILL.md:185:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `style <风格id>` | 风格详情含图与出处 | 1 次 |","category":"external_commands","line_end":186,"severity":"medium","line_start":185},{"id":"external_commands:SKILL.md:186:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `images <id1,id2,...>` | 批量取图,最多 5 个 | 1 次 |","category":"external_commands","line_end":188,"severity":"medium","line_start":186},{"id":"external_commands:SKILL.md:188:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"通用参数:`--json` · `--offline`(只读缓存,绝不联网)· `--refresh`(强制刷新词表)·","category":"external_commands","line_end":188,"severity":"medium","line_start":188},{"id":"external_commands:SKILL.md:189:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`--quota <token>`(本次调用用这枚 token,优先于环境变量与缓存)·","category":"external_commands","line_end":190,"severity":"medium","line_start":189},{"id":"external_commands:SKILL.md:190:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`--words N`(1–12)· `--styles N`(1–30)。全局参数写在子命令前或后都行。","category":"external_commands","line_end":190,"severity":"medium","line_start":190},{"id":"external_commands:SKILL.md:196:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `FS_QUOTA` | 否 | 云端额度 token。留空时会读本地缓存 `quota.json`;两者都没有 = 永不调用付费端点 |","category":"external_commands","line_end":196,"severity":"medium","line_start":196},{"id":"external_commands:SKILL.md:197:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `FS_API_BASE` | 否 | 服务端点,默认 `https://xiximm.cloud` |","category":"external_commands","line_end":197,"severity":"medium","line_start":197},{"id":"external_commands:SKILL.md:198:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `FS_CACHE_DIR` | 否 | 词表缓存目录,默认 `~/.cache/feeling-search` |","category":"external_commands","line_end":198,"severity":"medium","line_start":198},{"id":"external_commands:SKILL.md:199:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `FS_CACHE_TTL` | 否 | 缓存有效期秒数,默认 604800(7 天) |","category":"external_commands","line_end":203,"severity":"medium","line_start":199},{"id":"external_commands:SKILL.md:203:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **`payment_required`** —— 付费端点需要额度。先确认用户是否同意付费;否则改走 `dict` /","category":"external_commands","line_end":203,"severity":"medium","line_start":203},{"id":"external_commands:SKILL.md:204:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`lookup` / `style-words` 这些免费端点。要买就用 `quota --claim`(支付宝)或让调用方走 x402。","category":"external_commands","line_end":204,"severity":"medium","line_start":204},{"id":"external_commands:SKILL.md:205:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **`no_token`** —— 本机没有额度 token:先 `quota --set <token>` 存一枚,或 `quota --claim` 领取。","category":"external_commands","line_end":205,"severity":"medium","line_start":205},{"id":"external_commands:SKILL.md:206:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **`word_not_found`** —— 词表里没这个词。先用 `dict --with-items` 看看词表实际有什么,","category":"external_commands","line_end":206,"severity":"medium","line_start":206},{"id":"external_commands:SKILL.md:207:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"或直接对整句用 `analyze`。","category":"external_commands","line_end":208,"severity":"medium","line_start":207},{"id":"external_commands:SKILL.md:208:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **`network_unreachable`** —— 连不上服务端。词表缓存还在的话用 `--offline` 继续跑本地档。","category":"external_commands","line_end":208,"severity":"medium","line_start":208},{"id":"external_commands:SKILL.md:209:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **本地零命中** —— 先加 `--fuzzy`(免费),再考虑 `--allow-cloud`。","category":"external_commands","line_end":209,"severity":"medium","line_start":209},{"id":"external_commands:SKILL.md:210:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **召回太少,想多命中一些** —— 加 `--fuzzy` 连近义词一起匹配。gloss 词袋**末尾两个是刻意放的","category":"external_commands","line_end":211,"severity":"medium","line_start":210},{"id":"external_commands:SKILL.md:211:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"反义/易混词**(如「温暖」带「冷寂」),`--fuzzy` 会自动排除它们,所以不会把反义算成命中。","category":"external_commands","line_end":212,"severity":"medium","line_start":211},{"id":"external_commands:SKILL.md:212:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **中文乱码** —— Windows 控制台设 `PYTHONIOENCODING=utf-8`。","category":"external_commands","line_end":216,"severity":"medium","line_start":212},{"id":"external_commands:SKILL.md:216:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `scripts/fs_api.py` —— 零依赖客户端,本地词典优先 + 付费云端兜底","category":"external_commands","line_end":217,"severity":"medium","line_start":216},{"id":"network:SKILL.md:67:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"MCP 客户端配置见 `https://xiximm.cloud` 的文档;工具是同一套五个,","category":"network","line_end":67,"severity":"low","line_start":67},{"id":"network:SKILL.md:151:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"领取页(人可点):`https://xiximm.cloud/docs/quota.html`。","category":"network","line_end":151,"severity":"low","line_start":151},{"id":"network:SKILL.md:197:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"| `FS_API_BASE` | 否 | 服务端点,默认 `https://xiximm.cloud` |","category":"network","line_end":197,"severity":"low","line_start":197},{"id":"filesystem:SKILL.md:107:hidden-file-in-home-directory","file":"SKILL.md","pattern":"Hidden file in home directory","snippet":"首次使用会顺带把词表拉到本地缓存(`~/.cache/feeling-search/`,默认 7 天有效)。","category":"filesystem","line_end":107,"severity":"high","line_start":107},{"id":"filesystem:SKILL.md:149:hidden-file-in-home-directory","file":"SKILL.md","pattern":"Hidden file in home directory","snippet":"token 解析优先级:`--quota <token>` > `FS_QUOTA` 环境变量 > 本地缓存 `~/.cache/feeling-search/quota.json`。","category":"filesystem","line_end":149,"severity":"high","line_start":149},{"id":"filesystem:SKILL.md:198:hidden-file-in-home-directory","file":"SKILL.md","pattern":"Hidden file in home directory","snippet":"| `FS_CACHE_DIR` | 否 | 词表缓存目录,默认 `~/.cache/feeling-search` |","category":"filesystem","line_end":198,"severity":"high","line_start":198},{"id":"filesystem:SKILL.md:107:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"首次使用会顺带把词表拉到本地缓存(`~/.cache/feeling-search/`,默认 7 天有效)。","category":"filesystem","line_end":107,"severity":"medium","line_start":107},{"id":"filesystem:SKILL.md:149:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"token 解析优先级:`--quota <token>` > `FS_QUOTA` 环境变量 > 本地缓存 `~/.cache/feeling-search/quota.json`。","category":"filesystem","line_end":149,"severity":"medium","line_start":149},{"id":"filesystem:SKILL.md:198:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"| `FS_CACHE_DIR` | 否 | 词表缓存目录,默认 `~/.cache/feeling-search` |","category":"filesystem","line_end":198,"severity":"medium","line_start":198},{"id":"blocker:SKILL.md:3:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"description: \"商业级美术对照表 · 美术风格大全 · 美术风格 AI 提示词大全。把一句口语化的感觉描述检索成最匹配的视觉风格,并给出触发它的感受词,每种风格带名称、一句话定义、命中词与","category":"blocker","line_end":3,"severity":"low","line_start":3},{"id":"blocker:SKILL.md:116:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"- 拿到的风格 id 可以直接喂给图像生成、或者继续往下查。","category":"blocker","line_end":116,"severity":"low","line_start":116},{"id":"obfuscation:references/api-contract.md:1:heuristic-high-file-entropy-6-70-bits-possible-b","file":"references/api-contract.md","pattern":"[HEURISTIC] High file entropy (6.70 bits) - possible binary/encrypted content","snippet":"File: references/api-contract.md","category":"obfuscation","line_end":1,"severity":"high","line_start":1},{"id":"obfuscation:SKILL.md:1:heuristic-high-file-entropy-7-10-bits-possible-b","file":"SKILL.md","pattern":"[HEURISTIC] High file entropy (7.10 bits) - possible binary/encrypted content","snippet":"File: SKILL.md","category":"obfuscation","line_end":1,"severity":"high","line_start":1},{"id":"obfuscation:scripts/fs_api.py:1:heuristic-multiple-bracket-chains-9-jsfuck-obfus","file":"scripts/fs_api.py","pattern":"[HEURISTIC] Multiple bracket chains (9) - JSFuck/obfuscation pattern","snippet":"())}, ]))), [])}","category":"obfuscation","line_end":1,"severity":"high","line_start":1}],"finding_verdicts":[{"id":"external_commands:scripts/fs_api.py:103:ruby-shell-backtick-execution","reason":"Backticks occur inside a Python docstring describing quota commands. They do not execute a shell.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/fs_api.py:112:ruby-shell-backtick-execution","reason":"The backticked query parameter is docstring text, not executable shell syntax. Query-token exposure is addressed separately.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/fs_api.py:221:ruby-shell-backtick-execution","reason":"The dict command appears in an exception message. Python treats its backticks as literal string characters.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/fs_api.py:417:ruby-shell-backtick-execution","reason":"The quota command is help text in a string, not a subprocess invocation.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/fs_api.py:418:ruby-shell-backtick-execution","reason":"The claim command is an example embedded in an error message. No shell evaluates it.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/fs_api.py:502:ruby-shell-backtick-execution","reason":"The payment-proof command is explanatory output for missing credentials. It is not executed or used to search the machine.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/fs_api.py:503:ruby-shell-backtick-execution","reason":"The backticked token-setting command is a literal hint. It does not launch a shell.","verdict":"false_positive","confidence":1},{"id":"network:scripts/fs_api.py:46:python-http-libraries","reason":"Importing urllib.request supports the documented API client and does not itself transmit data. Transport flaws are adjudicated at the request execution sites.","verdict":"false_positive","confidence":0.99},{"id":"network:scripts/fs_api.py:156:python-http-libraries","reason":"Constructing a GET request is ordinary API plumbing and is preceded by an offline guard. Redirect credential leakage is covered at urlopen.","verdict":"false_positive","confidence":0.98},{"id":"network:scripts/fs_api.py:161:python-http-libraries","reason":"urlopen follows redirects with custom headers added by http_get, including X-FS-Quota from style and images calls. Cross-origin redirects can disclose credentials.","verdict":"confirmed","severity":"medium","confidence":0.97},{"id":"network:scripts/fs_api.py:180:python-http-libraries","reason":"POST request construction serves explicit quota claims and opt-in cloud analysis. The separate urlopen verdict covers unsafe redirect handling.","verdict":"false_positive","confidence":0.98},{"id":"network:scripts/fs_api.py:186:python-http-libraries","reason":"The POST helper uses default redirect handling after adding caller-supplied headers. A redirect from cloud analysis can forward X-FS-Quota to another origin.","verdict":"confirmed","severity":"medium","confidence":0.97},{"id":"network:scripts/fs_api.py:27:hardcoded-url","reason":"This is documentation of the intended HTTPS service, not an unrelated data collector. The advertised --base option is not implemented.","verdict":"false_positive","confidence":0.99},{"id":"network:scripts/fs_api.py:31:hardcoded-url","reason":"The URL documents the supported FS_API_BASE configuration variable. Its presence alone does not establish unauthorized transmission.","verdict":"false_positive","confidence":0.99},{"id":"network:scripts/fs_api.py:54:hardcoded-url","reason":"The default HTTPS endpoint matches the documented service and client purpose. No evidence found of an unrelated exfiltration endpoint.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:scripts/fs_api.py:33:hidden-file-in-home-directory","reason":"The location is a documented application cache, not persistence or access to unrelated private files. Credential permissions are addressed at the quota write.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:scripts/fs_api.py:33:hidden-file-access","reason":"This line documents the application's own cache directory. A hidden cache path is not inherently unsafe.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:scripts/fs_api.py:122:python-file-write-append","reason":"save_quota writes a bearer token without restrictive permissions to a predictable temporary path. With a permissive umask and traversable parent directories, other local users can read the saved credential.","verdict":"confirmed","severity":"medium","confidence":0.98},{"id":"filesystem:scripts/fs_api.py:227:python-file-write-append","reason":"This writes public dictionary data to the configured application cache and atomically replaces the cache file. No sensitive data or unrelated file target appears in this operation.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:scripts/fs_api.py:117:python-os-file-operations","reason":"Creating the configured application cache is a legitimate bounded operation. The credential-file protection defect is covered by the write verdict.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:scripts/fs_api.py:225:python-os-file-operations","reason":"makedirs creates the public dictionary cache directory with exist_ok enabled. There is no deletion or unrelated filesystem traversal.","verdict":"false_positive","confidence":0.99},{"id":"env_access:scripts/fs_api.py:76:python-environment-access","reason":"The function reads only the documented service endpoint setting. It does not enumerate or transmit unrelated environment variables.","verdict":"false_positive","confidence":0.98},{"id":"env_access:scripts/fs_api.py:80:python-environment-access","reason":"FS_QUOTA is the documented credential explicitly supplied for this service. Reading it for authentication is legitimate; transport defects are covered separately.","verdict":"false_positive","confidence":0.98},{"id":"env_access:scripts/fs_api.py:84:python-environment-access","reason":"FS_CACHE_DIR selects the application's cache directory. No unrelated secrets are accessed.","verdict":"false_positive","confidence":0.99},{"id":"env_access:scripts/fs_api.py:148:python-environment-access","reason":"FS_CACHE_TTL is parsed as a numeric cache lifetime with a fallback. This is ordinary nonsecret configuration access.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:17:ruby-shell-backtick-execution","reason":"This fenced block contains a sample mood description and ranked styles. The fence is Markdown, not shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","reason":"The matched delimiter closes an illustrative output block. No executable command occurs at this delimiter.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"FS_PAID=1 is inline documentation about server billing configuration. It is not a command to modify the user's environment.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","reason":"The analyze name is inline code in rate-limit documentation. No shell command is run.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"FS_QUOTA and --allow-cloud are formatted configuration names. Their backticks do not cause execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","reason":"The table documents cloud opt-in behavior and billing. It contains no shell substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"The inline --fuzzy flag describes the local-first workflow. The matched backticks are Markdown formatting.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","reason":"The table shows illustrative semantic search results for an external MCP package. The style names are not commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","reason":"An inline implementation filename describes an external service. It is not executed by the bundled client.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","reason":"source, local, engine, and cloud are documented response values. These backticks are not shell syntax.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"The block instructs npx -y feeling-search-mcp@latest --self-test, downloading and executing an unpinned external package. Automatic confirmation creates a supply-chain execution risk.","verdict":"confirmed","severity":"medium","confidence":0.98},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"This is the closing Markdown fence, not additional execution. The package execution inside the block is covered at line 63.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","reason":"The backticks format the service documentation URL. They do not execute or fetch it.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:68:ruby-shell-backtick-execution","reason":"The text lists an MCP tool name and response-source labels. It contains no shell evaluation.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:71:ruby-shell-backtick-execution","reason":"The inline mixed-language phrase is a language-detection example. It is not executable code.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:72:ruby-shell-backtick-execution","reason":"The inline lang values document an external interface parameter. No execution occurs.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:74:ruby-shell-backtick-execution","reason":"Negation examples and an excluded field are illustrative response data. Backticks only format the examples.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","reason":"The weakened field and negated phrase describe search semantics. They are not commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:79:ruby-shell-backtick-execution","reason":"SKILL.md is an inline filename explaining relative paths. No shell syntax is evaluated.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","reason":"The block sets a skill-directory variable and runs the bundled Python status command with a quoted path. It contains no shell substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","reason":"The matched line closes the status example's Markdown fence. It does not run a command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:86:ruby-shell-backtick-execution","reason":"The examples set console encoding for readable Chinese output. They do not execute untrusted input or change security controls.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","reason":"The inline flag appears in a requirement to obtain consent before cloud calls. This is a protective instruction, not shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:96:ruby-shell-backtick-execution","reason":"placeholder is an image-kind label in a warning against misleading references. It is not executable syntax.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:102:ruby-shell-backtick-execution","reason":"The fenced example invokes the bundled status command. It performs documented connectivity and cache checks without running arbitrary shell content.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:104:ruby-shell-backtick-execution","reason":"This is a closing Markdown delimiter after the status example. The delimiter has no execution semantics.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","reason":"FS_QUOTA is formatted as an environment-variable name in status guidance. It is not a command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:107:ruby-shell-backtick-execution","reason":"The inline path documents the application dictionary cache. Backticks do not execute the path.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:111:ruby-shell-backtick-execution","reason":"The fenced command runs the bundled analyzer with a quoted literal description and numeric limits. It contains no command injection.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:113:ruby-shell-backtick-execution","reason":"The line is the closing fence of the analyzer example. It is not a shell backtick expression.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:115:ruby-shell-backtick-execution","reason":"The --json flag is inline documentation of output formatting. No command is executed by this text.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:120:ruby-shell-backtick-execution","reason":"The block shows local fuzzy matching and explicit cloud opt-in with consent guidance. Both commands invoke the bundled client, not arbitrary shell input.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:126:ruby-shell-backtick-execution","reason":"This closing fence is Markdown formatting following the fallback examples. It is not command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","reason":"source, local, and cloud are response labels explaining provenance. They are not shell commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:131:ruby-shell-backtick-execution","reason":"The heading names the quota subcommand with inline formatting. It does not execute it.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","reason":"The block documents explicit balance, token-setting, and claim actions through the bundled client. It does not autonomously pay or harvest payment credentials.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:140:ruby-shell-backtick-execution","reason":"This is a closing Markdown fence after quota usage examples. It is not a shell expression.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:142:ruby-shell-backtick-execution","reason":"The inline claim flags describe submitting a user-provided order number for server verification. They do not search the system or execute arbitrary code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:143:ruby-shell-backtick-execution","reason":"not_paid is a documented error response. It is not an executable command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","reason":"The proof and trade flags document explicit payment-provider integration inputs. They are not shell substitution or automatic credential collection.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","reason":"Inline options, an environment variable, and a cache path explain credential precedence. Backticks here only format text.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:150:ruby-shell-backtick-execution","reason":"The --set flag describes saving an explicitly supplied token. There is no shell execution in this sentence.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","reason":"The inline URL points to the documented quota page. Markdown backticks do not open the page or run a command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:155:ruby-shell-backtick-execution","reason":"The block runs documented lookup and style-words commands with literal arguments. No untrusted shell content is evaluated.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","reason":"The matched delimiter closes the lookup examples. It is Markdown, not command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:162:ruby-shell-backtick-execution","reason":"The examples explicitly request style details and images from the advertised service. They are ordinary bundled-client invocations with documented potential costs.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:165:ruby-shell-backtick-execution","reason":"The line closes a fenced command example. It has no shell execution behavior.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:167:ruby-shell-backtick-execution","reason":"thumb, full, kind, work, and synthetic are image metadata fields or values. They are not commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:168:ruby-shell-backtick-execution","reason":"The inline names identify image provenance and licensing fields. No shell evaluates them.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:173:ruby-shell-backtick-execution","reason":"The --fuzzy option is workflow guidance when lexical results are poor. It is not shell substitution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:179:ruby-shell-backtick-execution","reason":"This table row summarizes explicit quota operations. It does not execute its command synopsis.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:180:ruby-shell-backtick-execution","reason":"status is a documented subcommand label in a table. The backticks only format the label.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:181:ruby-shell-backtick-execution","reason":"The row documents dictionary cache retrieval and refresh. Inline command syntax is not executed by Markdown.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:182:ruby-shell-backtick-execution","reason":"The analyzer synopsis and opt-in flag describe supported functionality. There is no executable backtick expression.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:183:ruby-shell-backtick-execution","reason":"The lookup synopsis is a table label for a documented API action. It does not launch a process.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:184:ruby-shell-backtick-execution","reason":"The style-words synopsis describes querying style vocabulary. Backticks are solely Markdown formatting.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:185:ruby-shell-backtick-execution","reason":"The style command is documented with its billing category. The table does not execute it.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:186:ruby-shell-backtick-execution","reason":"The images synopsis documents an explicit batch lookup. It contains no shell interpolation.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:188:ruby-shell-backtick-execution","reason":"The flags document output, offline mode, and refresh behavior. No backtick command substitution occurs.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:189:ruby-shell-backtick-execution","reason":"The quota flag is an inline credential-precedence example. It is not executed by this prose.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:190:ruby-shell-backtick-execution","reason":"The words and styles options document result limits. These numeric parameter names are not commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:196:ruby-shell-backtick-execution","reason":"The row documents FS_QUOTA and its application-owned fallback file. Backticks are formatting, not execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:197:ruby-shell-backtick-execution","reason":"The row names the endpoint variable and default HTTPS URL. It contains no command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:198:ruby-shell-backtick-execution","reason":"The cache variable and path are inline reference text. Neither is evaluated by a shell.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:199:ruby-shell-backtick-execution","reason":"The row describes cache lifetime configuration. It does not execute its backticked variable name.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:203:ruby-shell-backtick-execution","reason":"The error guidance requests consent before paid calls and names a free alternative. It does not execute commands or bypass consent.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:204:ruby-shell-backtick-execution","reason":"This is continuation of billing-error guidance listing explicit user choices. No payment or shell command runs automatically.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:205:ruby-shell-backtick-execution","reason":"The no_token guidance names supported token-setting and claim commands. It does not obtain credentials without input.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:206:ruby-shell-backtick-execution","reason":"The word_not_found guidance suggests inspecting dictionary contents. Its inline command is documentation, not evaluated shell text.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:207:ruby-shell-backtick-execution","reason":"The analyze name appears in troubleshooting prose. No command execution is performed by the backticks.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:208:ruby-shell-backtick-execution","reason":"The text suggests offline mode after a network error. This restricts networking rather than launching arbitrary commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:209:ruby-shell-backtick-execution","reason":"The flags describe local fuzzy matching before optional cloud fallback. They are inline usage guidance.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:210:ruby-shell-backtick-execution","reason":"The --fuzzy mention introduces a description of synonym matching. Backticks do not invoke a shell.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:211:ruby-shell-backtick-execution","reason":"The text explains excluding contrasting gloss terms during fuzzy matching. No external command appears.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:212:ruby-shell-backtick-execution","reason":"PYTHONIOENCODING=utf-8 is console-encoding troubleshooting advice. It is not dangerous shell evaluation.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:216:ruby-shell-backtick-execution","reason":"The resource list names the bundled Python client. A backticked filename is not a subprocess call.","verdict":"false_positive","confidence":1},{"id":"network:SKILL.md:67:hardcoded-url","reason":"The link points to documentation for the intended service. No evidence found of unrelated data collection at this reference.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:151:hardcoded-url","reason":"This is the service's disclosed quota page for user-directed account actions. A documentation link alone is not credential exfiltration.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:197:hardcoded-url","reason":"The URL documents the client's default HTTPS endpoint. Its purpose matches the skill's online features.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:107:hidden-file-in-home-directory","reason":"The documented path is an application-specific dictionary cache. It is not a startup file or unauthorized private-file target.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:149:hidden-file-in-home-directory","reason":"The path documents the skill's own explicitly saved quota token. Storage permissions, not the hidden path itself, are the confirmed defect.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:198:hidden-file-in-home-directory","reason":"The environment-variable table declares the application cache location. No persistence mechanism or unrelated home-directory access is shown.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:107:hidden-file-access","reason":"This is documentation of ordinary dictionary caching. The hidden directory name does not establish malicious file access.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:149:hidden-file-access","reason":"The documented fallback reads only the application's saved token file. The quota writer's permissions are adjudicated separately.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:198:hidden-file-access","reason":"FS_CACHE_DIR is a disclosed cache configuration setting. There is no instruction to inspect unrelated hidden files.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:3:system-reconnaissance","reason":"The description concerns mood matching, art direction, and image prompts. No system enumeration or reconnaissance instruction appears.","verdict":"false_positive","confidence":1},{"id":"blocker:SKILL.md:116:system-reconnaissance","reason":"The line discusses visual-style identifiers for image generation. These are not operating-system user identifiers or reconnaissance commands.","verdict":"false_positive","confidence":1},{"id":"obfuscation:references/api-contract.md:1:heuristic-high-file-entropy-6-70-bits-possible-b","reason":"The entire file is readable Chinese API documentation with tables and response examples. No evidence found of encrypted payloads or obfuscated execution.","verdict":"false_positive","confidence":0.99},{"id":"obfuscation:SKILL.md:1:heuristic-high-file-entropy-7-10-bits-possible-b","reason":"The file contains readable Chinese and English instructions, YAML metadata, and Markdown examples. Multilingual text explains the heuristic without an encoded payload.","verdict":"false_positive","confidence":0.99},{"id":"obfuscation:scripts/fs_api.py:1:heuristic-multiple-bracket-chains-9-jsfuck-obfus","reason":"The client uses ordinary Python dictionaries, comprehensions, and nested indexing. No JSFuck, dynamic evaluation, or encoded execution appears.","verdict":"false_positive","confidence":1}],"semantic_findings":[{"title":"Bearer Token Exposure Through Quota Query URLs","severity":"medium","locations":[{"file":"scripts/fs_api.py","line_end":113,"line_start":111},{"file":"scripts/fs_api.py","line_end":420,"line_start":408},{"file":"references/api-contract.md","line_end":135,"line_start":133},{"file":"references/api-contract.md","line_end":154,"line_start":150}],"confidence":0.98,"description":"quota_url places the quota bearer token in a URL query parameter. Balance and token-validation requests can expose this reusable credential to access logs and monitoring.","confidence_reasoning":"The client builds credential-bearing URLs, and the contract accepts the same token in an authentication header. Actual server logging was not verified."}],"subject_marketplace_commit_sha":"5b5bad298d69ae8fd37204d293d395c5f80ce32f","subject_content_hash":"cb044cb3c796fa239e37105bba8e6482f98db6a126ea711d127bee96c3742cf3","subject_tree_hash":"8894e73fc13f6586953dcda6b174547835e16b6bba173fd14969829cc675a9d4","subject_plugin_path":"skills/xixi048/feeling-search","audit_payload_hash":"529924937b6db9b525c33a0d32ef76cb","confirmed_risk_level":"medium","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"5b5bad298d69ae8fd37204d293d395c5f80ce32f","contentHash":"cb044cb3c796fa239e37105bba8e6482f98db6a126ea711d127bee96c3742cf3","treeHash":"8894e73fc13f6586953dcda6b174547835e16b6bba173fd14969829cc675a9d4","pluginPath":"skills/xixi048/feeling-search","auditPayloadHash":"529924937b6db9b525c33a0d32ef76cb"},"scannerVersion":"3.0.0","policyVersion":"skillstore-security-audit-policy-v1"},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"issued","url":"/api/skills/xixi048-feeling-search/audits/5/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"medium","confirmedFindingCount":1,"capabilityReviewCount":4,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}