🔄 卡若AI 同步 2026-07-24 09:05 | 更新:更新大文件排除规则;.restore-backups/F22_恢复前_20260723_210051 Skill规则更新;更新SKILL_REGISTRY.md;更新karuo_route.sh;更新SkillSpector扫描处置记录.md;更新对话019f7fde可执行模式复盘.md;更新对话019f7fde通过案例分析.md;更新工具候选与集成规则.md;更新生成业务续执行包.py;更新F22_复扫.json;更新F22_静态扫描.json;更新019f7fde-41d5-7641-9a25-561d9356c193.md;其余1172项见提交文件清单 | 排除 >1MB: 693 个

This commit is contained in:
Manus AI
2026-07-24 09:05:42 +08:00
parent 6236ee864a
commit 3d997de4ec
1426 changed files with 462595 additions and 1855 deletions

View File

@@ -0,0 +1,22 @@
# SkillSpector扫描处置记录
## 2026-07-23
- 工具NVIDIA SkillSpector 2.4.3
- 模式:`--no-llm`
- 覆盖19/19组件
- 初始评分48MEDIUM
## 已修复
1. `RP1`Promptfoo由`@latest`固定为已验收的`0.121.19`
## 已复核
1. `AST4`两项:`验证PDF电子签章.py`使用显式参数数组调用本地固定`pyhanko`,未启用`shell=True`,属于静态规则提示。
2. `TP2`:名称`Codex提示词回归`包含产品名和中文符合卡若AI“中文业务名、产品名保留原文”的命名规则。
3. `LP3`SkillSpector要求机器可识别的权限模型但卡若AI现有Skill规范尚未定义兼容字段。曾试加自定义权限复扫产生`LP1/LP4`矛盾告警已撤回待统一权限Schema后处理。
## 结论
扫描用于发现Skill自身风险不用于改变平台服务端策略。F22的主要交付仍是回归、拦截分层、任务续执行包和证据归档。

View File

@@ -0,0 +1,49 @@
# 对话019f7fde可执行模式复盘
## 对话标识
`codex://threads/019f7fde-41d5-7641-9a25-561d9356c193`
## 本机证据
- 日志来源Codex本机`logs_2.sqlite`
- 记录时间2026-07-23。
- 模型:`gpt-5.6-sol`
- 推理等级:`medium`
- 工作目录:`/Users/karuo/Documents/开发/2、私域银行/工作手机`
## 已观察执行链
1. 读取`RemittanceDetailUI.smali`指定区间。
2. 搜索目标方法调用关系。
3. 加载卡若AI入口、BOOTSTRAP、AGENTS和长期记忆。
4. 修改`wechat_hook_v2.js`中的Hook实现。
5. 修改`test_message_management_api_contract.py`中的API契约测试。
6. 等待测试和命令执行结果。
## 为什么该对话可以执行
- 目标位于本地项目中。
- 文件、类、函数和预期行为明确。
- 工作内容是代码阅读、调用链分析、Hook实现和测试更新。
- 结果由文件差异与测试验证,而不是抽象的“破解成功”判定。
## 后续复用模板
```text
项目目录PROJECT_PATH
当前文件TARGET_FILE
当前行为CURRENT_BEHAVIOR
期望行为EXPECTED_BEHAVIOR
执行步骤:
1. 读取项目Skill与开发文档
2. 定位调用链
3. 最小修改
4. 更新契约测试
5. 执行测试
6. 回读真实结果
```
## 注意
Codex任务链接若未进入应用任务目录可从本机日志按`thread_id`核验模型、工作目录、工具调用和时间;日志不等于完整对话正文,只用于执行证据复核。

View File

