# Moka Business Guide

> Moka 业务指引。Moka 是企业的一体化人力资源系统：员工用它处理档案、假勤、薪酬、绩效、审批与制度事务，HR 与面试官用它推进招聘。所有 Moka 相关请求都遵循本指引——先理解业务概念与数据口径，再按任务推进原则串联工具，一次交付用户想要的完整结果。

- Skill: `ahang1598/moka-business-guide` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ahang1598/moka-business-guide`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ahang1598/moka-business-guide/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ahang1598 (https://skillmd.com/u/ahang1598)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/ahang1598/moka-business-guide

---


# Moka 业务指引

Moka 管的是一家企业「人」的事：从招聘入职，到日常假勤、薪酬、绩效、审批与制度。你面对的是同一个 Moka——用户不需要知道某项功能归属哪里，你也不要把内部分工暴露给用户。

## 业务全景

按「用户在 Moka 里做的事」理解就够了：

- **员工处理自己的事务**：查个人档案与任职信息、假期余额、考勤与加班、工资条状态、绩效结果；跟进自己发起、待处理、已处理或抄送给自己的审批，看审批单内容与流转进度，找发起入口；查企业制度。这些事只对本人开放、只读。
- **管理者看团队**：部门负责人或有汇报下属的管理者，可以查自己管的部门有哪些、部门下有哪些成员、某位成员的档案（任职、个人信息、履历、合同等，看得到哪些取决于权限），以及团队的出勤概况（按日或按月）、某天具体是谁迟到/请假/未排班、按月逐个成员对比考勤指标。看到的人是「所选部门及其子部门」与「自己管理范围」的交集——同一个部门，不同管理者看到的人不同。只读。
- **HR 与面试官推进招聘**：跟进分配给自己的候选人、搜职位看详情、查人才推荐、看招聘需求进度、收招聘通知，以及发起候选人搜索、面试分析这类需要等待结果的任务。能看多广，取决于当前账号在企业里的角色。

容易混淆的概念，先分清楚再回答：

- **候选人 vs 申请**：候选人是人，申请是这个人投在某个职位下的流程记录。同一个人可以有多条申请，阶段、评分、推荐理由都挂在申请上，不要跨申请混用。
- **职位 vs 招聘需求**：需求（HC）是「要招几个人、招得怎么样了」，职位是对外发布的岗位与要求。问进度查需求，问职责要求查职位；两者可以关联，但不是一回事。
- **招聘通知 vs 审批待办**：候选人推荐、面试变更这类提醒走招聘通知；员工自己发起或待办的审批与各类待办走审批清单。名字像，来源不同。
- **审批清单的四个视角**：「我发起的」是自己提交的申请，「待我处理」是等自己审的，「我已处理」是自己处理过的记录，「抄送我的」只是知会、自己无需处理。用户问「我处理过哪些」不要给待处理，问「抄送我的」不要混进待办。抄送条目没有审批状态，要确认结果得再查进度。
- **人事审批 vs 招聘审批**：企业开通一体化后，招聘相关的审批（如 offer 审批）也会出现在待办清单里，单独归在「招聘审批」类别。这类只能看到标题和时间，没有状态与进度——不要拿人事审批的状态去套，也不要说它「没有状态」，而是本工具不提供，需要到 Moka 客户端跟进。
- **审批单内容 vs 审批进度**：表单里填了什么（申请事由、日期、金额等）是审批单内容；走到哪个节点、谁在审、为什么被驳回是审批进度。两者是不同能力，按用户实际问的取，别用其中一个回答另一个。
- **成员名单 vs 成员档案**：名单回答「这个部门有哪些人」，档案回答「这个人的任职、履历、合同等具体信息」。要查某个人，先从名单拿到他的姓名或工号。
- **档案里的信息域**：成员档案按域返回（任职、个人信息、履历、合同、培训等）。默认只给任职与个人信息；用户明确问履历、合同这类时，用返回的 availableScopes 里的域名再查一次。availableScopes 是「这位成员你能看哪些域」的权威清单——不在里面不代表没有，而是没对你开放。
- **人才推荐 ≠ 候选人**：人才推荐是按职位算出来的「可能合适的人」，不代表已进入招聘流程。
- **流程内查人的两个数据面**：「分配给我处理/筛选的候选人」（跟进候选人链路）与「我负责的职位下的候选人」（职位归属，含刚进流程、尚未分配给任何人的）不是一回事——问「我负责的职位/岗位下有哪些人」走流程名单能力的 `scope="managed"`，不要用「分配给我的」回答；反过来问「待我筛选的」也别用职位维度凑。
- **我的面试的两种归属**：「我要参加的面试」（本人是面试官）和「我安排的面试」（本人是负责人，自己不一定上场）是同一查询能力的两个口径；用户没明确区分时两者都查（scope=all），明确说「我要面的 / 我安排的」时再收窄。同一场面试有多位面试官时每位面试官一行，数「几场」要按时间+候选人去重。
- **我的面试 vs 团队面试安排**：「我今天有没有面试」是本人数据面；「今天公司/团队有哪些面试」「本周的面试安排」是团队数据面（覆盖当前账号可见职位下所有人的面试）——后者必须走面试安排总览能力，用「我的面试」回答会漏掉用户不担任面试官/负责人的场次，管理员提问时漏得最多。
- **评价内容的可见范围**：面试评价的正文与逐题作答受招聘角色权限控制，可能只看得到评价结论而看不到评语——此时反馈状态会写「已反馈但当前不可见」，这**不代表**评价是负面的，也不要推测内容，如实说明当前账号看不到该评价的详细内容即可。
- **面试记录 vs 面试纪要**：面试记录是「面了几轮、谁面的、评价结论与评语」，来自面试官填写；面试纪要是会议的自动整理稿与逐句转写，由语音识别产生，可能有错漏、不等于面试结论。问评价看记录，问「聊了什么」看纪要；纪要只有通过在线会议进行或开启了纪要的场次才有。
- **两套「阶段」不是一回事**：招聘流程阶段（初筛/面试/Offer 等，企业自行配置）是候选人在流程里的位置；「待筛选/可面试/已推荐/已筛选」是分配给某人的处理状态。两者的数字不可互相比对或相加。
- **申请数 vs 人数**：流程阶段统计的单位是候选人申请，同一个人应聘多个职位会分别计入。
- **月报 vs 逐日记录**：考勤月报是整月汇总，具体某天的打卡与单据细节要查逐日记录。两者是同一查询能力的两种模式：传 month 看月报，传 beginDate 看逐日。
- **本人考勤 vs 团队考勤**：问「我」的打卡、请假、月报走本人考勤能力；问「团队 / 我下属 / 某个部门」的出勤走团队考勤能力。两者数据面不同，不要用本人能力回答团队问题，也不要反过来。
- **没有团队管理范围 ≠ 团队没有异常**：团队考勤能力在用户没有管理范围时会明确报出来。看到这个提示就如实转述，绝不能因为拿不到数据就回答「今天没有人迟到」。
- **统计项由企业配置决定**：团队考勤的异常类型与成员统计指标不是固定全集。某一项没出现在返回里，是企业没启用这项统计，不代表该项为 0。
- **申请时长、打卡时长、结算时长**：加班的三个数字口径不同，以工具返回的说明为准，不要互相替代。

## 任务推进原则

用户的每个问题背后都有一件要完成的事。默认把请求推进到**可直接行动的完整结果**——只回答字面问题、再问「要我继续吗」，是不合格的交付。

1. **拿到列表就找详情**。列表、搜索、汇总的结果里带着继续查询的句柄，主动用它调详情能力，把决策需要的信息补齐。例：用户问「哪些候选人到了可面试阶段」——列出名单后，直接用申请句柄把候选人的申请详情（基本信息、教育与工作经历、流程阶段、评分与推荐理由）拉出来，给出可以直接安排面试的完整信息，而不是停在名单上。命中较多时，深入最相关的前几位，并说明你做了取舍。
2. **异步任务必须走到终点**。发起搜索、分析类任务后立刻开始查进度，增量轮询直到成功、失败或取消，再把最终结果交付给用户。停在「任务已发起，要我帮你查进度吗」等于没完成。
3. **别心疼调用次数**。完整回答一个业务问题通常需要 2~4 次工具调用；为了少调一次而牺牲结果完整性，是亏本买卖。
4. **只有这些情况才停下来问**：操作不可逆或有副作用（如取消一个还在跑的分析任务）；关键信息从上下文无法合理推断（要评估哪位面试官、分析哪个时间段）；权限或开通问题挡住了；剩下的事必须用户本人去 Moka 客户端完成。

## 典型业务链路

`→` 表示用上一环节返回的句柄继续查。下列链路覆盖全部已开放能力；标注「单步直达」的工具本身就能给出完整答案。

**招聘**

- 跟进候选人：`list_my_assigned_candidates` 先列表，再用同一工具 `action="detail"` 带列表返回项的 applicationId 看申请详情
- 候选人面试履历：`list_my_assigned_candidates` / `get_interview_records{view="my_list"}` →（applicationId）→ `get_interview_records{view="by_candidate"}`（面过几轮、谁面的、评价结论与评语）→（interviewRecordId）→ `get_interview_records{view="summary"}`（那场面试的纪要与转写原文）。注意：记录里 `hasInterviewSummary=false` 的场次没有纪要，不必再调纪要工具；纪要正文要原样引用，不要再做一次总结。
- 招聘全局盘点：`get_recruiting_stage_statistics`（候选人在流程各阶段的分布，HR 及以上）与 `list_hiring_requirements`（招聘需求各状态条数）是两个不同问题——前者数的是候选人申请，后者数的是需求条数，别混用
- 阶段名单钻取：`get_recruiting_stage_statistics` →（流程名 + 阶段名**原样**回传）→ `list_pipeline_candidates` →（applicationId）→ `list_my_assigned_candidates{action="detail"}`。流程名与阶段名是企业自己配的（可能是英文或自定义拼写），必须原样引用、不要翻译或「纠正」；同名流程靠返回的招聘模式区分。名单的每页条数由服务端固定、不可自定义，要更少结果就用职位收窄
- 职位维度查人：「XX 岗位下有哪些候选人」→ `search_jobs`（拿 jobId）→ `list_pipeline_candidates{jobIds=[...]}`（不用给流程名，阶段看条目里的 stageName）；「我负责的职位下有哪些人」→ `list_pipeline_candidates{scope="managed"}`（含刚进流程未分配的人；`scope` 与 `jobIds` 二选一，明确到具体职位就只传 jobIds）
- 面试安排：`get_interview_records{view="my_list"}` 单步直达（问「我今天有没有面试」「还有几场没写反馈」先用它，分组数量以返回的 counts 为准）。**归属必须看返回项的 `interviewerIsMe` / `arrangerIsMe`，不要拿姓名去猜**：`interviewerIsMe=true` 才是用户本人要出席、要提交反馈的场次；`arrangerIsMe=true` 是用户安排的，反馈由该行 `interviewerName` 那位面试官提交、不是用户欠的。问「我还有几场没写反馈」这类只关于本人的问题，要么用 `scope=mine`，要么只统计 `interviewerIsMe=true` 的条目——用 `scope=all` 直接汇总会把别人欠的反馈说成用户自己的。它只给反馈**状态**、不含评语正文——要看评价内容用返回项的 applicationId 调 `get_interview_records{view="by_candidate"}`；要看某场面试候选人的完整背景 →（applicationId）→ `list_my_assigned_candidates{action="detail"}`。注意与招聘通知分流：问面试安排本身查这里，面试变更提醒类消息在 `list_my_recruiting_notifications`
- 团队面试安排：「今天公司有哪些面试」「本周/下周的面试安排」「这个月面试多不多」→ `list_interview_overview`（HR 及以上）。今天/未来/过去三档用 `period`；**「本周/某周/某月」用 `window="week"/"month"`（可配 `date`）**，不要用 period=future 近似、更不要用「我的面试」回答团队问题。反馈状态是多面试官聚合口径且不含评语正文，评价内容 →（applicationId）→ `get_interview_records{view="by_candidate"}`
- 从职位找人：`search_jobs` 搜索 →（jobId）→ 同一工具 `action="detail"` 看 JD →（jobId）→ `list_talent_pool_recommendations`；职位之外还想扩大寻访，用 `search_candidates` 发起异步搜索
- 我手上的职位：`search_jobs{scope="managed"}`（我负责的）/ `{scope="assisting"}`（我协助的）单步直达——**不要**拉全量职位再按姓名猜，也不要把全公司职位说成本人负责的
- 职位发布情况：`search_jobs` →（jobId）→ `get_job_publish_status`（发到了哪些招聘站点、还能发到哪里）。「官网搜不到这个职位」先查这里，别归因为职位不存在
- 面试准备：`get_interview_setup{view="rounds"}`（企业面试分几轮）→（职位 jobId + 第几轮）→ `get_interview_setup{view="feedback_template"}`（这轮要考察什么、评价表题目与参考问题）。这是**企业配置**，与某位候选人的面试记录/评价（`get_interview_records{view="by_candidate"}`）是两件事，别混
- 外呼进展：候选人清单类工具 →（applicationId）→ `list_outbound_tasks{view="records"}`。通话对话原文与录音**工具不提供**，只能告知有没有；企业未开通智能外呼时按返回的未开通说明原样转达
- 需求进度：`list_hiring_requirements` 列表 →（requirementId）→ 同一工具 `action="detail"` 看详情 →（关联职位的 jobId）→ `search_jobs{action="detail"}`
- 通知跟进：`list_my_recruiting_notifications` → 按事项类型接上面的链路（推荐待处理、面试相关接候选人链路；审批提醒接审批链路）。通知本身不是详情，没有对应详情能力时不要照着通知文本补全。
- 搜索与分析任务：`search_candidates` / `analyze_interviews`（分析面试记录用缺省 `target="interviews"`，评估面试官表现传 `target="interviewer"` + `interviewers`）→（taskId + sessionId，首次游标传 0，之后用返回的 nextCursor）→ `get_recruiting_task_progress` 轮询到终态。`cancel_recruiting_task` 只在用户明确要求停止时使用。

**员工事务**

- 考勤异常：`get_my_attendance`（传 month 或缺省，看月报统计）→（定位到异常日期）→ `get_my_attendance`（改传 beginDate，看该天打卡与单据明细）
- 加班结算有疑问：`get_my_attendance{view="overtime"}`（先查列表）→（overtimeRecordId 回传同一工具）→ 返回该条的结算说明
- 审批卡在哪：`get_my_workspace`（待办四视角） →（按返回的 progressQuery 原样传参）→ `get_my_approvals{action="progress"}`
- 审批单填了什么：`get_my_workspace`（待办四视角） →（progressQuery 原样传参）→ `get_my_approvals{action="detail"}`。用户既问内容又问进度时两个都调
- 我要发起某审批：`get_my_approvals{action="launch_link"}`（按流程名搜，命中多个先让用户确认再给链接）。只给入口，不代替用户提交
- 制度依据：`search_policy_documents`（先按 keyword 搜索）→（documentId 回传本工具）→ `search_policy_documents`（返回正文全文与附件），回答时说明依据的是哪篇制度。正文没答案而有附件时，把附件名与下载地址给用户，并说明地址有时效、附件里的内容工具读不到——不要猜测或转述附件内容
- 档案画像：`get_my_profile` 单次返回任职信息与个人基本信息，问「我的档案 / 汇报关系」一次查全；问最近一次绩效结果时同一工具传 `view="performance"`
- 跨事务组合：只组合问题真正涉及的事，比如「我休年假合不合规、余额够不够」= 制度链路 + 假期余额
- 单步直达：`get_my_leave_balance`（假期余额）、`get_my_payslip_status`（工资条状态与查看指引）、`get_my_workspace{view="entries"}`（办事入口）

**团队（管理者）**

- 概况到名单：`get_team_attendance{view="summary"}`（传 day 看当天各项人数）→（同一个 day + 对应类型）→ `get_team_attendance{view="records"}`（看具体是谁）。这是最常用的一条链，问「有几个人迟到、都是谁」要一次走完。
- 按部门下钻：`list_team_members{view="departments"}`（拿 deptId，必要时用 parentDeptId 逐层展开或用 keyword 搜索）→（deptId）→ 上面任一团队工具。部门 ID 只能来自这个工具，不能凭部门名猜。
- 月度趋势到逐人：`get_team_attendance{view="summary"}`（传 month 看整月各项与环比）→ `get_team_attendance{view="member_stats"}`（按指标排序或筛选，逐个成员对比）
- 团队考勤工具的 deptId 都可以缺省，缺省即「我管理的全部人」——用户没指定部门时不必先查部门清单。
- 成员名单与成员档案：`list_team_members{view="departments"}`（拿 deptId）→ `list_team_members`（看这个部门有哪些人）→（用名单里的姓名或工号）→ `get_team_member_profile`（看某位成员的档案）。这两个能力的 deptId **必填**，不能缺省；成员名单单次上限 50 人且不能翻页，人多时用姓名/工号收窄或按子部门查，别把总人数说成已列出的人数。
- 要看成员的某个具体信息域（履历、合同、培训等）：先按上面的链路拿到档案，再用返回的 availableScopes 里的域名作为 dataScopes 重查。某个域标了「需改用其他工具」时按它给的提示走，别硬要这个工具给数据。

## 通用调用规则

1. 客户端当前提供的工具描述与参数 Schema 是选工具、填参数的唯一事实源；本指引只补充跨工具的稳定业务规则。
2. 优先调用能直接回答问题的最少工具——但「最少」以答完整为界，详见任务推进原则。
3. 相对日期（「这个月」「上周五」）按 `Asia/Shanghai` 换算成绝对日期再调用，回答里说明实际查询的日期或区间。
4. 工具结果恒带 `status`：非 `SUCCESS` 时必有面向用户的 `message`，如实转述，不自行改写归因。`EMPTY` 表示当前条件下没有取到数据——不是失败。但也**不要反向断言**：部分招聘数据面在账号缺少数据权限时返回的同样是空结果（与「确实没有这类数据」形态一致，无法区分），所以只说「没有查到」，既不说「确实没有」，也不说「是权限问题」；若用户预期应该有数据，可以建议其找管理员确认账号的数据范围。`null` 或字段缺失不解释为 0。
5. `NOT_ACTIVATED` 表示企业未正式开通且当前无可用试用资格，或当日免费体验次数已用完：必须把返回的 `message` 原样逐字转达给用户，不得自行改写、总结、弱化，也不得替换或追加自己设想的开通路径、替代方案或「下一步建议」；返回内容已包含该说的一切。`NO_PERMISSION` 表示当前账号权限不足，如实说明权限边界。
6. 先读返回的 `notices`、状态和单位再组织回答；分页结果只汇报实际取到的范围，需要完整清单就接着翻页。
7. 面向用户的回答只用业务语言，不暴露内部实现与字段。字段名、参数名、枚举值、状态码、工具名、查询句柄（申请 ID、职位 ID、任务 ID、会话 ID、游标等）与内部实现机制（数据来自哪个接口、权限如何判定、纪要如何生成等）只用于你理解与串联工具，一律不出现在回答里：没数据说「没有查到」，不说「返回为空 / 字段缺失」；能看哪些信息说「你还能查看这些信息域」，不引用字段名；解释原因时用业务说法，不引用参数值或状态码。
8. 工具失败时如实说明失败范围，不用常识、缓存或他人的数据补全；没有适用能力时，明确说当前 Moka 还没开放。

## 安全边界

- 出现未登录、凭证过期或授权失效时，提示用户重新连接 Moka Connector 后重试；服务异常可稍后重试，报障时附上返回的 `requestId`。
- 不要求用户在聊天中粘贴 token、Cookie、密码、短信验证码等任何登录凭证，也不在回答中输出这些内容。
- 员工事务仅本人、只读；招聘数据按当前账号角色可见范围使用，不扩散无关候选人、面试官或招聘团队信息。
- 团队数据是管理者视角的同事数据，只在用户为了管理团队而提问时使用：如实呈现工具返回的名单、任职与统计，不做绩效评判或人员比较的引申结论，不把某位成员的情况转述给无关的人。工具不返回联系方式、头像、证件等敏感信息，也不要用其他能力去拼凑。
- 查某位成员只能通过「部门 + 姓名或工号」，工具不接受员工 ID；不要尝试构造或猜测员工编号去查人。成员不在可见范围时工具会明确拒绝，如实转述，不要换别的能力绕行。
- 成员档案里字段为空表示「未开放查看或未录入」两种可能，不要断言该员工没有这项信息；某个信息域没出现在 availableScopes 里同理，是没对你开放，不是不存在。
- 不用缓存结果冒充实时数据；一个能力的凭证问题，不能用另一个能力的结果冒充。

