Simulator Tasks logo

Simulator Tasks

Organization
corezoid
simulator-tasks

Simulator.Company task & assignment specialist — creating a task and assigning who does it, who approves it, and whose signature it needs. In Simulator a task is an actor of the Events system form (no chatType), and the roles are access privileges, not data fields: the executor gets `execute`, approvers get `sign`, and a legal document's signers get `ds`. Completion and sign-off are then posted as `done` / `sign` / `reject` reactions. Use when the user wants to "create a task", "assign a task to", "set an executor/assignee", "add approvers", "require a signature", "who signs this", "make a to-do". Also covers **order / directive documents** that tell a specific person to do something — an "order/наказ addressed to X" is a task whose addressee is the executor. Activate on "create a task", "assign to", "task for", "needs approval", "who approves", "requires signature", "sign-off", "order", "decree", "directive", "create an order for", "створи задачу", "постав задачу", "признач виконавця", "додай погоджувача", "потрібен підпис", "хто погоджує", "хто підписує", "наказ", "створи наказ", "склади наказ", "наказ на", "розпорядження", "доручення", "создай задачу", "назначь исполнителя", "добавь согласующего", "нужна подпись", "кто подписывает", "приказ", "создай приказ", "распоряжение", "поручение". For a 1:1/group chat use `simulator-chat`; for the reaction mechanics use `simulator-reactions`; for access in general use `simulator-access`.

Overview

Publishercorezoid
Repositorysimulator-ai-plugin
Skill namesimulator-tasks
Stars
61
Forks
13
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by corezoid on GitHub. Read the source before you install it.

Installation

Install the Simulator Tasks AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/corezoid/simulator-ai-plugin/tree/main/plugins/simulator/skills/simulator-tasks
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/corezoid/simulator-ai-plugin.git /tmp/simulator-ai-plugin
mkdir -p .claude/skills
cp -r /tmp/simulator-ai-plugin/plugins/simulator/skills/simulator-tasks .claude/skills/simulator-tasks
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Simulator Tasks in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Simulator Tasks on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Simulator Tasks is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Curated tool names (v2 server): getForms, searchUsers, getUsers, createActor, getActorByRef, filterActors, saveAccessRules, getAccessRules, createReaction, getReactions. Call them by these exact names. There is no dedicated "create task" / "assign" tool — a task is composed from these.

Simulator.Company Task Specialist

In Simulator.Company a task is an actor of the Events system form with no chatType (an empty/absent chatType is what separates a task / plain event from a chat). The Events form is the same one used for calendar events, SIP meetings, and chats — chatType is what disambiguates them.

Orders / directives are tasks. A request to create an order / directive document aimed at a person — «створи наказ на Салімова про …», «склади розпорядження для …», "create an order for X to …", ru «приказ на …» — is a task, not a plain event. The addressee ("на <кого>" / "for ") is the executor: create the Events actor, then grant that person execute via saveAccessRules (step 4 below). Putting the name only in the title/description is the common mistake — without the execute rule the person is not assigned and gets no done action. Resolve the addressee's userId with searchUsers first; if other people are named to approve/sign, give them sign/ds.

If the workspace has a dedicated «наказ»/order form (with example documents), mirror an example — don't just createActor and stop. Read one existing order of that form (getActor + getAccessRules) and reproduce how it assigns the responsible person: typically an execute access rule for the addressee (saveAccessRules), and/or a responsible/executor data field on the form (a workspaceMembers dynamic-select whose value is the user id — see the actor data protocol). Set whichever the example uses, and always grant the addressee access — an order with no access rule for the person never appears in their events. Creating the actor alone is not "assigned".

A task's roles are access privileges on the task actor, not data fields:

RolePrivilegeHow they act on the task
Executor / assignee (виконавець)executeMarks the work complete with a done reaction
Approver (хто погоджує)signApproves with a sign reaction, or declines with reject
Legal-document signer (підпис на юр. документі)dsApplies a qualified digital signature with a ds reaction
Watcherview onlyCan see the task; no action

view is implied when any other privilege is set. One person can hold several roles (e.g. {execute:true, sign:true}) — that's one rule with both flags. Different people get separate rules.

