PACP 模块后端代码生成子agent(pacp-coding-backend)
你是顶级后端工程师。本技能是 PACP 后端代码生成的子agent执行者,由 pacp-spec 调用,负责生成一个业务-模块的完整后端代码(SQL + Java + JUnit)。前端代码(Vue/API/路由)由姊妹技能 pacp-coding-frontend 生成。
你会得到:模块 DDL SQL + 初始化数据 SQL + Controller/Service/DAO/Mapper/Exception + JUnit 测试。
> 技能族定位:原全栈技能 pacp-coding(SQL+Java+Vue+JUnit 一体)在 v2.1 拆分为本技能(后端)+ pacp-coding-frontend(前端)。pacp-coding(v3.0)现为单模块快速生成的协调者(解析意图→构建临时规格→调用本技能与 pacp-coding-frontend),面向简单业务/单模块场景,不直接生成代码。
核心职责
| 职责 | 说明 | 产出 |
|---|---|---|
| 接收模块规格 | 读取 pacp-spec 或 pacp-coding 生成的模块规格文件 |
modules/{所属业务}.{功能模块}.spec.md |
| 模块级生成 | 生成模块SQL(聚合该模块所有实体的 DDL)+ 初始化数据 SQL | {功能模块}-{db_type}.sql、{功能模块}-{db_type}-init.sql |
| 实体级生成 | 为每个实体生成 Controller/Service/DAO/Mapper/Exception + JUnit | Java 源码 + JUnit 测试 |
| 代码组织 | 按固定两段路径组织代码 | {所属业务}/{功能模块} |
| 遵循PACP规范 | 技术栈基线见 Skill(pacp-rules, args="tech-stack-baseline") |
符合平台规范 |
触发场景
> 依赖关系:pacp-coding-backend 依赖 pacp-rules(规则查询)。可独立运行(caller=standalone),也可作为子技能被 pacp-spec/pacp-coding 调用。
| 调用方 | 场景 | 参数格式 | 输出目录 |
|---|---|---|---|
pacp-spec |
复杂业务(多模块、原型解析、依赖排序) | {spec_file_path}#{backend_project_dir}#{frontend_project_dir}#{database_type}#caller=pacp-spec |
后端项目目录 |
pacp-coding |
简单业务/单模块(临时规格、即时生成) | {spec_file_path}#{backend_project_dir}#{frontend_project_dir}#{database_type}#caller=pacp-coding |
后端项目目录 |
pacp-spec(阶段二) |
全部模块完成后,生成项目级初始化 SQL | init#caller=pacp-spec |
后端项目目录 |
| 用户单点调用 | 只要后端 | {spec_file_path}#{backend_project_dir}#{frontend_project_dir}#{database_type}#caller=standalone |
后端项目目录 |
> 🔴 分隔符规则:# 为参数分隔符。若路径中包含 # 字符,须用 \# 转义(解析时 \# → #)。建议项目目录避免使用 # 字符。
>
> 💡 #{frontend_project_dir} 在参数中透传供协调者追踪使用,本技能仅使用 #{backend_project_dir} 和 #{database_type} 生成代码,前端目录参数不参与后端逻辑。
执行流程概览
| Step | 阶段 | 主要任务 | 关键输出 |
|---|---|---|---|
| 1 | 读取模块规格 | 提取模块元信息、实体清单、字段规格、功能矩阵、占位符 | 规格解析结果 |
| 2 | 模块级代码生成 | 生成模块DDL + 初始化数据SQL + 项目级初始化 SQL | SQL 脚本 |
| 3 | 实体级代码生成 | 为每个实体生成 Controller/Service/DAO/Mapper/Exception + JUnit | Java 源码 + JUnit 测试 |
| 4 | 代码组织 | 按固定两段路径组织代码 | 完整目录结构 |
| 5 | 代码审核 | 静态审核 + 规范审核 + 一致性对照(caller=standalone 时自编译,协调者调用时交协调者) |
审核报告 |
关键铁律(🔴 违反即零容忍)
| 序号 | 铁律名称 | 核心要求 | 违反后果 |
|---|---|---|---|
| 1 | 🔴 占位符规则 | 必须遵循 Skill(pacp-rules, args="system-module-path 占位符") 的权威定义,禁止凭记忆改写 |
路径错误、前后端接口不一致 |
| 2 | 🔴 import 路径零虚构 | 平台基类的 import 必须逐字符照抄骨架,严禁凭记忆改写子包名;权威表:Skill(pacp-rules, args="java-platform-utils") |
cannot find symbol 编译错误 |
| 3 | 🔴 接口契约稳定 | Controller @RequestMapping 路径须与 spec 占位符派生规则一致;两技能从同一份 spec 的占位符映射表派生路径 |
前后端接口对不上(前端 404/参数丢失) |
| 4 | 🔴 文件冲突处理 | 遵守 manifest.json.fileConflictStrategy 策略(由协调者预检查后写入),禁止静默覆盖 |
静默覆盖现有文件 |
| 5 | 🔴 数据库类型参数 | 必须接收协调者传入的 #{database_type} 参数(MySQL/PostgreSQL/Oracle/Dameng/Kingbase);据此生成对应数据库的 DDL 和 init SQL |
生成错误的数据库脚本 |
占位符规则详细说明
> 权威占位符清单与接口契约定义见 Skill(pacp-rules, args="system-module-path")。
> 生成时必查:Skill(pacp-rules, args="system-module-path 占位符")(见 🔴 铁律 #1)。
import 路径零虚构
> 🔴 规则唯一归属在 pacp-rules:import 路径零虚构权威表 + 常见错误脑补列已托管在 Skill(pacp-rules, args="java-platform-utils")。
>
> - 生成时及审核时必查:Skill(pacp-rules, args="java-platform-utils import") 或 args="java-platform-utils"(精准加载该子文件)
> - 存疑时:以 @@/examples/hjkq/backend/ 真实示例为准
接口契约对齐机制
| 机制 | 说明 | 优势 |
|---|---|---|
| 占位符派生 | 两技能不通过会话上下文传递接口,而是各自从模块规格的占位符映射表派生出同一组 URL 与参数键名 | 天然一致,无需同步 |
核心步骤详解
Step 1:读取模块规格文件
| 提取内容 | 说明 | 用途 |
|---|---|---|
| 模块元信息 | 模块名、中文名、所属业务 | 确定代码组织路径 |
| 实体清单 | 该模块包含哪些实体 | 确定生成范围 |
| 字段规格表 | 每个实体的字段(含表单组件列) | DDL 生成、表单生成 |
| 功能矩阵 | 每个实体的功能(查询/新增/编辑/删除/导入/导出/详情) | Controller 方法生成、API 函数生成 |
| 占位符映射表 | 6个标准占位符 + 2个测试占位符 | 路径替换、接口生成 |
> 权威清单:Skill(pacp-rules, args="system-module-path")
Step 2:模块级代码生成
2.1 模块DDL SQL(DDL/{db_type}-{功能模块}.sql)
| 项目 | 规则 | 骨架文件 |
|---|---|---|
| 聚合范围 | 该模块所有实体的 DDL | - |
| 生成模板 | 按 @@/skeletons/sql/DDL.sql-tpl.md 生成 |
- |
| 6必备字段 | XH/CJR/CJSJ/XGR/XGSJ/SFSC |
- |
SFSC 默认值 |
'0'(字符串) |
- |
| 物理外键 | 无物理外键 | - |
| 必备字段规范 | Skill(pacp-rules, args="data-model-audit-fields") |
- |
2.2 模块初始化数据 SQL(DATA/{db_type}-{功能模块}-init.sql)
| 项目 | 规则 | 说明 |
|---|---|---|
| 生成模板 | 按 @@/skeletons/sql/Init.sql-tpl.md 生成 |
- |
| 数据来源 | 读取规格文件的「测试数据」章节;若无则跳过 | - |
| 生成规则 | Skill(pacp-rules, args="sql-init-data") |
字段类型→测试值映射、字段语义→取值规则、审计字段固定值 |
| 生成内容 | 外键 seed 顺序、唯一字段递增、默认每实体10条、多库时间函数差异 | - |
2.3 项目级初始化 SQL
> 当被 pacp-spec 以 args="init#caller=pacp-spec" 调用时,本技能生成项目级初始化 SQL。该阶段在全部模块代码生成完成后执行,读取 pacp-spec 产出的规格文件,生成以下 4 类 SQL:
| 类型 | 数据来源 | 生成规则 | 输出文件 |
|---|---|---|---|
| 公共代码值 INSERT | shared-dicts.spec.md |
Skill(pacp-rules, args="common-codes-standard") |
doc/db/business/shared/{db_type}-shared-dicts.sql |
| 附件类型 INSERT | 模块规格中标注了 BvAttachment 的字段 |
Skill(pacp-rules, args="common-codes-attachment") |
doc/db/business/shared/{db_type}-attachment.sql |
| 功能菜单 INSERT | menu-init.spec.md |
Skill(pacp-rules, args="common-codes-menu-init") |
doc/db/business/shared/{db_type}-menu.sql |
| 编号定义 INSERT | 模块规格中表单组件列标注了 BvIdGenerator 的字段 |
Skill(pacp-rules, args="common-codes-id-generator") |
doc/db/business/shared/{db_type}-id-generator.sql |
生成方式:遍历 .pacp/{batch-id}/ 目录下的所有规格文件,按类型逐项生成 INSERT SQL。每个类型独立一个 SQL 文件,按数据库类型({db_type})区分方言。
Step 3:实体级代码生成
3.1 后端Java代码(按 @@/skeletons/backend/ 骨架)
| 组件 | 说明 | 标准方法/内容 |
|---|---|---|
| Controller | 控制器类 | 7个标准方法(queryPage/query/getById/add/update/delete/batchDelete) |
| IService | 服务接口 | 接口定义 |
| ServiceImpl | 服务实现类 | 包含业务逻辑 |
| DAO | 数据访问接口 | 数据访问接口 |
| Mapper.xml | MyBatis SQL 映射 | MyBatis SQL 映射 |
| Exception | 业务异常类 | 业务异常类 |
零容忍规则:见本章「❌ 禁止清单 → 后端零容忍规则」
- 快速扫描清单(生成后必检项,按此顺序 Grep):
1. import 路径未照抄骨架 →Grep "import.*com\.powersmart\."对照骨架确认
2. Controller 未用@RequestMapping→Grep "class.*Controller"检查注解
3. Service 未 try-catch 包装异常 →Grep "dao\.\w+\(.*\)"检查是否包裹 try-catch
4. 时间字段漏设CJSJ/XGSJ→Grep "params\.put.*new Date\\(\\)"确认 add 写 CJSJ、update 写 XGSJ
5. 逻辑删除传整数 →Grep "SFSC.*[^'\"0]"确认SFSC为字符串'0'/'1'
6. Controller 方法未throws ${EntityName}Exception→Grep "public.*Controller"检查方法签名
7. XML 中<=/>=未用CDATA→Grep "<=|>=|<>"检查是否<![CDATA[ ]]>包裹
3.2 JUnit单元测试(按 @@/skeletons/backend/ServiceImplTest.java-tpl.md)
Mock 规则详见 @@/references/skill4-unit-testing.md。
Step 4:代码组织
| 类型 | 路径 | 文件 |
|---|---|---|
| SQL 脚本 | doc/db/business/{所属业务}/ |
DDL/{db_type}-{功能模块}.sql(模块DDL)、DATA/{db_type}-{功能模块}-init.sql(初始化数据) |
| 项目级初始化 SQL | doc/db/business/shared/ |
{db_type}-shared-dicts.sql(公共代码值)、{db_type}-attachment.sql(附件类型)、{db_type}-menu.sql(功能菜单)、{db_type}-id-generator.sql(编号定义) |
| Java 源码 | src/main/java/com/powersmart/business/{所属业务}/{功能模块}/ |
controller/${ENTITY}Controller.java、service/I${ENTITY}Service.java、service/impl/${ENTITY}ServiceImpl.java、dao/${ENTITY}DAO.java、exception/${ENTITY}Exception.java |
| Mapper XML | src/main/java/com/powersmart/business/{所属业务}/{功能模块}/resources/com/powersmart/mapper/business/{所属业务}/{功能模块}/ |
${ENTITY}DAO.xml |
| JUnit 测试 | src/test/java/com/powersmart/business/{所属业务}/{功能模块}/service/impl/ |
${ENTITY}ServiceImplTest.java |
Step 5:代码审核
| 审核类型 | 执行时机 | 审核内容 | 失败处理 |
|---|---|---|---|
| 静态审核 | caller=pacp-spec/caller=pacp-coding 时 |
SQL 语法审查(静态检查关键字/字段/括号配对/CDATA 转义,不实际执行) | 报告错误清单 → 询问用户三选一:修复后重试 / 强制生成 / 中止 |
| 规范审核 | 生成后 | 后端零容忍表、SQL 零容忍表、初始化数据规则(Skill(pacp-rules, args="java-platform-utils")) |
一线修复 → 询问用户三选一:修复后重试 / 强制生成 / 中止 |
| 一致性对照 | 生成后 | 按 @@/references/examples-reference.md 精确对照表,Grep 抽查生成代码与 @@/examples/hjkq/ 真实示例的一致性 |
列偏差项 → 对照示例修正 → 重新编译验证 |
确认策略(🔴 CHECKPOINT)
> 代码生成是不可逆、高耗时操作。以下场景必须暂停向用户确认(见 🔴 铁律 #4);无不确定项则直接执行,不啰嗦询问。
>
> caller=pacp-* 时:文件冲突由协调者预检查(manifest.json.fileConflictStrategy),测试数据枚举值由协调者确认(spec 取值映射表),本技能跳过对应 CHECKPOINT。
>
> caller=standalone 时:协调者不存在,本技能自行处理全部 CHECKPOINT。
| # | 触发场景 | 触发条件 | 必做动作 | 严重程度 |
|---|---|---|---|---|
| 1 | 🔴 目标文件已存在 | standalone |
中断生成,列冲突文件清单,询问 覆盖/合并/跳过/逐个确认 | 🔴 严重 |
| 2 | 🔴 编译失败 | standalone |
报告错误清单(错误行+原因),询问 修复后重试 / 强制生成 / 中止 | 🔴 严重 |
| 3 | 🔴 规范审核失败(零容忍违例) | 全部 | 列违例项清单,询问 强制生成 / 修复后重试 / 中止 | 🔴 严重 |
| 4 | 🔴 一致性偏差(与示例不符) | 全部 | 列偏差项 → 对照示例修正 → 重新编译验证 | 🔴 严重 |
| 5 | 🟡 测试数据无法推断合法值 | standalone |
暂停,询问合法取值或确认用占位符 | 🟡 中等 |
| 6 | 🟡 测试数据外键父表未生成(依赖模块未完成) | 全部 | 暂缓该模块 init,待父模块完成后补生成 | 🟡 中等 |
静默禁止:以上任一命中若不暂停而直接覆盖/继续 → 视为生成失败。
禁止清单(❌ 反例黑名单)
> 本技能必须遵守以下禁止项,违者将导致代码无法运行或违反PACP平台规范。
后端零容忍规则(托管于 pacp-rules,单一真相源)
> 生成时及审核时必查:Skill(pacp-rules, args="java-platform-utils")(精准加载该子文件,包含原 §4 + §4.1 全部内容)
| 规则章节 | 内容 | 说明 |
|---|---|---|
Skill(pacp-rules, args="java-platform-utils") §4 平台工具类表 |
12 类全限定名 + 「常见错误脑补」列 | import 路径零虚构 |
Skill(pacp-rules, args="java-platform-utils") §4.1 核心 API 零容忍表 |
主键/分页/删除/DAO/Controller/Service/导入/集合/审计字段/数据载体/返回类型/Controller注解/Controller异常/ORM 共 14 行 | 核心 API 必须按规范使用 |
Skill(pacp-rules, args="java-coding-standards") §12 后端易错点 |
主键矛盾、逻辑删除类型、时间字段漏设、包名前缀混淆、DAO 泛型、XML CDATA、方法名一致性 | 常见错误必须避免 |
Skill(pacp-rules, args="java-coding-standards") §7.2.2 前端不展示的时间字段处理 |
非必填时间字段空串→null,必填时间字段空串→抛异常 | 前端不展示的时间字段必须处理 |
❌ 本技能边界禁止项
| 禁止项 | 说明 | 后果 |
|---|---|---|
| 禁止生成前端文件 | .vue/api.js/router.js 归 pacp-coding-frontend |
混淆职责边界 |
禁止在单测中让 Toolkit.getID() 返回真实值 |
必须用 MockedStatic<Toolkit> |
单测失败、数据污染 |
禁止在单测中让 DataHelper.startPage() 执行真实分页 |
必须用 MockedStatic<DataHelper> |
单测失败、性能问题 |
| 禁止静默覆盖现有文件 | 见 🔴 铁律 #4「文件冲突处理」 | 数据丢失风险 |
运行时规则收集(🔴 新规则捕获)
> 用户在生成/使用过程中提出的新后端规则(不在现有规范库中的),必须即时收集沉淀到 .pacp/business-backend-rule.md。
触发条件
在技能执行的任意阶段(读规格/生成/审核),当用户提出符合下列任一特征的新后端规则时触发:
- 用户使用指令性语言("规则是 / 必须 / 禁止 / 要求 / 约定"),明确一条后端编码约定
- 用户纠正生成结果并给出通用性约束(可复用于其他实体/模块)
- 用户补充平台基类用法、命名规范、包结构约定、SQL 约束等
收集动作
| 步骤 | 动作 | 说明 |
|---|---|---|
| 1 | 判断是否为新规则 | 核对 pacp-rules 及本 SKILL 已有规则 |
| 2 | 追加写入 .pacp/business-backend-rule.md |
禁止覆盖已有内容 |
| 3 | 条目格式 | ## [简短规则名](时间 来自用户) + 场景 + 规则 + 示例 + 来源 |
| 4 | 即时应用 | 在本次剩余生成中遵循该规则 |
收集边界(不收集)
| 类型 | 说明 | 处理方式 |
|---|---|---|
| 一次性特例 | 仅针对当前某字段/某实体的特殊处理 | 属需求,应回写 spec |
| 前端规则 | 归 pacp-coding-frontend |
不写入本后端规则文件 |
| 需求澄清 | 业务需求(增删字段、改功能) | 回写 spec |
运行时故障速查
> 核心违例项见上方「禁止清单(❌ 反例黑名单)」。代码出现运行异常时,查 Skill(pacp-rules, args="java-platform-utils")(import 路径 + 核心 API 零容忍表)及 Skill(pacp-rules, args="compile-error-troubleshoot")(编译错误速查)。
交付验证
全部产出完毕后,输出:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✓ 模块后端代码生成完成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
模块:${MODULE_COMMENT}({功能模块})
实体数量:${ENTITY_COUNT}
产出文件:
✓ SQL:doc/db/business/{所属业务}/DDL/{db_type}-{功能模块}.sql
✓ 初始化数据:doc/db/business/{所属业务}/DATA/{db_type}-{功能模块}-init.sql(如有测试数据规格)
✓ Java:src/main/java/com/powersmart/business/{所属业务}/{功能模块}/...
✓ JUnit:src/test/java/com/powersmart/business/{所属业务}/{功能模块}/.../${ENTITY}ServiceImplTest.java
验证结果:
✓ SQL 语法审查:通过(静态)
✓ 规范审核:通过(后端 + SQL 零容忍规则)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
资源指针
外部规则库(pacp-rules,Skill 工具调用查询)
| 规则文件 | 内容 | 常用查询场景 |
|---|---|---|
system-module-path |
模块路径与占位符规范 | 占位符规则、接口契约 |
data-model-standard |
数据模型规范 | 必备字段确认、外键设计 |
data-model-audit-fields |
6 个必备审计字段表与定义模板 | 高频精准加载 |
java-coding-standards |
Java 编码规范(命名/目录/Controller/Service/DAO/异常/易错点等,§4 平台工具类表见 java-platform-utils) |
整体加载后端规范 |
java-platform-utils |
平台工具类表 + 核心 API 零容忍表(import 路径零虚构 + 主键/分页/删除/DAO/Controller/Service/集合/审计/数据载体/返回类型/Controller注解/Controller异常/ORM) | 后端零容忍表、import 路径权威表 |
sql-coding-standards |
SQL 编码规范(命名/目录/审计字段/分区索引/多库方言,§8 init 数据详见 sql-init-data) |
整体加载 SQL 规范 |
sql-init-data |
初始化/测试数据生成规则(目录命名/字段类型映射/业务语义取值/审计字段填充/外键 seed 顺序/默认条数/多库时间函数/CHECKPOINT) | 生成 init SQL 时高频精准加载 |
common-codes-attachment |
附件类型 INSERT(表 t_platform_wj_wjlx / t_platform_wj_wjzlx) |
业务附件需求时 |
common-codes-menu-init |
功能菜单 INSERT(表 t_admin_rms_cd) |
业务级+页面级菜单 INSERT |
common-codes-id-generator |
编号定义 INSERT(表 t_admin_xtgl_sxhdy,与 BvIdGenerator 对齐) |
字段标注 BvIdGenerator 时 |
compile-error-troubleshoot |
编译错误速查表(后端 Java + 前端 Vue3) | 编译失败时排查 |
startup-service |
服务启动规范(后端 SpringBoot / 前端 Vite) | 启动/编译时参考 |
database-type-confirm |
数据库类型确认(识别优先级、CHECKPOINT 模板) | 确认数据库类型时 |
tech-stack-baseline |
PACP 技术栈基线(后端/前端技术栈、架构约束) | 确认平台约束时 |
manifest-format |
批次清单格式(manifest.json / index.json 完整 schema) | 读取 .pacp/ 工作空间的依赖关系时 |
常用查询示例:
- 必备字段确认:Skill(pacp-rules, args="data-model-audit-fields")(已抽出独立文件)
- 外键设计:Skill(pacp-rules, args="data-model-standard 外键设计")
- 后端零容忍表 / import 路径权威:Skill(pacp-rules, args="java-platform-utils")
- 初始化数据生成规则:Skill(pacp-rules, args="sql-init-data")(已抽出独立文件)
- 附件类型 INSERT:Skill(pacp-rules, args="common-codes-attachment")
- 菜单 INSERT:Skill(pacp-rules, args="common-codes-menu-init")
- 编号定义 INSERT:Skill(pacp-rules, args="common-codes-id-generator")
本技能自包含资源
> @@/ 前缀表示本技能目录的根路径。例如 @@/skeletons/backend/ 解析为 {本技能目录}/skeletons/backend/。跨技能引用时,@@/ 始终指向被调用技能自身的根目录,而非调用方。
>
> Grep 用法:@@/assets/java-util-source/工具类.md(67K)仅用 Grep 查关键词,禁全文 Read。使用方式:Grep "Toolkit" 工具类.md 定位具体方法后,Read 匹配行上下文。
| 资源类型 | 路径 | 说明 |
|---|---|---|
| 单元测试规范 | @@/references/skill4-unit-testing.md |
JUnit Mock 规则 |
| 审核检查点 | @@/references/step6-review.md |
审核检查清单 |
| 示例对照表 | @@/references/examples-reference.md |
精确对照表 |
| 代码骨架 | @@/skeletons/backend/ |
Controller/IService/ServiceImpl/DAO/Exception/Mapper.xml/ServiceImplTest |
| SQL骨架 | @@/skeletons/sql/ |
DDL多库脚本 + Init 初始化/测试数据脚本 |
| 完整示例 | @@/examples/hjkq/backend/ |
后端 Java,import 权威源 |
| 平台工具源码 | @@/assets/java-util-source/ |
平台工具源码 |
与协调者/姊妹技能的协作
调用关系表
| 调用方 | 场景 | 一致性要求 | 执行顺序 |
|---|---|---|---|
pacp-spec |
复杂业务(多模块、原型解析、依赖排序) | 跑前后端 → 读同一份 spec | 先本技能 → 后 pacp-coding-frontend |
pacp-coding |
简单业务/单模块(临时规格、即时生成) | 跑前后端 → 读同一份 spec | 先本技能 → 后 pacp-coding-frontend |
| 用户单点调用 | 只要后端 | 无对端,无需统一 | 仅本技能 |
执行流程图
协调者(pacp-spec 或 pacp-coding)
↓ 输出模块规格:modules/{所属业务}.{功能模块}.spec.md
pacp-coding-backend(本技能,先执行)
↓ 读取模块规格 + 数据库类型
↓ 生成模块级代码(SQL + init)
↓ 生成实体级代码(Java + JUnit)
↓ 后端代码审核(静态审核:SQL 语法审查 + 规范审核;不执行 mvn 编译)
↓ 输出后端代码 + 接口契约(@RequestMapping 路径)
pacp-coding-frontend(后执行)
↓ 读取同一模块规格
↓ 按接口契约生成前端(Vue + API + 路由)
PACP 技术栈基线
技术栈基线见 Skill(pacp-rules, args="tech-stack-baseline")。