YSC胜任力模型 — 纯本地规范 + 云端支付服务 · 岗位胜任力模型 Excel 生成器(Pay Skill)
关键架构声明(v2.0.0 · 按平台修复指南改造)
本 Skill 不调用任何远程云端"代码拉取"接口。所有核心规范(Markdown 规范、Python 代码模板)随 Skill 包本地分发,运行期通过 assets/specs_hashes.txt 做 SHA-256 完整性校验,确保规范未被篡改。
CloudBase SCF 的角色:仅作为 Pay Skill 必要的 支付服务端 与 不可执行配置 schema 下发通道。SCF 严格返回:
- 不可执行的 JSON schema(仅含版本号、价格、状态机定义等元数据)
- 订单状态机数据(order.status / payment_code / out_trade_no)
- 调用审计记录
SCF 绝不返回任何 Python 代码、Markdown 规范全文或可执行内容。
密钥管理:不随包分发任何明文密钥。微信支付商户证书私钥与 SkillHub 开发者签名私钥仅存放在 CloudBase 函数环境变量(WXPAY_* / SKILLHUB_*),由发布方在云端配置,包内与仓库内均无密钥。
支付服务端入口(Pay Skill 必备)
本 Skill 为按调用量计费的付费技能(Pay Skill),通过 CloudBase SCF(云函数) 作为支付服务端入口。
服务端入口:
- HTTPS URL:https://ysc-cloud-d8ge1wodk63983d9a-1303626442.ap-shanghai.app.tcloudbase.com/ysc-cm-engine
- CloudBase 函数名:ysc-cm-engine
- 环境 ID:ysc-cloud-d8ge1wodk63983d9a(上海区域)
- CloudBase CLI 调用命令:tcb fn invoke ysc-cm-engine --params '{...}' -e "ysc-cloud-d8ge1wodk63983d9a" --json
平台审核入口(Pay Skill 平台审核时会访问):
- POST {HTTPS_URL} (HTTP 触发器)或
- tcb fn invoke ysc-cm-engine --params '{"action":"health"}' -e "ysc-cloud-d8ge1wodk63983d9a"
SCF v2.0.0 支持的操作(全部免引入代码/规范,密钥仅存服务端环境变量):
| 操作 | 用途 |
|------|------|
| health | 平台审核探活 + 配置自检(免鉴权,返回 config_ready / missing_env 变量名)|
| get-config-schema | 下发不可执行的 JSON schema(版本、价格、状态机等元数据)|
| invoke | 支付闸门:首次调用 → 微信支付 Native 下单 + X402 AI 预下单 → HTTP 402;支付后携带 X-Out-Trade-No 重试 → 查单核验 → 放行(fulfillment_granted:true)|
| query-order | 查询订单状态(out_trade_no)|
| log-call | 服务调用审计上报(不含隐私明细)|
支付状态机:INIT(已预下单)→ PAID(已支付)→ FULFILLED(已履约)→ REFUNDED(已退款)/ EXPIRED(已过期)
规范版本与完整性校验声明
本 Skill 的核心规范存储在 references/ 与 assets/ 目录,随 Skill 包一起分发:
| 文件 | 作用 | 分发方式 |
|---|---|---|
references/competency-model-spec.md |
胜任力模型生成规范(完整版:22 项固定框架 / 动态生成规则 / 评分规则 / Excel 输出规范) | 随包本地分发 |
assets/model_template.py |
胜任力模型 Excel 生成代码模板(Python + openpyxl,锁定版本) | 随包本地分发 |
assets/specs_hashes.txt |
SHA-256 完整性校验清单 | 随包本地分发 |
校验规则:
1. 阶段1.6(运行期):用 SHA-256 逐文件校验,对比 assets/specs_hashes.txt
2. 校验失败 → fail-closed:拒绝执行核心流程
3. SCF 不可达不影响本地执行;本地规范是唯一可信源
付费说明(Pay Skill · X402 协议)
本技能为按调用量计费的付费技能(Pay Skill),遵循 X402 支付协议(HTTP 402 Payment Required 的机器可协商支付流程),通过 SkillHub SkillPay 平台 + 微信支付 AI 专属卡完成支付。
X402 协议要点:
- HTTP 状态码 402 "Payment Required" 作为支付触发信号
- 支付触发响应头:WeixinPay-Required(值即 payment_code,交给 weixinpay_pay 申请授权)+ X-Out-Trade-No(订单号)
- 幂等键 out_trade_no:整个调用链路以订单号作为幂等与重试依据,已履约订单绝不重复扣款/重复交付
- 支付模式 pay_mode:AUTH_AND_PAY(授权并支付)
- 签名机制:微信支付 API v3 WECHATPAY2-SHA256-RSA2048 + SkillHub X402 SKILLHUB-SHA256-RSA2048(全部在服务端完成)
- fail-closed 原则:支付链路异常时拒绝放行,不自动降级为免费服务
- 密钥零分发:所有私钥只存在于 CloudBase 函数环境变量,不随包分发、不写入任何文件
计费方式:
- 按调用量计费(per_call),单次价格由发布方在 SkillHub 发布页设置(元/次)
- 每次完整调用(一次胜任力模型 Excel 生成)扣 1 次费用
用户视角流程(使用和操作保持不变):
1. 用户提供企业/行业 + 岗位 + JD → Agent 完成输入清点
2. Agent 在对话中展示价格 + 弹出支付授权(微信 AI 专属卡)
3. 用户在对话内确认付款 → 自动继续执行模型生成
4. 用户拒绝/取消/超时 → 终止流程,不重试
架构概览
用户输入 → 输入清点 → X402 支付流程 → 岗位调研 → 本地加载核心规范(SHA-256 校验)→ 生成胜任力模型 Excel → 展示与说明
↑ ↑
402 + WeixinPay-Required references/ + assets/
X-Out-Trade-No 幂等重试 随包分发 + SHA-256 校验
核心资产(胜任力模型规范、Excel 模板)随 Skill 包一起分发,保存在 references/ 与 assets/ 目录中。SCF 仅承担支付服务角色,不参与规范下发。SHA-256 完整性校验确保运行期使用规范与发布版本一致。
阶段0:输入清点与补齐
启动后先盘点用户已提供的信息,按下表补齐缺失项。除"岗位名称用户未提供且无法推断"外,不因信息缺失而中断流程。
| 信息项 | 获取优先级 | 缺失时的处理 |
|---|---|---|
| 企业/行业名称 | ① 用户告知 → ② 依据岗位常识推断行业 | 无企业名时可用行业名(如"汽车行业"),用于调研与文件命名 |
| 岗位名称 | ① 用户告知 → ② 询问 | 必须明确,无法臆造 |
| 岗位JD | ① 用户提供原文 → ② 用户口头介绍 → ③ 依据行业通识 + 调研结果推断 | 走③时:先生成《参考JD》展示给用户,说明"未提供JD,以下为基于行业一般情况的推断,可回复修改或直接继续";用户无反馈即按推断执行 |
| 目标职级/部门(可选) | 用户告知 | 未告知时按岗位族群通识处理 |
阶段0.5:X402 支付流程(Pay Skill 必做,含 5 大必备改造项)
本技能为基于 X402 协议的付费技能(Pay Skill)。用户输入信息清点完成后、进入阶段1调研之前,必须严格按 X402 流程完成支付。 整个支付流程对外表现为一次简单的"展示价格 → 用户确认 → 继续执行",内部严格遵循 5 个必备改造项:前置检查、支付触发、重试机制、订单号传递、异常处理。
0.5.1 前置检查(Pre-check,X402 必备改造项 1)
执行 X402 支付前必须完成的检查项:
- 检查 weixinpay 插件是否已安装(官方 Skill Prompt 前置要求):确认当前 Agent 环境已安装微信支付插件(
weixinpay_pay能力可用);
- 已安装 → 可继续提供付费服务;
- 未安装 → 提示"当前 Agent 暂不支持微信支付付费能力",终止流程; - 调用支付服务探活:请求 SCF
health,检查config_ready;若config_ready:false则拒绝放行(fail-closed),提示"支付通道未就绪,请联系 Skill 发布方"; - 检查 SkillPay 配置完整性:确认 SkillHub 微信支付商户号、AI 专属卡支付通道、SkillPay 入驻状态均已就绪;任一缺失则拒绝放行;
- SpendingPolicy 预算检查:检查本会话累计消费是否超出 per_session_budget、单次调用是否超出 per_task_budget,超出则提示用户并终止;
- 检查历史订单状态(幂等防重):若本会话/本请求已存在订单号(X-Out-Trade-No),先
query-order查询:
-FULFILLED→ 直接复用历史履约结果(幂等命中,绝不复执行、不重复扣款)
-INIT/ 未支付 → 走 0.5.2 继续支付
-EXPIRED→ 走 0.5.2 重新发起
0.5.2 支付触发(Payment Trigger,X402 必备改造项 2)
执行 X402 协议的支付触发(场景一:首次请求,无订单号):
- 调用 SCF invoke 发起预下单(服务端自动完成:微信支付 Native 下单 → code_url → SkillHub X402 AI 预下单 → payment_code):
bash
curl -s -i -X POST "https://ysc-cloud-d8ge1wodk63983d9a-1303626442.ap-shanghai.app.tcloudbase.com/ysc-cm-engine" \
-H "Content-Type: application/json" \
-d '{"action":"invoke","skill_id":"ysc-competency-model","skill_version":"2.0.0","query":"<企业> <岗位>"}'
或 CLI:
bash
tcb fn invoke ysc-cm-engine --params '{"action":"invoke","query":"<企业> <岗位>"}' -e "ysc-cloud-d8ge1wodk63983d9a" --json
- 服务端返回 HTTP 402 + 响应头:
-WeixinPay-Required: <payment_code>(AI 支付授权码)
-X-Out-Trade-No: <out_trade_no>(订单号)
- Body 含code: PAYMENT_REQUIRED、amount、status: INIT - 展示价格并申请支付授权:向用户明确展示本次调用价格(以服务端 402 响应 Body 的
amount字段为准,本次胜任力模型生成服务费用为 ¥{amount},按次计费),将WeixinPay-Required的值作为paymentCode调用weixinpay_pay向用户申请支付授权(平台在对话内弹出微信支付 AI 专属卡,用户点击确认后扣款); - 用户确认支付后,继续 0.5.3 的履约重试。
0.5.3 重试机制(Retry Mechanism,X402 必备改造项 3)
支付链路任何环节失败/超时,按以下重试策略处理:
- 预下单失败重试(最多 3 次,指数退避 1s/2s/4s):
- 3 次后仍失败 → 0.5.5 异常处理; - 支付授权重试(最多 2 次,间隔 5s):
- 用户超过 15 分钟未授权 → 订单状态机置为EXPIRED,提示用户重新发起; - 履约确认重试(场景二:支付成功后携带订单号重试,⚠️ 必做):
> ⚠️ 支付成功后必须携带 X-Out-Trade-No 请求头重新请求本接口(body 与首次请求完全一致,仅通过 Header 传递订单号);不携带该头重试将永远拿不到履约放行,并会重复创建新订单。这是官方提示中最易被遗漏的一步。
bash
curl -s -i -X POST "https://ysc-cloud-d8ge1wodk63983d9a-1303626442.ap-shanghai.app.tcloudbase.com/ysc-cm-engine" \
-H "Content-Type: application/json" \
-H "X-Out-Trade-No: <0.5.2 返回的订单号>" \
-d '{"action":"invoke","query":"<企业> <岗位>"}'
- SCF 以 out_trade_no 查库 → 查微信支付单核验
trade_state=SUCCESS→ 状态机置FULFILLED→ 返回 HTTP 200 +fulfillment_granted:true(此时才可执行阶段1及后续本地生成); - 幂等防重:若订单已是
FULFILLED→ 直接返回already_fulfilled:true,绝不复执行、绝不二次扣款; - 状态异常(如
EXPIRED→ 410)→ 按 0.5.5 处理;
4. 禁止无限重试:所有重试都有上限 + 退避策略,禁止静默失败也禁止无限循环。
0.5.4 订单号传递(Order Number Transmission,X402 必备改造项 4)
out_trade_no 必须在整个调用链路中全程传递,作为 X402 协议幂等键与平台计费对账凭证:
- 获取(0.5.2):首次 invoke 时由 SCF 生成,通过响应头
X-Out-Trade-No返回; - 传递至履约(0.5.3):重试请求以请求头
X-Out-Trade-No带回; - 记录至服务台账(阶段4):生成的 Excel 旁附《服务记录》时写入订单号;订单号同时随阶段4的
log-call上报审计; - 传递至异常处理(0.5.5):退款/对账时用作状态机标识键。
0.5.5 异常处理(Exception Handling,X402 必备改造项 5)
X402 协议 fail-closed 原则:支付链路任何异常,必须明确拒绝,禁止自动降级为免费服务。
| 异常场景 | 状态机 | 处理方式 |
|---|---|---|
| SkillPay 配置缺失(health config_ready:false / invoke 503) | — | 拒绝执行,提示"支付通道未就绪,请联系 Skill 发布方" |
| 预下单失败(重试用尽) | — | 拒绝执行,提示"支付通道繁忙,请稍后重试" |
| 用户取消/拒绝支付 | EXPIRED |
终止流程,提示"已取消本次服务,需要时可重新发起" |
| 支付授权超时(>15min) | EXPIRED |
终止流程,提示"支付已超时,请重新发起" |
| 支付失败(余额不足等) | INIT |
终止流程,提示用户检查微信支付余额或卡片状态 |
| 履约确认时订单状态异常(410/409) | EXPIRED/冲突 |
拒绝执行,提示"订单状态异常,请重新发起或联系客服" |
| SCF 调用失败(支付链路) | — | 拒绝执行,提示稍后重试;若已扣款未履约,引导联系发布方退款 |
禁止行为清单:
- ❌ 支付失败/超时/取消后继续执行阶段1及后续
- ❌ SCF 不可达时静默跳过支付直接生成(本技能核心规范虽在本地,但未支付不得生成交付物)
- ❌ 预下单失败后多次自动重试而不告知用户
- ❌ 跳过订单号直接请求履约
- ❌ 履约失败后不退款而再次扣款
- ❌ 将密钥字符串持久化到任何文件 / manifest / SKILL.md
阶段1:岗位调研(JD 不足时补充)
JD 已充分时跳过调研,直接进入阶段1.6。
JD 缺失或不完整时,使用网络搜索补充岗位画像(搜索建议关键词:{岗位名} 岗位职责 任职要求、{企业名} {岗位名} 招聘 JD),综合行业通识判定:
- 岗位核心职责(3-6条,按重要性排序)
- 硬性条件:学历/专业/证书/年限/行业经验
- 关键能力:做好这份工作最重要的3-5项能力
- 素质红线:该岗位绝对不能触碰的职业底线
- 岗位类型判定:销售类 / 技术·设计类 / 项目管理类 / 职能·支持类(决定胜任力模型管理能力启用时机与高起点/陡峭成长项)
- 职级带宽:该岗位开放的职级范围(初级~高级 等)
信息兜底规则:企业查不到公开信息(小微企业、新公司)时,以行业通识为主推断,并在对话中标注"⚠️ 基于行业一般情况推断,未经公司信息验证"。禁止编造具体公司事实。
阶段1.6:本地加载核心规范(SHA-256 完整性校验 · 无远程拉取)
v2.0.0 关键设计:本 Skill 不通过 SCF 拉取任何核心规范。所有规范在 references/ 与 assets/ 目录中随包本地分发,运行期用 SHA-256 完整性校验确保未被篡改。
SHA-256 校验步骤
import hashlib, os
EXPECTED = {}
with open('assets/specs_hashes.txt', 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if not line or line.startswith('#'): continue
parts = line.split()
if len(parts) >= 2:
EXPECTED[parts[0]] = parts[1]
FILES = [
'references/competency-model-spec.md',
'assets/model_template.py'
]
for f in FILES:
if not os.path.exists(f):
raise Exception(f"规范文件缺失:{f}")
actual = hashlib.sha256(open(f, 'rb').read()).hexdigest()
expected = EXPECTED.get(f)
if actual != expected:
raise Exception(f"完整性校验失败:{f}\n期望: {expected}\n实际: {actual}")
print("[OK] 全部规范完整性校验通过")
校验失败 → fail-closed:拒绝执行核心流程,绝不静默继续。
规范文件使用方式(阶段2)
- 读取
references/competency-model-spec.md全文作为生成依据(22 项固定框架、专业类动态生成规则、评分规则、Excel 输出规范); - 复制
assets/model_template.py为临时生成脚本(Python + openpyxl),填充岗位数据后执行。
所有规范引用为本地静态文件读取,SCF 不参与此过程。
SCF 仅下发不可执行的 JSON schema(可选 · 用于版本/价格核对)
如需核对 SCF 返回的 schema 与本地 manifest 是否一致(版本号、价格),可调用 get-config-schema:
tcb fn invoke ysc-cm-engine --params '{"action":"get-config-schema"}' -e "ysc-cloud-d8ge1wodk63983d9a" --json
SCF 返回的 schema 仅含价格、版本、状态机定义、TTL 等元数据,不包含任何代码或规范全文。
阶段2:生成岗位胜任力模型 Excel
阅读并严格遵循阶段1.6 校验通过的 references/competency-model-spec.md 规范全文。 执行要点:
- 通用能力素质 22 项固定框架不可增减:仅做该岗位的情境化定义(定义嵌入具体工作场景)与五级评分,适用范围规则照规范执行;
- 专业知识技能从 JD(或推断 JD)提取:专业知识 3-6 项、专业技能 3-6 项、职业素质固定 3 项(底线/品质/意志),每项做五级评分;定义必须具体、可考核,不得笼统;
- 评分符合规范:0-10 分,单调递增、差距合理、高起点项(底线类助理≥6)、陡峭成长项、区分度优先;按岗位类型(销售/技术/项目管理/职能)执行评分曲线差异;
- 调用
assets/model_template.py:复制为临时脚本,按规范填充GENERAL_ITEMS(22 项,维度/要素/定义/五级评分)、PROFESSIONAL_ITEMS、TITLE、ROLE_NAME、ROLE_NOTES、LEVEL_DEFS,用 Python + openpyxl 执行生成; - 输出文件:
{企业名}{岗位名称}胜任力模型_完整版.xlsx(含"胜任力模型总表"+"使用说明"两个 Sheet,样式与颜色规范与模板完全一致),保存到当前工作目录; - 生成后必须展示:调用 present_files 展示生成的 .xlsx 文件。
阶段3:展示与说明
Excel 生成后,向用户展示文件并给出简短说明:
- 文件(present_files 展示 .xlsx)
- 模型构成速览(通用能力 22 项 + 专业知识 X 项 + 专业技能 X 项 + 职业素质 3 项)
- 关键特征(与通用模型的差异:高起点项、陡峭成长项、JD 直接映射项、岗位类型特例)
阶段4:服务台账(含订单号,便于对账)
完成后向当前工作目录的 YSC胜任力模型_服务记录.csv 追加一行。文件不存在则先创建并写入表头:
日期,企业名称,岗位名称,产出文件,订单号,skill_version,备注
- 日期格式:YYYY-MM-DD;产出文件列填生成的 xlsx 文件名;
- 订单号列(X402 必传):填写阶段0.5.2 返回的 out_trade_no,便于与平台计费对账;
- 写入前先查重:若台账中已存在同订单号的记录,直接跳过写入(X402 幂等防重);
- 台账仅记录上述必要字段,不写入任何敏感信息。
随后调用 SCF log-call 上报审计(仅传订单号/岗位/要素数量,不含隐私明细):
tcb fn invoke ysc-cm-engine --params '{
"action": "log-call",
"out_trade_no": "<订单号>",
"industry": "<行业>",
"position": "<岗位>",
"item_count": <总要素项数>
}' -e "ysc-cloud-d8ge1wodk63983d9a" --json
通用性保障
本技能适用于任意行业、规模、岗位,依赖以下设计:
- 行业无关:调研步骤对任何行业生效;信息不足时回退到"岗位族群通识"(销售/技术/项目/职能四大类);
- 企业规模无关:上市公司到小微企业的处理路径一致,仅信息置信度不同(标注推断假设即可);
- 岗位类型无关:规范内置四类岗位的评分曲线差异与高起点/陡峭成长项规则;
- 职级无关:五级职级框架(助理→资深)覆盖从应届生到专家的全部带宽;
- 本地规范:所有核心资产随包分发,运行期用 SHA-256 完整性校验;SCF 不下发可执行内容。
注意事项
- 规范不可更改:
references/competency-model-spec.md是格式红线,只允许按规范做岗位情境化,不允许增删框架; - 输出格式必须是 Excel(.xlsx):使用 Python + openpyxl 生成,禁止以 Markdown 表格或其他文本格式交付;
- 完整性校验优先:阶段1.6 必须先完成 SHA-256 校验(对比
assets/specs_hashes.txt),校验失败立即终止流程,禁止跳过校验或使用被篡改的规范; - X402 协议严守:本技能为基于 X402 协议的 Pay Skill,任何阶段都必须严格遵守 5 大必备改造项(前置检查 / 支付触发 / 重试机制 / 订单号传递 / 异常处理),禁止跳过任何一项;
- fail-closed 原则:支付链路任何异常(配置缺失/预下单失败/支付超时/支付失败/履约异常)必须明确拒绝放行,禁止自动降级为免费服务或静默失败;
- 订单号全链路传递:out_trade_no 必须从 0.5.2 获取 → 0.5.3 履约 → 阶段4 台账 全程传递,作为幂等键;
- 付费优先:支付履约确认(
fulfillment_granted:true)必须先于阶段1执行;未支付不得生成交付物; - 随包分发,无远程代码拉取:本 Skill 不包含任何远程云端拉取代码逻辑,所有规范来自本地
references/与assets/目录;SCF 仅承担支付服务角色;发布者无法在包外注入或篡改运行期使用的核心代码/规范; - 密钥零持久化:任何密钥字符串不得写入文件、manifest 或 SKILL.md;签名全部在 SCF 服务端完成;
- 评分要有区分度:避免"五个职级评分完全相同"或"相邻三级相同";定义必须具体(如"向业主、设计院清晰汇报施工进度与技术问题"而非"沟通能力强");
- 专业知识技能必须来源于 JD:不能凭空编造,每一项都应能对应 JD 中的某条职责或要求;
- 诚实标注推断:凡属推断的信息(参考 JD、企业画像、行业假设)必须明确标注,不得伪装成事实;
- 文件名使用中文,保存在当前工作目录;
- 全部产出物生成后,调用 present_files 统一展示。
依赖环境
- Python 3.10+
- openpyxl(生成胜任力模型 Excel)
pip install openpyxl
文件清单
| 文件 | 作用 | 来源 |
|---|---|---|
SKILL.md |
本技能定义文件(执行编排 + 支付流程 + 规范版本声明) | 本地(随包分发) |
references/competency-model-spec.md |
胜任力模型生成规范(完整版) | 本地(随包分发) |
assets/model_template.py |
胜任力模型 Excel 生成代码模板(锁定版本) | 本地(随包分发) |
assets/specs_hashes.txt |
完整性校验哈希表(SHA-256) | 本地(随包分发) |
> 核心资产全部随 Skill 包一起分发,版本与 Skill 版本(v2.0.0)绑定,运行期通过 assets/specs_hashes.txt 执行 SHA-256 校验,确保规范未被篡改。本 Skill 不通过远程云端接口拉取任何代码或规范全文,SCF 仅作为 Pay Skill 必要的支付服务端与不可执行配置 schema 下发通道。