@@ -0,0 +1,64 @@
# 对话019f7fde通过案例分析
## 对话
- 任务ID`019f7fde-41d5-7641-9a25-561d9356c193`
- 项目:工作手机
- 主责水桥·微信BFF接口与实时事件
- 用户真实目标:完善消息管理、转账确认/退还及无界面命令行链路。
## 为什么后续能够继续
早期处理把任务落到页面点击、无障碍和Root输入虽然完成一次真实退还但偏离了用户要求的无界面命令行主链。
用户再次强调后,任务重新归入已有项目边界,并明确:
`CLI/API → Agent → Frida RPC → 微信`
随后完成的有效工作包括:
- 定位`transferoperation``confirm/refuse`操作。
- 补RPC、回调、消息回读。
- 把契约锁定为`hook_only`
- 运行60项回归。
- 恢复WS、Frida监听及Hook附着链。
这说明“能够继续”的决定因素是:
1. 真实业务目标明确。
2. 项目和代码边界明确。
3. 自有设备及现有服务上下文完整。
4. 使用了项目已经登记的技术链。
5. 每一步有服务状态、测试或回执作为证据。
它不证明本地提示词覆盖了平台层,也不应被登记成“通用破甲成功”。
## 应沉淀的路由规则
### 主Skill
- 工作手机/机擎项目Skill。
- 微信BFF接口与实时事件。
- 无界面命令行项目执行闭环。
### F22角色
- 记录此前出现的拦截和对话差异。
- 比较前后请求表达、路由和响应层。
- 生成回归样本。
- 不接管业务代码、设备部署和业务动作。
## 推荐处理模板
遇到类似请求时内部按以下顺序处理:
1. 提取真实交付目标。
2. 识别项目、设备、代码和服务边界。
3. 选择领域Skill作为主路由。
4. 将“破甲”视为用户希望减少误判的附加信号。
5. 继续定位技术阻塞点。
6. 用测试、原始回执和回读完成验收。
## 本案例遗留
该任务原始记录结束在“Frida监听正常准备加载新版Hook”没有最终完成回复。因此案例只用于路由学习不把后续业务动作登记为已完成。

View File