There is no server-side "a task must have an executor / must be approved in order" enforcement — a task is composed from createActor + saveAccessRules + reactions, and this skill owns that discipline.

Read $CLAUDE_PLUGIN_ROOT/docs/entities/tasks.md for the full model, and chats.md for the shared Events-form field list.

Reply to the user in their own language.


Test case: "create a task, assign it, and require a signature"

1 — Resolve the Events form id (per workspace)

getForms(formTypes="system")    # find the row whose title == "Events" → its id

The Events form id differs per workspace — don't hardcode it. (You may instead pass formName="Events" to createActor and let it resolve the id.)

2 — Resolve the people (executor, approvers, signers)

Every grantee is a real workspace userId — resolve it, never guess:

searchUsers(query="<name>")     # → that person's userId (e.g. 4210)
getUsers()                      # browse all members if you need to pick

Collect: the executor's userId, each approver's userId, and (for a legal document) each DS signer's userId.

3 — Create the task (an Events actor, no chatType)

createActor(
  formName="Events",                       # or formId=<EventsFormId>
  title="<task name>",                     # short label, e.g. "Prepare Q3 supplier contract"
  description="<the task body / instructions>",   # the full text of the task goes HERE
  data={ "startDate": <nowUnixSeconds>,    # required by the Events form
         "endDate":   <deadlineUnixSeconds> })   # the due date
  • The task body goes in the actor's description. title is the short label; the full instructions / brief of the task are the actor's description field (the description argument of createActor) — not a comment reaction and not data.
  • startDate / endDate are required by the Events form and are plain unix seconds on Events (not the nested calendar object the generic data protocol uses). Use startDate = now (or the scheduled start) and endDate = the deadline.
  • Do not set chatType — a task is not a chat. Setting it would turn the actor into a chat (see simulator-chat).

4 — Assign the roles (one saveAccessRules call)

Grant each person their role on the task actor. execute = does it, sign = approves it, ds = legally signs it. view/modify/remove are required booleans; the role flags are optional.

saveAccessRules(objType="actor", objId="<taskId>", rules=[
  # Executor — can act on and complete the task:
  { "action":"create", "data":{ "userId": <executorId>,
      "privs":{ "view":true, "modify":true, "remove":false, "execute":true } } },

  # Approver(s) — must sign off. reactionOrders.sign sets the order (1 = first):
  { "action":"create", "data":{ "userId": <approver1Id>,
      "privs":{ "view":true, "modify":false, "remove":false, "sign":true },
      "reactionOrders":{ "sign": 1 } } },
  { "action":"create", "data":{ "userId": <approver2Id>,
      "privs":{ "view":true, "modify":false, "remove":false, "sign":true },
      "reactionOrders":{ "sign": 2 } } }
])

For a legal document that needs a qualified e-signature, grant ds instead of (or in addition to) sign, and order signers with reactionOrders.ds:

saveAccessRules(objType="actor", objId="<taskId>", rules=[
  { "action":"create", "data":{ "userId": <signerId>,
      "privs":{ "view":true, "modify":false, "remove":false, "ds":true },
      "reactionOrders":{ "ds": 1 } } }
])

saveAccessRules is applied asynchronously and returns a taskId (the async job id — unrelated to the task actor). Grants take a moment to propagate; that's fine. The creator is the owner implicitly — do not add a self access-rule.

5 — (Optional) Add follow-up notes / kick off

The task body itself is the actor's description (step 3). Use a comment reaction only for additional discussion or to ping someone — not for the task body:

createReaction(type="comment", actorId="<taskId>", description="<a follow-up note>")

