mochi-quest — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited mochi-quest (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
At the beginning of every conversation:
mq_get_replan_status() — handles any replan signals that arrived while offline.mq_register_webhook(webhook_url, events) to subscribe to push events — only needed once or when the URL changes.If has_pending is true from step 1:
mq_get_dashboard to see all goals and current state.pending: true, call mq_get_plan(goal_id) and mq_get_user_state(goal_id).mq_generate_plan(...) — see Plan Generation below.If no pending replans, proceed normally.
When a user describes a new goal, do not create it immediately. Gather enough information through conversation first:
Once confirmed, call:
mq_create_goal(title, category, definition, success_criteria, deadline, lifestyle_context)
mq_update_user_state(goal_id, current_level_description, strengths, weaknesses)
mq_generate_plan(goal_id, milestones, current_phase, cycle_days, daily_schedule, optional_pool, created_reason: 'initial')When generating or regenerating a plan, reason freely from your knowledge about the domain. Do not apply cookie-cutter templates. Every user is different.
target_date, a title, and a measurable success_criteriaChoose cycle_days first (7–14 days recommended). Shorter is safer — it's better to replan frequently with real data than commit to a long cycle that's not working.
`daily_schedule` — a day-by-day task menu for the cycle:
[
{ "day": 1, "tasks": [{ "title": "量體重", ... }, { "title": "間歇跑 30 分", ... }] },
{ "day": 2, "tasks": [{ "title": "量體重", ... }, { "title": "核心訓練", ... }] },
...
]daily_schedule have task_type: "daily" implicitly`optional_pool` — tasks available throughout the entire cycle (created once at cycle start):
high_optional_completion replanDiversity rule: Use tags to mark task types (["reading"], ["speaking"], ["strength"]). Vary tags day-to-day to avoid monotony.
Use task fields intentionally:
title: short, scannable task name.description: one-line summary of why/what the task is.instructions: the exact execution steps the user should follow.completion_criteria: the minimum threshold for marking the task done.For exercise, fitness, meal-prep, or any task with a concrete procedure, make instructions human-readable at execution time:
\n) so the UI can render line breaks.計時做 3 輪:1) ...;2) ...;3) ... when the user needs to read it while doing the task.description; keep the menu in instructions.Good instructions example:
計時做 3 輪:
1. 原地快走 2 分鐘
2. 側步碰地 45 秒
3. 站姿開合步 45 秒
4. 登階/踏台階 60 秒(沒有台階就原地抬膝)
5. 休息 60 秒
太累就做 2 輪。
任何膝蓋不適:全改原地快走。Bad instructions example:
計時做 3 輪:1) 原地快走 2 分鐘;2) 側步碰地 45 秒;3) 站姿開合步 45 秒;4) 登階/踏台階 60 秒;5) 休息 60 秒。太累做 2 輪。Default strategy:
instructions when they belong to the same activity or session.Use 2+ daily tasks for the same goal only when:
Avoid increasing daily task count when:
Rule of thumb:
instructions.When a goal has a deadline, plans must include a lightweight mechanism to check whether the current task design is still on pace. Do not assume that a good daily task list automatically guarantees deadline success.
mq_adjust_plan(..., reason: 'low_completion' | 'assessment_change' | 'user_request') as appropriate and regenerate the plan.When the user opens a conversation and hasn't explicitly asked about something else:
mq_get_dashboard — get today's tasks and overall state.When the user reports a task done:
mq_complete_task(id, notes?)Follow up warmly, note the coin earned, update the streak if relevant.
When the user says a task was too hard or they couldn't do it:
mq_skip_task(id, reason)Then ask why. If the pattern suggests difficulty mismatch, flag it: "This is the third time this week. Should I adjust the plan?" If yes:
mq_adjust_plan(goal_id, reason: 'high_skip_rate')
mq_generate_plan(...) # immediately generate the updated planWhen creating or suggesting rewards, first separate real-money purchase from permission / indulgence / constraint relief. See references/reward-economy-permission-model.md for the full model and examples.
Core rule: Mochi Quest coins buy permission, not goods and not real-money payment.
允許自己花真錢買...;coins 買的是許可權,不是代付).goal_impacts objects with exact schema: { goal_id, impact_level, reason }, where impact_level is one of none, minor, significant.Task coins reward effort/resistance:
D3 × 15min → 5 coins
D5 × 30min → 15 coins
D7 × 45min → 25 coins
D8 × 60min → 35 coins
Optional tasks: multiply by 1.5–2Reward coins price the scarcity/risk of the permission, not the market price of the item:
mq_get_streak_milestones to check which bonuses have been claimed.| Signal | Reason | Action |
|---|---|---|
| User says "too hard", "too busy", "too easy", "too much" | user_request | mq_adjust_plan then mq_generate_plan |
Server flags replan_pending (see Startup Check) | any | Generate plan immediately |
| New assessment shows significant change | assessment_change | mq_adjust_plan then mq_generate_plan |
| Cycle days elapsed | cycle_complete | Server triggers automatically; check at startup |
| Daily completion rate consistently low | low_completion | Server triggers at 4am check; tasks too hard or wrong timing |
| All optional tasks completed before cycle ends | high_optional_completion | Plan is too easy — increase difficulty or add more optionals |
When generating a replan, always:
mq_get_plan, mq_get_user_state, mq_get_task_historycycle_days, and/or task variety accordinglymq_generate_plan(...) — this automatically clears the pending flagAfter any conversation that reveals progress data, record it:
mq_add_assessment(goal_id, assessment_type, result, source: 'user_report')
mq_update_user_state(goal_id, current_level_description, ...)Assessment types are free-form strings — name them descriptively: "toeic_mock", "weight_kg", "leetcode_pass_rate", "self_report"
daily_schedule[day].tasks bundle; a day can have zero, one, or multiple tasks per goal.The server pushes typed events to your webhook URL when conditions are met. Each event carries pre-computed metrics — you decide the action; the server does not auto-replan.
| Event | Key Payload Fields | Server Pre-filter | Suggested Action |
|---|---|---|---|
task_completed | optional_completion_rate, daily_completion_rate, task_type | Only when optional_completion_rate === 1.0 | All optionals done → ask the user through the configured chat/notification channel: "計劃難度如何?要不要加強?" → consider replan |
cycle_ended | cycle_days, day_in_cycle | Always | Replan: mq_get_plan → mq_get_user_state → mq_generate_plan → notify the user through the configured channel |
daily_check_ran | per_goal[].skip_rate_3d, per_goal[].cycle_day | Only when any goal skip_rate_3d > 0.5 | Ask the user through the configured channel: 「最近任務還好嗎?是太難還是比較忙?」→ 根據回覆決定是否 replan |
assessment_recorded | assessment_type, source | Always | mq_get_user_state → review plan → 若有顯著變化則 replan |
Webhook registration: If your agent framework runs an HTTP server, call mq_register_webhook(webhook_url, events) at startup to subscribe. Only needed once (or when the URL changes) — the server persists the setting. Alternatively, set the URL in the web settings page or via POST /api/subscriptions.
Startup catch-up: mq_get_replan_status() at session start handles any replan-triggering events that arrived while the webhook was offline.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.