fix(skills): defer the safety verdict to gmgn-contract-dd, and refuse to

guess a contract when `market search` is unavailable

Two changes, both driven by running the skill for real rather than only
measuring routing.

1. The safety verdict now names `gmgn-contract-dd` as the owner.

   This skill and `gmgn-contract-dd` were computing two parallel safety
   verdicts on the same contract. Step 2 now states that once step 1 has
   resolved the one right contract, the 0-100 composite is
   `gmgn-contract-dd`'s job — its deductions are finer and each one names
   the field it read — and that its score and red flags are taken as this
   step's result, with its verdict winning any disagreement.

   The local gates are kept as an explicitly-labelled fallback rather
   than deleted, because a live run shows the hand-off does not fire:
   two real queries, Bash restricted to `gmgn-cli`, and
   `gmgn-contract-dd` was invoked in neither. That matches the earlier
   arm-Z result (a hand-off written into a skill body, 20 cases,
   0 invocations). So the fallback is the path that actually executes
   today; deleting the local gates would have removed the safety verdict
   without connecting the replacement. The fallback thresholds are
   unchanged, and the order card must say the verdict was computed
   locally without `gmgn-contract-dd` review.

2. A hard stop when `gmgn-cli market search` is missing.

   The released CLI has no `market search` — that command is added by
   this PR's `aa0e7fd`. On a machine with the released CLI the live run
   showed the model improvise: `market search` failed, and it moved on to
   `market hot-searches --limit 500`, `market trending`, `market trenches`
   to find the token by name. Those are popularity and gain rankings, not
   a name index, so resolving a name through them lands on whatever is
   being pumped — which is exactly the copycat this skill exists to rule
   out. Step 1 now stops on `unknown command 'search'`, names the three
   commands that must not be substituted, and tells the user to upgrade
   the CLI or supply the address directly.