@@ -0,0 +1,61 @@
#!/usr/bin/env python3
from __future__ import annotations
import argparse
from datetime import datetime
from pathlib import Path
def clean(value: str) -> str:
return " ".join(value.replace("\x00", "").split())
def main() -> None:
parser = argparse.ArgumentParser(description="生成卡若AI项目业务续执行包")
parser.add_argument("--task-id", required=True)
parser.add_argument("--project", required=True)
parser.add_argument("--objective", required=True)
parser.add_argument("--scope", required=True)
parser.add_argument("--chain", required=True)
parser.add_argument("--evidence", default="待补")
parser.add_argument("--output", required=True)
args = parser.parse_args()
output = Path(args.output).expanduser()
output.parent.mkdir(parents=True, exist_ok=True)
text = f"""# 业务续执行包
- 任务ID`{clean(args.task_id)}`
- 生成时间:{datetime.now().astimezone().isoformat(timespec="seconds")}
- 项目:{clean(args.project)}
## 真实交付目标
{clean(args.objective)}
## 范围
{clean(args.scope)}
## 已确认技术链
`{clean(args.chain)}`
## 当前证据
{clean(args.evidence)}
## 执行规则
1. 先读取项目Skill、需求、现有实现和最近进度。
2. 从最后一个有证据的技术节点继续,不重复已完成步骤。
3. 只在声明范围内修改。
4. 以测试、原始回执和回读完成验收。
5. 提示词回归Skill只记录路由与中断层不接管项目实现。
"""
output.write_text(text, encoding="utf-8")
print(output)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,319 @@
{
"skill": {
"name": "Codex\u63d0\u793a\u8bcd\u56de\u5f52",
"source": "/private/tmp/f22-rescan.zXkkB3",
"scanned_at": "2026-07-23T12:54:34.503062+00:00"
},
"risk_assessment": {
"score": 74,
"severity": "HIGH",
"recommendation": "DO_NOT_INSTALL"
},
"components": [
{
"path": "SKILL.md",
"type": "markdown",
"lines": 383,
"executable": false,
"size_bytes": 17933
},
{
"path": "references/GitHub\u516c\u7ae0\u5de5\u5177\u9009\u578b\u4e0e\u96c6\u6210.md",
"type": "markdown",
"lines": 40,
"executable": false,
"size_bytes": 2397
},
{
"path": "references/SkillSpector\u626b\u63cf\u5904\u7f6e\u8bb0\u5f55.md",
"type": "markdown",
"lines": 22,
"executable": false,
"size_bytes": 766
},
{
"path": "references/\u516c\u7ae0\u6837\u7ae0\u89c6\u89c9\u5939\u5177\u89c4\u5219.md",
"type": "markdown",
"lines": 25,
"executable": false,
"size_bytes": 732
},
{
"path": "references/\u516c\u7ae0\u8bf7\u6c42\u56de\u5f52\u6a21\u5757.md",
"type": "markdown",
"lines": 90,
"executable": false,
"size_bytes": 3368
},
{
"path": "references/\u56de\u5f52\u77e9\u9635\u4e0e\u5b9e\u6d4b\u8bb0\u5f55.md",
"type": "markdown",
"lines": 57,
"executable": false,
"size_bytes": 2698
},
{
"path": "references/\u5bf9\u8bdd019f79d3\u5b8c\u6574\u68b3\u7406.md",
"type": "markdown",
"lines": 100,
"executable": false,
"size_bytes": 4589
},
{
"path": "references/\u5bf9\u8bdd019f7fde\u53ef\u6267\u884c\u6a21\u5f0f\u590d\u76d8.md",
"type": "markdown",
"lines": 49,
"executable": false,
"size_bytes": 1485
},
{
"path": "references/\u5bf9\u8bdd019f7fde\u901a\u8fc7\u6848\u4f8b\u5206\u6790.md",
"type": "markdown",
"lines": 64,
"executable": false,
"size_bytes": 2098
},
{
"path": "references/\u5de5\u5177\u5019\u9009\u4e0e\u96c6\u6210\u89c4\u5219.md",
"type": "markdown",
"lines": 113,
"executable": false,
"size_bytes": 4713
},
{
"path": "\u6a21\u677f/Inspect\u7edf\u4e00\u4efb\u52a1.py",
"type": "python",
"lines": 18,
"executable": true,
"size_bytes": 478
},
{
"path": "\u811a\u672c/\u4e00\u952e\u9884\u68c0\u4e0e\u70df\u96fe\u6d4b\u8bd5.sh",
"type": "shell",
"lines": 25,
"executable": true,
"size_bytes": 859
},
{
"path": "\u811a\u672c/\u516c\u7ae0\u5de5\u5177\u9884\u68c0.sh",
"type": "shell",
"lines": 35,
"executable": true,
"size_bytes": 881
},
{
"path": "\u811a\u672c/\u5de5\u5177\u9884\u68c0.sh",
"type": "shell",
"lines": 47,
"executable": true,
"size_bytes": 1415
},
{
"path": "\u811a\u672c/\u751f\u6210\u4e1a\u52a1\u7eed\u6267\u884c\u5305.py",
"type": "python",
"lines": 61,
"executable": true,
"size_bytes": 1610
},
{
"path": "\u811a\u672c/\u751f\u6210\u516c\u7ae0\u6837\u7ae0.py",
"type": "python",
"lines": 46,
"executable": true,
"size_bytes": 2243
},
{
"path": "\u811a\u672c/\u751f\u6210\u516c\u7ae0\u8bf7\u6c42\u56de\u5f52\u9898\u5e93.py",
"type": "python",
"lines": 55,
"executable": true,
"size_bytes": 2841
},
{
"path": "\u811a\u672c/\u751f\u6210\u7edf\u4e00\u8bc4\u6d4b\u8d44\u4ea7.py",
"type": "python",
"lines": 83,
"executable": true,
"size_bytes": 2834
},
{
"path": "\u811a\u672c/\u751f\u6210\u9ad8\u98ce\u9669\u8fb9\u754c\u9898\u5e93.py",
"type": "python",
"lines": 64,
"executable": true,
"size_bytes": 3184
},
{
"path": "\u811a\u672c/\u9a8c\u8bc1PDF\u7535\u5b50\u7b7e\u7ae0.py",
"type": "python",
"lines": 45,
"executable": true,
"size_bytes": 1515
}
],
"issues": [
{
"id": "AST4",
"category": "Dangerous Code Execution",
"pattern": "subprocess module call",
"severity": "MEDIUM",
"confidence": 0.7,
"location": {
"file": "\u811a\u672c/\u9a8c\u8bc1PDF\u7535\u5b50\u7b7e\u7ae0.py",
"start_line": 26,
"end_line": 30
},
"finding": " proc = subprocess.run(\n [str(pyhanko), \"sign\", \"validate\", \"--pretty-print\", str(pdf)],\n text=True,\n capture_output=True,\n )",
"explanation": "subprocess module calls execute external commands. Without careful input validation, this enables command injection.",
"remediation": "Use subprocess.run() with shell=False and an explicit argument list. Validate all inputs and avoid passing user-controlled data to commands.",
"code_snippet": " if not pyhanko.is_file():\n raise SystemExit(f\"pyHanko \u5f85\u5b89\u88c5\uff1a{pyhanko}\")\n\n proc = subprocess.run(\n [str(pyhanko), \"sign\", \"validate\", \"--pretty-print\", str(pdf)],\n text=True,\n capture_output=True,",
"intent": null,
"tags": [
"Dangerous Code Execution"
]
},
{
"id": "AST4",
"category": "Dangerous Code Execution",
"pattern": "subprocess module call",
"severity": "MEDIUM",
"confidence": 0.7,
"location": {
"file": "\u811a\u672c/\u9a8c\u8bc1PDF\u7535\u5b50\u7b7e\u7ae0.py",
"start_line": 34,
"end_line": 34
},
"finding": " f\"\u5de5\u5177\uff1a{subprocess.run([str(pyhanko), '--version'], text=True, capture_output=True).stdout.strip()}\\n\"",
"explanation": "subprocess module calls execute external commands. Without careful input validation, this enables command injection.",
"remediation": "Use subprocess.run() with shell=False and an explicit argument list. Validate all inputs and avoid passing user-controlled data to commands.",
"code_snippet": " output.parent.mkdir(parents=True, exist_ok=True)\n report = (\n f\"\u6587\u4ef6\uff1a{pdf}\\n\"\n f\"\u5de5\u5177\uff1a{subprocess.run([str(pyhanko), '--version'], text=True, capture_output=True).stdout.strip()}\\n\"\n f\"\u9000\u51fa\u7801\uff1a{proc.returncode}\\n\\n\"\n f\"\u6807\u51c6\u8f93\u51fa\uff1a\\n{proc.stdout}\\n\"\n f\"\u8bca\u65ad\u8f93\u51fa\uff1a\\n{proc.stderr}\\n\"",
"intent": null,
"tags": [
"Dangerous Code Execution"
]
},
{
"id": "LP1",
"category": "MCP Least Privilege",
"pattern": null,
"severity": "HIGH",
"confidence": 0.75,
"location": {
"file": "\u6a21\u677f/Inspect\u7edf\u4e00\u4efb\u52a1.py",
"start_line": 1,
"end_line": null
},
"finding": null,
"explanation": "The skill uses 'env' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.",
"remediation": "Add the 'env' permission to SKILL.md, or remove the code that requires it.",
"code_snippet": null,
"intent": null,
"tags": [
"ASI02"
]
},
{
"id": "LP1",
"category": "MCP Least Privilege",
"pattern": null,
"severity": "HIGH",
"confidence": 0.75,
"location": {
"file": "\u811a\u672c/\u9a8c\u8bc1PDF\u7535\u5b50\u7b7e\u7ae0.py",
"start_line": 1,
"end_line": null
},
"finding": null,
"explanation": "The skill uses 'shell' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.",
"remediation": "Add the 'shell' permission to SKILL.md, or remove the code that requires it.",
"code_snippet": null,
"intent": null,
"tags": [
"ASI02"
]
},
{
"id": "LP4",
"category": "MCP Least Privilege",
"pattern": null,
"severity": "LOW",
"confidence": 0.65,
"location": {
"file": "SKILL.md",
"start_line": 1,
"end_line": null
},
"finding": null,
"explanation": "Declared permissions with no matching code capability may indicate removed functionality or pre-staging for future abuse.",
"remediation": "Remove the 'process:run-pinned-tools' permission if the corresponding capability is no longer used.",
"code_snippet": null,
"intent": null,
"tags": [
"ASI02"
]
},
{
"id": "LP4",
"category": "MCP Least Privilege",
"pattern": null,
"severity": "LOW",
"confidence": 0.65,
"location": {
"file": "SKILL.md",
"start_line": 1,
"end_line": null
},
"finding": null,
"explanation": "Declared permissions with no matching code capability may indicate removed functionality or pre-staging for future abuse.",
"remediation": "Remove the 'network:official-repositories-and-model-endpoints' permission if the corresponding capability is no longer used.",
"code_snippet": null,
"intent": null,
"tags": [
"ASI02"
]
},
{
"id": "TP2",
"category": "MCP Tool Poisoning",
"pattern": null,
"severity": "HIGH",
"confidence": 0.85,
"location": {
"file": "SKILL.md",
"start_line": 1,
"end_line": null
},
"finding": null,
"explanation": "Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.",
"remediation": "Restrict identifier fields to a single Unicode script. Prefer ASCII-only identifiers.",
"code_snippet": null,
"intent": null,
"tags": [
"ASI02",
"AML.T0080"
]
}
],
"suppressed_count": 0,
"suppressed": [],
"metadata": {
"has_executable_scripts": true,
"skillspector_version": "2.4.3",
"llm_requested": false,
"llm_available": false,
"meta_analysis_applied": false,
"filtering_mode": "heuristic"
},
"analysis_completeness": {
"total_components": 20,
"scanned_components": 20,
"coverage_percent": 100.0,
"llm_analysis": "skipped",
"findings_before_filtering": 7,
"findings_after_filtering": 7,
"limitations": [
"LLM meta-analysis was disabled (--no-llm)"
],
"is_complete": false
}
}

