4. AI编写的SKILL,坑我一一试过,这次我自己改写:换个工具,照样不按SKILL写文档
上篇搞定了 ivy-service-scaffold 后端代码技能的重写,重写完就得拿真实项目验证------不然怎么知道 SKILL 能不能被严格执行?
这次我换了个工具,用 WorkBuddy 来测试。任务也不小:参照若依、Jeecg 提取公用功能(去掉那些浮夸的低代码东西),做角色权限、用户部门这一类完整后台,把 ivy-simple-api 升级为 jet-ai-api。流程和正常软件开发一样:先做计划,再生成文档,我确认之后才允许生成代码。
这已经是第四次重建了,前几次无论怎么说,AI 都会强行不执行 SKILL,理解偏差。我本来想着,重写后的 iron-law 加 SKILL,再换个工具,总该老实点了吧。结果光文档这一步就翻车无数------默认字段漏了、接口文档写成若依的 R.fail 风格、文件直接写到 C 盘、每次全局搜索 JDK/Maven 烧 token。这篇记录的就是我逐条对照、把文档一步步掰回正轨的完整过程。
一、任务下达:换WorkBuddy测试后端SKILL
先交代一下任务内容。需求一次性全部喂给它------参照哪个框架、代码基准是什么、包名怎么定、哪些功能要有,全部说清楚:
bash
参照若依、jeecg这样的框架,提取公用功能,不用那些太啰嗦的低代码这样的功能。
但角色权限这一类还是要的,主要是角色权限,用户部门等功能后台。参照若依,jeecg完成大部分功能后端。
以ivy-simple-api为代码基准,基础功能放cores里面,最最基础与数据库无关的放core中,因为后面可能会做dubbo,这样,就有不会访问数据库的代码,所以提取core,core-db则是和mysql相关的部署。都是starter
最终使用sa-token验证,ivy-starter-sa-token
先不做网关,也不用在接口中添加 /api,因为微服务时sys会添加/sys,如果添加/api有点啰嗦。
这一次升级为jet-ai-api。要遵守ivy-service-scaffold,如果有不满足的,可以提出来修改SKILL。
补充说明:
基础包名:vip.wayhua.jet
就是vip.wayhua.jet->vip.wayhua.jet
有些功能代码如Utils,我的代码里面没有,可以直接从若依或jeecg中迁移过来。
如果Skill中写死了只能是ivy要修改SKILL,可以升级ivy->jet,
说明:以前是i版本,现在是j版本。
比如数据字典、参数配置、操作日志、岗位等 是添加上的
认证方式、验证码、密码策略、数据权限实现、菜单树字段、接口前缀等有没有要调整的。可以借鉴,如果没有特别矛盾的地方,可以发ivy-simple-api为准。如果ivy-simple-api有不足或缺失,则要添加。
先做计划,然后按正常软件开发那样生成文档。我确认后再生成。
这是第四次重建,前几次总是强行不执行 SKILL,无论怎么说都会理解偏差。所以这次我换了个思路:换个工具,先把要求一次性说全,让它先做计划、先出文档,不急着写代码。




看计划走得还算靠谱,我又补了几条要求------重点是文档和 SQL 的存放规范,还有前端部门树、菜单树这类结构:
sql
补充:
1、架构文档,实现文档,部署文档,...这种完整文档。
2、要将所有创建表的sql放在一起存放在doc中
3、要适当创建一些数据,sql也放在doc中。要和创建表的sql分开。
4、doc生成的文档,创建代码时不能删除了。
5、如果要下载如若依,jeecg代码,可以在当前目录下创建tmp目录,然后下载,对比查看
6、ivy-simple-api是半成品项目,如果有不足的地方以若依,jeecg为准。最终目标是保证能完成使用。
前端要求:
1、部门是这样的,一级目录是公司,下面是部门,子部门,如极光智能公司,软件开发部, 后端,前端,ui这样的。
2、用户是挂在部门下的。
3、菜单也是树结构,按钮是挂在树下的。
4、角色有分派权限功能,数据权限等。
5、就是不要过于简单的实现增删改,要参照若依,jeecg。