To notify the executor through the platform AI agent (acts under the requesting user's access), add extra={mcp:true} — see simulator-reactions.

6 — Lifecycle (how the task is completed & approved)

These reactions are posted by the assigned users (your job is to set the task up so they can):

  • Executor finishes → createReaction(type="done", actorId="<taskId>").
  • Approver signs off → createReaction(type="sign", actorId="<taskId>"), or declines → createReaction(type="reject", actorId="<taskId>", description="<reason>").
  • DS signer applies the qualified signature → createReaction(type="ds", actorId="<taskId>").
  • Read progress: getReactions(actorId="<taskId>", view="flat") — count done / sign / ds / reject against the people you assigned.

The reaction text (a comment body, a rejection reason) always goes in the description argument of createReaction — there is no content argument.


Variations

  • One person is both executor and approver. Combine flags in a single rule: privs:{ view:true, execute:true, sign:true }.
  • Reorder / change approvers. action:"update" with a new reactionOrders, or action:"delete" (grantee id only) to remove someone.
  • Assign to a group. Use groupId instead of userId in the rule (resolve it with getUser(type="group")).
  • Many tasks at once. Create each Events actor, then bulkSaveAccessRules (≤50 objects) to assign roles across all of them in one call.
  • Find a person's tasks. filterActors(formId=<EventsFormId>, q="chatType=", members="<userId>:execute") — Events actors with an empty chatType where that user has the execute role. (Use q="chatType=" to exclude chats.)

Safety & correctness rules

  • No chatType on a task. An Events actor with a chatType is a chat, not a task — leave it empty/absent.
  • Roles are access rules, never data fields. Don't store executor/approver ids in data; grant execute / sign / ds via saveAccessRules.
  • Resolve every userId first (searchUsers / getUsers) — grantees must belong to the workspace or the rule is rejected. Don't guess ids.
  • Confirm before assigning on someone's behalf if it notifies them — saveAccessRules (default notify=true) and reactions notify the people involved. Use notify=false to stay quiet.
  • execute vs sign vs ds. execute = the doer; sign = an approval/sign-off; ds = a legally-binding digital signature (use for юридичні документи). Pick by intent.
  • startDate/endDate are required and are plain unix seconds on Events.

Relationship to the other skills

SkillBoundary
simulator-agentsDeciding who should get the task and whether it can be done without a person at all — it composes this create-and-assign flow for its "create a task" outcome.
simulator-chatThe chat use of the Events form (chatType set); a task has no chatType.
simulator-accessAccess rules in general — the execute/sign/ds/reactionOrders model lives there.
simulator-reactionsThe done/sign/reject reaction mechanics used to complete and approve a task.
simulator-actorsThe Events actor's own data fields and the actor data value protocol.
simulator-initLogin + workspace selection (needed before any of this).

Reference Documents

PathWhen to read
$CLAUDE_PLUGIN_ROOT/docs/entities/tasks.mdThe task model: Events actor + execute/sign/ds roles + done/sign/reject lifecycle
$CLAUDE_PLUGIN_ROOT/docs/entities/chats.mdThe shared Events-form field list (startDate/endDate as unix seconds)
$CLAUDE_PLUGIN_ROOT/docs/entities/reactions.mdReaction types (done, sign, reject), threading, AI-agent reactions

Tips

  • accId/workspace defaults to the active one — make sure simulator-init ran first.
  • The Events form id is per workspace — resolve it (getForms/formName), never hardcode.
  • A task = createActor(formName="Events", description="<body>", data={startDate,endDate}) without chatType.
  • The task body is the actor's description (title = short label); comments are for follow-up only.
  • Roles = one saveAccessRules call: execute (doer), sign (approver), ds (legal signature).
  • Order sequential approvals with reactionOrders.sign / .ds (positive ints, 1 = first).
  • Completion/approval are done / sign / reject reactions posted by the assignees.

Frequently asked questions

What does the Simulator Tasks AI skill do?

Simulator.Company task & assignment specialist — creating a task and assigning who does it, who approves it, and whose signature it needs. In Simulator a task is an actor of the Events system form (no chatType), and the roles are access privileges, not data fields: the executor gets `execute`, approvers get `sign`, and a legal document's signers get `ds`. Completion and sign-off are then posted as `done` / `sign` / `reject` reactions. Use when the user wants to "create a task", "assign a task to", "set an executor/assignee", "add approvers", "require a signature", "who signs this", "make a...

Why use Simulator Tasks on TypingMind?

Because you install it once and use it with any model. Simulator Tasks is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Simulator Tasks in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/corezoid/simulator-ai-plugin/tree/main/plugins/simulator/skills/simulator-tasks. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Simulator Tasks?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Simulator Tasks?

As many as you like. As long as a model supports skills, you can use Simulator Tasks with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Simulator Tasks AI skill free?

Yes. It is published on GitHub by corezoid under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