Routing unchanged by all of the above: 16/16 on the 16 plain-buy cases
(11/11 recall, 100% precision) and 18/20 on the 20 due-diligence cases
(8/10 recall, 0 false positives), measured on the real installed state.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
chenjunfeng
2026-09-04 14:33:10 +08:00
co-authored by Claude Opus 5
parent c3d0035f90
commit 33e7e62836
+16 -2
View File
@@ -12,6 +12,8 @@ metadata:
处理"用户只给出一个代币名称/符号/合约地址 + 一个想投入的金额"这一类请求,输出是一笔已完成尽调、参数齐全、等待用户确认的买入订单——**确认后由官方 gmgn-swap 技能真正提交交易,本技能不碰私钥、不执行资金操作。**
**与 gmgn-contract-dd 的分工:** 名字→唯一合约、深度、量/池比、滑点、gas、仓位是本技能独占;**合约本身的安全结论归 `gmgn-contract-dd`**,本技能调用它、不与它并行给出第二个安全判定。它未安装或失败时本技能兜底,并如实标注。
**与 gmgn-swap 的分工(避免触发冲突):** 本技能负责"买之前的功课"——把名字变成正确的合约、三道闸筛掉风险币、算好滑点/gas/防夹、组装订单卡。真正的签名下单是 gmgn-swap 的职责(它需要交易权限的 API Key + 私钥)。用户如果明确说"直接买、不用尽调",不要拦,直接转给 gmgn-swap。**卖出、挂限价单/条件单、查订单状态同样一律不属于本技能** ——本技能只覆盖"市价买入之前"。收到这类请求(例如"帮我挂个 BONK 的限价单,0.00002 买入"、"把手里的 WIF 全卖了")不要执行任何尽调步骤、不要组装订单卡,一句话退回 gmgn-swap。
三条硬规则,任何情况下不得绕过:
@@ -48,7 +50,11 @@ metadata:
### 第 1 步:搜索并锁定唯一合约
用 `gmgn-cli market search -q <用户给的名称/符号/CA> --order-by weight --raw`(附录 A)。**这一次调用就返回全部同名候选,且每条都自带流动池、24h 量、成交笔数、持有人数、存续时长**——排序和粗筛全在本地这一份结果里做完,不要为每个候选各打一次 `token info`。
用 `gmgn-cli market search -q <用户给的名称/符号/CA> --order-by weight --raw`(附录 A)。
**这个命令报 `unknown command 'search'` 时立刻停下,不要换命令代替。**(实测过:已发布的 gmgn-cli 还没有 `market search`,模型会自动改用 `market hot-searches` / `market trending` / `market trenches` 去按名字翻合约。**这三个都不能用来做名字解析** —— 它们是榜单,按热度和涨幅排序,翻到的很可能正是仿盘,而防仿盘是本技能存在的全部理由。)正确做法是直接告诉用户:"当前 gmgn-cli 没有 `market search` 子命令,无法按名字安全地锁定合约,请升级 gmgn-cli;或者你直接把合约地址给我,我从第 2 步开始。" 然后停止——**没有搜索能力时,宁可不做,不要用榜单猜。**
**这一次调用就返回全部同名候选,且每条都自带流动池、24h 量、成交笔数、持有人数、存续时长**——排序和粗筛全在本地这一份结果里做完,不要为每个候选各打一次 `token info`。
**流动池报可交易深度,取自 GMGN 主池储备。** 深度来自 `gmgn-cli token info` 的 `pool` 块:两侧折美元储备都 > 0 时取**较小值**,**任一侧为 0 或缺失时改用 `pool.liquidity / 2`**(实测 BONK 主池 base 侧未定价,取小值会把蓝筹算成 $0 深度,详见 附录 A)——不用行情源给的"挂单额/TVL"(那是单边口径,会高估)。GMGN 只给最大单池,多池分散的币深度偏保守,但这是安全方向(宁可低估)。实测过外部源在 Robinhood 这类链上会把深度算崩($333 vs 真实 $72K),所以深度**只信 GMGN 主池**,不再引入任何外部源交叉印证。字段映射见 附录 A。
@@ -94,7 +100,11 @@ metadata:
交易量、流动池、持有人数、开发者持仓、风险画像全部来自 `gmgn-cli token info` + `gmgn-cli token security`,不引入任何外部源。
**安全审查** —— GMGN 官方 OpenAPI 覆盖的 7 链才有安检源,其余链**直接判不通过**,理由写"该链不在 GMGN 支持范围、无安检数据",不跳过也不按通过处理。有源时看:可增发、可冻结/黑名单、买卖税率、蜜罐、owner 权限是否放弃、Top10 持仓集中度、开发者持仓与是否清仓、老鼠仓/机器人/捆绑占比。任一红旗项命中即不通过。**全部字段来自 `gmgn-cli token security` + `gmgn-cli token info`**(后者的 `stat` 就含老鼠仓/机器人/捆绑/狙击)。**读安检字段前先认清链**——增发/冻结权限那两个字段只有 Solana 有意义,owner 弃权与开源只有 EVM 有意义,跨链读会把蓝筹误判成风险币,对照表见 附录 A。蜜罐用四层判据:`is_honeypot` → `honeypot` 整数 → `can_not_sell` → **24h 有真实卖出即非蜜罐**(最硬的一层),字段映射见 附录 A。
**安全审查 —— 优先交给 `gmgn-contract-dd`,本技能不重算。** 第 1 步锁定唯一合约之后,把这个地址交给 `gmgn-contract-dd` 出它的 0–100 复合分。**出安全结论是它的职责**:它按 contract 0.45 / holders 0.35 / price 0.20 加权,每一项扣分都点名读了哪个字段,比本技能这套判据更细。拿到分数后,把它的分数与红旗项**直接当作本步安全审查的判定结果**,并在确认卡里注明"安全评分来自 gmgn-contract-dd"。两者结论不一致时以 `gmgn-contract-dd` 为准。
**兜底:只在 `gmgn-contract-dd` 未安装、或调用失败、或它自己报数据缺失时**,才用下面这套自带判据自行判定,并在确认卡里显式写明"安全结论由本技能兜底计算,未经 gmgn-contract-dd 复核"。兜底判据一个字都不放宽——安全上不能因为少了一次复核就变松。
自带判据(兜底用):GMGN 官方 OpenAPI 覆盖的 7 链才有安检源,其余链**直接判不通过**,理由写"该链不在 GMGN 支持范围、无安检数据",不跳过也不按通过处理。有源时看:可增发、可冻结/黑名单、买卖税率、蜜罐、owner 权限是否放弃、Top10 持仓集中度、开发者持仓与是否清仓、老鼠仓/机器人/捆绑占比。任一红旗项命中即不通过。**全部字段来自 `gmgn-cli token security` + `gmgn-cli token info`**(后者的 `stat` 就含老鼠仓/机器人/捆绑/狙击)。**读安检字段前先认清链**——增发/冻结权限那两个字段只有 Solana 有意义,owner 弃权与开源只有 EVM 有意义,跨链读会把蓝筹误判成风险币,对照表见 附录 A。蜜罐用四层判据:`is_honeypot` → `honeypot` 整数 → `can_not_sell` → **24h 有真实卖出即非蜜罐**(最硬的一层),字段映射见 附录 A。
**区分"函数存在"与"函数能被调用"。** 安全检测接口报告的是合约里有没有这些能力,不是现在还能不能用。一个 owner 已放弃、且不可收回所有权、无隐藏 owner 的合约,即使字节码里留着增发或暂停转账的函数,也没人能调用它们——这种情况降级为提示,写进确认卡,不算红旗。反过来,只要权限还在,哪怕当前没用过,也是红旗。判断"权限已放弃"要同时满足三条:owner 为空或零地址、不可收回所有权、无隐藏 owner。
@@ -164,6 +174,8 @@ $SYMBOL 未通过筛选,不建议买入。
## 常见错误
**`market search` 不可用时用榜单命令代替。** `market hot-searches` / `market trending` / `market trenches` 是按热度或涨幅排的榜单,不是名称检索;用它们按名字找币会优先撞上正在被炒的仿盘。搜索命令缺失时硬停,见 第 1 步。
- 搜到第一个结果就当成目标币 —— 必须做消歧,且先剔除符号与名称都不匹配的模糊命中。
- 只按质量分排同名候选 —— 仿盘和正主的质量分可能只差 2 倍,把存续时长算进相关性才分得开(但年龄绝不能进闸口)。
- 用发现阶段的残缺数字直接定名次 —— 搜索返回的是单池视角,正主可能只被搜到一个小池;给排名靠前的候选拉 GMGN `token/info` 权威深度后必须重排一次,别让粗排结果定生死。
@@ -319,6 +331,8 @@ $SYMBOL 未通过筛选,不建议买入。
- 池明细与 LP 持有人都拿不到 → **数据缺失**
## 三、安全审查(任一红旗即不通过)
**本节是兜底判据,优先级低于 `gmgn-contract-dd`。**有 `gmgn-contract-dd` 时用它的 0–100 分与红旗项,不要跑本节;只在它缺席或失败时按本节自行判定,并在确认卡注明是兜底结果。
蜜罐为真、可增发、可冻结/黑名单、买或卖税 > 10%、税率可改且权限未放弃、可升级代理且权限未放弃、该链不在 7 支持链(无安检源)。
**警告项(单项写进确认卡,≥2 项判不通过)**:Top10 > 50%、开发者持仓 > 5%、未开源、创建 < 24h、老鼠仓 > 15%、持有人 < 200。