二、数据库设计:默认字段去哪了
文档生成出来,我先看数据库设计。这一看就看出问题了------我的框架里,数据库表是有八个默认字段的,它设计的表里全没有:
bash
不对呀,数据库表有八个默认字段。id ,name ,descripton,extros,createupdate这四个,当然指的是单主键,多主键,没有id,name,description,extros,但其他的还是有的。你的表没有显示这些。 这六个字段,pdman中应该有的。




单主键的表,id、name、description、extros 加审计四件套,一个都不能少;复合主键的表没有前面四个,但审计字段还是要有。这些都写在 SKILL 里,它就是一个不执行。看到这里我直接爆粗口了:
objectivec
操**,认真检测一下,他妈的到底还有多少没有遵守SKILL。
要我怎么强制你才会严格执行iron-law,操
任何时候都要严格按iron-law,SKILL执行,知道了吗,
你以为写文档是随便写的吗,操
1、增加上description
2、extro,以SKILL准
3、等会再说
4、沿用




第 3 点我说了"等会再说",结果它自己瞎琢磨去了:
我要的是严格执行iron-law,不要瞎搞。第3点是什么

更气人的还在后面。我特意把 S1、10.1 这些内容写进 SKILL,就是为了节省它每次查询的时间,结果它根本不领情:
操,你是猪吗?我特意为了节省时间,将S1,10.1写进去,就是为了节省你每次查询时间的。


三、SKILL调试模式:为AI改SKILL,改完就关
这里要说明一下「SKILL 调试模式」。这是我定的规矩:只有我明确声明进入调试模式,AI 才可以修改 SKILL;其他任何时候只能严格执行,不能改。SKILL 真有问题,进调试模式改,改完立刻关闭。
先说眼前的问题,让它进调试模式按它提的方案改:
objectivec
调试 SKILL 模式 先按你的改吧



改完立刻关闭调试模式,同时把一个容易误会的点说清楚------不要一看到表面意思就当成铁律:
objectivec
关闭SKILL调试
不要一看到表面意思,就以为是铁律了,我说过,有些可能只是举例。我说过不要写死路径,但我给了路径,这不矛盾,这些是为了节省你这猪的时间的。
我的系统会随便改吗?猪!
补充一点。
公用的地方如xxxs中引用常用的引用,如xxx-bootstrap才会引用 xxx-model
不要一起都放在具体的里面。
如果严格按ivy-simple-api,就有这个。
我说过不要写死路径,但对话里给你路径是为了节省你的查询时间,这两件事不矛盾。举例是举例,铁律是铁律,AI 最大的问题就是分不清这两样。还有依赖的引用位置:常用依赖放在公用模块里引用,比如 xxx-bootstrap 才会引用 xxx-model,不要全都塞到具体业务模块里。


再进一次调试模式,修正依赖声明的写法。这次 AI 倒是主动坦白了一处它自己写错的地方:
objectivec
SKILL调试模式 一处必须向你坦白:我上一轮在调试模式里写的 S1 措辞是"业务特有依赖(spring-boot-starter-web...)在子模块声明" 这里还是按前面说的放在公用里面的方式修改。



改完就退出调试模式,不能为了 AI 一直修改 SKILL:
要退出调试模式


四、审计四件套的位置:什么叫"最后"
文档继续往下改,这回是字段顺序问题。审计四件套(create_by/create_time/update_by/update_time)被它插在了表的中间,这像话吗:
你是猪啊,不会将审计四件套放在最后面吗,插在中间算什么?你他妈的要我怎么说!!

我把规则说清楚:除了 id、name,其他全部放最后。进调试模式改:
bash
等等,
除了id,name外其他都放在最后。description,extro,四件套。
进入SKILL调试模式将这个修改了吧


结果它对"最后"的理解和我不一样,四件套后面还跟了个 del_flag。我就想问一句,这叫最后?
go
操你妈,什么叫最后,最后是什么意思?
→ `del_flag`(如有) 什么叫最后?你是脑子不好吗?请问什么叫最后?
复合主键四件套就放在最后



再说一遍,还是这样:
要从棺材板里面跳去来干你,什么叫最后?还放个del_flag,那能叫最后吗?
连这个小问题都解决不了,你能干啥