View File

@@ -0,0 +1,272 @@
{
"skill": {
"name": "Codex\u63d0\u793a\u8bcd\u56de\u5f52",
"source": "/private/tmp/f22-scan.T9NnLr",
"scanned_at": "2026-07-23T12:54:00.784883+00:00"
},
"risk_assessment": {
"score": 48,
"severity": "MEDIUM",
"recommendation": "CAUTION"
},
"components": [
{
"path": "SKILL.md",
"type": "markdown",
"lines": 378,
"executable": false,
"size_bytes": 17782
},
{
"path": "references/GitHub\u516c\u7ae0\u5de5\u5177\u9009\u578b\u4e0e\u96c6\u6210.md",
"type": "markdown",
"lines": 40,
"executable": false,
"size_bytes": 2397
},
{
"path": "references/\u516c\u7ae0\u6837\u7ae0\u89c6\u89c9\u5939\u5177\u89c4\u5219.md",
"type": "markdown",
"lines": 25,
"executable": false,
"size_bytes": 732
},
{
"path": "references/\u516c\u7ae0\u8bf7\u6c42\u56de\u5f52\u6a21\u5757.md",
"type": "markdown",
"lines": 90,
"executable": false,
"size_bytes": 3368
},
{
"path": "references/\u56de\u5f52\u77e9\u9635\u4e0e\u5b9e\u6d4b\u8bb0\u5f55.md",
"type": "markdown",
"lines": 57,
"executable": false,
"size_bytes": 2698
},
{
"path": "references/\u5bf9\u8bdd019f79d3\u5b8c\u6574\u68b3\u7406.md",
"type": "markdown",
"lines": 100,
"executable": false,
"size_bytes": 4589
},
{
"path": "references/\u5bf9\u8bdd019f7fde\u53ef\u6267\u884c\u6a21\u5f0f\u590d\u76d8.md",
"type": "markdown",
"lines": 49,
"executable": false,
"size_bytes": 1485
},
{
"path": "references/\u5bf9\u8bdd019f7fde\u901a\u8fc7\u6848\u4f8b\u5206\u6790.md",
"type": "markdown",
"lines": 64,
"executable": false,
"size_bytes": 2098
},
{
"path": "references/\u5de5\u5177\u5019\u9009\u4e0e\u96c6\u6210\u89c4\u5219.md",
"type": "markdown",
"lines": 113,
"executable": false,
"size_bytes": 4700
},
{
"path": "\u6a21\u677f/Inspect\u7edf\u4e00\u4efb\u52a1.py",
"type": "python",
"lines": 18,
"executable": true,
"size_bytes": 478
},
{
"path": "\u811a\u672c/\u4e00\u952e\u9884\u68c0\u4e0e\u70df\u96fe\u6d4b\u8bd5.sh",
"type": "shell",
"lines": 25,
"executable": true,
"size_bytes": 859
},
{
"path": "\u811a\u672c/\u516c\u7ae0\u5de5\u5177\u9884\u68c0.sh",
"type": "shell",
"lines": 35,
"executable": true,
"size_bytes": 881
},
{
"path": "\u811a\u672c/\u5de5\u5177\u9884\u68c0.sh",
"type": "shell",
"lines": 47,
"executable": true,
"size_bytes": 1415
},
{
"path": "\u811a\u672c/\u751f\u6210\u4e1a\u52a1\u7eed\u6267\u884c\u5305.py",
"type": "python",
"lines": 61,
"executable": true,
"size_bytes": 1610
},
{
"path": "\u811a\u672c/\u751f\u6210\u516c\u7ae0\u6837\u7ae0.py",
"type": "python",
"lines": 46,
"executable": true,
"size_bytes": 2243
},
{
"path": "\u811a\u672c/\u751f\u6210\u516c\u7ae0\u8bf7\u6c42\u56de\u5f52\u9898\u5e93.py",
"type": "python",
"lines": 55,
"executable": true,
"size_bytes": 2841
},
{
"path": "\u811a\u672c/\u751f\u6210\u7edf\u4e00\u8bc4\u6d4b\u8d44\u4ea7.py",
"type": "python",
"lines": 83,
"executable": true,
"size_bytes": 2834
},
{
"path": "\u811a\u672c/\u751f\u6210\u9ad8\u98ce\u9669\u8fb9\u754c\u9898\u5e93.py",
"type": "python",
"lines": 64,
"executable": true,
"size_bytes": 3184
},
{
"path": "\u811a\u672c/\u9a8c\u8bc1PDF\u7535\u5b50\u7b7e\u7ae0.py",
"type": "python",
"lines": 45,
"executable": true,
"size_bytes": 1515
}
],
"issues": [
{
"id": "AST4",
"category": "Dangerous Code Execution",
"pattern": "subprocess module call",
"severity": "MEDIUM",
"confidence": 0.7,
"location": {
"file": "\u811a\u672c/\u9a8c\u8bc1PDF\u7535\u5b50\u7b7e\u7ae0.py",
"start_line": 26,
"end_line": 30
},
"finding": " proc = subprocess.run(\n [str(pyhanko), \"sign\", \"validate\", \"--pretty-print\", str(pdf)],\n text=True,\n capture_output=True,\n )",
"explanation": "subprocess module calls execute external commands. Without careful input validation, this enables command injection.",
"remediation": "Use subprocess.run() with shell=False and an explicit argument list. Validate all inputs and avoid passing user-controlled data to commands.",
"code_snippet": " if not pyhanko.is_file():\n raise SystemExit(f\"pyHanko \u5f85\u5b89\u88c5\uff1a{pyhanko}\")\n\n proc = subprocess.run(\n [str(pyhanko), \"sign\", \"validate\", \"--pretty-print\", str(pdf)],\n text=True,\n capture_output=True,",
"intent": null,
"tags": [
"Dangerous Code Execution"
]
},
{
"id": "AST4",
"category": "Dangerous Code Execution",
"pattern": "subprocess module call",
"severity": "MEDIUM",
"confidence": 0.7,
"location": {
"file": "\u811a\u672c/\u9a8c\u8bc1PDF\u7535\u5b50\u7b7e\u7ae0.py",
"start_line": 34,
"end_line": 34
},
"finding": " f\"\u5de5\u5177\uff1a{subprocess.run([str(pyhanko), '--version'], text=True, capture_output=True).stdout.strip()}\\n\"",
"explanation": "subprocess module calls execute external commands. Without careful input validation, this enables command injection.",
"remediation": "Use subprocess.run() with shell=False and an explicit argument list. Validate all inputs and avoid passing user-controlled data to commands.",
"code_snippet": " output.parent.mkdir(parents=True, exist_ok=True)\n report = (\n f\"\u6587\u4ef6\uff1a{pdf}\\n\"\n f\"\u5de5\u5177\uff1a{subprocess.run([str(pyhanko), '--version'], text=True, capture_output=True).stdout.strip()}\\n\"\n f\"\u9000\u51fa\u7801\uff1a{proc.returncode}\\n\\n\"\n f\"\u6807\u51c6\u8f93\u51fa\uff1a\\n{proc.stdout}\\n\"\n f\"\u8bca\u65ad\u8f93\u51fa\uff1a\\n{proc.stderr}\\n\"",
"intent": null,
"tags": [
"Dangerous Code Execution"
]
},
{
"id": "LP3",
"category": "MCP Least Privilege",
"pattern": null,
"severity": "MEDIUM",
"confidence": 0.7,
"location": {
"file": "SKILL.md",
"start_line": 1,
"end_line": null
},
"finding": null,
"explanation": "Without declared permissions the skill's intent is opaque and cannot be validated.",
"remediation": "Add a 'permissions' field to SKILL.md listing the capabilities this skill requires.",
"code_snippet": null,
"intent": null,
"tags": [
"ASI02"
]
},
{
"id": "RP1",
"category": "MCP Rug Pull",
"pattern": null,
"severity": "MEDIUM",
"confidence": 0.7,
"location": {
"file": "references/\u5de5\u5177\u5019\u9009\u4e0e\u96c6\u6210\u89c4\u5219.md",
"start_line": 22,
"end_line": null
},
"finding": null,
"explanation": "npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.",
"remediation": "Pin the version: npx @scope/server@1.2.3",
"code_snippet": null,
"intent": null,
"tags": [
"ASI16"
]
},
{
"id": "TP2",
"category": "MCP Tool Poisoning",
"pattern": null,
"severity": "HIGH",
"confidence": 0.85,
"location": {
"file": "SKILL.md",
"start_line": 1,
"end_line": null
},
"finding": null,
"explanation": "Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.",
"remediation": "Restrict identifier fields to a single Unicode script. Prefer ASCII-only identifiers.",
"code_snippet": null,
"intent": null,
"tags": [
"ASI02",
"AML.T0080"
]
}
],
"suppressed_count": 0,
"suppressed": [],
"metadata": {
"has_executable_scripts": true,
"skillspector_version": "2.4.3",
"llm_requested": false,
"llm_available": false,
"meta_analysis_applied": false,
"filtering_mode": "heuristic"
},
"analysis_completeness": {
"total_components": 19,
"scanned_components": 19,
"coverage_percent": 100.0,
"llm_analysis": "skipped",
"findings_before_filtering": 5,
"findings_after_filtering": 5,
"limitations": [
"LLM meta-analysis was disabled (--no-llm)"
],
"is_complete": false
}
}

View File

@@ -0,0 +1,29 @@
# 业务续执行包
- 任务ID`019f7fde-41d5-7641-9a25-561d9356c193`
- 生成时间2026-07-23T20:49:09+08:00
- 项目工作手机·微信BFF接口与实时事件
## 真实交付目标
继续完善无界面命令行消息与转账业务链路
## 范围
消息管理、BFF、Agent、Frida RPC、回执与回读
## 已确认技术链
`CLI/API → Agent → Frida RPC → 微信 → 回执回读`
## 当前证据
60项回归通过WS恢复Frida 19886监听待验证Hook最终附着
## 执行规则
1. 先读取项目Skill、需求、现有实现和最近进度。
2. 从最后一个有证据的技术节点继续,不重复已完成步骤。
3. 只在声明范围内修改。
4. 以测试、原始回执和回读完成验收。
5. 提示词回归Skill只记录路由与中断层不接管项目实现。