Create task / achievement (admin)
specter_create_taskCreate a single-objective achievement with one trigger and one reward for your Specter game. Configure event, rewards, and completion rules.
Instructions
Create a SINGLE-objective achievement (a "task"/"quest"/"objective" — one trigger, one reward). For multi-objective achievements use specter_create_mission (a pool), specter_create_step_series (sequential), or specter_create_time_series (streaks). event is the trigger event (slug/name, resolved automatically). rewards grants currencies/items/markers (by slug/name). recurring captures cadence intent (actual go-live is via scheduling). MUTATES live game config — confirm with the user and prefer staging.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name, e.g. "Daily Streak Reward" | |
| event | Yes | Trigger event slug or name, e.g. "daily_streak_hit" | |
| fields | No | Any other task fields (meta, tags, …) | |
| taskId | No | Stable slug (defaults to a slug of the name) | |
| rewards | No | Rewards, e.g. [{currency:"gems", quantity:50}] or [{item:"sword", quantity:1}] | |
| eventType | No | "custom" (default) or built-in "default" event | |
| projectId | No | ||
| recurring | No | Cadence intent, e.g. {unit:"day",frequency:1} for daily. Omit for one-time. | |
| completion | No | Completion rule. e.g. {param:"wins",op:">=",value:10} = "win 10 matches"; {param:"login",op:"=",value:true,mode:"streak",count:7} = "7-day streak". Omit to complete on the first event. | |
| levelLocks | No | Gate this achievement behind a level system, e.g. [{levelSystem:"player_level", level:5}] | |
| description | No | ||
| rewardClaim | No | Default on-claim (player claims). Note: this project keeps only on-claim live — confirm before using automatic. | on-claim |
| businessLogic | No | Advanced: raw json-rules-engine rule (overrides `completion`). Defaults from `completion`, or null (no condition → completes on first event fire). Note: a non-empty rule must have a `fact` matching an event param, and an empty {"all":[]} would never complete — leave null instead. |