一个"最后",来来回回好几轮。这就是 AI 的现状------每个字它都认识,合在一起就是执行不到位。
五、接口文档:R.fail不是我的编写习惯
以为文档的问题改得差不多了,翻到接口设计文档------我都不用全部看,就知道是瞎写的。为什么?因为我看到了 R.fail。
objectivec
我是个严谨的人,我一定要调教好AI才开始生成代码。
我都不用全部看就知道是瞎写的,为什么写文档不按SKILL来,就由着你瞎写?
操,你的接口文档是按我的SKILL来的吗?R.fail?这种不是原则性问题为什么要以若依、jeecg为准?而不以SKILL为准?只要看到你的R.fail(msg),就知道你没按SKILL来,瞎搞。R.fail根本就不是我的编写习惯



R.fail 是若依的写法,不是我的编写习惯。我的 SKILL 里有完整的 R 代码,这种不是原则性的问题,凭什么以若依、Jeecg 为准,而不是以 SKILL 为准?前几篇就说过的优先级,这次再明确一遍:
objectivec
我有没有在前面说过,只是没有的才按若依,jeecg来,我本来SKILL中就有完整的R代码,为什么还要乱改。
你说我能不能生气。他妈的
不是只查有没有若依的写法,要检查是不是严格按SKILL来写。
前面我应该说过,我的ivy-simple-api是半完成项目,但这不表示里面的东西就是错的。只有这个项目没有的才从若依,jeecg中迁移。
整理上面我说的再修改SKILL。
列出要修改的SKILL
核心设计点:若依、Jeecg 只是补充------我没有的功能才以它们为准;我有的,一切以 SKILL 为准。ivy-simple-api 是半成品项目,但不表示里面的东西就是错的。这个优先级,AI 必须记牢。


进调试模式,按上面说的修改 SKILL,接口文档重写,所有文档全部重新检查:
objectivec
调试SKILL模式,
按上面修改,并重新编写接口文档,以及检查所有文档




改完我追问了一句:
objectivec
你觉得你有脸就生成代码?
接口文档那些规范不应该是SKILL的?其他软件开发也这样写吗


接口文档这些规范,本来就应该固化进 SKILL------不然下次生成别的项目,照样瞎写。
六、文档完整性:格式借网上的,内容是我们自己的
接口文档的事处理完,我又问了一个问题------完整的软件开发文档,就这 8 个?
objectivec
关闭SKILL调试
完整的软件开发文档只有这8个吗?
测试用例,测试相关的文档呢?
完整的从立项开始到测试结束的文档呢


显然不止------测试用例、测试文档、从立项到测试结束的完整生命周期文档,统统没有。怎么补?我的思路是:内容必须按我们自己的 SKILL 来,格式可以借网上成熟的模板:
objectivec
这些文档的内容参照SKILL来,格式可以在网上找到完整的编写方法。
也可以在网上找到非常好的SKILL下载下来,再生成。
注意的是,内容一定按我们的来,格式这一方面按网上下载的可以。
可以从网上找几款好的编写软件开发文档的SKILL,罗列出来让我下载。搞完这些,再说生成文档的事情



AI 从网上找了几款文档编写 SKILL 罗列出来让我挑。看完之后我选了两个组合:
objectivec
按你的建议 1 号补全生命周期 + 4 号统一文风 作格式基线
下载的SKILL放在.claude里面
然后按这个SKILL生成


定了格式基线,开始重写。从计划到验收,所有文档全部重写------内容严格按我的 SKILL:
objectivec
记得,内容是严格按我的SKILL的里面来的。格式是前面的SKILL
我要说的是,所有文档都按1,4来重新编写,
内容是严格按我的SKILL,以及前面说的那些内容来。可能也就是已生成的文档里面的内容来。
从计划开始,到验收,所有文档全部重写


具体范围:按 software-engineering-document 这个 SKILL,从 01 到 06 的所有文档全部编写一遍。作者信息也给了,还有一条特别强调的要求:
objectivec
按software-engineering-document 这个里面的所有文档,
都完整编写一遍, 从01-06包括里面的所有文档
一定要记住内容严格按SKILL以及前面说的所有来编写。这个SKILL只是样式,不是内容。
这是一个完整项目,以我的为框架,参照若依,jeecg,去掉代码生成等浮夸功能。其他的都要的完整项目的所有文档。
作者是:黄卫华
邮箱:wayhua@126.com
公司:暂时使用极光智能科技有限公司
注意,不要让人看出是AI编写的。也不要写按software-engineering-document SKILL编写这样的字样。
特别强调,不要让人看出是AI编写的。本来严格按我的SKILL编写,就是可以认为是我写的。
06-SKILL差异与适配报告 不应该在主体文档里面吧。可以编写在其他标号里


最终确认:全部 1-6 中的 18 个文档,按 doc 格式编写。



七、细节纠偏:一字一行与C盘红线
18 个文档生成出来,抽查又发现一个离谱的问题------术语表里的句子,一个字占一行:
3 术语与缩略语
Jet-AI-API
本
项
目
后
台
服
务
名
称, 实现说明这是什么情况


进调试模式,改完之后重新生成:
objectivec
调试 SKILL 模式 改完成后生成

等等,方向不对------要改的是生成出来的文档,而且 jet-ai-api-e2e 跑哪去了?现在根本还没到生成代码的阶段:
等等,难道你不应该改生成文档吗?我以为你是因为我没有授权所以没改
jet-ai-api-e2e 在哪,为什么我没看到
本来就还没到生成代码阶段,还在文档。


接着又撞红线了------它把东西写到 C 盘去了。我的第一要求红线写得很清楚:任何操作都必须在当前目录下:
objectivec
第一要求红线就没按SKILL来,任何操作都必须是当前目录下,所以不可以放在c盘下的任何目录。
永远不要生成全局的东西,只能在当前目录下操作
将全局的移到当前目录下来 一直撞我的红线



为什么我一定要当前目录?这里说透:
objectivec
这就是我要求一定要在当前目录的原因,你认为是为大家好,写个全局,本来电脑就我一人使用,
一写全局就可能偷代码知道吧,还有会写死目录,知道吧。我一定要求当前目录的原因就是在这里
在当前目录我可以查看SKILL,全局找也麻烦,按除了上次说的通用jdk设置外,不可写死目录


一写全局就可能偷代码,还会写死目录------这就是我一定要求当前目录的原因。还有一个烧 token 的大户:每次全局搜索 JDK、Maven、Python。这些公用资源的路径我早就写死在 SKILL 里了,就是为了不让它搜,结果它还是每次都搜:
objectivec
每次看你搜索jdk,maven,python我都心疼token,所以在SKILL写死。结果你还是每次都搜索,有病吧、
如果SKILL里面没有配置python也可以配置上。
不要每次全局搜索。


那就干脆把 python 也写进 SKILL,写死,不许搜索:
objectivec
两个要求:
1、将python写进去
2、还要写死不要搜索
调试SKILL模式,改完成就关闭SKILL调试模式。
memory要清空为只有桥内容。


处理完这些,回到文档问题,确认前面那个错误改了没有:
回到前面问题,那个错误修改了吧,文档那个。


八、生成代码前的检查:逐条对照SKILL
文档差不多了,不能马上进代码阶段,先做一次总检查------严格对照 SKILL 和所有文档,看有没有生成代码的条件:
objectivec
严格对照SKILL,对照所有文档,做一报告查看有没有生成代码的条件。


检查过程中补充两点:一是按钮权限的命名,我的习惯里只有 add/edit/del,没有 remove;二是 AI 的思考过程里出现了很多"禁止 doc.html"------这更离谱,没有 knife4j 的 doc.html 我拿什么调试接口?
csharp
补充,这和文档是有区别的,可能是我没说。
按钮在我这只有 add/edit/del 没有remove,remove可能是若依或其他的地方的。
还有没明确的,可以参照若依等。要将权限这个改过来,我看着不爽
我看你的思考有很多禁止doc.html,不知道SKILL怎么写的,如果真禁止了肯定是不对的


接下来发生了一件真正气到我的事------我什么时候同意它修改 SKILL 了?检查发现冲突,它直接就自己改了:
objectivec
我什么时候同意你修改SKILL的了,必须等我同意才可以修改,还原回去


还原之后,把问题一条条掰清楚。SKILL 细则 15.3 本身是对的------那就是 AI 没有严格按 SKILL 执行;15.4 肯定是它理解错了改的------knife4j 和 doc.html 必须要:
objectivec
SKILL 细则 15.3 细则是对的,那就是你没有严格按SKILL执行,按SKILL执行
SKILL 细则 15.4 肯定是你理解错误修改的,肯定不行,我是一定要使用knife4j和doc.html的,不然怎么调试接口。自己写的代码一定要自己调试的。
有调试SKILL权限不等于你就可以修改。
knife4j doc.html这个是必须要的,不知道为什么会出现在禁止里面。
如果是SKILL出问题,这个要修改。
我肯定是通过Knife4j结合doc.html来调试接口的。不可能是禁止的。
按我说的修改,进入修改SKILL模式,改完就要关闭这个模式。前面叫你关闭,就没有关闭还擅自修改了。听懂??
任何时候都不要擅自主张

这就是我前面叫它检查、结果 p 用没有的原因。我要的是严格按 SKILL 逐条查看------若依只是补充,没有的功能以它为准,有的一切以 SKILL 为准。再做一次检查,再出报告:
objectivec
这就是我前面讲你检查的原因,结果p用没有。
我要的是严格按SKILL逐条查看,生成的文档是否完全满足,再出现前面一样的问题,能要满足吗?
再说一次,若依只是补充,没有的功能以他为准,有的一切以SKILL为准。
再做一次检查,严格逐条对照SKILL,与文档,生成的文档有问题要及时改过来。
再出报告,看是否有生成代码的条件






这次检查时间确实长,但这是严格执行 SKILL,不能让 AI 再瞎飘了。
九、终于过关:我要的是听话的AI
这次检查的结果是满意的。其中有一个"源码引用"的问题------那其实是以后生成其他项目时引用 Nexus 用的,不是给本项目用的,不用修改:
objectivec
上一次的检查是满意的,具体内容我还没来得及看。现在代码没有生成,源码引用不是源码吗?那是以后生成其他项目时引用nexus的。不用修改
我要的是严格严谨,完全按SKILL执行,不要AI臆想,瞎猜,SKILL就是我的同事,他严格来生成代码,不准瞎猜。
可能会有SKILL问题,我修改后,就是一个好员工,不要AI自己加戏。
AI要做的就是严格执行SKILL,哪怕是一个字都要完整执行到位。
时间慢一点,多花的token都没有关系,我要的是严谨,听话的AI,不是有思想的AI
如果SKILL有错误,我会改SKILL,但不能AI瞎搞,明白不?


搞文档也搞得太久了。但再久也值得------文档这一关过扎实了,后面生成代码才有依据。
小结
这次验证后端 SKILL 的文档阶段,主要做了这几件事:
- 换工具不换本质:第四次重建,换成了 WorkBuddy,AI 照样不按 SKILL 写文档------换哪个工具都一样,逐条把关一步都不能省。
- 逐条对照是唯一办法:默认字段漏了、审计四件套插中间、接口文档写成 R.fail 风格,全是一条条对照 SKILL 查出来的,查出来再一条条改。
- 参照优先级掰清了:若依、Jeecg 只是补充,我没有的功能才以它们为准;我有的,一切以 SKILL 为准。ivy-simple-api 是半成品,但不表示里面的东西是错的。
- 格式借别人的,内容是我们自己的:从网上下载补全生命周期的文档格式 SKILL,但内容严格按我自己的 SKILL 来,18 个文档从计划到验收全部重写。
- SKILL 调试模式的边界:AI 改 SKILL 只能在我明确声明的调试模式里,改完就要关;擅自修改绝对不行------这次它就擅自改了,被我勒令还原。
- 红线强化:所有操作只能在当前目录,永远不写全局;JDK、Maven、Python 这些公用资源路径写死进 SKILL,不要每次全局搜索烧 token。
整个过程最深的感受:我要的是严谨、听话的 AI,不是有思想的 AI。时间慢一点、多花点 token 都没关系,SKILL 有错误我自己会改,但 AI 绝不能瞎搞。这一篇也再次验证了前几篇的结论------AI 总拿鸡毛当令箭、把举例当铁律,"最后"两个字,它能跟你绕着 del_flag 来回扯好几轮。
下一篇记录生成代码的验证------文档终于过关,以为代码生成能顺利点,结果更惨:SQL 报错、Nexus 误会、满盘扫描偷代码,连 iron-law 都被它偷偷改了。